Skip to content

ml-kem-0.2.1 incorrect overflow error #246

@lcnr

Description

@lcnr

the crate ml-kem-0.2.1 compiles with the old solver but errors with new

error[E0275]: overflow evaluating the requirement `<P as PkeParams>::NttVectorSize == _`
   --> src/param.rs:206:26
    |
206 |     type NttVectorSize = EncodedPolynomialVectorSize<U12, P::K>;
    |                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`ml_kem`)

relies on rust-lang/rust#147266 to avoid an ICE.

It's got some very cursed where-clauses, here's a self-contained (only typenum) example:

use typenum::*;
use std::ops::{Add, Div, Mul, Rem, Sub};
pub trait ParameterSet {
    type K;
    type Du: VectorEncodingSize<Self::K>;
    type Dv: EncodingSize;
}

pub trait EncodingSize {
    type EncodedPolynomialSize;
    type ValueStep;
    type ByteStep;
}
impl<D> EncodingSize for D
where
    D: Mul<U8> + Gcd<U8> + Mul<U32>,
    Prod<D, U8>: Div<Gcf<D, U8>>,
    EncodingUnit<D>: Div<D> + Div<U8>,
{
    type EncodedPolynomialSize = Prod<D, U32>;
    type ValueStep = Quot<EncodingUnit<D>, D>;
    type ByteStep = Quot<EncodingUnit<D>, U8>;
}

pub trait VectorEncodingSize<K>: EncodingSize {
    type EncodedPolynomialVectorSize;
}
impl<D, K> VectorEncodingSize<K> for D
where
    D: EncodingSize,
    D::EncodedPolynomialSize: Mul<K>,
    Prod<D::EncodedPolynomialSize, K>:
        Div<K, Output = D::EncodedPolynomialSize> + Rem<K, Output = U0>,
{
    type EncodedPolynomialVectorSize = Prod<D::EncodedPolynomialSize, K>;
}

type EncodingUnit<D> = Quot<Prod<D, U8>, Gcf<D, U8>>;
pub type EncodedPolynomialVectorSize<D, K> =
    <D as VectorEncodingSize<K>>::EncodedPolynomialVectorSize;
pub type EncodedPolynomialSize<D> = <D as EncodingSize>::EncodedPolynomialSize;
type EncodedUSize<P> = EncodedPolynomialVectorSize<<P as ParameterSet>::Du, <P as ParameterSet>::K>;
type EncodedVSize<P> = EncodedPolynomialSize<<P as ParameterSet>::Dv>;

fn foo<P>()
where
    P: ParameterSet,
    U384: Mul<P::K>,
    Prod<U384, P::K>: Add<U32> + Div<P::K, Output = U384> + Rem<P::K, Output = U0>,
    EncodedUSize<P>: Add<EncodedVSize<P>>,
    Sum<EncodedUSize<P>, EncodedVSize<P>>: Sub<EncodedUSize<P>, Output = EncodedVSize<P>>,
    EncodedPolynomialVectorSize<U12, P::K>: Add<U32>,
    Sum<EncodedPolynomialVectorSize<U12, P::K>, U32>:
        Sub<EncodedPolynomialVectorSize<U12, P::K>, Output = U32>,
{
}
fn main() {}

Metadata

Metadata

Assignees

No one assigned

    Labels

    from-craterA regression found via a crater run, not part of our test suite

    Type

    No type

    Projects

    Status

    todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions