use chrono::{NaiveDate, NaiveTime};
use serde_derive::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Serialize, Deserialize)]
pub struct DEG_InstituteIdentifier {
pub country_code: String,
pub bank_code: u32,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DEG_SegmentHead {
pub identifier: String,
pub segment_no: u16,
pub version: u16,
pub reference_seg: Option<u16>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct ReferenceMessage {
pub dialog_id: u16,
pub message_no: u16,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum SecurityMethodCode {
RAH,
PIN,
}
impl fmt::Display for SecurityMethodCode {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
SecurityMethodCode::RAH => write!(f, "RAH"),
SecurityMethodCode::PIN => write!(f, "PIN"),
}
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DEG_SecurityProfile {
pub security_method_code: SecurityMethodCode,
pub version: u8,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum SecurityFunction {
NRO = 1,
AUT = 2,
ENC = 4,
SingleStepAuth = 999,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum SecurityArea {
SHM = 1,
SHT = 2,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum SecurityRole {
ISS = 1,
CON = 3,
WIT = 4,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum SecurityPartyIdentifier {
MS = 1,
MR = 2,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DEG_SecurityIdentificationDetails {
pub security_party_identifier: SecurityPartyIdentifier,
pub cardholder_identification: Option<Vec<u8>>,
pub party_identifier: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum DateIdentifier {
STS = 1,
CRT = 6,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DEG_SecurityDate {
pub date_identifier: DateIdentifier,
#[serde(with = "fints_date_format")]
pub date: NaiveDate,
pub time: Option<NaiveTime>,
}
mod fints_date_format {
use chrono::NaiveDate;
use serde::{self, Deserialize, Deserializer, Serializer};
const FORMAT: &'static str = "%Y%m%d";
pub fn serialize<S>(date: &NaiveDate, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let s = format!("{}", date.format(FORMAT));
serializer.serialize_str(&s)
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<NaiveDate, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
NaiveDate::parse_from_str(&s, FORMAT).map_err(serde::de::Error::custom)
}
}
#[derive(Debug, Serialize, Deserialize)]
pub enum UseOfHashAlgorithm {
OHA = 1,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum HashAlgorithm {
SHA1 = 1,
SHA256 = 3,
SHA384 = 4,
SHA512 = 5,
SHA256SHA256 = 6,
MutuallyAgreed = 999,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum HashAlgorithmParameterIdentifier {
IVC = 1,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DEG_HashAlgorithm {
pub use_of_hash_algorithm: UseOfHashAlgorithm,
pub hash_algorithm: HashAlgorithm,
pub hash_algorithm_param_identifier: HashAlgorithmParameterIdentifier,
pub param_value: Option<Vec<u8>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum UseOfSignatureAlgorithm {
OSG = 6,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum SignatureAlgorithm {
NA = 1,
RSA = 10,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum OperationMode {
CBC = 2,
ISO_97961 = 16,
ISO_97962 = 17,
RSASSA_PKCS = 18,
RSASSA_PSS = 19,
MutuallyAgreed = 999,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DEG_SignatureAlgorithm {
pub use_of_signature_algorithm: UseOfSignatureAlgorithm,
pub signature_algorithm: SignatureAlgorithm,
pub operation_mode: OperationMode,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum KeyType {
D,
S,
V,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DEG_KeyName {
pub institute_identifier: DEG_InstituteIdentifier,
pub user_id: String,
pub key_type: KeyType,
pub key_no: u16,
pub key_version: u16,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum CertificateType {
ZKA = 1,
UN_EDIFACT = 2,
X509v3 = 3,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DEG_Certificate {
pub certificate_type: CertificateType,
pub value: Vec<u8>,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum CustomerSystemStatus {
NotRequired = 0,
Required = 1,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum DialogLang {
Standard = 0,
de = 1,
en = 2,
fr = 3,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum TanProcess {
All = 0,
Active = 2,
Available = 3,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DEG_AccountInternationalIssuer {
pub iban: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum MessageRelationship {
IsAnswer = 1,
ExpectAnswer = 2,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum FunctionTypeIdentifier {
CertificateReplacement = 112,
CertficateStatusRequest = 124,
CertificateStatusNotice = 224,
CertificateRevocation = 130,
RevocationConfirmation = 231,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DEG_UserDefinedSignature {
pub PIN: String,
pub TAN: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum SynchronizationMode {
ReportNewCustomerSystemId = 0,
ReportLastProcessedMessageNo = 1,
ReportSignatureId = 2,
}