salty-crypto 0.3.0 → 0.3.1

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.
Files changed (74) hide show
  1. package/lib/aead/chacha20poly1305.d.ts +2 -0
  2. package/lib/aead/chacha20poly1305.js +53 -0
  3. package/lib/aead/chacha20poly1305.js.map +1 -0
  4. package/lib/aead.d.ts +16 -0
  5. package/lib/aead.js +18 -0
  6. package/lib/aead.js.map +1 -0
  7. package/lib/bytes.d.ts +4 -0
  8. package/lib/bytes.js +27 -0
  9. package/lib/bytes.js.map +1 -0
  10. package/lib/cipher/chacha20.d.ts +4 -0
  11. package/lib/cipher/chacha20.js +84 -0
  12. package/lib/cipher/chacha20.js.map +1 -0
  13. package/lib/cipher.d.ts +9 -0
  14. package/lib/cipher.js +4 -0
  15. package/lib/cipher.js.map +1 -0
  16. package/lib/dh/x25519.d.ts +10 -0
  17. package/lib/dh/x25519.js +624 -0
  18. package/lib/dh/x25519.js.map +1 -0
  19. package/lib/dh.d.ts +11 -0
  20. package/lib/dh.js +17 -0
  21. package/lib/dh.js.map +1 -0
  22. package/lib/hash/blake2s.d.ts +18 -0
  23. package/lib/hash/blake2s.js +120 -0
  24. package/lib/hash/blake2s.js.map +1 -0
  25. package/lib/hash/poly1305.d.ts +18 -0
  26. package/lib/hash/poly1305.js +376 -0
  27. package/lib/hash/poly1305.js.map +1 -0
  28. package/lib/hash.d.ts +14 -0
  29. package/lib/hash.js +5 -0
  30. package/lib/hash.js.map +1 -0
  31. package/lib/hkdf.d.ts +6 -0
  32. package/lib/hkdf.js +17 -0
  33. package/lib/hkdf.js.map +1 -0
  34. package/lib/hmac.d.ts +6 -0
  35. package/lib/hmac.js +17 -0
  36. package/lib/hmac.js.map +1 -0
  37. package/lib/index.d.ts +45 -0
  38. package/lib/index.js +48 -0
  39. package/lib/index.js.map +1 -0
  40. package/lib/io.d.ts +4 -0
  41. package/lib/io.js +35 -0
  42. package/lib/io.js.map +1 -0
  43. package/lib/noise/algorithms.d.ts +15 -0
  44. package/lib/noise/algorithms.js +10 -0
  45. package/lib/noise/algorithms.js.map +1 -0
  46. package/lib/noise/cipherstate.d.ts +14 -0
  47. package/lib/noise/cipherstate.js +62 -0
  48. package/lib/noise/cipherstate.js.map +1 -0
  49. package/lib/noise/handshake.d.ts +52 -0
  50. package/lib/noise/handshake.js +191 -0
  51. package/lib/noise/handshake.js.map +1 -0
  52. package/lib/noise/patterns.d.ts +16 -0
  53. package/lib/noise/patterns.js +73 -0
  54. package/lib/noise/patterns.js.map +1 -0
  55. package/lib/noise/profiles.d.ts +2 -0
  56. package/lib/noise/profiles.js +11 -0
  57. package/lib/noise/profiles.js.map +1 -0
  58. package/lib/noise/rekey.d.ts +3 -0
  59. package/lib/noise/rekey.js +9 -0
  60. package/lib/noise/rekey.js.map +1 -0
  61. package/lib/noise.d.ts +6 -0
  62. package/lib/noise.js +8 -0
  63. package/lib/noise.js.map +1 -0
  64. package/lib/nonce.d.ts +9 -0
  65. package/lib/nonce.js +25 -0
  66. package/lib/nonce.js.map +1 -0
  67. package/lib/random.d.ts +2 -0
  68. package/lib/random.js +35 -0
  69. package/lib/random.js.map +1 -0
  70. package/package.json +12 -2
  71. package/speed.ts +0 -22
  72. package/test-vectors/noise-c-basic.txt +0 -19684
  73. package/test-vectors/snow.txt +0 -10348
  74. package/watchall +0 -22
