UNPKG

ilp-protocol-stream

Version:

Interledger Transport Protocol for sending multiple streams of money and data over ILP.

100 lines 4.28 kB
"use strict"; 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