1use std::{iter::once, sync::Arc};
2
3use async_lock::RwLock;
4use byteorder::{ByteOrder, NetworkEndian};
5use indexmap::IndexSet;
6use transformable::Transformable;
7
8#[derive(Debug, thiserror::Error)]
10#[error("unknown secret key kind: {0}")]
11pub struct UnknownSecretKeyKind(u8);
12
13#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
15pub enum SecretKey {
16 Aes128([u8; 16]),
18 Aes192([u8; 24]),
20 Aes256([u8; 32]),
22}
23
24#[derive(Debug, thiserror::Error)]
26pub enum SecretKeyTransformError {
27 #[error("encode buffer is too small")]
29 BufferTooSmall,
30 #[error("not enough bytes to decode")]
32 NotEnoughBytes,
33
34 #[error("invalid key length")]
36 UnknownSecretKeyKind(#[from] UnknownSecretKeyKind),
37}
38
39impl Transformable for SecretKey {
40 type Error = SecretKeyTransformError;
41
42 fn encode(&self, dst: &mut [u8]) -> Result<usize, Self::Error> {
43 let encoded_len = self.encoded_len();
44 if dst.len() < encoded_len {
45 return Err(Self::Error::BufferTooSmall);
46 }
47
48 let len = match self {
49 Self::Aes128(_) => 16,
50 Self::Aes192(_) => 24,
51 Self::Aes256(_) => 32,
52 };
53 dst[0] = len as u8;
54
55 match self {
56 Self::Aes128(k) => dst[1..17].copy_from_slice(k),
57 Self::Aes192(k) => dst[1..25].copy_from_slice(k),
58 Self::Aes256(k) => dst[1..33].copy_from_slice(k),
59 }
60
61 Ok(len + 1)
62 }
63
64 fn encoded_len(&self) -> usize {
65 self.len() + 1
66 }
67
68 fn encode_to_writer<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<usize> {
69 match self {
70 Self::Aes128(k) => {
71 let mut buf = [0; 17];
72 buf[0] = 16;
73 buf[1..17].copy_from_slice(k);
74 writer.write_all(&buf).map(|_| 17)
75 }
76 Self::Aes192(k) => {
77 let mut buf = [0; 25];
78 buf[0] = 24;
79 buf[1..25].copy_from_slice(k);
80 writer.write_all(&buf).map(|_| 25)
81 }
82 Self::Aes256(k) => {
83 let mut buf = [0; 33];
84 buf[0] = 32;
85 buf[1..33].copy_from_slice(k);
86 writer.write_all(&buf).map(|_| 33)
87 }
88 }
89 }
90
91 async fn encode_to_async_writer<W: futures::io::AsyncWrite + Send + Unpin>(
92 &self,
93 writer: &mut W,
94 ) -> std::io::Result<usize> {
95 use futures::io::AsyncWriteExt;
96
97 match self {
98 Self::Aes128(k) => {
99 let mut buf = [0; 17];
100 buf[0] = 16;
101 buf[1..17].copy_from_slice(k);
102 writer.write_all(&buf).await.map(|_| 17)
103 }
104 Self::Aes192(k) => {
105 let mut buf = [0; 25];
106 buf[0] = 24;
107 buf[1..25].copy_from_slice(k);
108 writer.write_all(&buf).await.map(|_| 25)
109 }
110 Self::Aes256(k) => {
111 let mut buf = [0; 33];
112 buf[0] = 32;
113 buf[1..33].copy_from_slice(k);
114 writer.write_all(&buf).await.map(|_| 33)
115 }
116 }
117 }
118
119 fn decode(src: &[u8]) -> Result<(usize, Self), Self::Error>
120 where
121 Self: Sized,
122 {
123 if src.len() < 17 {
124 return Err(Self::Error::NotEnoughBytes);
125 }
126
127 let len = src[0];
128 let key = match len {
129 16 => Self::Aes128(src[1..17].try_into().unwrap()),
130 24 => Self::Aes192(src[1..25].try_into().unwrap()),
131 32 => Self::Aes256(src[1..33].try_into().unwrap()),
132 x => return Err(Self::Error::UnknownSecretKeyKind(UnknownSecretKeyKind(x))),
133 };
134
135 Ok((len as usize + 1, key))
136 }
137
138 fn decode_from_reader<R: std::io::Read>(reader: &mut R) -> std::io::Result<(usize, Self)>
139 where
140 Self: Sized,
141 {
142 let mut buf = [0; 17];
143 reader.read_exact(&mut buf)?;
144 let len = buf[0] as usize;
145 match len {
146 16 => Ok((17, Self::Aes128(buf[1..17].try_into().unwrap()))),
147 24 => {
148 let mut key = [0; 24];
149 key[..16].copy_from_slice(&buf[1..]);
150 reader.read_exact(&mut key[16..])?;
151 Ok((25, Self::Aes192(key)))
152 }
153 32 => {
154 let mut key = [0; 32];
155 key[..16].copy_from_slice(&buf[1..]);
156 reader.read_exact(&mut key[16..])?;
157 Ok((33, Self::Aes256(key)))
158 }
159 x => Err(std::io::Error::new(
160 std::io::ErrorKind::InvalidData,
161 Self::Error::UnknownSecretKeyKind(UnknownSecretKeyKind(x as u8)),
162 )),
163 }
164 }
165
166 async fn decode_from_async_reader<R: futures::io::AsyncRead + Send + Unpin>(
167 reader: &mut R,
168 ) -> std::io::Result<(usize, Self)>
169 where
170 Self: Sized,
171 {
172 use futures::io::AsyncReadExt;
173
174 let mut buf = [0; 17];
175 reader.read_exact(&mut buf).await?;
176 let len = buf[0] as usize;
177 match len {
178 16 => Ok((17, Self::Aes128(buf[1..17].try_into().unwrap()))),
179 24 => {
180 let mut key = [0; 24];
181 key[..16].copy_from_slice(&buf[1..]);
182 reader.read_exact(&mut key[16..]).await?;
183 Ok((25, Self::Aes192(key)))
184 }
185 32 => {
186 let mut key = [0; 32];
187 key[..16].copy_from_slice(&buf[1..]);
188 reader.read_exact(&mut key[16..]).await?;
189 Ok((33, Self::Aes256(key)))
190 }
191 x => Err(std::io::Error::new(
192 std::io::ErrorKind::InvalidData,
193 Self::Error::UnknownSecretKeyKind(UnknownSecretKeyKind(x as u8)),
194 )),
195 }
196 }
197}
198
199#[cfg(feature = "serde")]
200const _: () = {
201 use base64::Engine;
202 use serde::{Deserialize, Serialize};
203
204 impl Serialize for SecretKey {
205 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
206 where
207 S: serde::Serializer,
208 {
209 if serializer.is_human_readable() {
210 base64::engine::general_purpose::STANDARD
211 .encode(self)
212 .serialize(serializer)
213 } else {
214 serializer.serialize_bytes(self)
215 }
216 }
217 }
218
219 impl<'de> Deserialize<'de> for SecretKey {
220 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
221 where
222 D: serde::Deserializer<'de>,
223 {
224 macro_rules! parse {
225 ($key:ident) => {{
226 match $key.len() {
227 16 => Ok(Self::Aes128($key.try_into().unwrap())),
228 24 => Ok(Self::Aes192($key.try_into().unwrap())),
229 32 => Ok(Self::Aes256($key.try_into().unwrap())),
230 _ => Err(<D::Error as serde::de::Error>::custom(
231 "invalid secret key length",
232 )),
233 }
234 }};
235 }
236
237 if deserializer.is_human_readable() {
238 <String as Deserialize<'de>>::deserialize(deserializer).and_then(|val| {
239 base64::engine::general_purpose::STANDARD
240 .decode(val)
241 .map_err(serde::de::Error::custom)
242 .and_then(|key| parse!(key))
243 })
244 } else {
245 <Vec<u8> as Deserialize<'de>>::deserialize(deserializer).and_then(|val| parse!(val))
246 }
247 }
248 }
249};
250
251impl core::hash::Hash for SecretKey {
252 fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
253 self.as_ref().hash(state);
254 }
255}
256
257impl core::borrow::Borrow<[u8]> for SecretKey {
258 fn borrow(&self) -> &[u8] {
259 self.as_ref()
260 }
261}
262
263impl PartialEq<[u8]> for SecretKey {
264 fn eq(&self, other: &[u8]) -> bool {
265 self.as_ref() == other
266 }
267}
268
269impl core::ops::Deref for SecretKey {
270 type Target = [u8];
271
272 fn deref(&self) -> &Self::Target {
273 match self {
274 Self::Aes128(k) => k,
275 Self::Aes192(k) => k,
276 Self::Aes256(k) => k,
277 }
278 }
279}
280
281impl core::ops::DerefMut for SecretKey {
282 fn deref_mut(&mut self) -> &mut Self::Target {
283 match self {
284 Self::Aes128(k) => k,
285 Self::Aes192(k) => k,
286 Self::Aes256(k) => k,
287 }
288 }
289}
290
291impl From<[u8; 16]> for SecretKey {
292 fn from(k: [u8; 16]) -> Self {
293 Self::Aes128(k)
294 }
295}
296
297impl From<[u8; 24]> for SecretKey {
298 fn from(k: [u8; 24]) -> Self {
299 Self::Aes192(k)
300 }
301}
302
303impl From<[u8; 32]> for SecretKey {
304 fn from(k: [u8; 32]) -> Self {
305 Self::Aes256(k)
306 }
307}
308
309impl TryFrom<&[u8]> for SecretKey {
310 type Error = String;
311
312 fn try_from(k: &[u8]) -> Result<Self, Self::Error> {
313 match k.len() {
314 16 => Ok(Self::Aes128(k.try_into().unwrap())),
315 24 => Ok(Self::Aes192(k.try_into().unwrap())),
316 32 => Ok(Self::Aes256(k.try_into().unwrap())),
317 x => Err(format!(
318 "invalid key size: {}, secret key size must be 16, 24 or 32 bytes",
319 x
320 )),
321 }
322 }
323}
324
325impl AsRef<[u8]> for SecretKey {
326 fn as_ref(&self) -> &[u8] {
327 match self {
328 Self::Aes128(k) => k,
329 Self::Aes192(k) => k,
330 Self::Aes256(k) => k,
331 }
332 }
333}
334
335impl AsMut<[u8]> for SecretKey {
336 fn as_mut(&mut self) -> &mut [u8] {
337 match self {
338 Self::Aes128(k) => k,
339 Self::Aes192(k) => k,
340 Self::Aes256(k) => k,
341 }
342 }
343}
344
345smallvec_wrapper::smallvec_wrapper!(
346 #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
348 #[repr(transparent)]
349 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
350 #[cfg_attr(feature = "serde", serde(transparent))]
351 pub SecretKeys([SecretKey; 3]);
352);
353
354#[derive(Debug, thiserror::Error)]
356pub enum SecretKeysTransformError {
357 #[error("encode buffer is too small")]
359 BufferTooSmall,
360 #[error("not enough bytes to decode")]
362 NotEnoughBytes,
363
364 #[error(transparent)]
366 SecretKey(#[from] SecretKeyTransformError),
367
368 #[error("expect {expected} keys, but actual decode {actual} keys")]
370 MissingKeys {
371 expected: usize,
373 actual: usize,
375 },
376}
377
378impl Transformable for SecretKeys {
379 type Error = SecretKeysTransformError;
380
381 fn encode(&self, dst: &mut [u8]) -> Result<usize, Self::Error> {
382 let encoded_len = self.encoded_len();
383 if dst.len() < encoded_len {
384 return Err(Self::Error::BufferTooSmall);
385 }
386
387 let mut offset = 0;
388 NetworkEndian::write_u32(&mut dst[offset..], encoded_len as u32);
389 offset += 4;
390
391 let num_keys = self.len();
392 NetworkEndian::write_u32(&mut dst[offset..], num_keys as u32);
393 offset += 4;
394
395 for key in self.iter() {
396 let len = key.encode(&mut dst[offset..])?;
397 offset += len;
398 }
399
400 debug_assert_eq!(
401 offset, encoded_len,
402 "expect write {} bytes, but actual write {} bytes",
403 encoded_len, offset
404 );
405
406 Ok(encoded_len)
407 }
408
409 fn encoded_len(&self) -> usize {
410 4 + 4 + self.iter().map(SecretKey::encoded_len).sum::<usize>()
411 }
412
413 fn decode(src: &[u8]) -> Result<(usize, Self), Self::Error>
414 where
415 Self: Sized,
416 {
417 if src.len() < 4 {
418 return Err(Self::Error::NotEnoughBytes);
419 }
420
421 let len = NetworkEndian::read_u32(&src[0..4]) as usize;
422 if src.len() < len {
423 return Err(Self::Error::NotEnoughBytes);
424 }
425
426 let mut offset = 4;
427 let keys_len = NetworkEndian::read_u32(&src[offset..]) as usize;
428 offset += 4;
429
430 let mut keys = SecretKeys::with_capacity(keys_len);
431 for _ in 0..keys_len {
432 let (len, key) = SecretKey::decode(&src[offset..])?;
433 offset += len;
434 keys.push(key);
435 }
436
437 debug_assert_eq!(
438 offset, len,
439 "expect read {} bytes, but actual read {} bytes",
440 len, offset
441 );
442
443 Ok((offset, keys))
444 }
445}
446
447#[derive(Debug, Clone, thiserror::Error, PartialEq, Eq)]
449pub enum SecretKeyringError {
450 #[error("secret key is not in the keyring")]
452 SecretKeyNotFound,
453 #[error("removing the primary key is not allowed")]
455 RemovePrimaryKey,
456}
457
458#[derive(Debug)]
459pub(super) struct SecretKeyringInner {
460 pub(super) primary_key: SecretKey,
461 pub(super) keys: IndexSet<SecretKey>,
462}
463
464#[derive(Debug, Clone)]
471#[repr(transparent)]
472pub struct SecretKeyring {
473 pub(super) inner: Arc<RwLock<SecretKeyringInner>>,
474}
475
476impl SecretKeyring {
477 #[inline]
486 pub fn new(primary_key: SecretKey) -> Self {
487 Self {
488 inner: Arc::new(RwLock::new(SecretKeyringInner {
489 primary_key,
490 keys: IndexSet::new(),
491 })),
492 }
493 }
494
495 #[inline]
506 pub fn with_keys(
507 primary_key: SecretKey,
508 keys: impl Iterator<Item = impl Into<SecretKey>>,
509 ) -> Self {
510 if keys.size_hint().0 != 0 {
511 return Self {
512 inner: Arc::new(RwLock::new(SecretKeyringInner {
513 primary_key,
514 keys: keys
515 .filter_map(|k| {
516 let k = k.into();
517 if k == primary_key {
518 None
519 } else {
520 Some(k)
521 }
522 })
523 .collect(),
524 })),
525 };
526 }
527
528 Self::new(primary_key)
529 }
530
531 #[inline]
534 pub async fn primary_key(&self) -> SecretKey {
535 self.inner.read().await.primary_key
536 }
537
538 #[inline]
541 pub async fn remove(&self, key: &[u8]) -> Result<(), SecretKeyringError> {
542 let mut inner = self.inner.write().await;
543 if &inner.primary_key == key {
544 return Err(SecretKeyringError::RemovePrimaryKey);
545 }
546 inner.keys.shift_remove(key);
547 Ok(())
548 }
549
550 #[inline]
557 pub async fn insert(&self, key: SecretKey) {
558 self.inner.write().await.keys.insert(key);
559 }
560
561 #[inline]
564 pub async fn use_key(&self, key_data: &[u8]) -> Result<(), SecretKeyringError> {
565 let mut inner = self.inner.write().await;
566 if key_data == inner.primary_key.as_ref() {
567 return Ok(());
568 }
569
570 let Some(&key) = inner.keys.get(key_data) else {
572 return Err(SecretKeyringError::SecretKeyNotFound);
573 };
574
575 let old_pk = inner.primary_key;
576 inner.keys.insert(old_pk);
577 inner.primary_key = key;
578 inner.keys.swap_remove(key_data);
579 Ok(())
580 }
581
582 #[inline]
584 pub async fn keys(&self) -> impl Iterator<Item = SecretKey> + 'static {
585 let inner = self.inner.read().await;
586
587 once(inner.primary_key).chain(inner.keys.clone().into_iter())
590 }
591}
592
593#[cfg(test)]
594mod tests {
595 use std::ops::{Deref, DerefMut};
596
597 use super::*;
598
599 impl SecretKey {
600 fn random(kind: u8) -> Self {
601 match kind {
602 16 => Self::Aes128(rand::random()),
603 24 => Self::Aes192(rand::random()),
604 32 => Self::Aes256(rand::random()),
605 x => panic!("invalid key kind: {}", x),
606 }
607 }
608 }
609
610 impl SecretKeys {
611 fn random(num_keys: usize) -> Self {
612 let mut keys = SecretKeys::new();
613 for i in 0..num_keys {
614 let kind = match i % 3 {
615 0 => 16,
616 1 => 24,
617 2 => 32,
618 _ => unreachable!(),
619 };
620 keys.push(SecretKey::random(kind));
621 }
622 keys
623 }
624 }
625
626 #[test]
627 fn test_secret_key() {
628 let mut key = SecretKey::from([0; 16]);
629 assert_eq!(key.deref(), &[0; 16]);
630 assert_eq!(key.deref_mut(), &mut [0; 16]);
631 assert_eq!(key.as_ref(), &[0; 16]);
632 assert_eq!(key.as_mut(), &mut [0; 16]);
633 assert_eq!(key.len(), 16);
634 assert!(!key.is_empty());
635 assert_eq!(key.to_vec(), vec![0; 16]);
636
637 let mut key = SecretKey::from([0; 24]);
638 assert_eq!(key.deref(), &[0; 24]);
639 assert_eq!(key.deref_mut(), &mut [0; 24]);
640 assert_eq!(key.as_ref(), &[0; 24]);
641 assert_eq!(key.as_mut(), &mut [0; 24]);
642 assert_eq!(key.len(), 24);
643 assert!(!key.is_empty());
644 assert_eq!(key.to_vec(), vec![0; 24]);
645
646 let mut key = SecretKey::from([0; 32]);
647 assert_eq!(key.deref(), &[0; 32]);
648 assert_eq!(key.deref_mut(), &mut [0; 32]);
649 assert_eq!(key.as_ref(), &[0; 32]);
650 assert_eq!(key.as_mut(), &mut [0; 32]);
651 assert_eq!(key.len(), 32);
652 assert!(!key.is_empty());
653 assert_eq!(key.to_vec(), vec![0; 32]);
654
655 let mut key = SecretKey::from([0; 16]);
656 assert_eq!(key.as_ref(), &[0; 16]);
657 assert_eq!(key.as_mut(), &mut [0; 16]);
658
659 let mut key = SecretKey::from([0; 24]);
660 assert_eq!(key.as_ref(), &[0; 24]);
661 assert_eq!(key.as_mut(), &mut [0; 24]);
662
663 let mut key = SecretKey::from([0; 32]);
664 assert_eq!(key.as_ref(), &[0; 32]);
665 assert_eq!(key.as_mut(), &mut [0; 32]);
666
667 let key = SecretKey::Aes128([0; 16]);
668 assert_eq!(key.to_vec(), vec![0; 16]);
669
670 let key = SecretKey::Aes192([0; 24]);
671 assert_eq!(key.to_vec(), vec![0; 24]);
672
673 let key = SecretKey::Aes256([0; 32]);
674 assert_eq!(key.to_vec(), vec![0; 32]);
675 }
676
677 #[test]
678 fn test_try_from() {
679 assert!(SecretKey::try_from([0; 15].as_slice()).is_err());
680 assert!(SecretKey::try_from([0; 16].as_slice()).is_ok());
681 assert!(SecretKey::try_from([0; 23].as_slice()).is_err());
682 assert!(SecretKey::try_from([0; 24].as_slice()).is_ok());
683 assert!(SecretKey::try_from([0; 31].as_slice()).is_err());
684 assert!(SecretKey::try_from([0; 32].as_slice()).is_ok());
685 }
686
687 const TEST_KEYS: &[SecretKey] = &[
688 SecretKey::Aes128([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]),
689 SecretKey::Aes128([15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]),
690 SecretKey::Aes128([8, 9, 10, 11, 12, 13, 14, 15, 0, 1, 2, 3, 4, 5, 6, 7]),
691 ];
692
693 #[tokio::test]
694 async fn test_primary_only() {
695 let keyring = SecretKeyring::new(TEST_KEYS[1]);
696 assert_eq!(keyring.keys().await.collect::<Vec<_>>().len(), 1);
697 }
698
699 #[tokio::test]
700 async fn test_get_primary_key() {
701 let keyring = SecretKeyring::with_keys(TEST_KEYS[1], TEST_KEYS.iter().copied());
702 assert_eq!(keyring.primary_key().await.as_ref(), TEST_KEYS[1].as_ref());
703 }
704
705 #[tokio::test]
706 async fn test_insert_remove_use() {
707 let keyring = SecretKeyring::new(TEST_KEYS[1]);
708
709 keyring.use_key(&TEST_KEYS[2]).await.unwrap_err();
711
712 keyring.insert(TEST_KEYS[2]).await;
714 assert_eq!(keyring.inner.read().await.keys.len() + 1, 2);
715 assert_eq!(keyring.keys().await.next().unwrap(), TEST_KEYS[1]);
716
717 keyring.use_key(&TEST_KEYS[2]).await.unwrap();
719 assert_eq!(keyring.keys().await.next().unwrap(), TEST_KEYS[2]);
720
721 let primary_key = keyring.primary_key().await;
722 assert_eq!(primary_key.as_ref(), TEST_KEYS[2].as_ref());
723
724 keyring.remove(&TEST_KEYS[2]).await.unwrap_err();
726
727 keyring.remove(&TEST_KEYS[1]).await.unwrap();
729 assert_eq!(keyring.inner.read().await.keys.len() + 1, 1);
730 }
731
732 #[tokio::test]
733 async fn test_secret_key_transform() {
734 for i in 0..100 {
735 let kind = match i % 3 {
736 0 => 16,
737 1 => 24,
738 2 => 32,
739 _ => unreachable!(),
740 };
741 let key = SecretKey::random(kind);
742 let mut buf = vec![0; key.encoded_len()];
743 let encoded_len = key.encode(&mut buf).unwrap();
744 assert_eq!(encoded_len, key.encoded_len());
745 let mut buf1 = vec![];
746 let encoded_len1 = key.encode_to_writer(&mut buf1).unwrap();
747 assert_eq!(encoded_len1, key.encoded_len());
748 let mut buf2 = vec![];
749 let encoded_len2 = key.encode_to_async_writer(&mut buf2).await.unwrap();
750 assert_eq!(encoded_len2, key.encoded_len());
751
752 let (decoded_len, decoded) = SecretKey::decode(&buf).unwrap();
753 assert_eq!(decoded_len, encoded_len);
754 assert_eq!(decoded, key);
755 let (decoded_len, decoded) = SecretKey::decode(&buf1).unwrap();
756 assert_eq!(decoded_len, encoded_len);
757 assert_eq!(decoded, key);
758 let (decoded_len, decoded) = SecretKey::decode(&buf2).unwrap();
759 assert_eq!(decoded_len, encoded_len);
760 assert_eq!(decoded, key);
761
762 let (decoded_len, decoded) =
763 SecretKey::decode_from_reader(&mut std::io::Cursor::new(&buf)).unwrap();
764 assert_eq!(decoded_len, encoded_len);
765 assert_eq!(decoded, key);
766 let (decoded_len, decoded) =
767 SecretKey::decode_from_reader(&mut std::io::Cursor::new(&buf1)).unwrap();
768 assert_eq!(decoded_len, encoded_len);
769 assert_eq!(decoded, key);
770 let (decoded_len, decoded) =
771 SecretKey::decode_from_reader(&mut std::io::Cursor::new(&buf2)).unwrap();
772 assert_eq!(decoded_len, encoded_len);
773 assert_eq!(decoded, key);
774
775 let (decoded_len, decoded) =
776 SecretKey::decode_from_async_reader(&mut futures::io::Cursor::new(&buf))
777 .await
778 .unwrap();
779 assert_eq!(decoded_len, encoded_len);
780 assert_eq!(decoded, key);
781 let (decoded_len, decoded) =
782 SecretKey::decode_from_async_reader(&mut futures::io::Cursor::new(&buf1))
783 .await
784 .unwrap();
785 assert_eq!(decoded_len, encoded_len);
786 assert_eq!(decoded, key);
787 let (decoded_len, decoded) =
788 SecretKey::decode_from_async_reader(&mut futures::io::Cursor::new(&buf2))
789 .await
790 .unwrap();
791 assert_eq!(decoded_len, encoded_len);
792 assert_eq!(decoded, key);
793 }
794 }
795
796 #[tokio::test]
797 async fn test_secret_keys_transform() {
798 for i in 0..100 {
799 let keys = SecretKeys::random(i);
800 let mut buf = vec![0; keys.encoded_len()];
801 let encoded_len = keys.encode(&mut buf).unwrap();
802 assert_eq!(encoded_len, keys.encoded_len());
803
804 let (decoded_len, decoded) = SecretKeys::decode(&buf).unwrap();
805 assert_eq!(decoded_len, encoded_len);
806 assert_eq!(decoded, keys);
807
808 let (decoded_len, decoded) =
809 SecretKeys::decode_from_reader(&mut std::io::Cursor::new(&buf)).unwrap();
810 assert_eq!(decoded_len, encoded_len);
811 assert_eq!(decoded, keys);
812
813 let (decoded_len, decoded) =
814 SecretKeys::decode_from_async_reader(&mut futures::io::Cursor::new(&buf))
815 .await
816 .unwrap();
817 assert_eq!(decoded_len, encoded_len);
818 assert_eq!(decoded, keys);
819 }
820 }
821}