Skip to content

Commit bbe4a49

Browse files
committed
feat(gost3410): add preinitializated curve objects
1 parent fd7b0fb commit bbe4a49

9 files changed

Lines changed: 82 additions & 87 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@li0ard/gost",
3-
"version": "0.2.0",
3+
"version": "0.2.1",
44
"main": "index.js",
55
"types": "index.d.ts",
66
"type": "module",

src/gost3410/const.ts

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,3 @@
1-
/**
2-
* Supported GOST R 34.10-2001/2012 curves:
3-
* | Name | Aliases | OIDs |
4-
* |:------------------------------------:|:---------------------------:|:-------------------------------------------------------------:|
5-
* | ID_GOSTR3410_2001_PARAM_SET_CC | CryptoCom param set | 1.2.643.2.9.1.8.1 |
6-
* | ID_GOSTR3410_2001_TEST_PARAM_SET | - | 1.2.643.2.2.35.0 |
7-
* | ID_GOSTR3410_2012_256_PARAM_SET_A | - | 1.2.643.7.1.2.1.1.1 |
8-
* | ID_GOSTR3410_2012_256_PARAM_SET_B | CryptoPro A (X-A) param set | 1.2.643.7.1.2.1.1.2,<br>1.2.643.2.2.35.1,<br>1.2.643.2.2.36.0 |
9-
* | ID_GOSTR3410_2012_256_PARAM_SET_C | CryptoPro B param set | 1.2.643.7.1.2.1.1.3,<br>1.2.643.2.2.35.2 |
10-
* | ID_GOSTR3410_2012_256_PARAM_SET_D | CryptoPro C (X-B) param set | 1.2.643.7.1.2.1.1.4,<br>1.2.643.2.2.35.3,<br>1.2.643.2.2.36.1 |
11-
* | ID_GOSTR3410_2012_512_TEST_PARAM_SET | - | 1.2.643.7.1.2.1.2.0 |
12-
* | ID_GOSTR3410_2012_512_PARAM_SET_A | - | 1.2.643.7.1.2.1.2.1 |
13-
* | ID_GOSTR3410_2012_512_PARAM_SET_B | - | 1.2.643.7.1.2.1.2.2 |
14-
* | ID_GOSTR3410_2012_512_PARAM_SET_C | - | 1.2.643.7.1.2.1.2.3 |
15-
*
16-
* @module
17-
*/
18-
191
/** Parameters for GOST curves */
202
export interface GostCurveParameters {
213
/** Prime field (`Fp`) */
@@ -178,17 +160,4 @@ export const ID_GOSTR3410_2012_512_PARAM_SET_C: Readonly<GostCurveParameters> =
178160
length: 64,
179161
st: [0x186c289cffa09c983b168c30c829006c952ff4aaf99c73850875d7e77bebef18d653187d6ba8fe533ec74c6f061872585b97cc0f50f57752cd73f4913304621en, 0x9a628f975594ecefd89ba28a2539ffb79c8ab238aeed0851fa5c1abb02b80b44c6734501b83a011dd625cd0b5145091a6d9acd4b1f5c5b1e21b2b249ddfd1271n],
180162
oids: ["1.2.643.7.1.2.1.2.3"]
181-
}
182-
183-
export const CURVES = {
184-
ID_GOSTR3410_2001_PARAM_SET_CC,
185-
ID_GOSTR3410_2001_TEST_PARAM_SET,
186-
ID_GOSTR3410_2012_256_PARAM_SET_A,
187-
ID_GOSTR3410_2012_256_PARAM_SET_B,
188-
ID_GOSTR3410_2012_256_PARAM_SET_C,
189-
ID_GOSTR3410_2012_256_PARAM_SET_D,
190-
ID_GOSTR3410_2012_512_TEST_PARAM_SET,
191-
ID_GOSTR3410_2012_512_PARAM_SET_A,
192-
ID_GOSTR3410_2012_512_PARAM_SET_B,
193-
ID_GOSTR3410_2012_512_PARAM_SET_C
194163
}

src/gost3410/conversion.spec.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { describe, test, expect } from "bun:test";
2-
import { gost3410, ID_GOSTR3410_2012_256_PARAM_SET_A, ID_GOSTR3410_2012_512_PARAM_SET_C } from ".";
2+
import { gost256A, gost512C } from ".";
33

