zkgroup/api/auth/
auth_credential_with_pni.rs

1//
2// Copyright 2022 Signal Messenger, LLC.
3// SPDX-License-Identifier: AGPL-3.0-only
4//
5
6use num_enum::TryFromPrimitive;
7use partial_default::PartialDefault;
8use serde::Serialize;
9
10mod v0;
11pub use v0::{AuthCredentialWithPniV0, AuthCredentialWithPniV0Response};
12mod zkc;
13pub use zkc::{
14    AuthCredentialWithPniZkc, AuthCredentialWithPniZkcPresentation,
15    AuthCredentialWithPniZkcResponse,
16};
17
18use crate::ZkGroupDeserializationFailure;
19
20#[derive(Clone, PartialDefault)]
21pub enum AuthCredentialWithPni {
22    #[partial_default]
23    V0(AuthCredentialWithPniV0),
24    Zkc(AuthCredentialWithPniZkc),
25}
26
27#[derive(Clone, PartialDefault)]
28pub enum AuthCredentialWithPniResponse {
29    #[partial_default]
30    V0(AuthCredentialWithPniV0Response),
31    Zkc(AuthCredentialWithPniZkcResponse),
32}
33
34#[repr(u8)]
35#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialDefault, TryFromPrimitive)]
36pub enum AuthCredentialWithPniVersion {
37    #[partial_default]
38    V0 = 0,
39    Zkc = 3,
40}
41
42impl AuthCredentialWithPni {
43    pub fn new(bytes: &[u8]) -> Result<Self, ZkGroupDeserializationFailure> {
44        let first = bytes
45            .first()
46            .ok_or_else(ZkGroupDeserializationFailure::new::<Self>)?;
47        let version = AuthCredentialWithPniVersion::try_from(*first)
48            .map_err(|_| ZkGroupDeserializationFailure::new::<Self>())?;
49        match version {
50            AuthCredentialWithPniVersion::V0 => {
51                crate::common::serialization::deserialize(bytes).map(Self::V0)
52            }
53            AuthCredentialWithPniVersion::Zkc => {
54                crate::common::serialization::deserialize(bytes).map(Self::Zkc)
55            }
56        }
57    }
58}
59
60impl AuthCredentialWithPniResponse {
61    pub fn new(bytes: &[u8]) -> Result<Self, ZkGroupDeserializationFailure> {
62        let first = bytes
63            .first()
64            .ok_or_else(ZkGroupDeserializationFailure::new::<Self>)?;
65        let version = AuthCredentialWithPniVersion::try_from(*first)
66            .map_err(|_| ZkGroupDeserializationFailure::new::<Self>())?;
67        match version {
68            AuthCredentialWithPniVersion::V0 => {
69                crate::common::serialization::deserialize(bytes).map(Self::V0)
70            }
71            AuthCredentialWithPniVersion::Zkc => {
72                crate::common::serialization::deserialize(bytes).map(Self::Zkc)
73            }
74        }
75    }
76}
77
78impl From<AuthCredentialWithPniV0> for AuthCredentialWithPni {
79    fn from(value: AuthCredentialWithPniV0) -> Self {
80        Self::V0(value)
81    }
82}
83
84impl From<AuthCredentialWithPniV0Response> for AuthCredentialWithPniResponse {
85    fn from(value: AuthCredentialWithPniV0Response) -> Self {
86        Self::V0(value)
87    }
88}
89
90impl From<AuthCredentialWithPniZkc> for AuthCredentialWithPni {
91    fn from(value: AuthCredentialWithPniZkc) -> Self {
92        Self::Zkc(value)
93    }
94}
95
96impl From<AuthCredentialWithPniZkcResponse> for AuthCredentialWithPniResponse {
97    fn from(value: AuthCredentialWithPniZkcResponse) -> Self {
98        Self::Zkc(value)
99    }
100}
101
102impl Serialize for AuthCredentialWithPni {
103    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
104    where
105        S: serde::Serializer,
106    {
107        match self {
108            Self::V0(v) => v.serialize(serializer),
109            Self::Zkc(z) => z.serialize(serializer),
110        }
111    }
112}
113
114impl Serialize for AuthCredentialWithPniResponse {
115    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
116    where
117        S: serde::Serializer,
118    {
119        match self {
120            Self::V0(v) => v.serialize(serializer),
121            Self::Zkc(z) => z.serialize(serializer),
122        }
123    }
124}