UNPKG

@btc-vision/btc-runtime

Version:

Bitcoin L1 Smart Contract Runtime for OP_NET. Build decentralized applications on Bitcoin using AssemblyScript and WebAssembly. Fully audited.

182 lines (164 loc) 4.96 kB
import { Revert } from '../../types/Revert'; export enum MLDSASecurityLevel { Level2 = 0, Level3 = 1, Level5 = 2, } /** * ML-DSA Public Key Metadata enum for quantum-resistant signatures */ export enum MLDSAPublicKeyMetadata { MLDSA44 = 1312, MLDSA65 = 1952, MLDSA87 = 2592, } /** * Utility class for ML-DSA metadata operations */ export class MLDSAMetadata { /** * Creates metadata from security level */ static fromLevel(level: MLDSASecurityLevel): MLDSAPublicKeyMetadata { switch (level) { case MLDSASecurityLevel.Level2: return MLDSAPublicKeyMetadata.MLDSA44; case MLDSASecurityLevel.Level3: return MLDSAPublicKeyMetadata.MLDSA65; case MLDSASecurityLevel.Level5: return MLDSAPublicKeyMetadata.MLDSA87; default: throw new Revert('Invalid ML-DSA security level'); } } /** * Creates metadata from public key byte length */ static fromBytesLen(len: u32): MLDSAPublicKeyMetadata { switch (len) { case 1312: return MLDSAPublicKeyMetadata.MLDSA44; case 1952: return MLDSAPublicKeyMetadata.MLDSA65; case 2592: return MLDSAPublicKeyMetadata.MLDSA87; default: throw new Revert('Invalid ML-DSA public key length'); } } /** * Converts metadata to security level */ static toLevel(metadata: MLDSAPublicKeyMetadata): u8 { switch (metadata) { case MLDSAPublicKeyMetadata.MLDSA44: return 0; case MLDSAPublicKeyMetadata.MLDSA65: return 1; case MLDSAPublicKeyMetadata.MLDSA87: return 2; default: return 0; } } /** * Gets the NIST security level */ static securityLevel(metadata: MLDSAPublicKeyMetadata): u8 { switch (metadata) { case MLDSAPublicKeyMetadata.MLDSA44: return 2; case MLDSAPublicKeyMetadata.MLDSA65: return 3; case MLDSAPublicKeyMetadata.MLDSA87: return 5; default: return 0; } } /** * Gets the private key length in bytes */ static privateKeyLen(metadata: MLDSAPublicKeyMetadata): u32 { switch (metadata) { case MLDSAPublicKeyMetadata.MLDSA44: return 2560; case MLDSAPublicKeyMetadata.MLDSA65: return 4032; case MLDSAPublicKeyMetadata.MLDSA87: return 4896; default: return 0; } } /** * Gets the signature length in bytes */ static signatureLen(metadata: MLDSAPublicKeyMetadata): i32 { switch (metadata) { case MLDSAPublicKeyMetadata.MLDSA44: return 2420; case MLDSAPublicKeyMetadata.MLDSA65: return 3309; case MLDSAPublicKeyMetadata.MLDSA87: return 4627; default: return 0; } } /** * Converts metadata to u64 */ static asU64(metadata: MLDSAPublicKeyMetadata): u64 { return metadata as u64; } /** * Converts metadata to u32 */ static asU32(metadata: MLDSAPublicKeyMetadata): u32 { return metadata as u32; } /** * Converts metadata to u16 */ static asU16(metadata: MLDSAPublicKeyMetadata): u16 { return metadata as u16; } /** * Gets the algorithm name */ static name(metadata: MLDSAPublicKeyMetadata): string { switch (metadata) { case MLDSAPublicKeyMetadata.MLDSA44: return 'ML-DSA-44'; case MLDSAPublicKeyMetadata.MLDSA65: return 'ML-DSA-65'; case MLDSAPublicKeyMetadata.MLDSA87: return 'ML-DSA-87'; default: return 'Unknown'; } } /** * Attempts to create metadata from u32 value */ static tryFromU32(value: u32): MLDSAPublicKeyMetadata { return MLDSAMetadata.fromBytesLen(value); } /** * Helper to check if a value is valid metadata */ static isValid(value: u32): boolean { return value === 1312 || value === 1952 || value === 2592; } } // Export constants for convenience export const MLDSA44_PUBLIC_KEY_LEN: u32 = 1312; export const MLDSA65_PUBLIC_KEY_LEN: u32 = 1952; export const MLDSA87_PUBLIC_KEY_LEN: u32 = 2592; export const MLDSA44_PRIVATE_KEY_LEN: u32 = 2560; export const MLDSA65_PRIVATE_KEY_LEN: u32 = 4032; export const MLDSA87_PRIVATE_KEY_LEN: u32 = 4896; export const MLDSA44_SIGNATURE_LEN: u32 = 2420; export const MLDSA65_SIGNATURE_LEN: u32 = 3309; export const MLDSA87_SIGNATURE_LEN: u32 = 4627;