@@ -1325,20 +1325,18 @@ cdef class AuthMessage(Message):
1325
1325
newpassword_with_salt)
1326
1326
self .encoded_newpassword = encrypted_newpassword.hex().upper()
1327
1327
1328
- cdef int _generate_verifier(self , bint verifier_11g ) except - 1 :
1328
+ cdef int _generate_verifier(self ) except - 1 :
1329
1329
"""
1330
1330
Generate the multi-round verifier.
1331
1331
"""
1332
- cdef bytes jdwp_data
1332
+ cdef:
1333
+ bytes jdwp_data
1334
+ bytearray b
1335
+ ssize_t i
1333
1336
1334
1337
# create password hash
1335
1338
verifier_data = bytes.fromhex(self .session_data[' AUTH_VFR_DATA' ])
1336
- if verifier_11g:
1337
- keylen = 24
1338
- h = hashlib.sha1(self .password)
1339
- h.update(verifier_data)
1340
- password_hash = h.digest() + bytes(4 )
1341
- else :
1339
+ if self .verifier_type == TNS_VERIFIER_TYPE_12C:
1342
1340
keylen = 32
1343
1341
iterations = int (self .session_data[' AUTH_PBKDF2_VGEN_COUNT' ])
1344
1342
salt = verifier_data + b' AUTH_PBKDF2_SPEEDY_KEY'
@@ -1348,28 +1346,42 @@ cdef class AuthMessage(Message):
1348
1346
h.update(password_key)
1349
1347
h.update(verifier_data)
1350
1348
password_hash = h.digest()[:32 ]
1349
+ else :
1350
+ keylen = 24
1351
+ h = hashlib.sha1(self .password)
1352
+ h.update(verifier_data)
1353
+ password_hash = h.digest() + bytes(4 )
1351
1354
1352
1355
# decrypt first half of session key
1353
1356
encoded_server_key = bytes.fromhex(self .session_data[' AUTH_SESSKEY' ])
1354
1357
session_key_part_a = decrypt_cbc(password_hash, encoded_server_key)
1355
1358
1356
1359
# generate second half of session key
1357
- session_key_part_b = secrets.token_bytes(32 )
1360
+ session_key_part_b = secrets.token_bytes(len (session_key_part_a) )
1358
1361
encoded_client_key = encrypt_cbc(password_hash, session_key_part_b)
1359
- self .session_key = encoded_client_key.hex().upper()[:64 ]
1360
1362
1361
- # create session key from combo key
1362
- mixing_salt = bytes.fromhex(self .session_data[' AUTH_PBKDF2_CSK_SALT' ])
1363
- iterations = int (self .session_data[' AUTH_PBKDF2_SDER_COUNT' ])
1364
- temp_key = session_key_part_b[:keylen] + session_key_part_a[:keylen]
1365
- combo_key = get_derived_key(temp_key.hex().upper().encode(),
1366
- mixing_salt, keylen, iterations)
1363
+ # create session key and combo key
1364
+ if len (session_key_part_a) == 48 :
1365
+ self .session_key = encoded_client_key.hex().upper()[:96 ]
1366
+ b = bytearray(24 )
1367
+ for i in range (16 , 40 ):
1368
+ b[i - 16 ] = session_key_part_a[i] ^ session_key_part_b[i]
1369
+ part1 = hashlib.md5(b[:16 ]).digest()
1370
+ part2 = hashlib.md5(b[16 :]).digest()
1371
+ combo_key = (part1 + part2)[:keylen]
1372
+ else :
1373
+ self .session_key = encoded_client_key.hex().upper()[:64 ]
1374
+ salt = bytes.fromhex(self .session_data[' AUTH_PBKDF2_CSK_SALT' ])
1375
+ iterations = int (self .session_data[' AUTH_PBKDF2_SDER_COUNT' ])
1376
+ temp_key = session_key_part_b[:keylen] + session_key_part_a[:keylen]
1377
+ combo_key = get_derived_key(temp_key.hex().upper().encode(), salt,
1378
+ keylen, iterations)
1367
1379
1368
1380
# retain session key for use by the change password API
1369
1381
self .conn_impl._combo_key = combo_key
1370
1382
1371
1383
# generate speedy key for 12c verifiers
1372
- if not verifier_11g :
1384
+ if self .verifier_type == TNS_VERIFIER_TYPE_12C :
1373
1385
salt = secrets.token_bytes(16 )
1374
1386
speedy_key = encrypt_cbc(combo_key, salt + password_key)
1375
1387
self .speedy_key = speedy_key[:80 ].hex().upper()
@@ -1539,7 +1551,6 @@ cdef class AuthMessage(Message):
1539
1551
cdef int _write_message(self , WriteBuffer buf) except - 1 :
1540
1552
cdef:
1541
1553
uint8_t has_user = 1 if self .user_bytes_len > 0 else 0
1542
- bint verifier_11g = False
1543
1554
uint32_t num_pairs
1544
1555
1545
1556
# perform final determination of data to write
@@ -1559,15 +1570,13 @@ cdef class AuthMessage(Message):
1559
1570
else :
1560
1571
num_pairs += 2
1561
1572
self .auth_mode |= TNS_AUTH_MODE_WITH_PASSWORD
1562
- if self .verifier_type in (TNS_VERIFIER_TYPE_11G_1,
1563
- TNS_VERIFIER_TYPE_11G_2):
1564
- verifier_11g = True
1565
- elif self .verifier_type ! = TNS_VERIFIER_TYPE_12C :
1573
+ if self .verifier_type == TNS_VERIFIER_TYPE_12C:
1574
+ num_pairs += 1
1575
+ elif self .verifier_type not in (TNS_VERIFIER_TYPE_11G_1,
1576
+ TNS_VERIFIER_TYPE_11G_2) :
1566
1577
errors._raise_err(errors.ERR_UNSUPPORTED_VERIFIER_TYPE,
1567
1578
verifier_type = self .verifier_type)
1568
- else :
1569
- num_pairs += 1
1570
- self ._generate_verifier(verifier_11g)
1579
+ self ._generate_verifier()
1571
1580
1572
1581
# determine which other key/value pairs to write
1573
1582
if self .newpassword is not None :
@@ -1615,7 +1624,7 @@ cdef class AuthMessage(Message):
1615
1624
self ._write_key_value(buf, " AUTH_TOKEN" , self .token)
1616
1625
elif not self .change_password:
1617
1626
self ._write_key_value(buf, " AUTH_SESSKEY" , self .session_key, 1 )
1618
- if not verifier_11g :
1627
+ if self .verifier_type == TNS_VERIFIER_TYPE_12C :
1619
1628
self ._write_key_value(buf, " AUTH_PBKDF2_SPEEDY_KEY" ,
1620
1629
self .speedy_key)
1621
1630
if self .encoded_password is not None :
0 commit comments