@@ -0,0 +1,2 @@
1
+ import { AEAD } from '../aead';
2
+ export declare const ChaCha20Poly1305_RFC8439: AEAD;
@@ -0,0 +1,53 @@
1
+ /// SPDX-License-Identifier: MIT
2
+ /// SPDX-FileCopyrightText: Copyright © 2023 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
3
+ // RFC-8439 AEAD construction.
4
+ import { _encrypt, _decrypt } from '../aead';
5
+ import { ChaCha20 } from '../cipher/chacha20';
6
+ import { Poly1305 } from '../hash/poly1305';
7
+ import * as Bytes from '../bytes';
8
+ const PADDING = new Uint8Array(16);
9
+ function pad16(p, unpadded_length) {
10
+ const leftover = unpadded_length & 15;
11
+ if (leftover !== 0)
12
+ p.update(PADDING, 0, 16 - leftover);
13
+ }
14
+ function aead_tag(tag, key, nonce, ciphertext, cipherlength, associated_data) {
15
+ const mac_key = new Uint8Array(Poly1305.KEYBYTES);
16
+ ChaCha20.stream_xor(key, nonce, mac_key, mac_key, 0);
17
+ const p = new Poly1305(mac_key);
18
+ if (associated_data !== void 0) {
19
+ p.update(associated_data, 0, associated_data.byteLength);
20
+ pad16(p, associated_data.byteLength);
21
+ }
22
+ p.update(ciphertext, 0, cipherlength);
23
+ pad16(p, cipherlength);
24
+ const L = new Uint8Array(16);
25
+ const Lv = new DataView(L.buffer);
26
+ if (associated_data !== void 0) {
27
+ Lv.setUint32(0, associated_data.byteLength, true);
28
+ }
29
+ Lv.setUint32(8, cipherlength, true);
30
+ p.update(L, 0, L.byteLength);
31
+ p.final(tag);
32
+ }
33
+ export const ChaCha20Poly1305_RFC8439 = {
34
+ NAME: 'ChaChaPoly',
35
+ KEYBYTES: 32,
36
+ NONCEBYTES: 12,
37
+ TAGBYTES: 16,
38
+ encrypt_detached(plaintext, ciphertext, messagelength, tag, key, nonce, associated_data) {
39
+ ChaCha20.stream_xor(key, nonce, plaintext, ciphertext, 1, messagelength);
40
+ aead_tag(tag, key, nonce, ciphertext, messagelength, associated_data);
41
+ },
42
+ encrypt: _encrypt,
43
+ decrypt_detached(plaintext, ciphertext, messagelength, expected_tag, key, nonce, associated_data) {
44
+ const actual_tag = new Uint8Array(this.TAGBYTES);
45
+ aead_tag(actual_tag, key, nonce, ciphertext, messagelength, associated_data);
46
+ const ok = Bytes.equal(actual_tag, expected_tag, actual_tag.byteLength);
47
+ if (ok)
48
+ ChaCha20.stream_xor(key, nonce, ciphertext, plaintext, 1, messagelength);
49
+ return ok;
50
+ },
51
+ decrypt: _decrypt,
52
+ };
53
+ //# sourceMappingURL=chacha20poly1305.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chacha20poly1305.js","sourceRoot":"","sources":["../../src/aead/chacha20poly1305.ts"],"names":[],"mappings":"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"}
package/lib/aead.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ import { Nonce } from './nonce';
2
+ export declare class AuthenticationFailure extends Error {
3
+ }
4
+ export interface AEAD {
5
+ readonly NAME: string;
6
+ readonly KEYBYTES: number;
7
+ readonly NONCEBYTES: number;
8
+ readonly TAGBYTES: number;
9
+ encrypt_detached(plaintext: Uint8Array, ciphertext: Uint8Array, messagelength: number, tag: Uint8Array, key: DataView, nonce: Nonce, associated_data?: Uint8Array): void;
10
+ encrypt(plaintext: Uint8Array, key: DataView, nonce: Nonce, associated_data?: Uint8Array): Uint8Array;
11
+ decrypt_detached(plaintext: Uint8Array, ciphertext: Uint8Array, messagelength: number, expected_tag: Uint8Array, key: DataView, nonce: Nonce, associated_data?: Uint8Array): boolean;
12
+ decrypt(ciphertextAndTag: Uint8Array, key: DataView, nonce: Nonce, associated_data?: Uint8Array): Uint8Array;
13
+ }
14
+ export declare function _encrypt(this: AEAD, plaintext: Uint8Array, key: DataView, nonce: Nonce, associated_data?: Uint8Array): Uint8Array;
15
+ export declare function _decrypt(this: AEAD, ciphertextAndTag: Uint8Array, key: DataView, nonce: Nonce, associated_data?: Uint8Array): Uint8Array;
16
+ export { ChaCha20Poly1305_RFC8439 } from './aead/chacha20poly1305';
package/lib/aead.js ADDED
@@ -0,0 +1,18 @@
1
+ /// SPDX-License-Identifier: MIT
2
+ /// SPDX-FileCopyrightText: Copyright © 2023 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
3
+ export class AuthenticationFailure extends Error {
4
+ }
5
+ export function _encrypt(plaintext, key, nonce, associated_data) {
6
+ const ciphertextAndTag = new Uint8Array(plaintext.byteLength + this.TAGBYTES);
7
+ this.encrypt_detached(plaintext, ciphertextAndTag, plaintext.byteLength, ciphertextAndTag.subarray(plaintext.byteLength), key, nonce, associated_data);
8
+ return ciphertextAndTag;
9
+ }
10
+ export function _decrypt(ciphertextAndTag, key, nonce, associated_data) {
11
+ const plaintext = new Uint8Array(ciphertextAndTag.byteLength - this.TAGBYTES);
12
+ if (!this.decrypt_detached(plaintext, ciphertextAndTag, plaintext.byteLength, ciphertextAndTag.subarray(plaintext.byteLength), key, nonce, associated_data)) {
13
+ throw new AuthenticationFailure("AEAD authentication failed");
14
+ }
15
+ return plaintext;
16
+ }
17
+ export { ChaCha20Poly1305_RFC8439 } from './aead/chacha20poly1305';
18
+ //# sourceMappingURL=aead.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aead.js","sourceRoot":"","sources":["../src/aead.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,2FAA2F;AAI3F,MAAM,OAAO,qBAAsB,SAAQ,KAAK;CAAG;AAmCnD,MAAM,UAAU,QAAQ,CACC,SAAqB,EACrB,GAAa,EACb,KAAY,EACZ,eAA4B;IAEjD,MAAM,gBAAgB,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9E,IAAI,CAAC,gBAAgB,CAAC,SAAS,EACT,gBAAgB,EAChB,SAAS,CAAC,UAAU,EACpB,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAC/C,GAAG,EACH,KAAK,EACL,eAAe,CAAC,CAAC;IACvC,OAAO,gBAAgB,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,QAAQ,CACC,gBAA4B,EAC5B,GAAa,EACb,KAAY,EACZ,eAA4B;IAEjD,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,gBAAgB,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9E,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EACT,gBAAgB,EAChB,SAAS,CAAC,UAAU,EACpB,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,EAC/C,GAAG,EACH,KAAK,EACL,eAAe,CAAC,EAAE;QACzC,MAAM,IAAI,qBAAqB,CAAC,4BAA4B,CAAC,CAAC;KACjE;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC"}
package/lib/bytes.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export declare function equal(x: Uint8Array, y: Uint8Array, n: number): boolean;
2
+ export declare function xor(a: Uint8Array, b: Uint8Array): Uint8Array;
3
+ export declare function append(a: Uint8Array, b: Uint8Array): Uint8Array;
4
+ export declare const EMPTY: Uint8Array;
package/lib/bytes.js ADDED
@@ -0,0 +1,27 @@
1
+ /// SPDX-License-Identifier: MIT
2
+ /// SPDX-FileCopyrightText: Copyright © 2023 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
3
+ // `verify` from nacl-fast.js
4
+ function verify(x, y, n) {
5
+ let d = 0;
6
+ for (let i = 0; i < n; i++)
7
+ d |= x[i] ^ y[i];
8
+ return (1 & ((d - 1) >>> 8)) - 1;
9
+ }
10
+ export function equal(x, y, n) {
11
+ return verify(x, y, n) === 0;
12
+ }
13
+ export function xor(a, b) {
14
+ const len = Math.min(a.byteLength, b.byteLength);
15
+ const r = new Uint8Array(len);
16
+ for (let i = 0; i < len; i++)
17
+ r[i] = a[i] ^ b[i];
18
+ return r;
19
+ }
20
+ export function append(a, b) {
21
+ const r = new Uint8Array(a.byteLength + b.byteLength);
22
+ r.set(a, 0);
23
+ r.set(b, a.byteLength);
24
+ return r;
25
+ }
26
+ export const EMPTY = new Uint8Array(0);
27
+ //# sourceMappingURL=bytes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.js","sourceRoot":"","sources":["../src/bytes.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,2FAA2F;AAE3F,6BAA6B;AAC7B,SAAS,MAAM,CAAC,CAAa,EAAE,CAAa,EAAE,CAAS;IACnD,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,CAAa,EAAE,CAAa,EAAE,CAAS;IACzD,OAAO,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,CAAa,EAAE,CAAa;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;QAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,CAAa,EAAE,CAAa;IAC/C,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACZ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;IACvB,OAAO,CAAC,CAAC;AACb,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { StreamCipher } from '../cipher';
2
+ export declare function chacha20_quarter_round(s: Uint32Array, a: number, b: number, c: number, d: number): void;
3
+ export declare function chacha20_block(key: DataView, block: number, nonce: DataView): Uint32Array;
4
+ export declare const ChaCha20: StreamCipher;
@@ -0,0 +1,84 @@
1
+ /// SPDX-License-Identifier: MIT
2
+ /// SPDX-FileCopyrightText: Copyright © 2023 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
3
+ function ROTATE(n, bits) {
4
+ return (n << bits) | (n >>> (32 - bits));
5
+ }
6
+ export function chacha20_quarter_round(s, a, b, c, d) {
7
+ s[a] += s[b];
8
+ s[d] ^= s[a];
9
+ s[d] = ROTATE(s[d], 16);
10
+ s[c] += s[d];
11
+ s[b] ^= s[c];
12
+ s[b] = ROTATE(s[b], 12);
13
+ s[a] += s[b];
14
+ s[d] ^= s[a];
15
+ s[d] = ROTATE(s[d], 8);
16
+ s[c] += s[d];
17
+ s[b] ^= s[c];
18
+ s[b] = ROTATE(s[b], 7);
19
+ }
20
+ function fill_state(state, key, block, nonce) {
21
+ state[0] += 0x61707865;
22
+ state[1] += 0x3320646e;
23
+ state[2] += 0x79622d32;
24
+ state[3] += 0x6b206574;
25
+ state[4] += key.getUint32(0, true);
26
+ state[5] += key.getUint32(4, true);
27
+ state[6] += key.getUint32(8, true);
28
+ state[7] += key.getUint32(12, true);
29
+ state[8] += key.getUint32(16, true);
30
+ state[9] += key.getUint32(20, true);
31
+ state[10] += key.getUint32(24, true);
32
+ state[11] += key.getUint32(28, true);
33
+ state[12] += block;
34
+ state[13] += nonce.getUint32(0, true);
35
+ state[14] += nonce.getUint32(4, true);
36
+ state[15] += nonce.getUint32(8, true);
37
+ }
38
+ export function chacha20_block(key, block, nonce) {
39
+ const state = new Uint32Array(16);
40
+ fill_state(state, key, block, nonce);
41
+ for (let round = 0; round < 20; round += 2) {
42
+ chacha20_quarter_round(state, 0, 4, 8, 12);
43
+ chacha20_quarter_round(state, 1, 5, 9, 13);
44
+ chacha20_quarter_round(state, 2, 6, 10, 14);
45
+ chacha20_quarter_round(state, 3, 7, 11, 15);
46
+ chacha20_quarter_round(state, 0, 5, 10, 15);
47
+ chacha20_quarter_round(state, 1, 6, 11, 12);
48
+ chacha20_quarter_round(state, 2, 7, 8, 13);
49
+ chacha20_quarter_round(state, 3, 4, 9, 14);
50
+ }
51
+ fill_state(state, key, block, nonce);
52
+ return state;
53
+ }
54
+ function serializeNonce(n) {
55
+ const view = new DataView(new ArrayBuffer(ChaCha20.NONCEBYTES));
56
+ view.setUint32(0, n.extra, true);
57
+ view.setUint32(4, n.lo, true);
58
+ view.setUint32(8, n.hi, true);
59
+ return view;
60
+ }
61
+ export const ChaCha20 = {
62
+ NAME: 'chacha20',
63
+ KEYBYTES: 32,
64
+ NONCEBYTES: 12,
65
+ BLOCKBYTES: 64,
66
+ stream_xor(key, nonce0, input, output, initial_counter = 0, messagelength = input.byteLength) {
67
+ const nonce = serializeNonce(nonce0);
68
+ const whole_blocks = messagelength >> 6;
69
+ const remaining_bytes = messagelength & 63;
70
+ for (let j = 0; j < whole_blocks; j++) {
71
+ const chunk = chacha20_block(key, initial_counter + j, nonce);
72
+ for (let i = 0; i < 64; i++) {
73
+ output[(j << 6) + i] = input[(j << 6) + i] ^ (chunk[i >> 2] >> ((i & 3) << 3));
74
+ }
75
+ }
76
+ if (remaining_bytes !== 0) {
77
+ const chunk = chacha20_block(key, initial_counter + whole_blocks, nonce);
78
+ for (let i = 0; i < remaining_bytes; i++) {
79
+ output[(whole_blocks << 6) + i] = input[(whole_blocks << 6) + i] ^ (chunk[i >> 2] >> ((i & 3) << 3));
80
+ }
81
+ }
82
+ }
83
+ };
84
+ //# sourceMappingURL=chacha20.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chacha20.js","sourceRoot":"","sources":["../../src/cipher/chacha20.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Nonce } from './nonce';
2
+ export interface StreamCipher {
3
+ readonly NAME: string;
4
+ readonly KEYBYTES: number;
5
+ readonly NONCEBYTES: number;
6
+ readonly BLOCKBYTES: number;
7
+ stream_xor(key: DataView, nonce: Nonce, input: Uint8Array, output: Uint8Array, initial_counter?: number, messagelength?: number): void;
8
+ }
9
+ export { ChaCha20 } from './cipher/chacha20';
package/lib/cipher.js ADDED
@@ -0,0 +1,4 @@
1
+ /// SPDX-License-Identifier: MIT
2
+ /// SPDX-FileCopyrightText: Copyright © 2023 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
3
+ export { ChaCha20 } from './cipher/chacha20';
4
+ //# sourceMappingURL=cipher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cipher.js","sourceRoot":"","sources":["../src/cipher.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,2FAA2F;AAkB3F,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare const crypto_scalarmult_BYTES = 32;
2
+ export declare const crypto_scalarmult_SCALARBYTES = 32;
3
+ export declare function crypto_scalarmult(q: Uint8Array, n: Uint8Array, p: Uint8Array): void;
4
+ export declare function crypto_scalarmult_base(q: Uint8Array, n: Uint8Array): void;
5
+ export declare function scalarMult(n: Uint8Array, p: Uint8Array): Uint8Array;
6
+ export declare namespace scalarMult {
7
+ var scalarLength: number;
8
+ var groupElementLength: number;
9
+ }
10
+ export declare function scalarMultBase(n: Uint8Array): Uint8Array;