44import javax .crypto .spec .IvParameterSpec ;
55import javax .crypto .spec .SecretKeySpec ;
66import io .vertx .core .buffer .Buffer ;
7-
87import java .io .ByteArrayOutputStream ;
98import java .util .Arrays ;
109
@@ -14,18 +13,22 @@ public final class V4TokenUtils {
1413 private V4TokenUtils () {
1514 }
1615
16+ private static byte [] getKeyIdBytes (int keyId ) {
17+ return new byte [] {
18+ (byte ) ((keyId >> 16 ) & 0xFF ), // MSB
19+ (byte ) ((keyId >> 8 ) & 0xFF ), // Middle
20+ (byte ) (keyId & 0xFF ), // LSB
21+ };
22+ }
23+
1724 public static byte [] buildAdvertisingIdV4 (byte metadata , byte [] firstLevelHash , int keyId , String key , String salt ) throws Exception {
1825 byte [] firstLevelHashLast16Bytes = Arrays .copyOfRange (firstLevelHash , firstLevelHash .length - 16 , firstLevelHash .length );
1926 byte [] iv = V4TokenUtils .generateIV (salt , firstLevelHashLast16Bytes , metadata , keyId );
2027 byte [] encryptedFirstLevelHash = V4TokenUtils .encryptHash (key , firstLevelHashLast16Bytes , iv );
2128
2229 Buffer buffer = Buffer .buffer ();
2330 buffer .appendByte (metadata );
24- buffer .appendBytes (new byte [] {
25- (byte ) (keyId & 0xFF ), // LSB
26- (byte ) ((keyId >> 8 ) & 0xFF ), // Middle
27- (byte ) ((keyId >> 16 ) & 0xFF ) // MSB
28- });
31+ buffer .appendBytes (getKeyIdBytes (keyId ));
2932 buffer .appendBytes (iv );
3033 buffer .appendBytes (encryptedFirstLevelHash );
3134
@@ -40,7 +43,7 @@ public static byte[] generateIV(String salt, byte[] firstLevelHashLast16Bytes, b
4043 ivBase .write (salt .getBytes ());
4144 ivBase .write (firstLevelHashLast16Bytes );
4245 ivBase .write (metadata );
43- ivBase .write (keyId );
46+ ivBase .write (getKeyIdBytes ( keyId ) );
4447 return Arrays .copyOfRange (EncodingUtils .getSha256Bytes (ivBase .toByteArray ()), 0 , IV_LENGTH );
4548 }
4649
0 commit comments