blob: f8eb39c9c48e35cf4d107b4df7981cd75e2774a1 [file] [log] [blame]
extern crate sgx_crypto_helper;
extern crate sgx_types;
extern crate sgx_ucrypto as crypto;
use crypto::*;
use sgx_crypto_helper::*;
use sgx_types::*;
fn rsa_key() -> sgx_status_t {
let text = String::from("abc");
let text_slice = &text.into_bytes();
let block_size = 256;
let mod_size: i32 = 256;
let exp_size: i32 = 4;
let mut n: Vec<u8> = vec![0_u8; mod_size as usize];
let mut d: Vec<u8> = vec![0_u8; mod_size as usize];
let mut e: Vec<u8> = vec![1, 0, 0, 1];
let mut p: Vec<u8> = vec![0_u8; mod_size as usize / 2];
let mut q: Vec<u8> = vec![0_u8; mod_size as usize / 2];
let mut dmp1: Vec<u8> = vec![0_u8; mod_size as usize / 2];
let mut dmq1: Vec<u8> = vec![0_u8; mod_size as usize / 2];
let mut iqmp: Vec<u8> = vec![0_u8; mod_size as usize / 2];
let result = rsgx_create_rsa_key_pair(
mod_size,
exp_size,
n.as_mut_slice(),
d.as_mut_slice(),
e.as_mut_slice(),
p.as_mut_slice(),
q.as_mut_slice(),
dmp1.as_mut_slice(),
dmq1.as_mut_slice(),
iqmp.as_mut_slice(),
);
match result { Err(x) => {
return x;
}
Ok(()) => {}
}
let privkey = SgxRsaPrivKey::new();
let pubkey = SgxRsaPubKey::new();
let result = pubkey.create(mod_size, exp_size, n.as_slice(), e.as_slice());
match result {
Err(x) => return x,
Ok(()) => {}
};
let result = privkey.create(
mod_size,
exp_size,
e.as_slice(),
p.as_slice(),
q.as_slice(),
dmp1.as_slice(),
dmq1.as_slice(),
iqmp.as_slice(),
);
match result {
Err(x) => return x,
Ok(()) => {}
};
let mut ciphertext: Vec<u8> = vec![0_u8; block_size];
let mut chipertext_len: usize = ciphertext.len();
let ret = pubkey.encrypt_sha256(ciphertext.as_mut_slice(), &mut chipertext_len, text_slice);
match ret {
Err(x) => {
return x;
}
Ok(()) => {
println!("rsa chipertext_len: {:?}", chipertext_len);
}
};
let mut plaintext: Vec<u8> = vec![0_u8; block_size];
let mut plaintext_len: usize = plaintext.len();
let ret = privkey.decrypt_sha256(
plaintext.as_mut_slice(),
&mut plaintext_len,
ciphertext.as_slice(),
);
match ret {
Err(x) => {
return x;
}
Ok(()) => {
println!("rsa plaintext_len: {:?}", plaintext_len);
}
};
if plaintext[..plaintext_len] != text_slice[..] {
return sgx_status_t::SGX_ERROR_UNEXPECTED;
}
println!(
"Recovered plaintext: {}",
String::from_utf8(plaintext).unwrap()
);
sgx_status_t::SGX_SUCCESS
}
fn rsa2048() -> sgx_status_t {
let text = String::from("abc");
let text_slice = &text.into_bytes();
let k = rsa2048::Rsa2048KeyPair::new().unwrap();
println!("Generated k = {:?}", k);
let mut ciphertext = Vec::new();
k.encrypt_buffer(text_slice, &mut ciphertext).unwrap();
let mut decrypted_vec = Vec::new();
k.decrypt_buffer(&ciphertext, &mut decrypted_vec).unwrap();
println!(
"Recovered plaintext: {}",
String::from_utf8(decrypted_vec).unwrap()
);
sgx_status_t::SGX_SUCCESS
}
fn rsa3072() -> sgx_status_t {
let text = String::from("abc");
let text_slice = &text.into_bytes();
let k = rsa3072::Rsa3072KeyPair::new().unwrap();
println!("Generated k = {:?}", k);
let mut ciphertext = Vec::new();
k.encrypt_buffer(text_slice, &mut ciphertext).unwrap();
let mut decrypted_vec = Vec::new();
k.decrypt_buffer(&ciphertext, &mut decrypted_vec).unwrap();
println!(
"Recovered plaintext: {}",
String::from_utf8(decrypted_vec).unwrap()
);
sgx_status_t::SGX_SUCCESS
}
fn main() {
rsa_key();
rsa2048();
rsa3072();
}