mirror of
https://github.com/juspay/hyperswitch.git
synced 2025-10-30 01:27:31 +08:00
refactor(router): make routes public and move crypto module to common utils (#176)
Co-authored-by: Arun Raj M <jarnura47@gmail.com>
This commit is contained in:
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -919,11 +919,13 @@ dependencies = [
|
|||||||
"bytes",
|
"bytes",
|
||||||
"error-stack",
|
"error-stack",
|
||||||
"fake",
|
"fake",
|
||||||
|
"hex",
|
||||||
"masking",
|
"masking",
|
||||||
"nanoid",
|
"nanoid",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"proptest",
|
"proptest",
|
||||||
"regex",
|
"regex",
|
||||||
|
"ring",
|
||||||
"router_env",
|
"router_env",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
|||||||
@ -10,9 +10,11 @@ license = "Apache-2.0"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
bytes = "1.3.0"
|
bytes = "1.3.0"
|
||||||
error-stack = "0.2.4"
|
error-stack = "0.2.4"
|
||||||
|
hex = "0.4.3"
|
||||||
nanoid = "0.4.0"
|
nanoid = "0.4.0"
|
||||||
once_cell = "1.16.0"
|
once_cell = "1.16.0"
|
||||||
regex = "1.7.0"
|
regex = "1.7.0"
|
||||||
|
ring = "0.16.20"
|
||||||
serde = { version = "1.0.149", features = ["derive"] }
|
serde = { version = "1.0.149", features = ["derive"] }
|
||||||
serde_json = "1.0.89"
|
serde_json = "1.0.89"
|
||||||
serde_urlencoded = "0.7.1"
|
serde_urlencoded = "0.7.1"
|
||||||
|
|||||||
@ -1,11 +1,14 @@
|
|||||||
|
//! Utilities for cryptographic algorithms
|
||||||
use error_stack::{IntoReport, ResultExt};
|
use error_stack::{IntoReport, ResultExt};
|
||||||
use ring::{aead, hmac};
|
use ring::{aead, hmac};
|
||||||
|
|
||||||
use crate::core::errors::{self, CustomResult};
|
use crate::errors::{self, CustomResult};
|
||||||
|
|
||||||
const RING_ERR_UNSPECIFIED: &str = "ring::error::Unspecified";
|
const RING_ERR_UNSPECIFIED: &str = "ring::error::Unspecified";
|
||||||
|
|
||||||
|
/// Trait for cryptographically signing messages
|
||||||
pub trait SignMessage {
|
pub trait SignMessage {
|
||||||
|
/// Takes in a secret and a message and returns the calculated signature as bytes
|
||||||
fn sign_message(
|
fn sign_message(
|
||||||
&self,
|
&self,
|
||||||
_secret: &[u8],
|
_secret: &[u8],
|
||||||
@ -13,7 +16,10 @@ pub trait SignMessage {
|
|||||||
) -> CustomResult<Vec<u8>, errors::CryptoError>;
|
) -> CustomResult<Vec<u8>, errors::CryptoError>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Trait for cryptographically verifying a message against a signature
|
||||||
pub trait VerifySignature {
|
pub trait VerifySignature {
|
||||||
|
/// Takes in a secret, the signature and the message and verifies the message
|
||||||
|
/// against the signature
|
||||||
fn verify_signature(
|
fn verify_signature(
|
||||||
&self,
|
&self,
|
||||||
_secret: &[u8],
|
_secret: &[u8],
|
||||||
@ -22,7 +28,9 @@ pub trait VerifySignature {
|
|||||||
) -> CustomResult<bool, errors::CryptoError>;
|
) -> CustomResult<bool, errors::CryptoError>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Trait for cryptographically encoding a message
|
||||||
pub trait EncodeMessage {
|
pub trait EncodeMessage {
|
||||||
|
/// Takes in a secret and the message and encodes it, returning bytes
|
||||||
fn encode_message(
|
fn encode_message(
|
||||||
&self,
|
&self,
|
||||||
_secret: &[u8],
|
_secret: &[u8],
|
||||||
@ -30,7 +38,9 @@ pub trait EncodeMessage {
|
|||||||
) -> CustomResult<(Vec<u8>, Vec<u8>), errors::CryptoError>;
|
) -> CustomResult<(Vec<u8>, Vec<u8>), errors::CryptoError>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Trait for cryptographically decoding a message
|
||||||
pub trait DecodeMessage {
|
pub trait DecodeMessage {
|
||||||
|
/// Takes in a secret, an encoded messages and attempts to decode it, returning bytes
|
||||||
fn decode_message(
|
fn decode_message(
|
||||||
&self,
|
&self,
|
||||||
_secret: &[u8],
|
_secret: &[u8],
|
||||||
@ -38,6 +48,9 @@ pub trait DecodeMessage {
|
|||||||
) -> CustomResult<Vec<u8>, errors::CryptoError>;
|
) -> CustomResult<Vec<u8>, errors::CryptoError>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Represents no cryptographic algorithm.
|
||||||
|
/// Implements all crypto traits and acts like a Nop
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct NoAlgorithm;
|
pub struct NoAlgorithm;
|
||||||
|
|
||||||
impl SignMessage for NoAlgorithm {
|
impl SignMessage for NoAlgorithm {
|
||||||
@ -81,6 +94,8 @@ impl DecodeMessage for NoAlgorithm {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Represents the HMAC-SHA-256 algorithm
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct HmacSha256;
|
pub struct HmacSha256;
|
||||||
|
|
||||||
impl SignMessage for HmacSha256 {
|
impl SignMessage for HmacSha256 {
|
||||||
@ -107,6 +122,8 @@ impl VerifySignature for HmacSha256 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Represents the HMAC-SHA-512 algorithm
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct HmacSha512;
|
pub struct HmacSha512;
|
||||||
|
|
||||||
impl SignMessage for HmacSha512 {
|
impl SignMessage for HmacSha512 {
|
||||||
@ -133,6 +150,8 @@ impl VerifySignature for HmacSha512 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Represents the GCM-AES-256 algorithm
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct GcmAes256 {
|
pub struct GcmAes256 {
|
||||||
nonce: Vec<u8>,
|
nonce: Vec<u8>,
|
||||||
}
|
}
|
||||||
@ -54,3 +54,20 @@ pub enum ValidationError {
|
|||||||
#[error("{message}")]
|
#[error("{message}")]
|
||||||
InvalidValue { message: String },
|
InvalidValue { message: String },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Cryptograpic algorithm errors
|
||||||
|
#[derive(Debug, thiserror::Error)]
|
||||||
|
pub enum CryptoError {
|
||||||
|
/// The cryptographic algorithm was unable to encode the message
|
||||||
|
#[error("Failed to encode given message")]
|
||||||
|
EncodingFailed,
|
||||||
|
/// The cryptographic algorithm was unable to decode the message
|
||||||
|
#[error("Failed to decode given message")]
|
||||||
|
DecodingFailed,
|
||||||
|
/// The cryptographic algorithm was unable to sign the message
|
||||||
|
#[error("Failed to sign message")]
|
||||||
|
MessageSigningFailed,
|
||||||
|
/// The cryptographic algorithm was unable to verify the given signature
|
||||||
|
#[error("Failed to verify signature")]
|
||||||
|
SignatureVerificationFailed,
|
||||||
|
}
|
||||||
|
|||||||
@ -15,6 +15,7 @@
|
|||||||
#![doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR" ), "/", "README.md"))]
|
#![doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR" ), "/", "README.md"))]
|
||||||
|
|
||||||
pub mod consts;
|
pub mod consts;
|
||||||
|
pub mod crypto;
|
||||||
pub mod custom_serde;
|
pub mod custom_serde;
|
||||||
pub mod errors;
|
pub mod errors;
|
||||||
pub mod ext_traits;
|
pub mod ext_traits;
|
||||||
|
|||||||
@ -451,15 +451,3 @@ pub enum WebhooksFlowError {
|
|||||||
#[error("Webhook not received by merchant")]
|
#[error("Webhook not received by merchant")]
|
||||||
NotReceivedByMerchant,
|
NotReceivedByMerchant,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, thiserror::Error)]
|
|
||||||
pub enum CryptoError {
|
|
||||||
#[error("Failed to encode given message")]
|
|
||||||
EncodingFailed,
|
|
||||||
#[error("Failed to decode given message")]
|
|
||||||
DecodingFailed,
|
|
||||||
#[error("Failed to sign message")]
|
|
||||||
MessageSigningFailed,
|
|
||||||
#[error("Failed to verify signature")]
|
|
||||||
SignatureVerificationFailed,
|
|
||||||
}
|
|
||||||
|
|||||||
@ -1,15 +1,15 @@
|
|||||||
mod admin;
|
pub mod admin;
|
||||||
mod app;
|
pub mod app;
|
||||||
mod customers;
|
pub mod customers;
|
||||||
mod ephemeral_key;
|
pub mod ephemeral_key;
|
||||||
mod health;
|
pub mod health;
|
||||||
mod mandates;
|
pub mod mandates;
|
||||||
mod metrics;
|
pub mod metrics;
|
||||||
mod payment_methods;
|
pub mod payment_methods;
|
||||||
pub(crate) mod payments;
|
pub mod payments;
|
||||||
mod payouts;
|
pub mod payouts;
|
||||||
mod refunds;
|
pub mod refunds;
|
||||||
mod webhooks;
|
pub mod webhooks;
|
||||||
|
|
||||||
pub use self::app::{
|
pub use self::app::{
|
||||||
AppState, Customers, EphemeralKey, Health, Mandates, MerchantAccount, MerchantConnectorAccount,
|
AppState, Customers, EphemeralKey, Health, Mandates, MerchantAccount, MerchantConnectorAccount,
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
pub(crate) mod crypto;
|
|
||||||
pub(crate) mod custom_serde;
|
pub(crate) mod custom_serde;
|
||||||
pub(crate) mod db_utils;
|
pub(crate) mod db_utils;
|
||||||
mod ext_traits;
|
mod ext_traits;
|
||||||
@ -8,6 +7,7 @@ mod fp_utils;
|
|||||||
pub(crate) mod storage_partitioning;
|
pub(crate) mod storage_partitioning;
|
||||||
|
|
||||||
pub(crate) use common_utils::{
|
pub(crate) use common_utils::{
|
||||||
|
crypto,
|
||||||
ext_traits::{ByteSliceExt, BytesExt, Encode, StringExt, ValueExt},
|
ext_traits::{ByteSliceExt, BytesExt, Encode, StringExt, ValueExt},
|
||||||
validation::validate_email,
|
validation::validate_email,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user