1#[cfg(feature = "alloc")]
56use alloc::vec::Vec;
57
58#[derive(Debug, Clone, Copy, PartialEq, Eq)]
76#[cfg_attr(feature = "thiserror", derive(thiserror::Error))]
77pub enum CborError {
78 #[cfg_attr(feature = "thiserror", error("Invalid CBOR encoding"))]
80 InvalidEncoding,
81
82 #[cfg_attr(feature = "thiserror", error("Unexpected CBOR structure"))]
84 UnexpectedStructure,
85
86 #[cfg_attr(feature = "thiserror", error("Serialization failed"))]
88 SerializationFailed,
89
90 #[cfg_attr(feature = "thiserror", error("Deserialization failed"))]
92 DeserializationFailed,
93
94 #[cfg_attr(feature = "thiserror", error("Invalid byte length"))]
96 InvalidLength,
97
98 #[cfg_attr(feature = "thiserror", error("Buffer too small"))]
100 BufferTooSmall,
101
102 #[cfg_attr(feature = "thiserror", error("Invalid UTF-8 encoding"))]
104 InvalidUtf8,
105
106 #[cfg_attr(feature = "thiserror", error("Unsupported CBOR feature"))]
108 Unsupported,
109}
110
111#[cfg(not(feature = "thiserror"))]
112impl core::fmt::Display for CborError {
113 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
114 match self {
115 CborError::InvalidEncoding => write!(f, "Invalid CBOR encoding"),
116 CborError::UnexpectedStructure => write!(f, "Unexpected CBOR structure"),
117 CborError::SerializationFailed => write!(f, "Serialization failed"),
118 CborError::DeserializationFailed => write!(f, "Deserialization failed"),
119 CborError::InvalidLength => write!(f, "Invalid byte length"),
120 CborError::BufferTooSmall => write!(f, "Buffer too small"),
121 CborError::InvalidUtf8 => write!(f, "Invalid UTF-8 encoding"),
122 CborError::Unsupported => write!(f, "Unsupported CBOR feature"),
123 }
124 }
125}
126
127#[cfg(all(not(feature = "thiserror"), feature = "std"))]
128impl std::error::Error for CborError {}
129
130#[cfg(feature = "alloc")]
150pub fn encode_bytes(bytes: &[u8]) -> Vec<u8> {
151 let len = bytes.len();
152 let mut result = Vec::new();
153
154 if len < 24 {
156 result.push(0x40 | len as u8); } else if len < 256 {
159 result.push(0x58); result.push(len as u8);
162 } else if len < 65536 {
163 result.push(0x59); result.extend_from_slice(&(len as u16).to_be_bytes());
166 } else {
167 result.push(0x5a); result.extend_from_slice(&(len as u32).to_be_bytes());
170 }
171
172 result.extend_from_slice(bytes);
173 result
174}
175
176#[cfg(feature = "alloc")]
191pub fn decode_bytes(cbor: &[u8]) -> Result<Vec<u8>, CborError> {
192 if cbor.is_empty() {
193 return Err(CborError::InvalidEncoding);
194 }
195
196 let header = cbor[0];
197 let major_type = (header >> 5) & 0x07;
198
199 if major_type != 2 {
201 return Err(CborError::UnexpectedStructure);
202 }
203
204 let additional_info = header & 0x1f;
205
206 let (length, offset) = if additional_info < 24 {
207 (additional_info as usize, 1)
209 } else if additional_info == 24 {
210 if cbor.len() < 2 {
212 return Err(CborError::BufferTooSmall);
213 }
214 (cbor[1] as usize, 2)
215 } else if additional_info == 25 {
216 if cbor.len() < 3 {
218 return Err(CborError::BufferTooSmall);
219 }
220 let len = u16::from_be_bytes([cbor[1], cbor[2]]) as usize;
221 (len, 3)
222 } else if additional_info == 26 {
223 if cbor.len() < 5 {
225 return Err(CborError::BufferTooSmall);
226 }
227 let len = u32::from_be_bytes([cbor[1], cbor[2], cbor[3], cbor[4]]) as usize;
228 (len, 5)
229 } else {
230 return Err(CborError::InvalidEncoding);
231 };
232
233 if cbor.len() < offset + length {
235 return Err(CborError::BufferTooSmall);
236 }
237
238 Ok(cbor[offset..offset + length].to_vec())
240}
241
242#[cfg(feature = "alloc")]
256#[inline]
257pub fn encode_verification_key(raw_bytes: &[u8]) -> Vec<u8> {
258 encode_bytes(raw_bytes)
259}
260
261#[cfg(feature = "alloc")]
276#[inline]
277pub fn decode_verification_key(cbor: &[u8]) -> Result<Vec<u8>, CborError> {
278 decode_bytes(cbor)
279}
280
281#[cfg(feature = "alloc")]
297#[inline]
298pub fn encode_signature(raw_bytes: &[u8]) -> Vec<u8> {
299 encode_bytes(raw_bytes)
300}
301
302#[cfg(feature = "alloc")]
306#[inline]
307pub fn decode_signature(cbor: &[u8]) -> Result<Vec<u8>, CborError> {
308 decode_bytes(cbor)
309}
310
311#[cfg(feature = "alloc")]
319#[inline]
320pub fn encode_verification_key_kes(raw_bytes: &[u8]) -> Vec<u8> {
321 encode_bytes(raw_bytes)
322}
323
324#[cfg(feature = "alloc")]
328#[inline]
329pub fn decode_verification_key_kes(cbor: &[u8]) -> Result<Vec<u8>, CborError> {
330 decode_bytes(cbor)
331}
332
333#[cfg(feature = "alloc")]
337#[inline]
338pub fn encode_signature_kes(raw_bytes: &[u8]) -> Vec<u8> {
339 encode_bytes(raw_bytes)
340}
341
342#[cfg(feature = "alloc")]
346#[inline]
347pub fn decode_signature_kes(cbor: &[u8]) -> Result<Vec<u8>, CborError> {
348 decode_bytes(cbor)
349}
350
351#[cfg(feature = "alloc")]
359#[inline]
360pub fn encode_verification_key_vrf(raw_bytes: &[u8]) -> Vec<u8> {
361 encode_bytes(raw_bytes)
362}
363
364#[cfg(feature = "alloc")]
368#[inline]
369pub fn decode_verification_key_vrf(cbor: &[u8]) -> Result<Vec<u8>, CborError> {
370 decode_bytes(cbor)
371}
372
373#[cfg(feature = "alloc")]
382#[inline]
383pub fn encode_signing_key_vrf(raw_bytes: &[u8]) -> Vec<u8> {
384 encode_bytes(raw_bytes)
385}
386
387#[cfg(feature = "alloc")]
391#[inline]
392pub fn decode_signing_key_vrf(cbor: &[u8]) -> Result<Vec<u8>, CborError> {
393 decode_bytes(cbor)
394}
395
396#[cfg(feature = "alloc")]
400#[inline]
401pub fn encode_proof_vrf(raw_bytes: &[u8]) -> Vec<u8> {
402 encode_bytes(raw_bytes)
403}
404
405#[cfg(feature = "alloc")]
409#[inline]
410pub fn decode_proof_vrf(cbor: &[u8]) -> Result<Vec<u8>, CborError> {
411 decode_bytes(cbor)
412}
413
414#[cfg(feature = "alloc")]
422#[inline]
423pub fn encode_verification_key_dsign(raw_bytes: &[u8]) -> Vec<u8> {
424 encode_bytes(raw_bytes)
425}
426
427#[cfg(feature = "alloc")]
431#[inline]
432pub fn decode_verification_key_dsign(cbor: &[u8]) -> Result<Vec<u8>, CborError> {
433 decode_bytes(cbor)
434}
435
436#[cfg(feature = "alloc")]
445#[inline]
446pub fn encode_signing_key_dsign(raw_bytes: &[u8]) -> Vec<u8> {
447 encode_bytes(raw_bytes)
448}
449
450#[cfg(feature = "alloc")]
454#[inline]
455pub fn decode_signing_key_dsign(cbor: &[u8]) -> Result<Vec<u8>, CborError> {
456 decode_bytes(cbor)
457}
458
459#[cfg(feature = "alloc")]
463#[inline]
464pub fn encode_signature_dsign(raw_bytes: &[u8]) -> Vec<u8> {
465 encode_bytes(raw_bytes)
466}
467
468#[cfg(feature = "alloc")]
472#[inline]
473pub fn decode_signature_dsign(cbor: &[u8]) -> Result<Vec<u8>, CborError> {
474 decode_bytes(cbor)
475}
476
477#[cfg(feature = "alloc")]
483#[inline]
484pub fn encode_hash(raw_bytes: &[u8]) -> Vec<u8> {
485 encode_bytes(raw_bytes)
486}
487
488#[cfg(feature = "alloc")]
490#[inline]
491pub fn decode_hash(cbor: &[u8]) -> Result<Vec<u8>, CborError> {
492 decode_bytes(cbor)
493}
494
495#[cfg(feature = "alloc")]
503#[inline]
504pub fn encode_output_vrf(raw_bytes: &[u8]) -> Vec<u8> {
505 encode_bytes(raw_bytes)
506}
507
508#[cfg(feature = "alloc")]
512#[inline]
513pub fn decode_output_vrf(cbor: &[u8]) -> Result<Vec<u8>, CborError> {
514 decode_bytes(cbor)
515}
516
517#[cfg(feature = "alloc")]
530#[inline]
531pub fn encode_signing_key_kes(raw_bytes: &[u8]) -> Vec<u8> {
532 encode_bytes(raw_bytes)
533}
534
535#[cfg(feature = "alloc")]
539#[inline]
540pub fn decode_signing_key_kes(cbor: &[u8]) -> Result<Vec<u8>, CborError> {
541 decode_bytes(cbor)
542}
543
544#[must_use]
563pub const fn encoded_size_bytes(len: usize) -> usize {
564 if len < 24 {
565 1 + len
566 } else if len < 256 {
567 2 + len
568 } else if len < 65536 {
569 3 + len
570 } else {
571 5 + len
572 }
573}
574
575#[must_use]
579pub const fn encoded_verification_key_size(raw_size: usize) -> usize {
580 encoded_size_bytes(raw_size)
581}
582
583#[must_use]
587pub const fn encoded_signature_size(raw_size: usize) -> usize {
588 encoded_size_bytes(raw_size)
589}
590
591#[must_use]
609pub const fn encoded_verification_key_dsign_size() -> usize {
610 encoded_size_bytes(32)
612}
613
614#[must_use]
628pub const fn encoded_signing_key_dsign_size() -> usize {
629 encoded_size_bytes(64)
631}
632
633#[must_use]
647pub const fn encoded_signature_dsign_size() -> usize {
648 encoded_size_bytes(64)
650}
651
652#[must_use]
670pub const fn encoded_verification_key_vrf_size() -> usize {
671 encoded_size_bytes(32)
673}
674
675#[must_use]
689pub const fn encoded_signing_key_vrf_size() -> usize {
690 encoded_size_bytes(64)
692}
693
694#[must_use]
708pub const fn encoded_proof_vrf_draft03_size() -> usize {
709 encoded_size_bytes(80)
711}
712
713#[must_use]
726pub const fn encoded_proof_vrf_draft13_size() -> usize {
727 encoded_size_bytes(128)
729}
730
731#[must_use]
745pub const fn encoded_output_vrf_size() -> usize {
746 encoded_size_bytes(64)
748}
749
750#[must_use]
767pub const fn encoded_verification_key_kes_size() -> usize {
768 encoded_size_bytes(32)
770}
771
772#[must_use]
786pub const fn encoded_signing_key_sum6kes_size() -> usize {
787 encoded_size_bytes(2112)
789}
790
791#[must_use]
805pub const fn encoded_signature_sum6kes_size() -> usize {
806 encoded_size_bytes(448)
808}
809
810#[must_use]
824pub const fn encoded_hash_blake2b224_size() -> usize {
825 encoded_size_bytes(28)
826}
827
828#[must_use]
838pub const fn encoded_hash_blake2b256_size() -> usize {
839 encoded_size_bytes(32)
840}
841
842pub trait ToCbor {
851 #[cfg(feature = "alloc")]
853 fn to_cbor(&self) -> Vec<u8>;
854
855 fn encoded_size(&self) -> usize;
857}
858
859pub trait FromCbor: Sized {
864 fn from_cbor(bytes: &[u8]) -> Result<Self, CborError>;
866}
867
868impl ToCbor for [u8; 32] {
873 #[cfg(feature = "alloc")]
874 fn to_cbor(&self) -> Vec<u8> {
875 encode_bytes(self)
876 }
877
878 fn encoded_size(&self) -> usize {
879 encoded_size_bytes(32)
880 }
881}
882
883impl FromCbor for [u8; 32] {
884 fn from_cbor(bytes: &[u8]) -> Result<Self, CborError> {
885 let decoded = decode_bytes(bytes)?;
886 if decoded.len() != 32 {
887 return Err(CborError::InvalidLength);
888 }
889 let mut arr = [0u8; 32];
890 arr.copy_from_slice(&decoded);
891 Ok(arr)
892 }
893}
894
895impl ToCbor for [u8; 64] {
896 #[cfg(feature = "alloc")]
897 fn to_cbor(&self) -> Vec<u8> {
898 encode_bytes(self)
899 }
900
901 fn encoded_size(&self) -> usize {
902 encoded_size_bytes(64)
903 }
904}
905
906impl FromCbor for [u8; 64] {
907 fn from_cbor(bytes: &[u8]) -> Result<Self, CborError> {
908 let decoded = decode_bytes(bytes)?;
909 if decoded.len() != 64 {
910 return Err(CborError::InvalidLength);
911 }
912 let mut arr = [0u8; 64];
913 arr.copy_from_slice(&decoded);
914 Ok(arr)
915 }
916}
917
918impl ToCbor for [u8; 80] {
919 #[cfg(feature = "alloc")]
920 fn to_cbor(&self) -> Vec<u8> {
921 encode_bytes(self)
922 }
923
924 fn encoded_size(&self) -> usize {
925 encoded_size_bytes(80)
926 }
927}
928
929impl FromCbor for [u8; 80] {
930 fn from_cbor(bytes: &[u8]) -> Result<Self, CborError> {
931 let decoded = decode_bytes(bytes)?;
932 if decoded.len() != 80 {
933 return Err(CborError::InvalidLength);
934 }
935 let mut arr = [0u8; 80];
936 arr.copy_from_slice(&decoded);
937 Ok(arr)
938 }
939}
940
941#[cfg(feature = "alloc")]
942impl ToCbor for Vec<u8> {
943 fn to_cbor(&self) -> Vec<u8> {
944 encode_bytes(self)
945 }
946
947 fn encoded_size(&self) -> usize {
948 encoded_size_bytes(self.len())
949 }
950}
951
952#[cfg(feature = "alloc")]
953impl FromCbor for Vec<u8> {
954 fn from_cbor(bytes: &[u8]) -> Result<Self, CborError> {
955 decode_bytes(bytes)
956 }
957}
958
959#[cfg(test)]
960mod tests {
961 use super::*;
962
963 #[test]
964 fn test_cbor_encode_decode_short() {
965 let data = vec![0x01, 0x02, 0x03, 0x04, 0x05];
967 let encoded = encode_bytes(&data);
968
969 assert_eq!(encoded[0], 0x45);
971 assert_eq!(&encoded[1..], &data[..]);
972
973 let decoded = decode_bytes(&encoded).unwrap();
974 assert_eq!(decoded, data);
975 }
976
977 #[test]
978 fn test_cbor_encode_decode_medium() {
979 let data = vec![0xAB; 200];
981 let encoded = encode_bytes(&data);
982
983 assert_eq!(encoded[0], 0x58);
985 assert_eq!(encoded[1], 200);
986
987 let decoded = decode_bytes(&encoded).unwrap();
988 assert_eq!(decoded, data);
989 }
990
991 #[test]
992 fn test_cbor_encode_decode_large() {
993 let data = vec![0xCD; 500];
995 let encoded = encode_bytes(&data);
996
997 assert_eq!(encoded[0], 0x59);
999 assert_eq!(u16::from_be_bytes([encoded[1], encoded[2]]), 500);
1000
1001 let decoded = decode_bytes(&encoded).unwrap();
1002 assert_eq!(decoded, data);
1003 }
1004
1005 #[test]
1006 fn test_cbor_verification_key_roundtrip() {
1007 let vk_bytes = vec![0x12; 32];
1009
1010 let encoded = encode_verification_key(&vk_bytes);
1011 let decoded = decode_verification_key(&encoded).unwrap();
1012
1013 assert_eq!(decoded, vk_bytes);
1014 }
1015
1016 #[test]
1017 fn test_cbor_signature_roundtrip() {
1018 let sig_bytes = vec![0x34; 64];
1020
1021 let encoded = encode_signature(&sig_bytes);
1022 let decoded = decode_signature(&encoded).unwrap();
1023
1024 assert_eq!(decoded, sig_bytes);
1025 }
1026
1027 #[test]
1028 fn test_cbor_invalid_major_type() {
1029 let invalid = vec![0x00]; let result = decode_bytes(&invalid);
1033 assert!(matches!(result, Err(CborError::UnexpectedStructure)));
1034 }
1035
1036 #[test]
1037 fn test_cbor_buffer_too_small() {
1038 let invalid = vec![0x58]; let result = decode_bytes(&invalid);
1042 assert!(matches!(result, Err(CborError::BufferTooSmall)));
1043 }
1044
1045 #[test]
1046 fn test_cbor_empty() {
1047 let result = decode_bytes(&[]);
1048 assert!(matches!(result, Err(CborError::InvalidEncoding)));
1049 }
1050
1051 #[test]
1052 fn test_encoded_size_bytes() {
1053 assert_eq!(encoded_size_bytes(0), 1);
1055 assert_eq!(encoded_size_bytes(23), 24);
1056 assert_eq!(encoded_size_bytes(24), 26); assert_eq!(encoded_size_bytes(255), 257);
1058 assert_eq!(encoded_size_bytes(256), 259); assert_eq!(encoded_size_bytes(65535), 65538);
1060 assert_eq!(encoded_size_bytes(65536), 65541); }
1062
1063 #[test]
1064 fn test_kes_verification_key_cbor() {
1065 let vk_bytes = vec![0xAA; 64];
1067 let encoded = encode_verification_key_kes(&vk_bytes);
1068 let decoded = decode_verification_key_kes(&encoded).unwrap();
1069 assert_eq!(decoded, vk_bytes);
1070 }
1071
1072 #[test]
1073 fn test_kes_signature_cbor() {
1074 let sig_bytes = vec![0xBB; 448]; let encoded = encode_signature_kes(&sig_bytes);
1077 let decoded = decode_signature_kes(&encoded).unwrap();
1078 assert_eq!(decoded, sig_bytes);
1079 }
1080
1081 #[test]
1082 fn test_kes_signing_key_cbor() {
1083 let sk_bytes = vec![0xCC; 128];
1085 let encoded = encode_signing_key_kes(&sk_bytes);
1086 let decoded = decode_signing_key_kes(&encoded).unwrap();
1087 assert_eq!(decoded, sk_bytes);
1088 }
1089
1090 #[test]
1091 fn test_vrf_proof_cbor() {
1092 let proof_bytes = vec![0xCC; 80];
1094 let encoded = encode_proof_vrf(&proof_bytes);
1095 let decoded = decode_proof_vrf(&encoded).unwrap();
1096 assert_eq!(decoded, proof_bytes);
1097 }
1098
1099 #[test]
1100 fn test_vrf_output_cbor() {
1101 let output_bytes = vec![0xDD; 64];
1103 let encoded = encode_output_vrf(&output_bytes);
1104 let decoded = decode_output_vrf(&encoded).unwrap();
1105 assert_eq!(decoded, output_bytes);
1106 }
1107
1108 #[test]
1109 fn test_dsign_roundtrip() {
1110 let vk = vec![0x11; 32];
1112 let vk_cbor = encode_verification_key_dsign(&vk);
1113 assert_eq!(decode_verification_key_dsign(&vk_cbor).unwrap(), vk);
1114
1115 let sig = vec![0x22; 64];
1117 let sig_cbor = encode_signature_dsign(&sig);
1118 assert_eq!(decode_signature_dsign(&sig_cbor).unwrap(), sig);
1119 }
1120
1121 #[test]
1122 fn test_hash_cbor() {
1123 let hash = vec![0xDD; 32];
1125 let encoded = encode_hash(&hash);
1126 let decoded = decode_hash(&encoded).unwrap();
1127 assert_eq!(decoded, hash);
1128 }
1129
1130 #[test]
1131 fn test_cbor_edge_cases() {
1132 let empty: Vec<u8> = vec![];
1134 let encoded = encode_bytes(&empty);
1135 assert_eq!(encoded, vec![0x40]); assert_eq!(decode_bytes(&encoded).unwrap(), empty);
1137
1138 let data_23 = vec![0xFF; 23];
1140 let encoded_23 = encode_bytes(&data_23);
1141 assert_eq!(encoded_23[0], 0x57); assert_eq!(decode_bytes(&encoded_23).unwrap(), data_23);
1143
1144 let data_24 = vec![0xEE; 24];
1146 let encoded_24 = encode_bytes(&data_24);
1147 assert_eq!(encoded_24[0], 0x58);
1148 assert_eq!(encoded_24[1], 24);
1149 assert_eq!(decode_bytes(&encoded_24).unwrap(), data_24);
1150
1151 let data_255 = vec![0xDD; 255];
1153 let encoded_255 = encode_bytes(&data_255);
1154 assert_eq!(encoded_255[0], 0x58);
1155 assert_eq!(encoded_255[1], 255);
1156 assert_eq!(decode_bytes(&encoded_255).unwrap(), data_255);
1157
1158 let data_256 = vec![0xCC; 256];
1160 let encoded_256 = encode_bytes(&data_256);
1161 assert_eq!(encoded_256[0], 0x59);
1162 assert_eq!(u16::from_be_bytes([encoded_256[1], encoded_256[2]]), 256);
1163 assert_eq!(decode_bytes(&encoded_256).unwrap(), data_256);
1164 }
1165
1166 #[test]
1167 fn test_to_cbor_trait_array_32() {
1168 let arr: [u8; 32] = [0x42; 32];
1169 let encoded = arr.to_cbor();
1170 let decoded = <[u8; 32]>::from_cbor(&encoded).unwrap();
1171 assert_eq!(arr, decoded);
1172 assert_eq!(arr.encoded_size(), encoded.len());
1173 }
1174
1175 #[test]
1176 fn test_to_cbor_trait_array_64() {
1177 let arr: [u8; 64] = [0x43; 64];
1178 let encoded = arr.to_cbor();
1179 let decoded = <[u8; 64]>::from_cbor(&encoded).unwrap();
1180 assert_eq!(arr, decoded);
1181 assert_eq!(arr.encoded_size(), encoded.len());
1182 }
1183
1184 #[test]
1185 fn test_to_cbor_trait_array_80() {
1186 let arr: [u8; 80] = [0x44; 80];
1187 let encoded = arr.to_cbor();
1188 let decoded = <[u8; 80]>::from_cbor(&encoded).unwrap();
1189 assert_eq!(arr, decoded);
1190 assert_eq!(arr.encoded_size(), encoded.len());
1191 }
1192
1193 #[test]
1194 fn test_to_cbor_trait_vec() {
1195 let vec = vec![0x45u8; 100];
1196 let encoded = vec.to_cbor();
1197 let decoded = Vec::<u8>::from_cbor(&encoded).unwrap();
1198 assert_eq!(vec, decoded);
1199 assert_eq!(vec.encoded_size(), encoded.len());
1200 }
1201
1202 #[test]
1203 fn test_from_cbor_invalid_length() {
1204 let data = vec![0x42u8; 31];
1206 let encoded = encode_bytes(&data);
1207 let result = <[u8; 32]>::from_cbor(&encoded);
1208 assert!(matches!(result, Err(CborError::InvalidLength)));
1209 }
1210
1211 #[test]
1212 fn test_vrf_output_trait_roundtrip() {
1213 use crate::vrf::{OutputVrf, VrfDraft03};
1214
1215 let seed = [42u8; 32];
1216 let (secret_key, public_key) = VrfDraft03::keypair_from_seed(&seed);
1217 let proof = VrfDraft03::prove(&secret_key, b"test").unwrap();
1218 let output_bytes = VrfDraft03::verify(&public_key, &proof, b"test").unwrap();
1219
1220 let output = OutputVrf::new(output_bytes);
1221 let encoded = output.to_cbor();
1222 let decoded = OutputVrf::from_cbor(&encoded).unwrap();
1223 assert_eq!(output.as_bytes(), decoded.as_bytes());
1224 }
1225
1226 #[test]
1227 fn test_certified_vrf_cbor_roundtrip() {
1228 use crate::vrf::CertifiedVrf;
1229
1230 let seed = [42u8; 32];
1231 let (secret_key, _) = crate::vrf::VrfDraft03::keypair_from_seed(&seed);
1232 let certified = CertifiedVrf::eval(&secret_key, b"test message").unwrap();
1233
1234 let encoded = certified.to_cbor();
1235 let decoded = CertifiedVrf::from_cbor(&encoded).unwrap();
1236
1237 assert_eq!(
1238 certified.get_output().as_bytes(),
1239 decoded.get_output().as_bytes()
1240 );
1241 assert_eq!(certified.get_proof(), decoded.get_proof());
1242 }
1243
1244 #[test]
1245 fn test_signed_dsign_cbor_roundtrip() {
1246 use crate::dsign::{DsignAlgorithm, Ed25519, SignedDsign};
1247
1248 let signing_key = Ed25519::gen_key(&[42u8; 32]);
1249 let signed = SignedDsign::<Ed25519>::sign(&signing_key, b"test message");
1250
1251 let encoded = signed.to_cbor();
1252 let decoded = SignedDsign::<Ed25519>::from_cbor(&encoded).unwrap();
1253
1254 assert_eq!(
1255 signed.get_signature().as_bytes(),
1256 decoded.get_signature().as_bytes()
1257 );
1258 }
1259
1260 #[test]
1261 fn test_ed25519_verification_key_cbor_roundtrip() {
1262 use crate::dsign::ed25519::Ed25519VerificationKey;
1263 use crate::dsign::{DsignAlgorithm, Ed25519};
1264
1265 let signing_key = Ed25519::gen_key(&[42u8; 32]);
1266 let vk = Ed25519::derive_verification_key(&signing_key);
1267
1268 let encoded = vk.to_cbor();
1269 let decoded = Ed25519VerificationKey::from_cbor(&encoded).unwrap();
1270
1271 assert_eq!(vk.as_bytes(), decoded.as_bytes());
1272 }
1273
1274 #[test]
1275 fn test_ed25519_signature_cbor_roundtrip() {
1276 use crate::dsign::ed25519::Ed25519Signature;
1277 use crate::dsign::{DsignAlgorithm, Ed25519};
1278
1279 let signing_key = Ed25519::gen_key(&[42u8; 32]);
1280 let sig = Ed25519::sign(&signing_key, b"test message");
1281
1282 let encoded = sig.to_cbor();
1283 let decoded = Ed25519Signature::from_cbor(&encoded).unwrap();
1284
1285 assert_eq!(sig.as_bytes(), decoded.as_bytes());
1286 }
1287
1288 #[test]
1293 fn test_dsign_size_expressions() {
1294 assert_eq!(encoded_verification_key_dsign_size(), 34);
1296
1297 assert_eq!(encoded_signing_key_dsign_size(), 66);
1299
1300 assert_eq!(encoded_signature_dsign_size(), 66);
1302
1303 let vk = vec![0x42u8; 32];
1305 assert_eq!(
1306 encode_verification_key_dsign(&vk).len(),
1307 encoded_verification_key_dsign_size()
1308 );
1309
1310 let sig = vec![0x43u8; 64];
1311 assert_eq!(
1312 encode_signature_dsign(&sig).len(),
1313 encoded_signature_dsign_size()
1314 );
1315 }
1316
1317 #[test]
1318 fn test_vrf_size_expressions() {
1319 assert_eq!(encoded_verification_key_vrf_size(), 34);
1321
1322 assert_eq!(encoded_signing_key_vrf_size(), 66);
1324
1325 assert_eq!(encoded_proof_vrf_draft03_size(), 82);
1327
1328 assert_eq!(encoded_proof_vrf_draft13_size(), 130);
1330
1331 assert_eq!(encoded_output_vrf_size(), 66);
1333
1334 let vk = vec![0x44u8; 32];
1336 assert_eq!(
1337 encode_verification_key_vrf(&vk).len(),
1338 encoded_verification_key_vrf_size()
1339 );
1340
1341 let proof = vec![0x45u8; 80];
1342 assert_eq!(
1343 encode_proof_vrf(&proof).len(),
1344 encoded_proof_vrf_draft03_size()
1345 );
1346
1347 let output = vec![0x46u8; 64];
1348 assert_eq!(encode_output_vrf(&output).len(), encoded_output_vrf_size());
1349 }
1350
1351 #[test]
1352 fn test_kes_size_expressions() {
1353 assert_eq!(encoded_verification_key_kes_size(), 34);
1355
1356 assert_eq!(encoded_signing_key_sum6kes_size(), 2115);
1358
1359 assert_eq!(encoded_signature_sum6kes_size(), 451);
1361
1362 let vk = vec![0x47u8; 32];
1364 assert_eq!(
1365 encode_verification_key_kes(&vk).len(),
1366 encoded_verification_key_kes_size()
1367 );
1368
1369 let sig = vec![0x48u8; 448];
1370 assert_eq!(
1371 encode_signature_kes(&sig).len(),
1372 encoded_signature_sum6kes_size()
1373 );
1374 }
1375
1376 #[test]
1377 fn test_hash_size_expressions() {
1378 assert_eq!(encoded_hash_blake2b224_size(), 30);
1380
1381 assert_eq!(encoded_hash_blake2b256_size(), 34);
1383
1384 let hash224 = vec![0x49u8; 28];
1386 assert_eq!(encode_hash(&hash224).len(), encoded_hash_blake2b224_size());
1387
1388 let hash256 = vec![0x4Au8; 32];
1389 assert_eq!(encode_hash(&hash256).len(), encoded_hash_blake2b256_size());
1390 }
1391
1392 #[test]
1393 fn test_size_expression_generic() {
1394 assert_eq!(encoded_verification_key_size(32), 34);
1396 assert_eq!(encoded_verification_key_size(64), 66);
1397 assert_eq!(encoded_signature_size(64), 66);
1398 assert_eq!(encoded_signature_size(448), 451);
1399 }
1400
1401 #[test]
1402 fn test_size_expression_boundaries() {
1403 assert_eq!(encoded_size_bytes(0), 1);
1406 assert_eq!(encoded_size_bytes(23), 24);
1407
1408 assert_eq!(encoded_size_bytes(24), 26);
1410 assert_eq!(encoded_size_bytes(255), 257);
1411
1412 assert_eq!(encoded_size_bytes(256), 259);
1414 assert_eq!(encoded_size_bytes(65535), 65538);
1415
1416 assert_eq!(encoded_size_bytes(65536), 65541);
1418 }
1419
1420 #[test]
1425 fn test_dsign_verification_key_serialization_roundtrip() {
1426 use crate::dsign::{DsignAlgorithm, Ed25519};
1427
1428 let signing_key = Ed25519::gen_key(&[0xABu8; 32]);
1430 let vk = Ed25519::derive_verification_key(&signing_key);
1431
1432 let raw = Ed25519::raw_serialize_verification_key(&vk);
1434 let recovered = Ed25519::raw_deserialize_verification_key(raw).unwrap();
1435 assert_eq!(vk.as_bytes(), recovered.as_bytes());
1436
1437 let cbor = encode_verification_key_dsign(raw);
1439 let decoded = decode_verification_key_dsign(&cbor).unwrap();
1440 assert_eq!(raw, &decoded[..]);
1441 }
1442
1443 #[test]
1444 fn test_dsign_signature_serialization_roundtrip() {
1445 use crate::dsign::{DsignAlgorithm, Ed25519};
1446
1447 let signing_key = Ed25519::gen_key(&[0xCDu8; 32]);
1448 let sig = Ed25519::sign(&signing_key, b"test message");
1449
1450 let raw = Ed25519::raw_serialize_signature(&sig);
1452 let recovered = Ed25519::raw_deserialize_signature(raw).unwrap();
1453 assert_eq!(sig.as_bytes(), recovered.as_bytes());
1454
1455 let cbor = encode_signature_dsign(raw);
1457 let decoded = decode_signature_dsign(&cbor).unwrap();
1458 assert_eq!(raw, &decoded[..]);
1459 }
1460
1461 #[test]
1462 fn test_vrf_verification_key_serialization_roundtrip() {
1463 use crate::vrf::{VrfAlgorithm, VrfDraft03};
1464
1465 let seed = [0xEFu8; 32];
1466 let (_, vk) = VrfDraft03::keypair_from_seed(&seed);
1467
1468 let raw = VrfDraft03::raw_serialize_verification_key(&vk);
1470 let recovered = VrfDraft03::raw_deserialize_verification_key(raw).unwrap();
1471 assert_eq!(vk, recovered);
1472
1473 let cbor = encode_verification_key_vrf(raw);
1475 let decoded = decode_verification_key_vrf(&cbor).unwrap();
1476 assert_eq!(raw, &decoded[..]);
1477 }
1478
1479 #[test]
1480 fn test_vrf_proof_serialization_roundtrip() {
1481 use crate::vrf::{VrfAlgorithm, VrfDraft03};
1482
1483 let seed = [0x12u8; 32];
1484 let (sk, _) = VrfDraft03::keypair_from_seed(&seed);
1485 let proof = VrfDraft03::prove(&sk, b"test input").unwrap();
1486
1487 let raw = VrfDraft03::raw_serialize_proof(&proof);
1489 let recovered = VrfDraft03::raw_deserialize_proof(raw).unwrap();
1490 assert_eq!(proof, recovered);
1491
1492 let cbor = encode_proof_vrf(raw);
1494 let decoded = decode_proof_vrf(&cbor).unwrap();
1495 assert_eq!(raw, &decoded[..]);
1496 }
1497
1498 #[test]
1499 fn test_kes_verification_key_serialization_roundtrip() {
1500 use crate::kes::{KesAlgorithm, Sum6Kes};
1501
1502 let seed = [0x34u8; 32];
1503 let signing_key = Sum6Kes::gen_key_kes_from_seed_bytes(&seed).unwrap();
1504 let vk = Sum6Kes::derive_verification_key(&signing_key).unwrap();
1505
1506 let raw = Sum6Kes::raw_serialize_verification_key_kes(&vk);
1508 let recovered = Sum6Kes::raw_deserialize_verification_key_kes(&raw).unwrap();
1509 assert_eq!(vk, recovered);
1510
1511 let cbor = encode_verification_key_kes(&raw);
1513 let decoded = decode_verification_key_kes(&cbor).unwrap();
1514 assert_eq!(raw, decoded);
1515 }
1516
1517 #[test]
1518 fn test_kes_signature_serialization_roundtrip() {
1519 use crate::kes::{KesAlgorithm, Sum6Kes};
1520
1521 let seed = [0x56u8; 32];
1522 let signing_key = Sum6Kes::gen_key_kes_from_seed_bytes(&seed).unwrap();
1523 let signature = Sum6Kes::sign_kes(&(), 0, b"test message", &signing_key).unwrap();
1524
1525 let raw = Sum6Kes::raw_serialize_signature_kes(&signature);
1527 let _recovered = Sum6Kes::raw_deserialize_signature_kes(&raw).unwrap();
1528 let cbor = encode_signature_kes(&raw);
1532 let decoded = decode_signature_kes(&cbor).unwrap();
1533 assert_eq!(raw, decoded);
1534 }
1535}