From 21f0c6035109772ac2197bcb4453eabb4f8e22c6 Mon Sep 17 00:00:00 2001 From: Sunny Wu Date: Wed, 16 Oct 2024 13:57:07 +1100 Subject: [PATCH] 1. Refactored EncryptedTokenEncoder to rename encode/encodev2/encodev3 methods to encodeIntoAdvertisingToken or encodeIntoRefreshToken to make it clear what we are encoding into --- .../service/EncryptedTokenEncoder.java | 39 +++++++++++-------- .../com/uid2/operator/TokenEncodingTest.java | 6 +-- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/uid2/operator/service/EncryptedTokenEncoder.java b/src/main/java/com/uid2/operator/service/EncryptedTokenEncoder.java index e60240a66..1a74a794a 100644 --- a/src/main/java/com/uid2/operator/service/EncryptedTokenEncoder.java +++ b/src/main/java/com/uid2/operator/service/EncryptedTokenEncoder.java @@ -24,16 +24,16 @@ public EncryptedTokenEncoder(KeyManager keyManager) { this.keyManager = keyManager; } - public byte[] encode(AdvertisingTokenInput t, Instant asOf) { + public byte[] encodeIntoAdvertisingToken(AdvertisingTokenInput t, Instant asOf) { final KeysetKey masterKey = this.keyManager.getMasterKey(asOf); final KeysetKey siteEncryptionKey = this.keyManager.getActiveKeyBySiteIdWithFallback(t.sourcePublisher.siteId, Data.AdvertisingTokenSiteId, asOf); return t.version == TokenVersion.V2 - ? encodeV2(t, masterKey, siteEncryptionKey) - : encodeV3(t, masterKey, siteEncryptionKey); //TokenVersion.V4 also calls encodeV3() since the byte array is identical between V3 and V4 + ? encodeIntoAdvertisingTokenV2(t, masterKey, siteEncryptionKey) + : encodeIntoAdvertisingTokenV3(t, masterKey, siteEncryptionKey); //TokenVersion.V4 also calls encodeV3() since the byte array is identical between V3 and V4 } - private byte[] encodeV2(AdvertisingTokenInput t, KeysetKey masterKey, KeysetKey siteKey) { + private byte[] encodeIntoAdvertisingTokenV2(AdvertisingTokenInput t, KeysetKey masterKey, KeysetKey siteKey) { final Buffer b = Buffer.buffer(); b.appendByte((byte) t.version.rawVersion); @@ -50,7 +50,7 @@ private byte[] encodeV2(AdvertisingTokenInput t, KeysetKey masterKey, KeysetKey return b.getBytes(); } - private byte[] encodeV3(AdvertisingTokenInput t, KeysetKey masterKey, KeysetKey siteKey) { + private byte[] encodeIntoAdvertisingTokenV3(AdvertisingTokenInput t, KeysetKey masterKey, KeysetKey siteKey) { final Buffer sitePayload = Buffer.buffer(69); encodePublisherRequesterV3(sitePayload, t.sourcePublisher); sitePayload.appendInt(t.rawUidIdentity.privacyBits); @@ -281,22 +281,22 @@ private void recordRefreshTokenVersionCount(String siteId, TokenVersion tokenVer .register(Metrics.globalRegistry).increment(); } - public byte[] encode(RefreshTokenInput t, Instant asOf) { + public byte[] encodeIntoRefreshToken(RefreshTokenInput t, Instant asOf) { final KeysetKey serviceKey = this.keyManager.getRefreshKey(asOf); switch (t.version) { case V2: recordRefreshTokenVersionCount(String.valueOf(t.sourcePublisher.siteId), TokenVersion.V2); - return encodeV2(t, serviceKey); + return encodeIntoRefreshTokenV2(t, serviceKey); case V3: recordRefreshTokenVersionCount(String.valueOf(t.sourcePublisher.siteId), TokenVersion.V3); - return encodeV3(t, serviceKey); + return encodeIntoRefreshTokenV3(t, serviceKey); default: throw new ClientInputValidationException("RefreshToken version " + t.version + " not supported"); } } - public byte[] encodeV2(RefreshTokenInput t, KeysetKey serviceKey) { + public byte[] encodeIntoRefreshTokenV2(RefreshTokenInput t, KeysetKey serviceKey) { final Buffer b = Buffer.buffer(); b.appendByte((byte) t.version.rawVersion); b.appendLong(t.createdAt.toEpochMilli()); @@ -309,7 +309,7 @@ public byte[] encodeV2(RefreshTokenInput t, KeysetKey serviceKey) { return b.getBytes(); } - public byte[] encodeV3(RefreshTokenInput t, KeysetKey serviceKey) { + public byte[] encodeIntoRefreshTokenV3(RefreshTokenInput t, KeysetKey serviceKey) { final Buffer refreshPayload = Buffer.buffer(90); refreshPayload.appendLong(t.expiresAt.toEpochMilli()); refreshPayload.appendLong(t.createdAt.toEpochMilli()); @@ -343,20 +343,27 @@ public static String bytesToBase64Token(byte[] advertisingTokenBytes, TokenVersi @Override public IdentityResponse encodeIntoIdentityResponse(AdvertisingTokenInput advertisingTokenInput, RefreshTokenInput refreshTokenInput, Instant refreshFrom, Instant asOf) { - - final byte[] advertisingTokenBytes = encode(advertisingTokenInput, asOf); - final String base64AdvertisingToken = bytesToBase64Token(advertisingTokenBytes, advertisingTokenInput.version); - + final String advertisingToken = generateAdvertisingTokenString(advertisingTokenInput, asOf); + final String refreshToken = generateRefreshTokenString(refreshTokenInput, asOf); return new IdentityResponse( - base64AdvertisingToken, + advertisingToken, advertisingTokenInput.version, - EncodingUtils.toBase64String(encode(refreshTokenInput, asOf)), + refreshToken, advertisingTokenInput.expiresAt, refreshTokenInput.expiresAt, refreshFrom ); } + private String generateRefreshTokenString(RefreshTokenInput refreshTokenInput, Instant asOf) { + return EncodingUtils.toBase64String(encodeIntoRefreshToken(refreshTokenInput, asOf)); + } + + private String generateAdvertisingTokenString(AdvertisingTokenInput advertisingTokenInput, Instant asOf) { + final byte[] advertisingTokenBytes = encodeIntoAdvertisingToken(advertisingTokenInput, asOf); + return bytesToBase64Token(advertisingTokenBytes, advertisingTokenInput.version); + } + private byte[] encryptIdentityV2(SourcePublisher sourcePublisher, FirstLevelHashIdentity firstLevelHashIdentity, KeysetKey key) { return encryptIdentityV2(sourcePublisher, firstLevelHashIdentity.firstLevelHash, firstLevelHashIdentity.privacyBits, firstLevelHashIdentity.establishedAt, key); diff --git a/src/test/java/com/uid2/operator/TokenEncodingTest.java b/src/test/java/com/uid2/operator/TokenEncodingTest.java index 9a483c866..b53f79b4f 100644 --- a/src/test/java/com/uid2/operator/TokenEncodingTest.java +++ b/src/test/java/com/uid2/operator/TokenEncodingTest.java @@ -63,10 +63,10 @@ public void testRefreshTokenEncoding(TokenVersion tokenVersion) { ); if (tokenVersion == TokenVersion.V4) { - Assert.assertThrows(Exception.class, () -> encoder.encode(token, now)); + Assert.assertThrows(Exception.class, () -> encoder.encodeIntoRefreshToken(token, now)); return; //V4 not supported for RefreshTokens } - final byte[] encodedBytes = encoder.encode(token, now); + final byte[] encodedBytes = encoder.encodeIntoRefreshToken(token, now); final RefreshTokenInput decoded = encoder.decodeRefreshToken(EncodingUtils.toBase64String(encodedBytes)); assertEquals(tokenVersion, decoded.version); @@ -104,7 +104,7 @@ public void testAdvertisingTokenEncodings(TokenVersion tokenVersion) { new RawUidIdentity(IdentityScope.UID2, IdentityType.Email, rawUid, 121, now, now.minusSeconds(122)) ); - final byte[] encodedBytes = encoder.encode(token, now); + final byte[] encodedBytes = encoder.encodeIntoAdvertisingToken(token, now); final AdvertisingTokenInput decoded = encoder.decodeAdvertisingToken(EncryptedTokenEncoder.bytesToBase64Token(encodedBytes, tokenVersion)); assertEquals(tokenVersion, decoded.version);