1414
1515from uid2_client .advertising_token_version import AdvertisingTokenVersion
1616from uid2_client .uid2_base64_url_coder import Uid2Base64UrlCoder
17+ from uid2_client .identity_type import IdentityType
18+ from uid2_client .identity_scope import IdentityScope
1719
1820encryption_block_size = AES .block_size
1921"""int: block size for encryption routines
@@ -146,7 +148,8 @@ def _decrypt_token_v3(token_bytes, keys, now):
146148
147149 return DecryptedToken (id_str , established , site_id , site_key .site_id )
148150
149- def _encrypt_token_v3 (uid2 , identity_scope , master_key , site_key , site_id , now , token_expiry ):
151+
152+ def _encrypt_token (uid2 , identity_scope , master_key , site_key , site_id , now , token_expiry , ad_token_version ):
150153 site_payload = bytearray (128 )
151154 #Site id
152155 site_payload [0 :4 ] = int .to_bytes (site_id , byteorder = 'big' , length = 4 )
@@ -171,11 +174,16 @@ def _encrypt_token_v3(uid2, identity_scope, master_key, site_key, site_id, now,
171174 encrypted_master_payload = _encrypt_gcm (bytes (master_payload ), None , master_key .secret )
172175
173176 root_writer = bytearray (len (encrypted_master_payload )+ 6 )
174- root_writer [0 :1 ] = int .to_bytes (0 , byteorder = 'big' , length = 1 )
175- root_writer [1 :2 ] = int .to_bytes (112 , byteorder = 'big' , length = 1 )
177+ first_char = uid2 [0 ]
178+ identity_type = IdentityType .Phone if first_char == 'F' or first_char == 'B' else IdentityType .Email
179+ root_writer [0 :1 ] = int .to_bytes ((int (identity_scope ) << 4 | int (identity_type ) << 2 ), byteorder = 'big' , length = 1 )
180+ root_writer [1 :2 ] = int .to_bytes (ad_token_version , byteorder = 'big' , length = 1 )
176181 root_writer [2 :6 ] = int .to_bytes (master_key .key_id , byteorder = 'big' , length = 4 )
177182 root_writer [6 :] = bytes (encrypted_master_payload )
178183
184+ if ad_token_version == AdvertisingTokenVersion .ADVERTISING_TOKEN_V4 :
185+ return Uid2Base64UrlCoder .encode (root_writer )
186+
179187 return base64 .b64encode (root_writer )
180188
181189
@@ -185,15 +193,25 @@ def encrypt_key(uid2, indentity_scope, keys, keyset_id=None, **kwargs):
185193
186194 Args:
187195 uid2: the uid2 to be encrypted
196+ indentity_scope (IdentityScope): If the key will be uid2 or euid2
188197 keys (EncryptionKeysCollection): collection of keys to choose from for encryption
189198 keyset_id (int) : An optional keyset id to use for the encryption. Will use default keyset if left blank
190199
200+ Keyword Args:
201+ now (Datetime): the datettime to use for now. Defaults to utc now
202+ ad_token_version (AdvertisingTokenVersion): Defaults to v4
203+
191204 Returns (str): Sharing Token
192205
193206 """
194207 now = kwargs .get ("now" )
195208 if now is None :
196209 now = dt .datetime .now (tz = timezone .utc )
210+
211+ ad_token_version = kwargs .get ("ad_token_version" )
212+ if ad_token_version is None :
213+ ad_token_version = AdvertisingTokenVersion .ADVERTISING_TOKEN_V4
214+
197215 key = keys .get_default_keyset_key (now ) if keyset_id is None else keys .get_by_keyset_key (keyset_id , now )
198216 master_key = keys .get_by_keyset_key (9999 , now )
199217
@@ -209,7 +227,7 @@ def encrypt_key(uid2, indentity_scope, keys, keyset_id=None, **kwargs):
209227 print ("No Keyset Key found" )
210228 return
211229
212- return _encrypt_token_v3 (uid2 , indentity_scope , master_key , key , site_id , now , token_expiry )
230+ return _encrypt_token (uid2 , indentity_scope , master_key , key , site_id , now , token_expiry , ad_token_version )
213231
214232
215233def encrypt_data (data , identity_scope , ** kwargs ):
0 commit comments