miden_stdlib_sys/intrinsics/
crypto.rs1#![allow(warnings, clippy::infallible_try_from)]
5
6use core::convert::Infallible;
7
8use crate::intrinsics::{Felt, Word};
9
10#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug)]
14#[repr(transparent)]
15pub struct Digest {
16 pub inner: Word,
17}
18
19impl Digest {
20 #[inline]
22 pub fn new(felts: [Felt; 4]) -> Self {
23 Self {
24 inner: Word::from(felts),
25 }
26 }
27
28 #[inline]
30 pub const fn from_word(word: Word) -> Self {
31 Self { inner: word }
32 }
33}
34
35impl TryFrom<Word> for Digest {
36 type Error = Infallible;
37
38 #[inline]
39 fn try_from(word: Word) -> Result<Self, Self::Error> {
40 Ok(Self::from_word(word))
41 }
42}
43
44impl From<Digest> for Word {
45 #[inline]
46 fn from(digest: Digest) -> Self {
47 digest.inner
48 }
49}
50
51impl From<[Felt; 4]> for Digest {
52 #[inline]
53 fn from(felts: [Felt; 4]) -> Self {
54 Self::new(felts)
55 }
56}
57
58impl From<Digest> for [Felt; 4] {
59 #[inline]
60 fn from(digest: Digest) -> Self {
61 (&digest.inner).into()
62 }
63}
64
65#[cfg(all(target_family = "wasm", miden))]
66unsafe extern "C" {
67 #[cfg_attr(all(target_family = "wasm", miden), linkage = "extern_weak")]
76 #[link_name = "miden::core::crypto::hashes::poseidon2::merge"]
77 fn extern_poseidon2_merge(
78 a0: Felt,
79 a1: Felt,
80 a2: Felt,
81 a3: Felt,
82 b0: Felt,
83 b1: Felt,
84 b2: Felt,
85 b3: Felt,
86 result_ptr: *mut Felt,
87 );
88}
89
90#[inline]
99#[cfg(all(target_family = "wasm", miden))]
100pub fn merge(digests: [Digest; 2]) -> Digest {
101 unsafe {
102 let mut ret_area = ::core::mem::MaybeUninit::<Word>::uninit();
103 let result_ptr = ret_area.as_mut_ptr() as *mut Felt;
104
105 extern_poseidon2_merge(
106 digests[0].inner.a,
107 digests[0].inner.b,
108 digests[0].inner.c,
109 digests[0].inner.d,
110 digests[1].inner.a,
111 digests[1].inner.b,
112 digests[1].inner.c,
113 digests[1].inner.d,
114 result_ptr,
115 );
116
117 Digest::from_word(ret_area.assume_init())
118 }
119}
120
121#[inline]
124#[cfg(not(all(target_family = "wasm", miden)))]
125pub fn merge(_digests: [Digest; 2]) -> Digest {
126 unimplemented!("crypto intrinsics are only available when targeting the Miden VM")
127}