ilp-protocol-stream
Version:
Interledger Transport Protocol for sending multiple streams of money and data over ILP.
61 lines • 2.14 kB
JavaScript
;
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