1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
use super::*; use crate::crypto::crypto_gcm::*; use crate::prf::*; #[derive(Clone)] pub struct CipherSuiteAes128GcmSha256 { gcm: Option<CryptoGcm>, rsa: bool, } impl CipherSuiteAes128GcmSha256 { const PRF_MAC_LEN: usize = 0; const PRF_KEY_LEN: usize = 16; const PRF_IV_LEN: usize = 4; pub fn new(rsa: bool) -> Self { CipherSuiteAes128GcmSha256 { gcm: None, rsa } } } impl CipherSuite for CipherSuiteAes128GcmSha256 { fn to_string(&self) -> String { if self.rsa { "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256".to_owned() } else { "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256".to_owned() } } fn id(&self) -> CipherSuiteId { if self.rsa { CipherSuiteId::Tls_Ecdhe_Rsa_With_Aes_128_Gcm_Sha256 } else { CipherSuiteId::Tls_Ecdhe_Ecdsa_With_Aes_128_Gcm_Sha256 } } fn certificate_type(&self) -> ClientCertificateType { if self.rsa { ClientCertificateType::RsaSign } else { ClientCertificateType::EcdsaSign } } fn hash_func(&self) -> CipherSuiteHash { CipherSuiteHash::Sha256 } fn is_psk(&self) -> bool { false } fn is_initialized(&self) -> bool { self.gcm.is_some() } fn init( &mut self, master_secret: &[u8], client_random: &[u8], server_random: &[u8], is_client: bool, ) -> Result<(), Error> { let keys = prf_encryption_keys( master_secret, client_random, server_random, CipherSuiteAes128GcmSha256::PRF_MAC_LEN, CipherSuiteAes128GcmSha256::PRF_KEY_LEN, CipherSuiteAes128GcmSha256::PRF_IV_LEN, self.hash_func(), )?; if is_client { self.gcm = Some(CryptoGcm::new( &keys.client_write_key, &keys.client_write_iv, &keys.server_write_key, &keys.server_write_iv, )); } else { self.gcm = Some(CryptoGcm::new( &keys.server_write_key, &keys.server_write_iv, &keys.client_write_key, &keys.client_write_iv, )); } Ok(()) } fn encrypt(&self, pkt_rlh: &RecordLayerHeader, raw: &[u8]) -> Result<Vec<u8>, Error> { if let Some(cg) = &self.gcm { cg.encrypt(pkt_rlh, raw) } else { Err(Error::ErrOthers( "CipherSuite has not been initialized, unable to encrypt".to_owned(), )) } } fn decrypt(&self, input: &[u8]) -> Result<Vec<u8>, Error> { if let Some(cg) = &self.gcm { cg.decrypt(input) } else { Err(Error::ErrOthers( "CipherSuite has not been initialized, unable to decrypt".to_owned(), )) } } }