use dever_runtime::time::calendar::{Date, DateTime, Time}; use dever_runtime::value::secret::Secret; use sha2::{Digest, Sha256}; fn primitive_fault() -> Fault { &FaultInfo { message: "extended primitive failed", source: "extended-primitives-reference", line: 1, column: 1, } } fn digest_score(bytes: &dever_runtime::Bytes) -> u64 { bytes.iter().fold(0u64, |score, byte| { score.wrapping_mul(31).wrapping_add(u64::from(*byte)) }) } fn sha_reference(bytes: &dever_runtime::Bytes) -> Result { Ok(Sha256::digest(bytes).to_vec().into()) } struct HmacCase { key: Secret, bytes: dever_runtime::Bytes, } fn hmac_generated(values: &[HmacCase]) -> Result { let Some(value) = values.first() else { return Ok(dever_runtime::Bytes::new()); }; EXT_HMAC(&value.key, &value.bytes) } // 共用批准的 Secret 接收点;不读取密钥内部字节。 fn hmac_reference(values: &[HmacCase]) -> Result { Ok(values .first() .map_or_else(Vec::new, |value| { dever_runtime::crypto::hmac_sha256(&value.key, &value.bytes) }) .into()) } fn datetime_generated(values: &[String]) -> Result, Fault> { EXT_DATETIME(values).map_err(|_| primitive_fault()) } fn datetime_reference(values: &[String]) -> Result, Fault> { values .iter() .map(|value| { DateTime::parse(value) .and_then(DateTime::format) .map_err(|_| primitive_fault()) }) .collect() } fn date_generated(values: &[String]) -> Result, Fault> { EXT_DATE(values).map_err(|_| primitive_fault()) } fn date_reference(values: &[String]) -> Result, Fault> { values .iter() .map(|value| { Date::parse(value) .and_then(Date::format) .map_err(|_| primitive_fault()) }) .collect() } fn time_generated(values: &[String]) -> Result, Fault> { EXT_TIME(values).map_err(|_| primitive_fault()) } fn time_reference(values: &[String]) -> Result, Fault> { values .iter() .map(|value| { Time::parse(value) .and_then(Time::format) .map_err(|_| primitive_fault()) }) .collect() } fn text_score(values: &Vec) -> u64 { values .iter() .flat_map(|value| value.bytes()) .fold(0u64, |score, byte| { score.wrapping_mul(31).wrapping_add(u64::from(byte)) }) } fn uuid_generated(values: &[String]) -> Result>, Fault> { EXT_UUID(values) } fn uuid_reference(values: &[String]) -> Result>, Fault> { Ok(values .iter() .map(|value| { if value.len() != 36 { return None; } uuid::Uuid::try_parse(value) .ok() .map(|value| value.hyphenated().to_string()) }) .collect()) } fn uuid_score(values: &Vec>) -> u64 { values.iter().fold(0u64, |score, value| { value.as_ref().map_or(score.wrapping_add(1), |value| { value.bytes().fold(score.wrapping_add(2), |score, byte| { score.wrapping_mul(31).wrapping_add(u64::from(byte)) }) }) }) } fn check_primitives() { assert_eq!( EXT_SHA256(&dever_runtime::Bytes::from_static(b"abc")) .unwrap() .as_ref(), [ 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad, ] ); // 沿用已有密码学验收的公开向量,不使用真实凭据。 let vector = [HmacCase { key: Secret::from_input(vec![0x0b; 20]), bytes: dever_runtime::Bytes::from_static(b"Hi There"), }]; assert_eq!( hmac_generated(&vector).unwrap().as_ref(), [ 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7, ] ); assert_eq!( hmac_generated(&vector).unwrap(), hmac_reference(&vector).unwrap() ); assert_eq!( datetime_generated(&["2024-02-29T12:34:56.12+08:00".into()]).unwrap(), ["2024-02-29T04:34:56.120Z"] ); assert_eq!( time_generated(&["12:34:56.000".into()]).unwrap(), ["12:34:56"] ); for value in ["2023-02-29", "2024-2-29"] { let values = [value.to_owned()]; assert!(date_generated(&values).is_err()); assert!(date_reference(&values).is_err()); } for value in ["24:00:00", "12:34:56.1"] { let values = [value.to_owned()]; assert!(time_generated(&values).is_err()); assert!(time_reference(&values).is_err()); } let values = ["2024-02-29T00:00:00.1234Z".to_owned()]; assert!(datetime_generated(&values).is_err()); assert!(datetime_reference(&values).is_err()); } fn main() { check_primitives(); println!("case,sample,implementation,elapsed_ns,checksum"); for size in [0usize, 64, 4096] { let bytes = dever_runtime::Bytes::from(vec![0x61; size]); compare_bytes( &format!("crypto_sha256_{size}"), &bytes, 2000, EXT_SHA256, sha_reference, digest_score, ); let values = [HmacCase { key: Secret::from_input(vec![0x0b; 20]), bytes, }]; compare_named( &format!("crypto_hmac_{size}_shared_runtime"), &values, 2000, hmac_generated, hmac_reference, digest_score, "rust_runtime", ); } // 日历参照保留相同精度、年份范围、非法输入和 UTC 规范化规则。 let datetimes = [ "1970-01-01T00:00:00Z", "2024-02-29T12:34:56.12+08:00", "1969-12-31T23:59:59.999Z", ] .map(str::to_owned); let dates = ["2024-02-29", "2000-01-01", "9999-12-31"].map(str::to_owned); let times = ["00:00:00", "12:34:56.000", "23:59:59.999"].map(str::to_owned); compare_named( "calendar_datetime_shared_runtime", &datetimes, 2000, datetime_generated, datetime_reference, text_score, "rust_runtime", ); compare_named( "calendar_date_shared_runtime", &dates, 2000, date_generated, date_reference, text_score, "rust_runtime", ); compare_named( "calendar_time_shared_runtime", ×, 2000, time_generated, time_reference, text_score, "rust_runtime", ); let valid = [ "550E8400-E29B-41D4-A716-446655440000", "00000000-0000-0000-0000-000000000000", ] .map(str::to_owned); assert_eq!( uuid_generated(&valid).unwrap()[0].as_deref(), Some("550e8400-e29b-41d4-a716-446655440000") ); let invalid = [ "", "550e8400e29b41d4a716446655440000", "00000000-0000-0000-0000-00000000000-", ] .map(str::to_owned); assert_eq!(uuid_generated(&invalid).unwrap(), vec![None; invalid.len()]); compare( "uuid_parse_format", &valid, 2000, uuid_generated, uuid_reference, uuid_score, ); compare( "uuid_parse_invalid", &invalid, 2000, uuid_generated, uuid_reference, uuid_score, ); }