@li0ard/gost 0.1.3 → 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.
@@ -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
+ };
@@ -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`)
@@ -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");
@@ -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.slice(0, size));
64
- const s = bytesToNumberBE(signature.slice(size));
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";
@@ -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))); //((out[j * 4]) | (out[j * 4 + 1] << 8) | (out[j * 4 + 2] << 16) | (out[j * 4 + 3] << 24)) >>> 0;
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
- const cipher = new Magma(out, sbox, true);
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
  };
@@ -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",
3
+ "version": "0.1.5",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "type": "module",
@@ -9,8 +9,9 @@
9
9
  "./gost3410.js": "./gost3410/index.js",
10
10
  "./gost341194.js": "./gost341194/index.js",
11
11
  "./kuznyechik.js": "./kuznyechik/index.js",
12
- "./magma.js": "./kuznyechik/magma.js",
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
  },
package/types.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { TArg, TRet } from "@noble/hashes/utils.js";
2
+ export type HashFunctionWrapper = (msg: TArg<Uint8Array>) => TRet<Uint8Array>;
2
3
  /** Cipher core */
3
4
  export type Cipher = {
4
5
  /** Block size */