44
describe("[SIGN] Point conversion (256 bit)", () => {
5-
const c = gost3410(ID_GOSTR3410_2012_256_PARAM_SET_A);
5+
const c = gost256A;
66
const point = {
77
x: 0x0dn,
88
y: 0x60CA1E32AA475B348488C38FAB07649CE7EF8DBE87F22E81F92B2592DBA300E7n
99
}
1010
const point2 = {
11-
x: ID_GOSTR3410_2012_256_PARAM_SET_A.Gx,
12-
y: ID_GOSTR3410_2012_256_PARAM_SET_A.Gy
11+
x: 0x91E38443A5E82C0D880923425712B2BB658B9196932E02C78B2582FE742DAA28n,
12+
y: 0x32879423AB1A0375895786C4BB46E9565FDE0B5344766740AF268ADB32322E5Cn
1313
}
1414
test("(u,v) -> (x,y)", () => {
1515
const result = c.utils.uv2xy(point);
@@ -25,14 +25,14 @@ describe("[SIGN] Point conversion (256 bit)", () => {
2525
});
2626

2727
describe("[SIGN] Point conversion (512 bit)", () => {
28-
const c = gost3410(ID_GOSTR3410_2012_512_PARAM_SET_C);
28+
const c = gost512C;
2929
const point = {
3030
x: 0x12n,
3131
y: 0x469AF79D1FB1F5E16B99592B77A01E2A0FDFB0D01794368D9A56117F7B38669522DD4B650CF789EEBF068C5D139732F0905622C04B2BAAE7600303EE73001A3Dn
3232
}
3333
const point2 = {
34-
x: ID_GOSTR3410_2012_512_PARAM_SET_C.Gx,
35-
y: ID_GOSTR3410_2012_512_PARAM_SET_C.Gy
34+
x: 0xE2E31EDFC23DE7BDEBE241CE593EF5DE2295B7A9CBAEF021D385F7074CEA043AA27272A7AE602BF2A7B9033DB9ED3610C6FB85487EAE97AAC5BC7928C1950148n,
35+
y: 0xF5CE40D95B5EB899ABBCCFF5911CB8577939804D6527378B8C108C3D2090FF9BE18E2D33E3021ED2EF32D85822423B6304F726AA854BAE07D0396E9A9ADDC40Fn
3636
}
3737
test("(u,v) -> (x,y)", () => {
3838
const result = c.utils.uv2xy(point);

src/gost3410/index.spec.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import { hexToBytes, type TArg, type TRet } from "@noble/curves/utils.js";
22
import { describe, test, expect } from "bun:test";
3-
import { gost3410, ID_GOSTR3410_2001_PARAM_SET_CC, ID_GOSTR3410_2001_TEST_PARAM_SET, ID_GOSTR3410_2012_256_PARAM_SET_A, ID_GOSTR3410_2012_256_PARAM_SET_B, ID_GOSTR3410_2012_256_PARAM_SET_C, ID_GOSTR3410_2012_256_PARAM_SET_D, ID_GOSTR3410_2012_512_PARAM_SET_A, ID_GOSTR3410_2012_512_PARAM_SET_B, ID_GOSTR3410_2012_512_PARAM_SET_C, ID_GOSTR3410_2012_512_TEST_PARAM_SET, type GostCurveParameters } from ".";
3+
import { gost2001CC, gost2001Test, gost256A, gost256B, gost256C, gost256D, gost512A, gost512B, gost512C, gost512Test } from ".";
4+
import type { Signer } from "../types";
45

56
const performTest = (
6-
curve: GostCurveParameters,
7+
signer: Signer,
78
privKey: TArg<Uint8Array>,
89
digest: TArg<Uint8Array>,
910
rand: TArg<Uint8Array>,
1011
expectedPk: TArg<Uint8Array>,
1112
expectedSign: TArg<Uint8Array>
1213
) => {
13-
const signer = gost3410(curve);
1414
const publicKey = signer.getPublicKey(privKey, false);
1515
const signature = signer.sign(privKey, digest, rand);
1616
expect(publicKey).toStrictEqual(expectedPk as TRet<Uint8Array>);
@@ -32,14 +32,14 @@ describe("[SIGN] GOST R 34.10-2001", () => {
3232
const expectedPk = hexToBytes("041e0ccfac352bf57fd18808092406e72487ae138776170379a7bebb61e5b14535094129e0f59e2fc37345a0869a0694a5cacc4fcb272b1763e4344a090d93f874");
3333
const expectedSign = hexToBytes("1ba4446a12e1a878d675352dcfd4580c9ae7919dc6428b39966b7354a9d576962722e6f531f3bf76bb27c90f3ab0fb6b11d0a2810ac2f18e22ebbb9f6d5fbfcb");
3434

35-
performTest(ID_GOSTR3410_2001_PARAM_SET_CC, privKey, digest, rand, expectedPk, expectedSign);
35+
performTest(gost2001CC, privKey, digest, rand, expectedPk, expectedSign);
3636
});
3737

3838
test("ID_GOSTR3410_2001_TEST_PARAM_SET", () => {
3939
const privKey = hexToBytes("7a929ade789bb9be10ed359dd39a72c11b60961f49397eee1d19ce9891ec3b28");
4040
const expectedPk = hexToBytes("047f2b49e270db6d90d8595bec458b50c58585ba1d4e9b788f6689dbd8e56fd80b26f1b489d6701dd185c8413a977b3cbbaf64d1c593d26627dffb101a87ff77da");
4141
const expectedSign = hexToBytes("41aa28d2f1ab148280cd9ed56feda41974053554a42767b83ad043fd39dc049301456c64ba4642a1653c235a98a60249bcd6d3f746b631df928014f6c5bf9c40");
42-
performTest(ID_GOSTR3410_2001_TEST_PARAM_SET, privKey, digest, rand, expectedPk, expectedSign);
42+
performTest(gost2001Test, privKey, digest, rand, expectedPk, expectedSign);
4343
});
4444
});
4545

@@ -51,28 +51,28 @@ describe("[SIGN] GOST R 34.10-2012 256 bit", () => {
5151
const privKey = hexToBytes("0ca68a44333dbee1daea1e80dbdd560a43215886a392472b898ed3721e1177e0");
5252
const expectedPk = hexToBytes("04783f55db27faa3703997d29623c88394068c88065e4df424a53f586fa6c8aa7712a7f3b653a2ba53a8cbc7c039223138677c8ef78ec57163a38c617c4f4eb383");
5353
const expectedSign = hexToBytes("01b69df1e54b083516a398ee54f6975b213c384b39020bfa983766b7a458a23e1f4be89d22c83e676cbac9154efcbad3274eb5ed6655fa9d040d18d15f21dc60");
54-
performTest(ID_GOSTR3410_2012_256_PARAM_SET_A, privKey, digest, rand, expectedPk, expectedSign);
54+
performTest(gost256A, privKey, digest, rand, expectedPk, expectedSign);
5555
});
5656

5757
test("ID_GOSTR3410_2012_256_PARAM_SET_B", () => {
5858
const privKey = hexToBytes("02433a376ac33a077173cc52df6947b0cc7f9442c274308992ea884ba583ff81");
5959
const expectedPk = hexToBytes("045cae92068a723bbca9a0b37d234689ae4687e5e24857828c77aa887a47e5d88f8aab3103ba0ca8edb5e9ec5b66cc921cad91a4899041359c4ee2cd8a34414fde");
6060
const expectedSign = hexToBytes("74e939c637a79a5b7e39dc15976befb324acdb74e2fa8d434aba0da9ebf8de8fd021c91aa35ad922e4d42c764e5b27f4dcfc2ad9e08718232cb32d55971aba76");
61-
performTest(ID_GOSTR3410_2012_256_PARAM_SET_B, privKey, digest, rand, expectedPk, expectedSign);
61+
performTest(gost256B, privKey, digest, rand, expectedPk, expectedSign);
6262
});
6363

6464
test("ID_GOSTR3410_2012_256_PARAM_SET_C", () => {
6565
const privKey = hexToBytes("487bb4201b74cdd8e4f7f0e35cbb4c944409b394e2f5c8556c6af770af38640b");
6666
const expectedPk = hexToBytes("045931d38dcb2d8d4b7947e423ab4d03713706c33fb7d499d15d7ea07e0efb5db6020d69bbf58bb30444b4607735912b64dd15789f6680b8f6bb5dc35277a8e6bd");
6767
const expectedSign = hexToBytes("17ed3090d60d6335be4f660c2456481ad92da7a0abe110b31e9f29eb68b260c529d68ee453fb1799b9bcaf0d5c24c27c6bf8bfe9b243de54a9a33a2429ed4df5");
68-
performTest(ID_GOSTR3410_2012_256_PARAM_SET_C, privKey, digest, rand, expectedPk, expectedSign);
68+
performTest(gost256C, privKey, digest, rand, expectedPk, expectedSign);
6969
});
7070

7171
test("ID_GOSTR3410_2012_256_PARAM_SET_D", () => {
7272
const privKey = hexToBytes("84c2091682a36ff192359e41e72848cdeca428f1f458561e4c6b1015b8c6e5af");
7373
const expectedPk = hexToBytes("0459ab55cb96e15ed37bc5a997c1347d11ef401d769e0dc1d0a4c0745f3262aa51654d32cc2c3c6871c632f7f741ac62bd51c542c2467af81f66e5a1b21aa560a1");
7474
const expectedSign = hexToBytes("6ffa317b4f37c95226f509e1f53bfa3ff18559e8d5c4a81e681316da5cbe271e2a859a2c463f3116a9b861d09767225fc0353ecb4124c83d12c987593e444930");
75-
performTest(ID_GOSTR3410_2012_256_PARAM_SET_D, privKey, digest, rand, expectedPk, expectedSign);
75+
performTest(gost256D, privKey, digest, rand, expectedPk, expectedSign);
7676
});
7777
});
7878

@@ -84,27 +84,27 @@ describe("[SIGN] GOST R 34.10-2012 512 bit", () => {
8484
const privKey = hexToBytes("0BA6048AADAE241BA40936D47756D7C93091A0E8514669700EE7508E508B102072E8123B2200A0563322DAD2827E2714A2636B7BFD18AADFC62967821FA18DD4")
8585
const expectedPk = hexToBytes("04115dc5bc96760c7b48598d8ab9e740d4c4a85a65be33c1815b5c320c854621dd5a515856d13314af69bc5b924c8b4ddff75c45415c1d9dd9dd33612cd530efe137c7c90cd40b0f5621dc3ac1b751cfa0e2634fa0503b3d52639f5d7fb72afd61ea199441d943ffe7f0c70a2759a3cdb84c114e1f9339fdf27f35eca93677beec");
8686
const expectedSign = hexToBytes("2f86fa60a081091a23dd795e1e3c689ee512a3c82ee0dcc2643c78eea8fcacd35492558486b20f1c9ec197c90699850260c93bcbcd9c5c3317e19344e173ae361081b394696ffe8e6585e7a9362d26b6325f56778aadbc081c0bfbe933d52ff5823ce288e8c4f362526080df7f70ce406a6eeb1f56919cb92a9853bde73e5b4a");
87-
performTest(ID_GOSTR3410_2012_512_TEST_PARAM_SET, privKey, digest, rand, expectedPk, expectedSign);
87+
performTest(gost512Test, privKey, digest, rand, expectedPk, expectedSign);
8888
});
8989

9090
test("ID_GOSTR3410_2012_512_PARAM_SET_A", () => {
9191
const privKey = hexToBytes("480f669784fd01b5cb7b5f919159af5b9a78c332ec07ca2602de83529e061b4988ac5b38345206df49894c6a4428825acf2f6ff1ecb5e578584e654f9dfd7192");
9292
const expectedPk = hexToBytes("04e25d47f1cc5391e872213ef0a55c90ef21cef5c28f1c075f7a15e741791e12903e62ea39e0075b83b4346678c63d5451be6f53a1e7507f7d1cc6a3ea6a0d69ad14f216dbc88698a8f0267d6fc8f46b59ead371a7c5a87774b0c0f071f456e48ff32ec0f8cdc93432e528e50925bd571546e431aa3cfef1f2efa57ca5f9bb0865");
9393
const expectedSign = hexToBytes("561b01afb058d86534a5bbbe50ec01b620bc4379318d7bf6f6c9248696920c68a2fab805f89d252138577516a866df301abf7be0329a6eb64765f564db8dc11c062952d8f0ff0597be2185f67d423af24aca3361b6bfc149fe1f81f698c49e52632b44349164a0ea52420646bacf5b91acead74a6a30dc6588f4a137e9e53f7a");
94-
performTest(ID_GOSTR3410_2012_512_PARAM_SET_A, privKey, digest, rand, expectedPk, expectedSign);
94+
performTest(gost512A, privKey, digest, rand, expectedPk, expectedSign);
9595
});
9696

9797
test("ID_GOSTR3410_2012_512_PARAM_SET_B", () => {
9898
const privKey = hexToBytes("4a2a20eb3ad1371ce57a59d610f5ebfac41a59556116528d6fe2347a64c2129fa2f3f75ce30ea7853bb332720e55faab782f3274339e950286eef435c044ad47");
9999
const expectedPk = hexToBytes("0448aa39dd73b402a50886e53445135cff6bde60368c6c04e8965324ec9bfbcaf1414f0b532584f415c67cef8b368652d0ba71678a317fc8710fad8cf916e5724f4795de5d0031c6ac4de6ab0421868fdf8e8fd141347144c8130ce614ce724448cecb11bcdf7e40b048f07b8dfaa2b6a68cf6178908340def6dc77d62ec191a74");
100100
const expectedSign = hexToBytes("6c4bb1b593c2726e929b18ca3cc83c2487366a3976a74a4b6903de7fdbf234097e6edc873e9b8652b7b7864654e25af53646542b3030c21dac985a66831decb926c5f76e316b3977bf31c3fc3685d0131062483641927a64be3f2cf117e44cfb6353efbf62b1c373d272018016edb03ecc5deda627f79a24760463c0aedcaed8");
101-
performTest(ID_GOSTR3410_2012_512_PARAM_SET_B, privKey, digest, rand, expectedPk, expectedSign);
101+
performTest(gost512B, privKey, digest, rand, expectedPk, expectedSign);
102102
});
103103

104104
test("ID_GOSTR3410_2012_512_PARAM_SET_C", () => {
105105
const privKey = hexToBytes("3837dc2b6431eb10076f37b2e480abbe81239b820b6ab0634e2c87e3b59e50fbf86575221e2947d006049831ac8f162cbef01ba56df5ba12df1f40a19b956f39");
106106
const expectedPk = hexToBytes("04a0137475566bf98ca554aebff738eb618a5da2da176743e19a1500fec8baaa35ead67cc5f996d3964d8e9313043451e03847292ebff061dcaa86efa0be7290f151a0bac67eabf750a8078de9ca7641f993363b63e013ef632760bcd467115c6e689dc5d13ecb8e353878da7adf4cad0718578b19f0fdf1fae823a7d376189f4c");
107107
const expectedSign = hexToBytes("0e4d15b0222c49cde4c7e63375f42fd0e9895644357ee2fd43f4743b9a22a76f95e3c9e296674942a56573648085b65117471fdc23c61fe730bafeb1130326210a9deda97067eaf32bc3986368a1a2c5016b0a75c55f2fe64798810e2490232ae40d2643fd6634defb39f353b8572865376196e4ea0ff38065b588577ccb4a4d");
108-
performTest(ID_GOSTR3410_2012_512_PARAM_SET_C, privKey, digest, rand, expectedPk, expectedSign);
108+
performTest(gost512C, privKey, digest, rand, expectedPk, expectedSign);
109109
});
110110
});

src/gost3410/index.ts

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
* @module
1818
*/
1919
import { bytesToNumberBE, concatBytes, numberToBytesBE, type TArg, type TRet, numberToBytesLE, type CHash, randomBytes, abytes } from "@noble/curves/utils.js";
20-
import type { GostCurveParameters } from "./const.js";
20+
import { type GostCurveParameters, ID_GOSTR3410_2001_PARAM_SET_CC, ID_GOSTR3410_2001_TEST_PARAM_SET, ID_GOSTR3410_2012_256_PARAM_SET_A, ID_GOSTR3410_2012_256_PARAM_SET_B, ID_GOSTR3410_2012_256_PARAM_SET_C, ID_GOSTR3410_2012_256_PARAM_SET_D, ID_GOSTR3410_2012_512_PARAM_SET_A, ID_GOSTR3410_2012_512_PARAM_SET_B, ID_GOSTR3410_2012_512_PARAM_SET_C, ID_GOSTR3410_2012_512_TEST_PARAM_SET } from "./const.js";
2121
import { getMinHashLength, mapHashToField, mod, type IField } from "@noble/curves/abstract/modular.js";
22-
import { weierstrass } from "@noble/curves/abstract/weierstrass.js";
22+
import { weierstrass, type WeierstrassPoint } from "@noble/curves/abstract/weierstrass.js";
2323
import { streebog256hmac, streebog512hmac } from "../hmac.js";
2424
import { createKeygen, type AffinePoint } from "@noble/curves/abstract/curve.js";
2525
import type { Signer } from "../types.js";
@@ -117,7 +117,7 @@ export const gost3410 = (parameters: GostCurveParameters): Signer => {
117117

118118
const v = Fn.inv(e);
119119
const z1 = Fn.mul(s, v), z2 = Fn.mul(Fn.neg(r), v);
120-
let P, Q;
120+
let P: WeierstrassPoint<bigint>, Q: WeierstrassPoint<bigint>;
121121
try {
122122
P = BASE.multiply(z1);
123123
Q = Point.fromBytes(publicKey).multiply(z2);
@@ -188,7 +188,7 @@ export const gost3410 = (parameters: GostCurveParameters): Signer => {
188188
}
189189
}
190190

191-
const utils = Object.freeze({ uv2xy, xy2uv, swapPoint });
191+
const utils = Object.freeze({ uv2xy, xy2uv, swapPoint, parameters });
192192

193193
return Object.freeze({
194194
getPublicKey,
@@ -202,4 +202,31 @@ export const gost3410 = (parameters: GostCurveParameters): Signer => {
202202
});
203203
}
204204

205-
export * from "./const.js";
205+
export type { GostCurveParameters } from "./const.js";
206+
/** GOST R 34.10-2001 CryptoCom curve */
207+
export const gost2001CC = gost3410(ID_GOSTR3410_2001_PARAM_SET_CC);
208+
/** GOST R 34.10-2001 test curve */
209+
export const gost2001Test = gost3410(ID_GOSTR3410_2001_TEST_PARAM_SET);
210+
/** GOST R 34.10-2012 256 bit `A` curve */
211+
export const gost256A = gost3410(ID_GOSTR3410_2012_256_PARAM_SET_A);
212+
/** GOST R 34.10-2012 256 bit `B` curve (aka CryptoPro `A` and `X-A`) */
213+
export const gost256B = gost3410(ID_GOSTR3410_2012_256_PARAM_SET_B);
214+
/** GOST R 34.10-2012 256 bit `C` curve (aka CryptoPro `B`) */
215+
export const gost256C = gost3410(ID_GOSTR3410_2012_256_PARAM_SET_C);
216+
/** GOST R 34.10-2012 256 bit `D` curve (aka CryptoPro `C` and `X-B`) */
217+
export const gost256D = gost3410(ID_GOSTR3410_2012_256_PARAM_SET_D);
218+
/** GOST R 34.10-2012 512 bit test curve */
219+
export const gost512Test = gost3410(ID_GOSTR3410_2012_512_TEST_PARAM_SET);
220+
/** GOST R 34.10-2012 512 bit `A` curve */
221+
export const gost512A = gost3410(ID_GOSTR3410_2012_512_PARAM_SET_A);
222+
/** GOST R 34.10-2012 512 bit `B` curve */
223+
export const gost512B = gost3410(ID_GOSTR3410_2012_512_PARAM_SET_B);
224+
/** GOST R 34.10-2012 512 bit `C` curve */
225+
export const gost512C = gost3410(ID_GOSTR3410_2012_512_PARAM_SET_C);
226+
227+
/** Standard curves */
228+
export const CURVES = {
229+
gost2001CC, gost2001Test,
230+
gost256A, gost256B, gost256C, gost256D,
231+
gost512Test, gost512A, gost512B, gost512C
232+
}

0 commit comments

Comments
 (0)