@@ -138,18 +138,30 @@ class EncryptDecrypt {
138
138
if ( newPassword ) {
139
139
newPasswordBytes = Buffer . from ( newPassword , 'utf8' ) ;
140
140
}
141
- let sessionKeyParta = this . _decrypt ( passwordHash , encodedServerKey ) ;
142
- let sessionKeyPartb = Buffer . alloc ( 32 ) ;
143
- crypto . randomFillSync ( sessionKeyPartb , 0 , 32 ) ;
144
- let encodedClientKey = this . _encrypt ( passwordHash , sessionKeyPartb ) ;
145
- authObj . sessionKey = encodedClientKey . slice ( ) . toString ( 'hex' ) . toUpperCase ( ) . slice ( 0 , 64 ) ;
146
-
147
- iterations = Number ( sessionData [ 'AUTH_PBKDF2_SDER_COUNT' ] ) ;
148
- let mixingSalt = Buffer . from ( sessionData [ 'AUTH_PBKDF2_CSK_SALT' ] , 'hex' ) ;
149
- let partABKey = Buffer . concat ( [ sessionKeyPartb . slice ( 0 , keyLen ) , sessionKeyParta . slice ( 0 , keyLen ) ] ) ;
150
- let partABKeyStr = partABKey . toString ( 'hex' ) . toUpperCase ( ) ;
151
- let partABKeyBuffer = Buffer . from ( partABKeyStr , 'utf8' ) ;
152
- authObj . comboKey = crypto . pbkdf2Sync ( partABKeyBuffer , mixingSalt , iterations , keyLen , 'sha512' ) ;
141
+ const sessionKeyParta = this . _decrypt ( passwordHash , encodedServerKey ) ;
142
+ const sessionKeyPartb = Buffer . alloc ( sessionKeyParta . length ) ;
143
+ crypto . randomFillSync ( sessionKeyPartb ) ;
144
+ const encodedClientKey = this . _encrypt ( passwordHash , sessionKeyPartb ) ;
145
+
146
+ if ( sessionKeyParta . length === 48 ) {
147
+ authObj . sessionKey = encodedClientKey . slice ( ) . toString ( 'hex' ) . toUpperCase ( ) . slice ( 0 , 96 ) ;
148
+ const buf = Buffer . alloc ( 24 ) ;
149
+ for ( let i = 16 ; i <= 40 ; i ++ ) {
150
+ buf [ i - 16 ] = sessionKeyParta [ i ] ^ sessionKeyPartb [ i ] ;
151
+ }
152
+ const part1 = crypto . createHash ( "md5" ) . update ( buf . subarray ( 0 , 16 ) ) . digest ( ) ;
153
+ const part2 = crypto . createHash ( "md5" ) . update ( buf . subarray ( 16 ) ) . digest ( ) ;
154
+ authObj . comboKey = Buffer . concat ( [ part1 , part2 ] ) . slice ( 0 , keyLen ) ;
155
+ } else {
156
+ authObj . sessionKey = encodedClientKey . slice ( ) . toString ( 'hex' ) . toUpperCase ( ) . slice ( 0 , 64 ) ;
157
+ const mixingSalt = Buffer . from ( sessionData [ 'AUTH_PBKDF2_CSK_SALT' ] , 'hex' ) ;
158
+ iterations = Number ( sessionData [ 'AUTH_PBKDF2_SDER_COUNT' ] ) ;
159
+ const partABKey = Buffer . concat ( [ sessionKeyPartb . slice ( 0 , keyLen ) , sessionKeyParta . slice ( 0 , keyLen ) ] ) ;
160
+ const partABKeyStr = partABKey . toString ( 'hex' ) . toUpperCase ( ) ;
161
+ const partABKeyBuffer = Buffer . from ( partABKeyStr , 'utf8' ) ;
162
+ authObj . comboKey = crypto . pbkdf2Sync ( partABKeyBuffer , mixingSalt ,
163
+ iterations , keyLen , 'sha512' ) ;
164
+ }
153
165
154
166
let salt = Buffer . alloc ( 16 ) ;
155
167
if ( ! verifier11G ) {
0 commit comments