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