///|
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))
}