package com.beowulfe.hap.impl.pairing;
import com.beowulfe.hap.impl.pairing.TypeLengthValueUtils.DecodeResult;
abstract class PairVerificationRequest {
private final static short VALUE_STAGE_1 = 1;
private final static short VALUE_STAGE_2 = 3;
static PairVerificationRequest 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(d);
case VALUE_STAGE_2:
return new Stage2Request(d);
default:
throw new Exception("Unknown pair process stage: "+stage);
}
}
abstract Stage getStage();
static class Stage1Request extends PairVerificationRequest {
private final byte[] clientPublicKey;
public Stage1Request(DecodeResult d) {
clientPublicKey = d.getBytes(MessageType.PUBLIC_KEY);
}
public byte[] getClientPublicKey() {
return clientPublicKey;
}
@Override
Stage getStage() {
return Stage.ONE;
}
}
static class Stage2Request extends PairVerificationRequest {
private final byte[] messageData;
private final byte[] authTagData;
public Stage2Request(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.TWO;
}
}
}