package im.actor.runtime.crypto.ratchet; import im.actor.runtime.Crypto; import im.actor.runtime.crypto.box.ActorBoxKey; import im.actor.runtime.crypto.primitives.hmac.HMAC; import im.actor.runtime.crypto.primitives.kdf.HKDF; import im.actor.runtime.crypto.primitives.util.ByteStrings; // Disabling Bounds checks for speeding up calculations /*-[ #define J2OBJC_DISABLE_ARRAY_BOUND_CHECKS 1 ]-*/ public class RatchetMessageKey { public static ActorBoxKey buildKey(byte[] rootChainKey, int index) { HMAC hmac = new HMAC(rootChainKey, Crypto.createSHA256()); byte[] indx = ByteStrings.intToBytes(index); hmac.update(indx, 0, indx.length); byte[] messageKey = new byte[32]; hmac.doFinal(messageKey, 0); byte[] messageKeyExt = new HKDF(Crypto.createSHA256()).deriveSecrets(messageKey, 128); byte[] aesCipherKey = ByteStrings.substring(messageKeyExt, 0, 32); byte[] aesMacKey = ByteStrings.substring(messageKeyExt, 32, 32); byte[] kuzCipherKey = ByteStrings.substring(messageKeyExt, 64, 32); byte[] kuzMacKey = ByteStrings.substring(messageKeyExt, 96, 32); return new ActorBoxKey(aesCipherKey, aesMacKey, kuzCipherKey, kuzMacKey); } }