mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-11-03 00:43:02 +01:00
[Huawei] Add HiChainLite firstKey handling
This commit is contained in:
parent
270212a771
commit
05c11cbd14
@ -119,7 +119,11 @@ public class HuaweiCrypto {
|
||||
.put(message)
|
||||
.array();
|
||||
byte[] digestStep1 = CryptoUtils.calcHmacSha256(msgToDigest, nonce);
|
||||
return CryptoUtils.calcHmacSha256(digestStep1, nonce);
|
||||
byte[] challenge = ByteBuffer.allocate(0x40)
|
||||
.put(CryptoUtils.calcHmacSha256(digestStep1, nonce))
|
||||
.put(digestStep1)
|
||||
.array();
|
||||
return challenge;
|
||||
}
|
||||
|
||||
public byte[] computeDigestHiChainLite(byte[] message, byte[] key, byte[] nonce) throws NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException, UnsupportedEncodingException {
|
||||
@ -138,7 +142,11 @@ public class HuaweiCrypto {
|
||||
} else {
|
||||
digestStep1 = CryptoUtils.calcHmacSha256(msgToDigest, nonce);
|
||||
}
|
||||
return CryptoUtils.calcHmacSha256(digestStep1, nonce);
|
||||
byte[] challenge = ByteBuffer.allocate(0x40)
|
||||
.put(CryptoUtils.calcHmacSha256(digestStep1, nonce))
|
||||
.put(digestStep1)
|
||||
.array();
|
||||
return challenge;
|
||||
}
|
||||
|
||||
public byte[] digestChallenge(byte[] secretKey, byte[] nonce) throws NoSuchAlgorithmException, InvalidKeyException, InvalidKeySpecException, UnsupportedEncodingException {
|
||||
@ -150,7 +158,11 @@ public class HuaweiCrypto {
|
||||
.put(secretKey)
|
||||
.put(MESSAGE_CHALLENGE)
|
||||
.array();
|
||||
return CryptoUtils.calcHmacSha256(key, nonce);
|
||||
byte[] challenge = ByteBuffer.allocate(0x40)
|
||||
.put(CryptoUtils.calcHmacSha256(key, nonce))
|
||||
.put(key)
|
||||
.array();
|
||||
return challenge;
|
||||
}
|
||||
return computeDigestHiChainLite(MESSAGE_CHALLENGE, secretKey, nonce);
|
||||
}
|
||||
@ -166,7 +178,11 @@ public class HuaweiCrypto {
|
||||
.put(secretKey)
|
||||
.put(MESSAGE_RESPONSE)
|
||||
.array();
|
||||
return CryptoUtils.calcHmacSha256(key, nonce);
|
||||
byte[] challenge = ByteBuffer.allocate(0x40)
|
||||
.put(CryptoUtils.calcHmacSha256(key, nonce))
|
||||
.put(key)
|
||||
.array();
|
||||
return challenge;
|
||||
}
|
||||
return computeDigestHiChainLite(MESSAGE_RESPONSE, secretKey, nonce);
|
||||
}
|
||||
|
@ -58,6 +58,7 @@ public class HuaweiPacket {
|
||||
protected byte interval;
|
||||
protected byte authAlgo;
|
||||
protected byte encryptMethod;
|
||||
protected byte[] firstKey;
|
||||
|
||||
public void setAuthVersion(byte authVersion) {
|
||||
this.authVersion = authVersion;
|
||||
@ -153,6 +154,14 @@ public class HuaweiPacket {
|
||||
public byte getEncryptMethod () {
|
||||
return this.encryptMethod;
|
||||
}
|
||||
|
||||
public void setFirstKey(byte[] firstKey) {
|
||||
this.firstKey = firstKey;
|
||||
}
|
||||
|
||||
public byte[] getFirstKey() {
|
||||
return firstKey;
|
||||
}
|
||||
}
|
||||
|
||||
public static abstract class ParseException extends Exception {
|
||||
|
@ -74,8 +74,13 @@ public class GetAuthRequest extends Request {
|
||||
.putShort(authVersion)
|
||||
.put(clientNonce)
|
||||
.array();
|
||||
byte[] challenge = huaweiCrypto.digestChallenge(key, doubleNonce);
|
||||
ByteBuffer digestedChallenge = ByteBuffer.wrap(huaweiCrypto.digestChallenge(key, doubleNonce));
|
||||
byte[] challenge = new byte[0x20];
|
||||
digestedChallenge.get(challenge, 0x00, 0x20);
|
||||
LOG.debug("challenge: " + GB.hexdump(challenge));
|
||||
byte[] firstKey = new byte[0x10];
|
||||
digestedChallenge.get(firstKey, 0x00, 0x10);
|
||||
paramsProvider.setFirstKey(firstKey);
|
||||
if (challenge == null)
|
||||
throw new RequestCreationException("Challenge null");
|
||||
return new DeviceConfig.Auth.Request(paramsProvider, challenge, nonce).serialize();
|
||||
@ -94,7 +99,10 @@ public class GetAuthRequest extends Request {
|
||||
throw new ResponseTypeMismatchException(receivedPacket, DeviceConfig.Auth.Response.class);
|
||||
|
||||
try {
|
||||
byte[] expectedAnswer = huaweiCrypto.digestResponse(key, doubleNonce);
|
||||
ByteBuffer digestedChallenge = ByteBuffer.wrap(huaweiCrypto.digestResponse(key, doubleNonce));
|
||||
byte[] expectedAnswer = new byte[0x20];
|
||||
digestedChallenge.get(expectedAnswer, 0x00, 0x20);
|
||||
LOG.debug("challenge: " + GB.hexdump(expectedAnswer));
|
||||
if (expectedAnswer == null)
|
||||
throw new ResponseParseException("Challenge null");
|
||||
byte[] actualAnswer = ((DeviceConfig.Auth.Response) receivedPacket).challengeResponse;
|
||||
|
Loading…
Reference in New Issue
Block a user