forked from quic-issues/427e7578-d7bf-49c8-aee9-2dd999e25316
42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
// utils/crypto.ts
|
|
export const generateUserKeyPair = async () => {
|
|
return await window.crypto.subtle.generateKey(
|
|
{
|
|
name: "RSASSA-PKCS1-v1_5",
|
|
modulusLength: 2048,
|
|
publicExponent: new Uint8Array([1, 0, 1]), // 65537
|
|
hash: "SHA-256",
|
|
},
|
|
true, // extractable
|
|
["sign", "verify"]
|
|
);
|
|
};
|
|
|
|
export const signVote = async (data: any, privateKey: CryptoKey) => {
|
|
const encoder = new TextEncoder();
|
|
const encodedData = encoder.encode(JSON.stringify(data));
|
|
|
|
const signature = await window.crypto.subtle.sign(
|
|
"RSASSA-PKCS1-v1_5",
|
|
privateKey,
|
|
encodedData
|
|
);
|
|
|
|
// Convert to Base64 or Hex to store in Yjs easily
|
|
return btoa(String.fromCharCode(...new Uint8Array(signature)));
|
|
};
|
|
|
|
export const verifyVote = async (data: any, signatureStr: string, publicKey: CryptoKey) => {
|
|
const encoder = new TextEncoder();
|
|
const encodedData = encoder.encode(JSON.stringify(data));
|
|
|
|
// Convert Base64 back to Uint8Array
|
|
const signature = Uint8Array.from(atob(signatureStr), c => c.charCodeAt(0));
|
|
|
|
return await window.crypto.subtle.verify(
|
|
"RSASSA-PKCS1-v1_5",
|
|
publicKey,
|
|
signature,
|
|
encodedData
|
|
);
|
|
}; |