Skip to content

Commit

Permalink
Merge pull request #143 from Smarteon/alg
Browse files Browse the repository at this point in the history
Use encryption algorithm returned with user key
  • Loading branch information
PetrZufan authored Dec 14, 2021
2 parents 8f044c0 + d1d3352 commit f02d599
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 4 deletions.
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
# loxone-java [![Maven Central](https://maven-badges.herokuapp.com/maven-central/cz.smarteon/loxone-java/badge.svg)](https://maven-badges.herokuapp.com/maven-central/cz-smarteon/loxone-java) [![codecov](https://codecov.io/gh/Smarteon/loxone-java/branch/master/graph/badge.svg)](https://codecov.io/gh/Smarteon/loxone-java)
Java implementation of the Loxone™ communication protocol (Web Socket).

* *Supported miniservers*: miniserver gen. 1, miniserver gen. 2, miniserver GO
* *Supported firmware*: **10.4.0.0** and ongoing

Most of the library is trying to behave according to
[Loxone API documentation](https://www.loxone.com/enen/kb/api/)
and [Loxone webservices](https://www.loxone.com/enen/kb/web-services/).
Expand Down Expand Up @@ -67,4 +70,4 @@ Start by generating gradle wrapper binaries (using local gradle installation)
gradle wrapper
```

_Note:_ Build currently requires JDK 8
_Note:_ Build currently requires at least JDK 11
26 changes: 23 additions & 3 deletions src/main/java/cz/smarteon/loxone/LoxoneCrypto.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ static String createSessionKey(final SecretKey sharedKey, final byte[] sharedKey
*/
static String loxoneHashing(final String secret, final String loxoneUser, final Hashing hashing, final String operation) {
try {
final MessageDigest md = MessageDigest.getInstance("SHA-1");
final MessageDigest md = MessageDigest.getInstance(getDigestAlg(hashing.getHashAlg()));
final byte[] toSha1 = concatToBytes(secret, hashing.getSalt());
final String secretHash = bytesToHex(md.digest(toSha1)).toUpperCase();
log.trace("{} hash: {}", operation, secretHash);
Expand All @@ -128,8 +128,9 @@ static String loxoneHashing(final String secret, final String loxoneUser, final
*/
static String loxoneHashing(final String secret, final Hashing hashing, final String operation) {
try {
final Mac mac = Mac.getInstance("HmacSHA1");
final SecretKeySpec secretKeySpec = new SecretKeySpec(hashing.getKey(), "HmacSHA1");
final String hmacAlg = "Hmac" + getHmacAlg(hashing.getHashAlg());
final Mac mac = Mac.getInstance(hmacAlg);
final SecretKeySpec secretKeySpec = new SecretKeySpec(hashing.getKey(), hmacAlg);
mac.init(secretKeySpec);
final byte[] hash = mac.doFinal(secret.getBytes());
final String finalHash = bytesToHex(hash);
Expand Down Expand Up @@ -191,4 +192,23 @@ static String decrypt(final String data, final SecretKey sharedKey, final byte[]
}
}

private static final String SHA1 = "SHA1";
private static final String SHA_1 = "SHA-1";
private static final String SHA256 = "SHA256";
private static final String SHA_256 = "SHA-256";

private static String getDigestAlg(final String hashAlg) {
if (hashAlg == null || SHA1.equals(hashAlg)) {
return SHA_1;
} else if (SHA256.equals(hashAlg)) {
return SHA_256;
} else {
throw new LoxoneException("Unsupported hashing algorithm " + hashAlg);
}
}

private static String getHmacAlg(final String hashAlg) {
return hashAlg != null ? hashAlg : SHA1;
}

}

0 comments on commit f02d599

Please sign in to comment.