130 lines
2.3 KiB
V
130 lines
2.3 KiB
V
// Copyright 2025 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
//
|
|
// Ported to V from Go's crypto/internal/fips140/mldsa.
|
|
module mldsa
|
|
|
|
// s. 4, table 1
|
|
pub enum Kind {
|
|
ml_dsa_44
|
|
ml_dsa_65
|
|
ml_dsa_87
|
|
}
|
|
|
|
fn (k Kind) params() Params {
|
|
return match k {
|
|
.ml_dsa_44 { params_44 }
|
|
.ml_dsa_65 { params_65 }
|
|
.ml_dsa_87 { params_87 }
|
|
}
|
|
}
|
|
|
|
pub fn (k Kind) public_key_size() int {
|
|
return pub_key_size(k.params())
|
|
}
|
|
|
|
pub fn (k Kind) private_key_size() int {
|
|
return priv_key_size(k.params())
|
|
}
|
|
|
|
pub fn (k Kind) signature_size() int {
|
|
return sig_size(k.params())
|
|
}
|
|
|
|
// FIPS 204 s. 5.4: approved pre-hash functions for HashML-DSA.
|
|
pub enum PreHash {
|
|
none // pure ML-DSA (default)
|
|
sha2_224
|
|
sha2_256
|
|
sha2_384
|
|
sha2_512
|
|
sha2_512_224
|
|
sha2_512_256
|
|
sha3_224
|
|
sha3_256
|
|
sha3_384
|
|
sha3_512
|
|
shake_128
|
|
shake_256
|
|
}
|
|
|
|
@[params]
|
|
pub struct SignerOpts {
|
|
pub:
|
|
context string
|
|
deterministic bool
|
|
prehash PreHash
|
|
}
|
|
|
|
struct Params {
|
|
k int
|
|
l int
|
|
eta int
|
|
gamma1 int
|
|
gamma2 int
|
|
lambda int
|
|
tau int
|
|
omega int
|
|
}
|
|
|
|
// s. 4, table 1
|
|
const params_44 = Params{
|
|
k: 4
|
|
l: 4
|
|
eta: 2
|
|
gamma1: 17
|
|
gamma2: 88
|
|
lambda: 128
|
|
tau: 39
|
|
omega: 80
|
|
}
|
|
|
|
const params_65 = Params{
|
|
k: 6
|
|
l: 5
|
|
eta: 4
|
|
gamma1: 19
|
|
gamma2: 32
|
|
lambda: 192
|
|
tau: 49
|
|
omega: 55
|
|
}
|
|
|
|
const params_87 = Params{
|
|
k: 8
|
|
l: 7
|
|
eta: 2
|
|
gamma1: 19
|
|
gamma2: 32
|
|
lambda: 256
|
|
tau: 60
|
|
omega: 75
|
|
}
|
|
|
|
pub const seed_size = 32
|
|
|
|
// s. 4, table 2
|
|
pub const public_key_size_44 = 32 + 4 * n * 10 / 8
|
|
pub const public_key_size_65 = 32 + 6 * n * 10 / 8
|
|
pub const public_key_size_87 = 32 + 8 * n * 10 / 8
|
|
|
|
// s. 4, table 2
|
|
pub const signature_size_44 = 128 / 4 + 4 * n * (17 + 1) / 8 + 80 + 4
|
|
pub const signature_size_65 = 192 / 4 + 5 * n * (19 + 1) / 8 + 55 + 6
|
|
pub const signature_size_87 = 256 / 4 + 7 * n * (19 + 1) / 8 + 75 + 8
|
|
|
|
fn pub_key_size(p Params) int {
|
|
return 32 + p.k * n * 10 / 8
|
|
}
|
|
|
|
fn priv_key_size(p Params) int {
|
|
eta_bitlen := bits_len(u32(p.eta * 2))
|
|
// rho + K + tr + l*n*eta-bit s1 + k*n*eta-bit s2 + k*n*13-bit t0
|
|
return 32 + 32 + 64 + p.l * n * eta_bitlen / 8 + p.k * n * eta_bitlen / 8 + p.k * n * 13 / 8
|
|
}
|
|
|
|
fn sig_size(p Params) int {
|
|
return (p.lambda / 4) + p.l * n * (p.gamma1 + 1) / 8 + p.omega + p.k
|
|
}
|