mirror of
https://github.com/node-ebics/node-ebics-client.git
synced 2025-08-15 04:05:35 +00:00
Major changes. Separating responsibilities. Orders builder, serializer.
This commit is contained in:
48
lib/crypto/MGF1.js
Normal file
48
lib/crypto/MGF1.js
Normal file
@@ -0,0 +1,48 @@
|
||||
'use strict';
|
||||
|
||||
const crypto = require('crypto');
|
||||
const BN = require('bn.js');
|
||||
|
||||
const MFG_LEN = 32;
|
||||
|
||||
const divceil = (a, b) => ~~(((a + b) - 1) / b); // eslint-disable-line no-bitwise
|
||||
const rjust = (string, width, padding) => {
|
||||
padding = padding || ' ';
|
||||
padding = padding.substr(0, 1);
|
||||
if (string.length < width)
|
||||
return padding.repeat(width - string.length) + string;
|
||||
return string;
|
||||
};
|
||||
const xor = (a, b) => {
|
||||
if (a.length !== b.length)
|
||||
throw new Error('Different length for a and b');
|
||||
|
||||
for (let i = 0; i < a.length; i++)
|
||||
a[i] ^= b[i]; // eslint-disable-line no-bitwise
|
||||
|
||||
return a;
|
||||
};
|
||||
const i2osp = (x, len) => {
|
||||
if (x >= 256 ** len)
|
||||
throw new Error('Integer too large');
|
||||
|
||||
return Buffer.from(rjust((Buffer.from((new BN(x)).toArray('be', 4)).toString()).replace(/\x00/gi, ''), len, '\x00')); // eslint-disable-line no-control-regex
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
generate(seed, masklen) {
|
||||
if (masklen > 4294967296 * MFG_LEN)
|
||||
throw new Error('Mask too long');
|
||||
|
||||
|
||||
const b = [];
|
||||
|
||||
for (let i = 0; i < divceil(masklen, MFG_LEN); i++)
|
||||
b[i] = crypto.createHash('sha256').update(Buffer.concat([seed, i2osp(i, 4)])).digest();
|
||||
|
||||
|
||||
return (Buffer.concat(b)).slice(0, masklen);
|
||||
},
|
||||
xor,
|
||||
rjust,
|
||||
};
|
Reference in New Issue
Block a user