///|
suberror SignError String
///| Bit-pack public key pk = (rho, t1).
pub fn pack_pk(rho : Array[Byte], t1 : Polyveck) -> Array[Byte] {
let k = dilithium_context.get_params_set().k
let pk : Array[Byte] = Array::new()
pk.append(rho)
for i in 0.. (Array[Byte], Polyveck) {
let k = dilithium_context.get_params_set().k
let rho = pk[0:SEEDBYTES].to_array()
let t1 : Polyveck = Polyveck::default()
for i in 0.. Array[Byte] {
let k = dilithium_context.get_params_set().k
let l = dilithium_context.get_params_set().l
let sk : Array[Byte] = Array::new()
sk.append(rho)
sk.append(key)
sk.append(tr)
for i in 0.. (Array[Byte], Array[Byte], Array[Byte], Polyveck, Polyvecl, Polyveck) {
let k = dilithium_context.get_params_set().k
let l = dilithium_context.get_params_set().l
let polyeta_packedbytes = dilithium_context.get_params_set().polyeta_packedbytes
let mut idx = 0
let rho = sk[0:SEEDBYTES].to_array()
idx += SEEDBYTES
let key = sk[idx:idx + SEEDBYTES].to_array()
idx += SEEDBYTES
let tr = sk[idx:idx + SEEDBYTES].to_array()
idx += SEEDBYTES
let s1 : Polyvecl = Polyvecl::default()
for i in 0.. Array[Byte] {
let k = dilithium_context.get_params_set().k
let l = dilithium_context.get_params_set().l
let omega = dilithium_context.get_params_set().omega
let polyz_packed_bytes = dilithium_context.get_params_set().polyz_packed_bytes
let mut idx = 0
match c {
Some(challenge) =>
for i in 0.. ()
}
idx += SEEDBYTES
for i in 0.. Result[(Polyvecl, Polyveck, Array[Byte]), SignError] {
let k = dilithium_context.get_params_set().k
let l = dilithium_context.get_params_set().l
let omega = dilithium_context.get_params_set().omega
let polyz_packed_bytes = dilithium_context.get_params_set().polyz_packed_bytes
let z = Polyvecl::default()
let h = Polyveck::default()
let c = Array::new()
let mut idx = 0
c.append(sig[0:SEEDBYTES].to_array())
idx += SEEDBYTES
for i in 0.. omega.to_byte() {
return Err(SignError("Invalid signature"))
}
for j in cnt.. cnt && sig[idx + j] <= sig[idx + j - 1] {
return Err(SignError("Invalid signature"))
}
h.vec[i].coeffs[sig[idx + j].to_int()] = 1
}
cnt = sig[idx + omega + i].to_int()
}
// Extra indices are zero for strong unforgeability
for j in cnt.. 0 {
return Err(SignError("Invalid signature"))
}
}
Ok((z, h, c))
}