@iov/crypto
Advanced tools
Comparing version 0.9.1 to 0.10.0
@@ -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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
1092027
76
7573
+ Added@iov/encoding@0.10.4(transitive)
- Removed@iov/encoding@0.9.0(transitive)
Updated@iov/encoding@^0.10.0