zkgroup/api/auth/
auth_credential_with_pni.rs1use libsignal_core::{Aci, Pni};
7use partial_default::PartialDefault;
8use serde::Serialize;
9
10use crate::auth::AnyAuthCredentialPresentation;
11use crate::groups::GroupSecretParams;
12use crate::{
13 RandomnessBytes, ServerPublicParams, ZkGroupDeserializationFailure, ZkGroupVerificationFailure,
14};
15
16mod zkc;
17pub use zkc::{
18 AuthCredentialWithPniZkc, AuthCredentialWithPniZkcPresentation,
19 AuthCredentialWithPniZkcResponse,
20};
21
22#[derive(Clone, PartialDefault, derive_more::From)]
23pub enum AuthCredentialWithPni {
24 #[partial_default]
25 Zkc(AuthCredentialWithPniZkc),
26}
27
28#[derive(Clone, PartialDefault, derive_more::From)]
29pub enum AuthCredentialWithPniResponse {
30 #[partial_default]
31 Zkc(AuthCredentialWithPniZkcResponse),
32}
33
34#[repr(u8)]
35#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialDefault, derive_more::TryFrom)]
36#[try_from(repr)]
37pub enum AuthCredentialWithPniVersion {
38 #[partial_default]
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::Zkc => {
51 crate::common::serialization::deserialize(bytes).map(Self::Zkc)
52 }
53 }
54 }
55
56 pub fn present(
57 &self,
58 public_params: &ServerPublicParams,
59 group_secret_params: &GroupSecretParams,
60 randomness: RandomnessBytes,
61 ) -> AnyAuthCredentialPresentation {
62 match self {
63 Self::Zkc(credential) => AnyAuthCredentialPresentation::V4(credential.present(
64 public_params,
65 group_secret_params,
66 randomness,
67 )),
68 }
69 }
70}
71
72impl AuthCredentialWithPniResponse {
73 pub fn new(bytes: &[u8]) -> Result<Self, ZkGroupDeserializationFailure> {
74 let first = bytes
75 .first()
76 .ok_or_else(ZkGroupDeserializationFailure::new::<Self>)?;
77 let version = AuthCredentialWithPniVersion::try_from(*first)
78 .map_err(|_| ZkGroupDeserializationFailure::new::<Self>())?;
79 match version {
80 AuthCredentialWithPniVersion::Zkc => {
81 crate::common::serialization::deserialize(bytes).map(Self::Zkc)
82 }
83 }
84 }
85
86 pub fn receive(
87 self,
88 public_params: &ServerPublicParams,
89 aci: Aci,
90 pni: Pni,
91 redemption_time: crate::Timestamp,
92 ) -> Result<AuthCredentialWithPni, ZkGroupVerificationFailure> {
93 match self {
94 Self::Zkc(credential) => credential
95 .receive(aci, pni, redemption_time, public_params)
96 .map(AuthCredentialWithPni::Zkc),
97 }
98 }
99}
100
101impl Serialize for AuthCredentialWithPni {
102 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
103 where
104 S: serde::Serializer,
105 {
106 match self {
107 Self::Zkc(z) => z.serialize(serializer),
108 }
109 }
110}
111
112impl Serialize for AuthCredentialWithPniResponse {
113 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
114 where
115 S: serde::Serializer,
116 {
117 match self {
118 Self::Zkc(z) => z.serialize(serializer),
119 }
120 }
121}