use crate::signer::DevSigner;
use super::{Signer, SignerError};
fn seed_for_role(role: &str) -> [u8; 32] {
match role {
"audit" => [11u8; 32],
"receipt" | "decision" => [7u8; 32],
_ => {
let mut s = [0u8; 32];
for (i, b) in role.as_bytes().iter().enumerate() {
s[i % 32] ^= *b;
}
s
}
}
}
pub struct DevSignerLockedDown {
inner: DevSigner,
role: String,
}
impl DevSignerLockedDown {
pub fn from_env(role: &str) -> Result<Self, SignerError> {
if std::env::var("SBO3L_DEV_ONLY_SIGNER").as_deref() != Ok("1") {
return Err(SignerError::DevOnlyLockout);
}
eprintln!("⚠ DEV ONLY SIGNER ⚠");
eprintln!(
" SBO3L_DEV_ONLY_SIGNER=1 is set; using deterministic public dev seeds for role '{role}'."
);
eprintln!(
" Anyone with this repo can forge signatures that pass verify_hex against this backend."
);
let key_id = format!("{role}-dev-v1");
Ok(Self {
inner: DevSigner::from_seed(key_id, seed_for_role(role)),
role: role.to_string(),
})
}
pub fn inner(&self) -> &DevSigner {
&self.inner
}
pub fn into_inner(self) -> DevSigner {
self.inner
}
pub fn role(&self) -> &str {
&self.role
}
}
impl Signer for DevSignerLockedDown {
fn sign_hex(&self, message: &[u8]) -> Result<String, SignerError> {
Ok(self.inner.sign_hex(message))
}
fn verifying_key_hex(&self) -> Result<String, SignerError> {
Ok(self.inner.verifying_key_hex())
}
fn key_id(&self) -> &str {
&self.inner.key_id
}
}
impl Signer for DevSigner {
fn sign_hex(&self, message: &[u8]) -> Result<String, SignerError> {
Ok(DevSigner::sign_hex(self, message))
}
fn verifying_key_hex(&self) -> Result<String, SignerError> {
Ok(DevSigner::verifying_key_hex(self))
}
fn key_id(&self) -> &str {
&self.key_id
}
}