Skip to content

Commit d520687

Browse files
authored
feat: add native hkdf (#1124)
* feat: add native hkdf * feat: import only needed to do hkdf * feat: tweak digest and arguments
1 parent 2f88880 commit d520687

File tree

1 file changed

+25
-3
lines changed

1 file changed

+25
-3
lines changed

src/lib/jwt.js

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
import crypto from 'crypto'
12
import jose from 'jose'
2-
import hkdf from 'futoin-hkdf'
33
import logger from './logger'
44

55
// Set default algorithm to use for auto-generated signing key
@@ -136,13 +136,32 @@ async function getToken (params) {
136136
let DERIVED_SIGNING_KEY_WARNING = false
137137
let DERIVED_ENCRYPTION_KEY_WARNING = false
138138

139+
// Do the better hkdf of Node.js one added in `v15.0.0` and Third Party one
140+
function hkdf (secret, { byteLength, encryptionInfo, digest = 'sha256' }) {
141+
if (crypto.hkdfSync) {
142+
return Buffer.from(
143+
crypto.hkdfSync(
144+
digest,
145+
secret,
146+
Buffer.alloc(0),
147+
encryptionInfo,
148+
byteLength
149+
)
150+
)
151+
}
152+
return require('futoin-hkdf')(secret, byteLength, { info: encryptionInfo, hash: digest })
153+
}
154+
139155
function getDerivedSigningKey (secret) {
140156
if (!DERIVED_SIGNING_KEY_WARNING) {
141157
logger.warn('JWT_AUTO_GENERATED_SIGNING_KEY')
142158
DERIVED_SIGNING_KEY_WARNING = true
143159
}
144160

145-
const buffer = hkdf(secret, 64, { info: 'NextAuth.js Generated Signing Key', hash: 'SHA-256' })
161+
const buffer = hkdf(secret, {
162+
byteLength: 64,
163+
encryptionInfo: 'NextAuth.js Generated Signing Key'
164+
})
146165
const key = jose.JWK.asKey(buffer, { alg: DEFAULT_SIGNATURE_ALGORITHM, use: 'sig', kid: 'nextauth-auto-generated-signing-key' })
147166
return key
148167
}
@@ -153,7 +172,10 @@ function getDerivedEncryptionKey (secret) {
153172
DERIVED_ENCRYPTION_KEY_WARNING = true
154173
}
155174

156-
const buffer = hkdf(secret, 32, { info: 'NextAuth.js Generated Encryption Key', hash: 'SHA-256' })
175+
const buffer = hkdf(secret, {
176+
byteLength: 32,
177+
encryptionInfo: 'NextAuth.js Generated Encryption Key'
178+
})
157179
const key = jose.JWK.asKey(buffer, { alg: DEFAULT_ENCRYPTION_ALGORITHM, use: 'enc', kid: 'nextauth-auto-generated-encryption-key' })
158180
return key
159181
}

0 commit comments

Comments
 (0)