diff options
Diffstat (limited to 'openssl/src/sign.rs')
-rw-r--r-- | openssl/src/sign.rs | 589 |
1 files changed, 501 insertions, 88 deletions
diff --git a/openssl/src/sign.rs b/openssl/src/sign.rs index 279f294d..96ec8f75 100644 --- a/openssl/src/sign.rs +++ b/openssl/src/sign.rs @@ -99,11 +99,13 @@ impl<'a> Signer<'a> { let ctx = try!(cvt_p(EVP_MD_CTX_new())); let mut pctx: *mut ffi::EVP_PKEY_CTX = ptr::null_mut(); - let r = ffi::EVP_DigestSignInit(ctx, - &mut pctx, - type_.as_ptr(), - ptr::null_mut(), - pkey.as_ptr()); + let r = ffi::EVP_DigestSignInit( + ctx, + &mut pctx, + type_.as_ptr(), + ptr::null_mut(), + pkey.as_ptr(), + ); if r != 1 { EVP_MD_CTX_free(ctx); return Err(ErrorStack::get()); @@ -129,16 +131,28 @@ impl<'a> Signer<'a> { pub fn update(&mut self, buf: &[u8]) -> Result<(), ErrorStack> { unsafe { - cvt(ffi::EVP_DigestUpdate(self.md_ctx, buf.as_ptr() as *const _, buf.len())).map(|_| ()) + cvt(ffi::EVP_DigestUpdate( + self.md_ctx, + buf.as_ptr() as *const _, + buf.len(), + )).map(|_| ()) } } pub fn finish(&self) -> Result<Vec<u8>, ErrorStack> { unsafe { let mut len = 0; - try!(cvt(ffi::EVP_DigestSignFinal(self.md_ctx, ptr::null_mut(), &mut len))); + try!(cvt(ffi::EVP_DigestSignFinal( + self.md_ctx, + ptr::null_mut(), + &mut len, + ))); let mut buf = vec![0; len]; - try!(cvt(ffi::EVP_DigestSignFinal(self.md_ctx, buf.as_mut_ptr() as *mut _, &mut len))); + try!(cvt(ffi::EVP_DigestSignFinal( + self.md_ctx, + buf.as_mut_ptr() as *mut _, + &mut len, + ))); // The advertised length is not always equal to the real length for things like DSA buf.truncate(len); Ok(buf) @@ -179,11 +193,13 @@ impl<'a> Verifier<'a> { let ctx = try!(cvt_p(EVP_MD_CTX_new())); let mut pctx: *mut ffi::EVP_PKEY_CTX = ptr::null_mut(); - let r = ffi::EVP_DigestVerifyInit(ctx, - &mut pctx, - type_.as_ptr(), - ptr::null_mut(), - pkey.as_ptr()); + let r = ffi::EVP_DigestVerifyInit( + ctx, + &mut pctx, + type_.as_ptr(), + ptr::null_mut(), + pkey.as_ptr(), + ); if r != 1 { EVP_MD_CTX_free(ctx); return Err(ErrorStack::get()); @@ -209,13 +225,18 @@ impl<'a> Verifier<'a> { pub fn update(&mut self, buf: &[u8]) -> Result<(), ErrorStack> { unsafe { - cvt(ffi::EVP_DigestUpdate(self.md_ctx, buf.as_ptr() as *const _, buf.len())).map(|_| ()) + cvt(ffi::EVP_DigestUpdate( + self.md_ctx, + buf.as_ptr() as *const _, + buf.len(), + )).map(|_| ()) } } pub fn finish(&self, signature: &[u8]) -> Result<bool, ErrorStack> { unsafe { - let r = EVP_DigestVerifyFinal(self.md_ctx, signature.as_ptr() as *const _, signature.len()); + let r = + EVP_DigestVerifyFinal(self.md_ctx, signature.as_ptr() as *const _, signature.len()); match r { 1 => Ok(true), 0 => { @@ -244,10 +265,11 @@ use ffi::EVP_DigestVerifyFinal; #[cfg(ossl101)] #[allow(bad_style)] -unsafe fn EVP_DigestVerifyFinal(ctx: *mut ffi::EVP_MD_CTX, - sigret: *const ::libc::c_uchar, - siglen: ::libc::size_t) - -> ::libc::c_int { +unsafe fn EVP_DigestVerifyFinal( + ctx: *mut ffi::EVP_MD_CTX, + sigret: *const ::libc::c_uchar, + siglen: ::libc::size_t, +) -> ::libc::c_int { ffi::EVP_DigestVerifyFinal(ctx, sigret as *mut _, siglen) } @@ -264,29 +286,382 @@ mod test { use dsa::Dsa; use pkey::PKey; - static INPUT: &'static [u8] = - &[101, 121, 74, 104, 98, 71, 99, 105, 79, 105, 74, 83, 85, 122, 73, 49, 78, 105, 74, 57, - 46, 101, 121, 74, 112, 99, 51, 77, 105, 79, 105, 74, 113, 98, 50, 85, 105, 76, 65, 48, - 75, 73, 67, 74, 108, 101, 72, 65, 105, 79, 106, 69, 122, 77, 68, 65, 52, 77, 84, 107, - 122, 79, 68, 65, 115, 68, 81, 111, 103, 73, 109, 104, 48, 100, 72, 65, 54, 76, 121, 57, - 108, 101, 71, 70, 116, 99, 71, 120, 108, 76, 109, 78, 118, 98, 83, 57, 112, 99, 49, 57, - 121, 98, 50, 57, 48, 73, 106, 112, 48, 99, 110, 86, 108, 102, 81]; - - static SIGNATURE: &'static [u8] = - &[112, 46, 33, 137, 67, 232, 143, 209, 30, 181, 216, 45, 191, 120, 69, 243, 65, 6, 174, - 27, 129, 255, 247, 115, 17, 22, 173, 209, 113, 125, 131, 101, 109, 66, 10, 253, 60, 150, - 238, 221, 115, 162, 102, 62, 81, 102, 104, 123, 0, 11, 135, 34, 110, 1, 135, 237, 16, - 115, 249, 69, 229, 130, 173, 252, 239, 22, 216, 90, 121, 142, 232, 198, 109, 219, 61, - 184, 151, 91, 23, 208, 148, 2, 190, 237, 213, 217, 217, 112, 7, 16, 141, 178, 129, 96, - 213, 248, 4, 12, 167, 68, 87, 98, 184, 31, 190, 127, 249, 217, 46, 10, 231, 111, 36, - 242, 91, 51, 187, 230, 244, 74, 230, 30, 177, 4, 10, 203, 32, 4, 77, 62, 249, 18, 142, - 212, 1, 48, 121, 91, 212, 189, 59, 65, 238, 202, 208, 102, 171, 101, 25, 129, 253, 228, - 141, 247, 127, 55, 45, 195, 139, 159, 175, 221, 59, 239, 177, 139, 93, 163, 204, 60, 46, - 176, 47, 158, 58, 65, 214, 18, 202, 173, 21, 145, 18, 115, 160, 95, 35, 185, 232, 56, - 250, 175, 132, 157, 105, 132, 41, 239, 90, 30, 136, 121, 130, 54, 195, 212, 14, 96, 69, - 34, 165, 68, 200, 242, 122, 122, 45, 184, 6, 99, 209, 108, 247, 202, 234, 86, 222, 64, - 92, 178, 33, 90, 69, 178, 194, 85, 102, 181, 90, 193, 167, 72, 160, 112, 223, 200, 163, - 42, 70, 149, 67, 208, 25, 238, 251, 71]; + static INPUT: &'static [u8] = &[ + 101, + 121, + 74, + 104, + 98, + 71, + 99, + 105, + 79, + 105, + 74, + 83, + 85, + 122, + 73, + 49, + 78, + 105, + 74, + 57, + 46, + 101, + 121, + 74, + 112, + 99, + 51, + 77, + 105, + 79, + 105, + 74, + 113, + 98, + 50, + 85, + 105, + 76, + 65, + 48, + 75, + 73, + 67, + 74, + 108, + 101, + 72, + 65, + 105, + 79, + 106, + 69, + 122, + 77, + 68, + 65, + 52, + 77, + 84, + 107, + 122, + 79, + 68, + 65, + 115, + 68, + 81, + 111, + 103, + 73, + 109, + 104, + 48, + 100, + 72, + 65, + 54, + 76, + 121, + 57, + 108, + 101, + 71, + 70, + 116, + 99, + 71, + 120, + 108, + 76, + 109, + 78, + 118, + 98, + 83, + 57, + 112, + 99, + 49, + 57, + 121, + 98, + 50, + 57, + 48, + 73, + 106, + 112, + 48, + 99, + 110, + 86, + 108, + 102, + 81, + ]; + + static SIGNATURE: &'static [u8] = &[ + 112, + 46, + 33, + 137, + 67, + 232, + 143, + 209, + 30, + 181, + 216, + 45, + 191, + 120, + 69, + 243, + 65, + 6, + 174, + 27, + 129, + 255, + 247, + 115, + 17, + 22, + 173, + 209, + 113, + 125, + 131, + 101, + 109, + 66, + 10, + 253, + 60, + 150, + 238, + 221, + 115, + 162, + 102, + 62, + 81, + 102, + 104, + 123, + 0, + 11, + 135, + 34, + 110, + 1, + 135, + 237, + 16, + 115, + 249, + 69, + 229, + 130, + 173, + 252, + 239, + 22, + 216, + 90, + 121, + 142, + 232, + 198, + 109, + 219, + 61, + 184, + 151, + 91, + 23, + 208, + 148, + 2, + 190, + 237, + 213, + 217, + 217, + 112, + 7, + 16, + 141, + 178, + 129, + 96, + 213, + 248, + 4, + 12, + 167, + 68, + 87, + 98, + 184, + 31, + 190, + 127, + 249, + 217, + 46, + 10, + 231, + 111, + 36, + 242, + 91, + 51, + 187, + 230, + 244, + 74, + 230, + 30, + 177, + 4, + 10, + 203, + 32, + 4, + 77, + 62, + 249, + 18, + 142, + 212, + 1, + 48, + 121, + 91, + 212, + 189, + 59, + 65, + 238, + 202, + 208, + 102, + 171, + 101, + 25, + 129, + 253, + 228, + 141, + 247, + 127, + 55, + 45, + 195, + 139, + 159, + 175, + 221, + 59, + 239, + 177, + 139, + 93, + 163, + 204, + 60, + 46, + 176, + 47, + 158, + 58, + 65, + 214, + 18, + 202, + 173, + 21, + 145, + 18, + 115, + 160, + 95, + 35, + 185, + 232, + 56, + 250, + 175, + 132, + 157, + 105, + 132, + 41, + 239, + 90, + 30, + 136, + 121, + 130, + 54, + 195, + 212, + 14, + 96, + 69, + 34, + 165, + 68, + 200, + 242, + 122, + 122, + 45, + 184, + 6, + 99, + 209, + 108, + 247, + 202, + 234, + 86, + 222, + 64, + 92, + 178, + 33, + 90, + 69, + 178, + 194, + 85, + 102, + 181, + 90, + 193, + 167, + 72, + 160, + 112, + 223, + 200, + 163, + 42, + 70, + 149, + 67, + 208, + 25, + 238, + 251, + 71, + ]; #[test] fn rsa_sign() { @@ -296,7 +671,10 @@ mod test { let mut signer = Signer::new(MessageDigest::sha256(), &pkey).unwrap(); assert_eq!(signer.pkey_ctx_mut().rsa_padding().unwrap(), PKCS1_PADDING); - signer.pkey_ctx_mut().set_rsa_padding(PKCS1_PADDING).unwrap(); + signer + .pkey_ctx_mut() + .set_rsa_padding(PKCS1_PADDING) + .unwrap(); signer.update(INPUT).unwrap(); let result = signer.finish().unwrap(); @@ -310,7 +688,10 @@ mod test { let pkey = PKey::from_rsa(private_key).unwrap(); let mut verifier = Verifier::new(MessageDigest::sha256(), &pkey).unwrap(); - assert_eq!(verifier.pkey_ctx_mut().rsa_padding().unwrap(), PKCS1_PADDING); + assert_eq!( + verifier.pkey_ctx_mut().rsa_padding().unwrap(), + PKCS1_PADDING + ); verifier.update(INPUT).unwrap(); assert!(verifier.finish(SIGNATURE).unwrap()); } @@ -390,29 +771,45 @@ mod test { fn hmac_md5() { // test vectors from RFC 2202 let tests: [(Vec<u8>, Vec<u8>, Vec<u8>); 7] = - [(iter::repeat(0x0b_u8).take(16).collect(), - b"Hi There".to_vec(), - Vec::from_hex("9294727a3638bb1c13f48ef8158bfc9d").unwrap()), - (b"Jefe".to_vec(), - b"what do ya want for nothing?".to_vec(), - Vec::from_hex("750c783e6ab0b503eaa86e310a5db738").unwrap()), - (iter::repeat(0xaa_u8).take(16).collect(), - iter::repeat(0xdd_u8).take(50).collect(), - Vec::from_hex("56be34521d144c88dbb8c733f0e8b3f6").unwrap()), - (Vec::from_hex("0102030405060708090a0b0c0d0e0f10111213141516171819").unwrap(), - iter::repeat(0xcd_u8).take(50).collect(), - Vec::from_hex("697eaf0aca3a3aea3a75164746ffaa79").unwrap()), - (iter::repeat(0x0c_u8).take(16).collect(), - b"Test With Truncation".to_vec(), - Vec::from_hex("56461ef2342edc00f9bab995690efd4c").unwrap()), - (iter::repeat(0xaa_u8).take(80).collect(), - b"Test Using Larger Than Block-Size Key - Hash Key First".to_vec(), - Vec::from_hex("6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd").unwrap()), - (iter::repeat(0xaa_u8).take(80).collect(), - b"Test Using Larger Than Block-Size Key \ + [ + ( + iter::repeat(0x0b_u8).take(16).collect(), + b"Hi There".to_vec(), + Vec::from_hex("9294727a3638bb1c13f48ef8158bfc9d").unwrap(), + ), + ( + b"Jefe".to_vec(), + b"what do ya want for nothing?".to_vec(), + Vec::from_hex("750c783e6ab0b503eaa86e310a5db738").unwrap(), + ), + ( + iter::repeat(0xaa_u8).take(16).collect(), + iter::repeat(0xdd_u8).take(50).collect(), + Vec::from_hex("56be34521d144c88dbb8c733f0e8b3f6").unwrap(), + ), + ( + Vec::from_hex("0102030405060708090a0b0c0d0e0f10111213141516171819").unwrap(), + iter::repeat(0xcd_u8).take(50).collect(), + Vec::from_hex("697eaf0aca3a3aea3a75164746ffaa79").unwrap(), + ), + ( + iter::repeat(0x0c_u8).take(16).collect(), + b"Test With Truncation".to_vec(), + Vec::from_hex("56461ef2342edc00f9bab995690efd4c").unwrap(), + ), + ( + iter::repeat(0xaa_u8).take(80).collect(), + b"Test Using Larger Than Block-Size Key - Hash Key First".to_vec(), + Vec::from_hex("6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd").unwrap(), + ), + ( + iter::repeat(0xaa_u8).take(80).collect(), + b"Test Using Larger Than Block-Size Key \ and Larger Than One Block-Size Data" - .to_vec(), - Vec::from_hex("6f630fad67cda0ee1fb1f562db3aa53e").unwrap())]; + .to_vec(), + Vec::from_hex("6f630fad67cda0ee1fb1f562db3aa53e").unwrap(), + ), + ]; test_hmac(MessageDigest::md5(), &tests); } @@ -421,29 +818,45 @@ mod test { fn hmac_sha1() { // test vectors from RFC 2202 let tests: [(Vec<u8>, Vec<u8>, Vec<u8>); 7] = - [(iter::repeat(0x0b_u8).take(20).collect(), - b"Hi There".to_vec(), - Vec::from_hex("b617318655057264e28bc0b6fb378c8ef146be00").unwrap()), - (b"Jefe".to_vec(), - b"what do ya want for nothing?".to_vec(), - Vec::from_hex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79").unwrap()), - (iter::repeat(0xaa_u8).take(20).collect(), - iter::repeat(0xdd_u8).take(50).collect(), - Vec::from_hex("125d7342b9ac11cd91a39af48aa17b4f63f175d3").unwrap()), - (Vec::from_hex("0102030405060708090a0b0c0d0e0f10111213141516171819").unwrap(), - iter::repeat(0xcd_u8).take(50).collect(), - Vec::from_hex("4c9007f4026250c6bc8414f9bf50c86c2d7235da").unwrap()), - (iter::repeat(0x0c_u8).take(20).collect(), - b"Test With Truncation".to_vec(), - Vec::from_hex("4c1a03424b55e07fe7f27be1d58bb9324a9a5a04").unwrap()), - (iter::repeat(0xaa_u8).take(80).collect(), - b"Test Using Larger Than Block-Size Key - Hash Key First".to_vec(), - Vec::from_hex("aa4ae5e15272d00e95705637ce8a3b55ed402112").unwrap()), - (iter::repeat(0xaa_u8).take(80).collect(), - b"Test Using Larger Than Block-Size Key \ + [ + ( + iter::repeat(0x0b_u8).take(20).collect(), + b"Hi There".to_vec(), + Vec::from_hex("b617318655057264e28bc0b6fb378c8ef146be00").unwrap(), + ), + ( + b"Jefe".to_vec(), + b"what do ya want for nothing?".to_vec(), + Vec::from_hex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79").unwrap(), + ), + ( + iter::repeat(0xaa_u8).take(20).collect(), + iter::repeat(0xdd_u8).take(50).collect(), + Vec::from_hex("125d7342b9ac11cd91a39af48aa17b4f63f175d3").unwrap(), + ), + ( + Vec::from_hex("0102030405060708090a0b0c0d0e0f10111213141516171819").unwrap(), + iter::repeat(0xcd_u8).take(50).collect(), + Vec::from_hex("4c9007f4026250c6bc8414f9bf50c86c2d7235da").unwrap(), + ), + ( + iter::repeat(0x0c_u8).take(20).collect(), + b"Test With Truncation".to_vec(), + Vec::from_hex("4c1a03424b55e07fe7f27be1d58bb9324a9a5a04").unwrap(), + ), + ( + iter::repeat(0xaa_u8).take(80).collect(), + b"Test Using Larger Than Block-Size Key - Hash Key First".to_vec(), + Vec::from_hex("aa4ae5e15272d00e95705637ce8a3b55ed402112").unwrap(), + ), + ( + iter::repeat(0xaa_u8).take(80).collect(), + b"Test Using Larger Than Block-Size Key \ and Larger Than One Block-Size Data" - .to_vec(), - Vec::from_hex("e8e99d0f45237d786d6bbaa7965c7808bbff1a91").unwrap())]; + .to_vec(), + Vec::from_hex("e8e99d0f45237d786d6bbaa7965c7808bbff1a91").unwrap(), + ), + ]; test_hmac(MessageDigest::sha1(), &tests); } |