101 lines
2.5 KiB
JavaScript
101 lines
2.5 KiB
JavaScript
|
/*!
|
||
|
* deps/forge.js - Forge Package Customization
|
||
|
*
|
||
|
* Copyright (c) 2015 Cisco Systems, Inc. See LICENSE file.
|
||
|
*/
|
||
|
"use strict";
|
||
|
|
||
|
var forge = require("node-forge/lib/forge");
|
||
|
require("node-forge/lib/aes");
|
||
|
require("node-forge/lib/asn1");
|
||
|
require("node-forge/lib/cipher");
|
||
|
require("node-forge/lib/hmac");
|
||
|
require("node-forge/lib/mgf1");
|
||
|
require("node-forge/lib/pbkdf2");
|
||
|
require("node-forge/lib/pem");
|
||
|
require("node-forge/lib/pkcs1");
|
||
|
require("node-forge/lib/pkcs7");
|
||
|
require("node-forge/lib/pki");
|
||
|
require("node-forge/lib/prime");
|
||
|
require("node-forge/lib/prng");
|
||
|
require("node-forge/lib/pss");
|
||
|
require("node-forge/lib/random");
|
||
|
require("node-forge/lib/sha1");
|
||
|
require("node-forge/lib/sha256");
|
||
|
require("node-forge/lib/sha512");
|
||
|
require("node-forge/lib/util");
|
||
|
|
||
|
// Define AES "raw" cipher mode
|
||
|
function modeRaw(options) {
|
||
|
options = options || {};
|
||
|
this.name = "";
|
||
|
this.cipher = options.cipher;
|
||
|
this.blockSize = options.blockSize || 16;
|
||
|
this._blocks = this.blockSize / 4;
|
||
|
this._inBlock = new Array(this._blocks);
|
||
|
this._outBlock = new Array(this._blocks);
|
||
|
}
|
||
|
|
||
|
modeRaw.prototype.start = function() {};
|
||
|
|
||
|
modeRaw.prototype.encrypt = function(input, output, finish) {
|
||
|
if(input.length() < this.blockSize && !(finish && input.length() > 0)) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
var i;
|
||
|
|
||
|
// get next block
|
||
|
for(i = 0; i < this._blocks; ++i) {
|
||
|
this._inBlock[i] = input.getInt32();
|
||
|
}
|
||
|
|
||
|
// encrypt block
|
||
|
this.cipher.encrypt(this._inBlock, this._outBlock);
|
||
|
|
||
|
// write output
|
||
|
for(i = 0; i < this._blocks; ++i) {
|
||
|
output.putInt32(this._outBlock[i]);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
modeRaw.prototype.decrypt = function(input, output, finish) {
|
||
|
if(input.length() < this.blockSize && !(finish && input.length() > 0)) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
var i;
|
||
|
|
||
|
// get next block
|
||
|
for(i = 0; i < this._blocks; ++i) {
|
||
|
this._inBlock[i] = input.getInt32();
|
||
|
}
|
||
|
|
||
|
// decrypt block
|
||
|
this.cipher.decrypt(this._inBlock, this._outBlock);
|
||
|
|
||
|
// write output
|
||
|
for(i = 0; i < this._blocks; ++i) {
|
||
|
output.putInt32(this._outBlock[i]);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
(function() {
|
||
|
var name = "AES",
|
||
|
mode = modeRaw,
|
||
|
factory;
|
||
|
factory = function() { return new forge.aes.Algorithm(name, mode); };
|
||
|
forge.cipher.registerAlgorithm(name, factory);
|
||
|
})();
|
||
|
|
||
|
// Ensure that the jsbn modInverse function always returns a positive result
|
||
|
const originalModInverse = forge.jsbn.BigInteger.prototype.modInverse;
|
||
|
const positiveModInverse = function(m) {
|
||
|
const inv = originalModInverse.apply(this, [m]);
|
||
|
return inv.mod(m);
|
||
|
}
|
||
|
|
||
|
forge.jsbn.BigInteger.prototype.modInverse = positiveModInverse;
|
||
|
|
||
|
module.exports = forge;
|