dd_sds/secondary_validation/
mod.rs1mod aba_rtn_checksum;
2mod austrian_ssn_checksum;
3mod belgium_national_register_checksum;
4mod brazilian_cnpj_checksum;
5mod brazilian_cpf_checksum;
6mod btc_checksum;
7mod bulgarian_egn_checksum;
8mod chinese_id_checksum;
9mod coordination_number_checksum;
10mod czech_tin_checksum;
11mod dutch_bsn_checksum;
12mod dutch_passport_checksum;
13mod entropy;
14mod estonia_personal_code_checksum;
15mod ethereum_checksum;
16mod finnish_hetu_checksum;
17mod france_nif_checksum;
18mod france_ssn_checksum;
19mod german_ids_checksum;
20mod german_svnr_checksum;
21mod github_token_checksum;
22mod greece_amka_checksum;
23mod greece_tin_checksum;
24mod hungarian_tin_checksum;
25mod iban_checker;
26mod irish_pps_checksum;
27mod iso_7064_checksum;
28mod italian_national_id_checksum;
29pub mod jwt_claims_validator;
30mod jwt_expiration_checker;
31mod latvia_national_id_checksum;
32mod lithuanian_personal_identification_number_checksum;
33mod luhn_checksum;
34mod luxembourg_individual_nin_checksum;
35mod monero_address;
36mod nhs_check_digit;
37mod nir_checksum;
38mod polish_national_id_checksum;
39mod polish_nip_checksum;
40mod portuguese_tax_id_checksum;
41mod rodne_cislo_checksum;
42mod romanian_personal_numeric_code;
43mod slovenia_tin_checksum;
44mod slovenian_pin_checksum;
45mod spain_dni_checksum;
46mod spanish_nuss_checksum;
47mod sweden_pin_checksum;
48mod us_dea_checksum;
49mod us_npi_checksum;
50mod verhoeff_checksum;
51
52#[cfg(test)]
53pub use jwt_expiration_checker::generate_jwt;
54
55use crate::scanner::regex_rule::config::SecondaryValidator;
56pub use crate::secondary_validation::aba_rtn_checksum::AbaRtnChecksum;
57pub use crate::secondary_validation::austrian_ssn_checksum::AustrianSSNChecksum;
58pub use crate::secondary_validation::belgium_national_register_checksum::BelgiumNationalRegisterChecksum;
59pub use crate::secondary_validation::brazilian_cnpj_checksum::BrazilianCnpjChecksum;
60pub use crate::secondary_validation::brazilian_cpf_checksum::BrazilianCpfChecksum;
61pub use crate::secondary_validation::btc_checksum::BtcChecksum;
62pub use crate::secondary_validation::bulgarian_egn_checksum::BulgarianEGNChecksum;
63pub use crate::secondary_validation::chinese_id_checksum::ChineseIdChecksum;
64pub use crate::secondary_validation::coordination_number_checksum::CoordinationNumberChecksum;
65pub use crate::secondary_validation::czech_tin_checksum::CzechTaxIdentificationNumberChecksum;
66pub use crate::secondary_validation::dutch_bsn_checksum::DutchBsnChecksum;
67pub use crate::secondary_validation::dutch_passport_checksum::DutchPassportChecksum;
68pub use crate::secondary_validation::entropy::EntropyCheck;
69pub use crate::secondary_validation::estonia_personal_code_checksum::EstoniaPersonalCodeChecksum;
70pub use crate::secondary_validation::ethereum_checksum::EthereumChecksum;
71pub use crate::secondary_validation::finnish_hetu_checksum::FinnishHetuChecksum;
72use crate::secondary_validation::france_nif_checksum::FranceNifChecksum;
73pub use crate::secondary_validation::france_ssn_checksum::FranceSsnChecksum;
74pub use crate::secondary_validation::german_ids_checksum::GermanIdsChecksum;
75pub use crate::secondary_validation::german_svnr_checksum::GermanSvnrChecksum;
76pub use crate::secondary_validation::github_token_checksum::GithubTokenChecksum;
77pub use crate::secondary_validation::greece_amka_checksum::GreeceAmkaChecksum;
78pub use crate::secondary_validation::greece_tin_checksum::GreekTinChecksum;
79pub use crate::secondary_validation::hungarian_tin_checksum::HungarianTinChecksum;
80pub use crate::secondary_validation::iban_checker::IbanChecker;
81pub use crate::secondary_validation::irish_pps_checksum::IrishPpsChecksum;
82pub use crate::secondary_validation::iso_7064_checksum::{
83 Mod11_2checksum, Mod11_10checksum, Mod27_26checksum, Mod37_2checksum, Mod37_36checksum,
84 Mod97_10checksum, Mod661_26checksum, Mod1271_36Checksum,
85};
86pub use crate::secondary_validation::italian_national_id_checksum::ItalianNationalIdChecksum;
87pub use crate::secondary_validation::jwt_claims_validator::JwtClaimsValidator;
88pub use crate::secondary_validation::jwt_expiration_checker::JwtExpirationChecker;
89pub use crate::secondary_validation::latvia_national_id_checksum::LatviaNationalIdChecksum;
90use crate::secondary_validation::lithuanian_personal_identification_number_checksum::LithuanianPersonalIdentificationNumberChecksum;
91pub use crate::secondary_validation::luhn_checksum::LuhnChecksum;
92pub use crate::secondary_validation::luxembourg_individual_nin_checksum::LuxembourgIndividualNINChecksum;
93pub use crate::secondary_validation::monero_address::MoneroAddress;
94pub use crate::secondary_validation::nhs_check_digit::NhsCheckDigit;
95pub use crate::secondary_validation::nir_checksum::NirChecksum;
96pub use crate::secondary_validation::polish_national_id_checksum::PolishNationalIdChecksum;
97pub use crate::secondary_validation::polish_nip_checksum::PolishNipChecksum;
98pub use crate::secondary_validation::portuguese_tax_id_checksum::PortugueseTaxIdChecksum;
99pub use crate::secondary_validation::rodne_cislo_checksum::RodneCisloNumberChecksum;
100pub use crate::secondary_validation::romanian_personal_numeric_code::RomanianPersonalNumericCode;
101pub use crate::secondary_validation::slovenia_tin_checksum::SloveniaTinChecksum;
102pub use crate::secondary_validation::slovenian_pin_checksum::SlovenianPINChecksum;
103pub use crate::secondary_validation::spain_dni_checksum::SpanishDniChecksum;
104pub use crate::secondary_validation::spanish_nuss_checksum::SpanishNussChecksum;
105pub use crate::secondary_validation::sweden_pin_checksum::SwedenPINChecksum;
106pub use crate::secondary_validation::us_dea_checksum::UsDeaChecksum;
107pub use crate::secondary_validation::us_npi_checksum::UsNpiChecksum;
108pub use crate::secondary_validation::verhoeff_checksum::VerhoeffChecksum;
109
110use std::str::Chars;
111use std::sync::Arc;
112
113pub trait Validator: Send + Sync {
114 fn is_valid_match(&self, regex_match: &str) -> bool;
115}
116
117fn get_previous_digit(chars: &mut Chars<'_>) -> Option<u32> {
118 while let Some(char) = chars.next_back() {
119 if let Some(digit) = char.to_digit(10) {
120 return Some(digit);
121 }
122 }
123 None
124}
125fn get_next_digit(chars: &mut Chars<'_>) -> Option<u32> {
126 for char in chars.by_ref() {
127 if let Some(digit) = char.to_digit(10) {
128 return Some(digit);
129 }
130 }
131 None
132}
133
134#[inline]
136fn sum_all_digits(digits: u32) -> u32 {
137 let mut sum = 0;
138 let mut num = digits;
139 while num > 0 {
140 sum += num % 10;
141 num /= 10;
142 }
143 sum
144}
145
146pub(crate) fn validate_mod11_weighted_checksum<F>(
148 regex_match: &str,
149 weights: &[u32],
150 edge_case_handler: F,
151) -> bool
152where
153 F: Fn(u32) -> Option<u32>,
154{
155 let mut chars = regex_match.chars();
156 let mut sum: u32 = 0;
157
158 for &weight in weights {
159 let digit = match get_next_digit(&mut chars) {
160 Some(d) => d,
161 None => return false,
162 };
163 sum += digit * weight;
164 }
165
166 let actual_checksum = match get_next_digit(&mut chars) {
167 Some(d) => d,
168 None => return false,
169 };
170
171 if get_next_digit(&mut chars).is_some() {
172 return false; }
174
175 let remainder = sum % 11;
176 match edge_case_handler(remainder) {
177 Some(expected_checksum) => expected_checksum == actual_checksum,
178 None => false,
179 }
180}
181
182impl SecondaryValidator {
183 pub fn compile(&self) -> Arc<dyn Validator> {
184 match self {
185 SecondaryValidator::AbaRtnChecksum => Arc::new(AbaRtnChecksum),
186 SecondaryValidator::AustrianSSNChecksum => Arc::new(AustrianSSNChecksum),
187 SecondaryValidator::BelgiumNationalRegisterChecksum => {
188 Arc::new(BelgiumNationalRegisterChecksum)
189 }
190 SecondaryValidator::BrazilianCnpjChecksum => Arc::new(BrazilianCnpjChecksum),
191 SecondaryValidator::BrazilianCpfChecksum => Arc::new(BrazilianCpfChecksum),
192 SecondaryValidator::BtcChecksum => Arc::new(BtcChecksum),
193 SecondaryValidator::BulgarianEGNChecksum => Arc::new(BulgarianEGNChecksum),
194 SecondaryValidator::ChineseIdChecksum => Arc::new(ChineseIdChecksum),
195 SecondaryValidator::CoordinationNumberChecksum => Arc::new(CoordinationNumberChecksum),
196 SecondaryValidator::CzechPersonalIdentificationNumberChecksum => {
197 Arc::new(RodneCisloNumberChecksum)
198 }
199 SecondaryValidator::CzechTaxIdentificationNumberChecksum => {
200 Arc::new(CzechTaxIdentificationNumberChecksum)
201 }
202 SecondaryValidator::DutchBsnChecksum => Arc::new(DutchBsnChecksum),
203 SecondaryValidator::DutchPassportChecksum => Arc::new(DutchPassportChecksum),
204 SecondaryValidator::EntropyCheck => Arc::new(EntropyCheck),
205 SecondaryValidator::EstoniaPersonalCodeChecksum => {
206 Arc::new(EstoniaPersonalCodeChecksum)
207 }
208 SecondaryValidator::EthereumChecksum => Arc::new(EthereumChecksum),
209 SecondaryValidator::FinnishHetuChecksum => Arc::new(FinnishHetuChecksum),
210 SecondaryValidator::FranceNifChecksum => Arc::new(FranceNifChecksum),
211 SecondaryValidator::FranceSsnChecksum => Arc::new(FranceSsnChecksum),
212 SecondaryValidator::GermanIdsChecksum => Arc::new(GermanIdsChecksum),
213 SecondaryValidator::GermanSvnrChecksum => Arc::new(GermanSvnrChecksum),
214 SecondaryValidator::GithubTokenChecksum => Arc::new(GithubTokenChecksum),
215 SecondaryValidator::GreeceAmkaChecksum => Arc::new(GreeceAmkaChecksum),
216 SecondaryValidator::GreekTinChecksum => Arc::new(GreekTinChecksum),
217 SecondaryValidator::HungarianTinChecksum => Arc::new(HungarianTinChecksum),
218 SecondaryValidator::IbanChecker => Arc::new(IbanChecker),
219 SecondaryValidator::IrishPpsChecksum => Arc::new(IrishPpsChecksum),
220 SecondaryValidator::ItalianNationalIdChecksum => Arc::new(ItalianNationalIdChecksum),
221 SecondaryValidator::JwtClaimsValidator { config } => {
222 Arc::new(JwtClaimsValidator::new(config.clone()))
223 }
224 SecondaryValidator::JwtExpirationChecker => Arc::new(JwtExpirationChecker),
225 SecondaryValidator::LatviaNationalIdChecksum => Arc::new(LatviaNationalIdChecksum),
226 SecondaryValidator::LithuanianPersonalIdentificationNumberChecksum => {
227 Arc::new(LithuanianPersonalIdentificationNumberChecksum)
228 }
229 SecondaryValidator::LuhnChecksum => Arc::new(LuhnChecksum),
230 SecondaryValidator::LuxembourgIndividualNINChecksum => {
231 Arc::new(LuxembourgIndividualNINChecksum)
232 }
233 SecondaryValidator::Mod11_10checksum => Arc::new(Mod11_10checksum),
234 SecondaryValidator::Mod11_2checksum => Arc::new(Mod11_2checksum),
235 SecondaryValidator::Mod1271_36Checksum => Arc::new(Mod1271_36Checksum),
236 SecondaryValidator::Mod27_26checksum => Arc::new(Mod27_26checksum),
237 SecondaryValidator::Mod37_2checksum => Arc::new(Mod37_2checksum),
238 SecondaryValidator::Mod37_36checksum => Arc::new(Mod37_36checksum),
239 SecondaryValidator::Mod661_26checksum => Arc::new(Mod661_26checksum),
240 SecondaryValidator::Mod97_10checksum => Arc::new(Mod97_10checksum),
241 SecondaryValidator::MoneroAddress => Arc::new(MoneroAddress),
242 SecondaryValidator::NhsCheckDigit => Arc::new(NhsCheckDigit),
243 SecondaryValidator::NirChecksum => Arc::new(NirChecksum),
244 SecondaryValidator::PolishNationalIdChecksum => Arc::new(PolishNationalIdChecksum),
245 SecondaryValidator::PolishNipChecksum => Arc::new(PolishNipChecksum),
246 SecondaryValidator::PortugueseTaxIdChecksum => Arc::new(PortugueseTaxIdChecksum),
247 SecondaryValidator::RodneCisloNumberChecksum => Arc::new(RodneCisloNumberChecksum),
248 SecondaryValidator::RomanianPersonalNumericCode => {
249 Arc::new(RomanianPersonalNumericCode)
250 }
251 SecondaryValidator::SlovenianPINChecksum => Arc::new(SlovenianPINChecksum),
252 SecondaryValidator::SloveniaTinChecksum => Arc::new(SloveniaTinChecksum),
253 SecondaryValidator::SpanishDniChecksum => Arc::new(SpanishDniChecksum),
254 SecondaryValidator::SpanishNussChecksum => Arc::new(SpanishNussChecksum),
255 SecondaryValidator::SwedenPINChecksum => Arc::new(SwedenPINChecksum),
256 SecondaryValidator::UsDeaChecksum => Arc::new(UsDeaChecksum),
257 SecondaryValidator::UsNpiChecksum => Arc::new(UsNpiChecksum),
258 SecondaryValidator::VerhoeffChecksum => Arc::new(VerhoeffChecksum),
259 }
260 }
261}