move keccak related functions to front end
This commit is contained in:
		| @@ -1,27 +1,17 @@ | ||||
| const kdf = require('./kdf'); | ||||
| const keccak = require('./keccak'); | ||||
| 
 | ||||
| function splitIntoChunks(data) { | ||||
|     const chunks = []; | ||||
|     const chunkSize = 16; | ||||
|     for (let i = 0; i < data.length; i += chunkSize) { | ||||
|         const chunk = data.slice(i, i + chunkSize); | ||||
|         chunks.push(chunk); | ||||
|     } | ||||
|     return chunks; | ||||
| } | ||||
| import { concatUint8Arrays, splitIntoChunks } from './arrayutils.js'; | ||||
| import { keccak } from './keccak.js'; | ||||
| 
 | ||||
| class keccakAEAD { | ||||
|     constructor(iv, key, nonce) { | ||||
|         const input = kdf.concatUint8Arrays(iv, key, nonce); | ||||
|         const input = concatUint8Arrays(iv, key, nonce); | ||||
|         this.state = keccak.SHAKE256(input, 40); | ||||
|         let r = this.state.slice(0, 16); | ||||
|         let c = this.state.slice(16, 40); | ||||
|         let padded_key = kdf.concatUint8Arrays(new Uint8Array(24-key.length), key); | ||||
|         let padded_key = concatUint8Arrays(new Uint8Array(24-key.length), key); | ||||
|         for (let i = 0; i < padded_key.length; i++) { | ||||
|             c[i] ^= key[i]; | ||||
|         } | ||||
|         this.state = kdf.concatUint8Arrays(r, c); | ||||
|         this.state = concatUint8Arrays(r, c); | ||||
|     } | ||||
| 
 | ||||
|     associated_data_processing(associated_data) { | ||||
| @@ -37,7 +27,7 @@ class keccakAEAD { | ||||
|             for (let i = 0; i < chunk.length; i++) { | ||||
|                 r[i] = chunk[i] ^ to_xor[i]; | ||||
|             } | ||||
|             input = kdf.concatUint8Arrays(r, c); | ||||
|             input = concatUint8Arrays(r, c); | ||||
|             this.state = keccak.SHAKE256(input, 40); | ||||
|         }); | ||||
|         r = this.state.slice(0, 16); | ||||
| @@ -47,7 +37,7 @@ class keccakAEAD { | ||||
|         for (let i = 0; i < c.length; i++) { | ||||
|             c[i] ^= to_xor[i]; | ||||
|         } | ||||
|         this.state = kdf.concatUint8Arrays(r, c); | ||||
|         this.state = concatUint8Arrays(r, c); | ||||
|     } | ||||
| 
 | ||||
|     plaintext_processing(plaintext) { | ||||
| @@ -65,7 +55,7 @@ class keccakAEAD { | ||||
|                 r[i] = chunk[i] ^ to_xor[i]; | ||||
|             } | ||||
|             cipherchunks.push(r); | ||||
|             input = kdf.concatUint8Arrays(r, c); | ||||
|             input = concatUint8Arrays(r, c); | ||||
|             this.state = keccak.SHAKE256(input, 40); | ||||
|         }); | ||||
|         return cipherchunks; | ||||
| @@ -86,7 +76,7 @@ class keccakAEAD { | ||||
|                 r[i] = chunk[i] ^ to_xor[i]; | ||||
|             } | ||||
|             plaintextchunks.push(r); | ||||
|             input = kdf.concatUint8Arrays(chunk, c); | ||||
|             input = concatUint8Arrays(chunk, c); | ||||
|             this.state = keccak.SHAKE256(input, 40); | ||||
|         }); | ||||
|         return plaintextchunks; | ||||
| @@ -95,11 +85,11 @@ class keccakAEAD { | ||||
|     finalize(key) { | ||||
|         let r = this.state.slice(0, 16); | ||||
|         let c = this.state.slice(16, 40); | ||||
|         let padded_key = kdf.concatUint8Arrays(new Uint8Array(24-key.length), key); | ||||
|         let padded_key = concatUint8Arrays(new Uint8Array(24-key.length), key); | ||||
|         for (let i = 0; i < padded_key.length; i++) { | ||||
|             c[i] ^= padded_key[i]; | ||||
|         } | ||||
|         this.state = kdf.concatUint8Arrays(r, c); | ||||
|         this.state = concatUint8Arrays(r, c); | ||||
|         const output = keccak.SHAKE256(this.state, 40); | ||||
|         let to_xor = output.slice(40-key.length, 40); | ||||
|         let tag = new Uint8Array(key.length); | ||||
| @@ -113,7 +103,7 @@ class keccakAEAD { | ||||
|         let sponge = new keccakAEAD(iv, key, nonce); | ||||
|         sponge.associated_data_processing(associated_data); | ||||
|         let cipherChunks = sponge.plaintext_processing(plaintext); | ||||
|         let ciphertext = kdf.concatUint8Arrays(...cipherChunks); | ||||
|         let ciphertext = concatUint8Arrays(...cipherChunks); | ||||
|         let tag = sponge.finalize(key); | ||||
|         return { | ||||
|             cipher: ciphertext, | ||||
| @@ -125,7 +115,7 @@ class keccakAEAD { | ||||
|         let sponge = new keccakAEAD(iv, key, nonce); | ||||
|         sponge.associated_data_processing(associated_data); | ||||
|         let plaintextChunks = sponge.ciphertext_processing(ciphertext); | ||||
|         let plaintext = kdf.concatUint8Arrays(...plaintextChunks); | ||||
|         let plaintext = concatUint8Arrays(...plaintextChunks); | ||||
|         let tag = sponge.finalize(key); | ||||
|         return { | ||||
|             plaintext: plaintext, | ||||
| @@ -134,4 +124,4 @@ class keccakAEAD { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module.exports = { keccakAEAD }; | ||||
| export { keccakAEAD }; | ||||
							
								
								
									
										22
									
								
								src/public/arrayutils.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/public/arrayutils.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| function concatUint8Arrays(...arrays) { | ||||
|     let totalLength = arrays.reduce((acc, arr) => acc + arr.length, 0); | ||||
|     let result = new Uint8Array(totalLength); | ||||
|     let offset = 0; | ||||
|     for (const arr of arrays) { | ||||
|         result.set(arr, offset); | ||||
|         offset += arr.length; | ||||
|     } | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| function splitIntoChunks(data) { | ||||
|     const chunks = []; | ||||
|     const chunkSize = 16; | ||||
|     for (let i = 0; i < data.length; i += chunkSize) { | ||||
|         const chunk = data.slice(i, i + chunkSize); | ||||
|         chunks.push(chunk); | ||||
|     } | ||||
|     return chunks; | ||||
| } | ||||
|  | ||||
| export { concatUint8Arrays, splitIntoChunks }; | ||||
| @@ -1,4 +1,6 @@ | ||||
| import { genKeys, sharedKey } from "./ecdh.js"; | ||||
| import { keccakAEAD } from "./aead.js"; | ||||
| import { keccakKDF } from "./kdf.js"; | ||||
|  | ||||
| const socket = io(); | ||||
| let secret = null; | ||||
| @@ -47,7 +49,7 @@ export function create_listener(form, input) { | ||||
| } | ||||
|  | ||||
| const fromHexString = (hexString) => | ||||
|   Uint8Array.from(hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16))); | ||||
|     Uint8Array.from(hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16))); | ||||
|  | ||||
| const toHexString = (bytes) => | ||||
|   bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), ''); | ||||
|     bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), ''); | ||||
|   | ||||
| @@ -1,16 +1,5 @@ | ||||
| const keccak = require('./keccak'); | ||||
| 
 | ||||
