ring-native 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/Gemfile +3 -0
- data/README.md +22 -0
- data/Rakefile +1 -0
- data/ext/ring/extconf.rb +29 -0
- data/lib/ring/native.rb +8 -0
- data/lib/ring/native/version.rb +5 -0
- data/ring-native.gemspec +25 -0
- data/vendor/ring/BUILDING.md +40 -0
- data/vendor/ring/Cargo.toml +43 -0
- data/vendor/ring/LICENSE +185 -0
- data/vendor/ring/Makefile +35 -0
- data/vendor/ring/PORTING.md +163 -0
- data/vendor/ring/README.md +113 -0
- data/vendor/ring/STYLE.md +197 -0
- data/vendor/ring/appveyor.yml +27 -0
- data/vendor/ring/build.rs +108 -0
- data/vendor/ring/crypto/aes/aes.c +1142 -0
- data/vendor/ring/crypto/aes/aes_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/aes/aes_test.cc +93 -0
- data/vendor/ring/crypto/aes/asm/aes-586.pl +2368 -0
- data/vendor/ring/crypto/aes/asm/aes-armv4.pl +1249 -0
- data/vendor/ring/crypto/aes/asm/aes-x86_64.pl +2246 -0
- data/vendor/ring/crypto/aes/asm/aesni-x86.pl +1318 -0
- data/vendor/ring/crypto/aes/asm/aesni-x86_64.pl +2084 -0
- data/vendor/ring/crypto/aes/asm/aesv8-armx.pl +675 -0
- data/vendor/ring/crypto/aes/asm/bsaes-armv7.pl +1364 -0
- data/vendor/ring/crypto/aes/asm/bsaes-x86_64.pl +1565 -0
- data/vendor/ring/crypto/aes/asm/vpaes-x86.pl +841 -0
- data/vendor/ring/crypto/aes/asm/vpaes-x86_64.pl +1116 -0
- data/vendor/ring/crypto/aes/internal.h +87 -0
- data/vendor/ring/crypto/aes/mode_wrappers.c +61 -0
- data/vendor/ring/crypto/bn/add.c +394 -0
- data/vendor/ring/crypto/bn/asm/armv4-mont.pl +694 -0
- data/vendor/ring/crypto/bn/asm/armv8-mont.pl +1503 -0
- data/vendor/ring/crypto/bn/asm/bn-586.pl +774 -0
- data/vendor/ring/crypto/bn/asm/co-586.pl +287 -0
- data/vendor/ring/crypto/bn/asm/rsaz-avx2.pl +1882 -0
- data/vendor/ring/crypto/bn/asm/x86-mont.pl +592 -0
- data/vendor/ring/crypto/bn/asm/x86_64-gcc.c +599 -0
- data/vendor/ring/crypto/bn/asm/x86_64-mont.pl +1393 -0
- data/vendor/ring/crypto/bn/asm/x86_64-mont5.pl +3507 -0
- data/vendor/ring/crypto/bn/bn.c +352 -0
- data/vendor/ring/crypto/bn/bn_asn1.c +74 -0
- data/vendor/ring/crypto/bn/bn_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/bn/bn_test.cc +1696 -0
- data/vendor/ring/crypto/bn/cmp.c +200 -0
- data/vendor/ring/crypto/bn/convert.c +433 -0
- data/vendor/ring/crypto/bn/ctx.c +311 -0
- data/vendor/ring/crypto/bn/div.c +594 -0
- data/vendor/ring/crypto/bn/exponentiation.c +1335 -0
- data/vendor/ring/crypto/bn/gcd.c +711 -0
- data/vendor/ring/crypto/bn/generic.c +1019 -0
- data/vendor/ring/crypto/bn/internal.h +316 -0
- data/vendor/ring/crypto/bn/montgomery.c +516 -0
- data/vendor/ring/crypto/bn/mul.c +888 -0
- data/vendor/ring/crypto/bn/prime.c +829 -0
- data/vendor/ring/crypto/bn/random.c +334 -0
- data/vendor/ring/crypto/bn/rsaz_exp.c +262 -0
- data/vendor/ring/crypto/bn/rsaz_exp.h +53 -0
- data/vendor/ring/crypto/bn/shift.c +276 -0
- data/vendor/ring/crypto/bytestring/bytestring_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/bytestring/bytestring_test.cc +421 -0
- data/vendor/ring/crypto/bytestring/cbb.c +399 -0
- data/vendor/ring/crypto/bytestring/cbs.c +227 -0
- data/vendor/ring/crypto/bytestring/internal.h +46 -0
- data/vendor/ring/crypto/chacha/chacha_generic.c +140 -0
- data/vendor/ring/crypto/chacha/chacha_vec.c +323 -0
- data/vendor/ring/crypto/chacha/chacha_vec_arm.S +1447 -0
- data/vendor/ring/crypto/chacha/chacha_vec_arm_generate.go +153 -0
- data/vendor/ring/crypto/cipher/cipher_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/cipher/e_aes.c +390 -0
- data/vendor/ring/crypto/cipher/e_chacha20poly1305.c +208 -0
- data/vendor/ring/crypto/cipher/internal.h +173 -0
- data/vendor/ring/crypto/cipher/test/aes_128_gcm_tests.txt +543 -0
- data/vendor/ring/crypto/cipher/test/aes_128_key_wrap_tests.txt +9 -0
- data/vendor/ring/crypto/cipher/test/aes_256_gcm_tests.txt +475 -0
- data/vendor/ring/crypto/cipher/test/aes_256_key_wrap_tests.txt +23 -0
- data/vendor/ring/crypto/cipher/test/chacha20_poly1305_old_tests.txt +422 -0
- data/vendor/ring/crypto/cipher/test/chacha20_poly1305_tests.txt +484 -0
- data/vendor/ring/crypto/cipher/test/cipher_test.txt +100 -0
- data/vendor/ring/crypto/constant_time_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/constant_time_test.c +304 -0
- data/vendor/ring/crypto/cpu-arm-asm.S +32 -0
- data/vendor/ring/crypto/cpu-arm.c +199 -0
- data/vendor/ring/crypto/cpu-intel.c +261 -0
- data/vendor/ring/crypto/crypto.c +151 -0
- data/vendor/ring/crypto/curve25519/asm/x25519-arm.S +2118 -0
- data/vendor/ring/crypto/curve25519/curve25519.c +4888 -0
- data/vendor/ring/crypto/curve25519/x25519_test.cc +128 -0
- data/vendor/ring/crypto/digest/md32_common.h +181 -0
- data/vendor/ring/crypto/ec/asm/p256-x86_64-asm.pl +2725 -0
- data/vendor/ring/crypto/ec/ec.c +193 -0
- data/vendor/ring/crypto/ec/ec_curves.c +61 -0
- data/vendor/ring/crypto/ec/ec_key.c +228 -0
- data/vendor/ring/crypto/ec/ec_montgomery.c +114 -0
- data/vendor/ring/crypto/ec/example_mul.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/ec/internal.h +243 -0
- data/vendor/ring/crypto/ec/oct.c +253 -0
- data/vendor/ring/crypto/ec/p256-64.c +1794 -0
- data/vendor/ring/crypto/ec/p256-x86_64-table.h +9548 -0
- data/vendor/ring/crypto/ec/p256-x86_64.c +509 -0
- data/vendor/ring/crypto/ec/simple.c +1007 -0
- data/vendor/ring/crypto/ec/util-64.c +183 -0
- data/vendor/ring/crypto/ec/wnaf.c +508 -0
- data/vendor/ring/crypto/ecdh/ecdh.c +155 -0
- data/vendor/ring/crypto/ecdsa/ecdsa.c +304 -0
- data/vendor/ring/crypto/ecdsa/ecdsa_asn1.c +193 -0
- data/vendor/ring/crypto/ecdsa/ecdsa_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/ecdsa/ecdsa_test.cc +327 -0
- data/vendor/ring/crypto/header_removed.h +17 -0
- data/vendor/ring/crypto/internal.h +495 -0
- data/vendor/ring/crypto/libring.Windows.vcxproj +101 -0
- data/vendor/ring/crypto/mem.c +98 -0
- data/vendor/ring/crypto/modes/asm/aesni-gcm-x86_64.pl +1045 -0
- data/vendor/ring/crypto/modes/asm/ghash-armv4.pl +517 -0
- data/vendor/ring/crypto/modes/asm/ghash-x86.pl +1393 -0
- data/vendor/ring/crypto/modes/asm/ghash-x86_64.pl +1741 -0
- data/vendor/ring/crypto/modes/asm/ghashv8-armx.pl +422 -0
- data/vendor/ring/crypto/modes/ctr.c +226 -0
- data/vendor/ring/crypto/modes/gcm.c +1206 -0
- data/vendor/ring/crypto/modes/gcm_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/modes/gcm_test.c +348 -0
- data/vendor/ring/crypto/modes/internal.h +299 -0
- data/vendor/ring/crypto/perlasm/arm-xlate.pl +170 -0
- data/vendor/ring/crypto/perlasm/readme +100 -0
- data/vendor/ring/crypto/perlasm/x86_64-xlate.pl +1164 -0
- data/vendor/ring/crypto/perlasm/x86asm.pl +292 -0
- data/vendor/ring/crypto/perlasm/x86gas.pl +263 -0
- data/vendor/ring/crypto/perlasm/x86masm.pl +200 -0
- data/vendor/ring/crypto/perlasm/x86nasm.pl +187 -0
- data/vendor/ring/crypto/poly1305/poly1305.c +331 -0
- data/vendor/ring/crypto/poly1305/poly1305_arm.c +301 -0
- data/vendor/ring/crypto/poly1305/poly1305_arm_asm.S +2015 -0
- data/vendor/ring/crypto/poly1305/poly1305_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/poly1305/poly1305_test.cc +80 -0
- data/vendor/ring/crypto/poly1305/poly1305_test.txt +52 -0
- data/vendor/ring/crypto/poly1305/poly1305_vec.c +892 -0
- data/vendor/ring/crypto/rand/asm/rdrand-x86_64.pl +75 -0
- data/vendor/ring/crypto/rand/internal.h +32 -0
- data/vendor/ring/crypto/rand/rand.c +189 -0
- data/vendor/ring/crypto/rand/urandom.c +219 -0
- data/vendor/ring/crypto/rand/windows.c +56 -0
- data/vendor/ring/crypto/refcount_c11.c +66 -0
- data/vendor/ring/crypto/refcount_lock.c +53 -0
- data/vendor/ring/crypto/refcount_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/refcount_test.c +58 -0
- data/vendor/ring/crypto/rsa/blinding.c +462 -0
- data/vendor/ring/crypto/rsa/internal.h +108 -0
- data/vendor/ring/crypto/rsa/padding.c +300 -0
- data/vendor/ring/crypto/rsa/rsa.c +450 -0
- data/vendor/ring/crypto/rsa/rsa_asn1.c +261 -0
- data/vendor/ring/crypto/rsa/rsa_impl.c +944 -0
- data/vendor/ring/crypto/rsa/rsa_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/rsa/rsa_test.cc +437 -0
- data/vendor/ring/crypto/sha/asm/sha-armv8.pl +436 -0
- data/vendor/ring/crypto/sha/asm/sha-x86_64.pl +2390 -0
- data/vendor/ring/crypto/sha/asm/sha256-586.pl +1275 -0
- data/vendor/ring/crypto/sha/asm/sha256-armv4.pl +735 -0
- data/vendor/ring/crypto/sha/asm/sha256-armv8.pl +14 -0
- data/vendor/ring/crypto/sha/asm/sha256-x86_64.pl +14 -0
- data/vendor/ring/crypto/sha/asm/sha512-586.pl +911 -0
- data/vendor/ring/crypto/sha/asm/sha512-armv4.pl +666 -0
- data/vendor/ring/crypto/sha/asm/sha512-armv8.pl +14 -0
- data/vendor/ring/crypto/sha/asm/sha512-x86_64.pl +14 -0
- data/vendor/ring/crypto/sha/sha1.c +271 -0
- data/vendor/ring/crypto/sha/sha256.c +204 -0
- data/vendor/ring/crypto/sha/sha512.c +355 -0
- data/vendor/ring/crypto/test/file_test.cc +326 -0
- data/vendor/ring/crypto/test/file_test.h +181 -0
- data/vendor/ring/crypto/test/malloc.cc +150 -0
- data/vendor/ring/crypto/test/scoped_types.h +95 -0
- data/vendor/ring/crypto/test/test.Windows.vcxproj +35 -0
- data/vendor/ring/crypto/test/test_util.cc +46 -0
- data/vendor/ring/crypto/test/test_util.h +41 -0
- data/vendor/ring/crypto/thread_none.c +55 -0
- data/vendor/ring/crypto/thread_pthread.c +165 -0
- data/vendor/ring/crypto/thread_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/thread_test.c +200 -0
- data/vendor/ring/crypto/thread_win.c +282 -0
- data/vendor/ring/examples/checkdigest.rs +103 -0
- data/vendor/ring/include/openssl/aes.h +121 -0
- data/vendor/ring/include/openssl/arm_arch.h +129 -0
- data/vendor/ring/include/openssl/base.h +156 -0
- data/vendor/ring/include/openssl/bn.h +794 -0
- data/vendor/ring/include/openssl/buffer.h +18 -0
- data/vendor/ring/include/openssl/bytestring.h +235 -0
- data/vendor/ring/include/openssl/chacha.h +37 -0
- data/vendor/ring/include/openssl/cmac.h +76 -0
- data/vendor/ring/include/openssl/cpu.h +184 -0
- data/vendor/ring/include/openssl/crypto.h +43 -0
- data/vendor/ring/include/openssl/curve25519.h +88 -0
- data/vendor/ring/include/openssl/ec.h +225 -0
- data/vendor/ring/include/openssl/ec_key.h +129 -0
- data/vendor/ring/include/openssl/ecdh.h +110 -0
- data/vendor/ring/include/openssl/ecdsa.h +156 -0
- data/vendor/ring/include/openssl/err.h +201 -0
- data/vendor/ring/include/openssl/mem.h +101 -0
- data/vendor/ring/include/openssl/obj_mac.h +71 -0
- data/vendor/ring/include/openssl/opensslfeatures.h +68 -0
- data/vendor/ring/include/openssl/opensslv.h +18 -0
- data/vendor/ring/include/openssl/ossl_typ.h +18 -0
- data/vendor/ring/include/openssl/poly1305.h +51 -0
- data/vendor/ring/include/openssl/rand.h +70 -0
- data/vendor/ring/include/openssl/rsa.h +399 -0
- data/vendor/ring/include/openssl/thread.h +133 -0
- data/vendor/ring/include/openssl/type_check.h +71 -0
- data/vendor/ring/mk/Common.props +63 -0
- data/vendor/ring/mk/Windows.props +42 -0
- data/vendor/ring/mk/WindowsTest.props +18 -0
- data/vendor/ring/mk/appveyor.bat +62 -0
- data/vendor/ring/mk/bottom_of_makefile.mk +54 -0
- data/vendor/ring/mk/ring.mk +266 -0
- data/vendor/ring/mk/top_of_makefile.mk +214 -0
- data/vendor/ring/mk/travis.sh +40 -0
- data/vendor/ring/mk/update-travis-yml.py +229 -0
- data/vendor/ring/ring.sln +153 -0
- data/vendor/ring/src/aead.rs +682 -0
- data/vendor/ring/src/agreement.rs +248 -0
- data/vendor/ring/src/c.rs +129 -0
- data/vendor/ring/src/constant_time.rs +37 -0
- data/vendor/ring/src/der.rs +96 -0
- data/vendor/ring/src/digest.rs +690 -0
- data/vendor/ring/src/digest_tests.txt +57 -0
- data/vendor/ring/src/ecc.rs +28 -0
- data/vendor/ring/src/ecc_build.rs +279 -0
- data/vendor/ring/src/ecc_curves.rs +117 -0
- data/vendor/ring/src/ed25519_tests.txt +2579 -0
- data/vendor/ring/src/exe_tests.rs +46 -0
- data/vendor/ring/src/ffi.rs +29 -0
- data/vendor/ring/src/file_test.rs +187 -0
- data/vendor/ring/src/hkdf.rs +153 -0
- data/vendor/ring/src/hkdf_tests.txt +59 -0
- data/vendor/ring/src/hmac.rs +414 -0
- data/vendor/ring/src/hmac_tests.txt +97 -0
- data/vendor/ring/src/input.rs +312 -0
- data/vendor/ring/src/lib.rs +41 -0
- data/vendor/ring/src/pbkdf2.rs +265 -0
- data/vendor/ring/src/pbkdf2_tests.txt +113 -0
- data/vendor/ring/src/polyfill.rs +57 -0
- data/vendor/ring/src/rand.rs +28 -0
- data/vendor/ring/src/signature.rs +314 -0
- data/vendor/ring/third-party/NIST/README.md +9 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA1LongMsg.rsp +263 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA1Monte.rsp +309 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA1ShortMsg.rsp +267 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA224LongMsg.rsp +263 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA224Monte.rsp +309 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA224ShortMsg.rsp +267 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA256LongMsg.rsp +263 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA256Monte.rsp +309 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA256ShortMsg.rsp +267 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA384LongMsg.rsp +519 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA384Monte.rsp +309 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA384ShortMsg.rsp +523 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA512LongMsg.rsp +519 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA512Monte.rsp +309 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA512ShortMsg.rsp +523 -0
- data/vendor/ring/third-party/NIST/sha256sums.txt +1 -0
- metadata +333 -0
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
// Copyright 2015 Brian Smith.
|
|
2
|
+
//
|
|
3
|
+
// Permission to use, copy, modify, and/or distribute this software for any
|
|
4
|
+
// purpose with or without fee is hereby granted, provided that the above
|
|
5
|
+
// copyright notice and this permission notice appear in all copies.
|
|
6
|
+
//
|
|
7
|
+
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
|
|
8
|
+
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
9
|
+
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
|
|
10
|
+
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
11
|
+
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
12
|
+
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
13
|
+
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
14
|
+
|
|
15
|
+
//! HMAC is specified in [RFC 2104](https://tools.ietf.org/html/rfc2104).
|
|
16
|
+
//!
|
|
17
|
+
//! After a `SigningKey` or `VerificationKey` is constructed, it can be used
|
|
18
|
+
//! for multiple signing or verification operations. Separating the
|
|
19
|
+
//! construction of the key from the rest of the HMAC operation allows the
|
|
20
|
+
//! per-key precomputation to be done only once, instead of it being done in
|
|
21
|
+
//! every HMAC operation.
|
|
22
|
+
//!
|
|
23
|
+
//! Frequently all the data to be signed in a message is available in a single
|
|
24
|
+
//! contiguous piece. In that case, the module-level `sign` function can be
|
|
25
|
+
//! used. Otherwise, if the input is in multiple parts, `SigningContext` should
|
|
26
|
+
//! be used.
|
|
27
|
+
//!
|
|
28
|
+
//! # Use Case: Multi-party Communication
|
|
29
|
+
//!
|
|
30
|
+
//! Examples: TLS, SSH, and IPSEC record/packet authentication.
|
|
31
|
+
//!
|
|
32
|
+
//! The key that is used to sign messages to send to other parties should be a
|
|
33
|
+
//! `SigningKey`; `SigningContext` or `sign` should be used for the signing.
|
|
34
|
+
//! Each key that is used to authenticate messages received from peers should
|
|
35
|
+
//! be a `VerificationKey`; `verify` should be used for the authentication. All
|
|
36
|
+
//! of the keys should have distinct, independent, values.
|
|
37
|
+
//!
|
|
38
|
+
//! # Use Case: One-party Anti-tampering Protection
|
|
39
|
+
//!
|
|
40
|
+
//! Examples: Signed cookies, stateless CSRF protection.
|
|
41
|
+
//!
|
|
42
|
+
//! The key that is used to sign the data should be a `SigningKey`;
|
|
43
|
+
//! `SigningContext` or `sign` should be used for the signing. Use
|
|
44
|
+
//! `verify_with_own_key` to verify the signature using the signing key; this
|
|
45
|
+
//! is equivalent to, but more efficient than, constructing a `VerificationKey`
|
|
46
|
+
//! with the same value as the signing key and then calling `verify`.
|
|
47
|
+
//!
|
|
48
|
+
//! # Use Case: Key Derivation and Password Hashing
|
|
49
|
+
//!
|
|
50
|
+
//! Examples: HKDF, PBKDF2, the TLS PRF.
|
|
51
|
+
//!
|
|
52
|
+
//! All keys used during the key derivation should be `SigningKey`s;
|
|
53
|
+
//! `SigningContext` should usually be used for the HMAC calculations. The
|
|
54
|
+
//! [code for `ring::pbkdf2`](https://github.com/briansmith/ring/blob/master/src/pbkdf2.rs)
|
|
55
|
+
//! and the
|
|
56
|
+
//! [code for `ring::hkdf`](https://github.com/briansmith/ring/blob/master/src/hkdf.rs)
|
|
57
|
+
//! are good examples of how to use `ring::hmac` efficiently for key derivation.
|
|
58
|
+
//!
|
|
59
|
+
//! # Examples:
|
|
60
|
+
//!
|
|
61
|
+
//! ## Signing a value and verifying it wasn't tampered with
|
|
62
|
+
//!
|
|
63
|
+
//! ```
|
|
64
|
+
//! use ring::{digest, hmac};
|
|
65
|
+
//!
|
|
66
|
+
//! # fn main_with_result() -> Result<(), ()> {
|
|
67
|
+
//! let key = try!(hmac::SigningKey::generate(&digest::SHA256));
|
|
68
|
+
//!
|
|
69
|
+
//! let msg = "hello, world";
|
|
70
|
+
//!
|
|
71
|
+
//! let signature = hmac::sign(&key, msg.as_bytes());
|
|
72
|
+
//!
|
|
73
|
+
//! // [We give access to the message to an untrusted party, and they give it
|
|
74
|
+
//! // back to us. We need to verify they didn't tamper with it.]
|
|
75
|
+
//!
|
|
76
|
+
//! try!(hmac::verify_with_own_key(&key, msg.as_bytes(), signature.as_ref()));
|
|
77
|
+
//! #
|
|
78
|
+
//! # Ok(())
|
|
79
|
+
//! # }
|
|
80
|
+
//! #
|
|
81
|
+
//! # fn main() { main_with_result().unwrap() }
|
|
82
|
+
//! ```
|
|
83
|
+
//!
|
|
84
|
+
//! ## Using the one-shot API:
|
|
85
|
+
//!
|
|
86
|
+
//! ```
|
|
87
|
+
//! use ring::{digest, hmac, rand};
|
|
88
|
+
//!
|
|
89
|
+
//! # fn main_with_result() -> Result<(), ()> {
|
|
90
|
+
//! let msg = "hello, world";
|
|
91
|
+
//!
|
|
92
|
+
//! // The sender generates a secure key value and signs the message with it.
|
|
93
|
+
//! // Note that it is better to use `SigningKey::generate` to generate the key
|
|
94
|
+
//! // when practical.
|
|
95
|
+
//! let mut key_value = [0u8; 32];
|
|
96
|
+
//! try!(rand::fill_secure_random(&mut key_value));
|
|
97
|
+
//!
|
|
98
|
+
//! let s_key = hmac::SigningKey::new(&digest::SHA256, key_value.as_ref());
|
|
99
|
+
//! let signature = hmac::sign(&s_key, msg.as_bytes());
|
|
100
|
+
//!
|
|
101
|
+
//! // The receiver (somehow!) knows the key value, and uses it to verify the
|
|
102
|
+
//! // integrity of the message.
|
|
103
|
+
//! let v_key = hmac::VerificationKey::new(&digest::SHA256, key_value.as_ref());
|
|
104
|
+
//! try!(hmac::verify(&v_key, msg.as_bytes(), signature.as_ref()));
|
|
105
|
+
//! #
|
|
106
|
+
//! # Ok(())
|
|
107
|
+
//! # }
|
|
108
|
+
//! #
|
|
109
|
+
//! # fn main() { main_with_result().unwrap() }
|
|
110
|
+
//! ```
|
|
111
|
+
//!
|
|
112
|
+
//! ## Using the multi-part API:
|
|
113
|
+
//! ```
|
|
114
|
+
//! use ring::{digest, hmac, rand};
|
|
115
|
+
//!
|
|
116
|
+
//! # fn main_with_result() -> Result<(), ()> {
|
|
117
|
+
//! let parts = ["hello", ", ", "world"];
|
|
118
|
+
//!
|
|
119
|
+
//! // The sender generates a secure key value and signs the message with it.
|
|
120
|
+
//! // Note that it is better to use `SigningKey::generate` to generate the key
|
|
121
|
+
//! // when practical.
|
|
122
|
+
//! let mut key_value = [0u8; 48];
|
|
123
|
+
//! try!(rand::fill_secure_random(&mut key_value));
|
|
124
|
+
//!
|
|
125
|
+
//! let s_key = hmac::SigningKey::new(&digest::SHA384, key_value.as_ref());
|
|
126
|
+
//! let mut s_ctx = hmac::SigningContext::with_key(&s_key);
|
|
127
|
+
//! for part in &parts {
|
|
128
|
+
//! s_ctx.update(part.as_bytes());
|
|
129
|
+
//! }
|
|
130
|
+
//! let signature = s_ctx.sign();
|
|
131
|
+
//!
|
|
132
|
+
//! // The receiver (somehow!) knows the key value, and uses it to verify the
|
|
133
|
+
//! // integrity of the message.
|
|
134
|
+
//! let v_key = hmac::VerificationKey::new(&digest::SHA384, key_value.as_ref());
|
|
135
|
+
//! let mut msg = Vec::<u8>::new();
|
|
136
|
+
//! for part in &parts {
|
|
137
|
+
//! msg.extend(part.as_bytes());
|
|
138
|
+
//! }
|
|
139
|
+
//! try!(hmac::verify(&v_key, &msg.as_ref(), signature.as_ref()));
|
|
140
|
+
//! #
|
|
141
|
+
//! # Ok(())
|
|
142
|
+
//! # }
|
|
143
|
+
//! #
|
|
144
|
+
//! # fn main() { main_with_result().unwrap() }
|
|
145
|
+
//! ```
|
|
146
|
+
|
|
147
|
+
use super::{constant_time, digest, rand};
|
|
148
|
+
|
|
149
|
+
/// A key to use for HMAC signing.
|
|
150
|
+
pub struct SigningKey {
|
|
151
|
+
ctx_prototype: SigningContext,
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
impl SigningKey {
|
|
155
|
+
/// Generate an HMAC signing key for the given digest algorithm using
|
|
156
|
+
/// |ring::rand|. The key will be `digest_alg.chaining_len` bytes long. The
|
|
157
|
+
/// key size choice is based on the recommendation of
|
|
158
|
+
/// [NIST SP 800-107, Section 5.3.4: Security Effect of the HMAC Key](http://csrc.nist.gov/publications/nistpubs/800-107-rev1/sp800-107-rev1.pdf)
|
|
159
|
+
/// and is consistent with the key lengths chosen for TLS as described in
|
|
160
|
+
/// [RFC 5246, Appendix C](https://tools.ietf.org/html/rfc5246#appendix-C).
|
|
161
|
+
pub fn generate(digest_alg: &'static digest::Algorithm)
|
|
162
|
+
-> Result<SigningKey, ()> {
|
|
163
|
+
// XXX: There should probably be a `digest::MAX_CHAINING_LEN`, but for
|
|
164
|
+
// now `digest::MAX_OUTPUT_LEN` is good enough.
|
|
165
|
+
let mut key_data = [0u8; digest::MAX_OUTPUT_LEN];
|
|
166
|
+
let key_data = &mut key_data[0..digest_alg.output_len];
|
|
167
|
+
try!(rand::fill_secure_random(key_data));
|
|
168
|
+
Ok(SigningKey::new(digest_alg, key_data))
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/// Construct an HMAC signing key using the given digest algorithm and key
|
|
172
|
+
/// value.
|
|
173
|
+
///
|
|
174
|
+
/// As specified in RFC 2104, if `key_value` is shorter than the digest
|
|
175
|
+
/// algorithm's block length (as returned by `digest::Algorithm::block_len`,
|
|
176
|
+
/// not the digest length returned by `digest::Algorithm::output_len`) then
|
|
177
|
+
/// it will be padded with zeros. Similarly, if it is longer than the block
|
|
178
|
+
/// length then it will be compressed using the digest algorithm.
|
|
179
|
+
///
|
|
180
|
+
/// You should not use keys larger than the `digest_alg.block_len` because
|
|
181
|
+
/// the truncation described above reduces their strength to only
|
|
182
|
+
/// `digest_alg.output_len * 8` bits. Support for such keys is likely to be
|
|
183
|
+
/// removed in a future version of *ring*.
|
|
184
|
+
pub fn new(digest_alg: &'static digest::Algorithm, key_value: &[u8])
|
|
185
|
+
-> SigningKey {
|
|
186
|
+
let mut key = SigningKey {
|
|
187
|
+
ctx_prototype: SigningContext {
|
|
188
|
+
inner: digest::Context::new(digest_alg),
|
|
189
|
+
outer: digest::Context::new(digest_alg)
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
let key_hash;
|
|
194
|
+
let key_value = if key_value.len() <= digest_alg.block_len {
|
|
195
|
+
key_value
|
|
196
|
+
} else {
|
|
197
|
+
key_hash = digest::digest(digest_alg, key_value);
|
|
198
|
+
key_hash.as_ref()
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
const IPAD: u8 = 0x36;
|
|
202
|
+
const OPAD: u8 = 0x5C;
|
|
203
|
+
|
|
204
|
+
for b in key_value {
|
|
205
|
+
key.ctx_prototype.inner.update(&[IPAD ^ b]);
|
|
206
|
+
key.ctx_prototype.outer.update(&[OPAD ^ b]);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// If the key is shorter than one block then act as though the key is
|
|
210
|
+
// padded with zeros.
|
|
211
|
+
for _ in key_value.len()..digest_alg.block_len {
|
|
212
|
+
key.ctx_prototype.inner.update(&[IPAD]);
|
|
213
|
+
key.ctx_prototype.outer.update(&[OPAD]);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
key
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
pub fn digest_algorithm(&self) -> &'static digest::Algorithm {
|
|
220
|
+
self.ctx_prototype.inner.algorithm()
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/// A context for multi-step (Init-Update-Finish) HMAC signing.
|
|
225
|
+
///
|
|
226
|
+
/// Use `sign` for single-step HMAC signing.
|
|
227
|
+
///
|
|
228
|
+
/// C analog: `HMAC_CTX`.
|
|
229
|
+
pub struct SigningContext {
|
|
230
|
+
inner: digest::Context,
|
|
231
|
+
outer: digest::Context,
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
impl SigningContext {
|
|
235
|
+
/// Constructs a new HMAC signing context using the given digest algorithm
|
|
236
|
+
/// and key.
|
|
237
|
+
///
|
|
238
|
+
/// C analog: `HMAC_CTX_init`
|
|
239
|
+
pub fn with_key(signing_key: &SigningKey) -> SigningContext {
|
|
240
|
+
SigningContext {
|
|
241
|
+
inner: signing_key.ctx_prototype.inner.clone(),
|
|
242
|
+
outer: signing_key.ctx_prototype.outer.clone(),
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/// Updates the HMAC with all the data in `data`. `update` may be called
|
|
247
|
+
/// zero or more times until `finish` is called.
|
|
248
|
+
///
|
|
249
|
+
/// C analog: `HMAC_Update`
|
|
250
|
+
pub fn update(&mut self, data: &[u8]) {
|
|
251
|
+
self.inner.update(data);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/// Finalizes the HMAC calculation and returns the HMAC value. `sign`
|
|
255
|
+
/// consumes the context so it cannot be (mis-)used after `sign` has been
|
|
256
|
+
/// called.
|
|
257
|
+
///
|
|
258
|
+
/// It is generally not safe to implement HMAC verification by comparing
|
|
259
|
+
// the return value of `sign` to a signature. Use `verify` for verification
|
|
260
|
+
// instead.
|
|
261
|
+
///
|
|
262
|
+
/// C analog: `HMAC_Final`
|
|
263
|
+
pub fn sign(mut self) -> digest::Digest {
|
|
264
|
+
self.outer.update(self.inner.finish().as_ref());
|
|
265
|
+
self.outer.finish()
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/// Calculates the HMAC of `data` using the key `key` in one step.
|
|
270
|
+
///
|
|
271
|
+
/// Use `SignignContext` to calculate HMACs where the input is in multiple
|
|
272
|
+
/// parts.
|
|
273
|
+
///
|
|
274
|
+
/// It is generally not safe to implement HMAC verification by comparing the
|
|
275
|
+
/// return value of `sign` to a signature. Use `verify` for verification
|
|
276
|
+
/// instead.
|
|
277
|
+
///
|
|
278
|
+
/// C analog: `HMAC_CTX_init` + `HMAC_Update` + `HMAC_Final`.
|
|
279
|
+
pub fn sign(key: &SigningKey, data: &[u8]) -> digest::Digest {
|
|
280
|
+
let mut ctx = SigningContext::with_key(key);
|
|
281
|
+
ctx.update(data);
|
|
282
|
+
ctx.sign()
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/// A key to use for HMAC authentication.
|
|
286
|
+
pub struct VerificationKey {
|
|
287
|
+
wrapped: SigningKey
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
impl VerificationKey {
|
|
291
|
+
/// Construct an HMAC verification key using the given digest algorithm and
|
|
292
|
+
/// key value.
|
|
293
|
+
///
|
|
294
|
+
/// As specified in RFC 2104, if `key_value` is shorter than the digest
|
|
295
|
+
/// algorithm's block length (as returned by `digest::Algorithm::block_len`,
|
|
296
|
+
/// not the digest length returned by `digest::Algorithm::output_len`) then
|
|
297
|
+
/// it will be padded with zeros. Similarly, if it is longer than the block
|
|
298
|
+
/// length then it will be compressed using the digest algorithm.
|
|
299
|
+
#[inline(always)]
|
|
300
|
+
pub fn new(digest_alg: &'static digest::Algorithm, key_value: &[u8])
|
|
301
|
+
-> VerificationKey {
|
|
302
|
+
VerificationKey { wrapped: SigningKey::new(digest_alg, key_value) }
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/// Calculates the HMAC of `data` using the key `key`, and verifies whether the
|
|
307
|
+
/// resultant value equals `signature`, in one step.
|
|
308
|
+
///
|
|
309
|
+
/// The verification will be done in constant time to prevent timing attacks.
|
|
310
|
+
///
|
|
311
|
+
/// C analog: `HMAC_Init` + `HMAC_Update` + `HMAC_Final` + `CRYPTO_memcmp`
|
|
312
|
+
#[inline(always)]
|
|
313
|
+
pub fn verify(key: &VerificationKey, data: &[u8], signature: &[u8])
|
|
314
|
+
-> Result<(), ()> {
|
|
315
|
+
verify_with_own_key(&key.wrapped, data, signature)
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/// Calculates the HMAC of `data` using the signing key `key`, and verifies
|
|
319
|
+
/// whether the resultant value equals `signature`, in one step.
|
|
320
|
+
///
|
|
321
|
+
/// This is logically equivalent to, but more efficient than, constructing a
|
|
322
|
+
/// `VerificationKey` with the same value as `key` and then using `verify`.
|
|
323
|
+
///
|
|
324
|
+
/// The verification will be done in constant time to prevent timing attacks.
|
|
325
|
+
///
|
|
326
|
+
/// C analog: `HMAC_Init` + `HMAC_Update` + `HMAC_Final` + `CRYPTO_memcmp`
|
|
327
|
+
pub fn verify_with_own_key(key: &SigningKey, data: &[u8], signature: &[u8])
|
|
328
|
+
-> Result<(), ()> {
|
|
329
|
+
constant_time::verify_slices_are_equal(sign(&key, data).as_ref(), signature)
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
#[cfg(test)]
|
|
333
|
+
mod tests {
|
|
334
|
+
use super::super::{digest, file_test, hmac};
|
|
335
|
+
|
|
336
|
+
// Make sure that `SigningKey::generate` and `verify_with_own_key` aren't
|
|
337
|
+
// completely wacky.
|
|
338
|
+
#[test]
|
|
339
|
+
pub fn hmac_signing_key_coverage() {
|
|
340
|
+
const HELLO_WORLD_GOOD: &'static [u8] = b"hello, world";
|
|
341
|
+
const HELLO_WORLD_BAD: &'static [u8] = b"hello, worle";
|
|
342
|
+
|
|
343
|
+
for d in &digest::test_util::ALL_ALGORITHMS {
|
|
344
|
+
let key = hmac::SigningKey::generate(d).unwrap();
|
|
345
|
+
let signature = hmac::sign(&key, HELLO_WORLD_GOOD);
|
|
346
|
+
assert!(hmac::verify_with_own_key(&key, HELLO_WORLD_GOOD,
|
|
347
|
+
signature.as_ref()).is_ok());
|
|
348
|
+
assert!(hmac::verify_with_own_key(&key, HELLO_WORLD_BAD,
|
|
349
|
+
signature.as_ref()).is_err())
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
#[test]
|
|
354
|
+
pub fn hmac_tests() {
|
|
355
|
+
file_test::run("src/hmac_tests.txt", |section, test_case| {
|
|
356
|
+
assert_eq!(section, "");
|
|
357
|
+
let digest_alg = test_case.consume_digest_alg("HMAC");
|
|
358
|
+
let key_value = test_case.consume_bytes("Key");
|
|
359
|
+
let mut input = test_case.consume_bytes("Input");
|
|
360
|
+
let output = test_case.consume_bytes("Output");
|
|
361
|
+
|
|
362
|
+
let digest_alg = match digest_alg {
|
|
363
|
+
Some(digest_alg) => digest_alg,
|
|
364
|
+
None => { return; } // Unsupported digest algorithm
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
hmac_test_case_inner(digest_alg, &key_value[..], &input[..],
|
|
368
|
+
&output[..], true);
|
|
369
|
+
|
|
370
|
+
// Tamper with the input and check that verification fails.
|
|
371
|
+
if input.len() == 0 {
|
|
372
|
+
input.push(0);
|
|
373
|
+
} else {
|
|
374
|
+
input[0] ^= 1;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
hmac_test_case_inner(digest_alg, &key_value[..], &input[..],
|
|
378
|
+
&output[..], false);
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
fn hmac_test_case_inner(digest_alg: &'static digest::Algorithm,
|
|
383
|
+
key_value: &[u8], input: &[u8], output: &[u8],
|
|
384
|
+
is_ok: bool) {
|
|
385
|
+
|
|
386
|
+
let s_key = hmac::SigningKey::new(digest_alg, key_value);
|
|
387
|
+
let v_key = hmac::VerificationKey::new(digest_alg, key_value);
|
|
388
|
+
|
|
389
|
+
// One-shot API.
|
|
390
|
+
{
|
|
391
|
+
let signature = hmac::sign(&s_key, input);
|
|
392
|
+
assert_eq!(is_ok, signature.as_ref() == output);
|
|
393
|
+
assert_eq!(is_ok, hmac::verify(&v_key, input, output).is_ok());
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// Multi-part API, one single part.
|
|
397
|
+
{
|
|
398
|
+
let mut s_ctx = hmac::SigningContext::with_key(&s_key);
|
|
399
|
+
s_ctx.update(input);
|
|
400
|
+
let signature = s_ctx.sign();
|
|
401
|
+
assert_eq!(is_ok, signature.as_ref() == output);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Multi-part API, byte by byte.
|
|
405
|
+
{
|
|
406
|
+
let mut s_ctx = hmac::SigningContext::with_key(&s_key);
|
|
407
|
+
for b in input {
|
|
408
|
+
s_ctx.update(&[*b]);
|
|
409
|
+
}
|
|
410
|
+
let signature = s_ctx.sign();
|
|
411
|
+
assert_eq!(is_ok, signature.as_ref() == output);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# HMAC tests from NIST test data
|
|
2
|
+
|
|
3
|
+
HMAC = SHA1
|
|
4
|
+
Input = "Sample message for keylen=blocklen"
|
|
5
|
+
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F
|
|
6
|
+
Output = 5FD596EE78D5553C8FF4E72D266DFD192366DA29
|
|
7
|
+
|
|
8
|
+
HMAC = SHA1
|
|
9
|
+
Input = "Sample message for keylen<blocklen"
|
|
10
|
+
Key = 000102030405060708090A0B0C0D0E0F10111213
|
|
11
|
+
Output = 4C99FF0CB1B31BD33F8431DBAF4D17FCD356A807
|
|
12
|
+
|
|
13
|
+
HMAC = SHA1
|
|
14
|
+
Input = "Sample message for keylen=blocklen"
|
|
15
|
+
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263
|
|
16
|
+
Output = 2D51B2F7750E410584662E38F133435F4C4FD42A
|
|
17
|
+
|
|
18
|
+
HMAC = SHA224
|
|
19
|
+
Input = "Sample message for keylen=blocklen"
|
|
20
|
+
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F
|
|
21
|
+
Output = C7405E3AE058E8CD30B08B4140248581ED174CB34E1224BCC1EFC81B
|
|
22
|
+
|
|
23
|
+
HMAC = SHA224
|
|
24
|
+
Input = "Sample message for keylen<blocklen"
|
|
25
|
+
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B
|
|
26
|
+
Output = E3D249A8CFB67EF8B7A169E9A0A599714A2CECBA65999A51BEB8FBBE
|
|
27
|
+
|
|
28
|
+
HMAC = SHA224
|
|
29
|
+
Input = "Sample message for keylen=blocklen"
|
|
30
|
+
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263
|
|
31
|
+
Output = 91C52509E5AF8531601AE6230099D90BEF88AAEFB961F4080ABC014D
|
|
32
|
+
|
|
33
|
+
HMAC = SHA256
|
|
34
|
+
Input = "Sample message for keylen=blocklen"
|
|
35
|
+
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F
|
|
36
|
+
Output = 8BB9A1DB9806F20DF7F77B82138C7914D174D59E13DC4D0169C9057B133E1D62
|
|
37
|
+
|
|
38
|
+
HMAC = SHA256
|
|
39
|
+
Input = "Sample message for keylen<blocklen"
|
|
40
|
+
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
|
|
41
|
+
Output = A28CF43130EE696A98F14A37678B56BCFCBDD9E5CF69717FECF5480F0EBDF790
|
|
42
|
+
|
|
43
|
+
HMAC = SHA256
|
|
44
|
+
Input = "Sample message for keylen=blocklen"
|
|
45
|
+
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F60616263
|
|
46
|
+
Output = BDCCB6C72DDEADB500AE768386CB38CC41C63DBB0878DDB9C7A38A431B78378D
|
|
47
|
+
|
|
48
|
+
HMAC = SHA384
|
|
49
|
+
Input = "Sample message for keylen=blocklen"
|
|
50
|
+
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F
|
|
51
|
+
Output = 63C5DAA5E651847CA897C95814AB830BEDEDC7D25E83EEF9195CD45857A37F448947858F5AF50CC2B1B730DDF29671A9
|
|
52
|
+
|
|
53
|
+
HMAC = SHA384
|
|
54
|
+
Input = "Sample message for keylen<blocklen"
|
|
55
|
+
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F
|
|
56
|
+
Output = 6EB242BDBB582CA17BEBFA481B1E23211464D2B7F8C20B9FF2201637B93646AF5AE9AC316E98DB45D9CAE773675EEED0
|
|
57
|
+
|
|
58
|
+
HMAC = SHA384
|
|
59
|
+
Input = "Sample message for keylen=blocklen"
|
|
60
|
+
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7
|
|
61
|
+
Output = 5B664436DF69B0CA22551231A3F0A3D5B4F97991713CFA84BFF4D0792EFF96C27DCCBBB6F79B65D548B40E8564CEF594
|
|
62
|
+
|
|
63
|
+
HMAC = SHA512
|
|
64
|
+
Input = "Sample message for keylen=blocklen"
|
|
65
|
+
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F
|
|
66
|
+
Output = FC25E240658CA785B7A811A8D3F7B4CA48CFA26A8A366BF2CD1F836B05FCB024BD36853081811D6CEA4216EBAD79DA1CFCB95EA4586B8A0CE356596A55FB1347
|
|
67
|
+
|
|
68
|
+
HMAC = SHA512
|
|
69
|
+
Input = "Sample message for keylen<blocklen"
|
|
70
|
+
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F
|
|
71
|
+
Output = FD44C18BDA0BB0A6CE0E82B031BF2818F6539BD56EC00BDC10A8A2D730B3634DE2545D639B0F2CF710D0692C72A1896F1F211C2B922D1A96C392E07E7EA9FEDC
|
|
72
|
+
|
|
73
|
+
HMAC = SHA512
|
|
74
|
+
Input = "Sample message for keylen=blocklen"
|
|
75
|
+
Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7
|
|
76
|
+
Output = D93EC8D2DE1AD2A9957CB9B83F14E76AD6B5E0CCE285079A127D3B14BCCB7AA7286D4AC0D4CE64215F2BC9E6870B33D97438BE4AAA20CDA5C5A912B48B8E27F3
|
|
77
|
+
|
|
78
|
+
# Additional HMAC tests from OpenSSL.
|
|
79
|
+
HMAC = SHA1
|
|
80
|
+
Input = "My test data"
|
|
81
|
+
Key = ""
|
|
82
|
+
Output = 61afdecb95429ef494d61fdee15990cabf0826fc
|
|
83
|
+
|
|
84
|
+
HMAC = SHA256
|
|
85
|
+
Input = "My test data"
|
|
86
|
+
Key = ""
|
|
87
|
+
Output = 2274b195d90ce8e03406f4b526a47e0787a88a65479938f1a5baa3ce0f079776
|
|
88
|
+
|
|
89
|
+
HMAC = SHA256
|
|
90
|
+
Input = "My test data"
|
|
91
|
+
Key = "123456"
|
|
92
|
+
Output = bab53058ae861a7f191abe2d0145cbb123776a6369ee3f9d79ce455667e411dd
|
|
93
|
+
|
|
94
|
+
HMAC = SHA1
|
|
95
|
+
Input = "My test data"
|
|
96
|
+
Key = "12345"
|
|
97
|
+
Output = 7dbe8c764c068e3bcd6e6b0fbcd5e6fc197b15bb
|