Skip to main content

rhdl_ed25519_fast_core/
core.rs

1//! Public sign-and-verify black box.
2//!
3//! [`Fast64Core`] is the only module an accelerator shell needs to instantiate.
4//! It contains the cached-key signer, strict verifier, and lossless completion
5//! arbiter while exposing the stable types in [`crate::protocol`].
6
7use rhdl::prelude::*;
8
9use crate::{
10    protocol::{Fast64CoreIn, Fast64CoreOut},
11    result_arbiter::{ResultArbiter, ResultArbiterIn, SignCompletion, VerifyCompletion},
12    sign::{CachedSignCore, CachedSignIn},
13    verify::{StrictVerifyCore, StrictVerifyIn},
14};
15
16/// Fully native-RHDL Ed25519 accelerator for 64-byte messages.
17#[derive(Clone, Debug, Synchronous, SynchronousDQ, Default)]
18pub struct Fast64Core {
19    signer: CachedSignCore,
20    verifier: StrictVerifyCore,
21    results: ResultArbiter,
22}
23
24impl SynchronousIO for Fast64Core {
25    type I = Fast64CoreIn;
26    type O = Fast64CoreOut;
27    type Kernel = fast64_core_kernel;
28}
29
30/// State transition for [`Fast64Core`].
31#[kernel]
32pub fn fast64_core_kernel(
33    _cr: ClockReset,
34    i: Fast64CoreIn,
35    q: Fast64CoreQ,
36) -> (Fast64CoreOut, Fast64CoreD) {
37    let output = Fast64CoreOut {
38        load_key_ready: q.signer.load_key_ready,
39        key_loaded: q.signer.key_loaded,
40        cached_public_key: q.signer.public_key,
41        sign_ready: q.signer.ready,
42        verify_ready: q.verifier.ready,
43        result: q.results.result,
44        internal_error: q.signer.internal_error || q.results.internal_error,
45    };
46    let mut d = Fast64CoreD::dont_care();
47    d.signer = CachedSignIn {
48        load_key_valid: i.load_key_valid,
49        key_seed: i.key_seed,
50        clear_key: i.clear_key,
51        valid: i.sign_valid,
52        request: i.sign,
53    };
54    d.verifier = StrictVerifyIn {
55        valid: i.verify_valid,
56        request: i.verify,
57    };
58    d.results = ResultArbiterIn {
59        sign: SignCompletion {
60            valid: q.signer.valid,
61            tag: q.signer.tag,
62            signature: q.signer.signature,
63        },
64        verify: VerifyCompletion {
65            valid: q.verifier.valid,
66            tag: q.verifier.tag,
67            ok: q.verifier.ok,
68            error: q.verifier.error,
69        },
70        sign_internal_error: q.signer.internal_error,
71        verify_internal_error: false,
72    };
73    (output, d)
74}
75
76#[cfg(test)]
77mod tests {
78    use super::*;
79
80    #[test]
81    #[ignore = "large whole-core elaboration; run explicitly before physical implementation"]
82    fn compiles_to_native_rhdl_netlist() -> miette::Result<()> {
83        unsafe { std::env::set_var("RHDL_SKIP_IVERILOG_CHECK", "1") };
84        Fast64Core::default().descriptor(ScopedName::top())?.hdl()?;
85        Ok(())
86    }
87}