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