Changeset View
Changeset View
Standalone View
Standalone View
services/identity/src/grpc_utils.rs
use base64::{engine::general_purpose, Engine as _}; | use base64::{engine::general_purpose, Engine as _}; | ||||
use ed25519_dalek::{PublicKey, Signature, Verifier}; | use ed25519_dalek::{PublicKey, Signature, Verifier}; | ||||
use serde::Deserialize; | use serde::Deserialize; | ||||
use tonic::Status; | use tonic::Status; | ||||
use crate::{ | use crate::{ | ||||
database::DeviceRow, | database::DeviceRow, | ||||
ddb_utils::Identifier as DBIdentifier, | ddb_utils::Identifier as DBIdentifier, | ||||
grpc_services::protos::{ | grpc_services::protos::{ | ||||
auth::{ | auth::{ | ||||
identity::IdentityInfo, EthereumIdentity, InboundKeyInfo, OutboundKeyInfo, | identity::IdentityInfo, EthereumIdentity, InboundKeyInfo, OutboundKeyInfo, | ||||
}, | }, | ||||
unauth::{ | unauth::{ | ||||
DeviceKeyUpload, OpaqueLoginStartRequest, RegistrationStartRequest, | DeviceKeyUpload, ExistingDeviceLoginRequest, OpaqueLoginStartRequest, | ||||
ReservedRegistrationStartRequest, ReservedWalletRegistrationRequest, | RegistrationStartRequest, ReservedRegistrationStartRequest, | ||||
SecondaryDeviceKeysUploadRequest, WalletAuthRequest, | ReservedWalletRegistrationRequest, SecondaryDeviceKeysUploadRequest, | ||||
WalletAuthRequest, | |||||
}, | }, | ||||
}, | }, | ||||
}; | }; | ||||
#[derive(Deserialize)] | #[derive(Deserialize)] | ||||
pub struct ChallengeResponse { | pub struct ChallengeResponse { | ||||
message: String, | message: String, | ||||
signature: String, | signature: String, | ||||
Show All 9 Lines | impl TryFrom<&SecondaryDeviceKeysUploadRequest> for ChallengeResponse { | ||||
fn try_from( | fn try_from( | ||||
value: &SecondaryDeviceKeysUploadRequest, | value: &SecondaryDeviceKeysUploadRequest, | ||||
) -> Result<Self, Self::Error> { | ) -> Result<Self, Self::Error> { | ||||
serde_json::from_str(&value.challenge_response) | serde_json::from_str(&value.challenge_response) | ||||
.map_err(|_| Status::invalid_argument("message format invalid")) | .map_err(|_| Status::invalid_argument("message format invalid")) | ||||
} | } | ||||
} | } | ||||
impl TryFrom<&ExistingDeviceLoginRequest> for ChallengeResponse { | |||||
type Error = Status; | |||||
fn try_from(value: &ExistingDeviceLoginRequest) -> Result<Self, Self::Error> { | |||||
serde_json::from_str(&value.challenge_response) | |||||
.map_err(|_| Status::invalid_argument("message format invalid")) | |||||
} | |||||
} | |||||
impl ChallengeResponse { | impl ChallengeResponse { | ||||
pub fn verify_and_get_message<T: serde::de::DeserializeOwned>( | pub fn verify_and_get_message<T: serde::de::DeserializeOwned>( | ||||
&self, | &self, | ||||
signing_public_key: &str, | signing_public_key: &str, | ||||
) -> Result<T, Status> { | ) -> Result<T, Status> { | ||||
let signature_bytes = general_purpose::STANDARD_NO_PAD | let signature_bytes = general_purpose::STANDARD_NO_PAD | ||||
.decode(&self.signature) | .decode(&self.signature) | ||||
.map_err(|_| Status::invalid_argument("signature invalid"))?; | .map_err(|_| Status::invalid_argument("signature invalid"))?; | ||||
▲ Show 20 Lines • Show All 232 Lines • Show Last 20 Lines |