bitcore-lib-zcash/lib/transaction/outputdescription.js

79 lines
2.5 KiB
JavaScript

'use strict';
var _ = require('lodash');
var $ = require('../util/preconditions');
var BN = require('../crypto/bn');
var buffer = require('buffer');
var BufferWriter = require('../encoding/bufferwriter');
var BufferUtil = require('../util/buffer');
var JSUtil = require('../util/js');
// Sapling note magic values, copied from src/zcash/Zcash.h
var NOTEENCRYPTION_AUTH_BYTES = 16;
var ZC_NOTEPLAINTEXT_LEADING = 1;
var ZC_V_SIZE = 8;
var ZC_RHO_SIZE = 32;
var ZC_R_SIZE = 32;
var ZC_MEMO_SIZE = 512;
var ZC_DIVERSIFIER_SIZE = 11;
var ZC_JUBJUB_POINT_SIZE = 32;
var ZC_JUBJUB_SCALAR_SIZE = 32;
var ZC_NOTEPLAINTEXT_SIZE = ZC_NOTEPLAINTEXT_LEADING + ZC_V_SIZE + ZC_RHO_SIZE + ZC_R_SIZE + ZC_MEMO_SIZE;
var ZC_SAPLING_ENCPLAINTEXT_SIZE = ZC_NOTEPLAINTEXT_LEADING + ZC_DIVERSIFIER_SIZE + ZC_V_SIZE + ZC_R_SIZE + ZC_MEMO_SIZE;
var ZC_SAPLING_OUTPLAINTEXT_SIZE = ZC_JUBJUB_POINT_SIZE + ZC_JUBJUB_SCALAR_SIZE;
var ZC_SAPLING_ENCCIPHERTEXT_SIZE = ZC_SAPLING_ENCPLAINTEXT_SIZE + NOTEENCRYPTION_AUTH_BYTES;
var ZC_SAPLING_OUTCIPHERTEXT_SIZE = ZC_SAPLING_OUTPLAINTEXT_SIZE + NOTEENCRYPTION_AUTH_BYTES;
function OutputDescription(params) {
if (!(this instanceof OutputDescription)) {
return new OutputDescription(params);
}
if (params) {
return this._fromObject(params);
}
}
OutputDescription.fromObject = function(obj) {
$.checkArgument(_.isObject(obj));
var outputdesc = new OutputDescription();
return outputdesc._fromObject(obj);
};
OutputDescription.prototype._fromObject = function(params) {
// TODO: Populate from parameters, but for now it's ok to do nothing.
return this;
};
OutputDescription.prototype.toObject = OutputDescription.prototype.toJSON = function toObject() {
// TODO: Populate JSON object, but for now it's ok to return a placeholder.
var obj = {};
return obj;
};
OutputDescription.fromBufferReader = function(br) {
var obj = new OutputDescription();
obj.cv = br.read(32);
obj.cmu = br.read(32);
obj.ephemeralKey = br.read(32);
obj.encCipherText = br.read(ZC_SAPLING_ENCCIPHERTEXT_SIZE);
obj.outCipherText = br.read(ZC_SAPLING_OUTCIPHERTEXT_SIZE);
obj.proof = br.read(48 + 96 + 48);
return obj;
};
OutputDescription.prototype.toBufferWriter = function(writer) {
var i;
if (!writer) {
writer = new BufferWriter();
}
writer.write(this.cv);
writer.write(this.cmu);
writer.write(this.ephemeralKey);
writer.write(this.encCipherText);
writer.write(this.outCipherText);
writer.write(this.proof);
return writer;
};
module.exports = OutputDescription;