From e624c0d6e2041d106dff68d6fbe735cb680d2f7c Mon Sep 17 00:00:00 2001 From: Franziskus Kiefer Date: Fri, 23 Jun 2023 19:27:58 +0200 Subject: [PATCH 1/4] poly1305 rust --- Cargo.toml | 1 + poly1305-rust/Cargo.toml | 27 ++++++ poly1305-rust/benches/benchmarks.rs | 26 +++++ poly1305-rust/natmod/Cargo.toml | 14 +++ poly1305-rust/natmod/src/lib.rs | 128 +++++++++++++++++++++++++ poly1305-rust/natmod/tests/poly1305.rs | 17 ++++ poly1305-rust/src/hacspec_helper.rs | 6 ++ poly1305-rust/src/poly1305.rs | 110 +++++++++++++++++++++ poly1305-rust/tests/test_poly1305.rs | 42 ++++++++ 9 files changed, 371 insertions(+) create mode 100644 poly1305-rust/Cargo.toml create mode 100644 poly1305-rust/benches/benchmarks.rs create mode 100644 poly1305-rust/natmod/Cargo.toml create mode 100644 poly1305-rust/natmod/src/lib.rs create mode 100644 poly1305-rust/natmod/tests/poly1305.rs create mode 100644 poly1305-rust/src/hacspec_helper.rs create mode 100644 poly1305-rust/src/poly1305.rs create mode 100644 poly1305-rust/tests/test_poly1305.rs diff --git a/Cargo.toml b/Cargo.toml index 4e06422..7bdf689 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ members = [ "curve25519", "chacha20", "poly1305", + "poly1305-rust", "chacha20poly1305", "gimli", "sha256", diff --git a/poly1305-rust/Cargo.toml b/poly1305-rust/Cargo.toml new file mode 100644 index 0000000..3728d9e --- /dev/null +++ b/poly1305-rust/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "poly1305" +version = "0.1.0" +authors = ["Franziskus Kiefer "] +edition = "2021" +license = "MIT OR Apache-2.0" +description = "hacspec poly1305 message authentication code" +readme = "README.md" +repository = "https://github.com/hacspec/specs" + +[lib] +path = "src/poly1305.rs" + +[dependencies] +num-bigint = "0.4" +natmod = { path = "./natmod" } + +[dev-dependencies] +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } +rayon = "1.3.0" +criterion = "0.4" +rand = "0.8" + +[[bench]] +name = "benchmarks" +harness = false diff --git a/poly1305-rust/benches/benchmarks.rs b/poly1305-rust/benches/benchmarks.rs new file mode 100644 index 0000000..40e180e --- /dev/null +++ b/poly1305-rust/benches/benchmarks.rs @@ -0,0 +1,26 @@ +#[macro_use] +extern crate criterion; +use criterion::{BatchSize, Criterion}; + +use hacspec_dev::rand::random_byte_vec; +use hacspec_lib::prelude::*; +use hacspec_poly1305::*; + +fn benchmark(c: &mut Criterion) { + c.bench_function("Poly1305", |b| { + b.iter_batched( + || { + let key = PolyKey::from_public_slice(&random_byte_vec(32)); + let data = Seq::::from_public_slice(&random_byte_vec(1_000)); + (data, key) + }, + |(data, key)| { + let _tag = poly1305(&data, key); + }, + BatchSize::SmallInput, + ) + }); +} + +criterion_group!(benches, benchmark); +criterion_main!(benches); diff --git a/poly1305-rust/natmod/Cargo.toml b/poly1305-rust/natmod/Cargo.toml new file mode 100644 index 0000000..7cacd43 --- /dev/null +++ b/poly1305-rust/natmod/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "natmod" +version = "0.1.0" +edition = "2021" +authors = ["Franziskus Kiefer "] + +[lib] +proc-macro = true + +[dependencies] +hex = "0.4.3" +num-bigint = "0.4.3" +quote = "1.0.28" +syn = { version = "2.0.18", features = ["full"] } diff --git a/poly1305-rust/natmod/src/lib.rs b/poly1305-rust/natmod/src/lib.rs new file mode 100644 index 0000000..ecc2cc2 --- /dev/null +++ b/poly1305-rust/natmod/src/lib.rs @@ -0,0 +1,128 @@ +//! // This trait lives in the library +//! pub trait NatModTrait { +//! const MODULUS: T; +//! } +//! +//! #[nat_mod("123456", 10)] +//! struct MyNatMod {} + +use hex::FromHex; +use proc_macro::TokenStream; +use quote::quote; +use syn::{ + parse::Parse, parse_macro_input, DeriveInput, Ident, LitInt, LitStr, Meta, Result, Token, +}; + +#[derive(Clone, Debug)] +struct NatModAttr { + /// Modulus as hex string and bytes + mod_str: String, + mod_bytes: Vec, + /// Number of bytes to use for the integer + int_size: usize, +} + +impl Parse for NatModAttr { + fn parse(input: syn::parse::ParseStream) -> Result { + let mod_str = input.parse::()?.value(); + let mod_bytes = Vec::::from_hex(&mod_str).expect("Invalid hex String"); + input.parse::()?; + let int_size = input.parse::()?.base10_parse::()?; + assert!(input.is_empty(), "Left over tokens in attribute {input:?}"); + Ok(NatModAttr { + mod_str, + mod_bytes, + int_size, + }) + } +} + +#[proc_macro_attribute] +pub fn nat_mod(attr: TokenStream, item: TokenStream) -> TokenStream { + let item_ast = parse_macro_input!(item as DeriveInput); + let ident = item_ast.ident.clone(); + let args = parse_macro_input!(attr as NatModAttr); + + let num_bytes = args.int_size; + let modulus = args.mod_bytes; + let modulus_string = args.mod_str; + + let mut padded_modulus = vec![0u8; num_bytes - modulus.len()]; + padded_modulus.append(&mut modulus.clone()); + let mod_iter1 = padded_modulus.iter(); + let mod_iter2 = padded_modulus.iter(); + let mod_iter3 = padded_modulus.iter(); + let const_name = Ident::new( + &format!("{}_MODULUS", ident.to_string().to_uppercase()), + ident.span(), + ); + + let out_struct = quote! { + pub struct #ident { + value: [u8; #num_bytes], + } + + pub const #const_name: [u8; #num_bytes] = [#(#mod_iter1),*]; + + impl NatMod<#ident> for #ident { + const MODULUS: #ident = #ident { + value: [#(#mod_iter2),*] + }; + } + + impl #ident { + /// Get the modulus as string + pub fn modulus_string() -> String { + #modulus_string.to_string() + } + + /// Get the modulus as byte array + pub const fn modulus() -> [u8; #num_bytes] { + [#(#mod_iter3),*] + } + + /// New from hex string + pub fn from_hex(hex: &str) -> Self { + assert!(hex.len() % 2 == 0); + let l = hex.len() / 2; + assert!(l <= #num_bytes); + let mut value = [0u8; #num_bytes]; + let skip = #num_bytes - l; + for i in 0..l { + value[skip + i] = + u8::from_str_radix(&hex[2 * i..2 * i + 2], 16).expect("An unexpected error occurred."); + } + Self { + value + } + } + + /// Zero element + pub const fn zero() -> Self { + Self { + value: [0u8; #num_bytes] + } + } + } + + impl core::convert::AsRef<[u8]> for #ident { + fn as_ref(&self) -> &[u8] { + &self.value + } + } + + impl core::ops::Add for #ident { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + let lhs = num_bigint::BigUint::from_bytes_be(&self.value); + let rhs = num_bigint::BigUint::from_bytes_be(&rhs.value); + let res = (lhs + rhs) % num_bigint::BigUint::from_bytes_be(&Self::modulus()); + Self { + value: res.to_bytes_be().try_into().unwrap() + } + } + } + }; + out_struct.into() +} diff --git a/poly1305-rust/natmod/tests/poly1305.rs b/poly1305-rust/natmod/tests/poly1305.rs new file mode 100644 index 0000000..f8e14d3 --- /dev/null +++ b/poly1305-rust/natmod/tests/poly1305.rs @@ -0,0 +1,17 @@ +use natmod::nat_mod; + +/// This has to come from the lib. +pub trait NatMod { + const MODULUS: T; +} + +#[nat_mod("03fffffffffffffffffffffffffffffffb", 17)] +struct FieldElement {} + +#[test] +fn natmod() { + let x = FieldElement::from_hex("03fffffffffffffffffffffffffffffffa"); + let y = FieldElement::from_hex("01"); + let z = x + y; + assert_eq!(FieldElement::zero().as_ref(), z.as_ref()); +} diff --git a/poly1305-rust/src/hacspec_helper.rs b/poly1305-rust/src/hacspec_helper.rs new file mode 100644 index 0000000..663823a --- /dev/null +++ b/poly1305-rust/src/hacspec_helper.rs @@ -0,0 +1,6 @@ +use num_bigint::BigUint; + +pub struct NatMod { + value: BigUint, + modulus: BigUint, +} diff --git a/poly1305-rust/src/poly1305.rs b/poly1305-rust/src/poly1305.rs new file mode 100644 index 0000000..73dd4b1 --- /dev/null +++ b/poly1305-rust/src/poly1305.rs @@ -0,0 +1,110 @@ +// WARNING: +// This spec does not provide secret independence, and treats all keys as public. +// Consequently, it should only be used as a FORMAL SPEC, NOT as a reference implementation. + +mod hacspec_helper; +use hacspec_helper::*; + +// Type definitions for use in poly1305. +pub type PolyKey = [u8; 32]; + +const BLOCKSIZE: usize = 16; + +// These are type aliases for convenience +pub type PolyBlock = [u8; BLOCKSIZE]; + +// These are actual types; fixed-length arrays. +type Poly1305Tag = [u8; BLOCKSIZE]; + +// A byte sequence of length <= BLOCKSIZE +pub type SubBlock = Vec; + +// A length <= BLOCKSIZE +pub type BlockIndex = usize; + +// This defines the field for modulo 2^130-5. +// In particular `FieldElement` and `FieldCanvas` are defined. +// The `FieldCanvas` is an integer type with 131-bit (to hold 2*(2^130-5)). +// The `FieldElement` is a natural integer modulo 2^130-5. + +pub type FieldElement = NatMod<"03fffffffffffffffffffffffffffffffb", 17>; + +// public_nat_mod!( +// type_name: FieldElement, +// type_of_canvas: FieldCanvas, +// bit_size_of_field: 131, // This amounts to 17 bytes +// modulo_value: "03fffffffffffffffffffffffffffffffb" +// ); + +// Internal Poly1305 State +pub type PolyState = (FieldElement, FieldElement, PolyKey); //(accumulator,r,key) + +pub fn poly1305_encode_r(b: &PolyBlock) -> FieldElement { + let mut n = U128_from_le_bytes(U128Word::from_seq(b)); + n = n & U128(0x0fff_fffc_0fff_fffc_0fff_fffc_0fff_ffffu128); + FieldElement::from_secret_literal(n) +} + +pub fn poly1305_encode_block(b: &PolyBlock) -> FieldElement { + let n = U128_from_le_bytes(U128Word::from_seq(b)); + let f = FieldElement::from_secret_literal(n); + f + FieldElement::pow2(128) +} + +// In Poly1305 as used in this spec, pad_len is always the length of b, i.e. there is no padding +// In Chacha20Poly1305, pad_len is set to BLOCKSIZE +pub fn poly1305_encode_last(pad_len: BlockIndex, b: &SubBlock) -> FieldElement { + let n = U128_from_le_bytes(U128Word::from_slice(b, 0, b.len())); + let f = FieldElement::from_secret_literal(n); + f + FieldElement::pow2(8 * pad_len) +} + +pub fn poly1305_init(k: PolyKey) -> PolyState { + let r = poly1305_encode_r(&PolyBlock::from_slice(&k, 0, 16)); + (FieldElement::ZERO(), r, k) +} + +pub fn poly1305_update_block(b: &PolyBlock, st: PolyState) -> PolyState { + let (acc, r, k) = st; + ((poly1305_encode_block(b) + acc) * r, r, k) +} + +pub fn poly1305_update_blocks(m: &ByteSeq, st: PolyState) -> PolyState { + let mut st = st; + let n_blocks = m.len() / BLOCKSIZE; + for i in 0..n_blocks { + let block = PolyBlock::from_seq(&m.get_exact_chunk(BLOCKSIZE, i)); + st = poly1305_update_block(&block, st); + } + st +} + +pub fn poly1305_update_last(pad_len: usize, b: &SubBlock, st: PolyState) -> PolyState { + let mut st = st; + if b.len() != 0 { + let (acc, r, k) = st; + st = ((poly1305_encode_last(pad_len, b) + acc) * r, r, k); + } + st +} + +pub fn poly1305_update(m: &ByteSeq, st: PolyState) -> PolyState { + let st = poly1305_update_blocks(m, st); + let last = m.get_remainder_chunk(BLOCKSIZE); + poly1305_update_last(last.len(), &last, st) +} + +pub fn poly1305_finish(st: PolyState) -> Poly1305Tag { + let (acc, _, k) = st; + let n = U128_from_le_bytes(U128Word::from_slice(&k, 16, 16)); + let aby = acc.to_byte_seq_le(); + // We can't use from_seq here because the accumulator is larger than 16 bytes. + let a = U128_from_le_bytes(U128Word::from_slice(&aby, 0, 16)); + Poly1305Tag::from_seq(&U128_to_le_bytes(a + n)) +} + +pub fn poly1305(m: &ByteSeq, key: PolyKey) -> Poly1305Tag { + let mut st = poly1305_init(key); + st = poly1305_update(m, st); + poly1305_finish(st) +} diff --git a/poly1305-rust/tests/test_poly1305.rs b/poly1305-rust/tests/test_poly1305.rs new file mode 100644 index 0000000..f09b68f --- /dev/null +++ b/poly1305-rust/tests/test_poly1305.rs @@ -0,0 +1,42 @@ +use hacspec_lib::prelude::*; + +use hacspec_poly1305::*; + +#[test] +fn basic_test() { + // RFC 7539 Test Vectors + let msg = ByteSeq::from_public_slice(&[ + 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x46, + 0x6f, 0x72, 0x75, 0x6d, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, + 0x72, 0x6f, 0x75, 0x70, + ]); + let k = PolyKey::from_public_slice(&[ + 0x85, 0xd6, 0xbe, 0x78, 0x57, 0x55, 0x6d, 0x33, 0x7f, 0x44, 0x52, 0xfe, 0x42, 0xd5, 0x06, + 0xa8, 0x01, 0x03, 0x80, 0x8a, 0xfb, 0x0d, 0xb2, 0xfd, 0x4a, 0xbf, 0xf6, 0xaf, 0x41, 0x49, + 0xf5, 0x1b, + ]); + let expected = Poly1305Tag::from_public_slice(&[ + 0xa8, 0x06, 0x1d, 0xc1, 0x30, 0x51, 0x36, 0xc6, 0xc2, 0x2b, 0x8b, 0xaf, 0x0c, 0x01, 0x27, + 0xa9, + ]); + let computed = poly1305(&msg, k); + assert!(Poly1305Tag::declassify_eq(&expected, &computed)) +} + +#[test] +fn corner_case_test() { + let msg = ByteSeq::from_public_slice(&[ + 0, 0, 0, 0, 0, 0, 0, 0, 22, 3, 3, 0, 16, 0, 0, 0, 231, 158, 214, 194, 136, 21, 80, 132, + 115, 98, 192, 197, 90, 173, 113, 64, 13, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, + ]); + let k = PolyKey::from_public_slice(&[ + 0x07, 0xdb, 0xd6, 0xfd, 0x01, 0x03, 0x2c, 0x53, 0x64, 0x4b, 0x9f, 0x94, 0x76, 0x23, 0xbd, + 0x2d, 0x25, 0xec, 0x44, 0xc2, 0x08, 0xe1, 0x32, 0x23, 0xca, 0x8c, 0x5b, 0x89, 0x11, 0xbf, + 0x59, 0xe8, + ]); + let expected = Poly1305Tag::from_public_slice(&[ + 1, 66, 72, 238, 152, 119, 158, 102, 3, 127, 38, 148, 173, 28, 215, 205, + ]); + let computed = poly1305(&msg, k); + assert!(Poly1305Tag::declassify_eq(&expected, &computed)) +} From 878bde719c44c12bbe735e3324e4b1a003dab07c Mon Sep 17 00:00:00 2001 From: Franziskus Kiefer Date: Thu, 29 Jun 2023 19:36:53 +0200 Subject: [PATCH 2/4] poly1305 and natmod --- poly1305-rust/Cargo.toml | 4 - poly1305-rust/benches/benchmarks.rs | 26 - poly1305-rust/natmod/src/lib.rs | 116 +- poly1305-rust/natmod/tests/poly1305.rs | 24 +- poly1305-rust/out/Natmod.Nat_mod.fst | 6 + poly1305-rust/out/Natmod._.fst | 6 + poly1305-rust/out/Natmod.fst | 1800 ++++++++++++++++++++++++ poly1305-rust/src/hacspec_helper.rs | 9 +- poly1305-rust/src/poly1305.rs | 84 +- poly1305-rust/tests/test_poly1305.rs | 94 +- 10 files changed, 2055 insertions(+), 114 deletions(-) delete mode 100644 poly1305-rust/benches/benchmarks.rs create mode 100644 poly1305-rust/out/Natmod.Nat_mod.fst create mode 100644 poly1305-rust/out/Natmod._.fst create mode 100644 poly1305-rust/out/Natmod.fst diff --git a/poly1305-rust/Cargo.toml b/poly1305-rust/Cargo.toml index 3728d9e..0ea01a0 100644 --- a/poly1305-rust/Cargo.toml +++ b/poly1305-rust/Cargo.toml @@ -21,7 +21,3 @@ serde = { version = "1.0", features = ["derive"] } rayon = "1.3.0" criterion = "0.4" rand = "0.8" - -[[bench]] -name = "benchmarks" -harness = false diff --git a/poly1305-rust/benches/benchmarks.rs b/poly1305-rust/benches/benchmarks.rs deleted file mode 100644 index 40e180e..0000000 --- a/poly1305-rust/benches/benchmarks.rs +++ /dev/null @@ -1,26 +0,0 @@ -#[macro_use] -extern crate criterion; -use criterion::{BatchSize, Criterion}; - -use hacspec_dev::rand::random_byte_vec; -use hacspec_lib::prelude::*; -use hacspec_poly1305::*; - -fn benchmark(c: &mut Criterion) { - c.bench_function("Poly1305", |b| { - b.iter_batched( - || { - let key = PolyKey::from_public_slice(&random_byte_vec(32)); - let data = Seq::::from_public_slice(&random_byte_vec(1_000)); - (data, key) - }, - |(data, key)| { - let _tag = poly1305(&data, key); - }, - BatchSize::SmallInput, - ) - }); -} - -criterion_group!(benches, benchmark); -criterion_main!(benches); diff --git a/poly1305-rust/natmod/src/lib.rs b/poly1305-rust/natmod/src/lib.rs index ecc2cc2..a5a86ef 100644 --- a/poly1305-rust/natmod/src/lib.rs +++ b/poly1305-rust/natmod/src/lib.rs @@ -9,9 +9,7 @@ use hex::FromHex; use proc_macro::TokenStream; use quote::quote; -use syn::{ - parse::Parse, parse_macro_input, DeriveInput, Ident, LitInt, LitStr, Meta, Result, Token, -}; +use syn::{parse::Parse, parse_macro_input, DeriveInput, Ident, LitInt, LitStr, Result, Token}; #[derive(Clone, Debug)] struct NatModAttr { @@ -56,24 +54,37 @@ pub fn nat_mod(attr: TokenStream, item: TokenStream) -> TokenStream { &format!("{}_MODULUS", ident.to_string().to_uppercase()), ident.span(), ); + let static_name = Ident::new( + &format!("{}_MODULUS_STR", ident.to_string().to_uppercase()), + ident.span(), + ); let out_struct = quote! { + // #[hax(...)] + #[derive(Clone, Copy)] pub struct #ident { value: [u8; #num_bytes], } - pub const #const_name: [u8; #num_bytes] = [#(#mod_iter1),*]; + //#[not_hax] + // mod #ident_mod { + + // } + + const #const_name: [u8; #num_bytes] = [#(#mod_iter1),*]; + static #static_name: &str = #modulus_string; impl NatMod<#ident> for #ident { const MODULUS: #ident = #ident { value: [#(#mod_iter2),*] }; + const MODULUS_STR: &'static str = #modulus_string; } impl #ident { /// Get the modulus as string - pub fn modulus_string() -> String { - #modulus_string.to_string() + pub const fn modulus_string() -> &'static str { + #modulus_string } /// Get the modulus as byte array @@ -97,12 +108,66 @@ pub fn nat_mod(attr: TokenStream, item: TokenStream) -> TokenStream { } } + /// Get hex string representation of this. + pub fn to_hex(&self) -> String { + let strs: Vec = self.value.iter().map(|b| format!("{:02x}", b)).collect(); + strs.join("") + } + /// Zero element pub const fn zero() -> Self { Self { value: [0u8; #num_bytes] } } + + /// Returns 2 to the power of the argument + pub fn pow2(x: usize) -> Self { + let res = num_bigint::BigUint::from(1u32) << x; + res.into() + } + + /// Create a new [`#ident`] from a `u128` literal. + pub fn from_u128(literal: u128) -> Self { + Self::from(num_bigint::BigUint::from(literal)) + } + + /// Create a new [`#ident`] from a little endian byte slice. + pub fn from_le_bytes(bytes: &[u8]) -> Self { + Self::from(num_bigint::BigUint::from_bytes_le(bytes)) + } + + /// Create a new [`#ident`] from a little endian byte slice. + pub fn from_be_bytes(bytes: &[u8]) -> Self { + Self::from(num_bigint::BigUint::from_bytes_be(bytes)) + } + + pub fn to_le_bytes(self) -> [u8; #num_bytes] { + pad(&num_bigint::BigUint::from_bytes_be(&self.value).to_bytes_le()) + } + } + + fn pad(bytes: &[u8]) -> [u8; #num_bytes] { + let mut value = [0u8; #num_bytes]; + let upper = value.len(); + let lower = upper - bytes.len(); + value[lower..upper].copy_from_slice(&bytes); + value + } + + impl From for #ident { + fn from(x: num_bigint::BigUint) -> #ident { + let max_value = Self::modulus(); + assert!(x <= num_bigint::BigUint::from_bytes_be(&max_value), "{} is too large for type {}!", x, stringify!($ident)); + let repr = x.to_bytes_be(); + if repr.len() > #num_bytes { + panic!("{} is too large for type {}", x, stringify!(#ident)) + } + + Self { + value: pad(&repr) + } + } } impl core::convert::AsRef<[u8]> for #ident { @@ -111,18 +176,51 @@ pub fn nat_mod(attr: TokenStream, item: TokenStream) -> TokenStream { } } + impl core::fmt::Display for #ident { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!(f, "{}", self.to_hex()) + } + } + impl core::ops::Add for #ident { type Output = Self; fn add(self, rhs: Self) -> Self::Output { let lhs = num_bigint::BigUint::from_bytes_be(&self.value); let rhs = num_bigint::BigUint::from_bytes_be(&rhs.value); - let res = (lhs + rhs) % num_bigint::BigUint::from_bytes_be(&Self::modulus()); - Self { - value: res.to_bytes_be().try_into().unwrap() + let modulus = num_bigint::BigUint::from_bytes_be(&Self::modulus()); + let res = (lhs + rhs) % modulus; + let res = res.to_bytes_be(); + assert!(res.len() <= #num_bytes); + let mut value = Self::zero(); + let offset = #num_bytes-res.len(); + for i in 0..res.len() { + value.value[offset+i] = res[i]; } + value + } + } + + + impl core::ops::Mul for #ident { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + let lhs = num_bigint::BigUint::from_bytes_be(&self.value); + let rhs = num_bigint::BigUint::from_bytes_be(&rhs.value); + let modulus = num_bigint::BigUint::from_bytes_be(&Self::modulus()); + let res = (lhs * rhs) % modulus; + let res = res.to_bytes_be(); + assert!(res.len() <= #num_bytes); + let mut value = Self::zero(); + let offset = #num_bytes-res.len(); + for i in 0..res.len() { + value.value[offset+i] = res[i]; + } + value } } }; + out_struct.into() } diff --git a/poly1305-rust/natmod/tests/poly1305.rs b/poly1305-rust/natmod/tests/poly1305.rs index f8e14d3..6ef3e51 100644 --- a/poly1305-rust/natmod/tests/poly1305.rs +++ b/poly1305-rust/natmod/tests/poly1305.rs @@ -3,15 +3,37 @@ use natmod::nat_mod; /// This has to come from the lib. pub trait NatMod { const MODULUS: T; + const MODULUS_STR: &'static str; } #[nat_mod("03fffffffffffffffffffffffffffffffb", 17)] struct FieldElement {} #[test] -fn natmod() { +fn add() { let x = FieldElement::from_hex("03fffffffffffffffffffffffffffffffa"); let y = FieldElement::from_hex("01"); let z = x + y; assert_eq!(FieldElement::zero().as_ref(), z.as_ref()); + + let x = FieldElement::from_hex("03fffffffffffffffffffffffffffffffa"); + let y = FieldElement::from_hex("02"); + let z = x + y; + assert_eq!(FieldElement::from_hex("01").as_ref(), z.as_ref()); +} + +#[test] +fn mul() { + let x = FieldElement::from_hex("03fffffffffffffffffffffffffffffffa"); + let y = FieldElement::from_hex("01"); + let z = x * y; + assert_eq!(x.as_ref(), z.as_ref()); + + let x = FieldElement::from_hex("03fffffffffffffffffffffffffffffffa"); + let y = FieldElement::from_hex("02"); + let z = x * y; + assert_eq!( + FieldElement::from_hex("03fffffffffffffffffffffffffffffff9").as_ref(), + z.as_ref() + ); } diff --git a/poly1305-rust/out/Natmod.Nat_mod.fst b/poly1305-rust/out/Natmod.Nat_mod.fst new file mode 100644 index 0000000..30a4939 --- /dev/null +++ b/poly1305-rust/out/Natmod.Nat_mod.fst @@ -0,0 +1,6 @@ +module Natmod.Nat_mod +#set-options "--fuel 0 --ifuel 1 --z3rlimit 15" +open FStar.Mul +open Hacspec.Lib +open Hacspec_lib_tc + diff --git a/poly1305-rust/out/Natmod._.fst b/poly1305-rust/out/Natmod._.fst new file mode 100644 index 0000000..1642172 --- /dev/null +++ b/poly1305-rust/out/Natmod._.fst @@ -0,0 +1,6 @@ +module Natmod._ +#set-options "--fuel 0 --ifuel 1 --z3rlimit 15" +open FStar.Mul +open Hacspec.Lib +open Hacspec_lib_tc + diff --git a/poly1305-rust/out/Natmod.fst b/poly1305-rust/out/Natmod.fst new file mode 100644 index 0000000..26cc599 --- /dev/null +++ b/poly1305-rust/out/Natmod.fst @@ -0,0 +1,1800 @@ +module Natmod +#set-options "--fuel 0 --ifuel 1 --z3rlimit 15" +open FStar.Mul +open Hacspec.Lib +open Hacspec_lib_tc + +type natModAttr_t = { + mod_str:Alloc.String.string_t; + mod_bytes:Alloc.Vec.vec_t UInt8.t Alloc.Alloc.global_t; + int_size:uint_size +} + +let impl: Syn.Parse.Parse natModAttr_t = + { + parse + = + fun (input: Syn.Parse.parseBuffer_t) -> + let hoist1:Core.Result.result_t natModAttr_t Syn.Error.error_t = + Std.Ops.FromResidual.from_residual (Syn.Parse.parse input) + in + let mod_str:Alloc.String.string_t = Syn.Lit.value hoist1 in + let mod_bytes:Alloc.Vec.vec_t UInt8.t Alloc.Alloc.global_t = + Core.Result.expect (Hex.FromHex.from_hex mod_str) "Invalid hex String" + in + let _:Core.Result.result_t natModAttr_t Syn.Error.error_t = + Std.Ops.FromResidual.from_residual (Syn.Parse.parse input) + in + let hoist2:Core.Result.result_t natModAttr_t Syn.Error.error_t = + Std.Ops.FromResidual.from_residual (Syn.Parse.parse input) + in + let hoist3:Core.Result.result_t uint_size Syn.Error.error_t = Syn.Lit.base10_parse hoist2 in + let int_size:Core.Result.result_t natModAttr_t Syn.Error.error_t = + Std.Ops.FromResidual.from_residual hoist3 + in + let _:Prims.l_False = + if Prims.l_Not (Syn.Parse.is_empty input) + then + Core.Panicking.panic_fmt (Core.Fmt.new_v1 (Hacspec.Lib.unsize [ + "Left over tokens in attribute " + ]) + (Hacspec.Lib.unsize [Core.Fmt.Rt.new_debug input])) + in + Core.Result.Ok ({ mod_str = mod_str; mod_bytes = mod_bytes; int_size = int_size }) + } + +let nat_mod (attr item: Proc_macro.tokenStream_t) : Proc_macro.tokenStream_t = + Hacspec.Lib.run (let* item_ast:Syn.Derive.deriveInput_t = + match Syn.parse item with + | Core.Result.Ok data -> Std.Ops.ControlFlow.Continue data + | Core.Result.Err err -> + Std.Ops.ControlFlow.break (Core.Convert.From.from (Syn.Error.to_compile_error err)) + in + let ident:Proc_macro2.ident_t = Core.Clone.Clone.clone item_ast.ident in + let* args:natModAttr_t = + match Syn.parse attr with + | Core.Result.Ok data -> Std.Ops.ControlFlow.Continue data + | Core.Result.Err err -> + Std.Ops.ControlFlow.break (Core.Convert.From.from (Syn.Error.to_compile_error err)) + in + Std.Ops.ControlFlow.Continue + (let num_bytes:uint_size = args.int_size in + let modulus:Alloc.Vec.vec_t UInt8.t Alloc.Alloc.global_t = args.mod_bytes in + let modulus_string:Alloc.String.string_t = args.mod_str in + let padded_modulus:Alloc.Vec.vec_t UInt8.t Alloc.Alloc.global_t = + Alloc.Vec.from_elem 0uy (num_bytes - Alloc.Vec.len modulus) + in + let _:Prims.unit = + Hax_error.hax_failure "" + "alloc::vec::append(\n &mut (padded_modulus),\n &mut (deref(&mut (core::clone::Clone::clone(&(modulus))))),\n )" + + in + let mod_iter1:Core.Slice.Iter.iter_t UInt8.t = + Core.Slice.iter (Core.Ops.Deref.Deref.deref padded_modulus) + in + let mod_iter2:Core.Slice.Iter.iter_t UInt8.t = + Core.Slice.iter (Core.Ops.Deref.Deref.deref padded_modulus) + in + let mod_iter3:Core.Slice.Iter.iter_t UInt8.t = + Core.Slice.iter (Core.Ops.Deref.Deref.deref padded_modulus) + in + let res:Alloc.String.string_t = + Alloc.Fmt.format (Core.Fmt.new_v1 (Hacspec.Lib.unsize [""; "_MODULUS"]) + (Hacspec.Lib.unsize [ + Core.Fmt.Rt.new_display (Alloc.Str.to_uppercase (Core.Ops.Deref.Deref.deref (Alloc.String.ToString.to_string + ident))) + ])) + in + let const_name:Proc_macro2.ident_t = + Proc_macro2.new_ (Core.Ops.Deref.Deref.deref res) (Proc_macro2.span ident) + in + let res:Alloc.String.string_t = + Alloc.Fmt.format (Core.Fmt.new_v1 (Hacspec.Lib.unsize [""; "_MODULUS_STR"]) + (Hacspec.Lib.unsize [ + Core.Fmt.Rt.new_display (Alloc.Str.to_uppercase (Core.Ops.Deref.Deref.deref (Alloc.String.ToString.to_string + ident))) + ])) + in + let static_name:Proc_macro2.ident_t = + Proc_macro2.new_ (Core.Ops.Deref.Deref.deref res) (Proc_macro2.span ident) + in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in + let hoist8:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "derive" in + let hoist5:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Clone" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Copy" in + let hoist4:Proc_macro2.tokenStream_t = _s in + let hoist6:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist5 Proc_macro2.Parenthesis hoist4 + in + let _s:Proc_macro2.tokenStream_t = hoist6 in + let hoist7:Proc_macro2.tokenStream_t = _s in + let hoist9:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist8 Proc_macro2.Bracket hoist7 + in + let _s:Proc_macro2.tokenStream_t = hoist9 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#struct" in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in + let hoist14:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let hoist11:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in + let hoist10:Proc_macro2.tokenStream_t = _s in + let hoist12:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist11 Proc_macro2.Bracket hoist10 + in + let _s:Proc_macro2.tokenStream_t = hoist12 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in + let hoist13:Proc_macro2.tokenStream_t = _s in + let hoist15:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist14 Proc_macro2.Brace hoist13 + in + let _s:Proc_macro2.tokenStream_t = hoist15 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#const" in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens const_name _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let hoist17:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in + let hoist16:Proc_macro2.tokenStream_t = _s in + let hoist18:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist17 Proc_macro2.Bracket hoist16 + in + let _s:Proc_macro2.tokenStream_t = hoist18 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let hoist21:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _i:uint_size = 0 in + let has_iter:Quote.__private.thereIsNoIteratorInRepetition_t = { } in + let mod_iter1, i:(Core.Slice.Iter.iter_t UInt8.t & Quote.__private.hasIterator_t) = + Quote.__private.Ext.RepIteratorExt.quote_into_iter mod_iter1 + in + let has_iter = has_iter |. i in + let (_: Quote.__private.hasIterator_t):Quote.__private.hasIterator_t = has_iter in + let _i, _s, mod_iter1:(Prims.unit & Proc_macro2.tokenStream_t & + Core.Slice.Iter.iter_t UInt8.t) = + Hax_error.hax_failure "" + "{\n (loop {\n |Tuple3(_i, _s, mod_iter1)| {\n (if true {\n {\n let Tuple2(todo_fresh_var, mod_iter1_temp): tuple2<\n core::option::Option,\n core::slice::iter::Iter,\n > = { core::iter::traits::iterator::Iterator::next(mod_iter1) };\n {\n let mod_iter1: core::slice::iter::Iter = { mod_iter1_temp };\n {\n let hoist19: core::option::Option =\n { todo_fresh_var };\n {\n let mod_iter1: quote::__private::RepInterp = {\n (match hoist19 {\n core::option::Some(_x) => {\n quote::__private::RepInterp(_x)\n }\n core::option::None => {\n hax_error::hax_failure(\"\", \"(break (Tuple0))\")\n }\n })\n };\n {\n let _s: proc_macro2::TokenStream = {\n (if BinOp::Ast.Gt(_i, 0) {\n {\n let _s: proc_macro2::TokenStream =\n { quote::__private::push_comma(_s) };\n _s\n }\n } else {\n _s\n })\n };\n {\n let Tuple0: tuple0 = { BinOp::Ast.Add(_i, 1) };\n {\n let _i: tuple0 = { Tuple0 };\n {\n let _s: proc_macro2::TokenStream = {\n quote::to_tokens::ToTokens::to_tokens(\n mod_iter1, _s,\n )\n };\n Tuple3(_i, _s, mod_iter1)\n }\n }\n }\n }\n }\n }\n }\n }\n } else {\n {\n let _: tuple0 = { hax_error::hax_failure(\"\", \"(break (Tuple0))\") };\n Tuple3(_i, _s, mod_iter1)\n }\n })\n }\n })(Tuple3(_i, _s, mod_iter1))\n }" + + in + let hoist20:Proc_macro2.tokenStream_t = _s in + let hoist22:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist21 Proc_macro2.Bracket hoist20 + in + let _s:Proc_macro2.tokenStream_t = hoist22 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#static" in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens static_name _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "str" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens modulus_string _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#impl" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "NatMod" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lt _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_gt _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in + let hoist31:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#const" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "MODULUS" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in + let hoist28:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let hoist25:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _i:uint_size = 0 in + let has_iter:Quote.__private.thereIsNoIteratorInRepetition_t = { } in + let mod_iter2, i:(Core.Slice.Iter.iter_t UInt8.t & Quote.__private.hasIterator_t) = + Quote.__private.Ext.RepIteratorExt.quote_into_iter mod_iter2 + in + let has_iter = has_iter |. i in + let (_: Quote.__private.hasIterator_t):Quote.__private.hasIterator_t = has_iter in + let _i, _s, mod_iter2:(Prims.unit & Proc_macro2.tokenStream_t & + Core.Slice.Iter.iter_t UInt8.t) = + Hax_error.hax_failure "" + "{\n (loop {\n |Tuple3(_i, _s, mod_iter2)| {\n (if true {\n {\n let Tuple2(todo_fresh_var, mod_iter2_temp): tuple2<\n core::option::Option,\n core::slice::iter::Iter,\n > = { core::iter::traits::iterator::Iterator::next(mod_iter2) };\n {\n let mod_iter2: core::slice::iter::Iter = { mod_iter2_temp };\n {\n let hoist23: core::option::Option =\n { todo_fresh_var };\n {\n let mod_iter2: quote::__private::RepInterp = {\n (match hoist23 {\n core::option::Some(_x) => {\n quote::__private::RepInterp(_x)\n }\n core::option::None => {\n hax_error::hax_failure(\"\", \"(break (Tuple0))\")\n }\n })\n };\n {\n let _s: proc_macro2::TokenStream = {\n (if BinOp::Ast.Gt(_i, 0) {\n {\n let _s: proc_macro2::TokenStream =\n { quote::__private::push_comma(_s) };\n _s\n }\n } else {\n _s\n })\n };\n {\n let Tuple0: tuple0 = { BinOp::Ast.Add(_i, 1) };\n {\n let _i: tuple0 = { Tuple0 };\n {\n let _s: proc_macro2::TokenStream = {\n quote::to_tokens::ToTokens::to_tokens(\n mod_iter2, _s,\n )\n };\n Tuple3(_i, _s, mod_iter2)\n }\n }\n }\n }\n }\n }\n }\n }\n } else {\n {\n let _: tuple0 = { hax_error::hax_failure(\"\", \"(break (Tuple0))\") };\n Tuple3(_i, _s, mod_iter2)\n }\n })\n }\n })(Tuple3(_i, _s, mod_iter2))\n }" + + in + let hoist24:Proc_macro2.tokenStream_t = _s in + let hoist26:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist25 Proc_macro2.Bracket hoist24 + in + let _s:Proc_macro2.tokenStream_t = hoist26 in + let hoist27:Proc_macro2.tokenStream_t = _s in + let hoist29:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist28 Proc_macro2.Brace hoist27 + in + let _s:Proc_macro2.tokenStream_t = hoist29 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#const" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "MODULUS_STR" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lifetime _s "'static" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "str" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens modulus_string _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let hoist30:Proc_macro2.tokenStream_t = _s in + let hoist32:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist31 Proc_macro2.Brace hoist30 + in + let _s:Proc_macro2.tokenStream_t = hoist32 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#impl" in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in + let hoist197:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in + let hoist34:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.parse _s "r\" Get the modulus as string\"" + in + let hoist33:Proc_macro2.tokenStream_t = _s in + let hoist35:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist34 Proc_macro2.Bracket hoist33 + in + let _s:Proc_macro2.tokenStream_t = hoist35 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#const" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus_string" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lifetime _s "'static" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "str" in + let hoist37:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens modulus_string _s in + let hoist36:Proc_macro2.tokenStream_t = _s in + let hoist38:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist37 Proc_macro2.Brace hoist36 + in + let _s:Proc_macro2.tokenStream_t = hoist38 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in + let hoist40:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.parse _s "r\" Get the modulus as byte array\"" + in + let hoist39:Proc_macro2.tokenStream_t = _s in + let hoist41:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist40 Proc_macro2.Bracket hoist39 + in + let _s:Proc_macro2.tokenStream_t = hoist41 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#const" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let hoist43:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in + let hoist42:Proc_macro2.tokenStream_t = _s in + let hoist44:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist43 Proc_macro2.Bracket hoist42 + in + let _s:Proc_macro2.tokenStream_t = hoist44 in + let hoist50:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let hoist47:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _i:uint_size = 0 in + let has_iter:Quote.__private.thereIsNoIteratorInRepetition_t = { } in + let mod_iter3, i:(Core.Slice.Iter.iter_t UInt8.t & Quote.__private.hasIterator_t) = + Quote.__private.Ext.RepIteratorExt.quote_into_iter mod_iter3 + in + let has_iter = has_iter |. i in + let (_: Quote.__private.hasIterator_t):Quote.__private.hasIterator_t = has_iter in + let _i, _s, mod_iter3:(Prims.unit & Proc_macro2.tokenStream_t & + Core.Slice.Iter.iter_t UInt8.t) = + Hax_error.hax_failure "" + "{\n (loop {\n |Tuple3(_i, _s, mod_iter3)| {\n (if true {\n {\n let Tuple2(todo_fresh_var, mod_iter3_temp): tuple2<\n core::option::Option,\n core::slice::iter::Iter,\n > = { core::iter::traits::iterator::Iterator::next(mod_iter3) };\n {\n let mod_iter3: core::slice::iter::Iter = { mod_iter3_temp };\n {\n let hoist45: core::option::Option =\n { todo_fresh_var };\n {\n let mod_iter3: quote::__private::RepInterp = {\n (match hoist45 {\n core::option::Some(_x) => {\n quote::__private::RepInterp(_x)\n }\n core::option::None => {\n hax_error::hax_failure(\"\", \"(break (Tuple0))\")\n }\n })\n };\n {\n let _s: proc_macro2::TokenStream = {\n (if BinOp::Ast.Gt(_i, 0) {\n {\n let _s: proc_macro2::TokenStream =\n { quote::__private::push_comma(_s) };\n _s\n }\n } else {\n _s\n })\n };\n {\n let Tuple0: tuple0 = { BinOp::Ast.Add(_i, 1) };\n {\n let _i: tuple0 = { Tuple0 };\n {\n let _s: proc_macro2::TokenStream = {\n quote::to_tokens::ToTokens::to_tokens(\n mod_iter3, _s,\n )\n };\n Tuple3(_i, _s, mod_iter3)\n }\n }\n }\n }\n }\n }\n }\n }\n } else {\n {\n let _: tuple0 = { hax_error::hax_failure(\"\", \"(break (Tuple0))\") };\n Tuple3(_i, _s, mod_iter3)\n }\n })\n }\n })(Tuple3(_i, _s, mod_iter3))\n }" + + in + let hoist46:Proc_macro2.tokenStream_t = _s in + let hoist48:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist47 Proc_macro2.Bracket hoist46 + in + let _s:Proc_macro2.tokenStream_t = hoist48 in + let hoist49:Proc_macro2.tokenStream_t = _s in + let hoist51:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist50 Proc_macro2.Brace hoist49 + in + let _s:Proc_macro2.tokenStream_t = hoist51 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in + let hoist53:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "r\" New from hex string\"" in + let hoist52:Proc_macro2.tokenStream_t = _s in + let hoist54:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist53 Proc_macro2.Bracket hoist52 + in + let _s:Proc_macro2.tokenStream_t = hoist54 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_hex" in + let hoist56:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "hex" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "str" in + let hoist55:Proc_macro2.tokenStream_t = _s in + let hoist57:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist56 Proc_macro2.Parenthesis hoist55 + in + let _s:Proc_macro2.tokenStream_t = hoist57 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let hoist86:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "assert" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in + let hoist59:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "hex" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rem _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "2" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "0" in + let hoist58:Proc_macro2.tokenStream_t = _s in + let hoist60:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist59 Proc_macro2.Parenthesis hoist58 + in + let _s:Proc_macro2.tokenStream_t = hoist60 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "l" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "hex" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_div _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "2" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "assert" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in + let hoist62:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "l" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_le _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in + let hoist61:Proc_macro2.tokenStream_t = _s in + let hoist63:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist62 Proc_macro2.Parenthesis hoist61 + in + let _s:Proc_macro2.tokenStream_t = hoist63 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#mut" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let hoist65:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "0u8" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in + let hoist64:Proc_macro2.tokenStream_t = _s in + let hoist66:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist65 Proc_macro2.Bracket hoist64 + in + let _s:Proc_macro2.tokenStream_t = hoist66 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "skip" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_sub _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "l" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#in" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "0" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "l" in + let hoist80:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let hoist68:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "skip" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_add _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in + let hoist67:Proc_macro2.tokenStream_t = _s in + let hoist69:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist68 Proc_macro2.Bracket hoist67 + in + let _s:Proc_macro2.tokenStream_t = hoist69 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_str_radix" in + let hoist74:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "hex" in + let hoist71:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "2" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_star _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "2" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_star _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_add _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "2" in + let hoist70:Proc_macro2.tokenStream_t = _s in + let hoist72:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist71 Proc_macro2.Bracket hoist70 + in + let _s:Proc_macro2.tokenStream_t = hoist72 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "16" in + let hoist73:Proc_macro2.tokenStream_t = _s in + let hoist75:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist74 Proc_macro2.Parenthesis hoist73 + in + let _s:Proc_macro2.tokenStream_t = hoist75 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "expect" in + let hoist77:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.parse _s "\"An unexpected error occurred.\"" + in + let hoist76:Proc_macro2.tokenStream_t = _s in + let hoist78:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist77 Proc_macro2.Parenthesis hoist76 + in + let _s:Proc_macro2.tokenStream_t = hoist78 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let hoist79:Proc_macro2.tokenStream_t = _s in + let hoist81:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist80 Proc_macro2.Brace hoist79 + in + let _s:Proc_macro2.tokenStream_t = hoist81 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let hoist83:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let hoist82:Proc_macro2.tokenStream_t = _s in + let hoist84:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist83 Proc_macro2.Brace hoist82 + in + let _s:Proc_macro2.tokenStream_t = hoist84 in + let hoist85:Proc_macro2.tokenStream_t = _s in + let hoist87:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist86 Proc_macro2.Brace hoist85 + in + let _s:Proc_macro2.tokenStream_t = hoist87 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in + let hoist89:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.parse _s "r\" Get hex string representation of this.\"" + in + let hoist88:Proc_macro2.tokenStream_t = _s in + let hoist90:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist89 Proc_macro2.Bracket hoist88 + in + let _s:Proc_macro2.tokenStream_t = hoist90 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "to_hex" in + let hoist92:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in + let hoist91:Proc_macro2.tokenStream_t = _s in + let hoist93:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist92 Proc_macro2.Parenthesis hoist91 + in + let _s:Proc_macro2.tokenStream_t = hoist93 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "String" in + let hoist104:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "strs" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Vec" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lt _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "String" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_gt _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "iter" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "map" in + let hoist98:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_or _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "b" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_or _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "format" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in + let hoist95:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "\"{:02x}\"" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "b" in + let hoist94:Proc_macro2.tokenStream_t = _s in + let hoist96:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist95 Proc_macro2.Parenthesis hoist94 + in + let _s:Proc_macro2.tokenStream_t = hoist96 in + let hoist97:Proc_macro2.tokenStream_t = _s in + let hoist99:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist98 Proc_macro2.Parenthesis hoist97 + in + let _s:Proc_macro2.tokenStream_t = hoist99 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "collect" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "strs" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "join" in + let hoist101:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "\"\"" in + let hoist100:Proc_macro2.tokenStream_t = _s in + let hoist102:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist101 Proc_macro2.Parenthesis hoist100 + in + let _s:Proc_macro2.tokenStream_t = hoist102 in + let hoist103:Proc_macro2.tokenStream_t = _s in + let hoist105:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist104 Proc_macro2.Brace hoist103 + in + let _s:Proc_macro2.tokenStream_t = hoist105 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in + let hoist107:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "r\" Zero element\"" in + let hoist106:Proc_macro2.tokenStream_t = _s in + let hoist108:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist107 Proc_macro2.Bracket hoist106 + in + let _s:Proc_macro2.tokenStream_t = hoist108 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#const" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "zero" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let hoist116:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let hoist113:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let hoist110:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "0u8" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in + let hoist109:Proc_macro2.tokenStream_t = _s in + let hoist111:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist110 Proc_macro2.Bracket hoist109 + in + let _s:Proc_macro2.tokenStream_t = hoist111 in + let hoist112:Proc_macro2.tokenStream_t = _s in + let hoist114:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist113 Proc_macro2.Brace hoist112 + in + let _s:Proc_macro2.tokenStream_t = hoist114 in + let hoist115:Proc_macro2.tokenStream_t = _s in + let hoist117:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist116 Proc_macro2.Brace hoist115 + in + let _s:Proc_macro2.tokenStream_t = hoist117 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in + let hoist119:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.parse _s "r\" Returns 2 to the power of the argument\"" + in + let hoist118:Proc_macro2.tokenStream_t = _s in + let hoist120:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist119 Proc_macro2.Bracket hoist118 + in + let _s:Proc_macro2.tokenStream_t = hoist120 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "pow2" in + let hoist122:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "x" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "usize" in + let hoist121:Proc_macro2.tokenStream_t = _s in + let hoist123:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist122 Proc_macro2.Parenthesis hoist121 + in + let _s:Proc_macro2.tokenStream_t = hoist123 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let hoist128:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from" in + let hoist125:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "1u32" in + let hoist124:Proc_macro2.tokenStream_t = _s in + let hoist126:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist125 Proc_macro2.Parenthesis hoist124 + in + let _s:Proc_macro2.tokenStream_t = hoist126 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_shl _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "x" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "into" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let hoist127:Proc_macro2.tokenStream_t = _s in + let hoist129:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist128 Proc_macro2.Brace hoist127 + in + let _s:Proc_macro2.tokenStream_t = hoist129 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in + let hoist131:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.parse _s "r\" Create a new [`#ident`] from a `u128` literal.\"" + in + let hoist130:Proc_macro2.tokenStream_t = _s in + let hoist132:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist131 Proc_macro2.Bracket hoist130 + in + let _s:Proc_macro2.tokenStream_t = hoist132 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_u128" in + let hoist134:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "literal" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u128" in + let hoist133:Proc_macro2.tokenStream_t = _s in + let hoist135:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist134 Proc_macro2.Parenthesis hoist133 + in + let _s:Proc_macro2.tokenStream_t = hoist135 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let hoist143:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from" in + let hoist140:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from" in + let hoist137:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "literal" in + let hoist136:Proc_macro2.tokenStream_t = _s in + let hoist138:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist137 Proc_macro2.Parenthesis hoist136 + in + let _s:Proc_macro2.tokenStream_t = hoist138 in + let hoist139:Proc_macro2.tokenStream_t = _s in + let hoist141:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist140 Proc_macro2.Parenthesis hoist139 + in + let _s:Proc_macro2.tokenStream_t = hoist141 in + let hoist142:Proc_macro2.tokenStream_t = _s in + let hoist144:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist143 Proc_macro2.Brace hoist142 + in + let _s:Proc_macro2.tokenStream_t = hoist144 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in + let hoist146:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.parse _s "r\" Create a new [`#ident`] from a little endian byte slice.\"" + in + let hoist145:Proc_macro2.tokenStream_t = _s in + let hoist147:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist146 Proc_macro2.Bracket hoist145 + in + let _s:Proc_macro2.tokenStream_t = hoist147 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_le_bytes" in + let hoist152:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "bytes" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let hoist149:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in + let hoist148:Proc_macro2.tokenStream_t = _s in + let hoist150:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist149 Proc_macro2.Bracket hoist148 + in + let _s:Proc_macro2.tokenStream_t = hoist150 in + let hoist151:Proc_macro2.tokenStream_t = _s in + let hoist153:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist152 Proc_macro2.Parenthesis hoist151 + in + let _s:Proc_macro2.tokenStream_t = hoist153 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let hoist161:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from" in + let hoist158:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_le" in + let hoist155:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "bytes" in + let hoist154:Proc_macro2.tokenStream_t = _s in + let hoist156:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist155 Proc_macro2.Parenthesis hoist154 + in + let _s:Proc_macro2.tokenStream_t = hoist156 in + let hoist157:Proc_macro2.tokenStream_t = _s in + let hoist159:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist158 Proc_macro2.Parenthesis hoist157 + in + let _s:Proc_macro2.tokenStream_t = hoist159 in + let hoist160:Proc_macro2.tokenStream_t = _s in + let hoist162:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist161 Proc_macro2.Brace hoist160 + in + let _s:Proc_macro2.tokenStream_t = hoist162 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in + let hoist164:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.parse _s "r\" Create a new [`#ident`] from a little endian byte slice.\"" + in + let hoist163:Proc_macro2.tokenStream_t = _s in + let hoist165:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist164 Proc_macro2.Bracket hoist163 + in + let _s:Proc_macro2.tokenStream_t = hoist165 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_be_bytes" in + let hoist170:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "bytes" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let hoist167:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in + let hoist166:Proc_macro2.tokenStream_t = _s in + let hoist168:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist167 Proc_macro2.Bracket hoist166 + in + let _s:Proc_macro2.tokenStream_t = hoist168 in + let hoist169:Proc_macro2.tokenStream_t = _s in + let hoist171:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist170 Proc_macro2.Parenthesis hoist169 + in + let _s:Proc_macro2.tokenStream_t = hoist171 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let hoist179:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from" in + let hoist176:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in + let hoist173:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "bytes" in + let hoist172:Proc_macro2.tokenStream_t = _s in + let hoist174:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist173 Proc_macro2.Parenthesis hoist172 + in + let _s:Proc_macro2.tokenStream_t = hoist174 in + let hoist175:Proc_macro2.tokenStream_t = _s in + let hoist177:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist176 Proc_macro2.Parenthesis hoist175 + in + let _s:Proc_macro2.tokenStream_t = hoist177 in + let hoist178:Proc_macro2.tokenStream_t = _s in + let hoist180:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist179 Proc_macro2.Brace hoist178 + in + let _s:Proc_macro2.tokenStream_t = hoist180 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "to_le_bytes" in + let hoist182:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in + let hoist181:Proc_macro2.tokenStream_t = _s in + let hoist183:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist182 Proc_macro2.Parenthesis hoist181 + in + let _s:Proc_macro2.tokenStream_t = hoist183 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let hoist185:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in + let hoist184:Proc_macro2.tokenStream_t = _s in + let hoist186:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist185 Proc_macro2.Bracket hoist184 + in + let _s:Proc_macro2.tokenStream_t = hoist186 in + let hoist194:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "pad" in + let hoist191:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in + let hoist188:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let hoist187:Proc_macro2.tokenStream_t = _s in + let hoist189:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist188 Proc_macro2.Parenthesis hoist187 + in + let _s:Proc_macro2.tokenStream_t = hoist189 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "to_bytes_le" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let hoist190:Proc_macro2.tokenStream_t = _s in + let hoist192:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist191 Proc_macro2.Parenthesis hoist190 + in + let _s:Proc_macro2.tokenStream_t = hoist192 in + let hoist193:Proc_macro2.tokenStream_t = _s in + let hoist195:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist194 Proc_macro2.Brace hoist193 + in + let _s:Proc_macro2.tokenStream_t = hoist195 in + let hoist196:Proc_macro2.tokenStream_t = _s in + let hoist198:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist197 Proc_macro2.Brace hoist196 + in + let _s:Proc_macro2.tokenStream_t = hoist198 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "pad" in + let hoist203:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "bytes" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let hoist200:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in + let hoist199:Proc_macro2.tokenStream_t = _s in + let hoist201:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist200 Proc_macro2.Bracket hoist199 + in + let _s:Proc_macro2.tokenStream_t = hoist201 in + let hoist202:Proc_macro2.tokenStream_t = _s in + let hoist204:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist203 Proc_macro2.Parenthesis hoist202 + in + let _s:Proc_macro2.tokenStream_t = hoist204 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let hoist206:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in + let hoist205:Proc_macro2.tokenStream_t = _s in + let hoist207:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist206 Proc_macro2.Bracket hoist205 + in + let _s:Proc_macro2.tokenStream_t = hoist207 in + let hoist218:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#mut" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let hoist209:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "0u8" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in + let hoist208:Proc_macro2.tokenStream_t = _s in + let hoist210:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist209 Proc_macro2.Bracket hoist208 + in + let _s:Proc_macro2.tokenStream_t = hoist210 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "upper" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "lower" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "upper" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_sub _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "bytes" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let hoist212:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "lower" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "upper" in + let hoist211:Proc_macro2.tokenStream_t = _s in + let hoist213:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist212 Proc_macro2.Bracket hoist211 + in + let _s:Proc_macro2.tokenStream_t = hoist213 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "copy_from_slice" in + let hoist215:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "bytes" in + let hoist214:Proc_macro2.tokenStream_t = _s in + let hoist216:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist215 Proc_macro2.Parenthesis hoist214 + in + let _s:Proc_macro2.tokenStream_t = hoist216 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let hoist217:Proc_macro2.tokenStream_t = _s in + let hoist219:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist218 Proc_macro2.Brace hoist217 + in + let _s:Proc_macro2.tokenStream_t = hoist219 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#impl" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "From" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lt _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_gt _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in + let hoist251:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from" in + let hoist221:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "x" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in + let hoist220:Proc_macro2.tokenStream_t = _s in + let hoist222:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist221 Proc_macro2.Parenthesis hoist220 + in + let _s:Proc_macro2.tokenStream_t = hoist222 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in + let hoist248:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "max_value" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "assert" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in + let hoist230:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "x" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_le _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in + let hoist224:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "max_value" in + let hoist223:Proc_macro2.tokenStream_t = _s in + let hoist225:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist224 Proc_macro2.Parenthesis hoist223 + in + let _s:Proc_macro2.tokenStream_t = hoist225 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.parse _s "\"{} is too large for type {}!\"" + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "x" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "stringify" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in + let hoist227:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "$" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "ident" in + let hoist226:Proc_macro2.tokenStream_t = _s in + let hoist228:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist227 Proc_macro2.Parenthesis hoist226 + in + let _s:Proc_macro2.tokenStream_t = hoist228 in + let hoist229:Proc_macro2.tokenStream_t = _s in + let hoist231:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist230 Proc_macro2.Parenthesis hoist229 + in + let _s:Proc_macro2.tokenStream_t = hoist231 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "repr" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "x" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "to_bytes_be" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#if" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "repr" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_gt _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in + let hoist239:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "panic" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in + let hoist236:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.parse _s "\"{} is too large for type {}\"" + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "x" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "stringify" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in + let hoist233:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in + let hoist232:Proc_macro2.tokenStream_t = _s in + let hoist234:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist233 Proc_macro2.Parenthesis hoist232 + in + let _s:Proc_macro2.tokenStream_t = hoist234 in + let hoist235:Proc_macro2.tokenStream_t = _s in + let hoist237:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist236 Proc_macro2.Parenthesis hoist235 + in + let _s:Proc_macro2.tokenStream_t = hoist237 in + let hoist238:Proc_macro2.tokenStream_t = _s in + let hoist240:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist239 Proc_macro2.Brace hoist238 + in + let _s:Proc_macro2.tokenStream_t = hoist240 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let hoist245:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "pad" in + let hoist242:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "repr" in + let hoist241:Proc_macro2.tokenStream_t = _s in + let hoist243:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist242 Proc_macro2.Parenthesis hoist241 + in + let _s:Proc_macro2.tokenStream_t = hoist243 in + let hoist244:Proc_macro2.tokenStream_t = _s in + let hoist246:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist245 Proc_macro2.Brace hoist244 + in + let _s:Proc_macro2.tokenStream_t = hoist246 in + let hoist247:Proc_macro2.tokenStream_t = _s in + let hoist249:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist248 Proc_macro2.Brace hoist247 + in + let _s:Proc_macro2.tokenStream_t = hoist249 in + let hoist250:Proc_macro2.tokenStream_t = _s in + let hoist252:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist251 Proc_macro2.Brace hoist250 + in + let _s:Proc_macro2.tokenStream_t = hoist252 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#impl" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "core" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "convert" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "AsRef" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lt _s in + let hoist254:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in + let hoist253:Proc_macro2.tokenStream_t = _s in + let hoist255:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist254 Proc_macro2.Bracket hoist253 + in + let _s:Proc_macro2.tokenStream_t = hoist255 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_gt _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in + let hoist266:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "as_ref" in + let hoist257:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in + let hoist256:Proc_macro2.tokenStream_t = _s in + let hoist258:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist257 Proc_macro2.Parenthesis hoist256 + in + let _s:Proc_macro2.tokenStream_t = hoist258 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let hoist260:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in + let hoist259:Proc_macro2.tokenStream_t = _s in + let hoist261:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist260 Proc_macro2.Bracket hoist259 + in + let _s:Proc_macro2.tokenStream_t = hoist261 in + let hoist263:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let hoist262:Proc_macro2.tokenStream_t = _s in + let hoist264:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist263 Proc_macro2.Brace hoist262 + in + let _s:Proc_macro2.tokenStream_t = hoist264 in + let hoist265:Proc_macro2.tokenStream_t = _s in + let hoist267:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist266 Proc_macro2.Brace hoist265 + in + let _s:Proc_macro2.tokenStream_t = hoist267 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#impl" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "core" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "fmt" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Display" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in + let hoist278:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "fmt" in + let hoist269:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "f" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#mut" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "core" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "fmt" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Formatter" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lt _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lifetime _s "'_" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_gt _s in + let hoist268:Proc_macro2.tokenStream_t = _s in + let hoist270:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist269 Proc_macro2.Parenthesis hoist268 + in + let _s:Proc_macro2.tokenStream_t = hoist270 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "core" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "fmt" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Result" in + let hoist275:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "write" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in + let hoist272:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "f" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "\"{}\"" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "to_hex" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let hoist271:Proc_macro2.tokenStream_t = _s in + let hoist273:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist272 Proc_macro2.Parenthesis hoist271 + in + let _s:Proc_macro2.tokenStream_t = hoist273 in + let hoist274:Proc_macro2.tokenStream_t = _s in + let hoist276:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist275 Proc_macro2.Brace hoist274 + in + let _s:Proc_macro2.tokenStream_t = hoist276 in + let hoist277:Proc_macro2.tokenStream_t = _s in + let hoist279:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist278 Proc_macro2.Brace hoist277 + in + let _s:Proc_macro2.tokenStream_t = hoist279 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#impl" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "core" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "ops" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Add" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in + let hoist311:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#type" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Output" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "add" in + let hoist281:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let hoist280:Proc_macro2.tokenStream_t = _s in + let hoist282:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist281 Proc_macro2.Parenthesis hoist280 + in + let _s:Proc_macro2.tokenStream_t = hoist282 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Output" in + let hoist308:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "lhs" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in + let hoist284:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let hoist283:Proc_macro2.tokenStream_t = _s in + let hoist285:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist284 Proc_macro2.Parenthesis hoist283 + in + let _s:Proc_macro2.tokenStream_t = hoist285 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in + let hoist287:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let hoist286:Proc_macro2.tokenStream_t = _s in + let hoist288:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist287 Proc_macro2.Parenthesis hoist286 + in + let _s:Proc_macro2.tokenStream_t = hoist288 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in + let hoist290:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let hoist289:Proc_macro2.tokenStream_t = _s in + let hoist291:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist290 Proc_macro2.Parenthesis hoist289 + in + let _s:Proc_macro2.tokenStream_t = hoist291 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let hoist293:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "lhs" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_add _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in + let hoist292:Proc_macro2.tokenStream_t = _s in + let hoist294:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist293 Proc_macro2.Parenthesis hoist292 + in + let _s:Proc_macro2.tokenStream_t = hoist294 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rem _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "to_bytes_be" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "assert" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in + let hoist296:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_le _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in + let hoist295:Proc_macro2.tokenStream_t = _s in + let hoist297:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist296 Proc_macro2.Parenthesis hoist295 + in + let _s:Proc_macro2.tokenStream_t = hoist297 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#mut" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "zero" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "offset" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_sub _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#in" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "0" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let hoist305:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let hoist299:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "offset" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_add _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in + let hoist298:Proc_macro2.tokenStream_t = _s in + let hoist300:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist299 Proc_macro2.Bracket hoist298 + in + let _s:Proc_macro2.tokenStream_t = hoist300 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let hoist302:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in + let hoist301:Proc_macro2.tokenStream_t = _s in + let hoist303:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist302 Proc_macro2.Bracket hoist301 + in + let _s:Proc_macro2.tokenStream_t = hoist303 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let hoist304:Proc_macro2.tokenStream_t = _s in + let hoist306:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist305 Proc_macro2.Brace hoist304 + in + let _s:Proc_macro2.tokenStream_t = hoist306 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let hoist307:Proc_macro2.tokenStream_t = _s in + let hoist309:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist308 Proc_macro2.Brace hoist307 + in + let _s:Proc_macro2.tokenStream_t = hoist309 in + let hoist310:Proc_macro2.tokenStream_t = _s in + let hoist312:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist311 Proc_macro2.Brace hoist310 + in + let _s:Proc_macro2.tokenStream_t = hoist312 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#impl" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "core" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "ops" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Mul" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in + let hoist344:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#type" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Output" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "mul" in + let hoist314:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let hoist313:Proc_macro2.tokenStream_t = _s in + let hoist315:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist314 Proc_macro2.Parenthesis hoist313 + in + let _s:Proc_macro2.tokenStream_t = hoist315 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Output" in + let hoist341:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "lhs" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in + let hoist317:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let hoist316:Proc_macro2.tokenStream_t = _s in + let hoist318:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist317 Proc_macro2.Parenthesis hoist316 + in + let _s:Proc_macro2.tokenStream_t = hoist318 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in + let hoist320:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let hoist319:Proc_macro2.tokenStream_t = _s in + let hoist321:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist320 Proc_macro2.Parenthesis hoist319 + in + let _s:Proc_macro2.tokenStream_t = hoist321 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in + let hoist323:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let hoist322:Proc_macro2.tokenStream_t = _s in + let hoist324:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist323 Proc_macro2.Parenthesis hoist322 + in + let _s:Proc_macro2.tokenStream_t = hoist324 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let hoist326:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "lhs" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_star _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in + let hoist325:Proc_macro2.tokenStream_t = _s in + let hoist327:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist326 Proc_macro2.Parenthesis hoist325 + in + let _s:Proc_macro2.tokenStream_t = hoist327 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rem _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "to_bytes_be" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "assert" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in + let hoist329:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_le _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in + let hoist328:Proc_macro2.tokenStream_t = _s in + let hoist330:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist329 Proc_macro2.Parenthesis hoist328 + in + let _s:Proc_macro2.tokenStream_t = hoist330 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#mut" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "zero" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "offset" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_sub _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#in" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "0" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot2 _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in + let _s:Proc_macro2.tokenStream_t = + Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ + in + let hoist338:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let hoist332:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "offset" in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_add _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in + let hoist331:Proc_macro2.tokenStream_t = _s in + let hoist333:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist332 Proc_macro2.Bracket hoist331 + in + let _s:Proc_macro2.tokenStream_t = hoist333 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in + let hoist335:Proc_macro2.tokenStream_t = _s in + let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in + let hoist334:Proc_macro2.tokenStream_t = _s in + let hoist336:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist335 Proc_macro2.Bracket hoist334 + in + let _s:Proc_macro2.tokenStream_t = hoist336 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in + let hoist337:Proc_macro2.tokenStream_t = _s in + let hoist339:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist338 Proc_macro2.Brace hoist337 + in + let _s:Proc_macro2.tokenStream_t = hoist339 in + let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in + let hoist340:Proc_macro2.tokenStream_t = _s in + let hoist342:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist341 Proc_macro2.Brace hoist340 + in + let _s:Proc_macro2.tokenStream_t = hoist342 in + let hoist343:Proc_macro2.tokenStream_t = _s in + let hoist345:Proc_macro2.tokenStream_t = + Quote.__private.push_group hoist344 Proc_macro2.Brace hoist343 + in + let _s:Proc_macro2.tokenStream_t = hoist345 in + let out_struct:Proc_macro2.tokenStream_t = _s in + Core.Convert.Into.into out_struct)) + +let _: Prims.unit = () \ No newline at end of file diff --git a/poly1305-rust/src/hacspec_helper.rs b/poly1305-rust/src/hacspec_helper.rs index 663823a..8685713 100644 --- a/poly1305-rust/src/hacspec_helper.rs +++ b/poly1305-rust/src/hacspec_helper.rs @@ -1,6 +1,5 @@ -use num_bigint::BigUint; - -pub struct NatMod { - value: BigUint, - modulus: BigUint, +/// This has to come from the lib. +pub trait NatMod { + const MODULUS: T; + const MODULUS_STR: &'static str; } diff --git a/poly1305-rust/src/poly1305.rs b/poly1305-rust/src/poly1305.rs index 73dd4b1..d943f59 100644 --- a/poly1305-rust/src/poly1305.rs +++ b/poly1305-rust/src/poly1305.rs @@ -4,6 +4,7 @@ mod hacspec_helper; use hacspec_helper::*; +use natmod::nat_mod; // Type definitions for use in poly1305. pub type PolyKey = [u8; 32]; @@ -26,84 +27,77 @@ pub type BlockIndex = usize; // In particular `FieldElement` and `FieldCanvas` are defined. // The `FieldCanvas` is an integer type with 131-bit (to hold 2*(2^130-5)). // The `FieldElement` is a natural integer modulo 2^130-5. - -pub type FieldElement = NatMod<"03fffffffffffffffffffffffffffffffb", 17>; - -// public_nat_mod!( -// type_name: FieldElement, -// type_of_canvas: FieldCanvas, -// bit_size_of_field: 131, // This amounts to 17 bytes -// modulo_value: "03fffffffffffffffffffffffffffffffb" -// ); +#[nat_mod("03fffffffffffffffffffffffffffffffb", 17)] +struct FieldElement {} // Internal Poly1305 State -pub type PolyState = (FieldElement, FieldElement, PolyKey); //(accumulator,r,key) +pub struct PolyState { + acc: FieldElement, + r: FieldElement, + key: PolyKey, +} -pub fn poly1305_encode_r(b: &PolyBlock) -> FieldElement { - let mut n = U128_from_le_bytes(U128Word::from_seq(b)); - n = n & U128(0x0fff_fffc_0fff_fffc_0fff_fffc_0fff_ffffu128); - FieldElement::from_secret_literal(n) +pub fn poly1305_encode_r(b: PolyBlock) -> FieldElement { + let mut n = u128::from_le_bytes(b); + n = n & 0x0fff_fffc_0fff_fffc_0fff_fffc_0fff_ffffu128; + FieldElement::from_u128(n) } -pub fn poly1305_encode_block(b: &PolyBlock) -> FieldElement { - let n = U128_from_le_bytes(U128Word::from_seq(b)); - let f = FieldElement::from_secret_literal(n); +pub fn poly1305_encode_block(b: PolyBlock) -> FieldElement { + let f = FieldElement::from_le_bytes(&b); f + FieldElement::pow2(128) } // In Poly1305 as used in this spec, pad_len is always the length of b, i.e. there is no padding // In Chacha20Poly1305, pad_len is set to BLOCKSIZE -pub fn poly1305_encode_last(pad_len: BlockIndex, b: &SubBlock) -> FieldElement { - let n = U128_from_le_bytes(U128Word::from_slice(b, 0, b.len())); - let f = FieldElement::from_secret_literal(n); +pub fn poly1305_encode_last(pad_len: BlockIndex, b: &[u8]) -> FieldElement { + let f = FieldElement::from_le_bytes(b); f + FieldElement::pow2(8 * pad_len) } -pub fn poly1305_init(k: PolyKey) -> PolyState { - let r = poly1305_encode_r(&PolyBlock::from_slice(&k, 0, 16)); - (FieldElement::ZERO(), r, k) +pub fn poly1305_init(key: PolyKey) -> PolyState { + let r = poly1305_encode_r(key[0..16].try_into().unwrap()); + PolyState { + acc: FieldElement::zero(), + r, + key, + } } -pub fn poly1305_update_block(b: &PolyBlock, st: PolyState) -> PolyState { - let (acc, r, k) = st; - ((poly1305_encode_block(b) + acc) * r, r, k) +pub fn poly1305_update_block(b: PolyBlock, mut st: PolyState) -> PolyState { + st.acc = (poly1305_encode_block(b) + st.acc) * st.r; + st } -pub fn poly1305_update_blocks(m: &ByteSeq, st: PolyState) -> PolyState { - let mut st = st; - let n_blocks = m.len() / BLOCKSIZE; - for i in 0..n_blocks { - let block = PolyBlock::from_seq(&m.get_exact_chunk(BLOCKSIZE, i)); - st = poly1305_update_block(&block, st); +pub fn poly1305_update_blocks(m: &[u8], mut st: PolyState) -> PolyState { + for chunk in m.chunks_exact(BLOCKSIZE) { + st = poly1305_update_block(chunk.try_into().unwrap(), st); } st } -pub fn poly1305_update_last(pad_len: usize, b: &SubBlock, st: PolyState) -> PolyState { +pub fn poly1305_update_last(pad_len: usize, b: &[u8], st: PolyState) -> PolyState { let mut st = st; if b.len() != 0 { - let (acc, r, k) = st; - st = ((poly1305_encode_last(pad_len, b) + acc) * r, r, k); + st.acc = (poly1305_encode_last(pad_len, b) + st.acc) * st.r; } st } -pub fn poly1305_update(m: &ByteSeq, st: PolyState) -> PolyState { +pub fn poly1305_update(m: &[u8], st: PolyState) -> PolyState { let st = poly1305_update_blocks(m, st); - let last = m.get_remainder_chunk(BLOCKSIZE); - poly1305_update_last(last.len(), &last, st) + let last = m.chunks_exact(BLOCKSIZE).remainder(); + poly1305_update_last(last.len(), last, st) } pub fn poly1305_finish(st: PolyState) -> Poly1305Tag { - let (acc, _, k) = st; - let n = U128_from_le_bytes(U128Word::from_slice(&k, 16, 16)); - let aby = acc.to_byte_seq_le(); - // We can't use from_seq here because the accumulator is larger than 16 bytes. - let a = U128_from_le_bytes(U128Word::from_slice(&aby, 0, 16)); - Poly1305Tag::from_seq(&U128_to_le_bytes(a + n)) + let n = u128::from_le_bytes(st.key[16..32].try_into().unwrap()); + let aby = st.acc.to_le_bytes(); + let a = u128::from_le_bytes(aby[0..16].try_into().unwrap()); + (a.wrapping_add(n)).to_le_bytes() } -pub fn poly1305(m: &ByteSeq, key: PolyKey) -> Poly1305Tag { +pub fn poly1305(m: &[u8], key: PolyKey) -> Poly1305Tag { let mut st = poly1305_init(key); st = poly1305_update(m, st); poly1305_finish(st) diff --git a/poly1305-rust/tests/test_poly1305.rs b/poly1305-rust/tests/test_poly1305.rs index f09b68f..6273363 100644 --- a/poly1305-rust/tests/test_poly1305.rs +++ b/poly1305-rust/tests/test_poly1305.rs @@ -1,42 +1,88 @@ -use hacspec_lib::prelude::*; +use poly1305::*; -use hacspec_poly1305::*; +// TODO: More tests from openssl should be added +// https://github.com/openssl/openssl/blob/58cd83f83cb0fb4c0eaf97aef1c65996c0936a7d/test/recipes/30-test_evp_data/evpmac_poly1305.txt #[test] -fn basic_test() { +fn basic() { // RFC 7539 Test Vectors - let msg = ByteSeq::from_public_slice(&[ + let msg = [ 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x46, 0x6f, 0x72, 0x75, 0x6d, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, 0x72, 0x6f, 0x75, 0x70, - ]); - let k = PolyKey::from_public_slice(&[ + ]; + let k = [ 0x85, 0xd6, 0xbe, 0x78, 0x57, 0x55, 0x6d, 0x33, 0x7f, 0x44, 0x52, 0xfe, 0x42, 0xd5, 0x06, 0xa8, 0x01, 0x03, 0x80, 0x8a, 0xfb, 0x0d, 0xb2, 0xfd, 0x4a, 0xbf, 0xf6, 0xaf, 0x41, 0x49, 0xf5, 0x1b, - ]); - let expected = Poly1305Tag::from_public_slice(&[ + ]; + let expected = [ 0xa8, 0x06, 0x1d, 0xc1, 0x30, 0x51, 0x36, 0xc6, 0xc2, 0x2b, 0x8b, 0xaf, 0x0c, 0x01, 0x27, 0xa9, - ]); + ]; let computed = poly1305(&msg, k); - assert!(Poly1305Tag::declassify_eq(&expected, &computed)) + assert_eq!(expected, computed) } #[test] -fn corner_case_test() { - let msg = ByteSeq::from_public_slice(&[ - 0, 0, 0, 0, 0, 0, 0, 0, 22, 3, 3, 0, 16, 0, 0, 0, 231, 158, 214, 194, 136, 21, 80, 132, - 115, 98, 192, 197, 90, 173, 113, 64, 13, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, - ]); - let k = PolyKey::from_public_slice(&[ - 0x07, 0xdb, 0xd6, 0xfd, 0x01, 0x03, 0x2c, 0x53, 0x64, 0x4b, 0x9f, 0x94, 0x76, 0x23, 0xbd, - 0x2d, 0x25, 0xec, 0x44, 0xc2, 0x08, 0xe1, 0x32, 0x23, 0xca, 0x8c, 0x5b, 0x89, 0x11, 0xbf, - 0x59, 0xe8, - ]); - let expected = Poly1305Tag::from_public_slice(&[ - 1, 66, 72, 238, 152, 119, 158, 102, 3, 127, 38, 148, 173, 28, 215, 205, - ]); +fn openssl() { + // RFC 7539 Test Vectors + let msg = [ + 0x43, 0x72, 0x79, 0x70, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x69, 0x63, 0x20, 0x46, + 0x6f, 0x72, 0x75, 0x6d, 0x20, 0x52, 0x65, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x47, + 0x72, 0x6f, 0x75, 0x70, + ]; + let k = [ + 0x85, 0xd6, 0xbe, 0x78, 0x57, 0x55, 0x6d, 0x33, 0x7f, 0x44, 0x52, 0xfe, 0x42, 0xd5, 0x06, + 0xa8, 0x01, 0x03, 0x80, 0x8a, 0xfb, 0x0d, 0xb2, 0xfd, 0x4a, 0xbf, 0xf6, 0xaf, 0x41, 0x49, + 0xf5, 0x1b, + ]; + let expected = [ + 0xa8, 0x06, 0x1d, 0xc1, 0x30, 0x51, 0x36, 0xc6, 0xc2, 0x2b, 0x8b, 0xaf, 0x0c, 0x01, 0x27, + 0xa9, + ]; + let computed = poly1305(&msg, k); + assert_eq!(expected, computed) +} + +#[test] +fn corner_case() { + let msg = [ + 0x41, 0x6e, 0x79, 0x20, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20, 0x69, 0x6e, 0x74, + 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x61, + 0x6c, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x6e, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, + 0x2d, 0x44, 0x72, 0x61, 0x66, 0x74, 0x20, 0x6f, 0x72, 0x20, 0x52, 0x46, 0x43, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x6e, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, + 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, + 0x61, 0x6e, 0x20, 0x22, 0x49, 0x45, 0x54, 0x46, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x20, 0x53, 0x75, 0x63, 0x68, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x20, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x49, 0x45, 0x54, 0x46, 0x20, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x77, 0x65, 0x6c, 0x6c, 0x20, + 0x61, 0x73, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x72, 0x6f, 0x6e, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6d, 0x6d, + 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6d, 0x61, 0x64, 0x65, + 0x20, 0x61, 0x74, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x72, + 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, + ]; + let k = [ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x36, 0xe5, 0xf6, 0xb5, 0xc5, 0xe0, 0x60, 0x70, 0xf0, 0xef, 0xca, 0x96, 0x22, 0x7a, + 0x86, 0x3e, + ]; + let expected = [ + 0x36, 0xe5, 0xf6, 0xb5, 0xc5, 0xe0, 0x60, 0x70, 0xf0, 0xef, 0xca, 0x96, 0x22, 0x7a, 0x86, + 0x3e, + ]; let computed = poly1305(&msg, k); - assert!(Poly1305Tag::declassify_eq(&expected, &computed)) + assert_eq!(expected, computed) } From 2cf7712aab5023fd3bf61d1f111cf9366786bf7a Mon Sep 17 00:00:00 2001 From: Franziskus Kiefer Date: Tue, 4 Jul 2023 07:18:43 +0200 Subject: [PATCH 3/4] arithmetic in trait --- poly1305-rust/natmod/src/lib.rs | 170 ++++++------------------- poly1305-rust/natmod/tests/poly1305.rs | 139 +++++++++++++++++++- poly1305-rust/src/hacspec_helper.rs | 145 ++++++++++++++++++++- 3 files changed, 318 insertions(+), 136 deletions(-) diff --git a/poly1305-rust/natmod/src/lib.rs b/poly1305-rust/natmod/src/lib.rs index a5a86ef..404a421 100644 --- a/poly1305-rust/natmod/src/lib.rs +++ b/poly1305-rust/natmod/src/lib.rs @@ -49,7 +49,6 @@ pub fn nat_mod(attr: TokenStream, item: TokenStream) -> TokenStream { padded_modulus.append(&mut modulus.clone()); let mod_iter1 = padded_modulus.iter(); let mod_iter2 = padded_modulus.iter(); - let mod_iter3 = padded_modulus.iter(); let const_name = Ident::new( &format!("{}_MODULUS", ident.to_string().to_uppercase()), ident.span(), @@ -58,166 +57,75 @@ pub fn nat_mod(attr: TokenStream, item: TokenStream) -> TokenStream { &format!("{}_MODULUS_STR", ident.to_string().to_uppercase()), ident.span(), ); + let mod_name = Ident::new( + &format!("{}_mod", ident.to_string().to_uppercase()), + ident.span(), + ); let out_struct = quote! { - // #[hax(...)] - #[derive(Clone, Copy)] + #[derive(Clone, Copy, PartialEq, Eq)] pub struct #ident { value: [u8; #num_bytes], } //#[not_hax] - // mod #ident_mod { - - // } - - const #const_name: [u8; #num_bytes] = [#(#mod_iter1),*]; - static #static_name: &str = #modulus_string; + #[allow(non_snake_case)] + mod #mod_name { + use super::*; - impl NatMod<#ident> for #ident { - const MODULUS: #ident = #ident { - value: [#(#mod_iter2),*] - }; - const MODULUS_STR: &'static str = #modulus_string; - } + const #const_name: [u8; #num_bytes] = [#(#mod_iter1),*]; + static #static_name: &str = #modulus_string; - impl #ident { - /// Get the modulus as string - pub const fn modulus_string() -> &'static str { - #modulus_string - } + impl NatMod<#num_bytes> for #ident { + const MODULUS: [u8; #num_bytes] = [#(#mod_iter2),*]; + const MODULUS_STR: &'static str = #modulus_string; + const ZERO: [u8; #num_bytes] = [0u8; #num_bytes]; - /// Get the modulus as byte array - pub const fn modulus() -> [u8; #num_bytes] { - [#(#mod_iter3),*] - } - /// New from hex string - pub fn from_hex(hex: &str) -> Self { - assert!(hex.len() % 2 == 0); - let l = hex.len() / 2; - assert!(l <= #num_bytes); - let mut value = [0u8; #num_bytes]; - let skip = #num_bytes - l; - for i in 0..l { - value[skip + i] = - u8::from_str_radix(&hex[2 * i..2 * i + 2], 16).expect("An unexpected error occurred."); + fn new(value: [u8; #num_bytes]) -> Self { + Self { + value + } } - Self { - value + fn value(&self) -> &[u8] { + &self.value } } - /// Get hex string representation of this. - pub fn to_hex(&self) -> String { - let strs: Vec = self.value.iter().map(|b| format!("{:02x}", b)).collect(); - strs.join("") - } - - /// Zero element - pub const fn zero() -> Self { - Self { - value: [0u8; #num_bytes] + impl core::convert::AsRef<[u8]> for #ident { + fn as_ref(&self) -> &[u8] { + &self.value } } - /// Returns 2 to the power of the argument - pub fn pow2(x: usize) -> Self { - let res = num_bigint::BigUint::from(1u32) << x; - res.into() - } - - /// Create a new [`#ident`] from a `u128` literal. - pub fn from_u128(literal: u128) -> Self { - Self::from(num_bigint::BigUint::from(literal)) - } - - /// Create a new [`#ident`] from a little endian byte slice. - pub fn from_le_bytes(bytes: &[u8]) -> Self { - Self::from(num_bigint::BigUint::from_bytes_le(bytes)) - } - - /// Create a new [`#ident`] from a little endian byte slice. - pub fn from_be_bytes(bytes: &[u8]) -> Self { - Self::from(num_bigint::BigUint::from_bytes_be(bytes)) - } - - pub fn to_le_bytes(self) -> [u8; #num_bytes] { - pad(&num_bigint::BigUint::from_bytes_be(&self.value).to_bytes_le()) + impl core::fmt::Display for #ident { + fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + write!(f, "{}", self.to_hex()) + } } - } - fn pad(bytes: &[u8]) -> [u8; #num_bytes] { - let mut value = [0u8; #num_bytes]; - let upper = value.len(); - let lower = upper - bytes.len(); - value[lower..upper].copy_from_slice(&bytes); - value - } - - impl From for #ident { - fn from(x: num_bigint::BigUint) -> #ident { - let max_value = Self::modulus(); - assert!(x <= num_bigint::BigUint::from_bytes_be(&max_value), "{} is too large for type {}!", x, stringify!($ident)); - let repr = x.to_bytes_be(); - if repr.len() > #num_bytes { - panic!("{} is too large for type {}", x, stringify!(#ident)) - } - Self { - value: pad(&repr) + impl Into<[u8; #num_bytes]> for #ident { + fn into(self) -> [u8; #num_bytes] { + self.value } } - } - impl core::convert::AsRef<[u8]> for #ident { - fn as_ref(&self) -> &[u8] { - &self.value - } - } + impl core::ops::Add for #ident { + type Output = Self; - impl core::fmt::Display for #ident { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - write!(f, "{}", self.to_hex()) - } - } - - impl core::ops::Add for #ident { - type Output = Self; - - fn add(self, rhs: Self) -> Self::Output { - let lhs = num_bigint::BigUint::from_bytes_be(&self.value); - let rhs = num_bigint::BigUint::from_bytes_be(&rhs.value); - let modulus = num_bigint::BigUint::from_bytes_be(&Self::modulus()); - let res = (lhs + rhs) % modulus; - let res = res.to_bytes_be(); - assert!(res.len() <= #num_bytes); - let mut value = Self::zero(); - let offset = #num_bytes-res.len(); - for i in 0..res.len() { - value.value[offset+i] = res[i]; + fn add(self, rhs: Self) -> Self::Output { + self.fadd(rhs) } - value } - } - impl core::ops::Mul for #ident { - type Output = Self; - - fn mul(self, rhs: Self) -> Self::Output { - let lhs = num_bigint::BigUint::from_bytes_be(&self.value); - let rhs = num_bigint::BigUint::from_bytes_be(&rhs.value); - let modulus = num_bigint::BigUint::from_bytes_be(&Self::modulus()); - let res = (lhs * rhs) % modulus; - let res = res.to_bytes_be(); - assert!(res.len() <= #num_bytes); - let mut value = Self::zero(); - let offset = #num_bytes-res.len(); - for i in 0..res.len() { - value.value[offset+i] = res[i]; + impl core::ops::Mul for #ident { + type Output = Self; + + fn mul(self, rhs: Self) -> Self::Output { + self.fmul(rhs) } - value } } }; diff --git a/poly1305-rust/natmod/tests/poly1305.rs b/poly1305-rust/natmod/tests/poly1305.rs index 6ef3e51..4e27590 100644 --- a/poly1305-rust/natmod/tests/poly1305.rs +++ b/poly1305-rust/natmod/tests/poly1305.rs @@ -1,9 +1,142 @@ use natmod::nat_mod; /// This has to come from the lib. -pub trait NatMod { - const MODULUS: T; + +pub trait NatMod { + const MODULUS: [u8; LEN]; const MODULUS_STR: &'static str; + const ZERO: [u8; LEN]; + + fn new(value: [u8; LEN]) -> Self; + fn value(&self) -> &[u8]; + + /// Add self with `rhs` and return the result `self + rhs % MODULUS`. + fn fadd(self, rhs: Self) -> Self + where + Self: Sized, + { + let lhs = num_bigint::BigUint::from_bytes_be(self.value()); + let rhs = num_bigint::BigUint::from_bytes_be(rhs.value()); + let modulus = num_bigint::BigUint::from_bytes_be(&Self::MODULUS); + let res = (lhs + rhs) % modulus; + let res = res.to_bytes_be(); + assert!(res.len() <= LEN); + let mut value = Self::ZERO; + let offset = LEN - res.len(); + for i in 0..res.len() { + value[offset + i] = res[i]; + } + Self::new(value) + } + + /// Multiply self with `rhs` and return the result `self * rhs % MODULUS`. + fn fmul(self, rhs: Self) -> Self + where + Self: Sized, + { + let lhs = num_bigint::BigUint::from_bytes_be(self.value()); + let rhs = num_bigint::BigUint::from_bytes_be(rhs.value()); + let modulus = num_bigint::BigUint::from_bytes_be(&Self::MODULUS); + let res = (lhs * rhs) % modulus; + let res = res.to_bytes_be(); + assert!(res.len() <= LEN); + let mut value = Self::ZERO; + let offset = LEN - res.len(); + for i in 0..res.len() { + value[offset + i] = res[i]; + } + Self::new(value) + } + + /// Returns 2 to the power of the argument + fn pow2(x: usize) -> Self + where + Self: Sized, + { + let res = num_bigint::BigUint::from(1u32) << x; + Self::from_bigint(res) + } + + /// Create a new [`#ident`] from a `u128` literal. + fn from_u128(literal: u128) -> Self + where + Self: Sized, + { + Self::from_bigint(num_bigint::BigUint::from(literal)) + } + + /// Create a new [`#ident`] from a little endian byte slice. + fn from_le_bytes(bytes: &[u8]) -> Self + where + Self: Sized, + { + Self::from_bigint(num_bigint::BigUint::from_bytes_le(bytes)) + } + + /// Create a new [`#ident`] from a little endian byte slice. + fn from_be_bytes(bytes: &[u8]) -> Self + where + Self: Sized, + { + Self::from_bigint(num_bigint::BigUint::from_bytes_be(bytes)) + } + + fn to_le_bytes(self) -> [u8; LEN] + where + Self: Sized, + { + Self::pad(&num_bigint::BigUint::from_bytes_be(self.value()).to_bytes_le()) + } + + /// Get hex string representation of this. + fn to_hex(&self) -> String { + let strs: Vec = self.value().iter().map(|b| format!("{:02x}", b)).collect(); + strs.join("") + } + + /// New from hex string + fn from_hex(hex: &str) -> Self + where + Self: Sized, + { + assert!(hex.len() % 2 == 0); + let l = hex.len() / 2; + assert!(l <= LEN); + let mut value = [0u8; LEN]; + let skip = LEN - l; + for i in 0..l { + value[skip + i] = u8::from_str_radix(&hex[2 * i..2 * i + 2], 16) + .expect("An unexpected error occurred."); + } + Self::new(value) + } + + fn pad(bytes: &[u8]) -> [u8; LEN] { + let mut value = [0u8; LEN]; + let upper = value.len(); + let lower = upper - bytes.len(); + value[lower..upper].copy_from_slice(&bytes); + value + } + + fn from_bigint(x: num_bigint::BigUint) -> Self + where + Self: Sized, + { + let max_value = Self::MODULUS; + assert!( + x <= num_bigint::BigUint::from_bytes_be(&max_value), + "{} is too large for type {}!", + x, + stringify!($ident) + ); + let repr = x.to_bytes_be(); + if repr.len() > LEN { + panic!("{} is too large for this type", x) + } + + Self::new(Self::pad(&repr)) + } } #[nat_mod("03fffffffffffffffffffffffffffffffb", 17)] @@ -14,7 +147,7 @@ fn add() { let x = FieldElement::from_hex("03fffffffffffffffffffffffffffffffa"); let y = FieldElement::from_hex("01"); let z = x + y; - assert_eq!(FieldElement::zero().as_ref(), z.as_ref()); + assert_eq!(FieldElement::ZERO.as_ref(), z.as_ref()); let x = FieldElement::from_hex("03fffffffffffffffffffffffffffffffa"); let y = FieldElement::from_hex("02"); diff --git a/poly1305-rust/src/hacspec_helper.rs b/poly1305-rust/src/hacspec_helper.rs index 8685713..445bd57 100644 --- a/poly1305-rust/src/hacspec_helper.rs +++ b/poly1305-rust/src/hacspec_helper.rs @@ -1,5 +1,146 @@ /// This has to come from the lib. -pub trait NatMod { - const MODULUS: T; + +pub trait NatMod { + const MODULUS: [u8; LEN]; const MODULUS_STR: &'static str; + const ZERO: [u8; LEN]; + + fn new(value: [u8; LEN]) -> Self; + fn value(&self) -> &[u8]; + + /// Add self with `rhs` and return the result `self + rhs % MODULUS`. + fn fadd(self, rhs: Self) -> Self + where + Self: Sized, + { + let lhs = num_bigint::BigUint::from_bytes_be(self.value()); + let rhs = num_bigint::BigUint::from_bytes_be(rhs.value()); + let modulus = num_bigint::BigUint::from_bytes_be(&Self::MODULUS); + let res = (lhs + rhs) % modulus; + let res = res.to_bytes_be(); + assert!(res.len() <= LEN); + let mut value = Self::ZERO; + let offset = LEN - res.len(); + for i in 0..res.len() { + value[offset + i] = res[i]; + } + Self::new(value) + } + + /// Multiply self with `rhs` and return the result `self * rhs % MODULUS`. + fn fmul(self, rhs: Self) -> Self + where + Self: Sized, + { + let lhs = num_bigint::BigUint::from_bytes_be(self.value()); + let rhs = num_bigint::BigUint::from_bytes_be(rhs.value()); + let modulus = num_bigint::BigUint::from_bytes_be(&Self::MODULUS); + let res = (lhs * rhs) % modulus; + let res = res.to_bytes_be(); + assert!(res.len() <= LEN); + let mut value = Self::ZERO; + let offset = LEN - res.len(); + for i in 0..res.len() { + value[offset + i] = res[i]; + } + Self::new(value) + } + + /// Zero element + fn zero() -> Self + where + Self: Sized, + { + Self::new(Self::ZERO) + } + + /// Returns 2 to the power of the argument + fn pow2(x: usize) -> Self + where + Self: Sized, + { + let res = num_bigint::BigUint::from(1u32) << x; + Self::from_bigint(res) + } + + /// Create a new [`#ident`] from a `u128` literal. + fn from_u128(literal: u128) -> Self + where + Self: Sized, + { + Self::from_bigint(num_bigint::BigUint::from(literal)) + } + + /// Create a new [`#ident`] from a little endian byte slice. + fn from_le_bytes(bytes: &[u8]) -> Self + where + Self: Sized, + { + Self::from_bigint(num_bigint::BigUint::from_bytes_le(bytes)) + } + + /// Create a new [`#ident`] from a little endian byte slice. + fn from_be_bytes(bytes: &[u8]) -> Self + where + Self: Sized, + { + Self::from_bigint(num_bigint::BigUint::from_bytes_be(bytes)) + } + + fn to_le_bytes(self) -> [u8; LEN] + where + Self: Sized, + { + Self::pad(&num_bigint::BigUint::from_bytes_be(self.value()).to_bytes_le()) + } + + /// Get hex string representation of this. + fn to_hex(&self) -> String { + let strs: Vec = self.value().iter().map(|b| format!("{:02x}", b)).collect(); + strs.join("") + } + + /// New from hex string + fn from_hex(hex: &str) -> Self + where + Self: Sized, + { + assert!(hex.len() % 2 == 0); + let l = hex.len() / 2; + assert!(l <= LEN); + let mut value = [0u8; LEN]; + let skip = LEN - l; + for i in 0..l { + value[skip + i] = u8::from_str_radix(&hex[2 * i..2 * i + 2], 16) + .expect("An unexpected error occurred."); + } + Self::new(value) + } + + fn pad(bytes: &[u8]) -> [u8; LEN] { + let mut value = [0u8; LEN]; + let upper = value.len(); + let lower = upper - bytes.len(); + value[lower..upper].copy_from_slice(&bytes); + value + } + + fn from_bigint(x: num_bigint::BigUint) -> Self + where + Self: Sized, + { + let max_value = Self::MODULUS; + assert!( + x <= num_bigint::BigUint::from_bytes_be(&max_value), + "{} is too large for type {}!", + x, + stringify!($ident) + ); + let repr = x.to_bytes_be(); + if repr.len() > LEN { + panic!("{} is too large for this type", x) + } + + Self::new(Self::pad(&repr)) + } } From 352f8661ff48562d2f00983614cb3af5ce852122 Mon Sep 17 00:00:00 2001 From: Franziskus Kiefer Date: Tue, 4 Jul 2023 07:33:55 +0200 Subject: [PATCH 4/4] extraction --- poly1305-rust/out/Natmod.Nat_mod.fst | 6 - poly1305-rust/out/Natmod._.fst | 6 - poly1305-rust/out/Natmod.fst | 1800 ----------------- .../extraction/Poly1305.FIELDELEMENT_mod.fst | 68 + .../proofs/fstar/extraction/Poly1305.fst | 119 ++ 5 files changed, 187 insertions(+), 1812 deletions(-) delete mode 100644 poly1305-rust/out/Natmod.Nat_mod.fst delete mode 100644 poly1305-rust/out/Natmod._.fst delete mode 100644 poly1305-rust/out/Natmod.fst create mode 100644 poly1305-rust/proofs/fstar/extraction/Poly1305.FIELDELEMENT_mod.fst create mode 100644 poly1305-rust/proofs/fstar/extraction/Poly1305.fst diff --git a/poly1305-rust/out/Natmod.Nat_mod.fst b/poly1305-rust/out/Natmod.Nat_mod.fst deleted file mode 100644 index 30a4939..0000000 --- a/poly1305-rust/out/Natmod.Nat_mod.fst +++ /dev/null @@ -1,6 +0,0 @@ -module Natmod.Nat_mod -#set-options "--fuel 0 --ifuel 1 --z3rlimit 15" -open FStar.Mul -open Hacspec.Lib -open Hacspec_lib_tc - diff --git a/poly1305-rust/out/Natmod._.fst b/poly1305-rust/out/Natmod._.fst deleted file mode 100644 index 1642172..0000000 --- a/poly1305-rust/out/Natmod._.fst +++ /dev/null @@ -1,6 +0,0 @@ -module Natmod._ -#set-options "--fuel 0 --ifuel 1 --z3rlimit 15" -open FStar.Mul -open Hacspec.Lib -open Hacspec_lib_tc - diff --git a/poly1305-rust/out/Natmod.fst b/poly1305-rust/out/Natmod.fst deleted file mode 100644 index 26cc599..0000000 --- a/poly1305-rust/out/Natmod.fst +++ /dev/null @@ -1,1800 +0,0 @@ -module Natmod -#set-options "--fuel 0 --ifuel 1 --z3rlimit 15" -open FStar.Mul -open Hacspec.Lib -open Hacspec_lib_tc - -type natModAttr_t = { - mod_str:Alloc.String.string_t; - mod_bytes:Alloc.Vec.vec_t UInt8.t Alloc.Alloc.global_t; - int_size:uint_size -} - -let impl: Syn.Parse.Parse natModAttr_t = - { - parse - = - fun (input: Syn.Parse.parseBuffer_t) -> - let hoist1:Core.Result.result_t natModAttr_t Syn.Error.error_t = - Std.Ops.FromResidual.from_residual (Syn.Parse.parse input) - in - let mod_str:Alloc.String.string_t = Syn.Lit.value hoist1 in - let mod_bytes:Alloc.Vec.vec_t UInt8.t Alloc.Alloc.global_t = - Core.Result.expect (Hex.FromHex.from_hex mod_str) "Invalid hex String" - in - let _:Core.Result.result_t natModAttr_t Syn.Error.error_t = - Std.Ops.FromResidual.from_residual (Syn.Parse.parse input) - in - let hoist2:Core.Result.result_t natModAttr_t Syn.Error.error_t = - Std.Ops.FromResidual.from_residual (Syn.Parse.parse input) - in - let hoist3:Core.Result.result_t uint_size Syn.Error.error_t = Syn.Lit.base10_parse hoist2 in - let int_size:Core.Result.result_t natModAttr_t Syn.Error.error_t = - Std.Ops.FromResidual.from_residual hoist3 - in - let _:Prims.l_False = - if Prims.l_Not (Syn.Parse.is_empty input) - then - Core.Panicking.panic_fmt (Core.Fmt.new_v1 (Hacspec.Lib.unsize [ - "Left over tokens in attribute " - ]) - (Hacspec.Lib.unsize [Core.Fmt.Rt.new_debug input])) - in - Core.Result.Ok ({ mod_str = mod_str; mod_bytes = mod_bytes; int_size = int_size }) - } - -let nat_mod (attr item: Proc_macro.tokenStream_t) : Proc_macro.tokenStream_t = - Hacspec.Lib.run (let* item_ast:Syn.Derive.deriveInput_t = - match Syn.parse item with - | Core.Result.Ok data -> Std.Ops.ControlFlow.Continue data - | Core.Result.Err err -> - Std.Ops.ControlFlow.break (Core.Convert.From.from (Syn.Error.to_compile_error err)) - in - let ident:Proc_macro2.ident_t = Core.Clone.Clone.clone item_ast.ident in - let* args:natModAttr_t = - match Syn.parse attr with - | Core.Result.Ok data -> Std.Ops.ControlFlow.Continue data - | Core.Result.Err err -> - Std.Ops.ControlFlow.break (Core.Convert.From.from (Syn.Error.to_compile_error err)) - in - Std.Ops.ControlFlow.Continue - (let num_bytes:uint_size = args.int_size in - let modulus:Alloc.Vec.vec_t UInt8.t Alloc.Alloc.global_t = args.mod_bytes in - let modulus_string:Alloc.String.string_t = args.mod_str in - let padded_modulus:Alloc.Vec.vec_t UInt8.t Alloc.Alloc.global_t = - Alloc.Vec.from_elem 0uy (num_bytes - Alloc.Vec.len modulus) - in - let _:Prims.unit = - Hax_error.hax_failure "" - "alloc::vec::append(\n &mut (padded_modulus),\n &mut (deref(&mut (core::clone::Clone::clone(&(modulus))))),\n )" - - in - let mod_iter1:Core.Slice.Iter.iter_t UInt8.t = - Core.Slice.iter (Core.Ops.Deref.Deref.deref padded_modulus) - in - let mod_iter2:Core.Slice.Iter.iter_t UInt8.t = - Core.Slice.iter (Core.Ops.Deref.Deref.deref padded_modulus) - in - let mod_iter3:Core.Slice.Iter.iter_t UInt8.t = - Core.Slice.iter (Core.Ops.Deref.Deref.deref padded_modulus) - in - let res:Alloc.String.string_t = - Alloc.Fmt.format (Core.Fmt.new_v1 (Hacspec.Lib.unsize [""; "_MODULUS"]) - (Hacspec.Lib.unsize [ - Core.Fmt.Rt.new_display (Alloc.Str.to_uppercase (Core.Ops.Deref.Deref.deref (Alloc.String.ToString.to_string - ident))) - ])) - in - let const_name:Proc_macro2.ident_t = - Proc_macro2.new_ (Core.Ops.Deref.Deref.deref res) (Proc_macro2.span ident) - in - let res:Alloc.String.string_t = - Alloc.Fmt.format (Core.Fmt.new_v1 (Hacspec.Lib.unsize [""; "_MODULUS_STR"]) - (Hacspec.Lib.unsize [ - Core.Fmt.Rt.new_display (Alloc.Str.to_uppercase (Core.Ops.Deref.Deref.deref (Alloc.String.ToString.to_string - ident))) - ])) - in - let static_name:Proc_macro2.ident_t = - Proc_macro2.new_ (Core.Ops.Deref.Deref.deref res) (Proc_macro2.span ident) - in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in - let hoist8:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "derive" in - let hoist5:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Clone" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Copy" in - let hoist4:Proc_macro2.tokenStream_t = _s in - let hoist6:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist5 Proc_macro2.Parenthesis hoist4 - in - let _s:Proc_macro2.tokenStream_t = hoist6 in - let hoist7:Proc_macro2.tokenStream_t = _s in - let hoist9:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist8 Proc_macro2.Bracket hoist7 - in - let _s:Proc_macro2.tokenStream_t = hoist9 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#struct" in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in - let hoist14:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let hoist11:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in - let hoist10:Proc_macro2.tokenStream_t = _s in - let hoist12:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist11 Proc_macro2.Bracket hoist10 - in - let _s:Proc_macro2.tokenStream_t = hoist12 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in - let hoist13:Proc_macro2.tokenStream_t = _s in - let hoist15:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist14 Proc_macro2.Brace hoist13 - in - let _s:Proc_macro2.tokenStream_t = hoist15 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#const" in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens const_name _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let hoist17:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in - let hoist16:Proc_macro2.tokenStream_t = _s in - let hoist18:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist17 Proc_macro2.Bracket hoist16 - in - let _s:Proc_macro2.tokenStream_t = hoist18 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let hoist21:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _i:uint_size = 0 in - let has_iter:Quote.__private.thereIsNoIteratorInRepetition_t = { } in - let mod_iter1, i:(Core.Slice.Iter.iter_t UInt8.t & Quote.__private.hasIterator_t) = - Quote.__private.Ext.RepIteratorExt.quote_into_iter mod_iter1 - in - let has_iter = has_iter |. i in - let (_: Quote.__private.hasIterator_t):Quote.__private.hasIterator_t = has_iter in - let _i, _s, mod_iter1:(Prims.unit & Proc_macro2.tokenStream_t & - Core.Slice.Iter.iter_t UInt8.t) = - Hax_error.hax_failure "" - "{\n (loop {\n |Tuple3(_i, _s, mod_iter1)| {\n (if true {\n {\n let Tuple2(todo_fresh_var, mod_iter1_temp): tuple2<\n core::option::Option,\n core::slice::iter::Iter,\n > = { core::iter::traits::iterator::Iterator::next(mod_iter1) };\n {\n let mod_iter1: core::slice::iter::Iter = { mod_iter1_temp };\n {\n let hoist19: core::option::Option =\n { todo_fresh_var };\n {\n let mod_iter1: quote::__private::RepInterp = {\n (match hoist19 {\n core::option::Some(_x) => {\n quote::__private::RepInterp(_x)\n }\n core::option::None => {\n hax_error::hax_failure(\"\", \"(break (Tuple0))\")\n }\n })\n };\n {\n let _s: proc_macro2::TokenStream = {\n (if BinOp::Ast.Gt(_i, 0) {\n {\n let _s: proc_macro2::TokenStream =\n { quote::__private::push_comma(_s) };\n _s\n }\n } else {\n _s\n })\n };\n {\n let Tuple0: tuple0 = { BinOp::Ast.Add(_i, 1) };\n {\n let _i: tuple0 = { Tuple0 };\n {\n let _s: proc_macro2::TokenStream = {\n quote::to_tokens::ToTokens::to_tokens(\n mod_iter1, _s,\n )\n };\n Tuple3(_i, _s, mod_iter1)\n }\n }\n }\n }\n }\n }\n }\n }\n } else {\n {\n let _: tuple0 = { hax_error::hax_failure(\"\", \"(break (Tuple0))\") };\n Tuple3(_i, _s, mod_iter1)\n }\n })\n }\n })(Tuple3(_i, _s, mod_iter1))\n }" - - in - let hoist20:Proc_macro2.tokenStream_t = _s in - let hoist22:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist21 Proc_macro2.Bracket hoist20 - in - let _s:Proc_macro2.tokenStream_t = hoist22 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#static" in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens static_name _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "str" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens modulus_string _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#impl" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "NatMod" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lt _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_gt _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in - let hoist31:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#const" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "MODULUS" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in - let hoist28:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let hoist25:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _i:uint_size = 0 in - let has_iter:Quote.__private.thereIsNoIteratorInRepetition_t = { } in - let mod_iter2, i:(Core.Slice.Iter.iter_t UInt8.t & Quote.__private.hasIterator_t) = - Quote.__private.Ext.RepIteratorExt.quote_into_iter mod_iter2 - in - let has_iter = has_iter |. i in - let (_: Quote.__private.hasIterator_t):Quote.__private.hasIterator_t = has_iter in - let _i, _s, mod_iter2:(Prims.unit & Proc_macro2.tokenStream_t & - Core.Slice.Iter.iter_t UInt8.t) = - Hax_error.hax_failure "" - "{\n (loop {\n |Tuple3(_i, _s, mod_iter2)| {\n (if true {\n {\n let Tuple2(todo_fresh_var, mod_iter2_temp): tuple2<\n core::option::Option,\n core::slice::iter::Iter,\n > = { core::iter::traits::iterator::Iterator::next(mod_iter2) };\n {\n let mod_iter2: core::slice::iter::Iter = { mod_iter2_temp };\n {\n let hoist23: core::option::Option =\n { todo_fresh_var };\n {\n let mod_iter2: quote::__private::RepInterp = {\n (match hoist23 {\n core::option::Some(_x) => {\n quote::__private::RepInterp(_x)\n }\n core::option::None => {\n hax_error::hax_failure(\"\", \"(break (Tuple0))\")\n }\n })\n };\n {\n let _s: proc_macro2::TokenStream = {\n (if BinOp::Ast.Gt(_i, 0) {\n {\n let _s: proc_macro2::TokenStream =\n { quote::__private::push_comma(_s) };\n _s\n }\n } else {\n _s\n })\n };\n {\n let Tuple0: tuple0 = { BinOp::Ast.Add(_i, 1) };\n {\n let _i: tuple0 = { Tuple0 };\n {\n let _s: proc_macro2::TokenStream = {\n quote::to_tokens::ToTokens::to_tokens(\n mod_iter2, _s,\n )\n };\n Tuple3(_i, _s, mod_iter2)\n }\n }\n }\n }\n }\n }\n }\n }\n } else {\n {\n let _: tuple0 = { hax_error::hax_failure(\"\", \"(break (Tuple0))\") };\n Tuple3(_i, _s, mod_iter2)\n }\n })\n }\n })(Tuple3(_i, _s, mod_iter2))\n }" - - in - let hoist24:Proc_macro2.tokenStream_t = _s in - let hoist26:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist25 Proc_macro2.Bracket hoist24 - in - let _s:Proc_macro2.tokenStream_t = hoist26 in - let hoist27:Proc_macro2.tokenStream_t = _s in - let hoist29:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist28 Proc_macro2.Brace hoist27 - in - let _s:Proc_macro2.tokenStream_t = hoist29 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#const" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "MODULUS_STR" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lifetime _s "'static" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "str" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens modulus_string _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let hoist30:Proc_macro2.tokenStream_t = _s in - let hoist32:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist31 Proc_macro2.Brace hoist30 - in - let _s:Proc_macro2.tokenStream_t = hoist32 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#impl" in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in - let hoist197:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in - let hoist34:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.parse _s "r\" Get the modulus as string\"" - in - let hoist33:Proc_macro2.tokenStream_t = _s in - let hoist35:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist34 Proc_macro2.Bracket hoist33 - in - let _s:Proc_macro2.tokenStream_t = hoist35 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#const" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus_string" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lifetime _s "'static" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "str" in - let hoist37:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens modulus_string _s in - let hoist36:Proc_macro2.tokenStream_t = _s in - let hoist38:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist37 Proc_macro2.Brace hoist36 - in - let _s:Proc_macro2.tokenStream_t = hoist38 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in - let hoist40:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.parse _s "r\" Get the modulus as byte array\"" - in - let hoist39:Proc_macro2.tokenStream_t = _s in - let hoist41:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist40 Proc_macro2.Bracket hoist39 - in - let _s:Proc_macro2.tokenStream_t = hoist41 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#const" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let hoist43:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in - let hoist42:Proc_macro2.tokenStream_t = _s in - let hoist44:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist43 Proc_macro2.Bracket hoist42 - in - let _s:Proc_macro2.tokenStream_t = hoist44 in - let hoist50:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let hoist47:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _i:uint_size = 0 in - let has_iter:Quote.__private.thereIsNoIteratorInRepetition_t = { } in - let mod_iter3, i:(Core.Slice.Iter.iter_t UInt8.t & Quote.__private.hasIterator_t) = - Quote.__private.Ext.RepIteratorExt.quote_into_iter mod_iter3 - in - let has_iter = has_iter |. i in - let (_: Quote.__private.hasIterator_t):Quote.__private.hasIterator_t = has_iter in - let _i, _s, mod_iter3:(Prims.unit & Proc_macro2.tokenStream_t & - Core.Slice.Iter.iter_t UInt8.t) = - Hax_error.hax_failure "" - "{\n (loop {\n |Tuple3(_i, _s, mod_iter3)| {\n (if true {\n {\n let Tuple2(todo_fresh_var, mod_iter3_temp): tuple2<\n core::option::Option,\n core::slice::iter::Iter,\n > = { core::iter::traits::iterator::Iterator::next(mod_iter3) };\n {\n let mod_iter3: core::slice::iter::Iter = { mod_iter3_temp };\n {\n let hoist45: core::option::Option =\n { todo_fresh_var };\n {\n let mod_iter3: quote::__private::RepInterp = {\n (match hoist45 {\n core::option::Some(_x) => {\n quote::__private::RepInterp(_x)\n }\n core::option::None => {\n hax_error::hax_failure(\"\", \"(break (Tuple0))\")\n }\n })\n };\n {\n let _s: proc_macro2::TokenStream = {\n (if BinOp::Ast.Gt(_i, 0) {\n {\n let _s: proc_macro2::TokenStream =\n { quote::__private::push_comma(_s) };\n _s\n }\n } else {\n _s\n })\n };\n {\n let Tuple0: tuple0 = { BinOp::Ast.Add(_i, 1) };\n {\n let _i: tuple0 = { Tuple0 };\n {\n let _s: proc_macro2::TokenStream = {\n quote::to_tokens::ToTokens::to_tokens(\n mod_iter3, _s,\n )\n };\n Tuple3(_i, _s, mod_iter3)\n }\n }\n }\n }\n }\n }\n }\n }\n } else {\n {\n let _: tuple0 = { hax_error::hax_failure(\"\", \"(break (Tuple0))\") };\n Tuple3(_i, _s, mod_iter3)\n }\n })\n }\n })(Tuple3(_i, _s, mod_iter3))\n }" - - in - let hoist46:Proc_macro2.tokenStream_t = _s in - let hoist48:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist47 Proc_macro2.Bracket hoist46 - in - let _s:Proc_macro2.tokenStream_t = hoist48 in - let hoist49:Proc_macro2.tokenStream_t = _s in - let hoist51:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist50 Proc_macro2.Brace hoist49 - in - let _s:Proc_macro2.tokenStream_t = hoist51 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in - let hoist53:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "r\" New from hex string\"" in - let hoist52:Proc_macro2.tokenStream_t = _s in - let hoist54:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist53 Proc_macro2.Bracket hoist52 - in - let _s:Proc_macro2.tokenStream_t = hoist54 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_hex" in - let hoist56:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "hex" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "str" in - let hoist55:Proc_macro2.tokenStream_t = _s in - let hoist57:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist56 Proc_macro2.Parenthesis hoist55 - in - let _s:Proc_macro2.tokenStream_t = hoist57 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let hoist86:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "assert" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in - let hoist59:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "hex" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rem _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "2" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "0" in - let hoist58:Proc_macro2.tokenStream_t = _s in - let hoist60:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist59 Proc_macro2.Parenthesis hoist58 - in - let _s:Proc_macro2.tokenStream_t = hoist60 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "l" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "hex" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_div _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "2" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "assert" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in - let hoist62:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "l" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_le _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in - let hoist61:Proc_macro2.tokenStream_t = _s in - let hoist63:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist62 Proc_macro2.Parenthesis hoist61 - in - let _s:Proc_macro2.tokenStream_t = hoist63 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#mut" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let hoist65:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "0u8" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in - let hoist64:Proc_macro2.tokenStream_t = _s in - let hoist66:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist65 Proc_macro2.Bracket hoist64 - in - let _s:Proc_macro2.tokenStream_t = hoist66 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "skip" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_sub _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "l" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#in" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "0" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "l" in - let hoist80:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let hoist68:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "skip" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_add _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in - let hoist67:Proc_macro2.tokenStream_t = _s in - let hoist69:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist68 Proc_macro2.Bracket hoist67 - in - let _s:Proc_macro2.tokenStream_t = hoist69 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_str_radix" in - let hoist74:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "hex" in - let hoist71:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "2" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_star _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "2" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_star _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_add _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "2" in - let hoist70:Proc_macro2.tokenStream_t = _s in - let hoist72:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist71 Proc_macro2.Bracket hoist70 - in - let _s:Proc_macro2.tokenStream_t = hoist72 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "16" in - let hoist73:Proc_macro2.tokenStream_t = _s in - let hoist75:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist74 Proc_macro2.Parenthesis hoist73 - in - let _s:Proc_macro2.tokenStream_t = hoist75 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "expect" in - let hoist77:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.parse _s "\"An unexpected error occurred.\"" - in - let hoist76:Proc_macro2.tokenStream_t = _s in - let hoist78:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist77 Proc_macro2.Parenthesis hoist76 - in - let _s:Proc_macro2.tokenStream_t = hoist78 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let hoist79:Proc_macro2.tokenStream_t = _s in - let hoist81:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist80 Proc_macro2.Brace hoist79 - in - let _s:Proc_macro2.tokenStream_t = hoist81 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let hoist83:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let hoist82:Proc_macro2.tokenStream_t = _s in - let hoist84:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist83 Proc_macro2.Brace hoist82 - in - let _s:Proc_macro2.tokenStream_t = hoist84 in - let hoist85:Proc_macro2.tokenStream_t = _s in - let hoist87:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist86 Proc_macro2.Brace hoist85 - in - let _s:Proc_macro2.tokenStream_t = hoist87 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in - let hoist89:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.parse _s "r\" Get hex string representation of this.\"" - in - let hoist88:Proc_macro2.tokenStream_t = _s in - let hoist90:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist89 Proc_macro2.Bracket hoist88 - in - let _s:Proc_macro2.tokenStream_t = hoist90 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "to_hex" in - let hoist92:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in - let hoist91:Proc_macro2.tokenStream_t = _s in - let hoist93:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist92 Proc_macro2.Parenthesis hoist91 - in - let _s:Proc_macro2.tokenStream_t = hoist93 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "String" in - let hoist104:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "strs" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Vec" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lt _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "String" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_gt _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "iter" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "map" in - let hoist98:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_or _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "b" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_or _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "format" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in - let hoist95:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "\"{:02x}\"" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "b" in - let hoist94:Proc_macro2.tokenStream_t = _s in - let hoist96:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist95 Proc_macro2.Parenthesis hoist94 - in - let _s:Proc_macro2.tokenStream_t = hoist96 in - let hoist97:Proc_macro2.tokenStream_t = _s in - let hoist99:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist98 Proc_macro2.Parenthesis hoist97 - in - let _s:Proc_macro2.tokenStream_t = hoist99 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "collect" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "strs" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "join" in - let hoist101:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "\"\"" in - let hoist100:Proc_macro2.tokenStream_t = _s in - let hoist102:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist101 Proc_macro2.Parenthesis hoist100 - in - let _s:Proc_macro2.tokenStream_t = hoist102 in - let hoist103:Proc_macro2.tokenStream_t = _s in - let hoist105:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist104 Proc_macro2.Brace hoist103 - in - let _s:Proc_macro2.tokenStream_t = hoist105 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in - let hoist107:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "r\" Zero element\"" in - let hoist106:Proc_macro2.tokenStream_t = _s in - let hoist108:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist107 Proc_macro2.Bracket hoist106 - in - let _s:Proc_macro2.tokenStream_t = hoist108 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#const" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "zero" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let hoist116:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let hoist113:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let hoist110:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "0u8" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in - let hoist109:Proc_macro2.tokenStream_t = _s in - let hoist111:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist110 Proc_macro2.Bracket hoist109 - in - let _s:Proc_macro2.tokenStream_t = hoist111 in - let hoist112:Proc_macro2.tokenStream_t = _s in - let hoist114:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist113 Proc_macro2.Brace hoist112 - in - let _s:Proc_macro2.tokenStream_t = hoist114 in - let hoist115:Proc_macro2.tokenStream_t = _s in - let hoist117:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist116 Proc_macro2.Brace hoist115 - in - let _s:Proc_macro2.tokenStream_t = hoist117 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in - let hoist119:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.parse _s "r\" Returns 2 to the power of the argument\"" - in - let hoist118:Proc_macro2.tokenStream_t = _s in - let hoist120:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist119 Proc_macro2.Bracket hoist118 - in - let _s:Proc_macro2.tokenStream_t = hoist120 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "pow2" in - let hoist122:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "x" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "usize" in - let hoist121:Proc_macro2.tokenStream_t = _s in - let hoist123:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist122 Proc_macro2.Parenthesis hoist121 - in - let _s:Proc_macro2.tokenStream_t = hoist123 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let hoist128:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from" in - let hoist125:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "1u32" in - let hoist124:Proc_macro2.tokenStream_t = _s in - let hoist126:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist125 Proc_macro2.Parenthesis hoist124 - in - let _s:Proc_macro2.tokenStream_t = hoist126 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_shl _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "x" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "into" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let hoist127:Proc_macro2.tokenStream_t = _s in - let hoist129:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist128 Proc_macro2.Brace hoist127 - in - let _s:Proc_macro2.tokenStream_t = hoist129 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in - let hoist131:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.parse _s "r\" Create a new [`#ident`] from a `u128` literal.\"" - in - let hoist130:Proc_macro2.tokenStream_t = _s in - let hoist132:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist131 Proc_macro2.Bracket hoist130 - in - let _s:Proc_macro2.tokenStream_t = hoist132 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_u128" in - let hoist134:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "literal" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u128" in - let hoist133:Proc_macro2.tokenStream_t = _s in - let hoist135:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist134 Proc_macro2.Parenthesis hoist133 - in - let _s:Proc_macro2.tokenStream_t = hoist135 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let hoist143:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from" in - let hoist140:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from" in - let hoist137:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "literal" in - let hoist136:Proc_macro2.tokenStream_t = _s in - let hoist138:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist137 Proc_macro2.Parenthesis hoist136 - in - let _s:Proc_macro2.tokenStream_t = hoist138 in - let hoist139:Proc_macro2.tokenStream_t = _s in - let hoist141:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist140 Proc_macro2.Parenthesis hoist139 - in - let _s:Proc_macro2.tokenStream_t = hoist141 in - let hoist142:Proc_macro2.tokenStream_t = _s in - let hoist144:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist143 Proc_macro2.Brace hoist142 - in - let _s:Proc_macro2.tokenStream_t = hoist144 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in - let hoist146:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.parse _s "r\" Create a new [`#ident`] from a little endian byte slice.\"" - in - let hoist145:Proc_macro2.tokenStream_t = _s in - let hoist147:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist146 Proc_macro2.Bracket hoist145 - in - let _s:Proc_macro2.tokenStream_t = hoist147 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_le_bytes" in - let hoist152:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "bytes" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let hoist149:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in - let hoist148:Proc_macro2.tokenStream_t = _s in - let hoist150:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist149 Proc_macro2.Bracket hoist148 - in - let _s:Proc_macro2.tokenStream_t = hoist150 in - let hoist151:Proc_macro2.tokenStream_t = _s in - let hoist153:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist152 Proc_macro2.Parenthesis hoist151 - in - let _s:Proc_macro2.tokenStream_t = hoist153 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let hoist161:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from" in - let hoist158:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_le" in - let hoist155:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "bytes" in - let hoist154:Proc_macro2.tokenStream_t = _s in - let hoist156:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist155 Proc_macro2.Parenthesis hoist154 - in - let _s:Proc_macro2.tokenStream_t = hoist156 in - let hoist157:Proc_macro2.tokenStream_t = _s in - let hoist159:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist158 Proc_macro2.Parenthesis hoist157 - in - let _s:Proc_macro2.tokenStream_t = hoist159 in - let hoist160:Proc_macro2.tokenStream_t = _s in - let hoist162:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist161 Proc_macro2.Brace hoist160 - in - let _s:Proc_macro2.tokenStream_t = hoist162 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_pound _s in - let hoist164:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "doc" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.parse _s "r\" Create a new [`#ident`] from a little endian byte slice.\"" - in - let hoist163:Proc_macro2.tokenStream_t = _s in - let hoist165:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist164 Proc_macro2.Bracket hoist163 - in - let _s:Proc_macro2.tokenStream_t = hoist165 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_be_bytes" in - let hoist170:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "bytes" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let hoist167:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in - let hoist166:Proc_macro2.tokenStream_t = _s in - let hoist168:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist167 Proc_macro2.Bracket hoist166 - in - let _s:Proc_macro2.tokenStream_t = hoist168 in - let hoist169:Proc_macro2.tokenStream_t = _s in - let hoist171:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist170 Proc_macro2.Parenthesis hoist169 - in - let _s:Proc_macro2.tokenStream_t = hoist171 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let hoist179:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from" in - let hoist176:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in - let hoist173:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "bytes" in - let hoist172:Proc_macro2.tokenStream_t = _s in - let hoist174:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist173 Proc_macro2.Parenthesis hoist172 - in - let _s:Proc_macro2.tokenStream_t = hoist174 in - let hoist175:Proc_macro2.tokenStream_t = _s in - let hoist177:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist176 Proc_macro2.Parenthesis hoist175 - in - let _s:Proc_macro2.tokenStream_t = hoist177 in - let hoist178:Proc_macro2.tokenStream_t = _s in - let hoist180:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist179 Proc_macro2.Brace hoist178 - in - let _s:Proc_macro2.tokenStream_t = hoist180 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#pub" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "to_le_bytes" in - let hoist182:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in - let hoist181:Proc_macro2.tokenStream_t = _s in - let hoist183:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist182 Proc_macro2.Parenthesis hoist181 - in - let _s:Proc_macro2.tokenStream_t = hoist183 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let hoist185:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in - let hoist184:Proc_macro2.tokenStream_t = _s in - let hoist186:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist185 Proc_macro2.Bracket hoist184 - in - let _s:Proc_macro2.tokenStream_t = hoist186 in - let hoist194:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "pad" in - let hoist191:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in - let hoist188:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let hoist187:Proc_macro2.tokenStream_t = _s in - let hoist189:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist188 Proc_macro2.Parenthesis hoist187 - in - let _s:Proc_macro2.tokenStream_t = hoist189 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "to_bytes_le" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let hoist190:Proc_macro2.tokenStream_t = _s in - let hoist192:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist191 Proc_macro2.Parenthesis hoist190 - in - let _s:Proc_macro2.tokenStream_t = hoist192 in - let hoist193:Proc_macro2.tokenStream_t = _s in - let hoist195:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist194 Proc_macro2.Brace hoist193 - in - let _s:Proc_macro2.tokenStream_t = hoist195 in - let hoist196:Proc_macro2.tokenStream_t = _s in - let hoist198:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist197 Proc_macro2.Brace hoist196 - in - let _s:Proc_macro2.tokenStream_t = hoist198 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "pad" in - let hoist203:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "bytes" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let hoist200:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in - let hoist199:Proc_macro2.tokenStream_t = _s in - let hoist201:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist200 Proc_macro2.Bracket hoist199 - in - let _s:Proc_macro2.tokenStream_t = hoist201 in - let hoist202:Proc_macro2.tokenStream_t = _s in - let hoist204:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist203 Proc_macro2.Parenthesis hoist202 - in - let _s:Proc_macro2.tokenStream_t = hoist204 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let hoist206:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in - let hoist205:Proc_macro2.tokenStream_t = _s in - let hoist207:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist206 Proc_macro2.Bracket hoist205 - in - let _s:Proc_macro2.tokenStream_t = hoist207 in - let hoist218:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#mut" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let hoist209:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "0u8" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in - let hoist208:Proc_macro2.tokenStream_t = _s in - let hoist210:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist209 Proc_macro2.Bracket hoist208 - in - let _s:Proc_macro2.tokenStream_t = hoist210 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "upper" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "lower" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "upper" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_sub _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "bytes" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let hoist212:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "lower" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "upper" in - let hoist211:Proc_macro2.tokenStream_t = _s in - let hoist213:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist212 Proc_macro2.Bracket hoist211 - in - let _s:Proc_macro2.tokenStream_t = hoist213 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "copy_from_slice" in - let hoist215:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "bytes" in - let hoist214:Proc_macro2.tokenStream_t = _s in - let hoist216:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist215 Proc_macro2.Parenthesis hoist214 - in - let _s:Proc_macro2.tokenStream_t = hoist216 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let hoist217:Proc_macro2.tokenStream_t = _s in - let hoist219:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist218 Proc_macro2.Brace hoist217 - in - let _s:Proc_macro2.tokenStream_t = hoist219 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#impl" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "From" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lt _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_gt _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in - let hoist251:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from" in - let hoist221:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "x" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in - let hoist220:Proc_macro2.tokenStream_t = _s in - let hoist222:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist221 Proc_macro2.Parenthesis hoist220 - in - let _s:Proc_macro2.tokenStream_t = hoist222 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in - let hoist248:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "max_value" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "assert" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in - let hoist230:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "x" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_le _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in - let hoist224:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "max_value" in - let hoist223:Proc_macro2.tokenStream_t = _s in - let hoist225:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist224 Proc_macro2.Parenthesis hoist223 - in - let _s:Proc_macro2.tokenStream_t = hoist225 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.parse _s "\"{} is too large for type {}!\"" - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "x" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "stringify" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in - let hoist227:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "$" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "ident" in - let hoist226:Proc_macro2.tokenStream_t = _s in - let hoist228:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist227 Proc_macro2.Parenthesis hoist226 - in - let _s:Proc_macro2.tokenStream_t = hoist228 in - let hoist229:Proc_macro2.tokenStream_t = _s in - let hoist231:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist230 Proc_macro2.Parenthesis hoist229 - in - let _s:Proc_macro2.tokenStream_t = hoist231 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "repr" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "x" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "to_bytes_be" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#if" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "repr" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_gt _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in - let hoist239:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "panic" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in - let hoist236:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.parse _s "\"{} is too large for type {}\"" - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "x" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "stringify" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in - let hoist233:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in - let hoist232:Proc_macro2.tokenStream_t = _s in - let hoist234:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist233 Proc_macro2.Parenthesis hoist232 - in - let _s:Proc_macro2.tokenStream_t = hoist234 in - let hoist235:Proc_macro2.tokenStream_t = _s in - let hoist237:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist236 Proc_macro2.Parenthesis hoist235 - in - let _s:Proc_macro2.tokenStream_t = hoist237 in - let hoist238:Proc_macro2.tokenStream_t = _s in - let hoist240:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist239 Proc_macro2.Brace hoist238 - in - let _s:Proc_macro2.tokenStream_t = hoist240 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let hoist245:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "pad" in - let hoist242:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "repr" in - let hoist241:Proc_macro2.tokenStream_t = _s in - let hoist243:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist242 Proc_macro2.Parenthesis hoist241 - in - let _s:Proc_macro2.tokenStream_t = hoist243 in - let hoist244:Proc_macro2.tokenStream_t = _s in - let hoist246:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist245 Proc_macro2.Brace hoist244 - in - let _s:Proc_macro2.tokenStream_t = hoist246 in - let hoist247:Proc_macro2.tokenStream_t = _s in - let hoist249:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist248 Proc_macro2.Brace hoist247 - in - let _s:Proc_macro2.tokenStream_t = hoist249 in - let hoist250:Proc_macro2.tokenStream_t = _s in - let hoist252:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist251 Proc_macro2.Brace hoist250 - in - let _s:Proc_macro2.tokenStream_t = hoist252 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#impl" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "core" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "convert" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "AsRef" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lt _s in - let hoist254:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in - let hoist253:Proc_macro2.tokenStream_t = _s in - let hoist255:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist254 Proc_macro2.Bracket hoist253 - in - let _s:Proc_macro2.tokenStream_t = hoist255 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_gt _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in - let hoist266:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "as_ref" in - let hoist257:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in - let hoist256:Proc_macro2.tokenStream_t = _s in - let hoist258:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist257 Proc_macro2.Parenthesis hoist256 - in - let _s:Proc_macro2.tokenStream_t = hoist258 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let hoist260:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "u8" in - let hoist259:Proc_macro2.tokenStream_t = _s in - let hoist261:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist260 Proc_macro2.Bracket hoist259 - in - let _s:Proc_macro2.tokenStream_t = hoist261 in - let hoist263:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let hoist262:Proc_macro2.tokenStream_t = _s in - let hoist264:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist263 Proc_macro2.Brace hoist262 - in - let _s:Proc_macro2.tokenStream_t = hoist264 in - let hoist265:Proc_macro2.tokenStream_t = _s in - let hoist267:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist266 Proc_macro2.Brace hoist265 - in - let _s:Proc_macro2.tokenStream_t = hoist267 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#impl" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "core" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "fmt" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Display" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in - let hoist278:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "fmt" in - let hoist269:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "f" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#mut" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "core" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "fmt" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Formatter" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lt _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_lifetime _s "'_" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_gt _s in - let hoist268:Proc_macro2.tokenStream_t = _s in - let hoist270:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist269 Proc_macro2.Parenthesis hoist268 - in - let _s:Proc_macro2.tokenStream_t = hoist270 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "core" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "fmt" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Result" in - let hoist275:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "write" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in - let hoist272:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "f" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "\"{}\"" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "to_hex" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let hoist271:Proc_macro2.tokenStream_t = _s in - let hoist273:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist272 Proc_macro2.Parenthesis hoist271 - in - let _s:Proc_macro2.tokenStream_t = hoist273 in - let hoist274:Proc_macro2.tokenStream_t = _s in - let hoist276:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist275 Proc_macro2.Brace hoist274 - in - let _s:Proc_macro2.tokenStream_t = hoist276 in - let hoist277:Proc_macro2.tokenStream_t = _s in - let hoist279:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist278 Proc_macro2.Brace hoist277 - in - let _s:Proc_macro2.tokenStream_t = hoist279 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#impl" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "core" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "ops" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Add" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in - let hoist311:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#type" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Output" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "add" in - let hoist281:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let hoist280:Proc_macro2.tokenStream_t = _s in - let hoist282:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist281 Proc_macro2.Parenthesis hoist280 - in - let _s:Proc_macro2.tokenStream_t = hoist282 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Output" in - let hoist308:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "lhs" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in - let hoist284:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let hoist283:Proc_macro2.tokenStream_t = _s in - let hoist285:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist284 Proc_macro2.Parenthesis hoist283 - in - let _s:Proc_macro2.tokenStream_t = hoist285 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in - let hoist287:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let hoist286:Proc_macro2.tokenStream_t = _s in - let hoist288:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist287 Proc_macro2.Parenthesis hoist286 - in - let _s:Proc_macro2.tokenStream_t = hoist288 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in - let hoist290:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let hoist289:Proc_macro2.tokenStream_t = _s in - let hoist291:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist290 Proc_macro2.Parenthesis hoist289 - in - let _s:Proc_macro2.tokenStream_t = hoist291 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let hoist293:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "lhs" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_add _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in - let hoist292:Proc_macro2.tokenStream_t = _s in - let hoist294:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist293 Proc_macro2.Parenthesis hoist292 - in - let _s:Proc_macro2.tokenStream_t = hoist294 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rem _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "to_bytes_be" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "assert" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in - let hoist296:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_le _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in - let hoist295:Proc_macro2.tokenStream_t = _s in - let hoist297:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist296 Proc_macro2.Parenthesis hoist295 - in - let _s:Proc_macro2.tokenStream_t = hoist297 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#mut" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "zero" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "offset" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_sub _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#in" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "0" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let hoist305:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let hoist299:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "offset" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_add _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in - let hoist298:Proc_macro2.tokenStream_t = _s in - let hoist300:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist299 Proc_macro2.Bracket hoist298 - in - let _s:Proc_macro2.tokenStream_t = hoist300 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let hoist302:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in - let hoist301:Proc_macro2.tokenStream_t = _s in - let hoist303:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist302 Proc_macro2.Bracket hoist301 - in - let _s:Proc_macro2.tokenStream_t = hoist303 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let hoist304:Proc_macro2.tokenStream_t = _s in - let hoist306:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist305 Proc_macro2.Brace hoist304 - in - let _s:Proc_macro2.tokenStream_t = hoist306 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let hoist307:Proc_macro2.tokenStream_t = _s in - let hoist309:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist308 Proc_macro2.Brace hoist307 - in - let _s:Proc_macro2.tokenStream_t = hoist309 in - let hoist310:Proc_macro2.tokenStream_t = _s in - let hoist312:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist311 Proc_macro2.Brace hoist310 - in - let _s:Proc_macro2.tokenStream_t = hoist312 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#impl" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "core" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "ops" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Mul" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens ident _s in - let hoist344:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#type" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Output" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#fn" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "mul" in - let hoist314:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_comma _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let hoist313:Proc_macro2.tokenStream_t = _s in - let hoist315:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist314 Proc_macro2.Parenthesis hoist313 - in - let _s:Proc_macro2.tokenStream_t = hoist315 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rarrow _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Output" in - let hoist341:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "lhs" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in - let hoist317:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let hoist316:Proc_macro2.tokenStream_t = _s in - let hoist318:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist317 Proc_macro2.Parenthesis hoist316 - in - let _s:Proc_macro2.tokenStream_t = hoist318 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in - let hoist320:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let hoist319:Proc_macro2.tokenStream_t = _s in - let hoist321:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist320 Proc_macro2.Parenthesis hoist319 - in - let _s:Proc_macro2.tokenStream_t = hoist321 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "num_bigint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "BigUint" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "from_bytes_be" in - let hoist323:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_and _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let hoist322:Proc_macro2.tokenStream_t = _s in - let hoist324:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist323 Proc_macro2.Parenthesis hoist322 - in - let _s:Proc_macro2.tokenStream_t = hoist324 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let hoist326:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "lhs" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_star _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "rhs" in - let hoist325:Proc_macro2.tokenStream_t = _s in - let hoist327:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist326 Proc_macro2.Parenthesis hoist325 - in - let _s:Proc_macro2.tokenStream_t = hoist327 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_rem _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "modulus" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "to_bytes_be" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "assert" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_bang _s in - let hoist329:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_le _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in - let hoist328:Proc_macro2.tokenStream_t = _s in - let hoist330:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist329 Proc_macro2.Parenthesis hoist328 - in - let _s:Proc_macro2.tokenStream_t = hoist330 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#mut" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "Self" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_colon2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "zero" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#let" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "offset" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.To_tokens.ToTokens.to_tokens num_bytes _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_sub _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#for" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "r#in" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.parse _s "0" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot2 _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "len" in - let _s:Proc_macro2.tokenStream_t = - Quote.__private.push_group _s Proc_macro2.Parenthesis Proc_macro2.new_ - in - let hoist338:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_dot _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let hoist332:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "offset" in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_add _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in - let hoist331:Proc_macro2.tokenStream_t = _s in - let hoist333:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist332 Proc_macro2.Bracket hoist331 - in - let _s:Proc_macro2.tokenStream_t = hoist333 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_eq _s in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "res" in - let hoist335:Proc_macro2.tokenStream_t = _s in - let _s:Proc_macro2.tokenStream_t = Proc_macro2.new_ in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "i" in - let hoist334:Proc_macro2.tokenStream_t = _s in - let hoist336:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist335 Proc_macro2.Bracket hoist334 - in - let _s:Proc_macro2.tokenStream_t = hoist336 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_semi _s in - let hoist337:Proc_macro2.tokenStream_t = _s in - let hoist339:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist338 Proc_macro2.Brace hoist337 - in - let _s:Proc_macro2.tokenStream_t = hoist339 in - let _s:Proc_macro2.tokenStream_t = Quote.__private.push_ident _s "value" in - let hoist340:Proc_macro2.tokenStream_t = _s in - let hoist342:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist341 Proc_macro2.Brace hoist340 - in - let _s:Proc_macro2.tokenStream_t = hoist342 in - let hoist343:Proc_macro2.tokenStream_t = _s in - let hoist345:Proc_macro2.tokenStream_t = - Quote.__private.push_group hoist344 Proc_macro2.Brace hoist343 - in - let _s:Proc_macro2.tokenStream_t = hoist345 in - let out_struct:Proc_macro2.tokenStream_t = _s in - Core.Convert.Into.into out_struct)) - -let _: Prims.unit = () \ No newline at end of file diff --git a/poly1305-rust/proofs/fstar/extraction/Poly1305.FIELDELEMENT_mod.fst b/poly1305-rust/proofs/fstar/extraction/Poly1305.FIELDELEMENT_mod.fst new file mode 100644 index 0000000..e5516bc --- /dev/null +++ b/poly1305-rust/proofs/fstar/extraction/Poly1305.FIELDELEMENT_mod.fst @@ -0,0 +1,68 @@ +module Poly1305.FIELDELEMENT_mod +#set-options "--fuel 0 --ifuel 1 --z3rlimit 15" +open Core + +let v_FIELDELEMENT_MODULUS: array u8 17sz = + (let l = + [ + 3uy; 255uy; 255uy; 255uy; 255uy; 255uy; 255uy; 255uy; 255uy; 255uy; 255uy; 255uy; 255uy; + 255uy; 255uy; 255uy; 251uy + ] + in + assert_norm (List.Tot.length l == 17); + Rust_primitives.Hax.array_of_list l) + +let impl: Poly1305.Hacspec_helper.t_NatMod Poly1305.t_FieldElement 17sz = + { + mODULUS + = + (fun -> + (let l = + [ + 3uy; 255uy; 255uy; 255uy; 255uy; 255uy; 255uy; 255uy; 255uy; 255uy; 255uy; 255uy; + 255uy; 255uy; 255uy; 255uy; 251uy + ] + in + assert_norm (List.Tot.length l == 17); + Rust_primitives.Hax.array_of_list l)); + mODULUS_STR = (fun -> "03fffffffffffffffffffffffffffffffb"); + zERO = (fun -> Rust_primitives.Hax.repeat 0uy 17sz); + new_ = (fun (value: array u8 17sz) -> { Poly1305.FieldElement.f_value = value }); + value + = + fun (self: Poly1305.t_FieldElement) -> Rust_primitives.unsize self.Poly1305.FieldElement.f_value + } + +let impl: Core.Convert.t_AsRef Poly1305.t_FieldElement (slice u8) = + { + as_ref + = + fun (self: Poly1305.t_FieldElement) -> Rust_primitives.unsize self.Poly1305.FieldElement.f_value + } + +(* +Last available AST for this item: + +/* TO DO */ + *) + +let impl: Core.Convert.t_Into Poly1305.t_FieldElement (array u8 17sz) = + { into = fun (self: Poly1305.t_FieldElement) -> self.Poly1305.FieldElement.f_value } + +let impl: Core.Ops.Arith.t_Add Poly1305.t_FieldElement Poly1305.t_FieldElement = + { + output = Poly1305.t_FieldElement; + add + = + fun (self: Poly1305.t_FieldElement) (rhs: Poly1305.t_FieldElement) -> + Poly1305.Hacspec_helper.NatMod.fadd self rhs + } + +let impl: Core.Ops.Arith.t_Mul Poly1305.t_FieldElement Poly1305.t_FieldElement = + { + output = Poly1305.t_FieldElement; + mul + = + fun (self: Poly1305.t_FieldElement) (rhs: Poly1305.t_FieldElement) -> + Poly1305.Hacspec_helper.NatMod.fmul self rhs + } \ No newline at end of file diff --git a/poly1305-rust/proofs/fstar/extraction/Poly1305.fst b/poly1305-rust/proofs/fstar/extraction/Poly1305.fst new file mode 100644 index 0000000..8905cd3 --- /dev/null +++ b/poly1305-rust/proofs/fstar/extraction/Poly1305.fst @@ -0,0 +1,119 @@ +module Poly1305 +#set-options "--fuel 0 --ifuel 1 --z3rlimit 15" +open Core + +let t_PolyKey = array u8 32sz + +let v_BLOCKSIZE: usize = 16sz + +let t_PolyBlock = array u8 16sz + +let t_Poly1305Tag = array u8 16sz + +let t_SubBlock = Alloc.Vec.t_Vec u8 Alloc.Alloc.t_Global + +let t_BlockIndex = usize + +type t_FieldElement = { f_value:array u8 17sz } + +type t_PolyState = { + f_acc:t_FieldElement; + f_r:t_FieldElement; + f_key:array u8 32sz +} + +let poly1305_encode_r (b: array u8 16sz) : t_FieldElement = + let n:u128 = Core.Num.from_le_bytes_under_impl_10 b in + let n:u128 = n &. pub_u128 21267647620597763993911028882763415551sz in + Poly1305.Hacspec_helper.NatMod.from_u128 n + +let poly1305_encode_block (b: array u8 16sz) : _ = + let f:t_FieldElement = Poly1305.Hacspec_helper.NatMod.from_le_bytes (Rust_primitives.unsize b) in + f +. Poly1305.Hacspec_helper.NatMod.pow2 128sz + +let poly1305_encode_last (pad_len: usize) (b: slice u8) : _ = + let f:t_FieldElement = Poly1305.Hacspec_helper.NatMod.from_le_bytes b in + f +. Poly1305.Hacspec_helper.NatMod.pow2 (8sz *. pad_len) + +let poly1305_init (key: array u8 32sz) : t_PolyState = + let r:t_FieldElement = + poly1305_encode_r (Core.Result.unwrap_under_impl (Core.Convert.TryInto.try_into key.[ { + Core.Ops.Range.Range.f_start = 0sz; + Core.Ops.Range.Range.f_end = 16sz + } ])) + in + { + Poly1305.PolyState.f_acc = Poly1305.Hacspec_helper.NatMod.zero; + Poly1305.PolyState.f_r = r; + Poly1305.PolyState.f_key = key + } + +let poly1305_update_block (b: array u8 16sz) (st: t_PolyState) : t_PolyState = + let st:t_PolyState = + { + st with + Poly1305.PolyState.f_acc + = + (poly1305_encode_block b +. st.Poly1305.PolyState.f_acc) *. st.Poly1305.PolyState.f_r + } + in + st + +let poly1305_update_blocks (m: slice u8) (st: t_PolyState) : t_PolyState = + let st:t_PolyState = + Core.Iter.Traits.Iterator.Iterator.fold (Core.Iter.Traits.Collect.IntoIterator.into_iter (Core.Slice.chunks_exact_under_impl + m + v_BLOCKSIZE)) + st + (fun st chunk -> + poly1305_update_block (Core.Result.unwrap_under_impl (Core.Convert.TryInto.try_into chunk) + ) + st) + in + st + +let poly1305_update_last (pad_len: usize) (b: slice u8) (st: t_PolyState) : t_PolyState = + let st:t_PolyState = st in + let st:t_PolyState = + if Core.Slice.len_under_impl b <>. 0sz + then + let st:t_PolyState = + { + st with + Poly1305.PolyState.f_acc + = + (poly1305_encode_last pad_len b +. st.Poly1305.PolyState.f_acc) *. + st.Poly1305.PolyState.f_r + } + in + st + else st + in + st + +let poly1305_update (m: slice u8) (st: t_PolyState) : t_PolyState = + let st:t_PolyState = poly1305_update_blocks m st in + let last:slice u8 = + Core.Slice.Iter.remainder_under_impl_87 (Core.Slice.chunks_exact_under_impl m v_BLOCKSIZE) + in + poly1305_update_last (Core.Slice.len_under_impl last) last st + +let poly1305_finish (st: t_PolyState) : array u8 16sz = + let n:u128 = + Core.Num.from_le_bytes_under_impl_10 (Core.Result.unwrap_under_impl (Core.Convert.TryInto.try_into + st.Poly1305.PolyState.f_key.[ { + Core.Ops.Range.Range.f_start = 16sz; + Core.Ops.Range.Range.f_end = 32sz + } ])) + in + let aby:array u8 17sz = Poly1305.Hacspec_helper.NatMod.to_le_bytes st.Poly1305.PolyState.f_acc in + let a:u128 = + Core.Num.from_le_bytes_under_impl_10 (Core.Result.unwrap_under_impl (Core.Convert.TryInto.try_into + aby.[ { Core.Ops.Range.Range.f_start = 0sz; Core.Ops.Range.Range.f_end = 16sz } ])) + in + Core.Num.to_le_bytes_under_impl_10 (Core.Num.wrapping_add_under_impl_10 a n) + +let poly1305 (m: slice u8) (key: array u8 32sz) : array u8 16sz = + let st:t_PolyState = poly1305_init key in + let st:t_PolyState = poly1305_update m st in + poly1305_finish st \ No newline at end of file