11'use strict'
2- const crypto = require ( 'crypto ' )
2+ const crypto = require ( './utils ' )
33
44function startSession ( mechanisms ) {
55 if ( mechanisms . indexOf ( 'SCRAM-SHA-256' ) === - 1 ) {
@@ -16,7 +16,7 @@ function startSession(mechanisms) {
1616 }
1717}
1818
19- function continueSession ( session , password , serverData ) {
19+ async function continueSession ( session , password , serverData ) {
2020 if ( session . message !== 'SASLInitialResponse' ) {
2121 throw new Error ( 'SASL: Last message was not SASLInitialResponse' )
2222 }
@@ -38,29 +38,22 @@ function continueSession(session, password, serverData) {
3838 throw new Error ( 'SASL: SCRAM-SERVER-FIRST-MESSAGE: server nonce is too short' )
3939 }
4040
41- var saltBytes = Buffer . from ( sv . salt , 'base64' )
42-
43- var saltedPassword = crypto . pbkdf2Sync ( password , saltBytes , sv . iteration , 32 , 'sha256' )
44-
45- var clientKey = hmacSha256 ( saltedPassword , 'Client Key' )
46- var storedKey = sha256 ( clientKey )
47-
4841 var clientFirstMessageBare = 'n=*,r=' + session . clientNonce
4942 var serverFirstMessage = 'r=' + sv . nonce + ',s=' + sv . salt + ',i=' + sv . iteration
50-
5143 var clientFinalMessageWithoutProof = 'c=biws,r=' + sv . nonce
52-
5344 var authMessage = clientFirstMessageBare + ',' + serverFirstMessage + ',' + clientFinalMessageWithoutProof
5445
55- var clientSignature = hmacSha256 ( storedKey , authMessage )
56- var clientProofBytes = xorBuffers ( clientKey , clientSignature )
57- var clientProof = clientProofBytes . toString ( 'base64' )
58-
59- var serverKey = hmacSha256 ( saltedPassword , 'Server Key' )
60- var serverSignatureBytes = hmacSha256 ( serverKey , authMessage )
46+ var saltBytes = Buffer . from ( sv . salt , 'base64' )
47+ var saltedPassword = await crypto . deriveKey ( password , saltBytes , sv . iteration )
48+ var clientKey = await crypto . hmacSha256 ( saltedPassword , 'Client Key' )
49+ var storedKey = await crypto . sha256 ( clientKey )
50+ var clientSignature = await crypto . hmacSha256 ( storedKey , authMessage )
51+ var clientProof = xorBuffers ( Buffer . from ( clientKey ) , Buffer . from ( clientSignature ) ) . toString ( 'base64' )
52+ var serverKey = await crypto . hmacSha256 ( saltedPassword , 'Server Key' )
53+ var serverSignatureBytes = await crypto . hmacSha256 ( serverKey , authMessage )
6154
6255 session . message = 'SASLResponse'
63- session . serverSignature = serverSignatureBytes . toString ( 'base64' )
56+ session . serverSignature = Buffer . from ( serverSignatureBytes ) . toString ( 'base64' )
6457 session . response = clientFinalMessageWithoutProof + ',p=' + clientProof
6558}
6659
@@ -186,14 +179,6 @@ function xorBuffers(a, b) {
186179 return Buffer . from ( a . map ( ( _ , i ) => a [ i ] ^ b [ i ] ) )
187180}
188181
189- function sha256 ( text ) {
190- return crypto . createHash ( 'sha256' ) . update ( text ) . digest ( )
191- }
192-
193- function hmacSha256 ( key , msg ) {
194- return crypto . createHmac ( 'sha256' , key ) . update ( msg ) . digest ( )
195- }
196-
197182module . exports = {
198183 startSession,
199184 continueSession,
0 commit comments