dd_sds/secondary_validation/
mod.rs

1mod aba_rtn_checksum;
2mod brazilian_cnpj_checksum;
3mod brazilian_cpf_checksum;
4mod btc_checksum;
5mod bulgarian_egn_checksum;
6mod chinese_id_checksum;
7mod coordination_number_checksum;
8mod czech_tin_checksum;
9mod dutch_bsn_checksum;
10mod dutch_passport_checksum;
11mod entropy;
12mod ethereum_checksum;
13mod finnish_hetu_checksum;
14mod france_nif_checksum;
15mod france_ssn_checksum;
16mod german_ids_checksum;
17mod german_svnr_checksum;
18mod github_token_checksum;
19mod greece_tin_checksum;
20mod hungarian_tin_checksum;
21mod iban_checker;
22mod irish_pps_checksum;
23mod iso_7064_checksum;
24mod italian_national_id_checksum;
25pub mod jwt_claims_validator;
26mod jwt_expiration_checker;
27mod latvia_national_id_checksum;
28mod lithuanian_personal_identification_number_checksum;
29mod luhn_checksum;
30mod luxembourg_individual_nin_checksum;
31mod monero_address;
32mod nhs_check_digit;
33mod nir_checksum;
34mod polish_national_id_checksum;
35mod polish_nip_checksum;
36mod portuguese_tax_id_checksum;
37mod rodne_cislo_checksum;
38mod romanian_personal_numeric_code;
39mod slovenian_pin_checksum;
40mod spain_dni_checksum;
41mod spanish_nuss_checksum;
42mod sweden_pin_checksum;
43mod verhoeff_checksum;
44
45#[cfg(test)]
46pub use jwt_expiration_checker::generate_jwt;
47
48use crate::scanner::regex_rule::config::SecondaryValidator;
49pub use crate::secondary_validation::aba_rtn_checksum::AbaRtnChecksum;
50pub use crate::secondary_validation::brazilian_cnpj_checksum::BrazilianCnpjChecksum;
51pub use crate::secondary_validation::brazilian_cpf_checksum::BrazilianCpfChecksum;
52pub use crate::secondary_validation::btc_checksum::BtcChecksum;
53pub use crate::secondary_validation::bulgarian_egn_checksum::BulgarianEGNChecksum;
54pub use crate::secondary_validation::chinese_id_checksum::ChineseIdChecksum;
55pub use crate::secondary_validation::coordination_number_checksum::CoordinationNumberChecksum;
56pub use crate::secondary_validation::czech_tin_checksum::CzechTaxIdentificationNumberChecksum;
57pub use crate::secondary_validation::dutch_bsn_checksum::DutchBsnChecksum;
58pub use crate::secondary_validation::dutch_passport_checksum::DutchPassportChecksum;
59pub use crate::secondary_validation::entropy::EntropyCheck;
60pub use crate::secondary_validation::ethereum_checksum::EthereumChecksum;
61pub use crate::secondary_validation::finnish_hetu_checksum::FinnishHetuChecksum;
62use crate::secondary_validation::france_nif_checksum::FranceNifChecksum;
63pub use crate::secondary_validation::france_ssn_checksum::FranceSsnChecksum;
64pub use crate::secondary_validation::german_ids_checksum::GermanIdsChecksum;
65pub use crate::secondary_validation::german_svnr_checksum::GermanSvnrChecksum;
66pub use crate::secondary_validation::github_token_checksum::GithubTokenChecksum;
67pub use crate::secondary_validation::greece_tin_checksum::GreekTinChecksum;
68pub use crate::secondary_validation::hungarian_tin_checksum::HungarianTinChecksum;
69pub use crate::secondary_validation::iban_checker::IbanChecker;
70pub use crate::secondary_validation::irish_pps_checksum::IrishPpsChecksum;
71pub use crate::secondary_validation::iso_7064_checksum::{
72    Mod11_2checksum, Mod11_10checksum, Mod27_26checksum, Mod37_2checksum, Mod37_36checksum,
73    Mod97_10checksum, Mod661_26checksum, Mod1271_36Checksum,
74};
75pub use crate::secondary_validation::italian_national_id_checksum::ItalianNationalIdChecksum;
76pub use crate::secondary_validation::jwt_claims_validator::JwtClaimsValidator;
77pub use crate::secondary_validation::jwt_expiration_checker::JwtExpirationChecker;
78pub use crate::secondary_validation::latvia_national_id_checksum::LatviaNationalIdChecksum;
79use crate::secondary_validation::lithuanian_personal_identification_number_checksum::LithuanianPersonalIdentificationNumberChecksum;
80pub use crate::secondary_validation::luhn_checksum::LuhnChecksum;
81pub use crate::secondary_validation::luxembourg_individual_nin_checksum::LuxembourgIndividualNINChecksum;
82pub use crate::secondary_validation::monero_address::MoneroAddress;
83pub use crate::secondary_validation::nhs_check_digit::NhsCheckDigit;
84pub use crate::secondary_validation::nir_checksum::NirChecksum;
85pub use crate::secondary_validation::polish_national_id_checksum::PolishNationalIdChecksum;
86pub use crate::secondary_validation::polish_nip_checksum::PolishNipChecksum;
87pub use crate::secondary_validation::portuguese_tax_id_checksum::PortugueseTaxIdChecksum;
88pub use crate::secondary_validation::rodne_cislo_checksum::RodneCisloNumberChecksum;
89pub use crate::secondary_validation::romanian_personal_numeric_code::RomanianPersonalNumericCode;
90pub use crate::secondary_validation::slovenian_pin_checksum::SlovenianPINChecksum;
91pub use crate::secondary_validation::spain_dni_checksum::SpanishDniChecksum;
92pub use crate::secondary_validation::spanish_nuss_checksum::SpanishNussChecksum;
93pub use crate::secondary_validation::sweden_pin_checksum::SwedenPINChecksum;
94pub use crate::secondary_validation::verhoeff_checksum::VerhoeffChecksum;
95
96use std::str::Chars;
97use std::sync::Arc;
98
99pub trait Validator: Send + Sync {
100    fn is_valid_match(&self, regex_match: &str) -> bool;
101}
102
103fn get_previous_digit(chars: &mut Chars<'_>) -> Option<u32> {
104    while let Some(char) = chars.next_back() {
105        if let Some(digit) = char.to_digit(10) {
106            return Some(digit);
107        }
108    }
109    None
110}
111fn get_next_digit(chars: &mut Chars<'_>) -> Option<u32> {
112    for char in chars.by_ref() {
113        if let Some(digit) = char.to_digit(10) {
114            return Some(digit);
115        }
116    }
117    None
118}
119
120/// Sum all the digits from a number
121#[inline]
122fn sum_all_digits(digits: u32) -> u32 {
123    let mut sum = 0;
124    let mut num = digits;
125    while num > 0 {
126        sum += num % 10;
127        num /= 10;
128    }
129    sum
130}
131
132impl SecondaryValidator {
133    pub fn compile(&self) -> Arc<dyn Validator> {
134        match self {
135            SecondaryValidator::AbaRtnChecksum => Arc::new(AbaRtnChecksum),
136            SecondaryValidator::BrazilianCnpjChecksum => Arc::new(BrazilianCnpjChecksum),
137            SecondaryValidator::BrazilianCpfChecksum => Arc::new(BrazilianCpfChecksum),
138            SecondaryValidator::BtcChecksum => Arc::new(BtcChecksum),
139            SecondaryValidator::BulgarianEGNChecksum => Arc::new(BulgarianEGNChecksum),
140            SecondaryValidator::ChineseIdChecksum => Arc::new(ChineseIdChecksum),
141            SecondaryValidator::CoordinationNumberChecksum => Arc::new(CoordinationNumberChecksum),
142            SecondaryValidator::CzechPersonalIdentificationNumberChecksum => {
143                Arc::new(RodneCisloNumberChecksum)
144            }
145            SecondaryValidator::CzechTaxIdentificationNumberChecksum => {
146                Arc::new(CzechTaxIdentificationNumberChecksum)
147            }
148            SecondaryValidator::DutchBsnChecksum => Arc::new(DutchBsnChecksum),
149            SecondaryValidator::DutchPassportChecksum => Arc::new(DutchPassportChecksum),
150            SecondaryValidator::EntropyCheck => Arc::new(EntropyCheck),
151            SecondaryValidator::EthereumChecksum => Arc::new(EthereumChecksum),
152            SecondaryValidator::FinnishHetuChecksum => Arc::new(FinnishHetuChecksum),
153            SecondaryValidator::FranceNifChecksum => Arc::new(FranceNifChecksum),
154            SecondaryValidator::FranceSsnChecksum => Arc::new(FranceSsnChecksum),
155            SecondaryValidator::GermanIdsChecksum => Arc::new(GermanIdsChecksum),
156            SecondaryValidator::GermanSvnrChecksum => Arc::new(GermanSvnrChecksum),
157            SecondaryValidator::GithubTokenChecksum => Arc::new(GithubTokenChecksum),
158            SecondaryValidator::GreekTinChecksum => Arc::new(GreekTinChecksum),
159            SecondaryValidator::HungarianTinChecksum => Arc::new(HungarianTinChecksum),
160            SecondaryValidator::IbanChecker => Arc::new(IbanChecker),
161            SecondaryValidator::IrishPpsChecksum => Arc::new(IrishPpsChecksum),
162            SecondaryValidator::ItalianNationalIdChecksum => Arc::new(ItalianNationalIdChecksum),
163            SecondaryValidator::JwtClaimsValidator { config } => {
164                Arc::new(JwtClaimsValidator::new(config.clone()))
165            }
166            SecondaryValidator::JwtExpirationChecker => Arc::new(JwtExpirationChecker),
167            SecondaryValidator::LatviaNationalIdChecksum => Arc::new(LatviaNationalIdChecksum),
168            SecondaryValidator::LithuanianPersonalIdentificationNumberChecksum => {
169                Arc::new(LithuanianPersonalIdentificationNumberChecksum)
170            }
171            SecondaryValidator::LuhnChecksum => Arc::new(LuhnChecksum),
172            SecondaryValidator::LuxembourgIndividualNINChecksum => {
173                Arc::new(LuxembourgIndividualNINChecksum)
174            }
175            SecondaryValidator::Mod11_10checksum => Arc::new(Mod11_10checksum),
176            SecondaryValidator::Mod11_2checksum => Arc::new(Mod11_2checksum),
177            SecondaryValidator::Mod1271_36Checksum => Arc::new(Mod1271_36Checksum),
178            SecondaryValidator::Mod27_26checksum => Arc::new(Mod27_26checksum),
179            SecondaryValidator::Mod37_2checksum => Arc::new(Mod37_2checksum),
180            SecondaryValidator::Mod37_36checksum => Arc::new(Mod37_36checksum),
181            SecondaryValidator::Mod661_26checksum => Arc::new(Mod661_26checksum),
182            SecondaryValidator::Mod97_10checksum => Arc::new(Mod97_10checksum),
183            SecondaryValidator::MoneroAddress => Arc::new(MoneroAddress),
184            SecondaryValidator::NhsCheckDigit => Arc::new(NhsCheckDigit),
185            SecondaryValidator::NirChecksum => Arc::new(NirChecksum),
186            SecondaryValidator::PolishNationalIdChecksum => Arc::new(PolishNationalIdChecksum),
187            SecondaryValidator::PolishNipChecksum => Arc::new(PolishNipChecksum),
188            SecondaryValidator::PortugueseTaxIdChecksum => Arc::new(PortugueseTaxIdChecksum),
189            SecondaryValidator::RodneCisloNumberChecksum => Arc::new(RodneCisloNumberChecksum),
190            SecondaryValidator::RomanianPersonalNumericCode => {
191                Arc::new(RomanianPersonalNumericCode)
192            }
193            SecondaryValidator::SlovenianPINChecksum => Arc::new(SlovenianPINChecksum),
194            SecondaryValidator::SpanishDniChecksum => Arc::new(SpanishDniChecksum),
195            SecondaryValidator::SpanishNussChecksum => Arc::new(SpanishNussChecksum),
196            SecondaryValidator::SwedenPINChecksum => Arc::new(SwedenPINChecksum),
197        }
198    }
199}