forked from dachan/dach
38 lines
1022 B
JavaScript
38 lines
1022 B
JavaScript
|
'use strict'
|
||
|
// This file contains crypto utility functions for versions of Node.js < 15.0.0,
|
||
|
// which does not support the WebCrypto.subtle API.
|
||
|
|
||
|
const nodeCrypto = require('crypto')
|
||
|
|
||
|
function md5(string) {
|
||
|
return nodeCrypto.createHash('md5').update(string, 'utf-8').digest('hex')
|
||
|
}
|
||
|
|
||
|
// See AuthenticationMD5Password at https://www.postgresql.org/docs/current/static/protocol-flow.html
|
||
|
function postgresMd5PasswordHash(user, password, salt) {
|
||
|
var inner = md5(password + user)
|
||
|
var outer = md5(Buffer.concat([Buffer.from(inner), salt]))
|
||
|
return 'md5' + outer
|
||
|
}
|
||
|
|
||
|
function sha256(text) {
|
||
|
return nodeCrypto.createHash('sha256').update(text).digest()
|
||
|
}
|
||
|
|
||
|
function hmacSha256(key, msg) {
|
||
|
return nodeCrypto.createHmac('sha256', key).update(msg).digest()
|
||
|
}
|
||
|
|
||
|
async function deriveKey(password, salt, iterations) {
|
||
|
return nodeCrypto.pbkdf2Sync(password, salt, iterations, 32, 'sha256')
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
postgresMd5PasswordHash,
|
||
|
randomBytes: nodeCrypto.randomBytes,
|
||
|
deriveKey,
|
||
|
sha256,
|
||
|
hmacSha256,
|
||
|
md5,
|
||
|
}
|