Socket
Socket
Sign inDemoInstall

@iov/crypto

Package Overview
Dependencies
Maintainers
3
Versions
83
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@iov/crypto - npm Package Compare versions

Comparing version 0.9.1 to 0.10.0

build/secp256k1signature.js

4

build/bip39.spec.js

@@ -14,6 +14,2 @@ "use strict";

const fromHex = encoding_1.Encoding.fromHex;
// Set here for Browsers until this can be configured in Karma
// https://github.com/karma-runner/karma-jasmine/pull/211
// tslint:disable-next-line:no-object-mutation
jasmine.DEFAULT_TIMEOUT_INTERVAL = 30 * 1000;
describe("Bip39", () => {

@@ -20,0 +16,0 @@ it("can encode to mnemonic", () => {

@@ -12,4 +12,7 @@ "use strict";

__export(require("./secp256k1"));
var secp256k1signature_1 = require("./secp256k1signature");
exports.ExtendedSecp256k1Signature = secp256k1signature_1.ExtendedSecp256k1Signature;
exports.Secp256k1Signature = secp256k1signature_1.Secp256k1Signature;
__export(require("./sha"));
__export(require("./slip10"));
//# sourceMappingURL=index.js.map

@@ -14,2 +14,3 @@ "use strict";

const elliptic = require("elliptic");
const secp256k1signature_1 = require("./secp256k1signature");
const secp256k1 = new elliptic.ec("secp256k1");

@@ -60,4 +61,4 @@ const secp256k1N = new BN("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", "hex");

// the `canonical` option ensures creation of lowS signature representations
const signature = new Uint8Array(keypair.sign(messageHash, { canonical: true }).toDER());
return signature;
const signature = keypair.sign(messageHash, { canonical: true });
return new secp256k1signature_1.ExtendedSecp256k1Signature(signature.r.toArrayLike(Uint8Array), signature.s.toArrayLike(Uint8Array), signature.recoveryParam);
});

@@ -88,3 +89,3 @@ }

try {
return keypair.verify(messageHash, signature);
return keypair.verify(messageHash, signature.toDer());
}

@@ -91,0 +92,0 @@ catch (error) {

@@ -15,5 +15,5 @@ "use strict";

const secp256k1_1 = require("./secp256k1");
const secp256k1signature_1 = require("./secp256k1signature");
const sha_1 = require("./sha");
const toHex = encoding_1.Encoding.toHex;
const fromHex = encoding_1.Encoding.fromHex;
const { fromHex } = encoding_1.Encoding;
describe("Secp256k1", () => {

@@ -73,3 +73,3 @@ // How to generate Secp256k1 test vectors:

const messageHash = new Uint8Array([0x11, 0x22]);
const signature = yield secp256k1_1.Secp256k1.createSignature(messageHash, keypair.privkey);
const signature = (yield secp256k1_1.Secp256k1.createSignature(messageHash, keypair.privkey)).toDer();
expect(signature).toBeTruthy();

@@ -121,3 +121,3 @@ expect(signature.byteLength).toBeGreaterThanOrEqual(70);

// signature corrupted
const corruptedSignature = signature.map((x, i) => (i === 0 ? x ^ 0x01 : x));
const corruptedSignature = secp256k1signature_1.Secp256k1Signature.fromDer(signature.toDer().map((x, i) => (i === 5 ? x ^ 0x01 : x)));
const ok = yield secp256k1_1.Secp256k1.verifySignature(corruptedSignature, messageHash, keypair.pubkey);

@@ -135,3 +135,3 @@ expect(ok).toEqual(false);

it("throws for empty message hash in verification", () => __awaiter(this, void 0, void 0, function* () {
const dummySignature = fromHex("304602210083de9be443bcf480892b8c8ca1d5ee65c79a315642c3f7b5305aff3065fda2780221009747932122b93cec42cad8ee4630a8f6cbe127578b8c495b4ab927275f657658");
const dummySignature = secp256k1signature_1.Secp256k1Signature.fromDer(fromHex("304602210083de9be443bcf480892b8c8ca1d5ee65c79a315642c3f7b5305aff3065fda2780221009747932122b93cec42cad8ee4630a8f6cbe127578b8c495b4ab927275f657658"));
const keypair = yield secp256k1_1.Secp256k1.makeKeypair(fromHex("43a9c17ccbb0e767ea29ce1f10813afde5f1e0a7a504e89b4d2cc2b952b8e0b9"));

@@ -144,3 +144,3 @@ const messageHash = new Uint8Array([]);

it("throws for message hash longer than 32 bytes in verification", () => __awaiter(this, void 0, void 0, function* () {
const dummySignature = fromHex("304602210083de9be443bcf480892b8c8ca1d5ee65c79a315642c3f7b5305aff3065fda2780221009747932122b93cec42cad8ee4630a8f6cbe127578b8c495b4ab927275f657658");
const dummySignature = secp256k1signature_1.Secp256k1Signature.fromDer(fromHex("304602210083de9be443bcf480892b8c8ca1d5ee65c79a315642c3f7b5305aff3065fda2780221009747932122b93cec42cad8ee4630a8f6cbe127578b8c495b4ab927275f657658"));
const keypair = yield secp256k1_1.Secp256k1.makeKeypair(fromHex("43a9c17ccbb0e767ea29ce1f10813afde5f1e0a7a504e89b4d2cc2b952b8e0b9"));

@@ -259,3 +259,3 @@ const messageHash = fromHex("11223344556677889900aabbccddeeff11223344556677889900aabbccddeeff11");

const messageHash = new sha_1.Sha256(row.message).digest();
const isValid = yield secp256k1_1.Secp256k1.verifySignature(row.signature, messageHash, pubkey);
const isValid = yield secp256k1_1.Secp256k1.verifySignature(secp256k1signature_1.Secp256k1Signature.fromDer(row.signature), messageHash, pubkey);
since(`(index ${index}) #{message}`)

@@ -325,5 +325,2 @@ .expect(isValid)

const calculatedSignature = yield secp256k1_1.Secp256k1.createSignature(messageHash, row.privkey);
since(`(index ${index}) #{message}`)
.expect(toHex(calculatedSignature))
.toEqual(toHex(row.signature));
// verify calculated signature

@@ -335,3 +332,3 @@ const ok1 = yield secp256k1_1.Secp256k1.verifySignature(calculatedSignature, messageHash, keypair.pubkey);

// verify original signature
const ok2 = yield secp256k1_1.Secp256k1.verifySignature(row.signature, messageHash, keypair.pubkey);
const ok2 = yield secp256k1_1.Secp256k1.verifySignature(secp256k1signature_1.Secp256k1Signature.fromDer(row.signature), messageHash, keypair.pubkey);
since(`(index ${index}) #{message}`)

@@ -342,3 +339,3 @@ .expect(ok2)

since(`(index ${index}) #{message}`)
.expect(calculatedSignature)
.expect(calculatedSignature.toDer())
.toEqual(row.signature);

@@ -345,0 +342,0 @@ }

{
"name": "@iov/crypto",
"version": "0.9.1",
"version": "0.10.0",
"description": "Cryptography resources for IOV projects",

@@ -26,3 +26,3 @@ "author": "IOV SAS <admin@iov.one>",

"test": "yarn build-or-skip && yarn test-node",
"prebuild": "yarn format && yarn lint",
"prebuild": "yarn format",
"move-types": "shx rm -r ./types/* && shx mv build/types/* ./types && shx rm ./types/*.spec.d.ts",

@@ -34,3 +34,3 @@ "build": "shx rm -rf ./build && tsc && yarn move-types",

"dependencies": {
"@iov/encoding": "^0.9.0",
"@iov/encoding": "^0.10.0",
"bip39": "^2.5.0",

@@ -50,3 +50,3 @@ "bn.js": "^4.11.8",

},
"gitHead": "c4ce391c22cbcc5cb63096830d299e78444f421c"
"gitHead": "c6258401ce9238f81c4db78927c702e6db165f63"
}

@@ -7,7 +7,2 @@ import { Encoding } from "@iov/encoding";

// Set here for Browsers until this can be configured in Karma
// https://github.com/karma-runner/karma-jasmine/pull/211
// tslint:disable-next-line:no-object-mutation
jasmine.DEFAULT_TIMEOUT_INTERVAL = 30 * 1000;
describe("Bip39", () => {

@@ -14,0 +9,0 @@ it("can encode to mnemonic", () => {

@@ -7,3 +7,4 @@ export * from "./bip39";

export * from "./secp256k1";
export { ExtendedSecp256k1Signature, Secp256k1Signature } from "./secp256k1signature";
export * from "./sha";
export * from "./slip10";

@@ -7,6 +7,6 @@ /* tslint:disable:no-bitwise */

import { Secp256k1 } from "./secp256k1";
import { Secp256k1Signature } from "./secp256k1signature";
import { Sha256 } from "./sha";
const toHex = Encoding.toHex;
const fromHex = Encoding.fromHex;
const { fromHex } = Encoding;

@@ -73,3 +73,3 @@ describe("Secp256k1", () => {

const messageHash = new Uint8Array([0x11, 0x22]);
const signature = await Secp256k1.createSignature(messageHash, keypair.privkey);
const signature = (await Secp256k1.createSignature(messageHash, keypair.privkey)).toDer();
expect(signature).toBeTruthy();

@@ -129,3 +129,3 @@ expect(signature.byteLength).toBeGreaterThanOrEqual(70);

// signature corrupted
const corruptedSignature = signature.map((x, i) => (i === 0 ? x ^ 0x01 : x));
const corruptedSignature = Secp256k1Signature.fromDer(signature.toDer().map((x, i) => (i === 5 ? x ^ 0x01 : x)));
const ok = await Secp256k1.verifySignature(corruptedSignature, messageHash, keypair.pubkey);

@@ -145,3 +145,3 @@ expect(ok).toEqual(false);

it("throws for empty message hash in verification", async () => {
const dummySignature = fromHex("304602210083de9be443bcf480892b8c8ca1d5ee65c79a315642c3f7b5305aff3065fda2780221009747932122b93cec42cad8ee4630a8f6cbe127578b8c495b4ab927275f657658");
const dummySignature = Secp256k1Signature.fromDer(fromHex("304602210083de9be443bcf480892b8c8ca1d5ee65c79a315642c3f7b5305aff3065fda2780221009747932122b93cec42cad8ee4630a8f6cbe127578b8c495b4ab927275f657658"));
const keypair = await Secp256k1.makeKeypair(fromHex("43a9c17ccbb0e767ea29ce1f10813afde5f1e0a7a504e89b4d2cc2b952b8e0b9"));

@@ -155,3 +155,3 @@ const messageHash = new Uint8Array([]);

it("throws for message hash longer than 32 bytes in verification", async () => {
const dummySignature = fromHex("304602210083de9be443bcf480892b8c8ca1d5ee65c79a315642c3f7b5305aff3065fda2780221009747932122b93cec42cad8ee4630a8f6cbe127578b8c495b4ab927275f657658");
const dummySignature = Secp256k1Signature.fromDer(fromHex("304602210083de9be443bcf480892b8c8ca1d5ee65c79a315642c3f7b5305aff3065fda2780221009747932122b93cec42cad8ee4630a8f6cbe127578b8c495b4ab927275f657658"));
const keypair = await Secp256k1.makeKeypair(fromHex("43a9c17ccbb0e767ea29ce1f10813afde5f1e0a7a504e89b4d2cc2b952b8e0b9"));

@@ -166,3 +166,3 @@ const messageHash = fromHex("11223344556677889900aabbccddeeff11223344556677889900aabbccddeeff11");

// signatures are mixed lowS and non-lowS, prehash type is sha256
const data: ReadonlyArray<any> = [
const data: ReadonlyArray<{ readonly message: Uint8Array; readonly privkey: Uint8Array; readonly signature: Uint8Array }> = [
{

@@ -273,3 +273,3 @@ message: fromHex("5c868fedb8026979ebd26f1ba07c27eedf4ff6d10443505a96ecaf21ba8c4f0937b3cd23ffdc3dd429d4cd1905fb8dbcceeff1350020e18b58d2ba70887baa3a9b783ad30d3fbf210331cdd7df8d77defa398cdacdfc2e359c7ba4cae46bb74401deb417f8b912a1aa966aeeba9c39c7dd22479ae2b30719dca2f2206c5eb4b7"),

const messageHash = new Sha256(row.message).digest();
const isValid = await Secp256k1.verifySignature(row.signature, messageHash, pubkey);
const isValid = await Secp256k1.verifySignature(Secp256k1Signature.fromDer(row.signature), messageHash, pubkey);
since(`(index ${index}) #{message}`)

@@ -283,3 +283,3 @@ .expect(isValid)

// signatures are normalized to lowS, prehash type is sha256
const data: ReadonlyArray<any> = [
const data: ReadonlyArray<{ readonly message: Uint8Array; readonly privkey: Uint8Array; readonly signature: Uint8Array }> = [
{

@@ -343,5 +343,2 @@ message: fromHex("5c868fedb8026979ebd26f1ba07c27eedf4ff6d10443505a96ecaf21ba8c4f0937b3cd23ffdc3dd429d4cd1905fb8dbcceeff1350020e18b58d2ba70887baa3a9b783ad30d3fbf210331cdd7df8d77defa398cdacdfc2e359c7ba4cae46bb74401deb417f8b912a1aa966aeeba9c39c7dd22479ae2b30719dca2f2206c5eb4b7"),

const calculatedSignature = await Secp256k1.createSignature(messageHash, row.privkey);
since(`(index ${index}) #{message}`)
.expect(toHex(calculatedSignature))
.toEqual(toHex(row.signature));

@@ -355,3 +352,3 @@ // verify calculated signature

// verify original signature
const ok2 = await Secp256k1.verifySignature(row.signature, messageHash, keypair.pubkey);
const ok2 = await Secp256k1.verifySignature(Secp256k1Signature.fromDer(row.signature), messageHash, keypair.pubkey);
since(`(index ${index}) #{message}`)

@@ -363,3 +360,3 @@ .expect(ok2)

since(`(index ${index}) #{message}`)
.expect(calculatedSignature)
.expect(calculatedSignature.toDer())
.toEqual(row.signature);

@@ -366,0 +363,0 @@ }

@@ -6,2 +6,4 @@ import { Encoding } from "@iov/encoding";

import { ExtendedSecp256k1Signature, Secp256k1Signature } from "./secp256k1signature";
const secp256k1 = new elliptic.ec("secp256k1");

@@ -51,3 +53,6 @@ const secp256k1N = new BN("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", "hex");

// - DER encoded
public static async createSignature(messageHash: Uint8Array, privkey: Uint8Array): Promise<Uint8Array> {
public static async createSignature(
messageHash: Uint8Array,
privkey: Uint8Array,
): Promise<ExtendedSecp256k1Signature> {
if (messageHash.length === 0) {

@@ -62,8 +67,12 @@ throw new Error("Message hash must not be empty");

// the `canonical` option ensures creation of lowS signature representations
const signature = new Uint8Array(keypair.sign(messageHash, { canonical: true }).toDER());
return signature;
const signature = keypair.sign(messageHash, { canonical: true });
return new ExtendedSecp256k1Signature(
(signature.r as BN).toArrayLike(Uint8Array),
(signature.s as BN).toArrayLike(Uint8Array),
signature.recoveryParam,
);
}
public static async verifySignature(
signature: Uint8Array,
signature: Secp256k1Signature,
messageHash: Uint8Array,

@@ -95,3 +104,3 @@ pubkey: Uint8Array,

try {
return keypair.verify(messageHash, signature);
return keypair.verify(messageHash, signature.toDer());
} catch (error) {

@@ -98,0 +107,0 @@ return false;

@@ -7,3 +7,4 @@ export * from "./bip39";

export * from "./secp256k1";
export { ExtendedSecp256k1Signature, Secp256k1Signature } from "./secp256k1signature";
export * from "./sha";
export * from "./slip10";

@@ -0,1 +1,2 @@

import { ExtendedSecp256k1Signature, Secp256k1Signature } from "./secp256k1signature";
export declare const Secp256k1KeypairSymbol: unique symbol;

@@ -8,4 +9,4 @@ export declare type Secp256k1Keypair = typeof Secp256k1KeypairSymbol & {

static makeKeypair(privkey: Uint8Array): Promise<Secp256k1Keypair>;
static createSignature(messageHash: Uint8Array, privkey: Uint8Array): Promise<Uint8Array>;
static verifySignature(signature: Uint8Array, messageHash: Uint8Array, pubkey: Uint8Array): Promise<boolean>;
static createSignature(messageHash: Uint8Array, privkey: Uint8Array): Promise<ExtendedSecp256k1Signature>;
static verifySignature(signature: Secp256k1Signature, messageHash: Uint8Array, pubkey: Uint8Array): Promise<boolean>;
}

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc