mysql_common/packets/
caching_sha2_password.rs

1use std::io;
2
3use crate::{
4    io::ParseBuf,
5    proto::{MyDeserialize, MySerialize},
6};
7
8define_header!(
9    PublicKeyRequestHeader,
10    InvalidPublicKeyRequest("Invalid PublicKeyRequest header"),
11    0x02
12);
13
14/// A client request for a server public RSA key, used by some authentication mechanisms
15/// to add a layer of protection to an unsecured channel (see [`PublicKeyResponse`]).
16///
17/// [`PublicKeyResponse`]: crate::packets::PublicKeyResponse
18#[derive(Debug, Clone, Eq, PartialEq)]
19pub struct PublicKeyRequest {
20    __header: PublicKeyRequestHeader,
21}
22
23impl PublicKeyRequest {
24    pub fn new() -> Self {
25        Self {
26            __header: PublicKeyRequestHeader::new(),
27        }
28    }
29}
30
31impl Default for PublicKeyRequest {
32    fn default() -> Self {
33        Self::new()
34    }
35}
36
37impl<'de> MyDeserialize<'de> for PublicKeyRequest {
38    const SIZE: Option<usize> = None;
39    type Ctx = ();
40
41    fn deserialize((): Self::Ctx, buf: &mut ParseBuf<'de>) -> io::Result<Self> {
42        Ok(Self {
43            __header: buf.parse(())?,
44        })
45    }
46}
47
48impl MySerialize for PublicKeyRequest {
49    fn serialize(&self, buf: &mut Vec<u8>) {
50        self.__header.serialize(&mut *buf);
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use crate::{
57        io::ParseBuf,
58        packets::caching_sha2_password::PublicKeyRequest,
59        proto::{MyDeserialize, MySerialize},
60    };
61
62    #[test]
63    fn should_parse_rsa_public_key_request_packet() {
64        const RSA_PUBLIC_KEY_REQUEST: &[u8] = b"\x02";
65
66        let public_rsa_key_request =
67            PublicKeyRequest::deserialize((), &mut ParseBuf(RSA_PUBLIC_KEY_REQUEST));
68
69        assert!(public_rsa_key_request.is_ok());
70    }
71
72    #[test]
73    fn should_build_rsa_public_key_request_packet() {
74        let rsa_public_key_request = PublicKeyRequest::new();
75
76        let mut actual = Vec::new();
77        rsa_public_key_request.serialize(&mut actual);
78
79        let expected: Vec<u8> = [0x02].to_vec();
80
81        assert_eq!(expected, actual);
82    }
83}