@li0ard/gost 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/gost3410/const.d.ts +12 -0
- package/gost3410/const.js +12 -0
- package/gost3410/conversion.d.ts +1 -4
- package/gost3410/conversion.js +1 -4
- package/gost3410/index.d.ts +4 -2
- package/gost3410/index.js +10 -8
- package/gost3410/vko.d.ts +5 -5
- package/gost3410/vko.js +5 -5
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/modes/_keytransform.js +2 -5
- package/oids/index.d.ts +6 -0
- package/oids/index.js +16 -0
- package/package.json +4 -1
- package/types.d.ts +1 -0
package/gost3410/const.d.ts
CHANGED
|
@@ -45,3 +45,15 @@ export declare const ID_GOSTR3410_2012_512_PARAM_SET_A: Readonly<GostCurveParame
|
|
|
45
45
|
export declare const ID_GOSTR3410_2012_512_PARAM_SET_B: Readonly<GostCurveParameters>;
|
|
46
46
|
/** GOST R 34.10-2012 512 bit `C` param set */
|
|
47
47
|
export declare const ID_GOSTR3410_2012_512_PARAM_SET_C: Readonly<GostCurveParameters>;
|
|
48
|
+
export declare const CURVES: {
|
|
49
|
+
ID_GOSTR3410_2001_PARAM_SET_CC: Readonly<GostCurveParameters>;
|
|
50
|
+
ID_GOSTR3410_2001_TEST_PARAM_SET: Readonly<GostCurveParameters>;
|
|
51
|
+
ID_GOSTR3410_2012_256_PARAM_SET_A: Readonly<GostCurveParameters>;
|
|
52
|
+
ID_GOSTR3410_2012_256_PARAM_SET_B: Readonly<GostCurveParameters>;
|
|
53
|
+
ID_GOSTR3410_2012_256_PARAM_SET_C: Readonly<GostCurveParameters>;
|
|
54
|
+
ID_GOSTR3410_2012_256_PARAM_SET_D: Readonly<GostCurveParameters>;
|
|
55
|
+
ID_GOSTR3410_2012_512_TEST_PARAM_SET: Readonly<GostCurveParameters>;
|
|
56
|
+
ID_GOSTR3410_2012_512_PARAM_SET_A: Readonly<GostCurveParameters>;
|
|
57
|
+
ID_GOSTR3410_2012_512_PARAM_SET_B: Readonly<GostCurveParameters>;
|
|
58
|
+
ID_GOSTR3410_2012_512_PARAM_SET_C: Readonly<GostCurveParameters>;
|
|
59
|
+
};
|
package/gost3410/const.js
CHANGED
|
@@ -124,3 +124,15 @@ export const ID_GOSTR3410_2012_512_PARAM_SET_C = ({
|
|
|
124
124
|
st: [0x186c289cffa09c983b168c30c829006c952ff4aaf99c73850875d7e77bebef18d653187d6ba8fe533ec74c6f061872585b97cc0f50f57752cd73f4913304621en, 0x9a628f975594ecefd89ba28a2539ffb79c8ab238aeed0851fa5c1abb02b80b44c6734501b83a011dd625cd0b5145091a6d9acd4b1f5c5b1e21b2b249ddfd1271n],
|
|
125
125
|
oids: ["1.2.643.7.1.2.1.2.3"]
|
|
126
126
|
});
|
|
127
|
+
export const CURVES = {
|
|
128
|
+
ID_GOSTR3410_2001_PARAM_SET_CC,
|
|
129
|
+
ID_GOSTR3410_2001_TEST_PARAM_SET,
|
|
130
|
+
ID_GOSTR3410_2012_256_PARAM_SET_A,
|
|
131
|
+
ID_GOSTR3410_2012_256_PARAM_SET_B,
|
|
132
|
+
ID_GOSTR3410_2012_256_PARAM_SET_C,
|
|
133
|
+
ID_GOSTR3410_2012_256_PARAM_SET_D,
|
|
134
|
+
ID_GOSTR3410_2012_512_TEST_PARAM_SET,
|
|
135
|
+
ID_GOSTR3410_2012_512_PARAM_SET_A,
|
|
136
|
+
ID_GOSTR3410_2012_512_PARAM_SET_B,
|
|
137
|
+
ID_GOSTR3410_2012_512_PARAM_SET_C
|
|
138
|
+
};
|
package/gost3410/conversion.d.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import type { AffinePoint } from "@noble/curves/abstract/curve.js";
|
|
2
2
|
import type { GostCurveParameters } from "./const.js";
|
|
3
|
-
/**
|
|
4
|
-
* Compute parameters (`s`, `t`) for conversion
|
|
5
|
-
* @param curve Curve to use
|
|
6
|
-
*/
|
|
3
|
+
/** Compute parameters (`s`, `t`) for conversion */
|
|
7
4
|
export declare const computeST: (curve: GostCurveParameters) => bigint[];
|
|
8
5
|
/**
|
|
9
6
|
* Convert Twisted Edwards point (`u`, `v`) to Weierstrass (`x`, `y`)
|
package/gost3410/conversion.js
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { Field } from "@noble/curves/abstract/modular.js";
|
|
2
|
-
/**
|
|
3
|
-
* Compute parameters (`s`, `t`) for conversion
|
|
4
|
-
* @param curve Curve to use
|
|
5
|
-
*/
|
|
2
|
+
/** Compute parameters (`s`, `t`) for conversion */
|
|
6
3
|
export const computeST = (curve) => {
|
|
7
4
|
if (!curve.e || !curve.d)
|
|
8
5
|
throw new Error("No Twisted Edwards parameters");
|
package/gost3410/index.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export declare const getPublicKey: (parameters: GostCurveParameters, prv: TArg<U
|
|
|
13
13
|
* @param prv Private key
|
|
14
14
|
* @param digest Digest to sign
|
|
15
15
|
* @param rand Optional. Predefined random data for `r` and `k` generation
|
|
16
|
-
* @returns {TRet<Uint8Array>} Concated `r` and `s`
|
|
16
|
+
* @returns {TRet<Uint8Array>} Concated `r` and `s` (in BE order)
|
|
17
17
|
*/
|
|
18
18
|
export declare const sign: (parameters: GostCurveParameters, prv: TArg<Uint8Array>, digest: TArg<Uint8Array>, rand?: TArg<Uint8Array>) => TRet<Uint8Array>;
|
|
19
19
|
/**
|
|
@@ -21,9 +21,11 @@ export declare const sign: (parameters: GostCurveParameters, prv: TArg<Uint8Arra
|
|
|
21
21
|
* @param parameters Curve parameters
|
|
22
22
|
* @param pub Public key
|
|
23
23
|
* @param digest Digest to verify
|
|
24
|
-
* @param signature Signature (Concated `r` and `s`)
|
|
24
|
+
* @param signature Signature (Concated `r` and `s`) (in BE order)
|
|
25
25
|
*/
|
|
26
26
|
export declare const verify: (parameters: GostCurveParameters, pub: TArg<Uint8Array>, digest: TArg<Uint8Array>, signature: TArg<Uint8Array>) => boolean;
|
|
27
|
+
/** Swap `r` and `s` in signature */
|
|
28
|
+
export declare const swapPoint: (curve: GostCurveParameters, point: TArg<Uint8Array>) => TRet<Uint8Array>;
|
|
27
29
|
export * from "./const.js";
|
|
28
30
|
export * from "./vko.js";
|
|
29
31
|
export * from "./conversion.js";
|
package/gost3410/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { bytesToNumberBE, concatBytes, numberToBytesBE, randomBytes } from "@noble/curves/utils.js";
|
|
2
|
-
import {} from "./const.js";
|
|
2
|
+
import { CURVES } from "./const.js";
|
|
3
3
|
import { mod } from "@noble/curves/abstract/modular.js";
|
|
4
4
|
import { weierstrass } from "@noble/curves/abstract/weierstrass.js";
|
|
5
5
|
/**
|
|
@@ -15,16 +15,16 @@ export const getPublicKey = (parameters, prv) => weierstrass(parameters).BASE.mu
|
|
|
15
15
|
* @param prv Private key
|
|
16
16
|
* @param digest Digest to sign
|
|
17
17
|
* @param rand Optional. Predefined random data for `r` and `k` generation
|
|
18
|
-
* @returns {TRet<Uint8Array>} Concated `r` and `s`
|
|
18
|
+
* @returns {TRet<Uint8Array>} Concated `r` and `s` (in BE order)
|
|
19
19
|
*/
|
|
20
20
|
export const sign = (parameters, prv, digest, rand) => {
|
|
21
21
|
const size = parameters.length;
|
|
22
22
|
const curve = weierstrass(parameters);
|
|
23
23
|
const Fn = curve.Fn;
|
|
24
|
-
let e = Fn.fromBytes(digest);
|
|
24
|
+
let e = mod(bytesToNumberBE(digest), Fn.ORDER); //Fn.fromBytes(digest);
|
|
25
25
|
if (e === 0n)
|
|
26
26
|
e = 1n;
|
|
27
|
-
const prvNum = Fn.fromBytes(prv);
|
|
27
|
+
const prvNum = mod(bytesToNumberBE(prv), Fn.ORDER); //Fn.fromBytes(prv);
|
|
28
28
|
while (true) {
|
|
29
29
|
rand ||= randomBytes(size);
|
|
30
30
|
const k = mod(bytesToNumberBE(rand), parameters.n);
|
|
@@ -52,7 +52,7 @@ export const sign = (parameters, prv, digest, rand) => {
|
|
|
52
52
|
* @param parameters Curve parameters
|
|
53
53
|
* @param pub Public key
|
|
54
54
|
* @param digest Digest to verify
|
|
55
|
-
* @param signature Signature (Concated `r` and `s`)
|
|
55
|
+
* @param signature Signature (Concated `r` and `s`) (in BE order)
|
|
56
56
|
*/
|
|
57
57
|
export const verify = (parameters, pub, digest, signature) => {
|
|
58
58
|
const size = parameters.length;
|
|
@@ -60,11 +60,11 @@ export const verify = (parameters, pub, digest, signature) => {
|
|
|
60
60
|
const Fn = curve.Fn;
|
|
61
61
|
if (signature.length != size * 2)
|
|
62
62
|
throw new Error("Invalid signature");
|
|
63
|
-
const r = bytesToNumberBE(signature.
|
|
64
|
-
const s = bytesToNumberBE(signature.
|
|
63
|
+
const r = bytesToNumberBE(signature.subarray(0, size));
|
|
64
|
+
const s = bytesToNumberBE(signature.subarray(size));
|
|
65
65
|
if (r <= 0 || r >= parameters.n || s <= 0 || s >= parameters.n)
|
|
66
66
|
return false;
|
|
67
|
-
let e = Fn.fromBytes(digest);
|
|
67
|
+
let e = mod(bytesToNumberBE(digest), Fn.ORDER); //Fn.fromBytes(digest);
|
|
68
68
|
if (e === 0n)
|
|
69
69
|
e = 1n;
|
|
70
70
|
const v = Fn.inv(e);
|
|
@@ -79,6 +79,8 @@ export const verify = (parameters, pub, digest, signature) => {
|
|
|
79
79
|
}
|
|
80
80
|
return Fn.create(P.add(Q).x) === r;
|
|
81
81
|
};
|
|
82
|
+
/** Swap `r` and `s` in signature */
|
|
83
|
+
export const swapPoint = (curve, point) => concatBytes(point.subarray(curve.length), point.subarray(0, curve.length));
|
|
82
84
|
export * from "./const.js";
|
|
83
85
|
export * from "./vko.js";
|
|
84
86
|
export * from "./conversion.js";
|
package/gost3410/vko.d.ts
CHANGED
|
@@ -5,8 +5,8 @@ import { type TArg, type TRet } from "@noble/curves/utils.js";
|
|
|
5
5
|
* @param parameters Curve parameters
|
|
6
6
|
* @param prv Private key
|
|
7
7
|
* @param pub Public key
|
|
8
|
-
* @param ukm User keying material (aka salt)
|
|
9
|
-
* @returns {TRet<Uint8Array>} Shared key
|
|
8
|
+
* @param ukm User keying material (aka salt, VKO-factor)
|
|
9
|
+
* @returns {TRet<Uint8Array>} Shared key (Not hashed)
|
|
10
10
|
*/
|
|
11
11
|
export declare const kek: (parameters: GostCurveParameters, prv: TArg<Uint8Array>, pub: TArg<Uint8Array>, ukm: TArg<Uint8Array>) => TRet<Uint8Array>;
|
|
12
12
|
/**
|
|
@@ -14,7 +14,7 @@ export declare const kek: (parameters: GostCurveParameters, prv: TArg<Uint8Array
|
|
|
14
14
|
* @param parameters Curve parameters
|
|
15
15
|
* @param prv Private key
|
|
16
16
|
* @param pub Public key
|
|
17
|
-
* @param ukm User keying material (aka salt)
|
|
17
|
+
* @param ukm User keying material (aka salt, VKO-factor)
|
|
18
18
|
* @returns {TRet<Uint8Array>} Shared key
|
|
19
19
|
*/
|
|
20
20
|
export declare const kek_34102001: (parameters: GostCurveParameters, prv: TArg<Uint8Array>, pub: TArg<Uint8Array>, ukm: TArg<Uint8Array>) => TRet<Uint8Array>;
|
|
@@ -23,7 +23,7 @@ export declare const kek_34102001: (parameters: GostCurveParameters, prv: TArg<U
|
|
|
23
23
|
* @param parameters Curve parameters
|
|
24
24
|
* @param prv Private key
|
|
25
25
|
* @param pub Public key
|
|
26
|
-
* @param ukm User keying material (aka salt)
|
|
26
|
+
* @param ukm User keying material (aka salt, VKO-factor)
|
|
27
27
|
* @returns {TRet<Uint8Array>} Shared key
|
|
28
28
|
*/
|
|
29
29
|
export declare const kek_34102012256: (parameters: GostCurveParameters, prv: TArg<Uint8Array>, pub: TArg<Uint8Array>, ukm: TArg<Uint8Array>) => TRet<Uint8Array>;
|
|
@@ -32,7 +32,7 @@ export declare const kek_34102012256: (parameters: GostCurveParameters, prv: TAr
|
|
|
32
32
|
* @param parameters Curve parameters
|
|
33
33
|
* @param prv Private key
|
|
34
34
|
* @param pub Public key
|
|
35
|
-
* @param ukm User keying material (aka salt)
|
|
35
|
+
* @param ukm User keying material (aka salt, VKO-factor)
|
|
36
36
|
* @returns {TRet<Uint8Array>} Shared key
|
|
37
37
|
*/
|
|
38
38
|
export declare const kek_34102012512: (parameters: GostCurveParameters, prv: TArg<Uint8Array>, pub: TArg<Uint8Array>, ukm: TArg<Uint8Array>) => TRet<Uint8Array>;
|
package/gost3410/vko.js
CHANGED
|
@@ -8,8 +8,8 @@ import { bytesToNumberBE, concatBytes, numberToBytesLE } from "@noble/curves/uti
|
|
|
8
8
|
* @param parameters Curve parameters
|
|
9
9
|
* @param prv Private key
|
|
10
10
|
* @param pub Public key
|
|
11
|
-
* @param ukm User keying material (aka salt)
|
|
12
|
-
* @returns {TRet<Uint8Array>} Shared key
|
|
11
|
+
* @param ukm User keying material (aka salt, VKO-factor)
|
|
12
|
+
* @returns {TRet<Uint8Array>} Shared key (Not hashed)
|
|
13
13
|
*/
|
|
14
14
|
export const kek = (parameters, prv, pub, ukm) => {
|
|
15
15
|
const Fn = Field(parameters.n);
|
|
@@ -23,7 +23,7 @@ export const kek = (parameters, prv, pub, ukm) => {
|
|
|
23
23
|
* @param parameters Curve parameters
|
|
24
24
|
* @param prv Private key
|
|
25
25
|
* @param pub Public key
|
|
26
|
-
* @param ukm User keying material (aka salt)
|
|
26
|
+
* @param ukm User keying material (aka salt, VKO-factor)
|
|
27
27
|
* @returns {TRet<Uint8Array>} Shared key
|
|
28
28
|
*/
|
|
29
29
|
export const kek_34102001 = (parameters, prv, pub, ukm) => gost341194(kek(parameters, prv, pub, ukm));
|
|
@@ -32,7 +32,7 @@ export const kek_34102001 = (parameters, prv, pub, ukm) => gost341194(kek(parame
|
|
|
32
32
|
* @param parameters Curve parameters
|
|
33
33
|
* @param prv Private key
|
|
34
34
|
* @param pub Public key
|
|
35
|
-
* @param ukm User keying material (aka salt)
|
|
35
|
+
* @param ukm User keying material (aka salt, VKO-factor)
|
|
36
36
|
* @returns {TRet<Uint8Array>} Shared key
|
|
37
37
|
*/
|
|
38
38
|
export const kek_34102012256 = (parameters, prv, pub, ukm) => streebog256(kek(parameters, prv, pub, ukm));
|
|
@@ -41,7 +41,7 @@ export const kek_34102012256 = (parameters, prv, pub, ukm) => streebog256(kek(pa
|
|
|
41
41
|
* @param parameters Curve parameters
|
|
42
42
|
* @param prv Private key
|
|
43
43
|
* @param pub Public key
|
|
44
|
-
* @param ukm User keying material (aka salt)
|
|
44
|
+
* @param ukm User keying material (aka salt, VKO-factor)
|
|
45
45
|
* @returns {TRet<Uint8Array>} Shared key
|
|
46
46
|
*/
|
|
47
47
|
export const kek_34102012512 = (parameters, prv, pub, ukm) => streebog512(kek(parameters, prv, pub, ukm));
|
package/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export * from "./gost341194/index.js";
|
|
|
3
3
|
export * from "./kuznyechik/index.js";
|
|
4
4
|
export * from "./magma/index.js";
|
|
5
5
|
export * from "./modes/index.js";
|
|
6
|
+
export * from "./oids/index.js";
|
|
6
7
|
export * from "./streebog/index.js";
|
|
7
8
|
export * from "./hmac.js";
|
|
8
9
|
export * from "./kdf.js";
|
package/index.js
CHANGED
|
@@ -3,6 +3,7 @@ export * from "./gost341194/index.js";
|
|
|
3
3
|
export * from "./kuznyechik/index.js";
|
|
4
4
|
export * from "./magma/index.js";
|
|
5
5
|
export * from "./modes/index.js";
|
|
6
|
+
export * from "./oids/index.js";
|
|
6
7
|
export * from "./streebog/index.js";
|
|
7
8
|
export * from "./hmac.js";
|
|
8
9
|
export * from "./kdf.js";
|
package/modes/_keytransform.js
CHANGED
|
@@ -3,22 +3,19 @@ import { Magma } from "../magma/index.js";
|
|
|
3
3
|
import { ID_GOST_28147_89_CRYPTO_PRO_A_PARAM_SET } from "../magma/const.js";
|
|
4
4
|
import { cfb } from "./cfb.js";
|
|
5
5
|
import { ctr } from "./ctr.js";
|
|
6
|
-
import { hexToBytes } from "@noble/hashes/utils.js";
|
|
7
|
-
import { ecb } from "./ecb.js";
|
|
8
6
|
export const cp_kek_diversify = (kek, ukm, sbox = ID_GOST_28147_89_CRYPTO_PRO_A_PARAM_SET) => {
|
|
9
7
|
let out = copyBytes(kek);
|
|
10
8
|
for (let i = 0; i < 8; i++) {
|
|
11
9
|
let s1 = 0, s2 = 0;
|
|
12
10
|
for (let j = 0; j < 8; j++) {
|
|
13
|
-
const k = Number(bytesToNumberLE(out.subarray(j * 4, j * 4 + 4)));
|
|
11
|
+
const k = Number(bytesToNumberLE(out.subarray(j * 4, j * 4 + 4)));
|
|
14
12
|
if ((ukm[i] >> j) & 1)
|
|
15
13
|
s1 += k;
|
|
16
14
|
else
|
|
17
15
|
s2 += k;
|
|
18
16
|
}
|
|
19
17
|
const iv = concatBytes(numberToBytesLE(s1 >>> 0, 4), numberToBytesLE(s2 >>> 0, 4));
|
|
20
|
-
|
|
21
|
-
out = cfb(cipher, iv).encrypt(out);
|
|
18
|
+
out = cfb(new Magma(out, sbox, true), iv).encrypt(out);
|
|
22
19
|
}
|
|
23
20
|
return out;
|
|
24
21
|
};
|
package/oids/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type GostCurveParameters } from "../gost3410/const.js";
|
|
2
|
+
import type { HashFunctionWrapper } from "../types.js";
|
|
3
|
+
/** Get curve parameters by OID */
|
|
4
|
+
export declare const getCurveByOid: (oid: string) => GostCurveParameters | undefined;
|
|
5
|
+
/** Get hash function by OID */
|
|
6
|
+
export declare const getHashByOid: (oid: string) => HashFunctionWrapper | undefined;
|
package/oids/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CURVES } from "../gost3410/const.js";
|
|
2
|
+
import { gost341194 } from "../gost341194/index.js";
|
|
3
|
+
import { streebog256, streebog512 } from "../streebog/index.js";
|
|
4
|
+
const HASHES_OID = {
|
|
5
|
+
"1.2.643.7.1.1.2.1": gost341194,
|
|
6
|
+
"1.2.643.7.1.1.2.2": streebog256,
|
|
7
|
+
"1.2.643.7.1.1.2.3": streebog512
|
|
8
|
+
};
|
|
9
|
+
/** Get curve parameters by OID */
|
|
10
|
+
export const getCurveByOid = (oid) => {
|
|
11
|
+
for (const [_, params] of Object.entries(CURVES))
|
|
12
|
+
if (params.oids?.includes(oid))
|
|
13
|
+
return params;
|
|
14
|
+
};
|
|
15
|
+
/** Get hash function by OID */
|
|
16
|
+
export const getHashByOid = (oid) => HASHES_OID[oid];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@li0ard/gost",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"type": "module",
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"./kuznyechik.js": "./kuznyechik/index.js",
|
|
12
12
|
"./magma.js": "./magma/index.js",
|
|
13
13
|
"./modes.js": "./modes/index.js",
|
|
14
|
+
"./oids.js": "./oids/index.js",
|
|
14
15
|
"./streebog.js": "./streebog/index.js",
|
|
15
16
|
"./hmac.js": "./hmac.js",
|
|
16
17
|
"./kdf.js": "./kdf.js",
|
|
@@ -33,6 +34,8 @@
|
|
|
33
34
|
"docs": "typedoc --options .config/typedoc/config.cjs"
|
|
34
35
|
},
|
|
35
36
|
"devDependencies": {
|
|
37
|
+
"@peculiar/asn1-schema": "^2.7.0",
|
|
38
|
+
"@peculiar/asn1-x509": "^2.7.0",
|
|
36
39
|
"@types/bun": "latest",
|
|
37
40
|
"typedoc": "^0.28.19"
|
|
38
41
|
},
|