| function concatUint8Arrays(...arrays) { | ||||
|     let totalLength = arrays.reduce((acc, arr) => acc + arr.length, 0); | ||||
|     let result = new Uint8Array(totalLength); | ||||
|     let offset = 0; | ||||
|     for (const arr of arrays) { | ||||
|         result.set(arr, offset); | ||||
|         offset += arr.length; | ||||
|     } | ||||
|     return result; | ||||
| } | ||||
| 
 | ||||
| import { concatUint8Arrays } from './arrayutils.js'; | ||||
| import { keccak } from './keccak.js'; | ||||
| 
 | ||||
| class keccakKDF { | ||||
|     constructor(encryptionKeyLength = 32, privateKeyLength = 32) { | ||||
| @@ -36,5 +25,4 @@ class keccakKDF { | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| module.exports = { keccakKDF, concatUint8Arrays }; | ||||
| export { keccakKDF }; | ||||
| @@ -168,4 +168,4 @@ const keccak = { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module.exports = keccak; | ||||
| export { keccak }; | ||||
| @@ -15,6 +15,9 @@ html(lang="en-US") | ||||
|       script(type="module", src="/rooms.js", defer) | ||||
|       script(type="module", src="/ecdh.js", defer) | ||||
|       script(type="module", src="/popups-logged.js", defer) | ||||
|       script(type="module", src="/keccak.js", defer) | ||||
|       script(type="module", src="/aead.js", defer) | ||||
|       script(type="module", src="/kdf.js", defer) | ||||
|     else | ||||
|        script(type="module", src="/popups.js", defer) | ||||
|        script(type="module", src="/register.js", defer) | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| const aead = require('../src/aead'); | ||||
| import { keccakAEAD } from '../src/public/aead'; | ||||
| const crypto = require('crypto'); | ||||
| const stringutils = require('../src/stringutils'); | ||||
|  | ||||
| @@ -17,10 +17,10 @@ describe('aead.js functions', () => { | ||||
|         let iv = generateRandomUint8Array(); | ||||
|         let nonce = generateRandomUint8Array(); | ||||
|         let key = generateRandomUint8Array(); | ||||
|         let result = aead.keccakAEAD.encrypt(key, msg, iv, ad, nonce); | ||||
|         let result = keccakAEAD.encrypt(key, msg, iv, ad, nonce); | ||||
|         let tag_encrypt_hex = stringutils.arrayToHex(result.tag); | ||||
|         let cipher_hex = stringutils.arrayToHex(result.cipher); | ||||
|         let result2 = aead.keccakAEAD.decrypt(key, result.cipher, iv, ad, nonce); | ||||
|         let result2 = keccakAEAD.decrypt(key, result.cipher, iv, ad, nonce); | ||||
|         let tag_decrypt_hex = stringutils.arrayToHex(result2.tag); | ||||
|         let decrypted_hex = stringutils.arrayToHex(result2.plaintext); | ||||
|         expect(decrypted_hex).toBe(msg_hex); | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| const keccak = require('../src/keccak'); | ||||
| import { keccak } from '../src/public/keccak'; | ||||
| const stringutils = require('../src/stringutils'); | ||||
|  | ||||
| describe('keccak.js functions', () => { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user