Skip to main content

pdk_jwt_lib/validator/
rsa_validator.rs

1// Copyright (c) 2026, Salesforce, Inc.,
2// All rights reserved.
3// For full license text, see the LICENSE.txt file
4
5//! # RSA Signature Validator
6//!
7//! This module provides signature validation for RSA algorithms
8//! (RS256, RS384, RS512) used in JWT tokens.
9
10use super::signature_validator::SignatureValidation;
11use crate::{
12    error::jwt_error::JWTError,
13    model::{
14        claims::{CustomClaims, JWTClaims, TryFromTrustedJWTCompactClaims},
15        signing_algorithm::SigningKeyLength,
16        untrusted_token::untrusted_jwt_compact::UntrustedJWT,
17    },
18    parser::rsa_pk_parser::parse_rsa_pk,
19};
20use jwt_compact::alg::Rsa;
21use jwt_compact::AlgorithmExt;
22use rsa::errors::Error as RsaError;
23use rsa::RsaPublicKey;
24
25// Signature validator for RSA algorithm.
26// Supports key lengths 256, 384 and 512.
27pub struct RsaSignatureValidator {
28    key_length: SigningKeyLength,
29    key: RsaPublicKey,
30}
31
32impl RsaSignatureValidator {
33    pub fn new(key_length: SigningKeyLength, key: String) -> Result<Self, JWTError> {
34        let key = parse_rsa_pk(key)?;
35        Ok(Self { key_length, key })
36    }
37}
38
39impl SignatureValidation for RsaSignatureValidator {
40    fn validate(&self, token: String) -> Result<JWTClaims, JWTError> {
41        UntrustedJWT::new(&token)
42            .and_then(|untrusted_jwt| {
43                as_rsa_algorithm(&self.key_length)
44                    .validator::<CustomClaims>(&self.key)
45                    .validate(&untrusted_jwt.into())
46                    .map_err(JWTError::from)
47            })
48            .and_then(|claims| JWTClaims::try_from_trusted_jwt_compact_claims(claims, token))
49    }
50}
51
52pub fn as_rsa_algorithm(key_length: &SigningKeyLength) -> Rsa {
53    match key_length {
54        SigningKeyLength::Len256 => Rsa::rs256(),
55        SigningKeyLength::Len384 => Rsa::rs384(),
56        SigningKeyLength::Len512 => Rsa::rs512(),
57    }
58}
59
60impl From<rsa::pkcs1::Error> for crate::error::jwt_error::JWTError {
61    fn from(e: rsa::pkcs1::Error) -> Self {
62        JWTError::RsaPublicKeyParseFailed(format!("RSA Public key parsing error: {e}"))
63    }
64}
65
66impl From<RsaError> for crate::error::jwt_error::JWTError {
67    fn from(e: RsaError) -> Self {
68        JWTError::ValidationFailed(format!("Invalid token. JWT Policy validation error: {e}"))
69    }
70}
71
72#[cfg(test)]
73mod tests {
74    use crate::validator::rsa_validator::RsaSignatureValidator;
75
76    const RSA_PUBLIC_KEY_PEM_256: &str = "-----BEGIN PUBLIC KEY-----
77MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnFRZJoSbY3lJmruwlXQM
78wiOlr4EtBJHSj7IrCYqx9rFEW+JUwoe5iMZl33D6tUsr1GsG50R7JL2KvxHrj0u6
79A3A9beI41XdRfJatugaffroLuZCUYla097uVSQacUSBfBVEsT0TU9MrxBW0HGIXz
80dGwuA9GRncgk7kcfPgJLjwzcBBZATVaASO28Rrf6eQ12w0UNJL4XM+/yPyQatbvO
81D5KqX8ue2a0uO+7yE8x0A99UMIHYo1zedp+Qr+p0+/5VTWjEZT5I6JGUIMjSVqn0
82L0z0WMKJtSdG/CQpZyGnWBz6irOd5xJHAyH7mr02dOJVSXMJXvchCEMMlWghqlqQ
83XwIDAQAB
84-----END PUBLIC KEY-----";
85
86    const RSA_PUBLIC_KEY_PEM: &str = "-----BEGIN PUBLIC KEY-----
87MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8+dw6EKuZ9BBi3yuW2EPH1b26QQwG5IT7oe16kV/5bR10IqYXrMfOg9hgeR2hMm4Nx81iXaET2Piiluk+y4AWpppndludQpzl9ngRxZhWsuJP80AelbeJBYCZsncY6pHGsVjNeqGuXyUaZ9JTG9tFkH5sZeIGEMffkpBYlk4TQlKsc11tgG3ThVedJ4GrWZiR365UBr8U4Ddc5e/YrLGQXYTD+rXI50d8WIHiCVYGfs4XCyp+O2pWYfXM02akp95rC28GlOXyn3/58PcLat+uxKGW3VbpcrX/GHvB3mhF7Xg9RY54FdU47CszRNcf8/wPIs48MC7HAf60DH+YAt1tQIDAQAB
88-----END PUBLIC KEY-----";
89
90    fn rs256_validator() -> RsaSignatureValidator {
91        RsaSignatureValidator::new(
92            crate::model::signing_algorithm::SigningKeyLength::Len256,
93            String::from(RSA_PUBLIC_KEY_PEM_256),
94        )
95        .unwrap()
96    }
97
98    fn rs384_validator() -> RsaSignatureValidator {
99        RsaSignatureValidator::new(
100            crate::model::signing_algorithm::SigningKeyLength::Len384,
101            String::from(RSA_PUBLIC_KEY_PEM),
102        )
103        .unwrap()
104    }
105
106    fn rs512_validator() -> RsaSignatureValidator {
107        RsaSignatureValidator::new(
108            crate::model::signing_algorithm::SigningKeyLength::Len512,
109            String::from(RSA_PUBLIC_KEY_PEM),
110        )
111        .unwrap()
112    }
113
114    mod rsa_validator_256 {
115        use crate::error::jwt_error::JWTErrorEnumKind;
116        use crate::validator::rsa_validator::tests::rs256_validator;
117        use crate::validator::rsa_validator::SignatureValidation;
118        use crate::validator::signature_validator::tests::assert_error_kind;
119        use test_case::test_case;
120
121        extern crate test_case;
122
123        #[test]
124        fn validation_fails_when_token_not_sent() {
125            let token = "";
126
127            let validation = rs256_validator().validate(token.to_string());
128
129            assert_error_kind(&validation, JWTErrorEnumKind::TokenParseFailed);
130        }
131
132        #[test]
133        fn unparseable_token_is_rejected() {
134            let token = "WhatAmI?AnInvalidToken!";
135
136            let validation = rs256_validator().validate(token.to_string());
137
138            assert_error_kind(&validation, JWTErrorEnumKind::TokenParseFailed);
139        }
140
141        #[test]
142        fn validation_fails_on_invalid_signature() {
143            let token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.NHVaYe26MbtOYhSKkoKYdFVomg4i8ZJd8_-RU8VNbftc4TSMb4bXP3l3YlNWACwyXPGffz5aXHc6lty1Y2t4SWRqGteragsVdZufDn5BlnJl9pdR_kdVFUsra2rWKEofkZeIC4yWytE58sMIihvo9H1ScmmVwBcQP6XETqYd0aSHp1gOa9RdUPDvoXQ5oqygTqVtxaDr6wUFKrKItgBMzWIdNZ6y7O9E0DhEPTbE9rfBo6KTFsHAZnMg4k68CDp2woYIaXbmYTWcvbzIuHO7_37GT79XdIwkm95QJ7hYC9RiwrV7mesbY4PAahERJawntho0my942XheVLmGwLMBkQ";
144
145            let validation = rs256_validator().validate(token.to_string());
146
147            assert_error_kind(&validation, JWTErrorEnumKind::ValidationFailed);
148        }
149
150        #[test]
151        fn validation_fails_on_missing_signature() {
152            let token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.e30.";
153
154            let validation = rs256_validator().validate(token.to_string());
155
156            assert_error_kind(&validation, JWTErrorEnumKind::ValidationFailed);
157        }
158
159        #[test]
160        fn verify_valid_token_is_correctly_parsed() {
161            let token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJleHAiOjMyODAzOTQwOTh9.Cd806gYUdJ18VPp29PLl1Ky9Cye-dG86bLdsDtYXWXrTTgQhztpRdAA4R1cqVWVn8iHlRxkWdEyqNZ03uMuJ6Cyg_dVARuRqfsRU8WUXKirW5_3pWtqT2V-iC8J0SwEPEtG-nwKafx-akngCh_yeSGTf05bsaQ8loed-ktRbAhrke18VLzuGA2E2mbdo6ZhRmQ47Ei_Clbz5ZGJ4MIBEpeQh6XkgXRwqUABGM2l3Ivw85FHSL1GV9XSNRC4fvXvO2wSN6ohXUM2Z5MX8RY1sRt1bUOU47IpHug-gV1uTC_diEJ_oizWjfRxVSKT-AId0U1-im2Jmrkc4XIGb1AuWXA";
162            let validation = rs256_validator().validate(token.to_string());
163
164            let jwt_claims = validation.unwrap();
165            assert_eq!(jwt_claims.get_header("alg").unwrap(), "RS256");
166            assert_eq!(
167                jwt_claims.expiration().unwrap().to_string(),
168                "2073-12-13 12:34:58 UTC"
169            );
170        }
171
172        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.e30.AC3VWMTRNDUh2S2MbT3SSzVg4P7BykOCWYSlMRYgh7xUGo4lisfjaTKpqydtoouB-mJaWRtq09rnP1BG1IMLXxPjYNPsVbTvcpktifS_qAnzjLtNpki_a7H1Uxey7mPn6MQf0bzD4inYb_zz7OgPb6U57l8B7kHKhA7vS6-a56zOxDnrZm2pwtNhkoXWBfQ6LiRWjfPOQUED3ep3YZ-BQR5sT3KUNV_nrgi6Qhc1wPOoTbEaLbjCQjnML6jxpJxpXKL2zL8ARHy-avxqtwCiWW3LQ-DQhneEVYzZ79q-8FKD8GcII9g3MCX5MZVmpYS3Z3WPP1Xzb4IVtUUYK6dogg"; "verifyValidToken 256")]
173        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJleHAiOjgyMDA5ODUyNH0.aioNoIEcHkVcOMErDQjsYEs5BPuXICLkgmU_ABOVIGXJ6sOBWXB1Nx0N_xCC-rytIr-Ldw5sHlm4ThJII00HEg_S2ncsRAvdiRtPsdrfnaFFjRb5J0Azy3IE2Q2zAnEDLli8-Og9e4UMXwweOGvspS399zpgImM1QE394_Q9hi14Ly-ATROdYQCZ1Arl87mHuxqlVyoebmw1mFjPHCaD-gcIuwduMqIKMGjZCwMs2mQFc4ELWq0cp4uT7b9Wwxap20iQnKiTLlhigQT4WIV124Bx0wyCN-QszkAJfUKPb_0I9vZnJ2MxQ8JzBaPPFkwwB9OI42xWCi5ujuQZ2PirIA"; "exceptionNotThrownOnExpiredTokenWithNoClaimValidation 256")]
174        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.e30.AC3VWMTRNDUh2S2MbT3SSzVg4P7BykOCWYSlMRYgh7xUGo4lisfjaTKpqydtoouB-mJaWRtq09rnP1BG1IMLXxPjYNPsVbTvcpktifS_qAnzjLtNpki_a7H1Uxey7mPn6MQf0bzD4inYb_zz7OgPb6U57l8B7kHKhA7vS6-a56zOxDnrZm2pwtNhkoXWBfQ6LiRWjfPOQUED3ep3YZ-BQR5sT3KUNV_nrgi6Qhc1wPOoTbEaLbjCQjnML6jxpJxpXKL2zL8ARHy-avxqtwCiWW3LQ-DQhneEVYzZ79q-8FKD8GcII9g3MCX5MZVmpYS3Z3WPP1Xzb4IVtUUYK6dogg"; "exceptionNotThrownOnMissingClaim 256")]
175        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJleHAiOjMyODAzOTQwOTh9.Cd806gYUdJ18VPp29PLl1Ky9Cye-dG86bLdsDtYXWXrTTgQhztpRdAA4R1cqVWVn8iHlRxkWdEyqNZ03uMuJ6Cyg_dVARuRqfsRU8WUXKirW5_3pWtqT2V-iC8J0SwEPEtG-nwKafx-akngCh_yeSGTf05bsaQ8loed-ktRbAhrke18VLzuGA2E2mbdo6ZhRmQ47Ei_Clbz5ZGJ4MIBEpeQh6XkgXRwqUABGM2l3Ivw85FHSL1GV9XSNRC4fvXvO2wSN6ohXUM2Z5MX8RY1sRt1bUOU47IpHug-gV1uTC_diEJ_oizWjfRxVSKT-AId0U1-im2Jmrkc4XIGb1AuWXA"; "verifyNotExpiredToken 256")]
176        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJleHAiOjgyMDA5ODUyNH0.aioNoIEcHkVcOMErDQjsYEs5BPuXICLkgmU_ABOVIGXJ6sOBWXB1Nx0N_xCC-rytIr-Ldw5sHlm4ThJII00HEg_S2ncsRAvdiRtPsdrfnaFFjRb5J0Azy3IE2Q2zAnEDLli8-Og9e4UMXwweOGvspS399zpgImM1QE394_Q9hi14Ly-ATROdYQCZ1Arl87mHuxqlVyoebmw1mFjPHCaD-gcIuwduMqIKMGjZCwMs2mQFc4ELWq0cp4uT7b9Wwxap20iQnKiTLlhigQT4WIV124Bx0wyCN-QszkAJfUKPb_0I9vZnJ2MxQ8JzBaPPFkwwB9OI42xWCi5ujuQZ2PirIA"; "exceptionNotThrownOnExpiredToken 256")]
177        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjgyMDA5ODUyNH0.WoSKVr5spQPZU7D-4BjY_mJZlBJVg3GNhZt1qUXqpuEap4j-q4OjieEbKdccmsdFnqicP-GRdP8f0WSyfH2zkKWfxh45MJlg1tu8qXQc7iEjKkqgpL9qTmbhwM17C3KO6uh4sEpXH00KO7jbQcztYejwi4XkxWcrAL4Pcq8kg4j-QF68-kSd4ynqWdIFxToAU2CtYJiSiMrEagqOirah6Lc1Jt4Y6Cq7ZqB0K8RglrrzUTLm7xhUUXUXtX3W_qvcsx3FJKcLHrRGGkk4AHCDKcemv7Q1jmhrrCBAjTLRIMAYIjDBRtFhWICfrLIT1sJkyIEActi414ivM_FChkLWdQ"; "verifyTokenWithNbf 256")]
178        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJuYmYiOjMyODAzOTQwOTh9.gIKqxXHz8trNZxHMVPmgodJzvKvzQnsRrqp9eIJ8ynVfWWU1M2d6EdALlRZMRnIkQqzjk2Rz-9JJWbC7GeqGu9TK16b2JSYxE1Ugc33k9CTGbnZN6xdqnlnjZVWMT_dJjY9yrzedcrPvbiQVhOJnsZp_el_eY5Riq_5vxaPs6xQ7Oy5Fs6M9h5HqTfuz4AemSOXzMzbjL__LI9_vEklng7L2C3TXXlS8uPhzDd_Dw5xT2YKX0hbPCcVHWOrkG0NO5YOoe25p0TpC8zYM1ss565pNXvvcA3wyjUBJbtlY5cLQ_33_Q9G35UHDV-d5zcVngs3rhjobmPldvf7NmRRHXg"; "exceptionNotThrownNotYetActiveToken 256")]
179        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmb28ifQ.hzHOzr2qZces6LP78PJTX2rm0c0Lpbd9qj6K2fbIQvG4tzVffagrcjXbX_JvUBRS7TYI4A9WwSKb3m28E0GY__EBhWPPGacjdP037zX9qybyLx2pKN4Pbd3J1xgsNH7jrgommqzrx4VXs1jcYTAk-qmZDxrXCDhCspdQ7OJOmB7eCkD0E9i03zAMFyuSs0eGGJkbbVMBXd2f2Pk_WehzNftctCseEgQ-3mFk1T1j2lufDtMkurLOIQcQjuMxbnrp3DT4ancqNcMBXWiPifyU5LOBjame8VTYHZdaloi5693luAhTQTAoDeLqR7AQJomVQ2iGzA-dJElBlt4VYMzy-g"; "verifyTokenWithAud 256")]
180        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOlsiZXRjIiwiZm9vIiwiYmxhaCJdfQ.BPAHq9NrYKHw7lgg7noqyR4Do01fPctskKxpsoxqPholu2vp1bK-zVG8m6IntOLZ0M9GyDtbsqGG53AceQ5CWkn1k9G59UpeK_U7GBYUdSaB7GGWWIwmpi37ZCb1Q3hiMNSRH9EimlWDokepwVzdX1la5hgZRwHWuwRJd-Ks3a-KIUXy60JiwrtuDUEAOuQgU2gLZNec7hSSV4Rv7B3rYbXNbgp_nk6ypnCxq8s6poczzE-0emHRIQjTvV6KE71fgNwadZGCnZfGt6qsjZjq7ePkyedMMQbjOedbzQYs9tBjfXSm1wXi7oDqUbbUIOuX7XHU-SEdm9Wy636kvuQhVw"; "verifyTokenWithAudArray 256")]
181        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOlsiZXRjIiwiZm9vIGJhciIsImJsYWgiXX0.gusn77DBrj56nKpdewp_xvJS4ezOWqpnno5LnsjKAROl4-oJdS4fWV8xQ84e335dVdHXR0cwYiBv78Gl03ntTXXa1zt85umklKPH7abzMSeIIjx4-lDgJOcejuYSWPAJoE1Aqgf1uuF4Gi4HoVCiTEPsh7yYF5NoWRedxiBQ-bYHm0nOdFP9QSh1p0mGb9JpFUvV8ZNP_nK61UM9wRR3YGY89W7t0qs0F02L-gcD2-vZVusneWX1xCBZPPuzyxSbHE8v9Q0_M53SS41-CZZA-oiJVZwN0_ZH4MxigqZMNtLSsLbJmZBtfBrhEc8tFnYNefrIbwmI3Ai-yIMpctP1gA"; "verifyTokenWithAudiencesWithSpaces 256")]
182        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOlsiZXRjIiwiRm9vIiwiYmxhaCJdfQ.b-ZXZQRxonJbZIH-fiMu67L2M5HlpiCN-7wQ44tQgOyoEb3K3ULi5vsMuuflnpHrHefahuCSn_tFMbLviaQ4E_nbZ3FAiXULMTgfP4Ryf-9F592OVAwXj4YYfVKXowIs45_bOmMTt733uTzXDXRj478wnXHzOCzrUYk1F7Wl91BsZG4uY8TKhgbvXrTB1L4PrMJ_bUUi0KX4Y1WC8cTyodOqlbvp-w8T4JEsZxLshJHZhPp5Jnttv4z4PphkT6DeYycH9VA_QkCuOkBJ4nbgzyzDa3WIYOST_NzzWLWbpJNfXgxjLtdxXZuhOctuCwi5Qd4twBJq-g4m4UKV2lqB4Q"; "verifyTokenWithAudiencesCaseSensitive 256")]
183        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOlsiZXRjIiwiYmxhaCJdfQ.IkV3j7no7odNebVE-bP06wAlsur4y-ZfUqBsk5bBh1ewbm66tIgGHfxfvJoHZvTdil8msrF0dZ5uN6CTa8H_wBIEPlRx1BBaIF6MPXVUyd97lrKa1lE3cV2QFkMkYi1981XpJ5IwzbNshu14ZmoAT5s8R2lrqteFQE3LMG3TExTf_0zQBlsfoTwv4XPX7Dud_SGqqLps15gdjFOVcG6zbGI-DZrrAT6xlDMqkiulvc3DR73Zin9T7nAPlZdKqLSsK1nN_Lw027zcOroLe2vECa0jOL3Y6UNnCyhqY46SpboRB133YhQ1nG80NzffZPdF65DBP2-dfG0aEBgCeEl1Dg"; "exceptionNotThrownWhenInvalidAudToken 256")]
184        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiJmb28iLCJuYmYiOjgyMDA5ODUyNCwibmFtZSI6IkpvaG4gRG9lIiwic2NvcGVzIjpbInJlYWQiLCJ3cml0ZSJdLCJleHAiOjMyODAzOTQwOTh9.Dv3e40myu1r-gaLkrUb-CRxnxAeqgvUAp26K9Isqv1mKVk71iCFPtWC-zvSDEoZKrlXXN54fFS8jH8mO9xReKtOXxHH-iFTFQB127cGE8hv801caeuFfnsyt9s1JpoEy9POJAdmGna7kewHzK0v_0u5oNEBGaN_SrqWYUrmrZEbMZd8nI4Y3XGlvZL-GUwD6y_wlu-l9zFQ5Ph16r_gDcxy2IaAB9gyLZMIl0NewzUwcMzuShfTdyhnwYCeFtGxALaWgIAJpqfB9KzZueG10J7CPeukfw06DcvqK_DjQFDEDsljdEOrQ_pALaw9mXlgGUrJVtzsAP00JGHayV4hpEA"; "checkAllValidations 256")]
185        fn verify_valid_token_256(token: &str) {
186            let validation = rs256_validator().validate(token.to_string());
187
188            assert!(validation.is_ok());
189        }
190    }
191
192    mod rsa_validator_384 {
193        use crate::error::jwt_error::JWTErrorEnumKind;
194        use crate::validator::rsa_validator::tests::rs384_validator;
195        use crate::validator::rsa_validator::SignatureValidation;
196        use crate::validator::signature_validator::tests::assert_error_kind;
197        use test_case::test_case;
198
199        extern crate test_case;
200
201        #[test]
202        fn validation_fails_when_token_not_sent() {
203            let token = "";
204
205            let validation = rs384_validator().validate(token.to_string());
206
207            assert_error_kind(&validation, JWTErrorEnumKind::TokenParseFailed);
208        }
209
210        #[test]
211        fn unparseable_token_is_rejected() {
212            let token = "WhatAmI?AnInvalidToken!";
213
214            let validation = rs384_validator().validate(token.to_string());
215
216            assert_error_kind(&validation, JWTErrorEnumKind::TokenParseFailed);
217        }
218
219        #[test]
220        fn validation_fails_on_invalid_signature() {
221            let token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.NHVaYe26MbtOYhSKkoKYdFVomg4i8ZJd8_-RU8VNbftc4TSMb4bXP3l3YlNWACwyXPGffz5aXHc6lty1Y2t4SWRqGteragsVdZufDn5BlnJl9pdR_kdVFUsra2rWKEofkZeIC4yWytE58sMIihvo9H1ScmmVwBcQP6XETqYd0aSHp1gOa9RdUPDvoXQ5oqygTqVtxaDr6wUFKrKItgBMzWIdNZ6y7O9E0DhEPTbE9rfBo6KTFsHAZnMg4k68CDp2woYIaXbmYTWcvbzIuHO7_37GT79XdIwkm95QJ7hYC9RiwrV7mesbY4PAahERJawntho0my942XheVLmGwLMBkQ";
222
223            let validation = rs384_validator().validate(token.to_string());
224
225            assert_error_kind(&validation, JWTErrorEnumKind::ValidationFailed);
226        }
227
228        #[test]
229        fn validation_fails_on_missing_signature() {
230            let token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.e30.";
231
232            let validation = rs384_validator().validate(token.to_string());
233
234            assert_error_kind(&validation, JWTErrorEnumKind::ValidationFailed);
235        }
236
237        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzM4NCJ9.e30.gaKUA7fJzSjojHhkG1_NlMd7PGs4c8DQsvQAd06RpE1rbUo1w_z1k3WydrZBUqf7NVfmsdGrGG1T3V32sU58dJPzim7-xKk4zyBAj22qkkeTrnu64_TREbFE7agq2VCcjbyF5WWQXgzClbx3_Kcnko8m1UcBL83oC51gLxZzjYykeph3N7DGzrJQ6w0xnxxLslVUUwBJUZGDLzk9muBSp5HOrdseGFsgeK-lNmTY12YRigH7Y6TR9c0Vg6Dpp6r72klEuHdZFv9dqvBSsEzINz4Vffn4g_SPCCG-gyYA7z1kiM_HV4MgmsfO63cTnMeZocGIhd5E1NtRnqmBe9aQEw"; "verifyValidToken 384")]
238        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzM4NCJ9.eyJleHAiOjgyMDA5ODUyNH0.ZCO2PemCFUI6NGzOz8Rlo_eQ8gKD_9iCV5FCjMjryB1qHpBvMnBAAUkfv8L8lLolGCcbc2sgMVKDHRDdbbvj67Y5ulauiaWIq7T7EoOVcmb4-T2kibcq7w7OYTIOcBAbV43n1tR67Xt6I8bHvStcqxCW3m49NbvbYyLmjCiDhsYr5asT4NawIz9hWfJhKBfUUaMmDgrg4cbQ1yYIOQt_XdYypvp_wStGst8I25_OryjGQcAnEfZLxIt0lx-Ahnw1UofJQMrR2pFrXS4XignLWShKUae5i6AqmcZVeYz6uPV-XRGxS5qlMbH0QnKpTStwsqdZN4SW_Ojr1to907dlpw"; "exceptionNotThrownOnExpiredTokenWithNoClaimValidation 384")]
239        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzM4NCJ9.e30.gaKUA7fJzSjojHhkG1_NlMd7PGs4c8DQsvQAd06RpE1rbUo1w_z1k3WydrZBUqf7NVfmsdGrGG1T3V32sU58dJPzim7-xKk4zyBAj22qkkeTrnu64_TREbFE7agq2VCcjbyF5WWQXgzClbx3_Kcnko8m1UcBL83oC51gLxZzjYykeph3N7DGzrJQ6w0xnxxLslVUUwBJUZGDLzk9muBSp5HOrdseGFsgeK-lNmTY12YRigH7Y6TR9c0Vg6Dpp6r72klEuHdZFv9dqvBSsEzINz4Vffn4g_SPCCG-gyYA7z1kiM_HV4MgmsfO63cTnMeZocGIhd5E1NtRnqmBe9aQEw"; "exceptionNotThrownOnMissingClaim 384")]
240        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzM4NCJ9.eyJleHAiOjMyODAzOTQwOTh9.13CsOGbqGad8oS2j1ysra2VJ6Uvi2EEwEQIfOB-zPnou5aW5lO4LIGhNf2nDzvk5_U7um8tdRvNkZfu_pgkzAFDLI-aDh1yoCnPZTHY9Ha7GImXaq45WLurOlX8MUy5Y_gGS3cU8BpyRJAJ9j2zod1ba9hfSMhGxCg60ReG5_ziQnmYcbjxOZx-pXYr0EfusHUJJLL91ZKCvqMbe_D57v35aQIIYWog-YBltA6puD5jRBLDzaXLhRYTmidQDZ_l-7Jyo5I6V95i4buvnh2bUCS44TfJFMFQfzsQO1ULtTRhBt9z2OI9bwkEUdpLliUNVyV8oPquULPFqfJHUd7430A"; "verifyNotExpiredToken 384")]
241        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzM4NCJ9.eyJleHAiOjgyMDA5ODUyNH0.ZCO2PemCFUI6NGzOz8Rlo_eQ8gKD_9iCV5FCjMjryB1qHpBvMnBAAUkfv8L8lLolGCcbc2sgMVKDHRDdbbvj67Y5ulauiaWIq7T7EoOVcmb4-T2kibcq7w7OYTIOcBAbV43n1tR67Xt6I8bHvStcqxCW3m49NbvbYyLmjCiDhsYr5asT4NawIz9hWfJhKBfUUaMmDgrg4cbQ1yYIOQt_XdYypvp_wStGst8I25_OryjGQcAnEfZLxIt0lx-Ahnw1UofJQMrR2pFrXS4XignLWShKUae5i6AqmcZVeYz6uPV-XRGxS5qlMbH0QnKpTStwsqdZN4SW_Ojr1to907dlpw"; "exceptionNotThrownOnExpiredToken 384")]
242        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzM4NCJ9.eyJuYmYiOjgyMDA5ODUyNH0.kiB0Tum9dXLGM77i9GKQeURSXvabbkwnLh_HN_b-k4JJxrxSfNUc-Xc6rtLFBA1DGmsVFA7kJbaEAC24vbQ8JXzTmvCfR1KdJfPXiVI2nzpPnPbDmCw5SuOM3oWX1lmugb53YvXPIgqla728xbvzS9cWPzmYeE-eWwUyIhL-i--AtlizAPt6nu9wYp2FT_Nkug63pH0xFzeIbDEfj9UnokrKM3mkCeFmgk11mTeA4XMouLKwzIopfFoh4KDNf55jODoaWSC4P893YBeSFD8_1GeHuGc79S4lXgQToSaTdtOSK-yYwJavYT1ajqtLeLub5eR4_utf7gZf0FKa3pXSGw"; "verifyTokenWithNbf 384")]
243        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzM4NCJ9.eyJuYmYiOjMyODAzOTQwOTh9.58E3cT7S18G4CRh7ilTwDbMhDG9k9ET41SGnMOZ7YTNKBIk0JOU-ZIC8cIgM5jnjEHiC2vnGjiMlOP-inp1i5US0pF_MQqzwR0nitsprgEPSfncC_r_vNiOEVcZVHp00uFg4EmF9PTi8rGEiZO7pcw3BI8m-yz2_ScYvA5McXpP8eBPfKYVVDR5WUi0QLnGDzzhsxwjj5YE9l4w1OBuRF69m-WfiLUQhcxLl55-2MI8zZvwqo_pxW7mlFg4AHFLw2C2q5aBwr3LkME_LTN9oD5VcLC9BpqUzbKhf291IEI_0sEkim1CQVw7VLeb4ZVXidGo5RZE_vjJ4Xf9atYSmOQ"; "exceptionNotThrownNotYetActiveToken 384")]
244        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzM4NCJ9.eyJhdWQiOiJmb28ifQ.IN-S5czRL7s723njzLMLnJnJYO_kV3myZmNcsukcAExisirkLiJWRvBedKBRVUigs6uo5yfMeIWiBjg0RopQzsBi-kZ24o29Rr5O8o63G8bWfcgHZr0u4aNXy-z8g9ZEW7SRydnnlWCOSlkXxtyyIVzgUs7i8aWzIzVcNZ0Cs2SgbmSF0tBfFfgde_HctTk7DH3URrk0kBDAIO_4he5c3OmPx73empEM1h-SKXl0V2HIonSnjzTWe5rM_u2YXq8lMQn8P5vRUPulAjQVaTebwQvFKg7p7hv0JT0okUzFMtyyuYBR9DE3srEIrb-R1way77By8SmVqB2H_ritZV4nNA"; "verifyTokenWithAud 384")]
245        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzM4NCJ9.eyJhdWQiOlsiZXRjIiwiZm9vIiwiYmxhaCJdfQ.J0uzNeQ3aXMs8nX1f_sU5WvB5qmKAiveyJDuntVXRX3QXH0zSqUmMzclxj5yesAEGcS7GF5Ua_-f1HapdzQ8HZcb9acoUXU-LoxMNTQmci3j7H2IHiZUahGMn4R9kY1pY73wdwKdUSsw7jH44qb-xd8TVxY73NeAkp7DqlqUnTswNOy0DkKmUDLMUZ4bsgiCEgOiv90Mx3cxk3K2h3ztNhWfG5J3QqZbRQK9jYjbGD7YQ1aRqhMYdWBNoZb5m87VeqrQv9hvAirJ2_X70RA_0mO_l1B2Tjs3Aip91fhsjTVIaBl_1wblEvt5vOW5NU7fefRz9T42kPyJXt2vYgu8_g"; "verifyTokenWithAudArray 384")]
246        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzM4NCJ9.eyJhdWQiOlsiZXRjIiwiZm9vIGJhciIsImJsYWgiXX0.XP8SXvyu98gJpvM0SLKqLWRrjFEqlWTVTik_xBGoSEaN3VHiE--FufOzWLhLYBKSnELf0UybK1rCt5638PudeVMpNIKVXP4w_c7L-G99N0Ee2LUnLv7Qab0pHwd_GTFjj0dJ9GtdCU2COriMOwL1QoWueqm25XdXEBzhmVqvhvDcd4GVMAaWsboUhp7gArkJwA9FKyBJnk4cVi7su9SlxyDe05vuoOcEPcB0hIa_PYr0USCRcAZVIv0qGQI_keDMgQNR51esUbZxLLq6x_6qh-L8yajyjiSwu95gAROUizQjQO39L7imBjQWu6XKgbirrYaykKU21hFU3-4ezCQcng"; "verifyTokenWithAudiencesWithSpaces 384")]
247        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzM4NCJ9.eyJhdWQiOlsiZXRjIiwiRm9vIiwiYmxhaCJdfQ.1kO5Ck-gcdWH2eaHYTU4jXVW3szSkNzTMHwId4Cyw2eKOTtmC77lxU_UEcVSa4PTlGi_sOMAdaDT_XD80q27zNTl3m8-i3Wzap07NZXvFK3ebIxhvWVppPrpYlQl0FHhEAJ1C7n_kUglqiyKphJoRKzB2hC4y0_72uZl1Ww9CzH_zgNqx-AmubIz_dYJMamLK3w9U2nQFQG5FpTlqnbYekeIvq_cGFsNeQLbaFXn4fGZPwLBlU8lA2aIvKfsGmU9PyX_o7fEyoiBPDzxO0epKuaKhPhR2t4PzA7Fg5tGPTL_mdP0dAaZWFBx6czm8m2CQll3NuVXoW9jpk-mlt1pUg"; "verifyTokenWithAudiencesCaseSensitive 384")]
248        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzM4NCJ9.eyJhdWQiOlsiZXRjIiwiYmxhaCJdfQ.ZnnAslQp5wnBWLJ5c0lbvKm195J4-kN1R_WW80FvYXDDxzMBdzEMRJ8YzN2moUFMg3Qj3HVytJmufAh-GQB-wAv6zgyziV-rLXg6k3-vNlq7zxYv_7mfcYI_YLFXPckV1JZC3Sklfnk_YKiCJAaft8H3YD347aXaZSuOewO3k4QhmQOnNX124FWV7TeO8Cw9xZ7-alfToczyQf0bhx7juoCQAvjpBkOFOx5geaQ6if6XDlHB2WgPoWsAZcmg3Fg3FMcwevCeRLJWRkZD5WtyW5aKqxf-QRUlEfXLuMsS3IqltQgPbwmkndxOgtyZg3502uIYA0Zh1KptRphWvj6Y1w"; "exceptionNotThrownWhenInvalidAudToken 384")]
249        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzM4NCJ9.eyJhdWQiOiJmb28iLCJuYmYiOjgyMDA5ODUyNCwibmFtZSI6IkpvaG4gRG9lIiwic2NvcGVzIjpbInJlYWQiLCJ3cml0ZSJdLCJleHAiOjMyODAzOTQwOTh9.WXgYhU44AD-daQdhI3lBYTS37jgfxXh0OD83wJFVgTKevMgeC4kbV0X1m73hluesb2zzdyapTKc1Zr70aDn-K46gi7a_nRexOpso143X-XeSasHnhUdZ4vcDN9q1L5VKkzPLVrNtS5yOinrnNcWAwvRg69VRuxpcepm3aerYOL4Zc5nhV8Sb766upaIv7brW-ENPO5lojpjxEJXq2uoimSA5SgJs2jwJThg2NjM0ag9uNIIha396HxRwPhd_yL1k6FkiAr-0kkw9O_IXIT48bTGLCu3wft5yb8ZLiCJn1y5ttZ2YsK8N2L_YjIsCZUjy5iq3OnKckVhljEoP347lcQ"; "checkAllValidations 384")]
250        fn verify_valid_token_384(token: &str) {
251            let validation = rs384_validator().validate(token.to_string());
252
253            assert!(validation.is_ok());
254        }
255    }
256
257    mod rsa_validator_512 {
258        use crate::error::jwt_error::JWTErrorEnumKind;
259        use crate::validator::rsa_validator::tests::rs512_validator;
260        use crate::validator::rsa_validator::SignatureValidation;
261        use crate::validator::signature_validator::tests::assert_error_kind;
262        use test_case::test_case;
263
264        extern crate test_case;
265
266        #[test]
267        fn validation_fails_when_token_not_sent() {
268            let token = "";
269
270            let validation = rs512_validator().validate(token.to_string());
271
272            assert_error_kind(&validation, JWTErrorEnumKind::TokenParseFailed);
273        }
274
275        #[test]
276        fn unparseable_token_is_rejected() {
277            let token = "WhatAmI?AnInvalidToken!";
278
279            let validation = rs512_validator().validate(token.to_string());
280
281            assert_error_kind(&validation, JWTErrorEnumKind::TokenParseFailed);
282        }
283
284        #[test]
285        fn validation_fails_on_invalid_signature() {
286            let token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWUsImlhdCI6MTUxNjIzOTAyMn0.NHVaYe26MbtOYhSKkoKYdFVomg4i8ZJd8_-RU8VNbftc4TSMb4bXP3l3YlNWACwyXPGffz5aXHc6lty1Y2t4SWRqGteragsVdZufDn5BlnJl9pdR_kdVFUsra2rWKEofkZeIC4yWytE58sMIihvo9H1ScmmVwBcQP6XETqYd0aSHp1gOa9RdUPDvoXQ5oqygTqVtxaDr6wUFKrKItgBMzWIdNZ6y7O9E0DhEPTbE9rfBo6KTFsHAZnMg4k68CDp2woYIaXbmYTWcvbzIuHO7_37GT79XdIwkm95QJ7hYC9RiwrV7mesbY4PAahERJawntho0my942XheVLmGwLMBkQ";
287
288            let validation = rs512_validator().validate(token.to_string());
289
290            assert_error_kind(&validation, JWTErrorEnumKind::ValidationFailed);
291        }
292
293        #[test]
294        fn validation_fails_on_missing_signature() {
295            let token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.e30.";
296
297            let validation = rs512_validator().validate(token.to_string());
298
299            assert_error_kind(&validation, JWTErrorEnumKind::ValidationFailed);
300        }
301
302        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.e30.sIIsQVsaeVuFdR8oD477Yj7FO-yyyBXmW-ZqbJXt8gmLTF4rhdiPU93BusD2PyBTIBK1b18jdk827gQAYr04-lMOrQR-uvv31HvsENQGr1N5Zatlnj6yoTRU8j5hgIsrxPK7AbfimgT_r2zT6xbNcGc4p1-zpuEnVhxHGGQpk6_5HYD_UJsfVP2vSmnxuIzwxe0Nnu9XGXuwPI0yVcoqyJUG1AO9Atb4PGvycdpLnKHmF2DcLa55fbvShJ6GKQ4XbQve_Dm_m9Qfp7vzVZp1jlEZRn2js4um_oriwzLmx89P5b0ti-npc-4WroC12HbGLCkYl7K1RIcHR-em2KGUiw"; "verifyValidToken 512")]
303        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.eyJleHAiOjgyMDA5ODUyNH0.pk-M00nbxjujJrtHqfkJdckw4UZ13uvEehk-m2mga-i8k807GkY7cVIXnP42z17-0yk-ypy76xdQpuhZumKk0gxW4hevdBzeuo3ijfJ_2Ka-Kr1TowyCWfy3TMDZ8mtykXixj953XSn-AdMsB4p6vJ9iCR4jniwacQWVbspnWYLVEs0c1xjHE2jhSIOEZ6cHYhLGlGd06yPsa1NbwKo2Pd-QZX_N90TvQx4mVsKHcHs8XjugAEoV5kd-jLJpeCPRK_udsrGUTjLJqZtkyqirOQSWBNkbTmfWl6r7MkD4AOt7WvMHMm0jOGBZzSycI5fBdjtndymmwAPull-csw3KKw"; "exceptionNotThrownOnExpiredTokenWithNoClaimValidation 512")]
304        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.e30.sIIsQVsaeVuFdR8oD477Yj7FO-yyyBXmW-ZqbJXt8gmLTF4rhdiPU93BusD2PyBTIBK1b18jdk827gQAYr04-lMOrQR-uvv31HvsENQGr1N5Zatlnj6yoTRU8j5hgIsrxPK7AbfimgT_r2zT6xbNcGc4p1-zpuEnVhxHGGQpk6_5HYD_UJsfVP2vSmnxuIzwxe0Nnu9XGXuwPI0yVcoqyJUG1AO9Atb4PGvycdpLnKHmF2DcLa55fbvShJ6GKQ4XbQve_Dm_m9Qfp7vzVZp1jlEZRn2js4um_oriwzLmx89P5b0ti-npc-4WroC12HbGLCkYl7K1RIcHR-em2KGUiw"; "exceptionNotThrownOnMissingClaim 512")]
305        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.eyJleHAiOjMyODAzOTQwOTh9.YnDBuFTzTkk0MWJghFO6_8MVQBl67MEZHxUjH1IioYDnxh5CWSX03YbZ5AYyvumtivj3qyYH392trMocKApfBIrYzHM69ETyyJ8yyhJrtt9whc6h56FGHtQy8l3HjjTMUHaVlTSySg2XRSrjeXDd_YwG2X-LepQRv_O6DrwcwfmHI_HDD3RY1kv8Jw0804QwFkgbbuVdYekGM4gMBRoTpXpf6HPB99avCD4Hz9SwHkC0FW-eVuosTqZK2fcQ0wi6OI5Ezi0_7dxt9wy2Y-_xvtMxDYA-x76Mtb0WBJn3vwMIobagdvRovIWYsYx2teO7a3QvO9D6I9i2JiJIGc9_eg"; "verifyNotExpiredToken 512")]
306        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.eyJleHAiOjgyMDA5ODUyNH0.pk-M00nbxjujJrtHqfkJdckw4UZ13uvEehk-m2mga-i8k807GkY7cVIXnP42z17-0yk-ypy76xdQpuhZumKk0gxW4hevdBzeuo3ijfJ_2Ka-Kr1TowyCWfy3TMDZ8mtykXixj953XSn-AdMsB4p6vJ9iCR4jniwacQWVbspnWYLVEs0c1xjHE2jhSIOEZ6cHYhLGlGd06yPsa1NbwKo2Pd-QZX_N90TvQx4mVsKHcHs8XjugAEoV5kd-jLJpeCPRK_udsrGUTjLJqZtkyqirOQSWBNkbTmfWl6r7MkD4AOt7WvMHMm0jOGBZzSycI5fBdjtndymmwAPull-csw3KKw"; "exceptionNotThrownOnExpiredToken 512")]
307        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.eyJuYmYiOjgyMDA5ODUyNH0.mDc4U7sTlr9zwG_I3NbAg3NiYKEsiTeZtSoOiU6IlorZZlCKNoSMFp4IcM9Y5qdi5FzrhCRnm6FhapYjUW2O_PCGHZzt7SGSJFZsZVUTFCyk76SkEUo0nKSk08FAXWitB9QQeRBOjvP7jenALouVwOCo8ANCJ-sNswbLEPtUL3wH4MzXsXeseKRG-z9FZ-Hgs-hYkN7l8maIpqQaKfZv_psH-hzqDz-W1IgIst_8AYgQfCJnxOF-2O-dpxZaXDUZyGAHxMXjTIj_VxxLeTvF6UrB7FthnYfGW8vxcJW7NLD2swWPB1F8Cj2bPLytqZhqoNzvh_pPj26NjVzwKt2N3g"; "verifyTokenWithNbf 512")]
308        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.eyJuYmYiOjMyODAzOTQwOTh9.ku1gE9gK421mACW3YoTuGVYxT6keosencfgJU09Gvz1Pfv8jM7-P2rlsWFVWMx0kHggkpOtLQwVuPWm9O6eBtXIp9LSqGLAiFIVuP7ziM5OEOn_mkKtNE6hjknFBpBzSiEOhUgsLojfV2NcdmmJazrMSw6Lhd-F1nrn2tGeenf9o2ZCUl3ap-7Ky7dXgpQAUPgnc0irJt4YOj1ZM2444XBmwnI1DySEYIawCPUkzdMNIKJ8RUWzyRR3ZzyQ7wzLmHtwFEEXVpf1Pz9U2jce4yt2hBJ7z8Wt30CZ1xDQXLhklTzvzUYJH08Nz_9mC0cRVBeRjfIuhnNmg93lQk9-xTg"; "exceptionNotThrownNotYetActiveToken 512")]
309        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.eyJhdWQiOiJmb28ifQ.eC74kkOfsvnU3hxWk6zYLuM0myA7PUzHuqM-xi3LBE3U0MaOeRpUrxh3S1ch4qCvZGvxiwZkLGXC1V297Mqar6UkQmdbsofXIumiJX71vY0K99DXLTRdpJsHL-LZlOymrpvQWEGFq7kPsvmSb32e77fi0OMyRT9HssLZzgt1b0REodqsk-udgBfAcxnVexy_PoJ0dxAiGhTV8LFg48v3BNhNg6z2rvuOA3Ai0D_fxYWpjjEegYj7wNf5DpOVU0KzgnpWEHIPZnmtsrMOKeXCqoNJ9THjvb2E0pAkPe2zUu3YCO5jM5pfFIDWB8UQv6gHJJgVcXLisAUCwJj6XZLx7g"; "verifyTokenWithAud 512")]
310        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.eyJhdWQiOlsiZXRjIiwiZm9vIiwiYmxhaCJdfQ.BXYhmNsjcflTEVEkbL69WdlR4ROGb1SBvtLKxUIJI32YcAsw889uvSx2v4fRie0cO98CHDRP6kiFeXFoyMmMr0_Wh2PrbxFuaVrH6pv-F7SuuTxX_1AB8GaTxw6jB-ketvPDqymX-kQmwnulyD3UZLaGYsCpX5B-upoX1ZAptLsIZ08JHtgxV1zcnIwjedu5tTvYI0arT-2FTkX3OrhqgeQlEuBwtFzFcpzx4rQ_DmQfwR9tUXRsZXRZ8JrA5jl-i5occXFx2BmCkTQnDSFs1KOZn4dbSboYX-cKkpp4ZkrU3NlZmXtURSFprsjHPfMLXBWATJN1TNp6cKAEUEreOg"; "verifyTokenWithAudArray 512")]
311        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.eyJhdWQiOlsiZXRjIiwiZm9vIGJhciIsImJsYWgiXX0.XN5FR87nSejq2UheiPflSVEI10yP3erozct147UvezwI4Pqq3y1Cg-1wIFcFanLVRC2bPjJmVPB3R4jxc2DhaJsMx-HtiRtdR8He9f5_jcvhaHZXcQgHbS4OYvqmgbgDz17yVRunCsWDygE-dqXAM-xUUWSjyi7KPJlolK2S_t-ShTkIDjw3VvSlPsDFoUc_5B4EX7wxrmGw4R_loZlxtbI3QA27QwbS14uOKaL8iaPta59PYtieuqbPuK-fGsn1zr1wJeTpNOJn4Ns_MTu6FBEJBgOkd0luk-M2lY6d-5APTQFbwoRH8g50dM3t8dATq52dwDfM5x58MG8Dfa711Q"; "verifyTokenWithAudiencesWithSpaces 512")]
312        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.eyJhdWQiOlsiZXRjIiwiRm9vIiwiYmxhaCJdfQ.a3YqoKiklMqTXPRHkjWEOemyrrbexWE-GB9xs2hbLMb7AINBwgIyoy0keqJe6JnCay1hORVzYTshBKLwua5O089SrppYByQt1TNx9MrMinSS5trvD0DX8Ny9A8tumWU_FE8lWNfYav1Up_0CztgalDiuhAXEeiyNSho2amf0uYSBzZFoD_RNZZ6HnqHU99fihJKaBuS_nIpT4YcM3x7mYflhXl7cwlnmt5WAszKTKepAsF2sccjE6C3bq4tFfh3qVAZm1GngM8j8f7uyRcckqOOE8lRdiSwGAp-vbab6N-wzF_GjFQEMUP0ae0CaUKL8SkBl9lDUzyXx9GtZgLnD2A"; "verifyTokenWithAudiencesCaseSensitive 512")]
313        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.eyJhdWQiOlsiZXRjIiwiYmxhaCJdfQ.LNhx9QVZx5xT-XUPt4R7-pZlGLqqyk40VRqTv-ZoLWazdIlolA8oMC1AraI_ADUWqrVs0YXspsIPmOsS7zq0uB1HRqTm6smjvCVeBsFBDAgtzA1JnPqxR-muPWYO8Sv_JxDv6ZS_r8D7XvkVRWcAcLi7YuCH_cEuo2SINxJ9omzl0xj4MiLAWxAGbfjAH6Syp3_njyR1JmD5U8Bfluh5EM7N2ncA7s2rZEK8F8pcumY0eQP6UzygyfgG8pjw93NREu9lX-R8YzB_d6hsbhRKBhIkj7nZm7AKmxy1QGQhYmDrl1jW_woOnZ3rwfRHr3zbyG6D5uxkIXafhq5bnNw4Jw"; "exceptionNotThrownWhenInvalidAudToken 512")]
314        #[test_case("eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzUxMiJ9.eyJhdWQiOiJmb28iLCJuYmYiOjgyMDA5ODUyNCwibmFtZSI6IkpvaG4gRG9lIiwic2NvcGVzIjpbInJlYWQiLCJ3cml0ZSJdLCJleHAiOjMyODAzOTQwOTh9.eLLMVnOl2B6jvjUEYRp7OvFY7gXJIFRTT1pxIRlRioaAGcoz111b6QjaCFNxTS1OoLdmwYCG0v1ZeVoPI6q2oGP_93PKaDXw53as2Q7fSESun_yZPfNHMpxaVjfY7h4zn0qGMn_Y-bUBFtrjQz7Fhu5NEWtDC-isCKcPbDWKY2K0sOsGsupSoNiWbCHa-2k8mef4OKAWR1R3dVy-WE6ltnknmacpyNaErMKKOSdfxS0isHtic59tUfVcOHkLgEhBTg6iWrzBJ8Ar1q6v6MOUtnecJ_bFOB0xqJx82PFtq91gkAVSlIzsqL43Dhg-7ycSTyCd27PhUnQ3etfYUZ4gnQ"; "checkAllValidations 512")]
315        fn verify_valid_token_512(token: &str) {
316            let validation = rs512_validator().validate(token.to_string());
317
318            assert!(validation.is_ok());
319        }
320    }
321}