MPI stores data as Uint8Array instead of BN

This commit is contained in:
Mahrud Sayrafi 2018-02-26 22:05:40 -05:00
parent 3df0997f4d
commit d418b4aa40
No known key found for this signature in database
GPG Key ID: C24071B956C3245F

View File

@ -61,19 +61,13 @@ export default function MPI(data) {
MPI.prototype.read = function (bytes, endian='be') { MPI.prototype.read = function (bytes, endian='be') {
if (util.isString(bytes)) { if (util.isString(bytes)) {
bytes = util.str2Uint8Array(bytes); bytes = util.str2Uint8Array(bytes);
} else {
bytes = util.copyUint8Array(bytes);
} }
const bits = (bytes[0] << 8) | bytes[1]; const bits = (bytes[0] << 8) | bytes[1];
const bytelen = (bits + 7) >>> 3; const bytelen = (bits + 7) >>> 3;
const payload = bytes.subarray(2, 2 + bytelen); const payload = bytes.subarray(2, 2 + bytelen);
if (endian === 'le') { this.fromUint8Array(payload, endian);
payload.reverse();
}
this.fromUint8Array(payload);
return 2 + bytelen; return 2 + bytelen;
}; };
@ -86,40 +80,60 @@ MPI.prototype.read = function (bytes, endian='be') {
* @return {Uint8Aray} mpi Byte representation * @return {Uint8Aray} mpi Byte representation
*/ */
MPI.prototype.write = function (endian, length) { MPI.prototype.write = function (endian, length) {
return util.Uint8Array2MPI(this.data.toArrayLike(Uint8Array, endian, length)); return util.Uint8Array2MPI(this.toUint8Array(endian, length));
};
MPI.prototype.bitLength = function () {
return (this.data.length - 1) * 8 + util.nbits(this.data[0]);
}; };
MPI.prototype.byteLength = function () { MPI.prototype.byteLength = function () {
return this.write().length - 2; return this.data.length;
}; };
MPI.prototype.toUint8Array = function (endian, length) { MPI.prototype.toUint8Array = function (endian, length) {
return this.write(endian, length).slice(2); endian = endian || 'be';
length = length || this.data.length;
const payload = new Uint8Array(length);
const start = length - this.data.length;
if (start < 0) {
throw new Error('Payload is too large.');
}
payload.set(this.data, start);
if (endian === 'le') {
payload.reverse();
}
return payload;
}; };
MPI.prototype.fromUint8Array = function (bytes) { MPI.prototype.fromUint8Array = function (bytes, endian='be') {
this.data = new BN(bytes); this.data = new Uint8Array(bytes.length);
this.data.set(bytes);
if (endian === 'le') {
this.data.reverse();
}
}; };
MPI.prototype.toString = function () { MPI.prototype.toString = function () {
return util.Uint8Array2str(this.toUint8Array()); return util.Uint8Array2str(this.toUint8Array());
}; };
MPI.prototype.fromString = function (str) { MPI.prototype.fromString = function (str, endian='be') {
this.data = new BN(util.str2Uint8Array(str)); this.fromUint8Array(util.str2Uint8Array(str), endian);
}; };
MPI.prototype.toBN = function () { MPI.prototype.toBN = function () {
return this.data.clone(); return new BN(this.toUint8Array());
}; };
MPI.prototype.fromBN = function (bn) { MPI.prototype.fromBN = function (bn) {
this.data = bn.clone(); this.data = bn.toArrayLike(Uint8Array);
}; };
MPI.fromClone = function (clone) { MPI.fromClone = function (clone) {
clone.data.copy = BN.prototype.copy; return new MPI(clone.data);
const bn = new BN();
clone.data.copy(bn);
return new MPI(bn);
}; };