Upload files to "/"
Running "node lib-dqx-test.mjs" will: 1. Generate a secret key and print it out. 2. Generate a public key and print it out. 3. Generate a second key pair and print out only the public key. 4. Hash the second public key with SHA-256. 5. Sign the hash with the secret key of the first key pair. 6. Verify the signature with the public key of the first key pair.
This commit is contained in:
		
							parent
							
								
									457dcb3ca9
								
							
						
					
					
						commit
						676d349ca3
					
				
							
								
								
									
										95
									
								
								api.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								api.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,95 @@ | ||||
| import DilithiumModule from "./wasm.cjs"; | ||||
| import {Buffer} from "buffer/index.js"; | ||||
| 
 | ||||
| async function dilithiumInit({randomBytes}) { | ||||
|     let mod = await DilithiumModule(); | ||||
| 
 | ||||
|     if (!randomBytes) { | ||||
|         randomBytes = () => { | ||||
|             throw new Error("Random generator implementation not provided but required."); | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     global.dilithium_randombytes = (function (out, outlen) { | ||||
|         let buf = this.HEAPU8.subarray(out, out + outlen); | ||||
|         let randomBytesBuffer = randomBytes(outlen); | ||||
|         buf.set(new Uint8Array(randomBytesBuffer), 0); | ||||
|     }).bind(mod); | ||||
| 
 | ||||
|     return mod; | ||||
| } | ||||
| 
 | ||||
| async function dilithiumGenKeyPair({randomBytes}) { | ||||
|     const mod = await dilithiumInit({randomBytes}); | ||||
| 
 | ||||
|     if (mod._dilithium_gen_key_pair() === 0) { | ||||
|         let pk_ptr = mod._get_pk_buffer(); | ||||
|         let pk_len = mod._get_pk_length(); | ||||
|         const pk = new Uint8Array(mod.HEAP8.buffer, pk_ptr, pk_len); | ||||
| 
 | ||||
|         let sk_ptr = mod._get_sk_buffer(); | ||||
|         let sk_len = mod._get_sk_length(); | ||||
|         const sk = new Uint8Array(mod.HEAP8.buffer, sk_ptr, sk_len); | ||||
| 
 | ||||
|         return { publicKey: Buffer.from(pk), secretKey: Buffer.from(sk) }; | ||||
|     } else { | ||||
|         throw new Error('Failed to generate key pair.'); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| async function dilithiumSign({secretKey, challenge}) { | ||||
|     const mod = await dilithiumInit({}); | ||||
| 
 | ||||
|     if (challenge.length !== 32) { | ||||
|         throw new Error('Challenge buffer must be 32 bytes long.'); | ||||
|     } | ||||
| 
 | ||||
|     let m_ptr = mod._get_m_buffer(); | ||||
|     let m_len = mod._get_m_length(); | ||||
|     const m = new Uint8Array(mod.HEAP8.buffer, m_ptr, m_len); | ||||
| 
 | ||||
|     let sk_ptr = mod._get_sk_buffer(); | ||||
|     let sk_len = mod._get_sk_length(); | ||||
|     const sk = new Uint8Array(mod.HEAP8.buffer, sk_ptr, sk_len); | ||||
| 
 | ||||
|     let sig_ptr = mod._get_sig_buffer(); | ||||
|     let sig_len = mod._get_sig_length(); | ||||
|     const sig = new Uint8Array(mod.HEAP8.buffer, sig_ptr, sig_len); | ||||
| 
 | ||||
|     sk.set(Buffer.from(secretKey, 'hex'), 0); | ||||
|     m.set(Buffer.from(challenge, 'hex'), 0); | ||||
| 
 | ||||
|     if (mod._dilithium_sign() === 0) { | ||||
|         return Buffer.from(sig); | ||||
|     } else { | ||||
|         throw new Error('Failed to sign message.'); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| async function dilithiumVerifySig({publicKey, challenge, signature}) { | ||||
|     const mod = await dilithiumInit({}); | ||||
| 
 | ||||
|     if (challenge.length !== 32) { | ||||
|         throw new Error('Challenge buffer must be 32 bytes long.'); | ||||
|     } | ||||
| 
 | ||||
|     let m_ptr = mod._get_m_buffer(); | ||||
|     let m_len = mod._get_m_length(); | ||||
|     const m = new Uint8Array(mod.HEAP8.buffer, m_ptr, m_len); | ||||
| 
 | ||||
|     let sig_ptr = mod._get_sig_buffer(); | ||||
|     let sig_len = mod._get_sig_length(); | ||||
|     const sig = new Uint8Array(mod.HEAP8.buffer, sig_ptr, sig_len); | ||||
| 
 | ||||
|     let pk_ptr = mod._get_pk_buffer(); | ||||
|     let pk_len = mod._get_pk_length(); | ||||
|     const pk = new Uint8Array(mod.HEAP8.buffer, pk_ptr, pk_len); | ||||
| 
 | ||||
|     pk.set(publicKey, 0); | ||||
|     sig.set(signature, 0); | ||||
|     m.set(challenge, 0); | ||||
| 
 | ||||
|     return mod._dilithium_verify_signature() === 0; | ||||
| } | ||||
| 
 | ||||
| export { dilithiumGenKeyPair, dilithiumSign, dilithiumVerifySig }; | ||||
							
								
								
									
										36
									
								
								lib-dqx-test.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								lib-dqx-test.mjs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | ||||
| import { dilithiumGenKeyPair, dilithiumSign, dilithiumVerifySig } from './api.js'; | ||||
| import { randomBytes, createHash } from 'crypto'; | ||||
| 
 | ||||
| async function testDilithium() { | ||||
|     try { | ||||
|         // Generate the first key pair
 | ||||
|         const { publicKey: publicKey1, secretKey: secretKey1 } = await dilithiumGenKeyPair({ randomBytes }); | ||||
|         console.log("First Key Pair Generated."); | ||||
|         console.log("Secret Key 1:", secretKey1.toString('hex')); | ||||
|         console.log("Public Key 1:", publicKey1.toString('hex')); | ||||
| 
 | ||||
|         // Generate the second key pair
 | ||||
|         const { publicKey: publicKey2 } = await dilithiumGenKeyPair({ randomBytes }); | ||||
|         console.log("Second Key Pair Generated."); | ||||
|         console.log("Public Key 2:", publicKey2.toString('hex')); | ||||
| 
 | ||||
|         // Hash the second public key using SHA-256
 | ||||
|         const hash = createHash('sha256'); | ||||
|         hash.update(publicKey2); | ||||
|         const hashedPublicKey2 = hash.digest(); | ||||
|         console.log("Hashed Public Key 2:", hashedPublicKey2.toString('hex')); | ||||
| 
 | ||||
|         // Sign the hash with the first secret key
 | ||||
|         const signature = await dilithiumSign({ secretKey: secretKey1, challenge: hashedPublicKey2 }); | ||||
|         console.log("Signature:", signature.toString('hex')); | ||||
| 
 | ||||
|         // Verify the signature with the first public key
 | ||||
|         const isValid = await dilithiumVerifySig({ publicKey: publicKey1, challenge: hashedPublicKey2, signature }); | ||||
|         console.log("Signature Validity:", isValid); | ||||
| 
 | ||||
|     } catch (error) { | ||||
|         console.error("Error in testDilithium:", error); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| testDilithium(); | ||||
							
								
								
									
										3
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| { | ||||
|   "type": "module" | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user