key: move RSA-encryption to KeyConfig
since that is what gets encrypted, and not a CryptConfig. Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
		
				
					committed by
					
						 Dietmar Maurer
						Dietmar Maurer
					
				
			
			
				
	
			
			
			
						parent
						
							48fbbfeb7e
						
					
				
				
					commit
					8acfd15d6e
				
			| @ -11,7 +11,7 @@ use std::fmt; | |||||||
| use std::fmt::Display; | use std::fmt::Display; | ||||||
| use std::io::Write; | use std::io::Write; | ||||||
|  |  | ||||||
| use anyhow::{bail, Error}; | use anyhow::{Error}; | ||||||
| use openssl::hash::MessageDigest; | use openssl::hash::MessageDigest; | ||||||
| use openssl::pkcs5::pbkdf2_hmac; | use openssl::pkcs5::pbkdf2_hmac; | ||||||
| use openssl::symm::{decrypt_aead, Cipher, Crypter, Mode}; | use openssl::symm::{decrypt_aead, Cipher, Crypter, Mode}; | ||||||
| @ -248,28 +248,4 @@ impl CryptConfig { | |||||||
|  |  | ||||||
|         Ok(decr_data) |         Ok(decr_data) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn generate_rsa_encoded_key( |  | ||||||
|         &self, |  | ||||||
|         rsa: openssl::rsa::Rsa<openssl::pkey::Public>, |  | ||||||
|         created: i64, |  | ||||||
|     ) -> Result<Vec<u8>, Error> { |  | ||||||
|  |  | ||||||
|         let modified = proxmox::tools::time::epoch_i64(); |  | ||||||
|         let key_config = super::KeyConfig { |  | ||||||
|             kdf: None, |  | ||||||
|             created, |  | ||||||
|             modified, |  | ||||||
|             data: self.enc_key.to_vec(), |  | ||||||
|             fingerprint: Some(self.fingerprint()), |  | ||||||
|         }; |  | ||||||
|         let data = serde_json::to_string(&key_config)?.as_bytes().to_vec(); |  | ||||||
|  |  | ||||||
|         let mut buffer = vec![0u8; rsa.size() as usize]; |  | ||||||
|         let len = rsa.public_encrypt(&data, &mut buffer, openssl::rsa::Padding::PKCS1)?; |  | ||||||
|         if len != buffer.len() { |  | ||||||
|             bail!("got unexpected length from rsa.public_encrypt()."); |  | ||||||
|         } |  | ||||||
|         Ok(buffer) |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -245,3 +245,17 @@ pub fn decrypt_key( | |||||||
|  |  | ||||||
|     Ok((result, created, fingerprint)) |     Ok((result, created, fingerprint)) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | pub fn rsa_encrypt_key_config( | ||||||
|  |     rsa: openssl::rsa::Rsa<openssl::pkey::Public>, | ||||||
|  |     key: &KeyConfig, | ||||||
|  | ) -> Result<Vec<u8>, Error> { | ||||||
|  |     let data = serde_json::to_string(key)?.as_bytes().to_vec(); | ||||||
|  |  | ||||||
|  |     let mut buffer = vec![0u8; rsa.size() as usize]; | ||||||
|  |     let len = rsa.public_encrypt(&data, &mut buffer, openssl::rsa::Padding::PKCS1)?; | ||||||
|  |     if len != buffer.len() { | ||||||
|  |         bail!("got unexpected length from rsa.public_encrypt()."); | ||||||
|  |     } | ||||||
|  |     Ok(buffer) | ||||||
|  | } | ||||||
|  | |||||||
| @ -40,6 +40,7 @@ use proxmox_backup::pxar::catalog::*; | |||||||
| use proxmox_backup::backup::{ | use proxmox_backup::backup::{ | ||||||
|     archive_type, |     archive_type, | ||||||
|     decrypt_key, |     decrypt_key, | ||||||
|  |     rsa_encrypt_key_config, | ||||||
|     verify_chunk_size, |     verify_chunk_size, | ||||||
|     ArchiveType, |     ArchiveType, | ||||||
|     AsyncReadChunk, |     AsyncReadChunk, | ||||||
| @ -57,6 +58,7 @@ use proxmox_backup::backup::{ | |||||||
|     ENCRYPTED_KEY_BLOB_NAME, |     ENCRYPTED_KEY_BLOB_NAME, | ||||||
|     FixedChunkStream, |     FixedChunkStream, | ||||||
|     FixedIndexReader, |     FixedIndexReader, | ||||||
|  |     KeyConfig, | ||||||
|     IndexFile, |     IndexFile, | ||||||
|     MANIFEST_BLOB_NAME, |     MANIFEST_BLOB_NAME, | ||||||
|     Shell, |     Shell, | ||||||
| @ -914,13 +916,20 @@ async fn create_backup( | |||||||
|             let (key, created, fingerprint) = decrypt_key(&key, &key::get_encryption_key_password)?; |             let (key, created, fingerprint) = decrypt_key(&key, &key::get_encryption_key_password)?; | ||||||
|             println!("Encryption key fingerprint: {}", fingerprint); |             println!("Encryption key fingerprint: {}", fingerprint); | ||||||
|  |  | ||||||
|             let crypt_config = CryptConfig::new(key)?; |             let crypt_config = CryptConfig::new(key.clone())?; | ||||||
|  |  | ||||||
|             match key::find_master_pubkey()? { |             match key::find_master_pubkey()? { | ||||||
|                 Some(ref path) if path.exists() => { |                 Some(ref path) if path.exists() => { | ||||||
|                     let pem_data = file_get_contents(path)?; |                     let pem_data = file_get_contents(path)?; | ||||||
|                     let rsa = openssl::rsa::Rsa::public_key_from_pem(&pem_data)?; |                     let rsa = openssl::rsa::Rsa::public_key_from_pem(&pem_data)?; | ||||||
|                     let enc_key = crypt_config.generate_rsa_encoded_key(rsa, created)?; |                     let key_config = KeyConfig { | ||||||
|  |                         kdf: None, | ||||||
|  |                         created, | ||||||
|  |                         modified: proxmox::tools::time::epoch_i64(), | ||||||
|  |                         data: key.to_vec(), | ||||||
|  |                         fingerprint: Some(fingerprint), | ||||||
|  |                     }; | ||||||
|  |                     let enc_key = rsa_encrypt_key_config(rsa, &key_config)?; | ||||||
|                     println!("Master key '{:?}'", path); |                     println!("Master key '{:?}'", path); | ||||||
|  |  | ||||||
|                     (Some(Arc::new(crypt_config)), Some(enc_key)) |                     (Some(Arc::new(crypt_config)), Some(enc_key)) | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user