@stricahq/bip32ed25519
Version:
Pure javascript implementation of Bip32Ed25519, used for Cardano blockchain key pair.
99 lines (98 loc) • 3.71 kB
JavaScript
"use strict";
/**
* Copyright 2021 Ashish Prajapati
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* *** Includes code to override elliptic.js implementation for ed25519 ***
*
* LICENSE
*
* This software is licensed under the MIT License.
*
* Copyright Fedor Indutny, 2014.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge, publish, distribute,
* sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
const elliptic = require("elliptic");
const utils = elliptic.utils;
const assert = utils.assert;
const parseBytes = utils.parseBytes;
const cachedProperty = utils.cachedProperty;
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 });
};
KeyPair.fromSecret = function fromSecret(eddsa, secret) {
if (secret instanceof KeyPair) {
return secret;
}
return new KeyPair(eddsa, { secret });
};
KeyPair.prototype.secret = function secret() {
return this._secret.slice(0, 32);
};
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.kl());
});
cachedProperty(KeyPair, "privBytes", function privBytes() {
return this._secret;
});
cachedProperty(KeyPair, "priv", function priv() {
return this.eddsa.decodeInt(this.privBytes());
});
cachedProperty(KeyPair, "kl", function priv() {
return this.eddsa.decodeInt(this.privBytes().slice(0, 32));
});
cachedProperty(KeyPair, "messagePrefix", function messagePrefix() {
return this._secret.slice(32, 64);
});
KeyPair.prototype.sign = function sign(message) {
assert(this._secret, "KeyPair can only verify");
return this.eddsa.signExtended(message, this);
};
KeyPair.prototype.verify = function verify(message, sig) {
return this.eddsa.verify(message, sig, this);
};
module.exports = KeyPair;