UNPKG

ilp-protocol-stream

Version:

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

61 lines 2.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.verifyReceipt = exports.decodeReceipt = exports.createReceipt = exports.RECEIPT_VERSION = void 0; const oer_utils_1 = require("oer-utils"); const long_1 = require("./long"); const crypto_1 = require("../crypto"); exports.RECEIPT_VERSION = 1; function createReceipt(opts) { if (opts.nonce.length !== 16) { throw new Error('receipt nonce must be 16 bytes'); } if (opts.secret.length !== 32) { throw new Error('receipt secret must be 32 bytes'); } const receipt = new oer_utils_1.Writer(58); receipt.writeUInt8(exports.RECEIPT_VERSION); receipt.writeOctetString(opts.nonce, 16); receipt.writeUInt8(opts.streamId); receipt.writeUInt64((0, long_1.longFromValue)(opts.totalReceived, true)); receipt.writeOctetString((0, crypto_1.generateReceiptHMAC)(opts.secret, receipt.getBuffer()), 32); return receipt.getBuffer(); } exports.createReceipt = createReceipt; function decode(receipt) { if (receipt.length !== 58) { throw new Error('receipt malformed'); } const reader = oer_utils_1.Reader.from(receipt); const version = reader.readUInt8Number(); const nonce = reader.readOctetString(16); const streamId = reader.readUInt8(); const totalReceived = reader.readUInt64Long(); const hmac = reader.readOctetString(32); return { version, nonce, streamId, totalReceived, hmac, }; } function decodeReceipt(receipt) { return decode(receipt); } exports.decodeReceipt = decodeReceipt; function verifyReceipt(receipt, secret) { const decoded = decode(receipt); if (decoded.version !== exports.RECEIPT_VERSION) { throw new Error('invalid version'); } if (typeof secret === 'function') { secret = secret(decoded); } const message = receipt.slice(0, 26); if (!decoded.hmac.equals((0, crypto_1.generateReceiptHMAC)(secret, message))) { throw new Error('invalid hmac'); } return decoded; } exports.verifyReceipt = verifyReceipt; //# sourceMappingURL=receipt.js.map