generateSalt(length) {
return new Promise((resolve, reject) => {
crypto.randomBytes(length || 16, (err, salt) => {
/* istanbul ignore if */
if (err) {
reject(err)
}
resolve(salt)
})
})
}
...
}
```
You can provide your own salt as the second parameter. It is **highly**
recommended to use the salt generating methods instead of a hardcoded, constant
salt:
```js
argon2.generateSalt().then(salt => {
// ...
});
// ES7 or TypeScript
const salt = await argon2.generateSalt();
```
...
hash(plain, salt, options) { salt = new Buffer(salt) options = Object.assign({}, defaults, options) return validate(salt, options).then(() => new Promise((resolve, reject) => { bindings.hash(new Buffer(plain), salt, options, resolve, reject) })) }
...
argon2id,
hash(plain, salt, options) {
salt = new Buffer(salt)
options = Object.assign({}, defaults, options)
return validate(salt, options).then(() => new Promise((resolve, reject) => {
bindings.hash(new Buffer(plain), salt, options, resolve, reject)
}))
},
generateSalt(length) {
return new Promise((resolve, reject) => {
crypto.randomBytes(length || 16, (err, salt) => {
/* istanbul ignore if */
...
verify(hash, plain) { if (!/^\$argon2(i|d|id)(\$v=\d+)?\$m=\d+,t=\d+,p=\d+(?:\$[\w+/]+){2}$/.test(hash)) { return Promise.reject(new Error('Invalid hash, must be in MCF, generated by Argon2.')) } return new Promise((resolve, reject) => { bindings.verify(new Buffer(hash), new Buffer(plain), resolve, reject) }) }
...
verify(hash, plain) {
if (!/^\$argon2(i|d|id)(\$v=\d+)?\$m=\d+,t=\d+,p=\d+(?:\$[\w+/]+){2}$/.test(hash)) {
return Promise.reject(new Error('Invalid hash, must be in MCF, generated by Argon2.'))
}
return new Promise((resolve, reject) => {
bindings.verify(new Buffer(hash), new Buffer(plain), resolve, reject)
})
}
}
...