forked from enviPath/enviPy
Current Dev State
This commit is contained in:
118
static/js/ketcher2/node_modules/elliptic/lib/elliptic/eddsa/index.js
generated
vendored
Normal file
118
static/js/ketcher2/node_modules/elliptic/lib/elliptic/eddsa/index.js
generated
vendored
Normal file
@ -0,0 +1,118 @@
|
||||
'use strict';
|
||||
|
||||
var hash = require('hash.js');
|
||||
var elliptic = require('../../elliptic');
|
||||
var utils = elliptic.utils;
|
||||
var assert = utils.assert;
|
||||
var parseBytes = utils.parseBytes;
|
||||
var KeyPair = require('./key');
|
||||
var Signature = require('./signature');
|
||||
|
||||
function EDDSA(curve) {
|
||||
assert(curve === 'ed25519', 'only tested with ed25519 so far');
|
||||
|
||||
if (!(this instanceof EDDSA))
|
||||
return new EDDSA(curve);
|
||||
|
||||
var curve = elliptic.curves[curve].curve;
|
||||
this.curve = curve;
|
||||
this.g = curve.g;
|
||||
this.g.precompute(curve.n.bitLength() + 1);
|
||||
|
||||
this.pointClass = curve.point().constructor;
|
||||
this.encodingLength = Math.ceil(curve.n.bitLength() / 8);
|
||||
this.hash = hash.sha512;
|
||||
}
|
||||
|
||||
module.exports = EDDSA;
|
||||
|
||||
/**
|
||||
* @param {Array|String} message - message bytes
|
||||
* @param {Array|String|KeyPair} secret - secret bytes or a keypair
|
||||
* @returns {Signature} - signature
|
||||
*/
|
||||
EDDSA.prototype.sign = function sign(message, secret) {
|
||||
message = parseBytes(message);
|
||||
var key = this.keyFromSecret(secret);
|
||||
var r = this.hashInt(key.messagePrefix(), message);
|
||||
var R = this.g.mul(r);
|
||||
var Rencoded = this.encodePoint(R);
|
||||
var s_ = this.hashInt(Rencoded, key.pubBytes(), message)
|
||||
.mul(key.priv());
|
||||
var S = r.add(s_).umod(this.curve.n);
|
||||
return this.makeSignature({ R: R, S: S, Rencoded: Rencoded });
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {Array} message - message bytes
|
||||
* @param {Array|String|Signature} sig - sig bytes
|
||||
* @param {Array|String|Point|KeyPair} pub - public key
|
||||
* @returns {Boolean} - true if public key matches sig of message
|
||||
*/
|
||||
EDDSA.prototype.verify = function verify(message, sig, pub) {
|
||||
message = parseBytes(message);
|
||||
sig = this.makeSignature(sig);
|
||||
var key = this.keyFromPublic(pub);
|
||||
var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message);
|
||||
var SG = this.g.mul(sig.S());
|
||||
var RplusAh = sig.R().add(key.pub().mul(h));
|
||||
return RplusAh.eq(SG);
|
||||
};
|
||||
|
||||
EDDSA.prototype.hashInt = function hashInt() {
|
||||
var hash = this.hash();
|
||||
for (var i = 0; i < arguments.length; i++)
|
||||
hash.update(arguments[i]);
|
||||
return utils.intFromLE(hash.digest()).umod(this.curve.n);
|
||||
};
|
||||
|
||||
EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) {
|
||||
return KeyPair.fromPublic(this, pub);
|
||||
};
|
||||
|
||||
EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) {
|
||||
return KeyPair.fromSecret(this, secret);
|
||||
};
|
||||
|
||||
EDDSA.prototype.makeSignature = function makeSignature(sig) {
|
||||
if (sig instanceof Signature)
|
||||
return sig;
|
||||
return new Signature(this, sig);
|
||||
};
|
||||
|
||||
/**
|
||||
* * https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03#section-5.2
|
||||
*
|
||||
* EDDSA defines methods for encoding and decoding points and integers. These are
|
||||
* helper convenience methods, that pass along to utility functions implied
|
||||
* parameters.
|
||||
*
|
||||
*/
|
||||
EDDSA.prototype.encodePoint = function encodePoint(point) {
|
||||
var enc = point.getY().toArray('le', this.encodingLength);
|
||||
enc[this.encodingLength - 1] |= point.getX().isOdd() ? 0x80 : 0;
|
||||
return enc;
|
||||
};
|
||||
|
||||
EDDSA.prototype.decodePoint = function decodePoint(bytes) {
|
||||
bytes = utils.parseBytes(bytes);
|
||||
|
||||
var lastIx = bytes.length - 1;
|
||||
var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~0x80);
|
||||
var xIsOdd = (bytes[lastIx] & 0x80) !== 0;
|
||||
|
||||
var y = utils.intFromLE(normed);
|
||||
return this.curve.pointFromY(y, xIsOdd);
|
||||
};
|
||||
|
||||
EDDSA.prototype.encodeInt = function encodeInt(num) {
|
||||
return num.toArray('le', this.encodingLength);
|
||||
};
|
||||
|
||||
EDDSA.prototype.decodeInt = function decodeInt(bytes) {
|
||||
return utils.intFromLE(bytes);
|
||||
};
|
||||
|
||||
EDDSA.prototype.isPoint = function isPoint(val) {
|
||||
return val instanceof this.pointClass;
|
||||
};
|
||||
96
static/js/ketcher2/node_modules/elliptic/lib/elliptic/eddsa/key.js
generated
vendored
Normal file
96
static/js/ketcher2/node_modules/elliptic/lib/elliptic/eddsa/key.js
generated
vendored
Normal file
@ -0,0 +1,96 @@
|
||||
'use strict';
|
||||
|
||||
var elliptic = require('../../elliptic');
|
||||
var utils = elliptic.utils;
|
||||
var assert = utils.assert;
|
||||
var parseBytes = utils.parseBytes;
|
||||
var cachedProperty = utils.cachedProperty;
|
||||
|
||||
/**
|
||||
* @param {EDDSA} eddsa - instance
|
||||
* @param {Object} params - public/private key parameters
|
||||
*
|
||||
* @param {Array<Byte>} [params.secret] - secret seed bytes
|
||||
* @param {Point} [params.pub] - public key point (aka `A` in eddsa terms)
|
||||
* @param {Array<Byte>} [params.pub] - public key point encoded as bytes
|
||||
*
|
||||
*/
|
||||
function KeyPair(eddsa, params) {
|
||||
this.eddsa = eddsa;
|
||||
this._secret = parseBytes(params.secret);
|
||||
if (eddsa.isPoint(params.pub))
|
||||
this._pub = params.pub;
|
||||
else
|
||||
this._pubBytes = parseBytes(params.pub);
|
||||
}
|
||||
|
||||
KeyPair.fromPublic = function fromPublic(eddsa, pub) {
|
||||
if (pub instanceof KeyPair)
|
||||
return pub;
|
||||
return new KeyPair(eddsa, { pub: pub });
|
||||
};
|
||||
|
||||
KeyPair.fromSecret = function fromSecret(eddsa, secret) {
|
||||
if (secret instanceof KeyPair)
|
||||
return secret;
|
||||
return new KeyPair(eddsa, { secret: secret });
|
||||
};
|
||||
|
||||
KeyPair.prototype.secret = function secret() {
|
||||
return this._secret;
|
||||
};
|
||||
|
||||
cachedProperty(KeyPair, 'pubBytes', function pubBytes() {
|
||||
return this.eddsa.encodePoint(this.pub());
|
||||
});
|
||||
|
||||
cachedProperty(KeyPair, 'pub', function pub() {
|
||||
if (this._pubBytes)
|
||||
return this.eddsa.decodePoint(this._pubBytes);
|
||||
return this.eddsa.g.mul(this.priv());
|
||||
});
|
||||
|
||||
cachedProperty(KeyPair, 'privBytes', function privBytes() {
|
||||
var eddsa = this.eddsa;
|
||||
var hash = this.hash();
|
||||
var lastIx = eddsa.encodingLength - 1;
|
||||
|
||||
var a = hash.slice(0, eddsa.encodingLength);
|
||||
a[0] &= 248;
|
||||
a[lastIx] &= 127;
|
||||
a[lastIx] |= 64;
|
||||
|
||||
return a;
|
||||
});
|
||||
|
||||
cachedProperty(KeyPair, 'priv', function priv() {
|
||||
return this.eddsa.decodeInt(this.privBytes());
|
||||
});
|
||||
|
||||
cachedProperty(KeyPair, 'hash', function hash() {
|
||||
return this.eddsa.hash().update(this.secret()).digest();
|
||||
});
|
||||
|
||||
cachedProperty(KeyPair, 'messagePrefix', function messagePrefix() {
|
||||
return this.hash().slice(this.eddsa.encodingLength);
|
||||
});
|
||||
|
||||
KeyPair.prototype.sign = function sign(message) {
|
||||
assert(this._secret, 'KeyPair can only verify');
|
||||
return this.eddsa.sign(message, this);
|
||||
};
|
||||
|
||||
KeyPair.prototype.verify = function verify(message, sig) {
|
||||
return this.eddsa.verify(message, sig, this);
|
||||
};
|
||||
|
||||
KeyPair.prototype.getSecret = function getSecret(enc) {
|
||||
assert(this._secret, 'KeyPair is public only');
|
||||
return utils.encode(this.secret(), enc);
|
||||
};
|
||||
|
||||
KeyPair.prototype.getPublic = function getPublic(enc) {
|
||||
return utils.encode(this.pubBytes(), enc);
|
||||
};
|
||||
|
||||
module.exports = KeyPair;
|
||||
66
static/js/ketcher2/node_modules/elliptic/lib/elliptic/eddsa/signature.js
generated
vendored
Normal file
66
static/js/ketcher2/node_modules/elliptic/lib/elliptic/eddsa/signature.js
generated
vendored
Normal file
@ -0,0 +1,66 @@
|
||||
'use strict';
|
||||
|
||||
var BN = require('bn.js');
|
||||
var elliptic = require('../../elliptic');
|
||||
var utils = elliptic.utils;
|
||||
var assert = utils.assert;
|
||||
var cachedProperty = utils.cachedProperty;
|
||||
var parseBytes = utils.parseBytes;
|
||||
|
||||
/**
|
||||
* @param {EDDSA} eddsa - eddsa instance
|
||||
* @param {Array<Bytes>|Object} sig -
|
||||
* @param {Array<Bytes>|Point} [sig.R] - R point as Point or bytes
|
||||
* @param {Array<Bytes>|bn} [sig.S] - S scalar as bn or bytes
|
||||
* @param {Array<Bytes>} [sig.Rencoded] - R point encoded
|
||||
* @param {Array<Bytes>} [sig.Sencoded] - S scalar encoded
|
||||
*/
|
||||
function Signature(eddsa, sig) {
|
||||
this.eddsa = eddsa;
|
||||
|
||||
if (typeof sig !== 'object')
|
||||
sig = parseBytes(sig);
|
||||
|
||||
if (Array.isArray(sig)) {
|
||||
sig = {
|
||||
R: sig.slice(0, eddsa.encodingLength),
|
||||
S: sig.slice(eddsa.encodingLength)
|
||||
};
|
||||
}
|
||||
|
||||
assert(sig.R && sig.S, 'Signature without R or S');
|
||||
|
||||
if (eddsa.isPoint(sig.R))
|
||||
this._R = sig.R;
|
||||
if (sig.S instanceof BN)
|
||||
this._S = sig.S;
|
||||
|
||||
this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded;
|
||||
this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded;
|
||||
}
|
||||
|
||||
cachedProperty(Signature, 'S', function S() {
|
||||
return this.eddsa.decodeInt(this.Sencoded());
|
||||
});
|
||||
|
||||
cachedProperty(Signature, 'R', function R() {
|
||||
return this.eddsa.decodePoint(this.Rencoded());
|
||||
});
|
||||
|
||||
cachedProperty(Signature, 'Rencoded', function Rencoded() {
|
||||
return this.eddsa.encodePoint(this.R());
|
||||
});
|
||||
|
||||
cachedProperty(Signature, 'Sencoded', function Sencoded() {
|
||||
return this.eddsa.encodeInt(this.S());
|
||||
});
|
||||
|
||||
Signature.prototype.toBytes = function toBytes() {
|
||||
return this.Rencoded().concat(this.Sencoded());
|
||||
};
|
||||
|
||||
Signature.prototype.toHex = function toHex() {
|
||||
return utils.encode(this.toBytes(), 'hex').toUpperCase();
|
||||
};
|
||||
|
||||
module.exports = Signature;
|
||||
Reference in New Issue
Block a user