ilp-protocol-stream
Version:
Interledger Transport Protocol for sending multiple streams of money and data over ILP.
100 lines • 4.28 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.decryptConnectionAddressToken = exports.encryptConnectionAddressToken = exports.generateReceiptHMAC = exports.generateSharedSecretFromToken = exports.hmac = exports.decrypt = exports.encrypt = exports.hash = exports.randomBytes = void 0;
const crypto = __importStar(require("crypto"));
const assert_1 = __importDefault(require("assert"));
const HASH_ALGORITHM = 'sha256';
const ENCRYPTION_ALGORITHM = 'aes-256-gcm';
const IV_LENGTH = 12;
const AUTH_TAG_LENGTH = 16;
const SHARED_SECRET_GENERATION_STRING = Buffer.from('ilp_stream_shared_secret', 'utf8');
exports.randomBytes = crypto.randomBytes;
async function hash(preimage) {
const h = crypto.createHash(HASH_ALGORITHM);
h.update(preimage);
return Promise.resolve(h.digest());
}
exports.hash = hash;
async function encrypt(pskEncryptionKey, ...buffers) {
return Promise.resolve(encryptSync(pskEncryptionKey, ...buffers));
}
exports.encrypt = encrypt;
function encryptSync(pskEncryptionKey, ...buffers) {
const iv = crypto.randomBytes(IV_LENGTH);
const cipher = crypto.createCipheriv(ENCRYPTION_ALGORITHM, pskEncryptionKey, iv);
const ciphertext = [];
for (const buffer of buffers) {
ciphertext.push(cipher.update(buffer));
}
ciphertext.push(cipher.final());
const tag = cipher.getAuthTag();
ciphertext.unshift(iv, tag);
return Buffer.concat(ciphertext);
}
async function decrypt(pskEncryptionKey, data) {
return Promise.resolve(decryptSync(pskEncryptionKey, data));
}
exports.decrypt = decrypt;
function decryptSync(pskEncryptionKey, data) {
(0, assert_1.default)(data.length > 0, 'cannot decrypt empty buffer');
const nonce = data.slice(0, IV_LENGTH);
const tag = data.slice(IV_LENGTH, IV_LENGTH + AUTH_TAG_LENGTH);
const encrypted = data.slice(IV_LENGTH + AUTH_TAG_LENGTH);
const decipher = crypto.createDecipheriv(ENCRYPTION_ALGORITHM, pskEncryptionKey, nonce);
decipher.setAuthTag(tag);
return Buffer.concat([decipher.update(encrypted), decipher.final()]);
}
async function hmac(key, message) {
return Promise.resolve(hmacSync(key, message));
}
exports.hmac = hmac;
function hmacSync(key, message) {
const h = crypto.createHmac(HASH_ALGORITHM, key);
h.update(message);
return h.digest();
}
function generateSharedSecretFromToken(seed, token) {
const keygen = hmacSync(seed, SHARED_SECRET_GENERATION_STRING);
const sharedSecret = hmacSync(keygen, token);
return sharedSecret;
}
exports.generateSharedSecretFromToken = generateSharedSecretFromToken;
function generateReceiptHMAC(secret, message) {
return hmacSync(secret, message);
}
exports.generateReceiptHMAC = generateReceiptHMAC;
function encryptConnectionAddressToken(seed, token) {
return encryptSync(seed, token);
}
exports.encryptConnectionAddressToken = encryptConnectionAddressToken;
function decryptConnectionAddressToken(seed, token) {
return decryptSync(seed, token);
}
exports.decryptConnectionAddressToken = decryptConnectionAddressToken;
//# sourceMappingURL=crypto-node.js.map