1use crate::{Algorithm, Error, Result};
12use alloc::vec::Vec;
13use encoding::{Decode, Encode, Reader, Writer};
14
15#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
20pub struct OpaquePublicKey {
21 pub algorithm: Algorithm,
23 pub key: OpaquePublicKeyBytes,
25}
26
27#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
32pub struct OpaquePublicKeyBytes(Vec<u8>);
33
34impl OpaquePublicKey {
35 pub fn new(key: Vec<u8>, algorithm: Algorithm) -> Self {
37 Self {
38 key: OpaquePublicKeyBytes(key),
39 algorithm,
40 }
41 }
42
43 pub fn algorithm(&self) -> Algorithm {
45 self.algorithm.clone()
46 }
47
48 pub(super) fn decode_as(reader: &mut impl Reader, algorithm: Algorithm) -> Result<Self> {
50 Ok(Self {
51 algorithm,
52 key: OpaquePublicKeyBytes::decode(reader)?,
53 })
54 }
55}
56
57impl Decode for OpaquePublicKeyBytes {
58 type Error = Error;
59
60 fn decode(reader: &mut impl Reader) -> Result<Self> {
61 let len = usize::decode(reader)?;
62 let mut bytes = vec![0; len];
63 reader.read(&mut bytes)?;
64 Ok(Self(bytes))
65 }
66}
67
68impl Encode for OpaquePublicKeyBytes {
69 fn encoded_len(&self) -> encoding::Result<usize> {
70 self.0.encoded_len()
71 }
72
73 fn encode(&self, writer: &mut impl Writer) -> encoding::Result<()> {
74 self.0.encode(writer)
75 }
76}
77
78impl Encode for OpaquePublicKey {
79 fn encoded_len(&self) -> encoding::Result<usize> {
80 self.key.encoded_len()
81 }
82
83 fn encode(&self, writer: &mut impl Writer) -> encoding::Result<()> {
84 self.key.encode(writer)
85 }
86}
87
88impl AsRef<[u8]> for OpaquePublicKey {
89 fn as_ref(&self) -> &[u8] {
90 self.key.as_ref()
91 }
92}
93
94impl AsRef<[u8]> for OpaquePublicKeyBytes {
95 fn as_ref(&self) -> &[u8] {
96 &self.0
97 }
98}