package com.beowulfe.hap.impl.pairing; import java.math.BigInteger; import com.beowulfe.hap.impl.pairing.TypeLengthValueUtils.DecodeResult; abstract class PairSetupRequest { private final static short VALUE_STAGE_1 = 1; private final static short VALUE_STAGE_2 = 3; private final static short VALUE_STAGE_3 = 5; public static PairSetupRequest of(byte[] content) throws Exception { DecodeResult d = TypeLengthValueUtils.decode(content); short stage = d.getByte(MessageType.STATE); switch(stage) { case VALUE_STAGE_1: return new Stage1Request(); case VALUE_STAGE_2: return new Stage2Request(d); case VALUE_STAGE_3: return new Stage3Request(d); default: throw new Exception("Unknown pair process stage: "+stage); } } public abstract Stage getStage(); public static class Stage1Request extends PairSetupRequest { @Override public Stage getStage() { return Stage.ONE; } } public static class Stage2Request extends PairSetupRequest { private final BigInteger a; private final BigInteger m1; public Stage2Request(DecodeResult d) { a = d.getBigInt(MessageType.PUBLIC_KEY); m1 = d.getBigInt(MessageType.PROOF); } public BigInteger getA() { return a; } public BigInteger getM1() { return m1; } @Override public Stage getStage() { return Stage.TWO; } } static class Stage3Request extends PairSetupRequest { private final byte[] messageData; private final byte[] authTagData; public Stage3Request(DecodeResult d) { messageData = new byte[d.getLength(MessageType.ENCRYPTED_DATA) - 16]; authTagData = new byte[16]; d.getBytes(MessageType.ENCRYPTED_DATA, messageData, 0); d.getBytes(MessageType.ENCRYPTED_DATA, authTagData, messageData.length); } public byte[] getMessageData() { return messageData; } public byte[] getAuthTagData() { return authTagData; } @Override public Stage getStage() { return Stage.THREE; } } }