@thenewlabs/entangle-crypto 2.0.0 → 2.0.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.
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@thenewlabs/entangle-crypto",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
7
7
  "scripts": {
8
8
  "build": "tsc",
9
- "clean": "rm -rf dist",
9
+ "clean": "rm -rf dist tsconfig.tsbuildinfo",
10
10
  "prepublishOnly": "npm run build"
11
11
  },
12
12
  "dependencies": {
13
13
  "@noble/hashes": "^1.8.0",
14
- "@thenewlabs/entangle-protocol": "^2.0.0",
14
+ "@thenewlabs/entangle-protocol": "^2.0.1",
15
15
  "cborg": "^4.5.8",
16
16
  "libsodium-wrappers-sumo": "^0.8.4"
17
17
  },
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
@@ -1,167 +0,0 @@
1
- import { describe, it, expect, beforeAll } from 'vitest';
2
- import { initCrypto, generateCapId, generateSecret, extractSaltFromCapId, deriveKeys, aeadEncrypt, aeadDecrypt, computeHmac, verifyHmac, base64UrlEncode, base64UrlDecode, hashPolicy, } from './index.js';
3
- describe('Crypto Package', () => {
4
- beforeAll(async () => {
5
- await initCrypto();
6
- });
7
- describe('CapId generation', () => {
8
- it('should generate valid capId with embedded salt', () => {
9
- const { capId, saltCap } = generateCapId();
10
- expect(capId).toBeTruthy();
11
- expect(saltCap).toHaveLength(16);
12
- const extracted = extractSaltFromCapId(capId);
13
- expect(extracted).toEqual(saltCap);
14
- });
15
- it('should generate unique capIds', () => {
16
- const cap1 = generateCapId();
17
- const cap2 = generateCapId();
18
- expect(cap1.capId).not.toEqual(cap2.capId);
19
- expect(cap1.saltCap).not.toEqual(cap2.saltCap);
20
- });
21
- it('should fail on invalid capId length', () => {
22
- expect(() => extractSaltFromCapId('short')).toThrow('Invalid capId length');
23
- });
24
- });
25
- describe('Secret generation', () => {
26
- it('should generate base64url encoded secrets', () => {
27
- const secret = generateSecret();
28
- expect(secret).toBeTruthy();
29
- expect(secret).toMatch(/^[A-Za-z0-9_-]+$/);
30
- const decoded = base64UrlDecode(secret);
31
- expect(decoded).toHaveLength(32);
32
- });
33
- });
34
- describe('Key derivation', () => {
35
- it('should derive consistent keys from same inputs', async () => {
36
- const secret = generateSecret();
37
- const { saltCap } = generateCapId();
38
- const keys1 = await deriveKeys(secret, saltCap);
39
- const keys2 = await deriveKeys(secret, saltCap);
40
- expect(keys1.K_enc).toEqual(keys2.K_enc);
41
- expect(keys1.K_auth).toEqual(keys2.K_auth);
42
- });
43
- it('should derive different keys from different secrets', async () => {
44
- const secret1 = generateSecret();
45
- const secret2 = generateSecret();
46
- const { saltCap } = generateCapId();
47
- const keys1 = await deriveKeys(secret1, saltCap);
48
- const keys2 = await deriveKeys(secret2, saltCap);
49
- expect(keys1.K_enc).not.toEqual(keys2.K_enc);
50
- expect(keys1.K_auth).not.toEqual(keys2.K_auth);
51
- });
52
- it('should derive different keys from different salts', async () => {
53
- const secret = generateSecret();
54
- const { saltCap: salt1 } = generateCapId();
55
- const { saltCap: salt2 } = generateCapId();
56
- const keys1 = await deriveKeys(secret, salt1);
57
- const keys2 = await deriveKeys(secret, salt2);
58
- expect(keys1.K_enc).not.toEqual(keys2.K_enc);
59
- });
60
- });
61
- describe('AEAD encryption', () => {
62
- it('should encrypt and decrypt successfully', async () => {
63
- const secret = generateSecret();
64
- const { saltCap } = generateCapId();
65
- const keys = await deriveKeys(secret, saltCap);
66
- const plaintext = { test: 'data', number: 42 };
67
- const type = 0x10;
68
- const ctr = 1;
69
- const { nonce, cipher } = aeadEncrypt(keys.K_enc, type, ctr, plaintext);
70
- expect(nonce).toHaveLength(24);
71
- expect(cipher).toBeTruthy();
72
- const decrypted = aeadDecrypt(keys.K_enc, type, nonce, cipher);
73
- expect(decrypted.ctr).toEqual(ctr);
74
- expect(decrypted.msg).toEqual(plaintext);
75
- });
76
- it('should fail decryption with wrong key', async () => {
77
- const secret1 = generateSecret();
78
- const secret2 = generateSecret();
79
- const { saltCap } = generateCapId();
80
- const keys1 = await deriveKeys(secret1, saltCap);
81
- const keys2 = await deriveKeys(secret2, saltCap);
82
- const plaintext = { test: 'data' };
83
- const { nonce, cipher } = aeadEncrypt(keys1.K_enc, 0x10, 1, plaintext);
84
- expect(() => aeadDecrypt(keys2.K_enc, 0x10, nonce, cipher)).toThrow();
85
- });
86
- it('should fail decryption with wrong type', async () => {
87
- const secret = generateSecret();
88
- const { saltCap } = generateCapId();
89
- const keys = await deriveKeys(secret, saltCap);
90
- const plaintext = { test: 'data' };
91
- const { nonce, cipher } = aeadEncrypt(keys.K_enc, 0x10, 1, plaintext);
92
- expect(() => aeadDecrypt(keys.K_enc, 0x11, nonce, cipher)).toThrow();
93
- });
94
- it('should fail decryption with tampered cipher', async () => {
95
- const secret = generateSecret();
96
- const { saltCap } = generateCapId();
97
- const keys = await deriveKeys(secret, saltCap);
98
- const plaintext = { test: 'data' };
99
- const { nonce, cipher } = aeadEncrypt(keys.K_enc, 0x10, 1, plaintext);
100
- cipher[0] ^= 0xFF; // Tamper with first byte
101
- expect(() => aeadDecrypt(keys.K_enc, 0x10, nonce, cipher)).toThrow();
102
- });
103
- });
104
- describe('HMAC', () => {
105
- it('should compute and verify HMAC', async () => {
106
- const secret = generateSecret();
107
- const { saltCap } = generateCapId();
108
- const keys = await deriveKeys(secret, saltCap);
109
- const data = new TextEncoder().encode('test message');
110
- const mac = computeHmac(keys.K_auth, data);
111
- expect(mac).toHaveLength(32);
112
- expect(verifyHmac(keys.K_auth, data, mac)).toBe(true);
113
- });
114
- it('should fail verification with wrong key', async () => {
115
- const secret1 = generateSecret();
116
- const secret2 = generateSecret();
117
- const { saltCap } = generateCapId();
118
- const keys1 = await deriveKeys(secret1, saltCap);
119
- const keys2 = await deriveKeys(secret2, saltCap);
120
- const data = new TextEncoder().encode('test message');
121
- const mac = computeHmac(keys1.K_auth, data);
122
- expect(verifyHmac(keys2.K_auth, data, mac)).toBe(false);
123
- });
124
- it('should fail verification with tampered data', async () => {
125
- const secret = generateSecret();
126
- const { saltCap } = generateCapId();
127
- const keys = await deriveKeys(secret, saltCap);
128
- const data1 = new TextEncoder().encode('test message');
129
- const data2 = new TextEncoder().encode('test message!');
130
- const mac = computeHmac(keys.K_auth, data1);
131
- expect(verifyHmac(keys.K_auth, data2, mac)).toBe(false);
132
- });
133
- });
134
- describe('Base64URL encoding', () => {
135
- it('should encode and decode correctly', () => {
136
- const data = new Uint8Array([1, 2, 3, 255, 0, 128]);
137
- const encoded = base64UrlEncode(data);
138
- expect(encoded).not.toContain('+');
139
- expect(encoded).not.toContain('/');
140
- expect(encoded).not.toContain('=');
141
- const decoded = base64UrlDecode(encoded);
142
- expect(decoded).toEqual(data);
143
- });
144
- it('should handle empty data', () => {
145
- const data = new Uint8Array(0);
146
- const encoded = base64UrlEncode(data);
147
- const decoded = base64UrlDecode(encoded);
148
- expect(decoded).toEqual(data);
149
- });
150
- });
151
- describe('Policy hashing', () => {
152
- it('should hash policy consistently', () => {
153
- const policy = { singleRun: true };
154
- const hash1 = hashPolicy(policy);
155
- const hash2 = hashPolicy(policy);
156
- expect(hash1).toEqual(hash2);
157
- });
158
- it('should produce different hashes for different policies', () => {
159
- const policy1 = { singleRun: true };
160
- const policy2 = { singleRun: false };
161
- const hash1 = hashPolicy(policy1);
162
- const hash2 = hashPolicy(policy2);
163
- expect(hash1).not.toEqual(hash2);
164
- });
165
- });
166
- });
167
- //# sourceMappingURL=index.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}