Skip to content

Commit 577560f

Browse files
committed
Moving to SHAKE256 in progress
1 parent f76c9ee commit 577560f

File tree

10 files changed

+128
-73
lines changed

10 files changed

+128
-73
lines changed

cspell.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
"cbor",
2020
"cldmv",
2121
"daisyui",
22+
"decapsulated",
23+
"decapsulates",
2224
"iife",
2325
"sarif",
2426
"simc",
2527
"uwrl"
2628
],
2729
"ignoreWords": [],
2830
"import": []
29-
}
31+
}

udsp/cryptoMiddleware/cipherSuite/Kyber768_xChaCha.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ import {
2020
import { decrypt, encrypt, encryptionOverhead } from '../encryption/XChaCha.js';
2121
import { extendedHandshakeHeaderRPC, introHeaderRPC } from '../../protocolHeaderRPCs.js';
2222
import { extendedHandshakeRPC, introRPC } from '../../protocolFrameRPCs.js';
23-
import { blake3 } from '@noble/hashes/blake3';
2423
import { ml_kem768 } from '@noble/post-quantum/ml-kem';
24+
import { shake256 } from '@noble/hashes/sha3';
2525
const {
2626
randomBuffer,
2727
toBase64,
@@ -31,11 +31,11 @@ const {
3131
clearBuffers
3232
} = defaultCrypto;
3333
const { id: encryptionKeypairID, } = kyber768;
34-
const hash = blake3;
34+
const hashFunction = shake256;
3535
export const kyber768_xChaCha = {
3636
name: 'kyber768_xChaCha',
3737
alias: 'kyber768',
38-
description: 'Crystals-Kyber768 with XChaCha20 and Blake3.',
38+
description: 'Crystals-Kyber768 with XChaCha20 and SHAKE256.',
3939
id: 2,
4040
preferred: true,
4141
speed: 0,
@@ -53,7 +53,7 @@ export const kyber768_xChaCha = {
5353
const sharedSecret = await decapsulate(cipherData, kyberPrivateKey);
5454
console.log('clientSetSession kyberSharedSecret', sharedSecret[0], sharedSecret.length);
5555
source.transmitKey = sharedSecret;
56-
source.receiveKey = hash(sharedSecret);
56+
source.receiveKey = hashFunction(sharedSecret);
5757
console.log('New Session Keys', source.transmitKey[0], source.receiveKey[0]);
5858
},
5959
async sendClientExtendedHandshake(source, destination, frame, header) {
@@ -107,7 +107,7 @@ export const kyber768_xChaCha = {
107107
} = await encapsulate(destinationPublicKey);
108108
destination.publicKey = destinationPublicKey;
109109
source.cipherData = cipherText;
110-
source.transmitKey = hash(sharedSecret);
110+
source.transmitKey = hashFunction(sharedSecret);
111111
source.receiveKey = sharedSecret;
112112
console.log('server kyberSharedSecret', sharedSecret[0], sharedSecret.length);
113113
console.log('destinationPublicKey', destinationPublicKey[0]);
@@ -171,7 +171,7 @@ export const kyber768_xChaCha = {
171171
decrypt,
172172
encrypt,
173173
ml_kem768,
174-
hash,
174+
hash: hashFunction,
175175
extendedHandshake: true,
176176
encryptionKeypairID,
177177
encryptionOverhead

udsp/cryptoMiddleware/cipherSuite/x25519_Kyber768Half_xChaCha.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import * as defaultCrypto from '#crypto';
33
import { assign, clear, isBuffer } from '@universalweb/acid';
44
import {
5-
clearSession,
65
clientSetSession,
76
encryptionKeypair as encryptionKeypair25519,
87
get25519KeyCopy,
@@ -12,15 +11,16 @@ import {
1211
} from '../keyExchange/x25519.js';
1312
import { decapsulate, encapsulate } from '../keyExchange/kyber768.js';
1413
import { decrypt, encrypt, encryptionOverhead } from '../encryption/XChaCha.js';
15-
import { blake3 } from '@noble/hashes/blake3';
1614
import { kyber768Half_x25519 } from '../keyExchange/kyber768Half_x25519.js';
1715
const {
1816
randomBuffer,
1917
toBase64,
2018
toHex,
2119
combineKeys,
2220
clearBuffers,
23-
clearBuffer
21+
clearBuffer,
22+
clearSessionKeys,
23+
clearSessionWithSharedSecret,
2424
} = defaultCrypto;
2525
const {
2626
generateSeed,
@@ -35,7 +35,7 @@ const {
3535
export const x25519_kyber768Half_xchacha20 = {
3636
name: 'x25519_kyber768Half_xchacha20',
3737
alias: 'hpqthalf',
38-
description: 'Hybrid Post Quantum Key Exchange using both Crystals-Kyber768 and X25519 with XChaCha20 and Blake3 but certification verification only occurs with x25519.',
38+
description: 'Hybrid Post Quantum Key Exchange using both Crystals-Kyber768 and X25519 with XChaCha20 and SHAKE256 but certification verification only occurs with x25519.',
3939
id: 1,
4040
ml_kem768,
4141
preferred: true,
@@ -76,7 +76,7 @@ export const x25519_kyber768Half_xchacha20 = {
7676
const newTransmitKey = combineKeys(oldTransmitKey, sourceKeypair25519.transmitKey, sharedSecret);
7777
const newReceiveKey = combineKeys(oldReceiveKey, sourceKeypair25519.receiveKey, sharedSecret);
7878
clearBuffer(cipherData);
79-
await clearSession(sourceKeypair25519);
79+
await clearSessionWithSharedSecret(sourceKeypair25519);
8080
clearBuffers(oldSharedSecret, sharedSecret);
8181
source.transmitKey = newTransmitKey;
8282
source.receiveKey = newReceiveKey;
@@ -111,7 +111,7 @@ export const x25519_kyber768Half_xchacha20 = {
111111
const sharedSecret = nextSession.sharedSecret;
112112
const newTransmitKey = combineKeys(oldTransmitKey, x25519SessionKeys.transmitKey, sharedSecret);
113113
const newReceiveKey = combineKeys(oldReceiveKey, x25519SessionKeys.receiveKey, sharedSecret);
114-
await clearSession(nextSessionKeypair25519);
114+
await clearSessionWithSharedSecret(nextSessionKeypair25519);
115115
clearBuffers(oldSharedSecret, sharedSecret, destination.publicKey);
116116
source.transmitKey = newTransmitKey;
117117
source.receiveKey = newReceiveKey;

udsp/cryptoMiddleware/cipherSuite/x25519_Kyber768_xChaCha.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,12 @@ import * as defaultCrypto from '#crypto';
2323
import { assign, clearBuffer, isBuffer } from '@universalweb/acid';
2424
import { decrypt, encrypt, encryptionOverhead } from '../encryption/XChaCha.js';
2525
import { get25519KeyCopy, x25519 } from '../keyExchange/x25519.js';
26-
import { blake3 } from '@noble/hashes/blake3';
2726
import { encapsulate } from '../keyExchange/kyber768.js';
2827
import { extendedHandshakeRPC } from '../../protocolFrameRPCs.js';
29-
import { kyber768Half_x25519 } from '../keyExchange/kyber768Half_x25519.js';
3028
import { kyber768_x25519 } from '../keyExchange/kyber768_x25519.js';
29+
import { shake256 } from '@noble/hashes/sha3';
3130
import { x25519_kyber768Half_xchacha20 } from './x25519_Kyber768Half_xChaCha.js';
32-
const hash = blake3;
31+
const hashFunction = shake256;
3332
const { clientSetSession } = x25519_kyber768Half_xchacha20;
3433
const {
3534
serverSetSessionAttach,
@@ -66,7 +65,7 @@ const {
6665
export const x25519_kyber768_xchacha20 = {
6766
name: 'x25519_kyber768_xchacha20',
6867
alias: 'hpqt',
69-
description: 'Hybrid Post Quantum Key Exchange using both Crystals-Kyber768 and X25519 with XChaCha20 and Blake3.',
68+
description: 'Hybrid Post Quantum Key Exchange using both Crystals-Kyber768 + X25519 with XChaCha20 and SHAKE256.',
7069
id: 3,
7170
ml_kem768,
7271
preferred: true,
@@ -97,7 +96,7 @@ export const x25519_kyber768_xchacha20 = {
9796
console.log('serverInitializeSession CIPHER', toHex(cipherData));
9897
destination.publicKey = get25519KeyCopy(cipherData);
9998
await serverSetSessionAttach(source, destination);
100-
source.nextSession = await kyber768Half_x25519.serverEphemeralKeypair(source, destination, cipherData);
99+
source.nextSession = await kyber768_x25519.serverEphemeralKeypair(source, destination, cipherData);
101100
clearBuffer(cipherData);
102101
console.log('nextSession', source.nextSession);
103102
},
@@ -120,7 +119,7 @@ export const x25519_kyber768_xchacha20 = {
120119
clientPrivateKeySize,
121120
serverPublicKeySize,
122121
serverPrivateKeySize,
123-
hash,
122+
hash: hashFunction,
124123
encrypt,
125124
decrypt,
126125
encryptionOverhead

udsp/cryptoMiddleware/cipherSuite/x25519_xChaCha.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const {
3232
combineSessionKeys
3333
} = defaultCrypto;
3434
const { id: encryptionKeypairID } = x25519;
35-
const hash = blake3.hash;
35+
const hashFunction = blake3.hash;
3636
export const x25519_xChaCha = {
3737
name: 'x25519_xChaCha',
3838
alias: 'default',
@@ -154,5 +154,5 @@ export const x25519_xChaCha = {
154154
encrypt,
155155
encryptionOverhead,
156156
preferred: true,
157-
hash
157+
hash: hashFunction
158158
};

udsp/cryptoMiddleware/keyExchange/kyber768.js

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,69 @@
1-
import * as defaultCrypto from '#crypto';
2-
import { clearBuffer, isBuffer } from '@universalweb/acid';
1+
import {
2+
clearBuffer,
3+
int32,
4+
randomBuffer
5+
} from '#crypto';
6+
import { isBuffer } from '@universalweb/acid';
37
import { ml_kem768 } from '@noble/post-quantum/ml-kem';
4-
import { encryptionKeypair as x25519Keypair } from './x25519.js';
5-
const { randomBuffer } = defaultCrypto;
8+
import { shake256 } from '@noble/hashes/sha3';
9+
const hashFunction = shake256;
10+
const sessionKeySize = int32;
11+
const hashSettings = {
12+
dkLen: 64
13+
};
614
export async function encryptionKeypair(seed) {
715
const kyberKeypair = ml_kem768.keygen(seed);
816
return {
917
publicKey: kyberKeypair.publicKey,
1018
privateKey: kyberKeypair.secretKey
1119
};
1220
}
13-
export async function decapsulate(cipherText, sourceKeypairKyber) {
14-
const decapsulated = ml_kem768.decapsulate(cipherText, sourceKeypairKyber?.privateKey || sourceKeypairKyber);
21+
export async function decapsulate(cipherData, sourceKeypairKyber) {
22+
const decapsulated = ml_kem768.decapsulate(cipherData, sourceKeypairKyber?.privateKey || sourceKeypairKyber);
1523
return decapsulated;
1624
}
25+
export function clientSetSession(client, server, target, cipherData) {
26+
const sharedSecret = decapsulate(cipherData, client.privateKey);
27+
const hashSharedSecret = hashFunction(Buffer.concat([
28+
sharedSecret,
29+
client.publicKey,
30+
server?.publicKey || server
31+
]), hashSettings);
32+
const transmitKey = hashSharedSecret.subarray(sessionKeySize);
33+
const receiveKey = hashSharedSecret.subarray(0, sessionKeySize);
34+
if (target) {
35+
target.sharedSecret = hashSharedSecret;
36+
target.receiveKey = receiveKey;
37+
target.transmitKey = transmitKey;
38+
return target;
39+
}
40+
return {
41+
sharedSecret: hashSharedSecret,
42+
receiveKey,
43+
transmitKey
44+
};
45+
}
46+
export function serverSetSession(server, client, target, cipherData) {
47+
const sharedSecret = decapsulate(cipherData, server.privateKey);
48+
const hashSharedSecret = hashFunction(Buffer.concat([
49+
sharedSecret,
50+
client?.publicKey || client,
51+
server.publicKey
52+
]), hashSettings);
53+
const transmitKey = hashSharedSecret.subarray(0, sessionKeySize);
54+
const receiveKey = hashSharedSecret.subarray(sessionKeySize);
55+
if (target) {
56+
target.sharedSecret = hashSharedSecret;
57+
target.receiveKey = receiveKey;
58+
target.transmitKey = transmitKey;
59+
return target;
60+
}
61+
return {
62+
sharedSecret: hashSharedSecret,
63+
receiveKey,
64+
transmitKey
65+
};
66+
}
1767
export async function encapsulate(sourceKeypair) {
1868
// { cipherText, sharedSecret }
1969
const encapsulated = ml_kem768.encapsulate(sourceKeypair?.publicKey || sourceKeypair);
@@ -32,6 +82,7 @@ export const kyber768 = {
3282
clientPrivateKeySize: privateKeySize,
3383
serverPublicKeySize: publicKeySize,
3484
serverPrivateKeySize: privateKeySize,
85+
sessionKeySize,
3586
ml_kem768,
3687
decapsulate,
3788
encapsulate,

udsp/cryptoMiddleware/keyExchange/kyber768Half_x25519.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ import {
1212
} from './kyber768.js';
1313
import { decrypt, encrypt } from '../encryption/XChaCha.js';
1414
import { assign } from '@universalweb/acid';
15-
import { blake3 } from '@noble/hashes/blake3';
1615
import { ml_kem768 } from '@noble/post-quantum/ml-kem';
16+
import { shake256 } from '@noble/hashes/sha3';
17+
const hashFunction = shake256;
1718
const {
1819
randomBuffer,
1920
toBase64,
@@ -86,7 +87,7 @@ export const kyber768Half_x25519 = {
8687
return x25519Keypair;
8788
},
8889
ml_kem768,
89-
hash: blake3,
90+
hash: hashFunction,
9091
getKyberKey
9192
};
9293
export default kyber768Half_x25519;

udsp/cryptoMiddleware/keyExchange/kyber768_x25519.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import {
1212
} from '../keyExchange/kyber768.js';
1313
import { decrypt, encrypt } from '../encryption/XChaCha.js';
1414
import { assign } from '@universalweb/acid';
15-
import { blake3 } from '@noble/hashes/blake3';
1615
import { ml_kem768 } from '@noble/post-quantum/ml-kem';
16+
import { shake256 } from '@noble/hashes/sha3';
1717
const {
1818
randomBuffer,
1919
toBase64,
@@ -25,10 +25,11 @@ const {
2525
} = defaultCrypto;
2626
const publicKeySize = x25519.publicKeySize + kyber768.publicKeySize;
2727
const privateKeySize = x25519.privateKeySize + kyber768.privateKeySize;
28+
const hashFunction = shake256;
2829
export const kyber768_x25519 = {
2930
name: 'kyber768_x25519',
3031
alias: 'kyber768_x25519',
31-
description: 'Crystals-Kyber768 with X25519 and Blake3.',
32+
description: 'Crystals-Kyber768 with X25519 and SHAKE256.',
3233
id: 3,
3334
// partial initial encryption on first packet
3435
async clientInitializeSession(source, destination) {
@@ -137,7 +138,7 @@ export const kyber768_x25519 = {
137138
}
138139
}
139140
},
140-
hash: blake3,
141+
hash: hashFunction,
141142
ml_kem768,
142143
noneQuatumPublicKeySize: x25519.publicKeySize,
143144
noneQuatumPrivateKeySize: x25519.privateKeySize,

0 commit comments

Comments
 (0)