[ring] Update to 0.14.5

This adds support fuchsia cprng and aarch64 cpu feature detection
to ring (hurrah!).

Along the way, this also:

* updates cc from 1.0.28 to 1.0.29
* adds the spin-0.5.0 crate

This was approved in OSRB-135.

Bug: OSRB-135 #comment landed
Change-Id: Ia13be56e844c5550f8adb0ea66b49137f6b32d83
diff --git a/rustc_deps/Cargo.lock b/rustc_deps/Cargo.lock
index 22ca5e3..58f1b4a 100644
--- a/rustc_deps/Cargo.lock
+++ b/rustc_deps/Cargo.lock
@@ -168,7 +168,7 @@
 version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -221,7 +221,7 @@
 
 [[package]]
 name = "cc"
-version = "1.0.28"
+version = "1.0.29"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -487,7 +487,7 @@
  "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
  "bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)",
- "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)",
  "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "crossbeam 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -527,7 +527,7 @@
  "quote 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)",
  "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "ring 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ring 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "rouille 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "rust-crypto 0.2.36",
  "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -909,7 +909,7 @@
 version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)",
  "crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
  "miniz_oxide 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1431,12 +1431,13 @@
 
 [[package]]
 name = "ring"
-version = "0.14.3"
+version = "0.14.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)",
+ "cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.48 (registry+https://github.com/rust-lang/crates.io-index)",
+ "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -1500,7 +1501,7 @@
 dependencies = [
  "base64 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "ring 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ring 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "sct 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "webpki 0.19.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -1561,7 +1562,7 @@
 version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "ring 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ring 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -1649,6 +1650,11 @@
 ]
 
 [[package]]
+name = "spin"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
 name = "stable_deref_trait"
 version = "1.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2027,7 +2033,7 @@
 version = "0.19.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
- "ring 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ring 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "untrusted 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
@@ -2153,7 +2159,7 @@
 "checksum bytecount 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f861d9ce359f56dbcb6e0c2a1cb84e52ad732cadb57b806adeb3c7668caccbd8"
 "checksum byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "94f88df23a25417badc922ab0f5716cc1330e87f71ddd9203b3a3ccd9cedf75d"
 "checksum bytes 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "40ade3d27603c2cb345eb0912aec461a6dec7e06a4ae48589904e808335c7afa"
-"checksum cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a8b715cb4597106ea87c7c84b2f1d452c7492033765df7f32651e66fcf749"
+"checksum cc 1.0.29 (registry+https://github.com/rust-lang/crates.io-index)" = "4390a3b5f4f6bce9c1d0c00128379df433e53777fdd30e92f16a529332baec4e"
 "checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4"
 "checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878"
 "checksum chunked_transfer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "498d20a7aaf62625b9bf26e637cf7736417cde1d0c99f1d04d1170229a85cf87"
@@ -2280,7 +2286,7 @@
 "checksum regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37e7cbbd370869ce2e8dff25c7018702d10b21a20ef7135316f8daecd6c25b7f"
 "checksum regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4e47a2ed29da7a9e1960e1639e7a982e6edc6d49be308a3b02daf511504a16d1"
 "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5"
-"checksum ring 0.14.3 (registry+https://github.com/rust-lang/crates.io-index)" = "be5386a5f59e5f5bcaea38b50ad26c09e3918a0abc0610640b3be5cfd85d6894"
+"checksum ring 0.14.5 (registry+https://github.com/rust-lang/crates.io-index)" = "148fc853f6d85f53f5f315d46701eaacc565cdfb3cb1959730c96e81e7e49999"
 "checksum rouille 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "112568052ec17fa26c6c11c40acbb30d3ad244bf3d6da0be181f5e7e42e5004f"
 "checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619"
 "checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
@@ -2305,6 +2311,7 @@
 "checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac"
 "checksum slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f9776d6b986f77b35c6cf846c11ad986ff128fe0b2b63a3628e3755e8d3102d"
 "checksum smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b73ea3738b47563803ef814925e69be00799a8c07420be8b996f8e98fb2336db"
+"checksum spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55"
 "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8"
 "checksum stb_truetype 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "71a7d260b43b6129a22dc341be18a231044ca67a48b7e32625f380cc5ec9ad70"
 "checksum string 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "98998cced76115b1da46f63388b909d118a37ae0be0f82ad35773d4a4bc9d18d"
diff --git a/rustc_deps/vendor/cc/.cargo-checksum.json b/rustc_deps/vendor/cc/.cargo-checksum.json
index 161e71c..71521ea 100644
--- a/rustc_deps/vendor/cc/.cargo-checksum.json
+++ b/rustc_deps/vendor/cc/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"fbef1cb94911147d635fe6a12889dd3ba15060e59447cff57892c65482c27073","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"3eeb4b0488908876c439a87cfe2bec6d550b37388993b2d8863fb1c587a84f46","src/bin/gcc-shim.rs":"d6be9137cb48b86891e7b263adbf492e1193ffe682db9ba4a88eb1079b874b58","src/com.rs":"8b9a54af5400c259f877126cc68ea63ada4fe66e84c9b840711c95e570b15774","src/lib.rs":"74b3e65bbb7999fd65de8a906ca4daa441742780b2e8d1eb557a1113e014de87","src/registry.rs":"3cc1b5a50879fa751572878ae1d0afbfc960c11665258492754b2c8bccb0ff5d","src/setup_config.rs":"f5c45afc99ad3b7c1311242bc4baf37e861d740ab81bf6ca90e2aa283672e65a","src/winapi.rs":"d7929b36130e33f1caa6bd444b378b83023b2b82d589c6e0ab38c4ff6c950da8","src/windows_registry.rs":"b1293868645ceea5ee8dfb1afed8cc8290e6735c4d25dc43ea7d387778167180","tests/cc_env.rs":"bf7b14aa52af04294f648b2934f0f1830c5a0bdac1676310b8aa1f61458e7782","tests/support/mod.rs":"80dc87e54025197104cfb62d1af7a3400a3a0ddf0f2d98ea4ef4111cb1f0c890","tests/test.rs":"d839b2bcdb367180e537c0d26cb2d918d5ddfc587801c7051f4955d25688ea7d"},"package":"bb4a8b715cb4597106ea87c7c84b2f1d452c7492033765df7f32651e66fcf749"}
\ No newline at end of file
+{"files":{"Cargo.toml":"f9a183ecc8491ddbd6e0724c9d159d00e7665ece4584f0240d4ca2a876154d0e","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"8306846d7c3f9ae616fcc3d26f4a7c1ff03ee07ccb0bb1cd9a3c75f77d794d37","src/bin/gcc-shim.rs":"d6be9137cb48b86891e7b263adbf492e1193ffe682db9ba4a88eb1079b874b58","src/com.rs":"8b9a54af5400c259f877126cc68ea63ada4fe66e84c9b840711c95e570b15774","src/lib.rs":"b75d0c19a087cd7df42d1fd3fc88da387aa2e0f5480a3facc43b49fbb83bbdd4","src/registry.rs":"3cc1b5a50879fa751572878ae1d0afbfc960c11665258492754b2c8bccb0ff5d","src/setup_config.rs":"f5c45afc99ad3b7c1311242bc4baf37e861d740ab81bf6ca90e2aa283672e65a","src/winapi.rs":"d7929b36130e33f1caa6bd444b378b83023b2b82d589c6e0ab38c4ff6c950da8","src/windows_registry.rs":"b1293868645ceea5ee8dfb1afed8cc8290e6735c4d25dc43ea7d387778167180","tests/cc_env.rs":"bf7b14aa52af04294f648b2934f0f1830c5a0bdac1676310b8aa1f61458e7782","tests/support/mod.rs":"80dc87e54025197104cfb62d1af7a3400a3a0ddf0f2d98ea4ef4111cb1f0c890","tests/test.rs":"d839b2bcdb367180e537c0d26cb2d918d5ddfc587801c7051f4955d25688ea7d"},"package":"4390a3b5f4f6bce9c1d0c00128379df433e53777fdd30e92f16a529332baec4e"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/cc/Cargo.toml b/rustc_deps/vendor/cc/Cargo.toml
index b60e6e9..d20cc8c 100644
--- a/rustc_deps/vendor/cc/Cargo.toml
+++ b/rustc_deps/vendor/cc/Cargo.toml
@@ -12,7 +12,7 @@
 
 [package]
 name = "cc"
-version = "1.0.28"
+version = "1.0.29"
 authors = ["Alex Crichton <alex@alexcrichton.com>"]
 exclude = ["/.travis.yml", "/appveyor.yml"]
 description = "A build-time dependency for Cargo build scripts to assist in invoking the native\nC compiler to compile native C code into a static archive to be linked into Rust\ncode.\n"
@@ -20,7 +20,7 @@
 documentation = "https://docs.rs/cc"
 readme = "README.md"
 keywords = ["build-dependencies"]
-categories = ["development-tools"]
+categories = ["development-tools::build-utils"]
 license = "MIT/Apache-2.0"
 repository = "https://github.com/alexcrichton/cc-rs"
 [dependencies.rayon]
diff --git a/rustc_deps/vendor/cc/README.md b/rustc_deps/vendor/cc/README.md
index f65d0c0..307bc7f 100644
--- a/rustc_deps/vendor/cc/README.md
+++ b/rustc_deps/vendor/cc/README.md
@@ -2,7 +2,7 @@
 
 A library to compile C/C++/assembly into a Rust library/application.
 
-[![Build Status](https://travis-ci.org/alexcrichton/cc-rs.svg?branch=master)](https://travis-ci.org/alexcrichton/cc-rs)
+[![Build Status](https://travis-ci.com/alexcrichton/cc-rs.svg?branch=master)](https://travis-ci.com/alexcrichton/cc-rs)
 [![Build status](https://ci.appveyor.com/api/projects/status/onu270iw98h81nwv?svg=true)](https://ci.appveyor.com/project/alexcrichton/cc-rs)
 
 [Documentation](https://docs.rs/cc)
diff --git a/rustc_deps/vendor/cc/src/lib.rs b/rustc_deps/vendor/cc/src/lib.rs
index 5eebd07..37e9541 100644
--- a/rustc_deps/vendor/cc/src/lib.rs
+++ b/rustc_deps/vendor/cc/src/lib.rs
@@ -1171,11 +1171,11 @@
                 if clang_cl {
                     if target.contains("x86_64") {
                         cmd.args.push("-m64".into());
-                    } else if target.contains("i586") {
+                    } else if target.contains("86") {
                         cmd.args.push("-m32".into());
                         cmd.args.push("/arch:IA32".into());
                     } else {
-                        cmd.args.push("-m32".into());
+                        cmd.args.push(format!("--target={}", target).into());
                     }
                 } else {
                     if target.contains("i586") {
diff --git a/rustc_deps/vendor/ring/.cargo-checksum.json b/rustc_deps/vendor/ring/.cargo-checksum.json
index c844a51..87801ad 100644
--- a/rustc_deps/vendor/ring/.cargo-checksum.json
+++ b/rustc_deps/vendor/ring/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"719d043b0b046cb53890a6bbd35b261993f2a4136994d7f4d68361c561fea8a3","LICENSE":"76b39f9b371688eac9d8323f96ee80b3aef5ecbc2217f25377bd4e4a615296a9","build.rs":"315db4ca6a3b00a00139fb8525e875706a288074d752eae6f50350ea50502670","crypto/block.c":"f78b50b1482f00f1ed030fc2e0b325eac5be387a1af6150cb6c8bf359038f54e","crypto/block.h":"ca5fc0e831d6f053811c6c96254d303ea58c48ea875af6d2c6862d3f07971f02","crypto/chacha/asm/chacha-armv4.pl":"4dabdd766dd25711ee6276f7415c3fd654635687aa536617eceb75a8a3ad1189","crypto/chacha/asm/chacha-armv8.pl":"60f4d3a7904fbd2d7c5c98a369c9a540fe4c44b62165032d01574326d5b6f46e","crypto/chacha/asm/chacha-x86.pl":"abbcf8181bd629d8003322dbf2592bf4631abb7895861d7021c451043e39be34","crypto/chacha/asm/chacha-x86_64.pl":"7f38c54bae872a6f6cde85cd13bf061ebcd9372a4d126f66bbe018fb7231d6a4","crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl":"82d31709de6b5e7c633b44eb54f8c92206a44f28fcaa130b6a7f794acd99c11d","crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt":"1a0b201dd8f4aa2106db0de3c26eb0d9623394ec80247867371c20103718b1c0","crypto/cipher_extra/test/aes_256_gcm_siv_tests.txt":"514a978594261e0520b30aac455c8a29c3280cc15701a928a0e8ad7bacfc2c79","crypto/constant_time_test.c":"f753a77612182705f4405a450fe762731f9ea23bf557d739fc9fe55ef56a4be2","crypto/cpu-aarch64-linux.c":"61cb9b03431d543488ca045b9f70d04b6a1d1fc876ab7e3613ec9b3b237baa0b","crypto/cpu-arm-linux.c":"a420ad717fd85c22bfb33c51735dd4ac4ca63fbdb54eda0dd451aa0550d565a2","crypto/cpu-arm.c":"e7b6be5862e1f7f83568991ef2c46f05df9d6517f8ad5ce0a12fe8c8bab788c7","crypto/cpu-intel.c":"abc91c05aa072d2966fdb0a61a7da14e1bb2dff8ecbecf3a697d2b138ccceaac","crypto/crypto.c":"b1bc80bf90aa1f1691ee6f27d3d3f4c491c7590cf83fb39ab2702a166072ba38","crypto/curve25519/asm/x25519-asm-arm.S":"a6784f13e24bc8db7b3f2088722b04fd6a3382c02eaaa0d652a3ae931a465be9","crypto/fipsmodule/aes/aes.c":"b0b56a8f6282b4c149dab5403fe0fccbfcb2a946d0d39ee00ca32a8900a5e2d5","crypto/fipsmodule/aes/asm/aes-586.pl":"c4b671435008c6747c755060900f14f65eb007a16448bc7aa91a3133ce064e8d","crypto/fipsmodule/aes/asm/aes-armv4.pl":"f2aea5fdebbdb093a90d7b42e925ffcfb48509479d0157bdd88f46f33b690ff5","crypto/fipsmodule/aes/asm/aes-x86_64.pl":"d8088bdf4a3c28b0cdf0284bf829bae6dcbe70637c9e79ded33a61572302fa93","crypto/fipsmodule/aes/asm/aesni-x86.pl":"8625210b9588ddb994a53c3babc6f68aa1b7615e572934b2bbf8e5c284e1de4e","crypto/fipsmodule/aes/asm/aesni-x86_64.pl":"97b0a0d9ddac8b972b5fb98e0fd564eb68b3b50dc31180d1af1d6599685d004c","crypto/fipsmodule/aes/asm/aesv8-armx.pl":"eb5b5e4fe4447767b7b95a53c697885f4c20c5a2c82b2f56b48240f7b5a3bcb8","crypto/fipsmodule/aes/asm/bsaes-armv7.pl":"07d795e03b6463ef5ac2d92e554de52bfc32af6f2585b2ed8ea60b61abceb0d3","crypto/fipsmodule/aes/asm/vpaes-x86.pl":"7672ae209b0eb33d0d6856f46c46066a07db4c6534cb678cc2bf329b040575b9","crypto/fipsmodule/aes/asm/vpaes-x86_64.pl":"383e964a9188bfbbdb5f0b53d74c5493ef234194c1eb1b7e2f63504bb3974c9e","crypto/fipsmodule/aes/internal.h":"b9cd4c26b7d87be155776ba553336ded881f9a8deeac08a9a053c383a0d657e8","crypto/fipsmodule/bn/asm/armv4-mont.pl":"0e6b793c5628ff2d1172969a56a508735150409e4a520bdc7226a0dd1f104240","crypto/fipsmodule/bn/asm/armv8-mont.pl":"a0f9368bcce4d56ec72ebf04a0664c8514a0fa9299aa2d27eec07fc63dcf4d0a","crypto/fipsmodule/bn/asm/x86-mont.pl":"eff867e854ba35bdbe2f884b35e1c6cabb7f4e6b5ffc62d13e3d795285479138","crypto/fipsmodule/bn/asm/x86_64-mont.pl":"240d70d03b632727c71afe0de20478104768290dfbd15023cda2d440de99e3df","crypto/fipsmodule/bn/asm/x86_64-mont5.pl":"729634aecab869465b6f3fba71406bf34603c3fa4a371749cc7228ccb4a728be","crypto/fipsmodule/bn/generic.c":"8427b35e188177a3669a5763d4cd639457391f285b9fa501b788cb21706ff565","crypto/fipsmodule/bn/internal.h":"49c3cb55c4523b8b418dad6c19ad44709833bab6e82cde1fd7295f9d1491efd0","crypto/fipsmodule/bn/montgomery.c":"312cb830ac61d83d02e7afcd46c9a2b4367c46f30792ffb13f9f826aef869ff3","crypto/fipsmodule/bn/montgomery_inv.c":"0781fbab3065777572720df6a8c3ce3e2dd2b731e7c71c35635f94c881eecc82","crypto/fipsmodule/cipher/e_aes.c":"935b389d3fed3627b56aca91010c073173a6e5e02357c1e50aa0b074a08971ed","crypto/fipsmodule/ec/asm/ecp_nistz256-armv4.pl":"f92e6f293af43e439cf41f603ca1c016227912e3ea16d221edc56a467c5ab1e5","crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl":"2338e60bd7a868850ec681fc66e313c92c90727de8f723e83ad72a0d7c553c3f","crypto/fipsmodule/ec/asm/ecp_nistz256-x86.pl":"51be61331792fc0c971eed9d70f15b89a79a0bcc3211f65401d343f5bf794091","crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl":"add0f387e8bb2f40f591eb42da0534f44b771a47a301d8f93a448fdc9d52be83","crypto/fipsmodule/ec/ecp_nistz.c":"f138a4baced1595ea06911bc425f0766b897afb3007437dd7f8c68e9e493e73c","crypto/fipsmodule/ec/ecp_nistz.h":"f9b3176c9a9883721529665583b118a8e859e2b6bbf06077d0d1f7339dce8c65","crypto/fipsmodule/ec/ecp_nistz256.c":"6810068be6b2d28c17bc634349eb1d70cb7be578d9f3aaab7849be179fa9f877","crypto/fipsmodule/ec/ecp_nistz256.h":"0032b44c8a61c6478f8c2c36c1dbbf9789418f509f428419c7a7f6d148674872","crypto/fipsmodule/ec/ecp_nistz256_table.inl":"ccc4126030480c8898832cc7f0ae6c62bf5e16de51a32d16f667fae016699579","crypto/fipsmodule/ec/ecp_nistz384.h":"9fbd1b8a9fdb0514110b441f47618ee781d531e67fc54c38a89671a5160a44b1","crypto/fipsmodule/ec/ecp_nistz384.inl":"f0e4f7f8415f057556da8d3f40e651706bc074ed393e1442f6dbba5232a2ee00","crypto/fipsmodule/ec/gfp_p256.c":"b2d9d6523d02d0adb2ae8230e70a7618e100e6026a82b1dceebda955d4922d0e","crypto/fipsmodule/ec/gfp_p384.c":"ae7c91d6dfc69dd7c47c80169450abce2c5452b6273fea10864c938bd1bad47e","crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt":"a607b74542c3833ab907e74e341c988ed16ee1e4b02c4323887e82c881a6b990","crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl":"b63b0a1c3e9484661a1c1a55a0275cedb8a1148227e4ea60c6aeb4cc6f195d07","crypto/fipsmodule/modes/asm/ghash-armv4.pl":"77408b681c42324691044d98d4ff7f8160a4193cb286ade366279ebf3c581ac2","crypto/fipsmodule/modes/asm/ghash-x86.pl":"16c8c02399a7513430b8d88fe10a94e19a016acd72801bffd29c1c14705bd367","crypto/fipsmodule/modes/asm/ghash-x86_64.pl":"6b9f719b33d7d6fc45b833aad6f5e8c51096628a377c7d0b9836f7cff4f36581","crypto/fipsmodule/modes/asm/ghashv8-armx.pl":"e210dcf14cad06e593481e30db0f06355582f53bb2419eeb78c7bb3bbb393091","crypto/fipsmodule/modes/gcm.c":"b4ed85e413798e1ab8a56ce8d91423e3cca277e9dbe4c4ab3bcdda90f6ff25c7","crypto/fipsmodule/modes/internal.h":"3d837589c477fe666a2e314dfd457f386e3acaee306c3bab3e2d155fe4c643cb","crypto/fipsmodule/sha/asm/sha256-586.pl":"7d28f78ef27b17a7ac6a62337ae5a75d2ef1c2bf08c8154189652e4d93e9ab65","crypto/fipsmodule/sha/asm/sha256-armv4.pl":"673523183c7ac34ade7becc78f077e6bbda6a2d1f6d33644207c725be2dc16c8","crypto/fipsmodule/sha/asm/sha512-586.pl":"b536e80fcc7cf77e5945fa7af1c43b18d2e1df438e601262429065b0b622682b","crypto/fipsmodule/sha/asm/sha512-armv4.pl":"7352a2ced5b722e37023e27afdfdcd5eddebbe067ba8f5da4c421a8709ee8955","crypto/fipsmodule/sha/asm/sha512-armv8.pl":"c79a028ee366e6a3dc234787c1ab4696be29aef08b3af6877a0dfffede1dfd09","crypto/fipsmodule/sha/asm/sha512-x86_64.pl":"ad914a24a3d903018261499d930871d696af24e379fc9249ce372180d586ca92","crypto/internal.h":"81d55fe0d255f6d7edb7b58a6cf2ee9cbfdc7b07f5b27d17df856d38cda01fbd","crypto/limbs/limbs.c":"195d4c147d460b2af0505d649b7db0f6958fd06eabf4e896747f4e6d86382af1","crypto/limbs/limbs.h":"5736985c56532a9e51a858f83c5ad0c19c22e293deb44346a57c9862bbad707e","crypto/limbs/limbs.inl":"34ebb0d77672cb538ddcaa69c16c781daf5a241ae853fdb3f787b2fe1ad1cba1","crypto/mem.c":"18e2844c6205fab613031e671dac3b65ceeb18bb5125f2a11e4df7ec0c09ec0f","crypto/perlasm/arm-xlate.pl":"54998c82dcf99ca2328ad28ed0ef0b06e95b64f5407e66ff8f1b4e106ed31f9a","crypto/perlasm/x86_64-xlate.pl":"be38cb5a80c8a89e209bf46cea424ada94f9e1e7920f80aa211dd691d81c481a","crypto/perlasm/x86asm.pl":"c437421fe9cfe8fea96f9f38f35fec0d1086d6d1b7b6349180b2163ce8cc9e63","crypto/perlasm/x86gas.pl":"183d2642ab2e4c76b46bcb97a92fd16c539d9c07331c7204b0564d78c9413817","crypto/perlasm/x86nasm.pl":"7d3b50f58cfd1da94a10f17e1129770d744edf03d4029417ea53bf8771a99b97","crypto/poly1305/asm/poly1305-armv4.pl":"2092a6f1b330972fb050da99b7a63d3c70dfd5f99db98ed1f679018d89e839c2","crypto/poly1305/asm/poly1305-armv8.pl":"c717d87739909c95e0dd1e2d95e6a5d9f693677e68ca1bcf2dc619c93c777185","crypto/poly1305/asm/poly1305-x86.pl":"060b3689cac73fb7a32e16daa799573e6c52dda47fa3ddba9cc235763d6834fc","crypto/poly1305/asm/poly1305-x86_64.pl":"ee69a0717f931d7c336898cce017946a56196a90d6fb44a02989b855ce136bf7","include/GFp/aes.h":"fe399abed5f51e4f87efb740db962bfbba8ee3da0895ff87a0adac01b84cec98","include/GFp/arm_arch.h":"7b2d7945fc47ba8d8534ffb03a62d9b891e727d3a14fe32f1608f07dd0021f5d","include/GFp/base.h":"f4dc1f800fb305f3ea06dc2fcfe52bcb3ee42a621d54a470077c44a8f4c620b9","include/GFp/cpu.h":"89adbd17d00d648c77cb9a39f7ff0b974287088803bfb16aabb1c342943626a3","include/GFp/mem.h":"f60b987b803b79b149aa140195ed9c1108b90b01123aca367a599da6174d082d","include/GFp/type_check.h":"6311bbc55de60641683e0380014588dfc5fe8545d62a430f73289f6194bc9f81","pregenerated/aes-586-elf.S":"f7f20706ef759b5c57754d4d76ee02a52720823e690a7d8622706ed519314443","pregenerated/aes-586-macosx.S":"192f02221d5c29435fff77278881d84ebb27317d5193d30f5a16d003b7fe7fd1","pregenerated/aes-586-win32n.obj":"2525a34657d7f6b0662ffd52cf1927179794090f7b2e393b8346bb66d603f920","pregenerated/aes-armv4-ios32.S":"05e3aa1606492acf27005eaf7da9d8d395a46891685ad5a4ab119ce9399fc318","pregenerated/aes-armv4-linux32.S":"a566fa70cea01f894e310ac223bbddae6bd06085ec5abe9f01bb949176c7d04f","pregenerated/aes-x86_64-elf.S":"52f2903cee5b295afd045c8e2c643599607243721f4a29c2c3450d7ee2c05d0a","pregenerated/aes-x86_64-macosx.S":"d9816ae3dd046d168cbed5c81bd8523d8ad0d7cfd23e249ca649dc8bf200a5ed","pregenerated/aes-x86_64-nasm.obj":"73d295c44db097b6a73beb46284a686e0f0cb92752e1638cf1f50b60511aaf13","pregenerated/aesni-gcm-x86_64-elf.S":"ef5d9c077556e5797a3a077822db69c0ee910612a2c5a0ab78d7d7c6c38715e4","pregenerated/aesni-gcm-x86_64-macosx.S":"416356efcc64fa2d8562e4cdfd5450d24dc7fc7b0b75a34c477aa1d6c72797b4","pregenerated/aesni-gcm-x86_64-nasm.obj":"03e0225286522a4eb58afd6af0af9b08205db9ae95013a1baad5abdb96af40d7","pregenerated/aesni-x86-elf.S":"bc47724289b8686a53182ddebde870dec87fd9f475764eccccce2ab7b2afded8","pregenerated/aesni-x86-macosx.S":"daec8c6e24442e087c0f9d966de30c5e65ce54965d5e4d3807b32b86b831ea32","pregenerated/aesni-x86-win32n.obj":"fdcb0d03bd5d48595fa4c252e6baa8926ba5640b8507f8ff88637ce3d9a2bd84","pregenerated/aesni-x86_64-elf.S":"a157857e74365447651edcf52a1c22d025148d0ec4591a2a171bb3961b4c5f3f","pregenerated/aesni-x86_64-macosx.S":"429b63c941b4b097f0535e1e4e7ecf581aca5fa0f28aa01826f86e61dcd19bb7","pregenerated/aesni-x86_64-nasm.obj":"d143c53d8f90e311f6c3cca1793ebb262197739237edb40e41340dc7d9da80ce","pregenerated/aesv8-armx-ios32.S":"b584a245f583c5476b580624f4a008cdd61a3222ac95c2d7e28dd3582d207a24","pregenerated/aesv8-armx-ios64.S":"f8c03d0da11439e3728a10b4ae8070ff0857bd954a601720c4b34dcad72cbb48","pregenerated/aesv8-armx-linux32.S":"cec32d89aeaa2441663dbc3f8a930b1704edb633c312e24d2409a14b1a574d45","pregenerated/aesv8-armx-linux64.S":"b5cb8d4f1a97d3ed999998c2792a67e769c70985a8b1a45bd86aae5383a52db0","pregenerated/armv4-mont-ios32.S":"3b0de93587df778e89c19a8def5f9ac3600b731dd2f44bee85f9df9af5350428","pregenerated/armv4-mont-linux32.S":"1753245efba56ffb87abe9cc8971d55c850c017ea18ab182c275cae746331494","pregenerated/armv8-mont-ios64.S":"046966e4b03a96dfbee84eb87606010141e966860d1515cdd22dae9e413f85e3","pregenerated/armv8-mont-linux64.S":"0ef399c278a521892ea032e4acfc141c8938182cb49f6dc6014da3ecd5e245d7","pregenerated/bsaes-armv7-ios32.S":"404abf267dbe5a7c5654af6073bb2644535e4280d18bb3934665d47033c41848","pregenerated/bsaes-armv7-linux32.S":"829fc5a382da5a48deb4067fa91ebe94a34bc626f88db80b03f8a9cbf7109bff","pregenerated/chacha-armv4-ios32.S":"ba4c729adc67d7a2299ecd4c47cce27d451bc41c6c4207d31deadbbd10fb6ff3","pregenerated/chacha-armv4-linux32.S":"a3e1a500630d115cfc90146085264e52a4d353a5219bd2e5ddf29629d6e54a79","pregenerated/chacha-armv8-ios64.S":"772f02153068af213a9e62d8c8899ce3ccd42db29a660d20532fd2e12de5213c","pregenerated/chacha-armv8-linux64.S":"861c6bc4c98ee87ff878a4ddd275ffa1f813bba2aa877155b7b50af666bda509","pregenerated/chacha-x86-elf.S":"967c527546a8286b8cfc707992db8208c473835d446f98070b7c0ea78f2929d0","pregenerated/chacha-x86-macosx.S":"5e2f5071e7dcc62ab2e1ef3ccc4b2bf3d5c3645a08a31045007a0c52bc45a11a","pregenerated/chacha-x86-win32n.obj":"41da22f4f48c94402bf0b919dab7f3a09c10561c18a8ede761a8686d98e6c080","pregenerated/chacha-x86_64-elf.S":"02ae07f9de15a0cb603f22cd6c28e807bd91187aff8c74984afc33dcb45258c1","pregenerated/chacha-x86_64-macosx.S":"8267602ae4564e5748b285ba6aee2add9300c2d6cbebe498c06222634913f632","pregenerated/chacha-x86_64-nasm.obj":"69da72aeb5ff364dc8b8158dfe8e74146a4ab7f854781e073fed076f03e763fa","pregenerated/ecp_nistz256-armv4-ios32.S":"7ae6270a92c6db9a2903cc170e5ef1fa6caef3c5e714425ad4787b08acdb6956","pregenerated/ecp_nistz256-armv4-linux32.S":"3cc2210827b822d93e53f21b0c0320f7e1995fa850608d0080b406a1a3ecd901","pregenerated/ecp_nistz256-armv8-ios64.S":"a1eba8b2cb8329bb1460920ad8c11a4d39c46730cd82b8d885f2d136adb92954","pregenerated/ecp_nistz256-armv8-linux64.S":"366b8a55b901e0d994b669a8a7dd6ab83b1d13fcaa5421252a5a76597c201121","pregenerated/ecp_nistz256-x86-elf.S":"0637df02d673aa92e4edd38c46839ed6c7821cd4fc89bc02e1c508c087cd9ba2","pregenerated/ecp_nistz256-x86-macosx.S":"c38c2396d228c952e30ebb9b7251405e7880ae16440fccdaa86efc26cdb2a1dd","pregenerated/ecp_nistz256-x86-win32n.obj":"234b3df4dcf9a655641f15690be9ab15174919b558be3b6a8cd60d221335147e","pregenerated/ghash-armv4-ios32.S":"014bf7d418bb7b7e030885b32cd61877e4106928ccb6f0fd33de88ed2e465429","pregenerated/ghash-armv4-linux32.S":"2067ea82a959f0765555486421f1dc9b870f87ff63affa00a0b40155d194106c","pregenerated/ghash-x86-elf.S":"07f69a40972df42e35dbfe264cf888bdeddf12b3d67e46fcc1a0912e647fe32a","pregenerated/ghash-x86-macosx.S":"0e1bd58308d6561393e5afb73a6f60c3aeebdb65286567fcc1056f15871b4861","pregenerated/ghash-x86-win32n.obj":"a5244ea28f7e8e55eb50489599228c3e11201540d3f3ebe11e0742b8c83baff6","pregenerated/ghash-x86_64-elf.S":"35cf055b04ea70c2a1d3a2b7a317f53a24d7e0f3adbb4300b97007b3251e1b92","pregenerated/ghash-x86_64-macosx.S":"d981a50bce4855f6d75d65727c67edbfaa750c1159fda566aeb2848e5b1b55ff","pregenerated/ghash-x86_64-nasm.obj":"e1243e64e022e49d30d55ed4a0f64c1f69e9e4396267659082f2752115bcce1e","pregenerated/ghashv8-armx-ios32.S":"ec3fc65980bf87da05810ded052dda0c8e618a1f701d4e395d1e8c3bb8fd5889","pregenerated/ghashv8-armx-ios64.S":"f35ef78af951e00eb58149f76196b5adcdd43281475eba53453507456b36fc84","pregenerated/ghashv8-armx-linux32.S":"115a80523da63d40118c2b1cb5b90923e4c728a6f47a2349225c5bf5d31f077d","pregenerated/ghashv8-armx-linux64.S":"5af1f0b5ad4b2fa90513af464253ae4e085068dbc6af946a3a7f64fdbe307db8","pregenerated/p256-x86_64-asm-elf.S":"dbb349dfeb60bd7c031b5e2d3ab82a94ca8fcfeab6db0170025beff1a2ac7d67","pregenerated/p256-x86_64-asm-macosx.S":"1bed415a3f002f1fb9e0704416b317a43554e427286f92fedfd431fdd6b484c4","pregenerated/p256-x86_64-asm-nasm.obj":"3404abd25bafae4ce825f323b8b14fa768e13f35d910be5367cfe49bc7c62aa5","pregenerated/poly1305-armv4-ios32.S":"4288cd6a682a62ca6bc6fd4fa21ab2c7373c32c9005e2c7203806c29ff13586b","pregenerated/poly1305-armv4-linux32.S":"677a4a6dbc997d62e88d6951ab2a0efc9a2b253fe2c4418541cad5b347f75f5a","pregenerated/poly1305-armv8-ios64.S":"580102422eb14f37128d772150d28b4dc2d0751e5f3d250b250cac46e99dd662","pregenerated/poly1305-armv8-linux64.S":"58f0d37ecec9bbbd467f3086a318173b426155ae68a64f644b759938c956a2c9","pregenerated/poly1305-x86-elf.S":"93450ce7acb252e01414bb3b722765cdba57a9ece9414e8c89d882d339a7521e","pregenerated/poly1305-x86-macosx.S":"e80d43e8f4970e3b29f98e673d4144391a82dc480187c70effd78407b3d2fc34","pregenerated/poly1305-x86-win32n.obj":"410359eecb69de832dd49f279cb1049b13ca6cf901054fa8dab1c176a28014d5","pregenerated/poly1305-x86_64-elf.S":"6bddae35d68af8e79f7808b0120f4da4ee0925937f62f9e5f6410c32598fa464","pregenerated/poly1305-x86_64-macosx.S":"38d507b81739912a0d48c60de7023a089dad43eb86dcced6a0b87a12d1cb9c92","pregenerated/poly1305-x86_64-nasm.obj":"7e279f04063e082a97f6368cfe312ff2144366cefa84da8bfe6eeb10d80b25be","pregenerated/sha256-586-elf.S":"6597654ea92ba427e36f29c83fd3d3fbb382a404abb3e3bef71b14a3555ac137","pregenerated/sha256-586-macosx.S":"85eab88fe377adc470d04c2b0528d5f26b821788f1929008e6ac250526940c7a","pregenerated/sha256-586-win32n.obj":"097fc3ee037a72b9487f97c76e9f642497da923e83bf47f3e35706cf7b785600","pregenerated/sha256-armv4-ios32.S":"fc6c163ebaa9e4d38e1b08c41b601a92d798cff4736edac606fba9bf49e38b87","pregenerated/sha256-armv4-linux32.S":"dd793ff66f2dae5b390e3cd34893d178e0bb7f6ef18353911601f284bd1c868d","pregenerated/sha256-armv8-ios64.S":"e6cbd98d0266a53bf4858694c549efeeefcf545388d2bd342f34c24a470ea9cd","pregenerated/sha256-armv8-linux64.S":"19a5751954bd142f1d45c1773c9e61505025414829f5f0c1109cc86f3df924e8","pregenerated/sha256-x86_64-elf.S":"0c21b7659537a0fffa684f460c92c2117304b097e20701725b0309b9ed8b575a","pregenerated/sha256-x86_64-macosx.S":"f08bc11e30b778ed0ef065b60b8d0e2871fcf08fabfec375eecaf653f9e4d03a","pregenerated/sha256-x86_64-nasm.obj":"292d7bd7119a7455c13138bd7410f2ac0db58eefbf71323dad985ed85b7bdad0","pregenerated/sha512-586-elf.S":"97c5b9ac0596c58e76e6a72e4549fe00c10ba1f607103b91edd81a43016c1746","pregenerated/sha512-586-macosx.S":"ea4a8a89a4d68e5bc7e026a653b67c6e0c3539176f90705458e85e3894497aa3","pregenerated/sha512-586-win32n.obj":"0d52f08c4c88ec72b66bcd9a32403e8d5c0a73788ed3abefbff033d23e16ea51","pregenerated/sha512-armv4-ios32.S":"ef8af43bb96db4c3900c844ae3c30efa2144d8d01ceb7c9c551cc17063a4f37f","pregenerated/sha512-armv4-linux32.S":"100f3450012b3011b4f76aaf5c0c9d329d461f990e50fbefb36325da27f426c4","pregenerated/sha512-armv8-ios64.S":"727d125b1b7c6d7d9ca9022f8e22d5a81f5c5c29231cbdc8429b9e9c79f84612","pregenerated/sha512-armv8-linux64.S":"a3b012b53884f36a6a98fda1485cbbc10a4eef3815aa2fef2db48ca1ef33fb20","pregenerated/sha512-x86_64-elf.S":"6d4fc6c7ac0953fb0d5bcb8d35443e360c5333c26951c204743b80a711c50f5b","pregenerated/sha512-x86_64-macosx.S":"26694e275333099f32d854488473ca91d4eae0d7a4abb6fbe34579b4a3a8d1f8","pregenerated/sha512-x86_64-nasm.obj":"a044272b6f422f0b883acbf0b5024a18212fe375558cf900dea138f669b00942","pregenerated/tmp/aes-586-win32n.asm":"1af1558e639f10fffbacb7fe3ff9ececa365d58c310a33ed6eca26fcfc1a1f22","pregenerated/tmp/aes-x86_64-nasm.asm":"eb481cbf35144dcfda3a1ff0ec1397464480188ca676d7dfd896386b41d6fba6","pregenerated/tmp/aesni-gcm-x86_64-nasm.asm":"cbb0552dc5c461b55e188554bbfc65cc617352e412437f1b82a2cfb272ee64c9","pregenerated/tmp/aesni-x86-win32n.asm":"5f79203b4670ddf4c780960dac8854085f4aacdd2315928840ba24def950ca3e","pregenerated/tmp/aesni-x86_64-nasm.asm":"ad0b5749b28081687532dc64936c991d21b61681c418aa9069838d558a0a023a","pregenerated/tmp/chacha-x86-win32n.asm":"7518ec6d94d27670f8f0ae40842776db7b97251996ea5a15936f389191cc8a63","pregenerated/tmp/chacha-x86_64-nasm.asm":"6dd69849887d8244563b51138be45d64e96126d346191859ee0c07b50ecf3a1c","pregenerated/tmp/ecp_nistz256-x86-win32n.asm":"58d048d40696999d4be9e9423107bfca7ba32e72a8d4d688512e1206760dac85","pregenerated/tmp/ghash-x86-win32n.asm":"a05e4e986d1c13418d10e1ba58f5dfd8e2863503aac199a991981293a8e8dc08","pregenerated/tmp/ghash-x86_64-nasm.asm":"6303a2dd25cacac88f6e8bdd4ab257bdda98627419e8cbb78d7bd7450ab224fa","pregenerated/tmp/p256-x86_64-asm-nasm.asm":"e5879444025354d636b73f4bde92949e99ed451766fcc91a8d5c399d4a9de016","pregenerated/tmp/poly1305-x86-win32n.asm":"dd0a2397d15873b5f12dce1aa54205c7a0edb3aaa0be2b0f0676aa6aac6be87b","pregenerated/tmp/poly1305-x86_64-nasm.asm":"36e27b7690d658ca2977eeb5a4522766b2100410b8fad1818c94c5b2080ed956","pregenerated/tmp/sha256-586-win32n.asm":"bc24c8123100377d1141ba246f808764ab6702ab8b81e7d39776e09183b0ee2a","pregenerated/tmp/sha256-x86_64-nasm.asm":"593fb0095950fcd900c81506c75007f215ce7a6f42ecc6c0c406f0ca72567130","pregenerated/tmp/sha512-586-win32n.asm":"11ae55b1507b0f6bab9c02469b5b0fa3c28e2f0b344713042d7301bbe21e8e19","pregenerated/tmp/sha512-x86_64-nasm.asm":"2c1193ead520148b2b3daccdcf8f2eed5fca2c61f3d0816c8b3255960b065739","pregenerated/tmp/vpaes-x86-win32n.asm":"a1795a27e3549fdd69fb970ac30b9f414f6a9eac666de5995d48f7d3ac2351f8","pregenerated/tmp/vpaes-x86_64-nasm.asm":"c2e653835f0a28d99813cf6caeaf030f25fad3b23df7ab257848f33274fa25a1","pregenerated/tmp/x86-mont-win32n.asm":"a8ec86cd7fb43b7a96a817bc54b8885353974c4eca5aceab45cbdf2ad8af4133","pregenerated/tmp/x86_64-mont-nasm.asm":"a1d5a0548380eee1f618a7175821d409901862da7a8ab3adca0291285cede53a","pregenerated/tmp/x86_64-mont5-nasm.asm":"99d1ea3eebfacc3f11beb3787a526658f83735c266def879fdd8ed57022340fe","pregenerated/vpaes-x86-elf.S":"2a6e86db7140e49cbb6abe304554f1ef4383dc48c451d27cbdec96c0015f4609","pregenerated/vpaes-x86-macosx.S":"d3d44014c63249fcf020a88a7463060d033ddb3e1b1c2d08945c45bfbbe05a36","pregenerated/vpaes-x86-win32n.obj":"0cf50973daa1e899b9054f6b9c4bcbf8a548a137fa5134025be179390592f1dd","pregenerated/vpaes-x86_64-elf.S":"592174da3c8d5a79fbbb915968bd44a78701c3c04df5831ff491b3fcd3523c2e","pregenerated/vpaes-x86_64-macosx.S":"dd27dcbd3b689b3d5e5e06a408efe169cbfe6f5554a1a48f79412258b3b779c6","pregenerated/vpaes-x86_64-nasm.obj":"bdb24f9ec8a3bbe432a0edad79c67db2ca6ab81ba7ecb52b58877664c4193298","pregenerated/x86-mont-elf.S":"6d8f2899d07d94e31025af13482983fc7087bde45e3c8a237c2878a28cc54b96","pregenerated/x86-mont-macosx.S":"7d85116fc8a29c64215166fb2c44566dc7c1b31048a635605f4fd8fcbaea3459","pregenerated/x86-mont-win32n.obj":"316263efda24c2549d742354b56a2b23abe02cfa65b0ed14eec710614ec21440","pregenerated/x86_64-mont-elf.S":"67ac57ec1c335cf16580b550826f56fd7e3ccb1bd2e52a845595f9ee44c98f45","pregenerated/x86_64-mont-macosx.S":"191c8e8dc9e8dfd07f3cf9e52e8bd18a8209cf25f648ba0e1c7f724307830377","pregenerated/x86_64-mont-nasm.obj":"522c6fa22c3f7a663337175f0e380ee34e39559b675f484b8761c13e664eb5d6","pregenerated/x86_64-mont5-elf.S":"2b7d8e6f395e6dfd5b85149ebc729674c8f29f2ba82e67693042ea111c0a0c0f","pregenerated/x86_64-mont5-macosx.S":"c79f3e15ab0b1f2ee14ee8dc058031810d20ed497faba1cb10412523e809d483","pregenerated/x86_64-mont5-nasm.obj":"57a235b25afbf0d1c5b37831a326b47c122d0dc87356d4ff00632338c9b9bebf","src/aead.rs":"5664b919c2a9384704d89ac223778682928395403fe189e559350937cccb05af","src/aead/aes.rs":"c489d02902c45c694e01882a8bb7576d9bb7c4a7efcb294b358d32adb458384b","src/aead/aes_gcm.rs":"9d2b62c8a884dc81a36c278e91cddf32cac05712e786557f8e4d0005b02921ff","src/aead/aes_tests.txt":"4ae334ed8c34c0cef24c22b73568faec906a39e26a428e4cd6fe4f810cc51fb0","src/aead/block.rs":"50e29c11dc8a0713ec0705f100f52d02e80a5909c0929be9217409ed692fb994","src/aead/chacha.rs":"61d0b24e9e27551eb05598ddeac0dc979e1c5c1c7b7e888920d7cfaebab4cba1","src/aead/chacha20_poly1305.rs":"3384a06f32395255d47730f2c66a82fff30ff91bdcc7529ca4b8a5b26db590c5","src/aead/chacha20_poly1305_openssh.rs":"538789d0f7367028c9474080db000f473b6f916ab26c02783a6c335accf0a91d","src/aead/chacha_tests.txt":"6ed1303cef7a0ffa30cc76f9933509a2d952a334b80c731d52d32c6ef3b37042","src/aead/gcm.rs":"a1f25af33f8ab42b6a7833f7dcd064ca584297fbe09ac417d6d2a155514b2d0c","src/aead/nonce.rs":"3a72654293072cecceabdc2d9c29d35fe1d3b70aa9c6a9a121f85967326988e2","src/aead/poly1305.rs":"e018f035414edc2dfcaf18d1a9d67f7f3e5e16e3b54840325f8afac5dae5e09d","src/aead/poly1305_test.txt":"89be1be8e403e5a17845f0603e19337604f1f278c7b283de2c7227ef6041491f","src/aead/quic.rs":"a3fbd28960f378d8b453cf266ded1e3b7d901a90e518dfa4fe4b37125b5a33c0","src/aead/shift.rs":"13baa522a61d202f3d398af2ba508f1cdc8c173e7cc1caa725b4e81efc6b2368","src/agreement.rs":"d36109df69b5f33bebb17380ca044fdc523f41b520a8bbf96e678d9899cc922a","src/arithmetic.rs":"4154c5a049a6bc602985170a292f6f16c1728abffcbaf0cf461da228022f1f2d","src/arithmetic/montgomery.rs":"adb7d8e3bb058fcbab6911967d62cf2e2b2ffc9fa165cc8da0de984fe6eab5d2","src/bits.rs":"c59d4f351eef85ea1361c2477c76fae56896a0dd4c54178ad856f4e6b22cc5a2","src/bssl.rs":"e1c8b40f68c91da5f59b81d3d55d26822ef3bf6fc7fa2c3818cc97be0956d1f3","src/c.rs":"4c74177dd9ed4298270bcfd71355d0f41ea3bce74d3deda267c9cbf704184c49","src/constant_time.rs":"2d76e72ad06e65de8ae060607759b7b618ccdd0b4b1a94c227c9af2b402008ff","src/cpu.rs":"9685d194a8187d98ad76113d127f73eb99051088e2705bae439b3f69f78465ad","src/data/alg-rsa-encryption.der":"7bc023427767a2f2e156f8ae030d06d19f862e326b952116649b423c3ff7110e","src/debug.rs":"791483943c68a663f1cb8ca5b22ed0d2dc9af1023f2709efc1c935b830b5a898","src/digest.rs":"acba858d0baaadbcc6995700e6d08f3c98e04af99a5e373f4579e43946b743eb","src/digest/sha1.rs":"5bd500e8b688e1758c24b324985e56f70b5f0a6a7c6917cd13a6d44804884000","src/ec.rs":"c80a72f653eed85fd73cf575d1d9146d99e2b574f18da79e0596dcc4800f53be","src/ec/curve25519.rs":"9758e50247f0f325332ccf70245ce7745cbc21a01de39590e2babd6dd185451c","src/ec/curve25519/ed25519.rs":"5dcee3ebc59b65d444b162b6832a51f501c37bef8f16945c220ec7e0e157b8d5","src/ec/curve25519/ed25519/digest.rs":"6bf6c446b145d0caaf45398c4fe8574df7e974e89a9155d87d4a0798716f79a2","src/ec/curve25519/ed25519/ed25519_pkcs8_v2_template.der":"1bd2db034b5160de343688ff570db3da6a5bbfc66f9f2dd015f0902e2d2b7e34","src/ec/curve25519/ed25519/signing.rs":"3d437cac44a078353b093eab45589e7c48c13287dba647963b23203ba21ac0e2","src/ec/curve25519/ed25519/verification.rs":"457d060b4c97d6ac2442fdbd9fb4ddfe29c3ce8075567bc0e1b5ec5d1c5ac544","src/ec/curve25519/ops.rs":"e8c18066815c98c16569bd15d62d52191262b413c299aefdf2543a4ec45addf8","src/ec/curve25519/x25519.rs":"a2a63b7572e1d61e416716ec47697d77356ed1a8c63a2398b9cea7a398d7f820","src/ec/keys.rs":"8a90171fe14ba36cc1033ca8b61761f61488098e8d0f5c0b810a882859046f65","src/ec/suite_b.rs":"11507c0ddd8b67342c0868b64a723eb06ec5f106194274ac949982bb7a7f2ef5","src/ec/suite_b/curve.rs":"9ee3168fe44e427bb8862c680d9975f207ce3d7aa90dacfac5163dfc8e107ec6","src/ec/suite_b/ecdh.rs":"de9a999cf304ea4b92322eb094d43d5feba99a9167c7c46da1d78be420aa9a9c","src/ec/suite_b/ecdsa.rs":"013e0d2d2a21eb437253b03a1f6a1a4ba8c45eb1c2ea1396696bdd04a8ed2932","src/ec/suite_b/ecdsa/digest_scalar.rs":"d69e86e71b96ee40eda4a3a522b379bff71e6de5b78a24e559b2da900b3917f0","src/ec/suite_b/ecdsa/ecPublicKey_p256_pkcs8_v1_template.der":"5a2207da0199ebe3e2a80e15e7692b21f215f855ed3bd2c51f466c7969e11990","src/ec/suite_b/ecdsa/ecPublicKey_p384_pkcs8_v1_template.der":"5ec14cd6aac17cec849382ee5e2077497f98ce435d7aee2116cd092bf84f5556","src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt":"7f38872c3acbd5d156783de92f3671062101af3cc496c1b261165971b3eea2ee","src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt":"ab92cd110846b42d7738374d25734cff6459467f40121c4e7fda5b31bee651e2","src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt":"c471d314f18270c79141062d5964d84fbe38c1bb9559ca217f3511d34fc4af25","src/ec/suite_b/ecdsa/signing.rs":"b6d566294b7431b8a4c3b4a155e9cbf2b271fd89ccbb1e054dd9959fab73ee33","src/ec/suite_b/ecdsa/verification.rs":"7381235fa8976e8a3b9676bf9a8897174f343c4a6c7a386ac5cd0cbab1a3f43e","src/ec/suite_b/ops.rs":"9cd1dd318b0804310466a5b99dcb36b8099ae49d0d5dbed3bab149cafdea69f7","src/ec/suite_b/ops/elem.rs":"15c18d85f2e8df996604ac24392ac09a27f0530bbe524f8f6a1a7e0933435d28","src/ec/suite_b/ops/p256.rs":"64d76c820bb33e62c5f7e76023f8bc2f920f5559ef17ff590cd251da2a6784ff","src/ec/suite_b/ops/p256_elem_mul_tests.txt":"02e7a991d6643a81229f462d21ea72f0503c038d783583c83ad7f118952ecf0b","src/ec/suite_b/ops/p256_elem_neg_tests.txt":"b61eb959dd473bd8edbc4566f18be0ac9f483be9e7d0900f48eb764454475807","src/ec/suite_b/ops/p256_elem_sum_tests.txt":"2fbbc13100065539bce71e83d642878a90103b5ca3d9b8d3c321db15a0c05c9e","src/ec/suite_b/ops/p256_point_double_tests.txt":"34a5968bb40320c6cc0f7d248951376823d46c0aab1fc7ba59311bc1cfd34417","src/ec/suite_b/ops/p256_point_mul_base_tests.txt":"f207084da07de3f63b7563b07994915dc770e2b7d5dfe41881b2ffe875ad69d7","src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt":"f3c8061e0f891441de35e80869c253c65fea2ed1dd4f9be7a444c956211d32ae","src/ec/suite_b/ops/p256_point_mul_tests.txt":"894e02359b562f3d74757f4d8fdd20c5fc5528634f5922ce01d9546910e0b0b9","src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt":"c2a178ad0371ff7dcf15364edbbb5cd0e82478d7e1037a6d3b2243204465f918","src/ec/suite_b/ops/p256_point_sum_tests.txt":"1ede1f508c673890e2f48ba53309397a17a02f13370aac114f34ea0c3c4f4617","src/ec/suite_b/ops/p256_scalar_mul_tests.txt":"6fa09fc69c9962c31f090ffc747d4cafe184429b8e0acad3adda7b14ac26a4ef","src/ec/suite_b/ops/p256_scalar_square_tests.txt":"19633fcefdf8af6685fa9750a96c17478e282972ee7ffbf4c4303229f7938db3","src/ec/suite_b/ops/p384.rs":"2441cf2a255bf24e0dcbc81ace0baf8b65c23256e57ec98d8bde4279ca031896","src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt":"8c4d02994577c8b6ec3a83158fe20ce92366052ddff349b02bad4595847be8cc","src/ec/suite_b/ops/p384_elem_mul_tests.txt":"acf37680470a3574acfe64cb3629186d1f29bc8e905c5d9c1e40a2c2bde2701d","src/ec/suite_b/ops/p384_elem_neg_tests.txt":"08986c5fb0b8adfd3be6ba217ee68308c5e452dba086d92793e0ce3383c1acaa","src/ec/suite_b/ops/p384_elem_sum_tests.txt":"48850b24fca0487a875379b6de77879f97578f50111c11a12e8d789f6c8f0ab4","src/ec/suite_b/ops/p384_point_double_tests.txt":"6d25547058f40d98ef3c2a1957fb72a57f4fb19623c28dda92b42b7adc93bc9a","src/ec/suite_b/ops/p384_point_mul_base_tests.txt":"4995baf7080a6a4d72de1d262300c4ee49d0449034e1250f87bb15fadb78408f","src/ec/suite_b/ops/p384_point_mul_tests.txt":"2fa85969ab080e6f977ed92abbe29f6f5f0658e5ee126834769673ff557efbd0","src/ec/suite_b/ops/p384_point_sum_tests.txt":"5cbdf15ce4a56a952b85046e49cd0fc4ee22d516d914ab48c19b7801864bd352","src/ec/suite_b/ops/p384_scalar_mul_tests.txt":"f88e82363d7a1eb4fd687bd54dec6cb05e2796e751f39b5c774c11af0569bea5","src/ec/suite_b/private_key.rs":"a8e8d11d9390ed25a2ef9495d6f657adbff662a4c25cbd303a54a09ef632ca4e","src/ec/suite_b/public_key.rs":"9cdcb54a9431dfc04289c9298f47873a53b2ec95f11724d8ba956da009c2b31f","src/ec/suite_b/suite_b_public_key_tests.txt":"392bcb543cf69cbab5252792a8dfe09ffa3421cb27d65cdafe9771bd68d49a5d","src/endian.rs":"2432a71b890cf7d1f1e0f7fcdb418cd398c5d2753d1a85e007bc5cc24c3ab17a","src/error.rs":"8a984e5922f5c24d0b25bce3d7ba34962bedfc0afce3b061ae610fcd4547d75c","src/hkdf.rs":"8585d8cbf0af7209cb39360e0a04d9c785a86b0feb3a1a40e75e70e6e6209ac4","src/hmac.rs":"e769df52776ec61e4b835af327664c2b45aaece69633cd5e06b5f14f0e9806c2","src/hmac_generate_serializable_tests.txt":"d9fad4aa957496eb05dd67d97699631bd428de8a5be6e29aeb82b732eae97a59","src/io.rs":"05efb92ff58e8e5f47195a8b63ce460fac6193be31cd5a2cd8549b528e530e19","src/io/der.rs":"b2044554d24eb12ea386350cbc69380077220504f660aa510f49bcab899ee40f","src/io/der_writer.rs":"af1c41c0eb55266887a657a65bb731a9b04403e2e78d96cd0d376fcd7ff92902","src/io/writer.rs":"184e6954df087ace08061de72bca561ac10f94e420461a5934adf69ce8bf931e","src/lib.rs":"98309a7452a0a6ca571be61ee3709dfb54effd0468b84bd46dcd29aad06b5966","src/limb.rs":"9f6bc7487b5833ed759b6d0191b352a92e5ea66119e6f574649fb2abe20740ff","src/pbkdf2.rs":"67d19dc309626dfbc097ffbfd354203e4411040a8111405460030528ddca4db8","src/pkcs8.rs":"6d201c861ca780dc95958e0da46415389f5c56035e0ac13323b0894ba2c8061b","src/polyfill.rs":"aa9cd611f9d76bc4a66c2783883f50174f2d0898e6614221b51c252fed6dd3d9","src/polyfill/convert.rs":"61cf8e869bf2d87b225b1dc1f9b6b210bcaad5f145003c35f236de639f539e73","src/rand.rs":"3467f5223ebfc255596c5f37dd76d937b4511ad60664a45efce0806cfaccccf3","src/rsa.rs":"1e40518715c1aa20fa2cf36b1de0acecdabe5bd8f2b391ed0aefb5161b4ba95a","src/rsa/bigint.rs":"4b2fb772e31c8515c315a62aca2542285d58a126d44aa42933e3cc50e42292b1","src/rsa/bigint_elem_exp_consttime_tests.txt":"5f84de732433df1e0db3b3eb690bdb0cc1a735bdc7e60a8218d5910e9d9ac436","src/rsa/bigint_elem_exp_vartime_tests.txt":"6501c58fa66083ceb7dffe14a0191cd6a2d74a96aafeb72d828841844a37f409","src/rsa/bigint_elem_mul_tests.txt":"0de8d667f4bae0648607cff2c53df81a6b2ccddb8ee620593350255b36de0e91","src/rsa/bigint_elem_reduced_once_tests.txt":"7b4aea41259ffa329d669843d6dbf29a5ba56d845210bbf4b0a2ccafbe8d8c01","src/rsa/bigint_elem_reduced_tests.txt":"7c5dd25b495b89bab09e8f09cbbecf34aa28ee7eb2ed592bad50ab63e5b17ebe","src/rsa/bigint_elem_squared_tests.txt":"0517a5446667fd49d198a89fd93f19d9870fd3fddad3371ad9aa8075b6020e22","src/rsa/convert_nist_rsa_test_vectors.py":"c670a7d9761667c46a9b204848c74ed8cb5ba723e3f5b92b081e94e4601c55fa","src/rsa/padding.rs":"12121a579eb155b512cca4562dd59420149626b738fadc436f61d3942a23d2b5","src/rsa/rsa_pss_padding_tests.txt":"1b68a294521e983a4a35fd7ad4e5823d6173641ad63d736b3b8e6e867f748ea8","src/rsa/signature_rsa_example_private_key.der":"5344d57f719a98c4464aed1d1c2fa569f0a9de8621c6fdec7d28923a0e1c662c","src/rsa/signature_rsa_example_public_key.der":"28b0a357936485bd2a7776321cccfe17c2347f2bb75751ddf9dfc6429cacb6f1","src/rsa/signing.rs":"4a5237d5f6c9d2d48da89f594a3d325ee086663e67297f5af933589142730161","src/rsa/verification.rs":"aa1bca3691214f67125fa1e01cdf992d563b77dc0acae59bea4abffbf56245df","src/signature.rs":"4d57c953a79b9928602c2c1c0fd148003716a3fdcf77429561e19820dc0a0253","src/test.rs":"45e3503100146029952195a5515314248e5e731015757ab7b5e5400b9eb25ebf","src/test_1_syntax_error_tests.txt":"c6e72aaee3817e145fea114020193c5b3acbbd2f3a97614f1c2670822f1ac6f1","src/test_1_tests.txt":"1014aec056f9a06eb23983e61eb6dae8384ee982f4eb0c5be002fb5d6ce10f99","src/test_3_tests.txt":"e489a2da5f486e75cd6e2cf7089f09d6ddf61a8765fd58c47bc79ad32be77e13","tests/aead_aes_128_gcm_tests.txt":"2e88612cf3d767626f62d59d81652fef5611f4418bf56016c12ac0bc26a12a20","tests/aead_aes_256_gcm_tests.txt":"c21fab30c0098cddef658908ca2820d656c4717d24d79ef3dd68251695972040","tests/aead_chacha20_poly1305_openssh_tests.txt":"85a012f4b6bc9b7ca5af861179ce832ea93e4a175b604be781bd1fdd9accc24e","tests/aead_chacha20_poly1305_tests.txt":"3688abbd7b1d87c9200b627c289a2bebf763f512baadf536cd72cc8f3ce80fe5","tests/aead_tests.rs":"5f7804c81338d50959d2c0f2f2dff647437d18bcd56ec1c7170abe264467d938","tests/agreement_tests.rs":"a7cf8bb3628ee81b978ef074852b0d947dff98afafa8d317777bc7183b563928","tests/agreement_tests.txt":"4b784d203e87f9de0678df00ac1b2a28db169f680a3333e9d773656fcebceea9","tests/digest_tests.rs":"0385f3d62ea368828d6d4f71765e744034de25a651f9c99528d7650e81a40d22","tests/digest_tests.txt":"dd817794e2ba72ed637805e225240a295ae7b4cbea956dcd23c4752da67a394c","tests/ecdsa_from_pkcs8_tests.txt":"8880710ed78fea954b23f7adda6189b599307f22ba5c24b44f8ca9f00e9bbb6c","tests/ecdsa_test_private_key_p256.p8":"d56f99994233d749d03315f5cb9797fad81d3e25f962d2cd543d4dfe7cdd1389","tests/ecdsa_test_public_key_p256.der":"93c930878dc29d802b151bf492a2f00672b2240b740002a650ccb706664d10c9","tests/ecdsa_test_public_key_p256_debug.txt":"ccce94ab37a5e5286f0e5f1934bdeb39539e8f72bc7ccd0a1f666c9a1abc0bdb","tests/ecdsa_tests.rs":"f08d743a6d901c2ebd3005b9d297c267fa308ea678403bcfd23651df87d2e81d","tests/ecdsa_verify_asn1_tests.txt":"4ae6325e0a1fdf4cd6fd2f299a7fb7a60927d0775b63aa9b027676fa76f3ee6d","tests/ecdsa_verify_fixed_tests.txt":"837f116fca066cb181677e389cf92b684d15ed883189b4544538cb5387e6b742","tests/ed25519_from_pkcs8_tests.txt":"4312701b6fbc57992598a4db50b0bf9bcc1df91004901f43e30982ba85d9d466","tests/ed25519_from_pkcs8_unchecked_tests.txt":"e2a7a54c8ea31b87bb5357a002f6f4c11b50ad5050681aaed91a375ef58c239b","tests/ed25519_test_private_key.bin":"644d50ab64864c20a12b3c4656d46b4a48f69ef7c47ecdc8415cd28316b22ef5","tests/ed25519_test_private_key.p8":"13e11da834fecc6aed04d8ff36a0301a5fb8187c86f5ab0f9cde434eda6762fe","tests/ed25519_test_public_key.bin":"21fe31dfa154a261626bf854046fd2271b7bed4b6abe45aa58877ef47f9721b9","tests/ed25519_test_public_key.der":"119e5ed7b8533bdf24897f07fe4dd57671a64f8d10534ba128c9bb016af86484","tests/ed25519_tests.rs":"555756ed48e5f4d6662f89b398d1b97a5b4bddf8e9e5479961e15468d48318b6","tests/ed25519_tests.txt":"f99c7e7bf7cbbd7df936ca883ca0cb293c31ad37c03597890fdb07dc1c923d36","tests/hkdf_tests.rs":"533e99caa17d466ea664f61a5d77fe3cf1e0a0dc2e09633f710686dcf8e66f8a","tests/hkdf_tests.txt":"516a19799fa940c72dca68d8cc92ec605b46aa71590cf1b827468a58a01da574","tests/hmac_tests.rs":"e478ba32daa0a47652515e31fbc37877fcc29c4ce3e78f254684b848c869eec2","tests/hmac_tests.txt":"272c143921789a66d39396843c2fa0aadbdfe26d061bd2b7836ec40dfc76e09e","tests/pbkdf2_tests.rs":"37f10f2121d9e5811b3255e8c7e53fb5f3c09f3f2caa9bf12e7af308f287ae21","tests/pbkdf2_tests.txt":"db65f42fb72cec9ca89c8c071d11c341f67c4df5e0c66a70735da5d1d370cee3","tests/quic_aes_128_tests.txt":"786f989f301ca97b17e3a62e1dd5d9562baf0f3081f59de5e34fcc4d9e8d9580","tests/quic_aes_256_tests.txt":"63540293d9b95e67aa9cdb7effdb5d40f977ec6a527490ce7b32592debac0428","tests/quic_chacha20_tests.txt":"b0c2abc90ecbb0146fa812c33641ad643380189429bb9e7c7db1b32d3363c67a","tests/quic_tests.rs":"e343eb1b8409c0364d3aa3f32f86f4eed7dec54839f179b0561a15dccbd7c39d","tests/rsa_from_pkcs8_tests.txt":"2ccd777cc8014904bb98de0462ee220c0a641f88d67aac489cff0742c9a1bc9f","tests/rsa_pkcs1_sign_tests.txt":"cb202666f2ed100a0ba8ebf818dab1bece055bd9ac9d5533d3f20fdad7b4c509","tests/rsa_pkcs1_verify_tests.txt":"ed8a330181e8a47cc707238e80377a8bd4002f6f8f6d06106c78aa9b59da98cb","tests/rsa_primitive_verify_tests.txt":"68c90857490543bcfb836f3b8644445acfe90a2e4c5189310914ce5484927418","tests/rsa_pss_sign_tests.txt":"aca70cfc877b055c0a29da2a457563cd1b5afe6e932b011e8b9a15d57dbe10d0","tests/rsa_pss_verify_tests.txt":"afcde20cea975ea235d9828bbb9b083f77584a7cb8c5c955e40c4bd305573f4a","tests/rsa_test_private_key_2048.p8":"a0d95a0b133b4c217bc11322b67d62eb13537b8a9f66e20b5c9b5ac31af21859","tests/rsa_test_public_key_2048.der":"7180acb59312d3544c3b36975ae6c4c55f59035ce4de487852cf6c99b33868cd","tests/rsa_test_public_key_2048_debug.txt":"dc471e4ca8c1ef4b57d2ce79c9b9ba25ab9e262ed63a24d2b65cb2d2f3797ffd","tests/rsa_tests.rs":"344675830bf2dbc67e3cbfc335f784d39a7487c2056b3617dfd98a51dc707ba2","tests/signature_tests.rs":"b6e2d33cc5907f2a57397090b749daa3a99157d9568e7153a67c7b9c6ebe1d84","third_party/NIST/SHAVS/SHA1LongMsg.rsp":"c765dbc1609e9046b12f60a5285a88128dab4315080c94ce9f2a57a7b0b980be","third_party/NIST/SHAVS/SHA1Monte.rsp":"d458fa7e39095b4e292a75b0cd224f90b72dc801a63ad2c0d75b8f10d745ab6d","third_party/NIST/SHAVS/SHA1ShortMsg.rsp":"be0991ddc5372932d55804b11713c9140d10435ef4b316a0773e3506eec79cda","third_party/NIST/SHAVS/SHA224LongMsg.rsp":"d37115e5d2286dde969c5e1b2275cd83ecb066366d7a38bb6b2b3adb4a88de89","third_party/NIST/SHAVS/SHA224Monte.rsp":"7854d388666ea3eb01bdaca37dc8ae0bc39d30f8731d9a5487cbd61de47d1d59","third_party/NIST/SHAVS/SHA224ShortMsg.rsp":"0dad6656c08f77252f6ccb789e42284fd61fc53bba30e83162800aa3d2aa939f","third_party/NIST/SHAVS/SHA256LongMsg.rsp":"6fac36f37360bcf74ffcf4465c18e30d6d5a04cc90885b901fc3130c16060974","third_party/NIST/SHAVS/SHA256Monte.rsp":"29ea30c6bb4b84e425fb8c1d731c6bb852dac935825f2bd1143e5d3c4f10bfb9","third_party/NIST/SHAVS/SHA256ShortMsg.rsp":"75e1cb83994638481808e225b9eb0c1ebd0c232d952ac42b61abce6363be283c","third_party/NIST/SHAVS/SHA384LongMsg.rsp":"536171765a4278c000ac3c9913edb2eed0ca7ccd5a10b72ed79fdfe7901a6d6a","third_party/NIST/SHAVS/SHA384Monte.rsp":"4270099431ff52ee1686dc472351e681c26c507433df8f107c7de203b771424e","third_party/NIST/SHAVS/SHA384ShortMsg.rsp":"7ea7bcf00fadc20949fae63703e40681ddf288fea808471cb3cbc95f3ec16811","third_party/NIST/SHAVS/SHA512LongMsg.rsp":"b1f3f05d5c209777954d49521d7ea1349447c36a0c52849e044bc397a27dd410","third_party/NIST/SHAVS/SHA512Monte.rsp":"8ca78659286c2f01667a98fc7accd32fc171ae7b24ac00f1a8ce6b77770247fa","third_party/NIST/SHAVS/SHA512ShortMsg.rsp":"e53a36c03609e5a3e3cc4b6e117a499db7864c23ec825c6cec99503a45f40764","third_party/fiat/LICENSE":"0c125a4dab5ab869473e6491db22f6c0a7f8a4de58588d03bb2b16c0c8ebd7de","third_party/fiat/curve25519.c":"4aa9c3946bc961591a797f44c4d6b62ee8b03998275fbdf075b240773f581ced","third_party/fiat/curve25519_tables.h":"668f3615a9cac425b96619b46de44631976e167f0cfc842ab87844dcd8a5c529","third_party/fiat/internal.h":"cfe41b40e51ca477eda94d07dd521fbb5d3389e77d94a55b058bf60efa0d2aa8","third_party/fiat/make_curve25519_tables.py":"c499f166e8df31f23cf00296b46f7634aaacbb0f48f5bfa0277c27bdf89a619d"},"package":"be5386a5f59e5f5bcaea38b50ad26c09e3918a0abc0610640b3be5cfd85d6894"}
\ No newline at end of file
+{"files":{"Cargo.toml":"62b7159fceb403bc8839a6434c10b8b6c1b570cc8f982c54bc73aa9c518e4c24","LICENSE":"76b39f9b371688eac9d8323f96ee80b3aef5ecbc2217f25377bd4e4a615296a9","build.rs":"3a439ae92e0212afcd2c0fc5b7bd2f09d44476be05a19a9b9f6880301a606cfc","crypto/block.c":"f78b50b1482f00f1ed030fc2e0b325eac5be387a1af6150cb6c8bf359038f54e","crypto/block.h":"ca5fc0e831d6f053811c6c96254d303ea58c48ea875af6d2c6862d3f07971f02","crypto/chacha/asm/chacha-armv4.pl":"4dabdd766dd25711ee6276f7415c3fd654635687aa536617eceb75a8a3ad1189","crypto/chacha/asm/chacha-armv8.pl":"60f4d3a7904fbd2d7c5c98a369c9a540fe4c44b62165032d01574326d5b6f46e","crypto/chacha/asm/chacha-x86.pl":"abbcf8181bd629d8003322dbf2592bf4631abb7895861d7021c451043e39be34","crypto/chacha/asm/chacha-x86_64.pl":"7f38c54bae872a6f6cde85cd13bf061ebcd9372a4d126f66bbe018fb7231d6a4","crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl":"82d31709de6b5e7c633b44eb54f8c92206a44f28fcaa130b6a7f794acd99c11d","crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt":"1a0b201dd8f4aa2106db0de3c26eb0d9623394ec80247867371c20103718b1c0","crypto/cipher_extra/test/aes_256_gcm_siv_tests.txt":"514a978594261e0520b30aac455c8a29c3280cc15701a928a0e8ad7bacfc2c79","crypto/constant_time_test.c":"f753a77612182705f4405a450fe762731f9ea23bf557d739fc9fe55ef56a4be2","crypto/cpu-intel.c":"abc91c05aa072d2966fdb0a61a7da14e1bb2dff8ecbecf3a697d2b138ccceaac","crypto/crypto.c":"998883fac828c4dca68bad69f985ca63d686e9a89f929a79a45a0a432e65d21e","crypto/curve25519/asm/x25519-asm-arm.S":"a6784f13e24bc8db7b3f2088722b04fd6a3382c02eaaa0d652a3ae931a465be9","crypto/fipsmodule/aes/aes.c":"73ac93568696b0951c93553373394281dcd57199bb26a23251fd20a6a87fa3f1","crypto/fipsmodule/aes/asm/aes-586.pl":"c4b671435008c6747c755060900f14f65eb007a16448bc7aa91a3133ce064e8d","crypto/fipsmodule/aes/asm/aes-armv4.pl":"f2aea5fdebbdb093a90d7b42e925ffcfb48509479d0157bdd88f46f33b690ff5","crypto/fipsmodule/aes/asm/aes-x86_64.pl":"d8088bdf4a3c28b0cdf0284bf829bae6dcbe70637c9e79ded33a61572302fa93","crypto/fipsmodule/aes/asm/aesni-x86.pl":"8625210b9588ddb994a53c3babc6f68aa1b7615e572934b2bbf8e5c284e1de4e","crypto/fipsmodule/aes/asm/aesni-x86_64.pl":"97b0a0d9ddac8b972b5fb98e0fd564eb68b3b50dc31180d1af1d6599685d004c","crypto/fipsmodule/aes/asm/aesv8-armx.pl":"eb5b5e4fe4447767b7b95a53c697885f4c20c5a2c82b2f56b48240f7b5a3bcb8","crypto/fipsmodule/aes/asm/bsaes-armv7.pl":"07d795e03b6463ef5ac2d92e554de52bfc32af6f2585b2ed8ea60b61abceb0d3","crypto/fipsmodule/aes/asm/vpaes-x86.pl":"7672ae209b0eb33d0d6856f46c46066a07db4c6534cb678cc2bf329b040575b9","crypto/fipsmodule/aes/asm/vpaes-x86_64.pl":"383e964a9188bfbbdb5f0b53d74c5493ef234194c1eb1b7e2f63504bb3974c9e","crypto/fipsmodule/bn/asm/armv4-mont.pl":"0e6b793c5628ff2d1172969a56a508735150409e4a520bdc7226a0dd1f104240","crypto/fipsmodule/bn/asm/armv8-mont.pl":"a0f9368bcce4d56ec72ebf04a0664c8514a0fa9299aa2d27eec07fc63dcf4d0a","crypto/fipsmodule/bn/asm/x86-mont.pl":"eff867e854ba35bdbe2f884b35e1c6cabb7f4e6b5ffc62d13e3d795285479138","crypto/fipsmodule/bn/asm/x86_64-mont.pl":"240d70d03b632727c71afe0de20478104768290dfbd15023cda2d440de99e3df","crypto/fipsmodule/bn/asm/x86_64-mont5.pl":"729634aecab869465b6f3fba71406bf34603c3fa4a371749cc7228ccb4a728be","crypto/fipsmodule/bn/generic.c":"8427b35e188177a3669a5763d4cd639457391f285b9fa501b788cb21706ff565","crypto/fipsmodule/bn/internal.h":"49c3cb55c4523b8b418dad6c19ad44709833bab6e82cde1fd7295f9d1491efd0","crypto/fipsmodule/bn/montgomery.c":"312cb830ac61d83d02e7afcd46c9a2b4367c46f30792ffb13f9f826aef869ff3","crypto/fipsmodule/bn/montgomery_inv.c":"0781fbab3065777572720df6a8c3ce3e2dd2b731e7c71c35635f94c881eecc82","crypto/fipsmodule/ec/asm/ecp_nistz256-armv4.pl":"f92e6f293af43e439cf41f603ca1c016227912e3ea16d221edc56a467c5ab1e5","crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl":"2338e60bd7a868850ec681fc66e313c92c90727de8f723e83ad72a0d7c553c3f","crypto/fipsmodule/ec/asm/ecp_nistz256-x86.pl":"51be61331792fc0c971eed9d70f15b89a79a0bcc3211f65401d343f5bf794091","crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl":"add0f387e8bb2f40f591eb42da0534f44b771a47a301d8f93a448fdc9d52be83","crypto/fipsmodule/ec/ecp_nistz.c":"f138a4baced1595ea06911bc425f0766b897afb3007437dd7f8c68e9e493e73c","crypto/fipsmodule/ec/ecp_nistz.h":"f9b3176c9a9883721529665583b118a8e859e2b6bbf06077d0d1f7339dce8c65","crypto/fipsmodule/ec/ecp_nistz256.c":"6810068be6b2d28c17bc634349eb1d70cb7be578d9f3aaab7849be179fa9f877","crypto/fipsmodule/ec/ecp_nistz256.h":"0032b44c8a61c6478f8c2c36c1dbbf9789418f509f428419c7a7f6d148674872","crypto/fipsmodule/ec/ecp_nistz256_table.inl":"ccc4126030480c8898832cc7f0ae6c62bf5e16de51a32d16f667fae016699579","crypto/fipsmodule/ec/ecp_nistz384.h":"9fbd1b8a9fdb0514110b441f47618ee781d531e67fc54c38a89671a5160a44b1","crypto/fipsmodule/ec/ecp_nistz384.inl":"f0e4f7f8415f057556da8d3f40e651706bc074ed393e1442f6dbba5232a2ee00","crypto/fipsmodule/ec/gfp_p256.c":"b2d9d6523d02d0adb2ae8230e70a7618e100e6026a82b1dceebda955d4922d0e","crypto/fipsmodule/ec/gfp_p384.c":"ae7c91d6dfc69dd7c47c80169450abce2c5452b6273fea10864c938bd1bad47e","crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt":"a607b74542c3833ab907e74e341c988ed16ee1e4b02c4323887e82c881a6b990","crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl":"b63b0a1c3e9484661a1c1a55a0275cedb8a1148227e4ea60c6aeb4cc6f195d07","crypto/fipsmodule/modes/asm/ghash-armv4.pl":"77408b681c42324691044d98d4ff7f8160a4193cb286ade366279ebf3c581ac2","crypto/fipsmodule/modes/asm/ghash-x86.pl":"d2f2af6cb377d59fe6e6871fe81848d8caa8cbc202578450039d500fc92fd05a","crypto/fipsmodule/modes/asm/ghash-x86_64.pl":"6b9f719b33d7d6fc45b833aad6f5e8c51096628a377c7d0b9836f7cff4f36581","crypto/fipsmodule/modes/asm/ghashv8-armx.pl":"876ee781119f749654b9e3e23b707704cfe45e856e1ed8ec83ce181dd67c7c99","crypto/fipsmodule/modes/gcm.c":"85c43d8aa4d80fd93070308103936068b55babb48ba7d540f60a1e1a3d328c61","crypto/fipsmodule/modes/internal.h":"3d837589c477fe666a2e314dfd457f386e3acaee306c3bab3e2d155fe4c643cb","crypto/fipsmodule/sha/asm/sha256-586.pl":"7d28f78ef27b17a7ac6a62337ae5a75d2ef1c2bf08c8154189652e4d93e9ab65","crypto/fipsmodule/sha/asm/sha256-armv4.pl":"673523183c7ac34ade7becc78f077e6bbda6a2d1f6d33644207c725be2dc16c8","crypto/fipsmodule/sha/asm/sha512-586.pl":"b536e80fcc7cf77e5945fa7af1c43b18d2e1df438e601262429065b0b622682b","crypto/fipsmodule/sha/asm/sha512-armv4.pl":"7352a2ced5b722e37023e27afdfdcd5eddebbe067ba8f5da4c421a8709ee8955","crypto/fipsmodule/sha/asm/sha512-armv8.pl":"c79a028ee366e6a3dc234787c1ab4696be29aef08b3af6877a0dfffede1dfd09","crypto/fipsmodule/sha/asm/sha512-x86_64.pl":"ad914a24a3d903018261499d930871d696af24e379fc9249ce372180d586ca92","crypto/internal.h":"8b0c42bb47e0cf099141d767f1ce10f629a70f1c5ccb346fed026d2632c8afdb","crypto/limbs/limbs.c":"195d4c147d460b2af0505d649b7db0f6958fd06eabf4e896747f4e6d86382af1","crypto/limbs/limbs.h":"5736985c56532a9e51a858f83c5ad0c19c22e293deb44346a57c9862bbad707e","crypto/limbs/limbs.inl":"34ebb0d77672cb538ddcaa69c16c781daf5a241ae853fdb3f787b2fe1ad1cba1","crypto/mem.c":"18e2844c6205fab613031e671dac3b65ceeb18bb5125f2a11e4df7ec0c09ec0f","crypto/perlasm/arm-xlate.pl":"54998c82dcf99ca2328ad28ed0ef0b06e95b64f5407e66ff8f1b4e106ed31f9a","crypto/perlasm/x86_64-xlate.pl":"be38cb5a80c8a89e209bf46cea424ada94f9e1e7920f80aa211dd691d81c481a","crypto/perlasm/x86asm.pl":"c437421fe9cfe8fea96f9f38f35fec0d1086d6d1b7b6349180b2163ce8cc9e63","crypto/perlasm/x86gas.pl":"183d2642ab2e4c76b46bcb97a92fd16c539d9c07331c7204b0564d78c9413817","crypto/perlasm/x86nasm.pl":"7d3b50f58cfd1da94a10f17e1129770d744edf03d4029417ea53bf8771a99b97","crypto/poly1305/asm/poly1305-armv4.pl":"2092a6f1b330972fb050da99b7a63d3c70dfd5f99db98ed1f679018d89e839c2","crypto/poly1305/asm/poly1305-armv8.pl":"c717d87739909c95e0dd1e2d95e6a5d9f693677e68ca1bcf2dc619c93c777185","crypto/poly1305/asm/poly1305-x86.pl":"060b3689cac73fb7a32e16daa799573e6c52dda47fa3ddba9cc235763d6834fc","crypto/poly1305/asm/poly1305-x86_64.pl":"ee69a0717f931d7c336898cce017946a56196a90d6fb44a02989b855ce136bf7","include/GFp/aes.h":"fe399abed5f51e4f87efb740db962bfbba8ee3da0895ff87a0adac01b84cec98","include/GFp/arm_arch.h":"d42a99ba200623d450ba4d186703545d611fe5cafd0319e0ef82335bc033a4d4","include/GFp/base.h":"f4dc1f800fb305f3ea06dc2fcfe52bcb3ee42a621d54a470077c44a8f4c620b9","include/GFp/cpu.h":"e1df2f7bba85822262d1bd27b59fef2d42dcececc917d4c1ce86a1da44ee544d","include/GFp/mem.h":"f60b987b803b79b149aa140195ed9c1108b90b01123aca367a599da6174d082d","include/GFp/type_check.h":"6311bbc55de60641683e0380014588dfc5fe8545d62a430f73289f6194bc9f81","pregenerated/aes-586-elf.S":"f7f20706ef759b5c57754d4d76ee02a52720823e690a7d8622706ed519314443","pregenerated/aes-586-macosx.S":"192f02221d5c29435fff77278881d84ebb27317d5193d30f5a16d003b7fe7fd1","pregenerated/aes-586-win32n.obj":"daa6c232b8318ceae756f087ff605526f2183a8a22702361b240793ffc97a071","pregenerated/aes-armv4-ios32.S":"05e3aa1606492acf27005eaf7da9d8d395a46891685ad5a4ab119ce9399fc318","pregenerated/aes-armv4-linux32.S":"a566fa70cea01f894e310ac223bbddae6bd06085ec5abe9f01bb949176c7d04f","pregenerated/aes-x86_64-elf.S":"52f2903cee5b295afd045c8e2c643599607243721f4a29c2c3450d7ee2c05d0a","pregenerated/aes-x86_64-macosx.S":"d9816ae3dd046d168cbed5c81bd8523d8ad0d7cfd23e249ca649dc8bf200a5ed","pregenerated/aes-x86_64-nasm.obj":"2dba01c45b24a1d3958753cabce6ee320820f48001036dd61821e0fd18052e47","pregenerated/aesni-gcm-x86_64-elf.S":"ef5d9c077556e5797a3a077822db69c0ee910612a2c5a0ab78d7d7c6c38715e4","pregenerated/aesni-gcm-x86_64-macosx.S":"416356efcc64fa2d8562e4cdfd5450d24dc7fc7b0b75a34c477aa1d6c72797b4","pregenerated/aesni-gcm-x86_64-nasm.obj":"6a391c171e00fbc075c94bd8edd986a769d27aa764f4b90974249ff5597c22d5","pregenerated/aesni-x86-elf.S":"bc47724289b8686a53182ddebde870dec87fd9f475764eccccce2ab7b2afded8","pregenerated/aesni-x86-macosx.S":"daec8c6e24442e087c0f9d966de30c5e65ce54965d5e4d3807b32b86b831ea32","pregenerated/aesni-x86-win32n.obj":"3b4f17495887dea69c773f3b16d44ee7bbbf90c390640e21805c0c4ceb717bac","pregenerated/aesni-x86_64-elf.S":"a157857e74365447651edcf52a1c22d025148d0ec4591a2a171bb3961b4c5f3f","pregenerated/aesni-x86_64-macosx.S":"429b63c941b4b097f0535e1e4e7ecf581aca5fa0f28aa01826f86e61dcd19bb7","pregenerated/aesni-x86_64-nasm.obj":"69ad882d6b63a13c697bc9d42a43d6bd699e9b57a94e66a3034e89a336632a71","pregenerated/aesv8-armx-ios32.S":"b584a245f583c5476b580624f4a008cdd61a3222ac95c2d7e28dd3582d207a24","pregenerated/aesv8-armx-ios64.S":"f8c03d0da11439e3728a10b4ae8070ff0857bd954a601720c4b34dcad72cbb48","pregenerated/aesv8-armx-linux32.S":"cec32d89aeaa2441663dbc3f8a930b1704edb633c312e24d2409a14b1a574d45","pregenerated/aesv8-armx-linux64.S":"b5cb8d4f1a97d3ed999998c2792a67e769c70985a8b1a45bd86aae5383a52db0","pregenerated/armv4-mont-ios32.S":"3b0de93587df778e89c19a8def5f9ac3600b731dd2f44bee85f9df9af5350428","pregenerated/armv4-mont-linux32.S":"1753245efba56ffb87abe9cc8971d55c850c017ea18ab182c275cae746331494","pregenerated/armv8-mont-ios64.S":"046966e4b03a96dfbee84eb87606010141e966860d1515cdd22dae9e413f85e3","pregenerated/armv8-mont-linux64.S":"0ef399c278a521892ea032e4acfc141c8938182cb49f6dc6014da3ecd5e245d7","pregenerated/bsaes-armv7-ios32.S":"404abf267dbe5a7c5654af6073bb2644535e4280d18bb3934665d47033c41848","pregenerated/bsaes-armv7-linux32.S":"829fc5a382da5a48deb4067fa91ebe94a34bc626f88db80b03f8a9cbf7109bff","pregenerated/chacha-armv4-ios32.S":"ba4c729adc67d7a2299ecd4c47cce27d451bc41c6c4207d31deadbbd10fb6ff3","pregenerated/chacha-armv4-linux32.S":"a3e1a500630d115cfc90146085264e52a4d353a5219bd2e5ddf29629d6e54a79","pregenerated/chacha-armv8-ios64.S":"772f02153068af213a9e62d8c8899ce3ccd42db29a660d20532fd2e12de5213c","pregenerated/chacha-armv8-linux64.S":"861c6bc4c98ee87ff878a4ddd275ffa1f813bba2aa877155b7b50af666bda509","pregenerated/chacha-x86-elf.S":"967c527546a8286b8cfc707992db8208c473835d446f98070b7c0ea78f2929d0","pregenerated/chacha-x86-macosx.S":"5e2f5071e7dcc62ab2e1ef3ccc4b2bf3d5c3645a08a31045007a0c52bc45a11a","pregenerated/chacha-x86-win32n.obj":"a712ec9f4dbc6cb5e030166fe3c4de594e6fff3f80605cdc2b5d953e3ab99768","pregenerated/chacha-x86_64-elf.S":"02ae07f9de15a0cb603f22cd6c28e807bd91187aff8c74984afc33dcb45258c1","pregenerated/chacha-x86_64-macosx.S":"8267602ae4564e5748b285ba6aee2add9300c2d6cbebe498c06222634913f632","pregenerated/chacha-x86_64-nasm.obj":"ec8f6fc554dd1514d9edca464904c80aeb0a51e183e4e36d4ea65d8fdd821a74","pregenerated/ecp_nistz256-armv4-ios32.S":"7ae6270a92c6db9a2903cc170e5ef1fa6caef3c5e714425ad4787b08acdb6956","pregenerated/ecp_nistz256-armv4-linux32.S":"3cc2210827b822d93e53f21b0c0320f7e1995fa850608d0080b406a1a3ecd901","pregenerated/ecp_nistz256-armv8-ios64.S":"a1eba8b2cb8329bb1460920ad8c11a4d39c46730cd82b8d885f2d136adb92954","pregenerated/ecp_nistz256-armv8-linux64.S":"366b8a55b901e0d994b669a8a7dd6ab83b1d13fcaa5421252a5a76597c201121","pregenerated/ecp_nistz256-x86-elf.S":"0637df02d673aa92e4edd38c46839ed6c7821cd4fc89bc02e1c508c087cd9ba2","pregenerated/ecp_nistz256-x86-macosx.S":"c38c2396d228c952e30ebb9b7251405e7880ae16440fccdaa86efc26cdb2a1dd","pregenerated/ecp_nistz256-x86-win32n.obj":"c8bff1734f4c8a1e97fd9a7522bac6cd5870abeb89c487d3a317af0c6aaf7b47","pregenerated/ghash-armv4-ios32.S":"014bf7d418bb7b7e030885b32cd61877e4106928ccb6f0fd33de88ed2e465429","pregenerated/ghash-armv4-linux32.S":"2067ea82a959f0765555486421f1dc9b870f87ff63affa00a0b40155d194106c","pregenerated/ghash-x86-elf.S":"93ec1da2940c4878a0f7db2cdd09cf990b3844b8a8722d8187d4a90054720c24","pregenerated/ghash-x86-macosx.S":"d683e1a43843ff61caf01303cd65f77941e4bc83c9f25d520bd1b589e767abc7","pregenerated/ghash-x86-win32n.obj":"61e4ac7bb86be8e7a7d3e9028ac29c327cbfb8a71737fe93205fe0334a553286","pregenerated/ghash-x86_64-elf.S":"35cf055b04ea70c2a1d3a2b7a317f53a24d7e0f3adbb4300b97007b3251e1b92","pregenerated/ghash-x86_64-macosx.S":"d981a50bce4855f6d75d65727c67edbfaa750c1159fda566aeb2848e5b1b55ff","pregenerated/ghash-x86_64-nasm.obj":"6969d08f56601a42c2522a79b92448fa1ebac5b50bbb357b3f0480f182e6808d","pregenerated/ghashv8-armx-ios32.S":"1b282a17ef1feefead126a4b3d9a024d6653ae7823dc9875d5e1b30df41e56b7","pregenerated/ghashv8-armx-ios64.S":"cc45b3dec93af06fb0a58265dc87a3c1a1a2e2bc0ac7faa38a2c0180c7d1a35d","pregenerated/ghashv8-armx-linux32.S":"0dfd95832633bc6cb17284c5930fc2dfa0f1a5bbe65477821bf068f1cb61a6ca","pregenerated/ghashv8-armx-linux64.S":"7cc8184653cc8f40826fe188fc92576772b033f8ae9822b4cac2b9430a190895","pregenerated/p256-x86_64-asm-elf.S":"dbb349dfeb60bd7c031b5e2d3ab82a94ca8fcfeab6db0170025beff1a2ac7d67","pregenerated/p256-x86_64-asm-macosx.S":"1bed415a3f002f1fb9e0704416b317a43554e427286f92fedfd431fdd6b484c4","pregenerated/p256-x86_64-asm-nasm.obj":"3cebe38e9c6c8c72b69b1643c856df4f22d6e60def5ff78bf7ac9aec428c31d4","pregenerated/poly1305-armv4-ios32.S":"4288cd6a682a62ca6bc6fd4fa21ab2c7373c32c9005e2c7203806c29ff13586b","pregenerated/poly1305-armv4-linux32.S":"677a4a6dbc997d62e88d6951ab2a0efc9a2b253fe2c4418541cad5b347f75f5a","pregenerated/poly1305-armv8-ios64.S":"580102422eb14f37128d772150d28b4dc2d0751e5f3d250b250cac46e99dd662","pregenerated/poly1305-armv8-linux64.S":"58f0d37ecec9bbbd467f3086a318173b426155ae68a64f644b759938c956a2c9","pregenerated/poly1305-x86-elf.S":"93450ce7acb252e01414bb3b722765cdba57a9ece9414e8c89d882d339a7521e","pregenerated/poly1305-x86-macosx.S":"e80d43e8f4970e3b29f98e673d4144391a82dc480187c70effd78407b3d2fc34","pregenerated/poly1305-x86-win32n.obj":"22b807816c34dc2e920e2375d6a9b2c55875953053fd563e249fe258c2db6d29","pregenerated/poly1305-x86_64-elf.S":"6bddae35d68af8e79f7808b0120f4da4ee0925937f62f9e5f6410c32598fa464","pregenerated/poly1305-x86_64-macosx.S":"38d507b81739912a0d48c60de7023a089dad43eb86dcced6a0b87a12d1cb9c92","pregenerated/poly1305-x86_64-nasm.obj":"e5bc43a3c49ec59abde690c1f1de62d9e932f3b9e154856ec3e9e9459e2b651a","pregenerated/sha256-586-elf.S":"6597654ea92ba427e36f29c83fd3d3fbb382a404abb3e3bef71b14a3555ac137","pregenerated/sha256-586-macosx.S":"85eab88fe377adc470d04c2b0528d5f26b821788f1929008e6ac250526940c7a","pregenerated/sha256-586-win32n.obj":"219106f2a3c77e9a7f80e777ffae4ef4a770a22baf743bb1bf641787144b0047","pregenerated/sha256-armv4-ios32.S":"fc6c163ebaa9e4d38e1b08c41b601a92d798cff4736edac606fba9bf49e38b87","pregenerated/sha256-armv4-linux32.S":"dd793ff66f2dae5b390e3cd34893d178e0bb7f6ef18353911601f284bd1c868d","pregenerated/sha256-armv8-ios64.S":"e6cbd98d0266a53bf4858694c549efeeefcf545388d2bd342f34c24a470ea9cd","pregenerated/sha256-armv8-linux64.S":"19a5751954bd142f1d45c1773c9e61505025414829f5f0c1109cc86f3df924e8","pregenerated/sha256-x86_64-elf.S":"0c21b7659537a0fffa684f460c92c2117304b097e20701725b0309b9ed8b575a","pregenerated/sha256-x86_64-macosx.S":"f08bc11e30b778ed0ef065b60b8d0e2871fcf08fabfec375eecaf653f9e4d03a","pregenerated/sha256-x86_64-nasm.obj":"87efce51789a796040628d84a3c34b9ca17882a603db7d449ed998088722c7ea","pregenerated/sha512-586-elf.S":"97c5b9ac0596c58e76e6a72e4549fe00c10ba1f607103b91edd81a43016c1746","pregenerated/sha512-586-macosx.S":"ea4a8a89a4d68e5bc7e026a653b67c6e0c3539176f90705458e85e3894497aa3","pregenerated/sha512-586-win32n.obj":"15bcc277d480cc323d75d9ddc907ec8e3060a4b4037ec499884c87e286856819","pregenerated/sha512-armv4-ios32.S":"ef8af43bb96db4c3900c844ae3c30efa2144d8d01ceb7c9c551cc17063a4f37f","pregenerated/sha512-armv4-linux32.S":"100f3450012b3011b4f76aaf5c0c9d329d461f990e50fbefb36325da27f426c4","pregenerated/sha512-armv8-ios64.S":"727d125b1b7c6d7d9ca9022f8e22d5a81f5c5c29231cbdc8429b9e9c79f84612","pregenerated/sha512-armv8-linux64.S":"a3b012b53884f36a6a98fda1485cbbc10a4eef3815aa2fef2db48ca1ef33fb20","pregenerated/sha512-x86_64-elf.S":"6d4fc6c7ac0953fb0d5bcb8d35443e360c5333c26951c204743b80a711c50f5b","pregenerated/sha512-x86_64-macosx.S":"26694e275333099f32d854488473ca91d4eae0d7a4abb6fbe34579b4a3a8d1f8","pregenerated/sha512-x86_64-nasm.obj":"553a50d743834a0ca9d99236b5443db759742d274f299351fdefb7c27e9023c3","pregenerated/tmp/aes-586-win32n.asm":"1af1558e639f10fffbacb7fe3ff9ececa365d58c310a33ed6eca26fcfc1a1f22","pregenerated/tmp/aes-x86_64-nasm.asm":"eb481cbf35144dcfda3a1ff0ec1397464480188ca676d7dfd896386b41d6fba6","pregenerated/tmp/aesni-gcm-x86_64-nasm.asm":"cbb0552dc5c461b55e188554bbfc65cc617352e412437f1b82a2cfb272ee64c9","pregenerated/tmp/aesni-x86-win32n.asm":"5f79203b4670ddf4c780960dac8854085f4aacdd2315928840ba24def950ca3e","pregenerated/tmp/aesni-x86_64-nasm.asm":"ad0b5749b28081687532dc64936c991d21b61681c418aa9069838d558a0a023a","pregenerated/tmp/chacha-x86-win32n.asm":"7518ec6d94d27670f8f0ae40842776db7b97251996ea5a15936f389191cc8a63","pregenerated/tmp/chacha-x86_64-nasm.asm":"6dd69849887d8244563b51138be45d64e96126d346191859ee0c07b50ecf3a1c","pregenerated/tmp/ecp_nistz256-x86-win32n.asm":"58d048d40696999d4be9e9423107bfca7ba32e72a8d4d688512e1206760dac85","pregenerated/tmp/ghash-x86-win32n.asm":"0061f13a5ce644b72558b307ed920d71b7050efe25a36c830075885dda6d29cd","pregenerated/tmp/ghash-x86_64-nasm.asm":"6303a2dd25cacac88f6e8bdd4ab257bdda98627419e8cbb78d7bd7450ab224fa","pregenerated/tmp/p256-x86_64-asm-nasm.asm":"e5879444025354d636b73f4bde92949e99ed451766fcc91a8d5c399d4a9de016","pregenerated/tmp/poly1305-x86-win32n.asm":"dd0a2397d15873b5f12dce1aa54205c7a0edb3aaa0be2b0f0676aa6aac6be87b","pregenerated/tmp/poly1305-x86_64-nasm.asm":"36e27b7690d658ca2977eeb5a4522766b2100410b8fad1818c94c5b2080ed956","pregenerated/tmp/sha256-586-win32n.asm":"bc24c8123100377d1141ba246f808764ab6702ab8b81e7d39776e09183b0ee2a","pregenerated/tmp/sha256-x86_64-nasm.asm":"593fb0095950fcd900c81506c75007f215ce7a6f42ecc6c0c406f0ca72567130","pregenerated/tmp/sha512-586-win32n.asm":"11ae55b1507b0f6bab9c02469b5b0fa3c28e2f0b344713042d7301bbe21e8e19","pregenerated/tmp/sha512-x86_64-nasm.asm":"2c1193ead520148b2b3daccdcf8f2eed5fca2c61f3d0816c8b3255960b065739","pregenerated/tmp/vpaes-x86-win32n.asm":"a1795a27e3549fdd69fb970ac30b9f414f6a9eac666de5995d48f7d3ac2351f8","pregenerated/tmp/vpaes-x86_64-nasm.asm":"c2e653835f0a28d99813cf6caeaf030f25fad3b23df7ab257848f33274fa25a1","pregenerated/tmp/x86-mont-win32n.asm":"a8ec86cd7fb43b7a96a817bc54b8885353974c4eca5aceab45cbdf2ad8af4133","pregenerated/tmp/x86_64-mont-nasm.asm":"a1d5a0548380eee1f618a7175821d409901862da7a8ab3adca0291285cede53a","pregenerated/tmp/x86_64-mont5-nasm.asm":"99d1ea3eebfacc3f11beb3787a526658f83735c266def879fdd8ed57022340fe","pregenerated/vpaes-x86-elf.S":"2a6e86db7140e49cbb6abe304554f1ef4383dc48c451d27cbdec96c0015f4609","pregenerated/vpaes-x86-macosx.S":"d3d44014c63249fcf020a88a7463060d033ddb3e1b1c2d08945c45bfbbe05a36","pregenerated/vpaes-x86-win32n.obj":"5d9f4af9e52dfe6a2c0140fe2173ca9b6074386868b6db46f1989d16ea7e873d","pregenerated/vpaes-x86_64-elf.S":"592174da3c8d5a79fbbb915968bd44a78701c3c04df5831ff491b3fcd3523c2e","pregenerated/vpaes-x86_64-macosx.S":"dd27dcbd3b689b3d5e5e06a408efe169cbfe6f5554a1a48f79412258b3b779c6","pregenerated/vpaes-x86_64-nasm.obj":"ebae3a9f6da2d769c4be74d42cd9d93d3d9746a9683d9efdf629bb0f99e9ad90","pregenerated/x86-mont-elf.S":"6d8f2899d07d94e31025af13482983fc7087bde45e3c8a237c2878a28cc54b96","pregenerated/x86-mont-macosx.S":"7d85116fc8a29c64215166fb2c44566dc7c1b31048a635605f4fd8fcbaea3459","pregenerated/x86-mont-win32n.obj":"ae3a6298d36f9ae36d6e062082fe64179525369d04bc08e5c2940abe52e151c6","pregenerated/x86_64-mont-elf.S":"67ac57ec1c335cf16580b550826f56fd7e3ccb1bd2e52a845595f9ee44c98f45","pregenerated/x86_64-mont-macosx.S":"191c8e8dc9e8dfd07f3cf9e52e8bd18a8209cf25f648ba0e1c7f724307830377","pregenerated/x86_64-mont-nasm.obj":"121f7b611ab5400e7d46fc3271027524dca2f5dc8a8a630ba06b633573ea3076","pregenerated/x86_64-mont5-elf.S":"2b7d8e6f395e6dfd5b85149ebc729674c8f29f2ba82e67693042ea111c0a0c0f","pregenerated/x86_64-mont5-macosx.S":"c79f3e15ab0b1f2ee14ee8dc058031810d20ed497faba1cb10412523e809d483","pregenerated/x86_64-mont5-nasm.obj":"8cb3cb2d486a713c59911abacd4abb098fc0633149fa4f5ffe71f9413625e6d8","src/aead.rs":"f6322b0fe011d8da0afa0a80c66b1fd89b2c8b2b481838bde660be4a349452cc","src/aead/aes.rs":"c7bea2ee52d077e8a3b225c43ac154f1745cfce64f98bc2f10927c1664e9c0d8","src/aead/aes_gcm.rs":"94e71be3ccf22994fc878aabd8241816c8d999c668de37d4eb0ec4369ef4a4ea","src/aead/aes_tests.txt":"4ae334ed8c34c0cef24c22b73568faec906a39e26a428e4cd6fe4f810cc51fb0","src/aead/block.rs":"5257bef41b259aa3b57f2cdd4922da8dd13f0fb40d937556d4d5eb0311a1f92c","src/aead/chacha.rs":"5c0599e9b16e39470e52d64e93d18c2f82b348c155fb8867bccfb1f209b6356c","src/aead/chacha20_poly1305.rs":"d65263e86f615b906321de7eedca1c6b7028c2b8182c1b6b75737d066c2c71e7","src/aead/chacha20_poly1305_openssh.rs":"538789d0f7367028c9474080db000f473b6f916ab26c02783a6c335accf0a91d","src/aead/chacha_tests.txt":"6ed1303cef7a0ffa30cc76f9933509a2d952a334b80c731d52d32c6ef3b37042","src/aead/gcm.rs":"951f8d66dd51ed11ed0edad8d8e1a47e9905f4424d74bed6d95086f8df22e5e9","src/aead/nonce.rs":"3a72654293072cecceabdc2d9c29d35fe1d3b70aa9c6a9a121f85967326988e2","src/aead/poly1305.rs":"edd5e284cba34788e37b890210af55a1961ab89f672a3156f877ca06cc0da0fe","src/aead/poly1305_test.txt":"89be1be8e403e5a17845f0603e19337604f1f278c7b283de2c7227ef6041491f","src/aead/quic.rs":"24a5310d141e574c5ef9484d1d7c1610cbc3faa2f3564fdc3f4d75c55a4cd7b8","src/aead/shift.rs":"13baa522a61d202f3d398af2ba508f1cdc8c173e7cc1caa725b4e81efc6b2368","src/agreement.rs":"a4027c52e633846f495248fddb062208ddd379eae5e36d09641d3034ff9691cc","src/arithmetic.rs":"4154c5a049a6bc602985170a292f6f16c1728abffcbaf0cf461da228022f1f2d","src/arithmetic/montgomery.rs":"adb7d8e3bb058fcbab6911967d62cf2e2b2ffc9fa165cc8da0de984fe6eab5d2","src/bits.rs":"c59d4f351eef85ea1361c2477c76fae56896a0dd4c54178ad856f4e6b22cc5a2","src/bssl.rs":"195480f2566653759c4ed6389830c5511f48788ac2e41546cdec1d427835cc3e","src/c.rs":"4c74177dd9ed4298270bcfd71355d0f41ea3bce74d3deda267c9cbf704184c49","src/constant_time.rs":"2d76e72ad06e65de8ae060607759b7b618ccdd0b4b1a94c227c9af2b402008ff","src/cpu.rs":"33c768c1044c681c96ebe8f7a54b825d6df58a23a7fe20c36b75ec3bd09e171a","src/data/alg-rsa-encryption.der":"7bc023427767a2f2e156f8ae030d06d19f862e326b952116649b423c3ff7110e","src/debug.rs":"2628ca5b83bc379cf3d9343a3c09676860163a205e11b9fe1e8a2babc4e93489","src/digest.rs":"0baaac74b5c945e0becd8eac0186e188d9d84ff5f783a4b6aafd2be31f980137","src/digest/sha1.rs":"5bd500e8b688e1758c24b324985e56f70b5f0a6a7c6917cd13a6d44804884000","src/ec.rs":"c80a72f653eed85fd73cf575d1d9146d99e2b574f18da79e0596dcc4800f53be","src/ec/curve25519.rs":"9758e50247f0f325332ccf70245ce7745cbc21a01de39590e2babd6dd185451c","src/ec/curve25519/ed25519.rs":"5dcee3ebc59b65d444b162b6832a51f501c37bef8f16945c220ec7e0e157b8d5","src/ec/curve25519/ed25519/digest.rs":"6bf6c446b145d0caaf45398c4fe8574df7e974e89a9155d87d4a0798716f79a2","src/ec/curve25519/ed25519/ed25519_pkcs8_v2_template.der":"1bd2db034b5160de343688ff570db3da6a5bbfc66f9f2dd015f0902e2d2b7e34","src/ec/curve25519/ed25519/signing.rs":"3d437cac44a078353b093eab45589e7c48c13287dba647963b23203ba21ac0e2","src/ec/curve25519/ed25519/verification.rs":"457d060b4c97d6ac2442fdbd9fb4ddfe29c3ce8075567bc0e1b5ec5d1c5ac544","src/ec/curve25519/ops.rs":"e8c18066815c98c16569bd15d62d52191262b413c299aefdf2543a4ec45addf8","src/ec/curve25519/x25519.rs":"f05b91529a31df34dec662829eb0c6e77f66bfc7569ac7fd234a23bc58d9224b","src/ec/keys.rs":"c669f6dc1aa64a8a3016768b883d3fab5d52e086d966804d752dc4303988177e","src/ec/suite_b.rs":"e664f9505859cc884dc1e0173166e80579c37b7768742ca630cf3ccca8fe1d84","src/ec/suite_b/curve.rs":"9ee3168fe44e427bb8862c680d9975f207ce3d7aa90dacfac5163dfc8e107ec6","src/ec/suite_b/ecdh.rs":"de9a999cf304ea4b92322eb094d43d5feba99a9167c7c46da1d78be420aa9a9c","src/ec/suite_b/ecdsa.rs":"013e0d2d2a21eb437253b03a1f6a1a4ba8c45eb1c2ea1396696bdd04a8ed2932","src/ec/suite_b/ecdsa/digest_scalar.rs":"fb64ee4630e88aefe573f73b6321adf849403a2b56263f3ae4d8d1e29da0b479","src/ec/suite_b/ecdsa/ecPublicKey_p256_pkcs8_v1_template.der":"5a2207da0199ebe3e2a80e15e7692b21f215f855ed3bd2c51f466c7969e11990","src/ec/suite_b/ecdsa/ecPublicKey_p384_pkcs8_v1_template.der":"5ec14cd6aac17cec849382ee5e2077497f98ce435d7aee2116cd092bf84f5556","src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt":"7f38872c3acbd5d156783de92f3671062101af3cc496c1b261165971b3eea2ee","src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt":"ab92cd110846b42d7738374d25734cff6459467f40121c4e7fda5b31bee651e2","src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt":"c471d314f18270c79141062d5964d84fbe38c1bb9559ca217f3511d34fc4af25","src/ec/suite_b/ecdsa/signing.rs":"06fc1bf4b769e5e7f3fccaf38a55afff17557613185d82ea0514099d9b9614ed","src/ec/suite_b/ecdsa/verification.rs":"180b9d0791b5d80a7c91933b71aad6636ce7f45bbdb4459d268f64569484429b","src/ec/suite_b/ops.rs":"54f109d06022f92cf7f72ccec61ecd3f9f9b0fdc7fbfe137bab11c3904dba466","src/ec/suite_b/ops/elem.rs":"15c18d85f2e8df996604ac24392ac09a27f0530bbe524f8f6a1a7e0933435d28","src/ec/suite_b/ops/p256.rs":"64d76c820bb33e62c5f7e76023f8bc2f920f5559ef17ff590cd251da2a6784ff","src/ec/suite_b/ops/p256_elem_mul_tests.txt":"02e7a991d6643a81229f462d21ea72f0503c038d783583c83ad7f118952ecf0b","src/ec/suite_b/ops/p256_elem_neg_tests.txt":"b61eb959dd473bd8edbc4566f18be0ac9f483be9e7d0900f48eb764454475807","src/ec/suite_b/ops/p256_elem_sum_tests.txt":"2fbbc13100065539bce71e83d642878a90103b5ca3d9b8d3c321db15a0c05c9e","src/ec/suite_b/ops/p256_point_double_tests.txt":"34a5968bb40320c6cc0f7d248951376823d46c0aab1fc7ba59311bc1cfd34417","src/ec/suite_b/ops/p256_point_mul_base_tests.txt":"f207084da07de3f63b7563b07994915dc770e2b7d5dfe41881b2ffe875ad69d7","src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt":"f3c8061e0f891441de35e80869c253c65fea2ed1dd4f9be7a444c956211d32ae","src/ec/suite_b/ops/p256_point_mul_tests.txt":"894e02359b562f3d74757f4d8fdd20c5fc5528634f5922ce01d9546910e0b0b9","src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt":"c2a178ad0371ff7dcf15364edbbb5cd0e82478d7e1037a6d3b2243204465f918","src/ec/suite_b/ops/p256_point_sum_tests.txt":"1ede1f508c673890e2f48ba53309397a17a02f13370aac114f34ea0c3c4f4617","src/ec/suite_b/ops/p256_scalar_mul_tests.txt":"6fa09fc69c9962c31f090ffc747d4cafe184429b8e0acad3adda7b14ac26a4ef","src/ec/suite_b/ops/p256_scalar_square_tests.txt":"19633fcefdf8af6685fa9750a96c17478e282972ee7ffbf4c4303229f7938db3","src/ec/suite_b/ops/p384.rs":"2441cf2a255bf24e0dcbc81ace0baf8b65c23256e57ec98d8bde4279ca031896","src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt":"8c4d02994577c8b6ec3a83158fe20ce92366052ddff349b02bad4595847be8cc","src/ec/suite_b/ops/p384_elem_mul_tests.txt":"acf37680470a3574acfe64cb3629186d1f29bc8e905c5d9c1e40a2c2bde2701d","src/ec/suite_b/ops/p384_elem_neg_tests.txt":"08986c5fb0b8adfd3be6ba217ee68308c5e452dba086d92793e0ce3383c1acaa","src/ec/suite_b/ops/p384_elem_sum_tests.txt":"48850b24fca0487a875379b6de77879f97578f50111c11a12e8d789f6c8f0ab4","src/ec/suite_b/ops/p384_point_double_tests.txt":"6d25547058f40d98ef3c2a1957fb72a57f4fb19623c28dda92b42b7adc93bc9a","src/ec/suite_b/ops/p384_point_mul_base_tests.txt":"4995baf7080a6a4d72de1d262300c4ee49d0449034e1250f87bb15fadb78408f","src/ec/suite_b/ops/p384_point_mul_tests.txt":"2fa85969ab080e6f977ed92abbe29f6f5f0658e5ee126834769673ff557efbd0","src/ec/suite_b/ops/p384_point_sum_tests.txt":"5cbdf15ce4a56a952b85046e49cd0fc4ee22d516d914ab48c19b7801864bd352","src/ec/suite_b/ops/p384_scalar_mul_tests.txt":"f88e82363d7a1eb4fd687bd54dec6cb05e2796e751f39b5c774c11af0569bea5","src/ec/suite_b/private_key.rs":"a8e8d11d9390ed25a2ef9495d6f657adbff662a4c25cbd303a54a09ef632ca4e","src/ec/suite_b/public_key.rs":"e40cdda1c8c898463eb86469aaac98de4a3bc10f645af850a5cae74327188ebf","src/ec/suite_b/suite_b_public_key_tests.txt":"392bcb543cf69cbab5252792a8dfe09ffa3421cb27d65cdafe9771bd68d49a5d","src/endian.rs":"2432a71b890cf7d1f1e0f7fcdb418cd398c5d2753d1a85e007bc5cc24c3ab17a","src/error.rs":"8a984e5922f5c24d0b25bce3d7ba34962bedfc0afce3b061ae610fcd4547d75c","src/hkdf.rs":"8585d8cbf0af7209cb39360e0a04d9c785a86b0feb3a1a40e75e70e6e6209ac4","src/hmac.rs":"caad91733f528af91847aabbad489f9791a543de652617dbe17883ab6610ec2a","src/hmac_generate_serializable_tests.txt":"d9fad4aa957496eb05dd67d97699631bd428de8a5be6e29aeb82b732eae97a59","src/io.rs":"05efb92ff58e8e5f47195a8b63ce460fac6193be31cd5a2cd8549b528e530e19","src/io/der.rs":"d3d44167bfbfb5c2f8f78b9dc1455f8b1083f9990de7a9aad28bf5d6fdfac0b4","src/io/der_writer.rs":"af1c41c0eb55266887a657a65bb731a9b04403e2e78d96cd0d376fcd7ff92902","src/io/writer.rs":"184e6954df087ace08061de72bca561ac10f94e420461a5934adf69ce8bf931e","src/lib.rs":"b37f935c1cb88752c717d3735bb18ac70696181b271331668a8b1120ee380c0b","src/limb.rs":"9f6bc7487b5833ed759b6d0191b352a92e5ea66119e6f574649fb2abe20740ff","src/pbkdf2.rs":"67d19dc309626dfbc097ffbfd354203e4411040a8111405460030528ddca4db8","src/pkcs8.rs":"6d201c861ca780dc95958e0da46415389f5c56035e0ac13323b0894ba2c8061b","src/polyfill.rs":"aa9cd611f9d76bc4a66c2783883f50174f2d0898e6614221b51c252fed6dd3d9","src/polyfill/convert.rs":"61cf8e869bf2d87b225b1dc1f9b6b210bcaad5f145003c35f236de639f539e73","src/rand.rs":"922fe8b9b3c1e298affb2314c933563237ce1cd4f4453f0818722ab80f8b753b","src/rsa.rs":"1e40518715c1aa20fa2cf36b1de0acecdabe5bd8f2b391ed0aefb5161b4ba95a","src/rsa/bigint.rs":"41b74ea28dce1ecfe4b525d3903516d585d18de13c85a47658bfedacfd140219","src/rsa/bigint_elem_exp_consttime_tests.txt":"5f84de732433df1e0db3b3eb690bdb0cc1a735bdc7e60a8218d5910e9d9ac436","src/rsa/bigint_elem_exp_vartime_tests.txt":"6501c58fa66083ceb7dffe14a0191cd6a2d74a96aafeb72d828841844a37f409","src/rsa/bigint_elem_mul_tests.txt":"0de8d667f4bae0648607cff2c53df81a6b2ccddb8ee620593350255b36de0e91","src/rsa/bigint_elem_reduced_once_tests.txt":"7b4aea41259ffa329d669843d6dbf29a5ba56d845210bbf4b0a2ccafbe8d8c01","src/rsa/bigint_elem_reduced_tests.txt":"7c5dd25b495b89bab09e8f09cbbecf34aa28ee7eb2ed592bad50ab63e5b17ebe","src/rsa/bigint_elem_squared_tests.txt":"0517a5446667fd49d198a89fd93f19d9870fd3fddad3371ad9aa8075b6020e22","src/rsa/convert_nist_rsa_test_vectors.py":"c670a7d9761667c46a9b204848c74ed8cb5ba723e3f5b92b081e94e4601c55fa","src/rsa/padding.rs":"4b042c5be9ead219fcabebde338b57e0efcc5760b65b3b04b834c113f08ed592","src/rsa/rsa_pss_padding_tests.txt":"1b68a294521e983a4a35fd7ad4e5823d6173641ad63d736b3b8e6e867f748ea8","src/rsa/signature_rsa_example_private_key.der":"5344d57f719a98c4464aed1d1c2fa569f0a9de8621c6fdec7d28923a0e1c662c","src/rsa/signature_rsa_example_public_key.der":"28b0a357936485bd2a7776321cccfe17c2347f2bb75751ddf9dfc6429cacb6f1","src/rsa/signing.rs":"4a5237d5f6c9d2d48da89f594a3d325ee086663e67297f5af933589142730161","src/rsa/verification.rs":"3e77cf6037ee4554508d7070c25b9aba017730aa0ab01ef8f10bcb0841b4544f","src/signature.rs":"cbd6468416b1e6a40a25446d59f412da1de58b4e99c748666768f13bf89cc3f5","src/test.rs":"0a503d4abc6ea2f3739525e80e263cd5ebb9d73688ce17f89cdf8ec5e6a4b3e6","src/test_1_syntax_error_tests.txt":"c6e72aaee3817e145fea114020193c5b3acbbd2f3a97614f1c2670822f1ac6f1","src/test_1_tests.txt":"1014aec056f9a06eb23983e61eb6dae8384ee982f4eb0c5be002fb5d6ce10f99","src/test_3_tests.txt":"e489a2da5f486e75cd6e2cf7089f09d6ddf61a8765fd58c47bc79ad32be77e13","tests/aead_aes_128_gcm_tests.txt":"2e88612cf3d767626f62d59d81652fef5611f4418bf56016c12ac0bc26a12a20","tests/aead_aes_256_gcm_tests.txt":"c21fab30c0098cddef658908ca2820d656c4717d24d79ef3dd68251695972040","tests/aead_chacha20_poly1305_openssh_tests.txt":"85a012f4b6bc9b7ca5af861179ce832ea93e4a175b604be781bd1fdd9accc24e","tests/aead_chacha20_poly1305_tests.txt":"3688abbd7b1d87c9200b627c289a2bebf763f512baadf536cd72cc8f3ce80fe5","tests/aead_tests.rs":"14f625392d8c67de808ddfca1ca9dd1726d66558f37382488a35ec83ff2f590d","tests/agreement_tests.rs":"7afd28ab27d0b42ad7a30cfa7a00c7daaea9cfde86a2476f45f39ef0115935ef","tests/agreement_tests.txt":"4b784d203e87f9de0678df00ac1b2a28db169f680a3333e9d773656fcebceea9","tests/digest_tests.rs":"3667611e880ea3999d750c370a0dfb0efc998399a6bb58eed971a5f0bddcfbee","tests/digest_tests.txt":"dd817794e2ba72ed637805e225240a295ae7b4cbea956dcd23c4752da67a394c","tests/ecdsa_from_pkcs8_tests.txt":"8880710ed78fea954b23f7adda6189b599307f22ba5c24b44f8ca9f00e9bbb6c","tests/ecdsa_test_private_key_p256.p8":"d56f99994233d749d03315f5cb9797fad81d3e25f962d2cd543d4dfe7cdd1389","tests/ecdsa_test_public_key_p256.der":"93c930878dc29d802b151bf492a2f00672b2240b740002a650ccb706664d10c9","tests/ecdsa_test_public_key_p256_debug.txt":"ccce94ab37a5e5286f0e5f1934bdeb39539e8f72bc7ccd0a1f666c9a1abc0bdb","tests/ecdsa_tests.rs":"a85c6513a66d66bb9358494ab95106ba57688cdedac8d662137c506696a0db9e","tests/ecdsa_verify_asn1_tests.txt":"4ae6325e0a1fdf4cd6fd2f299a7fb7a60927d0775b63aa9b027676fa76f3ee6d","tests/ecdsa_verify_fixed_tests.txt":"837f116fca066cb181677e389cf92b684d15ed883189b4544538cb5387e6b742","tests/ed25519_from_pkcs8_tests.txt":"4312701b6fbc57992598a4db50b0bf9bcc1df91004901f43e30982ba85d9d466","tests/ed25519_from_pkcs8_unchecked_tests.txt":"e2a7a54c8ea31b87bb5357a002f6f4c11b50ad5050681aaed91a375ef58c239b","tests/ed25519_test_private_key.bin":"644d50ab64864c20a12b3c4656d46b4a48f69ef7c47ecdc8415cd28316b22ef5","tests/ed25519_test_private_key.p8":"13e11da834fecc6aed04d8ff36a0301a5fb8187c86f5ab0f9cde434eda6762fe","tests/ed25519_test_public_key.bin":"21fe31dfa154a261626bf854046fd2271b7bed4b6abe45aa58877ef47f9721b9","tests/ed25519_test_public_key.der":"119e5ed7b8533bdf24897f07fe4dd57671a64f8d10534ba128c9bb016af86484","tests/ed25519_tests.rs":"ee0cb03dc2697f0300d5d830975d5122d4293ab33f06f90b6f75440b5105d0a6","tests/ed25519_tests.txt":"f99c7e7bf7cbbd7df936ca883ca0cb293c31ad37c03597890fdb07dc1c923d36","tests/hkdf_tests.rs":"d1ba42318f6c3a110251ff51d3f93936457e3b1541920f34898313f15af37f51","tests/hkdf_tests.txt":"516a19799fa940c72dca68d8cc92ec605b46aa71590cf1b827468a58a01da574","tests/hmac_tests.rs":"c51726353e43b164f72abdaf1a0f50e4706d7f61dff53b4e3305953de21cad1f","tests/hmac_tests.txt":"272c143921789a66d39396843c2fa0aadbdfe26d061bd2b7836ec40dfc76e09e","tests/pbkdf2_tests.rs":"b5c0538be4d987a2842342aac8afd1d3e97763843b7df093a40ea0005748d19d","tests/pbkdf2_tests.txt":"db65f42fb72cec9ca89c8c071d11c341f67c4df5e0c66a70735da5d1d370cee3","tests/quic_aes_128_tests.txt":"786f989f301ca97b17e3a62e1dd5d9562baf0f3081f59de5e34fcc4d9e8d9580","tests/quic_aes_256_tests.txt":"63540293d9b95e67aa9cdb7effdb5d40f977ec6a527490ce7b32592debac0428","tests/quic_chacha20_tests.txt":"b0c2abc90ecbb0146fa812c33641ad643380189429bb9e7c7db1b32d3363c67a","tests/quic_tests.rs":"c287f76176b53885e67edbeec63c70cf5fdbffd93b4910a99dcbcf12ce535a96","tests/rsa_from_pkcs8_tests.txt":"2ccd777cc8014904bb98de0462ee220c0a641f88d67aac489cff0742c9a1bc9f","tests/rsa_pkcs1_sign_tests.txt":"cb202666f2ed100a0ba8ebf818dab1bece055bd9ac9d5533d3f20fdad7b4c509","tests/rsa_pkcs1_verify_tests.txt":"ed8a330181e8a47cc707238e80377a8bd4002f6f8f6d06106c78aa9b59da98cb","tests/rsa_primitive_verify_tests.txt":"68c90857490543bcfb836f3b8644445acfe90a2e4c5189310914ce5484927418","tests/rsa_pss_sign_tests.txt":"aca70cfc877b055c0a29da2a457563cd1b5afe6e932b011e8b9a15d57dbe10d0","tests/rsa_pss_verify_tests.txt":"afcde20cea975ea235d9828bbb9b083f77584a7cb8c5c955e40c4bd305573f4a","tests/rsa_test_private_key_2048.p8":"a0d95a0b133b4c217bc11322b67d62eb13537b8a9f66e20b5c9b5ac31af21859","tests/rsa_test_public_key_2048.der":"7180acb59312d3544c3b36975ae6c4c55f59035ce4de487852cf6c99b33868cd","tests/rsa_test_public_key_2048_debug.txt":"dc471e4ca8c1ef4b57d2ce79c9b9ba25ab9e262ed63a24d2b65cb2d2f3797ffd","tests/rsa_tests.rs":"636a312c3b89dc139b1a6647ef9d16d1110385224bff6c8eca3357e99079484f","tests/signature_tests.rs":"b6e2d33cc5907f2a57397090b749daa3a99157d9568e7153a67c7b9c6ebe1d84","third_party/NIST/SHAVS/SHA1LongMsg.rsp":"c765dbc1609e9046b12f60a5285a88128dab4315080c94ce9f2a57a7b0b980be","third_party/NIST/SHAVS/SHA1Monte.rsp":"d458fa7e39095b4e292a75b0cd224f90b72dc801a63ad2c0d75b8f10d745ab6d","third_party/NIST/SHAVS/SHA1ShortMsg.rsp":"be0991ddc5372932d55804b11713c9140d10435ef4b316a0773e3506eec79cda","third_party/NIST/SHAVS/SHA224LongMsg.rsp":"d37115e5d2286dde969c5e1b2275cd83ecb066366d7a38bb6b2b3adb4a88de89","third_party/NIST/SHAVS/SHA224Monte.rsp":"7854d388666ea3eb01bdaca37dc8ae0bc39d30f8731d9a5487cbd61de47d1d59","third_party/NIST/SHAVS/SHA224ShortMsg.rsp":"0dad6656c08f77252f6ccb789e42284fd61fc53bba30e83162800aa3d2aa939f","third_party/NIST/SHAVS/SHA256LongMsg.rsp":"6fac36f37360bcf74ffcf4465c18e30d6d5a04cc90885b901fc3130c16060974","third_party/NIST/SHAVS/SHA256Monte.rsp":"29ea30c6bb4b84e425fb8c1d731c6bb852dac935825f2bd1143e5d3c4f10bfb9","third_party/NIST/SHAVS/SHA256ShortMsg.rsp":"75e1cb83994638481808e225b9eb0c1ebd0c232d952ac42b61abce6363be283c","third_party/NIST/SHAVS/SHA384LongMsg.rsp":"536171765a4278c000ac3c9913edb2eed0ca7ccd5a10b72ed79fdfe7901a6d6a","third_party/NIST/SHAVS/SHA384Monte.rsp":"4270099431ff52ee1686dc472351e681c26c507433df8f107c7de203b771424e","third_party/NIST/SHAVS/SHA384ShortMsg.rsp":"7ea7bcf00fadc20949fae63703e40681ddf288fea808471cb3cbc95f3ec16811","third_party/NIST/SHAVS/SHA512LongMsg.rsp":"b1f3f05d5c209777954d49521d7ea1349447c36a0c52849e044bc397a27dd410","third_party/NIST/SHAVS/SHA512Monte.rsp":"8ca78659286c2f01667a98fc7accd32fc171ae7b24ac00f1a8ce6b77770247fa","third_party/NIST/SHAVS/SHA512ShortMsg.rsp":"e53a36c03609e5a3e3cc4b6e117a499db7864c23ec825c6cec99503a45f40764","third_party/fiat/LICENSE":"0c125a4dab5ab869473e6491db22f6c0a7f8a4de58588d03bb2b16c0c8ebd7de","third_party/fiat/curve25519.c":"368a56e9eb3418f54b306312055d4ecd8f923754b82dcba18f131cc463e7b21d","third_party/fiat/curve25519_tables.h":"668f3615a9cac425b96619b46de44631976e167f0cfc842ab87844dcd8a5c529","third_party/fiat/internal.h":"64cfb8ea1802ebc8f8efc45b37617b06e0b67e576612578ea50f5f5b200c19f8","third_party/fiat/make_curve25519_tables.py":"c499f166e8df31f23cf00296b46f7634aaacbb0f48f5bfa0277c27bdf89a619d"},"package":"148fc853f6d85f53f5f315d46701eaacc565cdfb3cb1959730c96e81e7e49999"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/ring/Cargo.toml b/rustc_deps/vendor/ring/Cargo.toml
index 60a90ee..371d370 100644
--- a/rustc_deps/vendor/ring/Cargo.toml
+++ b/rustc_deps/vendor/ring/Cargo.toml
@@ -13,12 +13,12 @@
 [package]
 edition = "2018"
 name = "ring"
-version = "0.14.3"
+version = "0.14.5"
 authors = ["Brian Smith <brian@briansmith.org>"]
 build = "build.rs"
 links = "ring-asm"
 exclude = [".gitignore", "pregenerated/tmp"]
-include = ["LICENSE", "Cargo.toml", "pregenerated/*", "build.rs", "crypto/block.c", "crypto/block.h", "crypto/chacha/asm/chacha-armv4.pl", "crypto/chacha/asm/chacha-armv8.pl", "crypto/chacha/asm/chacha-x86.pl", "crypto/chacha/asm/chacha-x86_64.pl", "crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl", "crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt", "crypto/cipher_extra/test/aes_256_gcm_siv_tests.txt", "crypto/constant_time_test.c", "crypto/cpu-aarch64-linux.c", "crypto/cpu-arm-linux.c", "crypto/cpu-arm.c", "crypto/cpu-intel.c", "crypto/crypto.c", "crypto/curve25519/asm/x25519-asm-arm.S", "crypto/fipsmodule/aes/aes.c", "crypto/fipsmodule/aes/asm/aes-586.pl", "crypto/fipsmodule/aes/asm/aes-armv4.pl", "crypto/fipsmodule/aes/asm/aes-x86_64.pl", "crypto/fipsmodule/aes/asm/aesni-x86.pl", "crypto/fipsmodule/aes/asm/aesni-x86_64.pl", "crypto/fipsmodule/aes/asm/aesv8-armx.pl", "crypto/fipsmodule/aes/asm/bsaes-armv7.pl", "crypto/fipsmodule/aes/asm/bsaes-x86_64.pl", "crypto/fipsmodule/aes/asm/vpaes-x86.pl", "crypto/fipsmodule/aes/asm/vpaes-x86_64.pl", "crypto/fipsmodule/aes/internal.h", "crypto/fipsmodule/bn/asm/armv4-mont.pl", "crypto/fipsmodule/bn/asm/armv8-mont.pl", "crypto/fipsmodule/bn/asm/x86-mont.pl", "crypto/fipsmodule/bn/asm/x86_64-mont.pl", "crypto/fipsmodule/bn/asm/x86_64-mont5.pl", "crypto/fipsmodule/bn/generic.c", "crypto/fipsmodule/bn/internal.h", "crypto/fipsmodule/bn/montgomery.c", "crypto/fipsmodule/bn/montgomery_inv.c", "crypto/fipsmodule/cipher/e_aes.c", "crypto/fipsmodule/ec/asm/ecp_nistz256-armv4.pl", "crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl", "crypto/fipsmodule/ec/asm/ecp_nistz256-x86.pl", "crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl", "crypto/fipsmodule/ec/ecp_nistz.c", "crypto/fipsmodule/ec/ecp_nistz.h", "crypto/fipsmodule/ec/ecp_nistz256.c", "crypto/fipsmodule/ec/ecp_nistz256.h", "crypto/fipsmodule/ec/ecp_nistz256_table.inl", "crypto/fipsmodule/ec/ecp_nistz384.h", "crypto/fipsmodule/ec/ecp_nistz384.inl", "crypto/fipsmodule/ec/gfp_p256.c", "crypto/fipsmodule/ec/gfp_p384.c", "crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt", "crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl", "crypto/fipsmodule/modes/asm/ghash-armv4.pl", "crypto/fipsmodule/modes/asm/ghash-x86.pl", "crypto/fipsmodule/modes/asm/ghash-x86_64.pl", "crypto/fipsmodule/modes/asm/ghashv8-armx.pl", "crypto/fipsmodule/modes/gcm.c", "crypto/fipsmodule/modes/internal.h", "crypto/fipsmodule/sha/asm/sha256-586.pl", "crypto/fipsmodule/sha/asm/sha256-armv4.pl", "crypto/fipsmodule/sha/asm/sha512-586.pl", "crypto/fipsmodule/sha/asm/sha512-armv4.pl", "crypto/fipsmodule/sha/asm/sha512-armv8.pl", "crypto/fipsmodule/sha/asm/sha512-x86_64.pl", "crypto/internal.h", "crypto/limbs/limbs.c", "crypto/limbs/limbs.h", "crypto/limbs/limbs.inl", "crypto/mem.c", "crypto/perlasm/arm-xlate.pl", "crypto/perlasm/x86asm.pl", "crypto/perlasm/x86gas.pl", "crypto/perlasm/x86nasm.pl", "crypto/perlasm/x86_64-xlate.pl", "crypto/poly1305/asm/poly1305-armv4.pl", "crypto/poly1305/asm/poly1305-armv8.pl", "crypto/poly1305/asm/poly1305-x86.pl", "crypto/poly1305/asm/poly1305-x86_64.pl", "examples/checkdigest.rs", "include/GFp/aes.h", "include/GFp/arm_arch.h", "include/GFp/base.h", "include/GFp/cpu.h", "include/GFp/mem.h", "include/GFp/type_check.h", "src/aead.rs", "src/aead/aes.rs", "src/aead/aes_gcm.rs", "src/aead/aes_tests.txt", "src/aead/block.rs", "src/aead/chacha.rs", "src/aead/chacha_tests.txt", "src/aead/chacha20_poly1305.rs", "src/aead/chacha20_poly1305_openssh.rs", "src/aead/gcm.rs", "src/aead/nonce.rs", "src/aead/poly1305.rs", "src/aead/poly1305_test.txt", "src/aead/quic.rs", "src/aead/shift.rs", "src/agreement.rs", "src/arithmetic.rs", "src/arithmetic/montgomery.rs", "src/array.rs", "src/bits.rs", "src/bssl.rs", "src/c.rs", "src/constant_time.rs", "src/cpu.rs", "src/data/alg-rsa-encryption.der", "src/debug.rs", "src/digest.rs", "src/digest/sha1.rs", "src/ec/curve25519/ed25519/digest.rs", "src/ec/curve25519/ed25519.rs", "src/ec/curve25519/ed25519/signing.rs", "src/ec/curve25519/ed25519/verification.rs", "src/ec/curve25519/ed25519/ed25519_pkcs8_v2_template.der", "src/ec/curve25519.rs", "src/ec/curve25519/ops.rs", "src/ec/curve25519/x25519.rs", "src/ec.rs", "src/ec/keys.rs", "src/ec/suite_b/curve.rs", "src/ec/suite_b/ecdh.rs", "src/ec/suite_b/ecdsa/digest_scalar.rs", "src/ec/suite_b/ecdsa.rs", "src/ec/suite_b/ecdsa/signing.rs", "src/ec/suite_b/ecdsa/verification.rs", "src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt", "src/ec/suite_b/ecdsa/ecPublicKey_p256_pkcs8_v1_template.der", "src/ec/suite_b/ecdsa/ecPublicKey_p384_pkcs8_v1_template.der", "src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt", "src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt", "src/ec/suite_b.rs", "src/ec/suite_b/ops/elem.rs", "src/ec/suite_b/ops.rs", "src/ec/suite_b/ops/p256.rs", "src/ec/suite_b/ops/p256_elem_mul_tests.txt", "src/ec/suite_b/ops/p256_elem_neg_tests.txt", "src/ec/suite_b/ops/p256_elem_sum_tests.txt", "src/ec/suite_b/ops/p256_point_double_tests.txt", "src/ec/suite_b/ops/p256_point_mul_base_tests.txt", "src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt", "src/ec/suite_b/ops/p256_point_mul_tests.txt", "src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt", "src/ec/suite_b/ops/p256_point_sum_tests.txt", "src/ec/suite_b/ops/p256_scalar_mul_tests.txt", "src/ec/suite_b/ops/p256_scalar_square_tests.txt", "src/ec/suite_b/ops/p384.rs", "src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt", "src/ec/suite_b/ops/p384_elem_mul_tests.txt", "src/ec/suite_b/ops/p384_elem_neg_tests.txt", "src/ec/suite_b/ops/p384_elem_sum_tests.txt", "src/ec/suite_b/ops/p384_point_double_tests.txt", "src/ec/suite_b/ops/p384_point_mul_base_tests.txt", "src/ec/suite_b/ops/p384_point_mul_tests.txt", "src/ec/suite_b/ops/p384_point_sum_tests.txt", "src/ec/suite_b/ops/p384_scalar_mul_tests.txt", "src/ec/suite_b/private_key.rs", "src/ec/suite_b/public_key.rs", "src/ec/suite_b/suite_b_public_key_tests.txt", "src/endian.rs", "src/error.rs", "src/hkdf.rs", "src/hmac.rs", "src/hmac_generate_serializable_tests.txt", "src/io.rs", "src/io/der.rs", "src/io/der_writer.rs", "src/io/writer.rs", "src/lib.rs", "src/limb.rs", "src/endian.rs", "src/pbkdf2.rs", "src/pkcs8.rs", "src/polyfill.rs", "src/polyfill/convert.rs", "src/rand.rs", "src/rsa/bigint.rs", "src/rsa/bigint_elem_exp_consttime_tests.txt", "src/rsa/bigint_elem_exp_vartime_tests.txt", "src/rsa/bigint_elem_mul_tests.txt", "src/rsa/bigint_elem_reduced_once_tests.txt", "src/rsa/bigint_elem_reduced_tests.txt", "src/rsa/bigint_elem_squared_tests.txt", "src/rsa/convert_nist_rsa_test_vectors.py", "src/rsa.rs", "src/rsa/padding.rs", "src/rsa/random.rs", "src/rsa/rsa_pss_padding_tests.txt", "src/rsa/signature_rsa_example_private_key.der", "src/rsa/signature_rsa_example_public_key.der", "src/rsa/signing.rs", "src/rsa/verification.rs", "src/signature.rs", "src/test.rs", "src/test_1_syntax_error_tests.txt", "src/test_1_tests.txt", "src/test_3_tests.txt", "tests/aead_aes_128_gcm_tests.txt", "tests/aead_aes_256_gcm_tests.txt", "tests/aead_chacha20_poly1305_tests.txt", "tests/aead_chacha20_poly1305_openssh_tests.txt", "tests/aead_tests.rs", "tests/agreement_tests.rs", "tests/agreement_tests.txt", "tests/digest_tests.rs", "tests/digest_tests.txt", "tests/ecdsa_from_pkcs8_tests.txt", "tests/ecdsa_tests.rs", "tests/ecdsa_test_private_key_p256.p8", "tests/ecdsa_test_public_key_p256.der", "tests/ecdsa_test_public_key_p256_debug.txt", "tests/ecdsa_sign_asn1_tests.txt", "tests/ecdsa_sign_fixed_tests.txt", "tests/ecdsa_verify_asn1_tests.txt", "tests/ecdsa_verify_fixed_tests.txt", "tests/ed25519_from_pkcs8_tests.txt", "tests/ed25519_from_pkcs8_unchecked_tests.txt", "tests/ed25519_tests.rs", "tests/ed25519_tests.txt", "tests/ed25519_test_private_key.bin", "tests/ed25519_test_private_key.p8", "tests/ed25519_test_public_key.bin", "tests/ed25519_test_public_key.der", "tests/hkdf_tests.rs", "tests/hkdf_tests.txt", "tests/hmac_tests.rs", "tests/hmac_tests.txt", "tests/pbkdf2_tests.rs", "tests/pbkdf2_tests.txt", "tests/quic_aes_128_tests.txt", "tests/quic_aes_256_tests.txt", "tests/quic_chacha20_tests.txt", "tests/quic_tests.rs", "tests/rsa_from_pkcs8_tests.txt", "tests/rsa_pkcs1_sign_tests.txt", "tests/rsa_pkcs1_verify_tests.txt", "tests/rsa_primitive_verify_tests.txt", "tests/rsa_pss_sign_tests.txt", "tests/rsa_pss_verify_tests.txt", "tests/rsa_tests.rs", "tests/rsa_test_private_key_2048.p8", "tests/rsa_test_public_key_2048.der", "tests/rsa_test_public_key_2048_debug.txt", "tests/signature_tests.rs", "third_party/fiat/curve25519.c", "third_party/fiat/curve25519_tables.h", "third_party/fiat/internal.h", "third_party/fiat/LICENSE", "third_party/fiat/make_curve25519_tables.py", "third_party/NIST/SHAVS/SHA1LongMsg.rsp", "third_party/NIST/SHAVS/SHA1Monte.rsp", "third_party/NIST/SHAVS/SHA1ShortMsg.rsp", "third_party/NIST/SHAVS/SHA224LongMsg.rsp", "third_party/NIST/SHAVS/SHA224Monte.rsp", "third_party/NIST/SHAVS/SHA224ShortMsg.rsp", "third_party/NIST/SHAVS/SHA256LongMsg.rsp", "third_party/NIST/SHAVS/SHA256Monte.rsp", "third_party/NIST/SHAVS/SHA256ShortMsg.rsp", "third_party/NIST/SHAVS/SHA384LongMsg.rsp", "third_party/NIST/SHAVS/SHA384Monte.rsp", "third_party/NIST/SHAVS/SHA384ShortMsg.rsp", "third_party/NIST/SHAVS/SHA512LongMsg.rsp", "third_party/NIST/SHAVS/SHA512Monte.rsp", "third_party/NIST/SHAVS/SHA512ShortMsg.rsp"]
+include = ["LICENSE", "Cargo.toml", "pregenerated/*", "build.rs", "crypto/block.c", "crypto/block.h", "crypto/chacha/asm/chacha-armv4.pl", "crypto/chacha/asm/chacha-armv8.pl", "crypto/chacha/asm/chacha-x86.pl", "crypto/chacha/asm/chacha-x86_64.pl", "crypto/cipher_extra/asm/aes128gcmsiv-x86_64.pl", "crypto/cipher_extra/test/aes_128_gcm_siv_tests.txt", "crypto/cipher_extra/test/aes_256_gcm_siv_tests.txt", "crypto/constant_time_test.c", "crypto/cpu-intel.c", "crypto/crypto.c", "crypto/curve25519/asm/x25519-asm-arm.S", "crypto/fipsmodule/aes/aes.c", "crypto/fipsmodule/aes/asm/aes-586.pl", "crypto/fipsmodule/aes/asm/aes-armv4.pl", "crypto/fipsmodule/aes/asm/aes-x86_64.pl", "crypto/fipsmodule/aes/asm/aesni-x86.pl", "crypto/fipsmodule/aes/asm/aesni-x86_64.pl", "crypto/fipsmodule/aes/asm/aesv8-armx.pl", "crypto/fipsmodule/aes/asm/bsaes-armv7.pl", "crypto/fipsmodule/aes/asm/bsaes-x86_64.pl", "crypto/fipsmodule/aes/asm/vpaes-x86.pl", "crypto/fipsmodule/aes/asm/vpaes-x86_64.pl", "crypto/fipsmodule/bn/asm/armv4-mont.pl", "crypto/fipsmodule/bn/asm/armv8-mont.pl", "crypto/fipsmodule/bn/asm/x86-mont.pl", "crypto/fipsmodule/bn/asm/x86_64-mont.pl", "crypto/fipsmodule/bn/asm/x86_64-mont5.pl", "crypto/fipsmodule/bn/generic.c", "crypto/fipsmodule/bn/internal.h", "crypto/fipsmodule/bn/montgomery.c", "crypto/fipsmodule/bn/montgomery_inv.c", "crypto/fipsmodule/ec/asm/ecp_nistz256-armv4.pl", "crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl", "crypto/fipsmodule/ec/asm/ecp_nistz256-x86.pl", "crypto/fipsmodule/ec/asm/p256-x86_64-asm.pl", "crypto/fipsmodule/ec/ecp_nistz.c", "crypto/fipsmodule/ec/ecp_nistz.h", "crypto/fipsmodule/ec/ecp_nistz256.c", "crypto/fipsmodule/ec/ecp_nistz256.h", "crypto/fipsmodule/ec/ecp_nistz256_table.inl", "crypto/fipsmodule/ec/ecp_nistz384.h", "crypto/fipsmodule/ec/ecp_nistz384.inl", "crypto/fipsmodule/ec/gfp_p256.c", "crypto/fipsmodule/ec/gfp_p384.c", "crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt", "crypto/fipsmodule/modes/asm/aesni-gcm-x86_64.pl", "crypto/fipsmodule/modes/asm/ghash-armv4.pl", "crypto/fipsmodule/modes/asm/ghash-x86.pl", "crypto/fipsmodule/modes/asm/ghash-x86_64.pl", "crypto/fipsmodule/modes/asm/ghashv8-armx.pl", "crypto/fipsmodule/modes/gcm.c", "crypto/fipsmodule/modes/internal.h", "crypto/fipsmodule/sha/asm/sha256-586.pl", "crypto/fipsmodule/sha/asm/sha256-armv4.pl", "crypto/fipsmodule/sha/asm/sha512-586.pl", "crypto/fipsmodule/sha/asm/sha512-armv4.pl", "crypto/fipsmodule/sha/asm/sha512-armv8.pl", "crypto/fipsmodule/sha/asm/sha512-x86_64.pl", "crypto/internal.h", "crypto/limbs/limbs.c", "crypto/limbs/limbs.h", "crypto/limbs/limbs.inl", "crypto/mem.c", "crypto/perlasm/arm-xlate.pl", "crypto/perlasm/x86asm.pl", "crypto/perlasm/x86gas.pl", "crypto/perlasm/x86nasm.pl", "crypto/perlasm/x86_64-xlate.pl", "crypto/poly1305/asm/poly1305-armv4.pl", "crypto/poly1305/asm/poly1305-armv8.pl", "crypto/poly1305/asm/poly1305-x86.pl", "crypto/poly1305/asm/poly1305-x86_64.pl", "examples/checkdigest.rs", "include/GFp/aes.h", "include/GFp/arm_arch.h", "include/GFp/base.h", "include/GFp/cpu.h", "include/GFp/mem.h", "include/GFp/type_check.h", "src/aead.rs", "src/aead/aes.rs", "src/aead/aes_gcm.rs", "src/aead/aes_tests.txt", "src/aead/block.rs", "src/aead/chacha.rs", "src/aead/chacha_tests.txt", "src/aead/chacha20_poly1305.rs", "src/aead/chacha20_poly1305_openssh.rs", "src/aead/gcm.rs", "src/aead/nonce.rs", "src/aead/poly1305.rs", "src/aead/poly1305_test.txt", "src/aead/quic.rs", "src/aead/shift.rs", "src/agreement.rs", "src/arithmetic.rs", "src/arithmetic/montgomery.rs", "src/array.rs", "src/bits.rs", "src/bssl.rs", "src/c.rs", "src/constant_time.rs", "src/cpu.rs", "src/data/alg-rsa-encryption.der", "src/debug.rs", "src/digest.rs", "src/digest/sha1.rs", "src/ec/curve25519/ed25519/digest.rs", "src/ec/curve25519/ed25519.rs", "src/ec/curve25519/ed25519/signing.rs", "src/ec/curve25519/ed25519/verification.rs", "src/ec/curve25519/ed25519/ed25519_pkcs8_v2_template.der", "src/ec/curve25519.rs", "src/ec/curve25519/ops.rs", "src/ec/curve25519/x25519.rs", "src/ec.rs", "src/ec/keys.rs", "src/ec/suite_b/curve.rs", "src/ec/suite_b/ecdh.rs", "src/ec/suite_b/ecdsa/digest_scalar.rs", "src/ec/suite_b/ecdsa.rs", "src/ec/suite_b/ecdsa/signing.rs", "src/ec/suite_b/ecdsa/verification.rs", "src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt", "src/ec/suite_b/ecdsa/ecPublicKey_p256_pkcs8_v1_template.der", "src/ec/suite_b/ecdsa/ecPublicKey_p384_pkcs8_v1_template.der", "src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt", "src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt", "src/ec/suite_b.rs", "src/ec/suite_b/ops/elem.rs", "src/ec/suite_b/ops.rs", "src/ec/suite_b/ops/p256.rs", "src/ec/suite_b/ops/p256_elem_mul_tests.txt", "src/ec/suite_b/ops/p256_elem_neg_tests.txt", "src/ec/suite_b/ops/p256_elem_sum_tests.txt", "src/ec/suite_b/ops/p256_point_double_tests.txt", "src/ec/suite_b/ops/p256_point_mul_base_tests.txt", "src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt", "src/ec/suite_b/ops/p256_point_mul_tests.txt", "src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt", "src/ec/suite_b/ops/p256_point_sum_tests.txt", "src/ec/suite_b/ops/p256_scalar_mul_tests.txt", "src/ec/suite_b/ops/p256_scalar_square_tests.txt", "src/ec/suite_b/ops/p384.rs", "src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt", "src/ec/suite_b/ops/p384_elem_mul_tests.txt", "src/ec/suite_b/ops/p384_elem_neg_tests.txt", "src/ec/suite_b/ops/p384_elem_sum_tests.txt", "src/ec/suite_b/ops/p384_point_double_tests.txt", "src/ec/suite_b/ops/p384_point_mul_base_tests.txt", "src/ec/suite_b/ops/p384_point_mul_tests.txt", "src/ec/suite_b/ops/p384_point_sum_tests.txt", "src/ec/suite_b/ops/p384_scalar_mul_tests.txt", "src/ec/suite_b/private_key.rs", "src/ec/suite_b/public_key.rs", "src/ec/suite_b/suite_b_public_key_tests.txt", "src/endian.rs", "src/error.rs", "src/hkdf.rs", "src/hmac.rs", "src/hmac_generate_serializable_tests.txt", "src/io.rs", "src/io/der.rs", "src/io/der_writer.rs", "src/io/writer.rs", "src/lib.rs", "src/limb.rs", "src/endian.rs", "src/pbkdf2.rs", "src/pkcs8.rs", "src/polyfill.rs", "src/polyfill/convert.rs", "src/rand.rs", "src/rsa/bigint.rs", "src/rsa/bigint_elem_exp_consttime_tests.txt", "src/rsa/bigint_elem_exp_vartime_tests.txt", "src/rsa/bigint_elem_mul_tests.txt", "src/rsa/bigint_elem_reduced_once_tests.txt", "src/rsa/bigint_elem_reduced_tests.txt", "src/rsa/bigint_elem_squared_tests.txt", "src/rsa/convert_nist_rsa_test_vectors.py", "src/rsa.rs", "src/rsa/padding.rs", "src/rsa/random.rs", "src/rsa/rsa_pss_padding_tests.txt", "src/rsa/signature_rsa_example_private_key.der", "src/rsa/signature_rsa_example_public_key.der", "src/rsa/signing.rs", "src/rsa/verification.rs", "src/signature.rs", "src/test.rs", "src/test_1_syntax_error_tests.txt", "src/test_1_tests.txt", "src/test_3_tests.txt", "tests/aead_aes_128_gcm_tests.txt", "tests/aead_aes_256_gcm_tests.txt", "tests/aead_chacha20_poly1305_tests.txt", "tests/aead_chacha20_poly1305_openssh_tests.txt", "tests/aead_tests.rs", "tests/agreement_tests.rs", "tests/agreement_tests.txt", "tests/digest_tests.rs", "tests/digest_tests.txt", "tests/ecdsa_from_pkcs8_tests.txt", "tests/ecdsa_tests.rs", "tests/ecdsa_test_private_key_p256.p8", "tests/ecdsa_test_public_key_p256.der", "tests/ecdsa_test_public_key_p256_debug.txt", "tests/ecdsa_sign_asn1_tests.txt", "tests/ecdsa_sign_fixed_tests.txt", "tests/ecdsa_verify_asn1_tests.txt", "tests/ecdsa_verify_fixed_tests.txt", "tests/ed25519_from_pkcs8_tests.txt", "tests/ed25519_from_pkcs8_unchecked_tests.txt", "tests/ed25519_tests.rs", "tests/ed25519_tests.txt", "tests/ed25519_test_private_key.bin", "tests/ed25519_test_private_key.p8", "tests/ed25519_test_public_key.bin", "tests/ed25519_test_public_key.der", "tests/hkdf_tests.rs", "tests/hkdf_tests.txt", "tests/hmac_tests.rs", "tests/hmac_tests.txt", "tests/pbkdf2_tests.rs", "tests/pbkdf2_tests.txt", "tests/quic_aes_128_tests.txt", "tests/quic_aes_256_tests.txt", "tests/quic_chacha20_tests.txt", "tests/quic_tests.rs", "tests/rsa_from_pkcs8_tests.txt", "tests/rsa_pkcs1_sign_tests.txt", "tests/rsa_pkcs1_verify_tests.txt", "tests/rsa_primitive_verify_tests.txt", "tests/rsa_pss_sign_tests.txt", "tests/rsa_pss_verify_tests.txt", "tests/rsa_tests.rs", "tests/rsa_test_private_key_2048.p8", "tests/rsa_test_public_key_2048.der", "tests/rsa_test_public_key_2048_debug.txt", "tests/signature_tests.rs", "third_party/fiat/curve25519.c", "third_party/fiat/curve25519_tables.h", "third_party/fiat/internal.h", "third_party/fiat/LICENSE", "third_party/fiat/make_curve25519_tables.py", "third_party/NIST/SHAVS/SHA1LongMsg.rsp", "third_party/NIST/SHAVS/SHA1Monte.rsp", "third_party/NIST/SHAVS/SHA1ShortMsg.rsp", "third_party/NIST/SHAVS/SHA224LongMsg.rsp", "third_party/NIST/SHAVS/SHA224Monte.rsp", "third_party/NIST/SHAVS/SHA224ShortMsg.rsp", "third_party/NIST/SHAVS/SHA256LongMsg.rsp", "third_party/NIST/SHAVS/SHA256Monte.rsp", "third_party/NIST/SHAVS/SHA256ShortMsg.rsp", "third_party/NIST/SHAVS/SHA384LongMsg.rsp", "third_party/NIST/SHAVS/SHA384Monte.rsp", "third_party/NIST/SHAVS/SHA384ShortMsg.rsp", "third_party/NIST/SHAVS/SHA512LongMsg.rsp", "third_party/NIST/SHAVS/SHA512Monte.rsp", "third_party/NIST/SHAVS/SHA512ShortMsg.rsp"]
 description = "Safe, fast, small crypto using Rust."
 documentation = "https://briansmith.org/rustdoc/ring/"
 readme = "doc/link-to-readme.md"
@@ -56,7 +56,9 @@
 slow_tests = []
 test_logging = []
 use_heap = []
+[target."cfg(any(target_os = \"android\", target_os = \"linux\"))".dependencies.libc]
+version = "0.2.45"
 [target."cfg(any(target_os = \"redox\", all(unix, not(any(target_os = \"macos\", target_os = \"ios\")))))".dependencies.lazy_static]
 version = "1.2"
-[target."cfg(target_os = \"linux\")".dependencies.libc]
-version = "0.2.45"
+[target."cfg(not(target_os = \"ios\"))".dependencies.spin]
+version = "0.5.0"
diff --git a/rustc_deps/vendor/ring/build.rs b/rustc_deps/vendor/ring/build.rs
index 8a98839..45cfab7 100644
--- a/rustc_deps/vendor/ring/build.rs
+++ b/rustc_deps/vendor/ring/build.rs
@@ -55,7 +55,6 @@
     (&[], "crypto/fipsmodule/bn/generic.c"),
     (&[], "crypto/fipsmodule/bn/montgomery.c"),
     (&[], "crypto/fipsmodule/bn/montgomery_inv.c"),
-    (&[], "crypto/fipsmodule/cipher/e_aes.c"),
     (&[], "crypto/crypto.c"),
     (&[], "crypto/fipsmodule/ec/ecp_nistz.c"),
     (&[], "crypto/fipsmodule/ec/ecp_nistz256.c"),
@@ -94,8 +93,6 @@
     (&[X86_64], SHA512_X86_64),
 
     (&[AARCH64, ARM], "crypto/fipsmodule/aes/asm/aesv8-armx.pl"),
-    (&[AARCH64, ARM], "crypto/cpu-arm-linux.c"),
-    (&[AARCH64, ARM], "crypto/cpu-arm.c"),
     (&[AARCH64, ARM], "crypto/fipsmodule/modes/asm/ghashv8-armx.pl"),
 
     (&[ARM], "crypto/fipsmodule/aes/asm/aes-armv4.pl"),
@@ -111,7 +108,6 @@
 
     (&[AARCH64], "crypto/fipsmodule/aes/aes.c"),
     (&[AARCH64], "crypto/fipsmodule/bn/asm/armv8-mont.pl"),
-    (&[AARCH64], "crypto/cpu-aarch64-linux.c"),
     (&[AARCH64], "crypto/chacha/asm/chacha-armv8.pl"),
     (&[AARCH64], "crypto/fipsmodule/ec/asm/ecp_nistz256-armv8.pl"),
     (&[AARCH64], "crypto/poly1305/asm/poly1305-armv8.pl"),
@@ -128,8 +124,7 @@
 
 #[cfg_attr(rustfmt, rustfmt_skip)]
 const RING_INCLUDES: &[&str] =
-    &["crypto/fipsmodule/aes/internal.h",
-      "crypto/fipsmodule/bn/internal.h",
+    &["crypto/fipsmodule/bn/internal.h",
       "crypto/fipsmodule/ec/ecp_nistz256_table.inl",
       "crypto/fipsmodule/ec/ecp_nistz384.inl",
       "crypto/fipsmodule/ec/ecp_nistz.h",
diff --git a/rustc_deps/vendor/ring/crypto/cpu-aarch64-linux.c b/rustc_deps/vendor/ring/crypto/cpu-aarch64-linux.c
deleted file mode 100644
index d9a0954..0000000
--- a/rustc_deps/vendor/ring/crypto/cpu-aarch64-linux.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Copyright (c) 2016, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-#include <GFp/cpu.h>
-
-#if defined(OPENSSL_AARCH64) && !defined(OPENSSL_STATIC_ARMCAP)
-
-#include <sys/auxv.h>
-
-#include <GFp/arm_arch.h>
-
-#include "internal.h"
-
-
-extern uint32_t GFp_armcap_P;
-
-void GFp_cpuid_setup(void) {
-  unsigned long hwcap = getauxval(AT_HWCAP);
-
-  // See /usr/include/asm/hwcap.h on an aarch64 installation for the source of
-  // these values.
-  static const unsigned long kNEON = 1 << 1;
-  static const unsigned long kAES = 1 << 3;
-  static const unsigned long kPMULL = 1 << 4;
-  static const unsigned long kSHA1 = 1 << 5;
-  static const unsigned long kSHA256 = 1 << 6;
-
-  if ((hwcap & kNEON) == 0) {
-    // Matching OpenSSL, if NEON is missing, don't report other features
-    // either.
-    return;
-  }
-
-  GFp_armcap_P |= ARMV7_NEON;
-
-  if (hwcap & kAES) {
-    GFp_armcap_P |= ARMV8_AES;
-  }
-  if (hwcap & kPMULL) {
-    GFp_armcap_P |= ARMV8_PMULL;
-  }
-  if (hwcap & kSHA1) {
-    GFp_armcap_P |= ARMV8_SHA1;
-  }
-  if (hwcap & kSHA256) {
-    GFp_armcap_P |= ARMV8_SHA256;
-  }
-}
-
-#endif  // OPENSSL_AARCH64 && !OPENSSL_STATIC_ARMCAP
diff --git a/rustc_deps/vendor/ring/crypto/cpu-arm-linux.c b/rustc_deps/vendor/ring/crypto/cpu-arm-linux.c
deleted file mode 100644
index 96d48fb..0000000
--- a/rustc_deps/vendor/ring/crypto/cpu-arm-linux.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* Copyright (c) 2016, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-#include <GFp/cpu.h>
-
-#if defined(OPENSSL_ARM) && !defined(OPENSSL_STATIC_ARMCAP)
-
-#include <sys/auxv.h>
-#include <GFp/arm_arch.h>
-
-#include "internal.h"
-
-
-#define AT_HWCAP 16
-#define AT_HWCAP2 26
-
-#define HWCAP_NEON (1 << 12)
-
-// See /usr/include/asm/hwcap.h on an ARM installation for the source of
-// these values.
-#define HWCAP2_AES (1 << 0)
-#define HWCAP2_PMULL (1 << 1)
-#define HWCAP2_SHA1 (1 << 2)
-#define HWCAP2_SHA2 (1 << 3)
-
-extern uint32_t GFp_armcap_P;
-
-void GFp_cpuid_setup(void) {
-  // |getauxval| is not available on Android until API level 20. Unlike
-  // BoringSSL, require API level 20.
-  unsigned long hwcap = getauxval(AT_HWCAP);
-
-  // Matching OpenSSL, only report other features if NEON is present.
-  if (hwcap & HWCAP_NEON) {
-    GFp_armcap_P |= ARMV7_NEON;
-
-    // Note that some (old?) ARMv8 Android devices don't support |AT_HWCAP2|
-    // even when the instructions are available.
-    unsigned long hwcap2 = getauxval(AT_HWCAP2);
-
-    if (hwcap2 & HWCAP2_AES) {
-      GFp_armcap_P |= ARMV8_AES;
-    }
-    if (hwcap2 & HWCAP2_PMULL) {
-      GFp_armcap_P |= ARMV8_PMULL;
-    }
-    if (hwcap2 & HWCAP2_SHA1) {
-      GFp_armcap_P |= ARMV8_SHA1;
-    }
-    if (hwcap2 & HWCAP2_SHA2) {
-      GFp_armcap_P |= ARMV8_SHA256;
-    }
-  }
-}
-
-#endif  // OPENSSL_ARM && !OPENSSL_STATIC_ARMCAP
diff --git a/rustc_deps/vendor/ring/crypto/cpu-arm.c b/rustc_deps/vendor/ring/crypto/cpu-arm.c
deleted file mode 100644
index e41f78c..0000000
--- a/rustc_deps/vendor/ring/crypto/cpu-arm.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright (c) 2014, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-#include <GFp/cpu.h>
-
-#if (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) && \
-    !defined(OPENSSL_STATIC_ARMCAP)
-
-#include <GFp/arm_arch.h>
-
-
-extern uint32_t GFp_armcap_P;
-
-uint8_t GFp_is_NEON_capable_at_runtime(void) {
-  return (GFp_armcap_P & ARMV7_NEON) != 0;
-}
-
-int GFp_is_ARMv8_AES_capable(void) {
-  return (GFp_armcap_P & ARMV8_AES) != 0;
-}
-
-int GFp_is_ARMv8_PMULL_capable(void) {
-  return (GFp_armcap_P & ARMV8_PMULL) != 0;
-}
-
-#endif  /* (defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)) &&
-           !defined(OPENSSL_STATIC_ARMCAP) */
diff --git a/rustc_deps/vendor/ring/crypto/crypto.c b/rustc_deps/vendor/ring/crypto/crypto.c
index 84d1446..9c30693 100644
--- a/rustc_deps/vendor/ring/crypto/crypto.c
+++ b/rustc_deps/vendor/ring/crypto/crypto.c
@@ -62,30 +62,7 @@
 
 #include <GFp/arm_arch.h>
 
-#if defined(OPENSSL_STATIC_ARMCAP)
-
-HIDDEN uint32_t GFp_armcap_P =
-#if defined(OPENSSL_STATIC_ARMCAP_NEON) || \
-    (defined(__ARM_NEON__) || defined(__ARM_NEON))
-    ARMV7_NEON |
-#endif
-#if defined(OPENSSL_STATIC_ARMCAP_AES) || defined(__ARM_FEATURE_CRYPTO)
-    ARMV8_AES |
-#endif
-#if defined(OPENSSL_STATIC_ARMCAP_SHA1) || defined(__ARM_FEATURE_CRYPTO)
-    ARMV8_SHA1 |
-#endif
-#if defined(OPENSSL_STATIC_ARMCAP_SHA256) || defined(__ARM_FEATURE_CRYPTO)
-    ARMV8_SHA256 |
-#endif
-#if defined(OPENSSL_STATIC_ARMCAP_PMULL) || defined(__ARM_FEATURE_CRYPTO)
-    ARMV8_PMULL |
-#endif
-    0;
-
-#else
 HIDDEN uint32_t GFp_armcap_P = 0;
-#endif
 
 #endif
 
diff --git a/rustc_deps/vendor/ring/crypto/fipsmodule/aes/aes.c b/rustc_deps/vendor/ring/crypto/fipsmodule/aes/aes.c
index 5c4f5cb..9667d69 100644
--- a/rustc_deps/vendor/ring/crypto/fipsmodule/aes/aes.c
+++ b/rustc_deps/vendor/ring/crypto/fipsmodule/aes/aes.c
@@ -50,7 +50,6 @@
 
 #include <GFp/cpu.h>
 
-#include "internal.h"
 #include "../modes/internal.h"
 
 int GFp_aes_nohw_set_encrypt_key(const uint8_t *key, unsigned bits,
diff --git a/rustc_deps/vendor/ring/crypto/fipsmodule/aes/internal.h b/rustc_deps/vendor/ring/crypto/fipsmodule/aes/internal.h
deleted file mode 100644
index 36cec2a..0000000
--- a/rustc_deps/vendor/ring/crypto/fipsmodule/aes/internal.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Copyright (c) 2017, Google Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
-
-#ifndef OPENSSL_HEADER_AES_INTERNAL_H
-#define OPENSSL_HEADER_AES_INTERNAL_H
-
-#include "../../internal.h"
-
-static inline int hwaes_capable(void) {
-#if defined(OPENSSL_X86_64) || defined(OPENSSL_X86)
-  return (GFp_ia32cap_P[1] & (1 << (57 - 32))) != 0;
-#elif defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)
-  return GFp_is_ARMv8_AES_capable();
-#elif defined(OPENSSL_PPC64LE)
-  return GFp_is_PPC64LE_vcrypto_capable();
-#endif
-}
-
-#endif  // OPENSSL_HEADER_AES_INTERNAL_H
diff --git a/rustc_deps/vendor/ring/crypto/fipsmodule/cipher/e_aes.c b/rustc_deps/vendor/ring/crypto/fipsmodule/cipher/e_aes.c
deleted file mode 100644
index 865e844..0000000
--- a/rustc_deps/vendor/ring/crypto/fipsmodule/cipher/e_aes.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* ====================================================================
- * Copyright (c) 2001-2011 The OpenSSL Project.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- *
- * 3. All advertising materials mentioning features or use of this
- *    software must display the following acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
- *
- * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
- *    endorse or promote products derived from this software without
- *    prior written permission. For written permission, please contact
- *    openssl-core@openssl.org.
- *
- * 5. Products derived from this software may not be called "OpenSSL"
- *    nor may "OpenSSL" appear in their names without prior written
- *    permission of the OpenSSL Project.
- *
- * 6. Redistributions of any form whatsoever must retain the following
- *    acknowledgment:
- *    "This product includes software developed by the OpenSSL Project
- *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
- *
- * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
- * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- * ==================================================================== */
-
-#include <GFp/cpu.h>
-
-#include "../aes/internal.h"
-
-#if defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)
-#include <GFp/arm_arch.h>
-#endif
-
-int GFp_aes_hw_capable(void);
-
-int GFp_aes_hw_capable(void) {
-  return hwaes_capable();
-}
-
-#if !defined(OPENSSL_NO_ASM) && \
-    (defined(OPENSSL_X86_64) || defined(OPENSSL_X86))
-int GFp_vpaes_capable(void);
-
-int GFp_vpaes_capable(void) {
-  return (GFp_ia32cap_P[1] & (1 << (41 - 32))) != 0;
-}
-#endif
-
-#if !defined(OPENSSL_NO_ASM) && \
-    defined(OPENSSL_ARM) && __ARM_MAX_ARCH__ >= 7
-int GFp_bsaes_capable(void);
-
-int GFp_bsaes_capable(void) {
-  return GFp_is_NEON_capable();
-}
-#endif
diff --git a/rustc_deps/vendor/ring/crypto/fipsmodule/modes/asm/ghash-x86.pl b/rustc_deps/vendor/ring/crypto/fipsmodule/modes/asm/ghash-x86.pl
index 4853629..a4af8b8 100644
--- a/rustc_deps/vendor/ring/crypto/fipsmodule/modes/asm/ghash-x86.pl
+++ b/rustc_deps/vendor/ring/crypto/fipsmodule/modes/asm/ghash-x86.pl
@@ -373,7 +373,7 @@
 	&bswap	($Zhh);
 }
 
-&function_begin("GFp_gcm_gmult_4bit_mmx");
+&function_begin("GFp_gcm_gmult_4bit");
 	&mov	($inp,&wparam(0));	# load Xi
 	&mov	($Htbl,&wparam(1));	# load Htable
 
@@ -391,7 +391,7 @@
 	&mov	(&DWP(4,$inp),$Zhl);
 	&mov	(&DWP(8,$inp),$Zlh);
 	&mov	(&DWP(0,$inp),$Zhh);
-&function_end("GFp_gcm_gmult_4bit_mmx");
+&function_end("GFp_gcm_gmult_4bit");
 
 ######################################################################
 # Below subroutine is "528B" variant of "4-bit" GCM GHASH function
@@ -400,7 +400,7 @@
 
 &static_label("rem_8bit");
 
-&function_begin("GFp_gcm_ghash_4bit_mmx");
+&function_begin("GFp_gcm_ghash_4bit");
 { my ($Zlo,$Zhi) = ("mm7","mm6");
   my $rem_8bit = "esi";
   my $Htbl = "ebx";
@@ -595,7 +595,7 @@
     &mov	("esp",&DWP(528+16+12,"esp"));	# restore original %esp
     &emms	();
 }
-&function_end("GFp_gcm_ghash_4bit_mmx");
+&function_end("GFp_gcm_ghash_4bit");
 }}
 
 if ($sse2) {{
diff --git a/rustc_deps/vendor/ring/crypto/fipsmodule/modes/asm/ghashv8-armx.pl b/rustc_deps/vendor/ring/crypto/fipsmodule/modes/asm/ghashv8-armx.pl
index 6e8614d..e550518 100644
--- a/rustc_deps/vendor/ring/crypto/fipsmodule/modes/asm/ghashv8-armx.pl
+++ b/rustc_deps/vendor/ring/crypto/fipsmodule/modes/asm/ghashv8-armx.pl
@@ -72,7 +72,7 @@
 ___
 
 ################################################################################
-# void GFp_gcm_init_v8(u128 Htable[16],const u64 H[2]);
+# void GFp_gcm_init_clmul(u128 Htable[16],const u64 H[2]);
 #
 # input:	128-bit H - secret parameter E(K,0^128)
 # output:	precomputed table filled with degrees of twisted H;
@@ -82,10 +82,10 @@
 #		optimize the code independently);
 #
 $code.=<<___;
-.global	GFp_gcm_init_v8
-.type	GFp_gcm_init_v8,%function
+.global	GFp_gcm_init_clmul
+.type	GFp_gcm_init_clmul,%function
 .align	4
-GFp_gcm_init_v8:
+GFp_gcm_init_clmul:
 	vld1.64		{$t1},[x1]		@ load input H
 	vmov.i8		$xC2,#0xe1
 	vshl.i64	$xC2,$xC2,#57		@ 0xc2.0
@@ -131,20 +131,20 @@
 	vst1.64		{$Hhl-$H2},[x0]		@ store Htable[1..2]
 
 	ret
-.size	GFp_gcm_init_v8,.-GFp_gcm_init_v8
+.size	GFp_gcm_init_clmul,.-GFp_gcm_init_clmul
 ___
 ################################################################################
-# void GFp_gcm_gmult_v8(u64 Xi[2],const u128 Htable[16]);
+# void GFp_gcm_gmult_clmul(u64 Xi[2],const u128 Htable[16]);
 #
 # input:	Xi - current hash value;
-#		Htable - table precomputed in GFp_gcm_init_v8;
+#		Htable - table precomputed in GFp_gcm_init_clmul;
 # output:	Xi - next hash value Xi;
 #
 $code.=<<___;
-.global	GFp_gcm_gmult_v8
-.type	GFp_gcm_gmult_v8,%function
+.global	GFp_gcm_gmult_clmul
+.type	GFp_gcm_gmult_clmul,%function
 .align	4
-GFp_gcm_gmult_v8:
+GFp_gcm_gmult_clmul:
 	vld1.64		{$t1},[$Xi]		@ load Xi
 	vmov.i8		$xC2,#0xe1
 	vld1.64		{$H-$Hhl},[$Htbl]	@ load twisted H, ...
@@ -181,23 +181,23 @@
 	vst1.64		{$Xl},[$Xi]		@ write out Xi
 
 	ret
-.size	GFp_gcm_gmult_v8,.-GFp_gcm_gmult_v8
+.size	GFp_gcm_gmult_clmul,.-GFp_gcm_gmult_clmul
 ___
 ################################################################################
-# void GFp_gcm_ghash_v8(u64 Xi[2], const u128 Htable[16], const u8 *inp,
-#                       size_t len);
+# void GFp_gcm_ghash_clmul(u64 Xi[2], const u128 Htable[16], const u8 *inp,
+#                          size_t len);
 #
-# input:	table precomputed in GFp_gcm_init_v8;
+# input:	table precomputed in GFp_gcm_init_clmul;
 #		current hash value Xi;
 #		pointer to input data;
 #		length of input data in bytes, but divisible by block size;
 # output:	next hash value Xi;
 #
 $code.=<<___;
-.global	GFp_gcm_ghash_v8
-.type	GFp_gcm_ghash_v8,%function
+.global	GFp_gcm_ghash_clmul
+.type	GFp_gcm_ghash_clmul,%function
 .align	4
-GFp_gcm_ghash_v8:
+GFp_gcm_ghash_clmul:
 ___
 $code.=<<___		if ($flavour !~ /64/);
 	vstmdb		sp!,{d8-d15}		@ 32-bit ABI says so
@@ -344,7 +344,7 @@
 ___
 $code.=<<___;
 	ret
-.size	GFp_gcm_ghash_v8,.-GFp_gcm_ghash_v8
+.size	GFp_gcm_ghash_clmul,.-GFp_gcm_ghash_clmul
 ___
 }
 $code.=<<___;
diff --git a/rustc_deps/vendor/ring/crypto/fipsmodule/modes/gcm.c b/rustc_deps/vendor/ring/crypto/fipsmodule/modes/gcm.c
index 7555e4a..0691a11 100644
--- a/rustc_deps/vendor/ring/crypto/fipsmodule/modes/gcm.c
+++ b/rustc_deps/vendor/ring/crypto/fipsmodule/modes/gcm.c
@@ -48,17 +48,10 @@
 
 #include <GFp/base.h>
 
-#include <string.h>
-
 #include <GFp/cpu.h>
 
 #include "internal.h"
 #include "../../internal.h"
-#include "../../block.h"
-
-void GFp_gcm128_ghash(GCM128_CONTEXT *ctx, const uint8_t input[], size_t input_len);
-void GFp_gcm128_gmult(GCM128_CONTEXT *ctx);
-int GFp_gcm_clmul_enabled(void);
 
 #define PACK(s) ((size_t)(s) << (sizeof(size_t) * 8 - 16))
 #define REDUCE1BIT(V)                                                 \
@@ -74,7 +67,10 @@
     }                                                                 \
   } while (0)
 
-static void gcm_init_4bit(u128 Htable[16], const uint64_t H[2]) {
+
+void GFp_gcm_init_4bit(u128 Htable[16], const uint64_t H[2]);
+
+void GFp_gcm_init_4bit(u128 Htable[16], const uint64_t H[2]) {
   u128 V;
 
   Htable[0].hi = 0;
@@ -131,7 +127,9 @@
     PACK(0xE100), PACK(0xFD20), PACK(0xD940), PACK(0xC560),
     PACK(0x9180), PACK(0x8DA0), PACK(0xA9C0), PACK(0xB5E0)};
 
-static void GFp_gcm_gmult_4bit(uint8_t Xi[16], const u128 Htable[16]) {
+void GFp_gcm_gmult_4bit(uint8_t Xi[16], const u128 Htable[16]);
+
+void GFp_gcm_gmult_4bit(uint8_t Xi[16], const u128 Htable[16]) {
   u128 Z;
   int cnt = 15;
   size_t rem, nlo, nhi;
@@ -181,13 +179,16 @@
   to_be_u64_ptr(Xi + 8, Z.lo);
 }
 
+void GFp_gcm_ghash_4bit(uint8_t Xi[16], const u128 Htable[16],
+                        const uint8_t *inp, size_t len);
+
 // Streamed gcm_mult_4bit, see GFp_gcm128_[en|de]crypt for
 // details... Compiler-generated code doesn't seem to give any
 // performance improvement, at least not on x86[_64]. It's here
 // mostly as reference and a placeholder for possible future
 // non-trivial optimization[s]...
-static void GFp_gcm_ghash_4bit(uint8_t Xi[16], const u128 Htable[16],
-                               const uint8_t *inp, size_t len) {
+void GFp_gcm_ghash_4bit(uint8_t Xi[16], const u128 Htable[16],
+                        const uint8_t *inp, size_t len) {
   u128 Z;
   int cnt;
   size_t rem, nlo, nhi;
@@ -241,195 +242,4 @@
     to_be_u64_ptr(Xi + 8, Z.lo);
   } while (inp += 16, len -= 16);
 }
-#else
-void GFp_gcm_gmult_4bit(uint8_t Xi[16], const u128 Htable[16]);
-void GFp_gcm_ghash_4bit(uint8_t Xi[16], const u128 Htable[16],
-                        const uint8_t *inp, size_t len);
-#endif
-
-#if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
-void GFp_gcm_init_clmul(u128 Htable[16], const uint64_t Xi[2]);
-void GFp_gcm_gmult_clmul(uint8_t Xi[16], const u128 Htable[16]);
-void GFp_gcm_ghash_clmul(uint8_t Xi[16], const u128 Htable[16],
-                         const uint8_t *inp, size_t len);
-
-#if defined(OPENSSL_X86_64)
-#define GHASH_ASM_X86_64
-void GFp_gcm_init_avx(u128 Htable[16], const uint64_t Xi[2]);
-void GFp_gcm_ghash_avx(uint8_t Xi[16], const u128 Htable[16], const uint8_t *in,
-                       size_t len);
-int GFp_aesni_gcm_capable(void);
-
-int GFp_aesni_gcm_capable(void) {
-  return ((GFp_ia32cap_P[1] >> 22) & 0x41) == 0x41; // AVX+MOVBE
-}
-#endif
-
-#if defined(OPENSSL_X86)
-#define GHASH_ASM_X86
-void GFp_gcm_gmult_4bit_mmx(uint8_t Xi[16], const u128 Htable[16]);
-void GFp_gcm_ghash_4bit_mmx(uint8_t Xi[16], const u128 Htable[16],
-                            const uint8_t *inp, size_t len);
-#endif
-
-#elif defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)
-
-#include <GFp/arm_arch.h>
-
-#if __ARM_MAX_ARCH__ >= 8
-#define ARM_PMULL_ASM
-void GFp_gcm_init_v8(u128 Htable[16], const uint64_t Xi[2]);
-void GFp_gcm_gmult_v8(uint8_t Xi[16], const u128 Htable[16]);
-void GFp_gcm_ghash_v8(uint8_t Xi[16], const u128 Htable[16], const uint8_t *inp,
-                      size_t len);
-#endif
-
-#if defined(OPENSSL_ARM) && __ARM_MAX_ARCH__ >= 7
-// 32-bit ARM also has support for doing GCM with NEON instructions.
-void GFp_gcm_init_neon(u128 Htable[16], const uint64_t Xi[2]);
-void GFp_gcm_gmult_neon(uint8_t Xi[16], const u128 Htable[16]);
-void GFp_gcm_ghash_neon(uint8_t Xi[16], const u128 Htable[16],
-                        const uint8_t *inp, size_t len);
-#endif
-
-#elif defined(OPENSSL_PPC64LE)
-#define GHASH_ASM_PPC64LE
-void GFp_gcm_init_p8(u128 Htable[16], const uint64_t Xi[2]);
-void GFp_gcm_gmult_p8(uint64_t Xi[2], const u128 Htable[16]);
-void GFp_gcm_ghash_p8(uint64_t Xi[2], const u128 Htable[16], const uint8_t *inp,
-                      size_t len);
-#endif // Platform
-
-void GFp_gcm128_init_htable(GCM128_KEY *r, Block h_block);
-
-void GFp_gcm128_init_htable(GCM128_KEY *r, Block h_block) {
-
-  // H is stored in host byte order
-  alignas(16) uint64_t H[2];
-  H[0] = from_be_u64(h_block.subblocks[0]);
-  H[1] = from_be_u64(h_block.subblocks[1]);
-
-  u128 *Htable = r->Htable;
-
-  // Keep in sync with |gcm128_init_gmult_ghash|.
-
-#if defined(GHASH_ASM_X86_64) || defined(GHASH_ASM_X86)
-  if (GFp_gcm_clmul_enabled()) {
-#if defined(GHASH_ASM_X86_64)
-    if (GFp_aesni_gcm_capable()) {
-      GFp_gcm_init_avx(Htable, H);
-      return;
-    }
-#endif
-    GFp_gcm_init_clmul(Htable, H);
-    return;
-  }
-#endif
-#if defined(ARM_PMULL_ASM)
-  if (GFp_is_ARMv8_PMULL_capable()) {
-    GFp_gcm_init_v8(Htable, H);
-    return;
-  }
-#endif
-#if defined(OPENSSL_ARM)
-  if (GFp_is_NEON_capable()) {
-    GFp_gcm_init_neon(Htable, H);
-    return;
-  }
-#endif
-#if defined(GHASH_ASM_PPC64LE)
-  if (GFp_is_PPC64LE_vcrypto_capable()) {
-    GFp_gcm_init_p8(ctx->Htable, ctx->H.u);
-    return;
-  }
-#endif
-
-  gcm_init_4bit(Htable, H);
-}
-
-void GFp_gcm128_gmult(GCM128_CONTEXT *ctx) {
-  // Keep in sync with |gcm128_ghash|, gcm128_init_htable| and |GFp_AES_set_encrypt_key|.
-
-#if defined(GHASH_ASM_X86_64) || defined(GHASH_ASM_X86)
-  if (GFp_gcm_clmul_enabled()) {
-    // GFp_gcm_gmult_avx2 was an alias for GFp_gcm_gmult_clmul so there's no need
-    // for x86-64 MOVEBE+AVX2 stuff here. Apparently GFp_gcm_gmult_clmul doesn't need
-    // that stuff.
-    GFp_gcm_gmult_clmul(ctx->Xi, ctx->key.Htable);
-    return;
-  }
-#endif
-#if defined(ARM_PMULL_ASM)
-  if (GFp_is_ARMv8_PMULL_capable()) {
-    GFp_gcm_gmult_v8(ctx->Xi, ctx->key.Htable);
-    return;
-  }
-#endif
-#if defined(OPENSSL_ARM)
-  if (GFp_is_NEON_capable()) {
-    GFp_gcm_gmult_neon(ctx->Xi, ctx->key.Htable);
-    return;
-  }
-#endif
-#if defined(GHASH_ASM_PPC64LE)
-  if (GFp_is_PPC64LE_vcrypto_capable()) {
-    GFp_gcm_gmult_p8(ctx->Xi, ctx->key.Htable);
-    return;
-  }
-#endif
-
-#if defined(GHASH_ASM_X86)
-  GFp_gcm_gmult_4bit_mmx(ctx->Xi, ctx->key.Htable);
-#else
-  GFp_gcm_gmult_4bit(ctx->Xi, ctx->key.Htable);
-#endif
-}
-
-void GFp_gcm128_ghash(GCM128_CONTEXT *ctx, const uint8_t input[], size_t input_len) {
-  assert(input_len % 16 == 0);
-  // Keep in sync with |gcm128_init_htable| and |GFp_AES_set_encrypt_key|.
-
-#if defined(GHASH_ASM_X86_64) || defined(GHASH_ASM_X86)
-  if (GFp_gcm_clmul_enabled()) {
-#if defined(GHASH_ASM_X86_64)
-    if (((GFp_ia32cap_P[1] >> 22) & 0x41) == 0x41) { // AVX+MOVBE
-      GFp_gcm_ghash_avx(ctx->Xi, ctx->key.Htable, input, input_len);
-      return;
-    }
-#endif
-    GFp_gcm_ghash_clmul(ctx->Xi, ctx->key.Htable, input, input_len);
-    return;
-  }
-#endif
-#if defined(ARM_PMULL_ASM)
-  if (GFp_is_ARMv8_PMULL_capable()) {
-    GFp_gcm_ghash_v8(ctx->Xi, ctx->key.Htable, input, input_len);
-    return;
-  }
-#endif
-#if defined(OPENSSL_ARM)
-  if (GFp_is_NEON_capable()) {
-    GFp_gcm_ghash_neon(ctx->Xi, ctx->key.Htable, input, input_len);
-    return;
-  }
-#endif
-#if defined(GHASH_ASM_PPC64LE)
-  if (GFp_is_PPC64LE_vcrypto_capable()) {
-    GFp_gcm_ghash_p8(ctx->Xi, ctx->key.Htable, input, input_len);
-    return;
-  }
-#endif
-
-#if defined(GHASH_ASM_X86)
-  GFp_gcm_ghash_4bit_mmx(ctx->Xi, ctx->key.Htable, input, input_len);
-#else
-  GFp_gcm_ghash_4bit(ctx->Xi, ctx->key.Htable, input, input_len);
-#endif
-}
-
-#if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
-int GFp_gcm_clmul_enabled(void) {
-  return GFp_ia32cap_P[0] & (1 << 24) && // check FXSR bit
-         GFp_ia32cap_P[1] & (1 << 1);    // check PCLMULQDQ bit
-}
 #endif
diff --git a/rustc_deps/vendor/ring/crypto/internal.h b/rustc_deps/vendor/ring/crypto/internal.h
index 483a3ce..9796c72 100644
--- a/rustc_deps/vendor/ring/crypto/internal.h
+++ b/rustc_deps/vendor/ring/crypto/internal.h
@@ -359,13 +359,4 @@
 #endif
 }
 
-// from_be_u64 returns the native representation of the 64-bit
-// big-endian-encoded value |x|.
-static inline uint64_t from_be_u64(uint64_t x) {
-#if OPENSSL_ENDIAN != OPENSSL_BIG_ENDIAN
-  x = bswap_u64(x);
-#endif
-  return x;
-}
-
 #endif  // OPENSSL_HEADER_CRYPTO_INTERNAL_H
diff --git a/rustc_deps/vendor/ring/include/GFp/arm_arch.h b/rustc_deps/vendor/ring/include/GFp/arm_arch.h
index 70cd8d3..ee5e32c 100644
--- a/rustc_deps/vendor/ring/include/GFp/arm_arch.h
+++ b/rustc_deps/vendor/ring/include/GFp/arm_arch.h
@@ -107,17 +107,7 @@
 // ARMV7_NEON is true when a NEON unit is present in the current CPU.
 #define ARMV7_NEON (1 << 0)
 
-// ARMV8_AES indicates support for hardware AES instructions.
-#define ARMV8_AES (1 << 2)
-
-// ARMV8_SHA1 indicates support for hardware SHA-1 instructions.
-#define ARMV8_SHA1 (1 << 3)
-
 // ARMV8_SHA256 indicates support for hardware SHA-256 instructions.
 #define ARMV8_SHA256 (1 << 4)
 
-// ARMV8_PMULL indicates support for carryless multiplication.
-#define ARMV8_PMULL (1 << 5)
-
-
 #endif  // OPENSSL_HEADER_ARM_ARCH_H
diff --git a/rustc_deps/vendor/ring/include/GFp/cpu.h b/rustc_deps/vendor/ring/include/GFp/cpu.h
index d02ae80..4419c58 100644
--- a/rustc_deps/vendor/ring/include/GFp/cpu.h
+++ b/rustc_deps/vendor/ring/include/GFp/cpu.h
@@ -123,10 +123,6 @@
 // ARMv8 AES instruction.
 int GFp_is_ARMv8_AES_capable(void);
 
-// GFp_is_ARMv8_PMULL_capable returns true if the current CPU supports the
-// ARMv8 PMULL instruction.
-int GFp_is_ARMv8_PMULL_capable(void);
-
 #else
 
 static inline int GFp_is_NEON_capable(void) {
@@ -146,14 +142,6 @@
 #endif
 }
 
-static inline int GFp_is_ARMv8_PMULL_capable(void) {
-#if defined(OPENSSL_STATIC_ARMCAP_PMULL) || defined(__ARM_FEATURE_CRYPTO)
-  return 1;
-#else
-  return 0;
-#endif
-}
-
 #endif  // OPENSSL_STATIC_ARMCAP
 #endif  // OPENSSL_ARM || OPENSSL_AARCH64
 
diff --git a/rustc_deps/vendor/ring/pregenerated/aes-586-win32n.obj b/rustc_deps/vendor/ring/pregenerated/aes-586-win32n.obj
index 2b07546..2ba078c 100644
--- a/rustc_deps/vendor/ring/pregenerated/aes-586-win32n.obj
+++ b/rustc_deps/vendor/ring/pregenerated/aes-586-win32n.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/aes-x86_64-nasm.obj b/rustc_deps/vendor/ring/pregenerated/aes-x86_64-nasm.obj
index 1b73609..004fd9d 100644
--- a/rustc_deps/vendor/ring/pregenerated/aes-x86_64-nasm.obj
+++ b/rustc_deps/vendor/ring/pregenerated/aes-x86_64-nasm.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/aesni-gcm-x86_64-nasm.obj b/rustc_deps/vendor/ring/pregenerated/aesni-gcm-x86_64-nasm.obj
index 889dd6c..ef3d5f3 100644
--- a/rustc_deps/vendor/ring/pregenerated/aesni-gcm-x86_64-nasm.obj
+++ b/rustc_deps/vendor/ring/pregenerated/aesni-gcm-x86_64-nasm.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/aesni-x86-win32n.obj b/rustc_deps/vendor/ring/pregenerated/aesni-x86-win32n.obj
index 781c2c2..a3e397a 100644
--- a/rustc_deps/vendor/ring/pregenerated/aesni-x86-win32n.obj
+++ b/rustc_deps/vendor/ring/pregenerated/aesni-x86-win32n.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/aesni-x86_64-nasm.obj b/rustc_deps/vendor/ring/pregenerated/aesni-x86_64-nasm.obj
index 709b14c..99940f2 100644
--- a/rustc_deps/vendor/ring/pregenerated/aesni-x86_64-nasm.obj
+++ b/rustc_deps/vendor/ring/pregenerated/aesni-x86_64-nasm.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/chacha-x86-win32n.obj b/rustc_deps/vendor/ring/pregenerated/chacha-x86-win32n.obj
index ea0142a..7eed4a9 100644
--- a/rustc_deps/vendor/ring/pregenerated/chacha-x86-win32n.obj
+++ b/rustc_deps/vendor/ring/pregenerated/chacha-x86-win32n.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/chacha-x86_64-nasm.obj b/rustc_deps/vendor/ring/pregenerated/chacha-x86_64-nasm.obj
index 5df3396..c6d7bf8 100644
--- a/rustc_deps/vendor/ring/pregenerated/chacha-x86_64-nasm.obj
+++ b/rustc_deps/vendor/ring/pregenerated/chacha-x86_64-nasm.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/ecp_nistz256-x86-win32n.obj b/rustc_deps/vendor/ring/pregenerated/ecp_nistz256-x86-win32n.obj
index 850d323..f4b896e 100644
--- a/rustc_deps/vendor/ring/pregenerated/ecp_nistz256-x86-win32n.obj
+++ b/rustc_deps/vendor/ring/pregenerated/ecp_nistz256-x86-win32n.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/ghash-x86-elf.S b/rustc_deps/vendor/ring/pregenerated/ghash-x86-elf.S
index 82bb6d4..652cfa9 100644
--- a/rustc_deps/vendor/ring/pregenerated/ghash-x86-elf.S
+++ b/rustc_deps/vendor/ring/pregenerated/ghash-x86-elf.S
@@ -6,12 +6,12 @@
 #include <boringssl_prefix_symbols_asm.h>
 #endif
 .text
-.globl	GFp_gcm_gmult_4bit_mmx
-.hidden	GFp_gcm_gmult_4bit_mmx
-.type	GFp_gcm_gmult_4bit_mmx,@function
+.globl	GFp_gcm_gmult_4bit
+.hidden	GFp_gcm_gmult_4bit
+.type	GFp_gcm_gmult_4bit,@function
 .align	16
-GFp_gcm_gmult_4bit_mmx:
-.L_GFp_gcm_gmult_4bit_mmx_begin:
+GFp_gcm_gmult_4bit:
+.L_GFp_gcm_gmult_4bit_begin:
 	pushl	%ebp
 	pushl	%ebx
 	pushl	%esi
@@ -105,13 +105,13 @@
 	popl	%ebx
 	popl	%ebp
 	ret
-.size	GFp_gcm_gmult_4bit_mmx,.-.L_GFp_gcm_gmult_4bit_mmx_begin
-.globl	GFp_gcm_ghash_4bit_mmx
-.hidden	GFp_gcm_ghash_4bit_mmx
-.type	GFp_gcm_ghash_4bit_mmx,@function
+.size	GFp_gcm_gmult_4bit,.-.L_GFp_gcm_gmult_4bit_begin
+.globl	GFp_gcm_ghash_4bit
+.hidden	GFp_gcm_ghash_4bit
+.type	GFp_gcm_ghash_4bit,@function
 .align	16
-GFp_gcm_ghash_4bit_mmx:
-.L_GFp_gcm_ghash_4bit_mmx_begin:
+GFp_gcm_ghash_4bit:
+.L_GFp_gcm_ghash_4bit_begin:
 	pushl	%ebp
 	pushl	%ebx
 	pushl	%esi
@@ -710,7 +710,7 @@
 	popl	%ebx
 	popl	%ebp
 	ret
-.size	GFp_gcm_ghash_4bit_mmx,.-.L_GFp_gcm_ghash_4bit_mmx_begin
+.size	GFp_gcm_ghash_4bit,.-.L_GFp_gcm_ghash_4bit_begin
 .globl	GFp_gcm_init_clmul
 .hidden	GFp_gcm_init_clmul
 .type	GFp_gcm_init_clmul,@function
diff --git a/rustc_deps/vendor/ring/pregenerated/ghash-x86-macosx.S b/rustc_deps/vendor/ring/pregenerated/ghash-x86-macosx.S
index a03a403..d95192c 100644
--- a/rustc_deps/vendor/ring/pregenerated/ghash-x86-macosx.S
+++ b/rustc_deps/vendor/ring/pregenerated/ghash-x86-macosx.S
@@ -6,11 +6,11 @@
 #include <boringssl_prefix_symbols_asm.h>
 #endif
 .text
-.globl	_GFp_gcm_gmult_4bit_mmx
-.private_extern	_GFp_gcm_gmult_4bit_mmx
+.globl	_GFp_gcm_gmult_4bit
+.private_extern	_GFp_gcm_gmult_4bit
 .align	4
-_GFp_gcm_gmult_4bit_mmx:
-L_GFp_gcm_gmult_4bit_mmx_begin:
+_GFp_gcm_gmult_4bit:
+L_GFp_gcm_gmult_4bit_begin:
 	pushl	%ebp
 	pushl	%ebx
 	pushl	%esi
@@ -104,11 +104,11 @@
 	popl	%ebx
 	popl	%ebp
 	ret
-.globl	_GFp_gcm_ghash_4bit_mmx
-.private_extern	_GFp_gcm_ghash_4bit_mmx
+.globl	_GFp_gcm_ghash_4bit
+.private_extern	_GFp_gcm_ghash_4bit
 .align	4
-_GFp_gcm_ghash_4bit_mmx:
-L_GFp_gcm_ghash_4bit_mmx_begin:
+_GFp_gcm_ghash_4bit:
+L_GFp_gcm_ghash_4bit_begin:
 	pushl	%ebp
 	pushl	%ebx
 	pushl	%esi
diff --git a/rustc_deps/vendor/ring/pregenerated/ghash-x86-win32n.obj b/rustc_deps/vendor/ring/pregenerated/ghash-x86-win32n.obj
index ee44c6f..7e0116c 100644
--- a/rustc_deps/vendor/ring/pregenerated/ghash-x86-win32n.obj
+++ b/rustc_deps/vendor/ring/pregenerated/ghash-x86-win32n.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/ghash-x86_64-nasm.obj b/rustc_deps/vendor/ring/pregenerated/ghash-x86_64-nasm.obj
index 35a9ae5..429ff26 100644
--- a/rustc_deps/vendor/ring/pregenerated/ghash-x86_64-nasm.obj
+++ b/rustc_deps/vendor/ring/pregenerated/ghash-x86_64-nasm.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-ios32.S b/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-ios32.S
index a012ea1..85fb2c4 100644
--- a/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-ios32.S
+++ b/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-ios32.S
@@ -14,13 +14,13 @@
 
 .code	32
 #undef	__thumb2__
-.globl	_GFp_gcm_init_v8
-.private_extern	_GFp_gcm_init_v8
+.globl	_GFp_gcm_init_clmul
+.private_extern	_GFp_gcm_init_clmul
 #ifdef __thumb2__
-.thumb_func	_GFp_gcm_init_v8
+.thumb_func	_GFp_gcm_init_clmul
 #endif
 .align	4
-_GFp_gcm_init_v8:
+_GFp_gcm_init_clmul:
 	vld1.64	{q9},[r1]		@ load input H
 	vmov.i8	q11,#0xe1
 	vshl.i64	q11,q11,#57		@ 0xc2.0
@@ -67,13 +67,13 @@
 
 	bx	lr
 
-.globl	_GFp_gcm_gmult_v8
-.private_extern	_GFp_gcm_gmult_v8
+.globl	_GFp_gcm_gmult_clmul
+.private_extern	_GFp_gcm_gmult_clmul
 #ifdef __thumb2__
-.thumb_func	_GFp_gcm_gmult_v8
+.thumb_func	_GFp_gcm_gmult_clmul
 #endif
 .align	4
-_GFp_gcm_gmult_v8:
+_GFp_gcm_gmult_clmul:
 	vld1.64	{q9},[r0]		@ load Xi
 	vmov.i8	q11,#0xe1
 	vld1.64	{q12,q13},[r1]	@ load twisted H, ...
@@ -111,13 +111,13 @@
 
 	bx	lr
 
-.globl	_GFp_gcm_ghash_v8
-.private_extern	_GFp_gcm_ghash_v8
+.globl	_GFp_gcm_ghash_clmul
+.private_extern	_GFp_gcm_ghash_clmul
 #ifdef __thumb2__
-.thumb_func	_GFp_gcm_ghash_v8
+.thumb_func	_GFp_gcm_ghash_clmul
 #endif
 .align	4
-_GFp_gcm_ghash_v8:
+_GFp_gcm_ghash_clmul:
 	vstmdb	sp!,{d8,d9,d10,d11,d12,d13,d14,d15}		@ 32-bit ABI says so
 	vld1.64	{q0},[r0]		@ load [rotated] Xi
 						@ "[rotated]" means that
diff --git a/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-ios64.S b/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-ios64.S
index 9d9d17f..85fbdc0 100644
--- a/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-ios64.S
+++ b/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-ios64.S
@@ -12,11 +12,11 @@
 
 .text
 
-.globl	_GFp_gcm_init_v8
-.private_extern	_GFp_gcm_init_v8
+.globl	_GFp_gcm_init_clmul
+.private_extern	_GFp_gcm_init_clmul
 
 .align	4
-_GFp_gcm_init_v8:
+_GFp_gcm_init_clmul:
 	ld1	{v17.2d},[x1]		//load input H
 	movi	v19.16b,#0xe1
 	shl	v19.2d,v19.2d,#57		//0xc2.0
@@ -63,11 +63,11 @@
 
 	ret
 
-.globl	_GFp_gcm_gmult_v8
-.private_extern	_GFp_gcm_gmult_v8
+.globl	_GFp_gcm_gmult_clmul
+.private_extern	_GFp_gcm_gmult_clmul
 
 .align	4
-_GFp_gcm_gmult_v8:
+_GFp_gcm_gmult_clmul:
 	ld1	{v17.2d},[x0]		//load Xi
 	movi	v19.16b,#0xe1
 	ld1	{v20.2d,v21.2d},[x1]	//load twisted H, ...
@@ -105,11 +105,11 @@
 
 	ret
 
-.globl	_GFp_gcm_ghash_v8
-.private_extern	_GFp_gcm_ghash_v8
+.globl	_GFp_gcm_ghash_clmul
+.private_extern	_GFp_gcm_ghash_clmul
 
 .align	4
-_GFp_gcm_ghash_v8:
+_GFp_gcm_ghash_clmul:
 	ld1	{v0.2d},[x0]		//load [rotated] Xi
 						//"[rotated]" means that
 						//loaded value would have
diff --git a/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-linux32.S b/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-linux32.S
index 2192367..0f086cb 100644
--- a/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-linux32.S
+++ b/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-linux32.S
@@ -15,11 +15,11 @@
 .fpu	neon
 .code	32
 #undef	__thumb2__
-.globl	GFp_gcm_init_v8
-.hidden	GFp_gcm_init_v8
-.type	GFp_gcm_init_v8,%function
+.globl	GFp_gcm_init_clmul
+.hidden	GFp_gcm_init_clmul
+.type	GFp_gcm_init_clmul,%function
 .align	4
-GFp_gcm_init_v8:
+GFp_gcm_init_clmul:
 	vld1.64	{q9},[r1]		@ load input H
 	vmov.i8	q11,#0xe1
 	vshl.i64	q11,q11,#57		@ 0xc2.0
@@ -65,12 +65,12 @@
 	vst1.64	{q13,q14},[r0]		@ store Htable[1..2]
 
 	bx	lr
-.size	GFp_gcm_init_v8,.-GFp_gcm_init_v8
-.globl	GFp_gcm_gmult_v8
-.hidden	GFp_gcm_gmult_v8
-.type	GFp_gcm_gmult_v8,%function
+.size	GFp_gcm_init_clmul,.-GFp_gcm_init_clmul
+.globl	GFp_gcm_gmult_clmul
+.hidden	GFp_gcm_gmult_clmul
+.type	GFp_gcm_gmult_clmul,%function
 .align	4
-GFp_gcm_gmult_v8:
+GFp_gcm_gmult_clmul:
 	vld1.64	{q9},[r0]		@ load Xi
 	vmov.i8	q11,#0xe1
 	vld1.64	{q12,q13},[r1]	@ load twisted H, ...
@@ -107,12 +107,12 @@
 	vst1.64	{q0},[r0]		@ write out Xi
 
 	bx	lr
-.size	GFp_gcm_gmult_v8,.-GFp_gcm_gmult_v8
-.globl	GFp_gcm_ghash_v8
-.hidden	GFp_gcm_ghash_v8
-.type	GFp_gcm_ghash_v8,%function
+.size	GFp_gcm_gmult_clmul,.-GFp_gcm_gmult_clmul
+.globl	GFp_gcm_ghash_clmul
+.hidden	GFp_gcm_ghash_clmul
+.type	GFp_gcm_ghash_clmul,%function
 .align	4
-GFp_gcm_ghash_v8:
+GFp_gcm_ghash_clmul:
 	vstmdb	sp!,{d8,d9,d10,d11,d12,d13,d14,d15}		@ 32-bit ABI says so
 	vld1.64	{q0},[r0]		@ load [rotated] Xi
 						@ "[rotated]" means that
@@ -240,7 +240,7 @@
 
 	vldmia	sp!,{d8,d9,d10,d11,d12,d13,d14,d15}		@ 32-bit ABI says so
 	bx	lr
-.size	GFp_gcm_ghash_v8,.-GFp_gcm_ghash_v8
+.size	GFp_gcm_ghash_clmul,.-GFp_gcm_ghash_clmul
 .byte	71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
 .align	2
 .align	2
diff --git a/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-linux64.S b/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-linux64.S
index 524e841..f339646 100644
--- a/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-linux64.S
+++ b/rustc_deps/vendor/ring/pregenerated/ghashv8-armx-linux64.S
@@ -13,11 +13,11 @@
 
 .text
 .arch	armv8-a+crypto
-.globl	GFp_gcm_init_v8
-.hidden	GFp_gcm_init_v8
-.type	GFp_gcm_init_v8,%function
+.globl	GFp_gcm_init_clmul
+.hidden	GFp_gcm_init_clmul
+.type	GFp_gcm_init_clmul,%function
 .align	4
-GFp_gcm_init_v8:
+GFp_gcm_init_clmul:
 	ld1	{v17.2d},[x1]		//load input H
 	movi	v19.16b,#0xe1
 	shl	v19.2d,v19.2d,#57		//0xc2.0
@@ -63,12 +63,12 @@
 	st1	{v21.2d,v22.2d},[x0]		//store Htable[1..2]
 
 	ret
-.size	GFp_gcm_init_v8,.-GFp_gcm_init_v8
-.globl	GFp_gcm_gmult_v8
-.hidden	GFp_gcm_gmult_v8
-.type	GFp_gcm_gmult_v8,%function
+.size	GFp_gcm_init_clmul,.-GFp_gcm_init_clmul
+.globl	GFp_gcm_gmult_clmul
+.hidden	GFp_gcm_gmult_clmul
+.type	GFp_gcm_gmult_clmul,%function
 .align	4
-GFp_gcm_gmult_v8:
+GFp_gcm_gmult_clmul:
 	ld1	{v17.2d},[x0]		//load Xi
 	movi	v19.16b,#0xe1
 	ld1	{v20.2d,v21.2d},[x1]	//load twisted H, ...
@@ -105,12 +105,12 @@
 	st1	{v0.2d},[x0]		//write out Xi
 
 	ret
-.size	GFp_gcm_gmult_v8,.-GFp_gcm_gmult_v8
-.globl	GFp_gcm_ghash_v8
-.hidden	GFp_gcm_ghash_v8
-.type	GFp_gcm_ghash_v8,%function
+.size	GFp_gcm_gmult_clmul,.-GFp_gcm_gmult_clmul
+.globl	GFp_gcm_ghash_clmul
+.hidden	GFp_gcm_ghash_clmul
+.type	GFp_gcm_ghash_clmul,%function
 .align	4
-GFp_gcm_ghash_v8:
+GFp_gcm_ghash_clmul:
 	ld1	{v0.2d},[x0]		//load [rotated] Xi
 						//"[rotated]" means that
 						//loaded value would have
@@ -236,7 +236,7 @@
 	st1	{v0.2d},[x0]		//write out Xi
 
 	ret
-.size	GFp_gcm_ghash_v8,.-GFp_gcm_ghash_v8
+.size	GFp_gcm_ghash_clmul,.-GFp_gcm_ghash_clmul
 .byte	71,72,65,83,72,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
 .align	2
 .align	2
diff --git a/rustc_deps/vendor/ring/pregenerated/p256-x86_64-asm-nasm.obj b/rustc_deps/vendor/ring/pregenerated/p256-x86_64-asm-nasm.obj
index 40e5da7..8bc1538 100644
--- a/rustc_deps/vendor/ring/pregenerated/p256-x86_64-asm-nasm.obj
+++ b/rustc_deps/vendor/ring/pregenerated/p256-x86_64-asm-nasm.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/poly1305-x86-win32n.obj b/rustc_deps/vendor/ring/pregenerated/poly1305-x86-win32n.obj
index 6f9a636..41f5efd 100644
--- a/rustc_deps/vendor/ring/pregenerated/poly1305-x86-win32n.obj
+++ b/rustc_deps/vendor/ring/pregenerated/poly1305-x86-win32n.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/poly1305-x86_64-nasm.obj b/rustc_deps/vendor/ring/pregenerated/poly1305-x86_64-nasm.obj
index d2386fc..3c4b8a7 100644
--- a/rustc_deps/vendor/ring/pregenerated/poly1305-x86_64-nasm.obj
+++ b/rustc_deps/vendor/ring/pregenerated/poly1305-x86_64-nasm.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/sha256-586-win32n.obj b/rustc_deps/vendor/ring/pregenerated/sha256-586-win32n.obj
index 7bc3738..2c17bd7 100644
--- a/rustc_deps/vendor/ring/pregenerated/sha256-586-win32n.obj
+++ b/rustc_deps/vendor/ring/pregenerated/sha256-586-win32n.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/sha256-x86_64-nasm.obj b/rustc_deps/vendor/ring/pregenerated/sha256-x86_64-nasm.obj
index 7d70d6f..6b8e4df 100644
--- a/rustc_deps/vendor/ring/pregenerated/sha256-x86_64-nasm.obj
+++ b/rustc_deps/vendor/ring/pregenerated/sha256-x86_64-nasm.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/sha512-586-win32n.obj b/rustc_deps/vendor/ring/pregenerated/sha512-586-win32n.obj
index 8339e08..5e72b07 100644
--- a/rustc_deps/vendor/ring/pregenerated/sha512-586-win32n.obj
+++ b/rustc_deps/vendor/ring/pregenerated/sha512-586-win32n.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/sha512-x86_64-nasm.obj b/rustc_deps/vendor/ring/pregenerated/sha512-x86_64-nasm.obj
index e45b03a..d65e490 100644
--- a/rustc_deps/vendor/ring/pregenerated/sha512-x86_64-nasm.obj
+++ b/rustc_deps/vendor/ring/pregenerated/sha512-x86_64-nasm.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/tmp/ghash-x86-win32n.asm b/rustc_deps/vendor/ring/pregenerated/tmp/ghash-x86-win32n.asm
index c1244dc..bedc3fe 100644
--- a/rustc_deps/vendor/ring/pregenerated/tmp/ghash-x86-win32n.asm
+++ b/rustc_deps/vendor/ring/pregenerated/tmp/ghash-x86-win32n.asm
@@ -20,10 +20,10 @@
 %else
 section	.text	code
 %endif
-global	_GFp_gcm_gmult_4bit_mmx
+global	_GFp_gcm_gmult_4bit
 align	16
-_GFp_gcm_gmult_4bit_mmx:
-L$_GFp_gcm_gmult_4bit_mmx_begin:
+_GFp_gcm_gmult_4bit:
+L$_GFp_gcm_gmult_4bit_begin:
 	push	ebp
 	push	ebx
 	push	esi
@@ -117,10 +117,10 @@
 	pop	ebx
 	pop	ebp
 	ret
-global	_GFp_gcm_ghash_4bit_mmx
+global	_GFp_gcm_ghash_4bit
 align	16
-_GFp_gcm_ghash_4bit_mmx:
-L$_GFp_gcm_ghash_4bit_mmx_begin:
+_GFp_gcm_ghash_4bit:
+L$_GFp_gcm_ghash_4bit_begin:
 	push	ebp
 	push	ebx
 	push	esi
diff --git a/rustc_deps/vendor/ring/pregenerated/vpaes-x86-win32n.obj b/rustc_deps/vendor/ring/pregenerated/vpaes-x86-win32n.obj
index d0c20e5..3efa52a 100644
--- a/rustc_deps/vendor/ring/pregenerated/vpaes-x86-win32n.obj
+++ b/rustc_deps/vendor/ring/pregenerated/vpaes-x86-win32n.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/vpaes-x86_64-nasm.obj b/rustc_deps/vendor/ring/pregenerated/vpaes-x86_64-nasm.obj
index 4b9b10e..b0ddcd2 100644
--- a/rustc_deps/vendor/ring/pregenerated/vpaes-x86_64-nasm.obj
+++ b/rustc_deps/vendor/ring/pregenerated/vpaes-x86_64-nasm.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/x86-mont-win32n.obj b/rustc_deps/vendor/ring/pregenerated/x86-mont-win32n.obj
index 3bd9965..0252a95 100644
--- a/rustc_deps/vendor/ring/pregenerated/x86-mont-win32n.obj
+++ b/rustc_deps/vendor/ring/pregenerated/x86-mont-win32n.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/x86_64-mont-nasm.obj b/rustc_deps/vendor/ring/pregenerated/x86_64-mont-nasm.obj
index 10682e9..89ce181 100644
--- a/rustc_deps/vendor/ring/pregenerated/x86_64-mont-nasm.obj
+++ b/rustc_deps/vendor/ring/pregenerated/x86_64-mont-nasm.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/pregenerated/x86_64-mont5-nasm.obj b/rustc_deps/vendor/ring/pregenerated/x86_64-mont5-nasm.obj
index be5dec1..8b9f70d 100644
--- a/rustc_deps/vendor/ring/pregenerated/x86_64-mont5-nasm.obj
+++ b/rustc_deps/vendor/ring/pregenerated/x86_64-mont5-nasm.obj
Binary files differ
diff --git a/rustc_deps/vendor/ring/src/aead.rs b/rustc_deps/vendor/ring/src/aead.rs
index 793fada..db73e9a 100644
--- a/rustc_deps/vendor/ring/src/aead.rs
+++ b/rustc_deps/vendor/ring/src/aead.rs
@@ -38,6 +38,8 @@
     key: Key,
 }
 
+derive_debug_via_field!(OpeningKey, key);
+
 impl OpeningKey {
     /// Create a new opening key.
     ///
@@ -114,8 +116,14 @@
     check_per_nonce_max_bytes(key.key.algorithm, ciphertext_len)?;
     let (in_out, received_tag) =
         ciphertext_and_tag_modified_in_place.split_at_mut(in_prefix_len + ciphertext_len);
-    let Tag(calculated_tag) =
-        (key.key.algorithm.open)(&key.key.inner, nonce, aad, in_prefix_len, in_out);
+    let Tag(calculated_tag) = (key.key.algorithm.open)(
+        &key.key.inner,
+        nonce,
+        aad,
+        in_prefix_len,
+        in_out,
+        key.key.cpu_features,
+    );
     if constant_time::verify_slices_are_equal(calculated_tag.as_ref(), received_tag).is_err() {
         // Zero out the plaintext so that it isn't accidentally leaked or used
         // after verification fails. It would be safest if we could check the
@@ -135,6 +143,8 @@
     key: Key,
 }
 
+derive_debug_via_field!(SealingKey, key);
+
 impl SealingKey {
     /// Constructs a new sealing key from `key_bytes`.
     #[inline]
@@ -182,7 +192,8 @@
     let (in_out, tag_out) = in_out.split_at_mut(in_out_len);
 
     let tag_out: &mut [u8; TAG_LEN] = tag_out.try_into_()?;
-    let Tag(tag) = (key.key.algorithm.seal)(&key.key.inner, nonce, aad, in_out);
+    let Tag(tag) =
+        (key.key.algorithm.seal)(&key.key.inner, nonce, aad, in_out, key.key.cpu_features);
     tag_out.copy_from_slice(tag.as_ref());
 
     Ok(in_out_len + TAG_LEN)
@@ -209,8 +220,11 @@
 struct Key {
     inner: KeyInner,
     algorithm: &'static Algorithm,
+    cpu_features: cpu::Features,
 }
 
+derive_debug_via_field!(Key, algorithm);
+
 #[allow(variant_size_differences)]
 enum KeyInner {
     AesGcm(aes_gcm::Key),
@@ -219,10 +233,11 @@
 
 impl Key {
     fn new(algorithm: &'static Algorithm, key_bytes: &[u8]) -> Result<Self, error::Unspecified> {
-        cpu::cache_detected_features();
+        let cpu_features = cpu::features();
         Ok(Key {
-            inner: (algorithm.init)(key_bytes)?,
+            inner: (algorithm.init)(key_bytes, cpu_features)?,
             algorithm,
+            cpu_features,
         })
     }
 
@@ -233,11 +248,23 @@
 
 /// An AEAD Algorithm.
 pub struct Algorithm {
-    init: fn(key: &[u8]) -> Result<KeyInner, error::Unspecified>,
+    init: fn(key: &[u8], cpu_features: cpu::Features) -> Result<KeyInner, error::Unspecified>,
 
-    seal: fn(key: &KeyInner, nonce: Nonce, aad: Aad, in_out: &mut [u8]) -> Tag,
-    open:
-        fn(key: &KeyInner, nonce: Nonce, aad: Aad, in_prefix_len: usize, in_out: &mut [u8]) -> Tag,
+    seal: fn(
+        key: &KeyInner,
+        nonce: Nonce,
+        aad: Aad,
+        in_out: &mut [u8],
+        cpu_features: cpu::Features,
+    ) -> Tag,
+    open: fn(
+        key: &KeyInner,
+        nonce: Nonce,
+        aad: Aad,
+        in_prefix_len: usize,
+        in_out: &mut [u8],
+        cpu_features: cpu::Features,
+    ) -> Tag,
 
     key_len: usize,
     id: AlgorithmID,
diff --git a/rustc_deps/vendor/ring/src/aead/aes.rs b/rustc_deps/vendor/ring/src/aead/aes.rs
index 70491a6..0546b04 100644
--- a/rustc_deps/vendor/ring/src/aead/aes.rs
+++ b/rustc_deps/vendor/ring/src/aead/aes.rs
@@ -16,13 +16,18 @@
     nonce::{self, Iv},
     shift, Block, Direction, BLOCK_LEN,
 };
-use crate::{bits::BitLength, c, endian::*, error, polyfill};
+use crate::{bits::BitLength, c, cpu, endian::*, error, polyfill};
 
-pub struct Key(AES_KEY);
+pub(crate) struct Key {
+    inner: AES_KEY,
+    cpu_features: cpu::Features,
+}
 
 impl Key {
     #[inline]
-    pub fn new(bytes: &[u8], variant: Variant) -> Result<Self, error::Unspecified> {
+    pub fn new(
+        bytes: &[u8], variant: Variant, cpu_features: cpu::Features,
+    ) -> Result<Self, error::Unspecified> {
         let key_bits = match variant {
             Variant::AES_128 => BitLength::from_usize_bits(128),
             Variant::AES_256 => BitLength::from_usize_bits(256),
@@ -36,7 +41,7 @@
             rounds: 0,
         };
 
-        match detect_implementation() {
+        match detect_implementation(cpu_features) {
             Implementation::HWAES => {
                 extern "C" {
                     fn GFp_aes_hw_set_encrypt_key(
@@ -84,7 +89,10 @@
             },
         };
 
-        Ok(Key(key))
+        Ok(Key {
+            inner: key,
+            cpu_features,
+        })
     }
 
     #[inline]
@@ -92,13 +100,13 @@
         let aliasing_const: *const Block = &a;
         let aliasing_mut: *mut Block = &mut a;
 
-        match detect_implementation() {
+        match detect_implementation(self.cpu_features) {
             Implementation::HWAES => {
                 extern "C" {
                     fn GFp_aes_hw_encrypt(a: *const Block, r: *mut Block, key: &AES_KEY);
                 }
                 unsafe {
-                    GFp_aes_hw_encrypt(aliasing_const, aliasing_mut, &self.0);
+                    GFp_aes_hw_encrypt(aliasing_const, aliasing_mut, &self.inner);
                 }
             },
 
@@ -108,7 +116,7 @@
                     fn GFp_vpaes_encrypt(a: *const Block, r: *mut Block, key: &AES_KEY);
                 }
                 unsafe {
-                    GFp_vpaes_encrypt(aliasing_const, aliasing_mut, &self.0);
+                    GFp_vpaes_encrypt(aliasing_const, aliasing_mut, &self.inner);
                 }
             },
 
@@ -117,7 +125,7 @@
                     fn GFp_aes_nohw_encrypt(a: *const Block, r: *mut Block, key: &AES_KEY);
                 }
                 unsafe {
-                    GFp_aes_nohw_encrypt(aliasing_const, aliasing_mut, &self.0);
+                    GFp_aes_nohw_encrypt(aliasing_const, aliasing_mut, &self.inner);
                 }
             },
         }
@@ -150,7 +158,7 @@
         let blocks_u32 = blocks as u32;
         assert_eq!(blocks, polyfill::usize_from_u32(blocks_u32));
 
-        match detect_implementation() {
+        match detect_implementation(self.cpu_features) {
             Implementation::HWAES => {
                 extern "C" {
                     fn GFp_aes_hw_ctr32_encrypt_blocks(
@@ -159,7 +167,7 @@
                     );
                 }
                 unsafe {
-                    GFp_aes_hw_ctr32_encrypt_blocks(input, output, blocks, &self.0, ctr);
+                    GFp_aes_hw_ctr32_encrypt_blocks(input, output, blocks, &self.inner, ctr);
                 }
                 ctr.increment_by_less_safe(blocks_u32);
             },
@@ -173,7 +181,7 @@
                     );
                 }
                 unsafe {
-                    GFp_bsaes_ctr32_encrypt_blocks(input, output, blocks, &self.0, ctr);
+                    GFp_bsaes_ctr32_encrypt_blocks(input, output, blocks, &self.inner, ctr);
                 }
                 ctr.increment_by_less_safe(blocks_u32);
             },
@@ -198,7 +206,7 @@
     #[cfg(target_arch = "x86_64")]
     #[must_use]
     pub fn is_aes_hw(&self) -> bool {
-        match detect_implementation() {
+        match detect_implementation(self.cpu_features) {
             Implementation::HWAES => true,
             _ => false,
         }
@@ -206,7 +214,7 @@
 
     #[cfg(target_arch = "x86_64")]
     #[must_use]
-    pub(super) fn inner_less_safe(&self) -> &AES_KEY { &self.0 }
+    pub(super) fn inner_less_safe(&self) -> &AES_KEY { &self.inner }
 }
 
 // Keep this in sync with AES_KEY in aes.h.
@@ -240,31 +248,21 @@
     Fallback = 4,
 }
 
-fn detect_implementation() -> Implementation {
-    extern "C" {
-        fn GFp_aes_hw_capable() -> c::int;
-    }
-
-    if unsafe { GFp_aes_hw_capable() } != 0 {
+fn detect_implementation(cpu_features: cpu::Features) -> Implementation {
+    if cpu::intel::AES.available(cpu_features) || cpu::arm::AES.available(cpu_features) {
         return Implementation::HWAES;
     }
 
     #[cfg(any(target_arch = "x86_64", target_arch = "x86"))]
     {
-        extern "C" {
-            fn GFp_vpaes_capable() -> c::int;
-        }
-        if unsafe { GFp_vpaes_capable() } != 0 {
+        if cpu::intel::SSSE3.available(cpu_features) {
             return Implementation::VPAES;
         }
     }
 
     #[cfg(target_arch = "arm")]
     {
-        extern "C" {
-            fn GFp_bsaes_capable() -> c::int;
-        }
-        if unsafe { GFp_bsaes_capable() } != 0 {
+        if cpu::arm::NEON.available(cpu_features) {
             return Implementation::BSAES;
         }
     }
@@ -293,7 +291,7 @@
 
     #[test]
     pub fn test_aes() {
-        test::from_file("src/aead/aes_tests.txt", |section, test_case| {
+        test::run(test_file!("aes_tests.txt"), |section, test_case| {
             assert_eq!(section, "");
             let key = consume_key(test_case, "Key");
             let input = test_case.consume_bytes("Input");
@@ -315,6 +313,6 @@
             32 => Variant::AES_256,
             _ => unreachable!(),
         };
-        Key::new(&key[..], variant).unwrap()
+        Key::new(&key[..], variant, cpu::features()).unwrap()
     }
 }
diff --git a/rustc_deps/vendor/ring/src/aead/aes_gcm.rs b/rustc_deps/vendor/ring/src/aead/aes_gcm.rs
index 0072121..38c0282 100644
--- a/rustc_deps/vendor/ring/src/aead/aes_gcm.rs
+++ b/rustc_deps/vendor/ring/src/aead/aes_gcm.rs
@@ -16,7 +16,7 @@
     aes::{self, Counter},
     gcm, shift, Aad, Block, Direction, Nonce, Tag, BLOCK_LEN,
 };
-use crate::{aead, endian::*, error, polyfill};
+use crate::{aead, cpu, endian::*, error, polyfill};
 
 /// AES-128 in GCM mode with 128-bit tags and 96 bit nonces.
 pub static AES_128_GCM: aead::Algorithm = aead::Algorithm {
@@ -43,28 +43,33 @@
     aes_key: aes::Key,
 }
 
-fn init_128(key: &[u8]) -> Result<aead::KeyInner, error::Unspecified> {
-    init(key, aes::Variant::AES_128)
+fn init_128(key: &[u8], cpu_features: cpu::Features) -> Result<aead::KeyInner, error::Unspecified> {
+    init(key, aes::Variant::AES_128, cpu_features)
 }
 
-fn init_256(key: &[u8]) -> Result<aead::KeyInner, error::Unspecified> {
-    init(key, aes::Variant::AES_256)
+fn init_256(key: &[u8], cpu_features: cpu::Features) -> Result<aead::KeyInner, error::Unspecified> {
+    init(key, aes::Variant::AES_256, cpu_features)
 }
 
-fn init(key: &[u8], variant: aes::Variant) -> Result<aead::KeyInner, error::Unspecified> {
-    let aes_key = aes::Key::new(key, variant)?;
-    let gcm_key = gcm::Key::new(aes_key.encrypt_block(Block::zero()));
+fn init(
+    key: &[u8], variant: aes::Variant, cpu_features: cpu::Features,
+) -> Result<aead::KeyInner, error::Unspecified> {
+    let aes_key = aes::Key::new(key, variant, cpu_features)?;
+    let gcm_key = gcm::Key::new(aes_key.encrypt_block(Block::zero()), cpu_features);
     Ok(aead::KeyInner::AesGcm(Key { aes_key, gcm_key }))
 }
 
 const CHUNK_BLOCKS: usize = 3 * 1024 / 16;
 
-fn aes_gcm_seal<'a>(key: &aead::KeyInner, nonce: Nonce, aad: Aad<'a>, in_out: &mut [u8]) -> Tag {
-    aead(key, nonce, aad, in_out, Direction::Sealing)
+fn aes_gcm_seal(
+    key: &aead::KeyInner, nonce: Nonce, aad: Aad, in_out: &mut [u8], cpu_features: cpu::Features,
+) -> Tag {
+    aead(key, nonce, aad, in_out, Direction::Sealing, cpu_features)
 }
 
-fn aes_gcm_open<'a>(
-    key: &aead::KeyInner, nonce: Nonce, aad: Aad<'a>, in_prefix_len: usize, in_out: &mut [u8],
+fn aes_gcm_open(
+    key: &aead::KeyInner, nonce: Nonce, aad: Aad, in_prefix_len: usize, in_out: &mut [u8],
+    cpu_features: cpu::Features,
 ) -> Tag {
     aead(
         key,
@@ -72,12 +77,14 @@
         aad,
         in_out,
         Direction::Opening { in_prefix_len },
+        cpu_features,
     )
 }
 
 #[inline(always)] // Avoid branching on `direction`.
-fn aead<'a>(
-    key: &aead::KeyInner, nonce: Nonce, Aad(aad): Aad<'a>, in_out: &mut [u8], direction: Direction,
+fn aead(
+    key: &aead::KeyInner, nonce: Nonce, aad: Aad, in_out: &mut [u8], direction: Direction,
+    cpu_features: cpu::Features,
 ) -> Tag {
     let Key { aes_key, gcm_key } = match key {
         aead::KeyInner::AesGcm(key) => key,
@@ -87,7 +94,8 @@
     let mut ctr = Counter::one(nonce);
     let tag_iv = ctr.increment();
 
-    let mut gcm_ctx = gcm::Context::new(gcm_key, aad);
+    let aad_len = aad.0.len();
+    let mut gcm_ctx = gcm::Context::new(gcm_key, aad, cpu_features);
 
     let in_prefix_len = match direction {
         Direction::Opening { in_prefix_len } => in_prefix_len,
@@ -96,7 +104,14 @@
 
     let total_in_out_len = in_out.len() - in_prefix_len;
 
-    let in_out = integrated_aes_gcm(aes_key, &mut gcm_ctx, in_out, &mut ctr, direction);
+    let in_out = integrated_aes_gcm(
+        aes_key,
+        &mut gcm_ctx,
+        in_out,
+        &mut ctr,
+        direction,
+        cpu_features,
+    );
     let in_out_len = in_out.len() - in_prefix_len;
 
     // Process any (remaining) whole blocks.
@@ -149,7 +164,7 @@
     });
 
     // Authenticate the final block containing the input lengths.
-    let aad_bits = polyfill::u64_from_usize(aad.len()) << 3;
+    let aad_bits = polyfill::u64_from_usize(aad_len) << 3;
     let ciphertext_bits = polyfill::u64_from_usize(total_in_out_len) << 3;
     gcm_ctx.update_block(Block::from_u64_be(
         BigEndian::from(aad_bits),
@@ -170,11 +185,11 @@
 #[inline] // Optimize out the match on `direction`.
 fn integrated_aes_gcm<'a>(
     aes_key: &aes::Key, gcm_ctx: &mut gcm::Context, in_out: &'a mut [u8], ctr: &mut Counter,
-    direction: Direction,
+    direction: Direction, cpu_features: cpu::Features,
 ) -> &'a mut [u8] {
     use crate::c;
 
-    if !aes_key.is_aes_hw() || !gcm_ctx.is_avx2() {
+    if !aes_key.is_aes_hw() || !gcm_ctx.is_avx2(cpu_features) {
         return in_out;
     }
 
@@ -224,6 +239,7 @@
 #[inline]
 fn integrated_aes_gcm<'a>(
     _: &aes::Key, _: &mut gcm::Context, in_out: &'a mut [u8], _: &mut Counter, _: Direction,
+    _: cpu::Features,
 ) -> &'a mut [u8] {
     in_out // This doesn't process any of the input so it all remains.
 }
diff --git a/rustc_deps/vendor/ring/src/aead/block.rs b/rustc_deps/vendor/ring/src/aead/block.rs
index a199319..5294e88 100644
--- a/rustc_deps/vendor/ring/src/aead/block.rs
+++ b/rustc_deps/vendor/ring/src/aead/block.rs
@@ -48,6 +48,13 @@
         }
     }
 
+    pub fn u64s_be_to_native(&mut self) -> [u64; 2] {
+        [
+            u64::from_be(self.subblocks[0]),
+            u64::from_be(self.subblocks[1]),
+        ]
+    }
+
     /// Replaces the first `a.len()` bytes of the block's value with `a`,
     /// leaving the rest of the block unchanged. Panics if `a` is larger
     /// than a block.
diff --git a/rustc_deps/vendor/ring/src/aead/chacha.rs b/rustc_deps/vendor/ring/src/aead/chacha.rs
index a3d90ac..0213f8c 100644
--- a/rustc_deps/vendor/ring/src/aead/chacha.rs
+++ b/rustc_deps/vendor/ring/src/aead/chacha.rs
@@ -147,7 +147,7 @@
     // problem spreads to other platforms.
     #[test]
     pub fn chacha20_tests() {
-        test::from_file("src/aead/chacha_tests.txt", |section, test_case| {
+        test::run(test_file!("chacha_tests.txt"), |section, test_case| {
             assert_eq!(section, "");
 
             let key = test_case.consume_bytes("Key");
diff --git a/rustc_deps/vendor/ring/src/aead/chacha20_poly1305.rs b/rustc_deps/vendor/ring/src/aead/chacha20_poly1305.rs
index a1b56bc..6bbffb0 100644
--- a/rustc_deps/vendor/ring/src/aead/chacha20_poly1305.rs
+++ b/rustc_deps/vendor/ring/src/aead/chacha20_poly1305.rs
@@ -18,7 +18,7 @@
     poly1305, Aad, Block, Direction, Nonce, Tag, BLOCK_LEN,
 };
 use crate::{
-    aead,
+    aead, cpu,
     endian::*,
     error,
     polyfill::{self, convert::*},
@@ -39,19 +39,22 @@
 };
 
 /// Copies |key| into |ctx_buf|.
-fn chacha20_poly1305_init(key: &[u8]) -> Result<aead::KeyInner, error::Unspecified> {
+fn chacha20_poly1305_init(
+    key: &[u8], _todo: cpu::Features,
+) -> Result<aead::KeyInner, error::Unspecified> {
     let key: &[u8; chacha::KEY_LEN] = key.try_into_()?;
     Ok(aead::KeyInner::ChaCha20Poly1305(chacha::Key::from(key)))
 }
 
-fn chacha20_poly1305_seal<'a>(
-    key: &aead::KeyInner, nonce: Nonce, aad: Aad<'a>, in_out: &mut [u8],
+fn chacha20_poly1305_seal(
+    key: &aead::KeyInner, nonce: Nonce, aad: Aad, in_out: &mut [u8], cpu_features: cpu::Features,
 ) -> Tag {
-    aead(key, nonce, aad, in_out, Direction::Sealing)
+    aead(key, nonce, aad, in_out, Direction::Sealing, cpu_features)
 }
 
-fn chacha20_poly1305_open<'a>(
-    key: &aead::KeyInner, nonce: Nonce, aad: Aad<'a>, in_prefix_len: usize, in_out: &mut [u8],
+fn chacha20_poly1305_open(
+    key: &aead::KeyInner, nonce: Nonce, aad: Aad, in_prefix_len: usize, in_out: &mut [u8],
+    cpu_features: cpu::Features,
 ) -> Tag {
     aead(
         key,
@@ -59,14 +62,16 @@
         aad,
         in_out,
         Direction::Opening { in_prefix_len },
+        cpu_features,
     )
 }
 
 pub type Key = chacha::Key;
 
 #[inline(always)] // Statically eliminate branches on `direction`.
-fn aead<'a>(
-    key: &aead::KeyInner, nonce: Nonce, Aad(aad): Aad<'a>, in_out: &mut [u8], direction: Direction,
+fn aead(
+    key: &aead::KeyInner, nonce: Nonce, Aad(aad): Aad, in_out: &mut [u8], direction: Direction,
+    _todo: cpu::Features,
 ) -> Tag {
     let chacha20_key = match key {
         aead::KeyInner::ChaCha20Poly1305(key) => key,
diff --git a/rustc_deps/vendor/ring/src/aead/gcm.rs b/rustc_deps/vendor/ring/src/aead/gcm.rs
index 87e8bf0..00fd5d4 100644
--- a/rustc_deps/vendor/ring/src/aead/gcm.rs
+++ b/rustc_deps/vendor/ring/src/aead/gcm.rs
@@ -12,38 +12,82 @@
 // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-use super::{Block, BLOCK_LEN};
-use crate::c;
+use super::{Aad, Block, BLOCK_LEN};
+use crate::{c, cpu};
 
 #[repr(transparent)]
 pub struct Key(GCM128_KEY);
 
 impl Key {
-    pub fn new(h_be: Block) -> Self {
-        extern "C" {
-            fn GFp_gcm128_init_htable(gcm_key: &mut GCM128_KEY, h_block: Block);
+    pub(super) fn new(mut h_be: Block, cpu_features: cpu::Features) -> Self {
+        let h = h_be.u64s_be_to_native();
+
+        let mut key = Key(GCM128_KEY {
+            Htable: [u128 { hi: 0, lo: 0 }; GCM128_HTABLE_LEN],
+        });
+
+        match detect_implementation(cpu_features) {
+            #[cfg(target_arch = "x86_64")]
+            Implementation::CLMUL if has_avx_movbe(cpu_features) => {
+                extern "C" {
+                    fn GFp_gcm_init_avx(key: &mut Key, h: &[u64; 2]);
+                }
+                unsafe {
+                    GFp_gcm_init_avx(&mut key, &h);
+                }
+            },
+
+            Implementation::CLMUL => {
+                extern "C" {
+                    fn GFp_gcm_init_clmul(key: &mut Key, h: &[u64; 2]);
+                }
+                unsafe {
+                    GFp_gcm_init_clmul(&mut key, &h);
+                }
+            },
+
+            #[cfg(any(target_arch = "arm"))]
+            Implementation::NEON => {
+                extern "C" {
+                    fn GFp_gcm_init_neon(key: &mut Key, h: &[u64; 2]);
+                }
+                unsafe {
+                    GFp_gcm_init_neon(&mut key, &h);
+                }
+            },
+
+            Implementation::Fallback => {
+                extern "C" {
+                    fn GFp_gcm_init_4bit(key: &mut Key, h: &[u64; 2]);
+                }
+                unsafe {
+                    GFp_gcm_init_4bit(&mut key, &h);
+                }
+            },
         }
 
-        let mut r = Key(GCM128_KEY([Block::zero(); GCM128_HTABLE_LEN]));
-        unsafe {
-            GFp_gcm128_init_htable(&mut r.0, h_be);
-        }
-        r
+        key
     }
 }
 
 #[repr(transparent)]
-pub struct Context(GCM128_CONTEXT);
+pub struct Context {
+    inner: GCM128_CONTEXT,
+    cpu_features: cpu::Features,
+}
 
 impl Context {
-    pub fn new(key: &Key, aad: &[u8]) -> Self {
-        let mut ctx = Context(GCM128_CONTEXT {
-            Xi: Block::zero(),
-            H_unused: Block::zero(),
-            key: key.0.clone(),
-        });
+    pub(crate) fn new(key: &Key, aad: Aad, cpu_features: cpu::Features) -> Self {
+        let mut ctx = Context {
+            inner: GCM128_CONTEXT {
+                Xi: Block::zero(),
+                H_unused: Block::zero(),
+                key: key.0.clone(),
+            },
+            cpu_features,
+        };
 
-        for ad in aad.chunks(BLOCK_LEN) {
+        for ad in aad.0.chunks(BLOCK_LEN) {
             let mut block = Block::zero();
             block.partial_copy_from(ad);
             ctx.update_block(block);
@@ -55,22 +99,95 @@
     pub fn update_blocks(&mut self, input: &[u8]) {
         debug_assert!(input.len() > 0);
         debug_assert_eq!(input.len() % BLOCK_LEN, 0);
-        extern "C" {
-            fn GFp_gcm128_ghash(ctx: &mut Context, input: *const u8, input_len: c::size_t);
-        }
-        unsafe {
-            GFp_gcm128_ghash(self, input.as_ptr(), input.len());
+
+        let key_aliasing: *const GCM128_KEY = &self.inner.key;
+
+        match detect_implementation(self.cpu_features) {
+            #[cfg(target_arch = "x86_64")]
+            Implementation::CLMUL if has_avx_movbe(self.cpu_features) => {
+                extern "C" {
+                    fn GFp_gcm_ghash_avx(
+                        ctx: &mut Context, h_table: *const GCM128_KEY, inp: *const u8,
+                        len: c::size_t,
+                    );
+                }
+                unsafe {
+                    GFp_gcm_ghash_avx(self, key_aliasing, input.as_ptr(), input.len());
+                }
+            },
+
+            Implementation::CLMUL => {
+                extern "C" {
+                    fn GFp_gcm_ghash_clmul(
+                        ctx: &mut Context, h_table: *const GCM128_KEY, inp: *const u8,
+                        len: c::size_t,
+                    );
+                }
+                unsafe {
+                    GFp_gcm_ghash_clmul(self, key_aliasing, input.as_ptr(), input.len());
+                }
+            },
+
+            #[cfg(any(target_arch = "arm"))]
+            Implementation::NEON => {
+                extern "C" {
+                    fn GFp_gcm_ghash_neon(
+                        ctx: &mut Context, h_table: *const GCM128_KEY, inp: *const u8,
+                        len: c::size_t,
+                    );
+                }
+                unsafe {
+                    GFp_gcm_ghash_neon(self, key_aliasing, input.as_ptr(), input.len());
+                }
+            },
+
+            Implementation::Fallback => {
+                extern "C" {
+                    fn GFp_gcm_ghash_4bit(
+                        ctx: &mut Context, h_table: *const GCM128_KEY, inp: *const u8,
+                        len: c::size_t,
+                    );
+                }
+                unsafe {
+                    GFp_gcm_ghash_4bit(self, key_aliasing, input.as_ptr(), input.len());
+                }
+            },
         }
     }
 
     pub fn update_block(&mut self, a: Block) {
-        extern "C" {
-            fn GFp_gcm128_gmult(ctx: &mut Context);
-        }
+        self.inner.Xi.bitxor_assign(a);
 
-        self.0.Xi.bitxor_assign(a);
-        unsafe {
-            GFp_gcm128_gmult(self);
+        let key_aliasing: *const GCM128_KEY = &self.inner.key;
+
+        match detect_implementation(self.cpu_features) {
+            Implementation::CLMUL => {
+                extern "C" {
+                    fn GFp_gcm_gmult_clmul(ctx: &mut Context, Htable: *const GCM128_KEY);
+                }
+                unsafe {
+                    GFp_gcm_gmult_clmul(self, key_aliasing);
+                }
+            },
+
+            #[cfg(any(target_arch = "arm"))]
+            Implementation::NEON => {
+                extern "C" {
+                    fn GFp_gcm_gmult_neon(ctx: &mut Context, Htable: *const GCM128_KEY);
+                }
+                unsafe {
+                    GFp_gcm_gmult_neon(self, key_aliasing);
+                }
+            },
+
+            Implementation::Fallback => {
+                extern "C" {
+                    fn GFp_gcm_gmult_4bit(ctx: &mut Context, Htable: *const GCM128_KEY);
+                }
+                unsafe {
+                    GFp_gcm_gmult_4bit(self, key_aliasing);
+                }
+            },
         }
     }
 
@@ -78,23 +195,31 @@
     where
         F: FnOnce(Block) -> super::Tag,
     {
-        f(self.0.Xi)
+        f(self.inner.Xi)
     }
 
     #[cfg(target_arch = "x86_64")]
-    pub(super) fn is_avx2(&self) -> bool {
-        extern "C" {
-            fn GFp_aesni_gcm_capable() -> c::int;
-            fn GFp_gcm_clmul_enabled() -> c::int;
+    pub(super) fn is_avx2(&self, cpu_features: cpu::Features) -> bool {
+        match detect_implementation(cpu_features) {
+            Implementation::CLMUL => has_avx_movbe(self.cpu_features),
+            _ => false,
         }
-        1 == unsafe { GFp_gcm_clmul_enabled() } && 1 == unsafe { GFp_aesni_gcm_capable() }
     }
 }
 
 // Keep in sync with `GCM128_KEY` in modes/internal.h.
 #[derive(Clone)]
 #[repr(C, align(16))]
-struct GCM128_KEY([Block; GCM128_HTABLE_LEN]);
+struct GCM128_KEY {
+    Htable: [u128; GCM128_HTABLE_LEN],
+}
+
+#[derive(Clone, Copy)]
+#[repr(C)]
+struct u128 {
+    hi: u64,
+    lo: u64,
+}
 
 const GCM128_HTABLE_LEN: usize = 16;
 
@@ -105,3 +230,35 @@
     H_unused: Block,
     key: GCM128_KEY,
 }
+
+enum Implementation {
+    CLMUL,
+
+    #[cfg(target_arch = "arm")]
+    NEON,
+
+    Fallback,
+}
+
+#[inline]
+fn detect_implementation(cpu: cpu::Features) -> Implementation {
+    if (cpu::intel::FXSR.available(cpu) && cpu::intel::PCLMULQDQ.available(cpu))
+        || cpu::arm::PMULL.available(cpu)
+    {
+        return Implementation::CLMUL;
+    }
+
+    #[cfg(target_arch = "arm")]
+    {
+        if cpu::arm::NEON.available(cpu) {
+            return Implementation::NEON;
+        }
+    }
+
+    Implementation::Fallback
+}
+
+#[cfg(target_arch = "x86_64")]
+fn has_avx_movbe(cpu_features: cpu::Features) -> bool {
+    return cpu::intel::AVX.available(cpu_features) && cpu::intel::MOVBE.available(cpu_features);
+}
diff --git a/rustc_deps/vendor/ring/src/aead/poly1305.rs b/rustc_deps/vendor/ring/src/aead/poly1305.rs
index 851ae46..4c810ca 100644
--- a/rustc_deps/vendor/ring/src/aead/poly1305.rs
+++ b/rustc_deps/vendor/ring/src/aead/poly1305.rs
@@ -183,7 +183,7 @@
     // Adapted from BoringSSL's crypto/poly1305/poly1305_test.cc.
     #[test]
     pub fn test_poly1305() {
-        test::from_file("src/aead/poly1305_test.txt", |section, test_case| {
+        test::run(test_file!("poly1305_test.txt"), |section, test_case| {
             assert_eq!(section, "");
             let key = test_case.consume_bytes("Key");
             let key: &[u8; BLOCK_LEN * 2] = key.as_slice().try_into_().unwrap();
diff --git a/rustc_deps/vendor/ring/src/aead/quic.rs b/rustc_deps/vendor/ring/src/aead/quic.rs
index 60060fc..b88e852 100644
--- a/rustc_deps/vendor/ring/src/aead/quic.rs
+++ b/rustc_deps/vendor/ring/src/aead/quic.rs
@@ -41,9 +41,8 @@
     pub fn new(
         algorithm: &'static Algorithm, key_bytes: &[u8],
     ) -> Result<Self, error::Unspecified> {
-        cpu::cache_detected_features();
         Ok(HeaderProtectionKey {
-            inner: (algorithm.init)(key_bytes)?,
+            inner: (algorithm.init)(key_bytes, cpu::features())?,
             algorithm,
         })
     }
@@ -68,7 +67,7 @@
 
 /// A QUIC Header Protection Algorithm.
 pub struct Algorithm {
-    init: fn(key: &[u8]) -> Result<KeyInner, error::Unspecified>,
+    init: fn(key: &[u8], cpu_features: cpu::Features) -> Result<KeyInner, error::Unspecified>,
 
     new_mask: fn(key: &KeyInner, sample: Block) -> [u8; 5],
 
@@ -117,13 +116,13 @@
     id: AlgorithmID::AES_256,
 };
 
-fn aes_init_128(key: &[u8]) -> Result<KeyInner, error::Unspecified> {
-    let aes_key = aes::Key::new(key, aes::Variant::AES_128)?;
+fn aes_init_128(key: &[u8], cpu_features: cpu::Features) -> Result<KeyInner, error::Unspecified> {
+    let aes_key = aes::Key::new(key, aes::Variant::AES_128, cpu_features)?;
     Ok(KeyInner::Aes(aes_key))
 }
 
-fn aes_init_256(key: &[u8]) -> Result<KeyInner, error::Unspecified> {
-    let aes_key = aes::Key::new(key, aes::Variant::AES_256)?;
+fn aes_init_256(key: &[u8], cpu_features: cpu::Features) -> Result<KeyInner, error::Unspecified> {
+    let aes_key = aes::Key::new(key, aes::Variant::AES_256, cpu_features)?;
     Ok(KeyInner::Aes(aes_key))
 }
 
@@ -144,7 +143,7 @@
     id: AlgorithmID::CHACHA20,
 };
 
-fn chacha20_init(key: &[u8]) -> Result<KeyInner, error::Unspecified> {
+fn chacha20_init(key: &[u8], _todo: cpu::Features) -> Result<KeyInner, error::Unspecified> {
     let chacha20_key: &[u8; chacha::KEY_LEN] = key.try_into_()?;
     Ok(KeyInner::ChaCha20(chacha::Key::from(chacha20_key)))
 }
diff --git a/rustc_deps/vendor/ring/src/agreement.rs b/rustc_deps/vendor/ring/src/agreement.rs
index 4d53470..55ace06 100644
--- a/rustc_deps/vendor/ring/src/agreement.rs
+++ b/rustc_deps/vendor/ring/src/agreement.rs
@@ -66,7 +66,7 @@
 // The "NSA Guide" steps here are from from section 3.1, "Ephemeral Unified
 // Model."
 
-use crate::{ec, error, rand};
+use crate::{cpu, ec, error, rand};
 use untrusted;
 
 pub use crate::ec::{
@@ -84,7 +84,7 @@
     ) -> Result<(), error::Unspecified>,
 }
 
-derive_debug_via_field!(Algorithm, stringify!(Algorithm), curve);
+derive_debug_via_field!(Algorithm, curve);
 
 impl Eq for Algorithm {}
 impl PartialEq for Algorithm {
@@ -104,11 +104,13 @@
     pub fn generate(
         alg: &'static Algorithm, rng: &rand::SecureRandom,
     ) -> Result<Self, error::Unspecified> {
+        let cpu_features = cpu::features();
+
         // NSA Guide Step 1.
         //
         // This only handles the key generation part of step 1. The rest of
         // step one is done by `compute_public_key()`.
-        let private_key = ec::Seed::generate(&alg.curve, rng)?;
+        let private_key = ec::Seed::generate(&alg.curve, rng, cpu_features)?;
         Ok(Self { private_key, alg })
     }
 
diff --git a/rustc_deps/vendor/ring/src/bssl.rs b/rustc_deps/vendor/ring/src/bssl.rs
index 7ab504a..5837d6c 100644
--- a/rustc_deps/vendor/ring/src/bssl.rs
+++ b/rustc_deps/vendor/ring/src/bssl.rs
@@ -51,8 +51,7 @@
                 fn $bssl_test_main_fn_name() -> c::int;
             }
 
-            cpu::cache_detected_features();
-            ::std::env::set_current_dir(crate::test::ring_src_path()).unwrap();
+            let _ = cpu::features();
 
             let result = unsafe { $bssl_test_main_fn_name() };
             assert_eq!(result, 0);
diff --git a/rustc_deps/vendor/ring/src/cpu.rs b/rustc_deps/vendor/ring/src/cpu.rs
index 70c15ad..7b1b299 100644
--- a/rustc_deps/vendor/ring/src/cpu.rs
+++ b/rustc_deps/vendor/ring/src/cpu.rs
@@ -12,15 +12,280 @@
 // OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 // CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
+/// A witness indicating that CPU features have been detected and cached.
+///
+/// TODO: Eventually all feature detection logic should be done through
+/// functions that accept a `Features` parameter, to guarantee that nothing
+/// tries to read the cached values before they are written.
+///
+/// This is a zero-sized type so that it can be "stored" wherever convenient.
+#[derive(Copy, Clone)]
+pub(crate) struct Features(());
+
 #[inline(always)]
-pub fn cache_detected_features() {
+pub(crate) fn features() -> Features {
+    // We don't do runtime feature detection on iOS. instead some features are
+    // assumed to be present; see `arm::Feature`.
     #[cfg(not(target_os = "ios"))]
     {
-        use std;
+        static INIT: spin::Once<()> = spin::Once::new();
+        let () = INIT.call_once(|| {
+            #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+            {
+                extern "C" {
+                    fn GFp_cpuid_setup();
+                }
+                unsafe {
+                    GFp_cpuid_setup();
+                }
+            }
+
+            #[cfg(all(
+                any(target_os = "android", target_os = "linux"),
+                any(target_arch = "aarch64", target_arch = "arm")
+            ))]
+            {
+                arm::linux_setup();
+            }
+
+            #[cfg(all(target_os = "fuchsia", any(target_arch = "aarch64")))]
+            {
+                arm::fuchsia_setup();
+            }
+        });
+    }
+
+    Features(())
+}
+
+pub(crate) mod arm {
+    #[cfg(all(
+        any(target_os = "android", target_os = "linux"),
+        any(target_arch = "aarch64", target_arch = "arm")
+    ))]
+    pub fn linux_setup() {
+        // XXX: The `libc` crate doesn't provide `libc::getauxval` consistently
+        // across all Android/Linux targets, e.g. musl.
         extern "C" {
-            fn GFp_cpuid_setup();
+            fn getauxval(type_: libc::c_ulong) -> libc::c_ulong;
         }
-        static INIT: std::sync::Once = std::sync::ONCE_INIT;
-        INIT.call_once(|| unsafe { GFp_cpuid_setup() });
+
+        const AT_HWCAP: libc::c_ulong = 16;
+
+        #[cfg(target_arch = "aarch64")]
+        const HWCAP_NEON: libc::c_ulong = 1 << 1;
+
+        #[cfg(target_arch = "arm")]
+        const HWCAP_NEON: libc::c_ulong = 1 << 12;
+
+        let caps = unsafe { getauxval(AT_HWCAP) };
+
+        // OpenSSL and BoringSSL don't enable any other features if NEON isn't
+        // available.
+        if caps & HWCAP_NEON == HWCAP_NEON {
+            let mut features = NEON.mask;
+
+            #[cfg(target_arch = "aarch64")]
+            const OFFSET: libc::c_ulong = 3;
+
+            #[cfg(target_arch = "arm")]
+            const OFFSET: libc::c_ulong = 0;
+
+            #[cfg(target_arch = "arm")]
+            let caps = {
+                const AT_HWCAP2: libc::c_ulong = 26;
+                unsafe { getauxval(AT_HWCAP2) }
+            };
+
+            const HWCAP_AES: libc::c_ulong = 1 << 0 + OFFSET;
+            const HWCAP_PMULL: libc::c_ulong = 1 << 1 + OFFSET;
+            const HWCAP_SHA2: libc::c_ulong = 1 << 3 + OFFSET;
+
+            if caps & HWCAP_AES == HWCAP_AES {
+                features |= AES.mask;
+            }
+            if caps & HWCAP_PMULL == HWCAP_PMULL {
+                features |= PMULL.mask;
+            }
+            if caps & HWCAP_SHA2 == HWCAP_SHA2 {
+                features |= 1 << 4;
+            }
+
+            unsafe { GFp_armcap_P = features };
+        }
+    }
+
+    #[cfg(all(target_os = "fuchsia", any(target_arch = "aarch64")))]
+    pub fn fuchsia_setup() {
+        type zx_status_t = i32;
+
+        #[link(name = "zircon")]
+        extern "C" {
+            fn zx_system_get_features(kind: u32, features: *mut u32) -> zx_status_t;
+        }
+
+        const ZX_OK: i32 = 0;
+        const ZX_FEATURE_KIND_CPU: u32 = 0;
+        const ZX_ARM64_FEATURE_ISA_ASIMD: u32 = 1 << 2;
+        const ZX_ARM64_FEATURE_ISA_AES: u32 = 1 << 3;
+        const ZX_ARM64_FEATURE_ISA_PMULL: u32 = 1 << 4;
+        const ZX_ARM64_FEATURE_ISA_SHA2: u32 = 1 << 6;
+
+        let mut caps = 0;
+        let rc = unsafe { zx_system_get_features(ZX_FEATURE_KIND_CPU, &mut caps) };
+
+        // OpenSSL and BoringSSL don't enable any other features if NEON isn't
+        // available.
+        if rc == ZX_OK && (caps & ZX_ARM64_FEATURE_ISA_ASIMD == ZX_ARM64_FEATURE_ISA_ASIMD) {
+            let mut features = NEON.mask;
+
+            if caps & ZX_ARM64_FEATURE_ISA_AES == ZX_ARM64_FEATURE_ISA_AES {
+                features |= AES.mask;
+            }
+            if caps & ZX_ARM64_FEATURE_ISA_PMULL == ZX_ARM64_FEATURE_ISA_PMULL {
+                features |= PMULL.mask;
+            }
+            if caps & ZX_ARM64_FEATURE_ISA_SHA2 == ZX_ARM64_FEATURE_ISA_SHA2 {
+                features |= 1 << 4;
+            }
+
+            unsafe { GFp_armcap_P = features };
+        }
+    }
+
+    pub(crate) struct Feature {
+        #[cfg_attr(
+            any(
+                target_os = "ios",
+                not(any(target_arch = "arm", target_arch = "aarch64"))
+            ),
+            allow(dead_code)
+        )]
+        mask: u32,
+
+        #[cfg_attr(not(target_os = "ios"), allow(dead_code))]
+        ios: bool,
+    }
+
+    impl Feature {
+        #[inline(always)]
+        pub fn available(&self, _: super::Features) -> bool {
+            #[cfg(all(target_os = "ios", any(target_arch = "arm", target_arch = "aarch64")))]
+            {
+                return self.ios;
+            }
+
+            #[cfg(all(
+                any(target_os = "android", target_os = "linux", target_os = "fuchsia"),
+                any(target_arch = "arm", target_arch = "aarch64")
+            ))]
+            {
+                return self.mask == self.mask & unsafe { GFp_armcap_P };
+            }
+
+            #[cfg(not(any(target_arch = "arm", target_arch = "aarch64")))]
+            {
+                return false;
+            }
+        }
+    }
+
+    // Keep in sync with `ARMV7_NEON`.
+    #[cfg(any(target_arch = "aarch64", target_arch = "arm"))]
+    pub(crate) const NEON: Feature = Feature {
+        mask: 1 << 0,
+        ios: true,
+    };
+
+    // Keep in sync with `ARMV8_AES`.
+    pub(crate) const AES: Feature = Feature {
+        mask: 1 << 2,
+        ios: true,
+    };
+
+    // Keep in sync with `ARMV8_PMULL`.
+    pub(crate) const PMULL: Feature = Feature {
+        mask: 1 << 5,
+        ios: true,
+    };
+
+    #[cfg(all(
+        any(target_os = "android", target_os = "linux", target_os = "fuchsia"),
+        any(target_arch = "arm", target_arch = "aarch64")
+    ))]
+    extern "C" {
+        static mut GFp_armcap_P: u32;
+    }
+}
+
+#[cfg_attr(
+    not(any(target_arch = "x86", target_arch = "x86_64")),
+    allow(dead_code)
+)]
+pub(crate) mod intel {
+    pub(crate) struct Feature {
+        word: usize,
+        mask: u32,
+    }
+
+    impl Feature {
+        #[inline(always)]
+        pub fn available(&self, _: super::Features) -> bool {
+            #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+            {
+                extern "C" {
+                    static mut GFp_ia32cap_P: [u32; 4];
+                }
+                return self.mask == self.mask & unsafe { GFp_ia32cap_P[self.word] };
+            }
+
+            #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
+            {
+                return false;
+            }
+        }
+    }
+
+    pub(crate) const FXSR: Feature = Feature {
+        word: 0,
+        mask: 1 << 24,
+    };
+
+    pub(crate) const PCLMULQDQ: Feature = Feature {
+        word: 1,
+        mask: 1 << 1,
+    };
+
+    pub(crate) const SSSE3: Feature = Feature {
+        word: 1,
+        mask: 1 << 9,
+    };
+
+    #[cfg(target_arch = "x86_64")]
+    pub(crate) const MOVBE: Feature = Feature {
+        word: 1,
+        mask: 1 << 22,
+    };
+
+    pub(crate) const AES: Feature = Feature {
+        word: 1,
+        mask: 1 << 25,
+    };
+
+    #[cfg(target_arch = "x86_64")]
+    pub(crate) const AVX: Feature = Feature {
+        word: 1,
+        mask: 1 << 28,
+    };
+
+    #[cfg(all(target_arch = "x86_64", test))]
+    mod x86_64_tests {
+        use super::*;
+
+        #[test]
+        fn test_avx_movbe_mask() {
+            // This is the OpenSSL style of testing these bits.
+            assert_eq!((AVX.mask | MOVBE.mask) >> 22, 0x41);
+        }
     }
 }
diff --git a/rustc_deps/vendor/ring/src/debug.rs b/rustc_deps/vendor/ring/src/debug.rs
index 2fa8f8a..b9b1fed 100644
--- a/rustc_deps/vendor/ring/src/debug.rs
+++ b/rustc_deps/vendor/ring/src/debug.rs
@@ -25,6 +25,10 @@
 }
 
 macro_rules! derive_debug_via_field {
+    ($type:ty, $field:ident) => {
+        derive_debug_via_field!($type, stringify!($type), $field);
+    };
+
     ($type:ty, $typename:expr, $field:ident) => {
         impl ::core::fmt::Debug for $type {
             fn fmt(&self, f: &mut ::core::fmt::Formatter) -> Result<(), ::core::fmt::Error> {
diff --git a/rustc_deps/vendor/ring/src/digest.rs b/rustc_deps/vendor/ring/src/digest.rs
index 063aa18..5ff7915 100644
--- a/rustc_deps/vendor/ring/src/digest.rs
+++ b/rustc_deps/vendor/ring/src/digest.rs
@@ -66,7 +66,7 @@
 impl Context {
     /// Constructs a new context.
     pub fn new(algorithm: &'static Algorithm) -> Context {
-        cpu::cache_detected_features();
+        let _ = cpu::features();
 
         Context {
             algorithm,
diff --git a/rustc_deps/vendor/ring/src/ec/curve25519/x25519.rs b/rustc_deps/vendor/ring/src/ec/curve25519/x25519.rs
index 2822c7c..b43009d 100644
--- a/rustc_deps/vendor/ring/src/ec/curve25519/x25519.rs
+++ b/rustc_deps/vendor/ring/src/ec/curve25519/x25519.rs
@@ -15,7 +15,7 @@
 //! X25519 Key agreement.
 
 use super::ops;
-use crate::{agreement, constant_time, ec, error, polyfill::convert::*, rand};
+use crate::{agreement, constant_time, cpu, ec, error, polyfill::convert::*, rand};
 use untrusted;
 
 static CURVE25519: ec::Curve = ec::Curve {
@@ -56,24 +56,72 @@
 ) -> Result<(), error::Unspecified> {
     let public_out = public_out.try_into_()?;
 
+    #[cfg(target_arch = "arm")]
+    let cpu_features = private_key.cpu_features;
+
     let private_key = private_key.bytes_less_safe().try_into_()?;
-    unsafe {
-        GFp_x25519_public_from_private(public_out, private_key);
+
+    #[cfg(target_arch = "arm")]
+    {
+        if cpu::arm::NEON.available(cpu_features) {
+            static MONTGOMERY_BASE_POINT: [u8; 32] = [
+                9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+                0, 0, 0, 0,
+            ];
+            x25519_neon(public_out, private_key, &MONTGOMERY_BASE_POINT);
+            return Ok(());
+        }
     }
+
+    extern "C" {
+        fn GFp_x25519_public_from_private_generic(
+            public_key_out: &mut PublicKey, private_key: &PrivateKey,
+        );
+    }
+    unsafe {
+        GFp_x25519_public_from_private_generic(public_out, private_key);
+    }
+
     Ok(())
 }
 
 fn x25519_ecdh(
     out: &mut [u8], my_private_key: &ec::Seed, peer_public_key: untrusted::Input,
 ) -> Result<(), error::Unspecified> {
+    let cpu_features = my_private_key.cpu_features;
     let my_private_key = my_private_key.bytes_less_safe().try_into_()?;
     let peer_public_key: &[u8; PUBLIC_KEY_LEN] =
         peer_public_key.as_slice_less_safe().try_into_()?;
 
-    unsafe {
-        GFp_x25519_scalar_mult(out.try_into_()?, my_private_key, peer_public_key);
+    #[cfg_attr(not(target_arch = "arm"), allow(unused_variables))]
+    fn scalar_mult(
+        out: &mut ops::EncodedPoint, scalar: &ops::Scalar, point: &ops::EncodedPoint,
+        cpu_features: cpu::Features,
+    ) {
+        #[cfg(target_arch = "arm")]
+        {
+            if cpu::arm::NEON.available(cpu_features) {
+                return x25519_neon(out, scalar, point);
+            }
+        }
+
+        extern "C" {
+            fn GFp_x25519_scalar_mult_generic(
+                out: &mut ops::EncodedPoint, scalar: &ops::Scalar, point: &ops::EncodedPoint,
+            );
+        }
+        unsafe {
+            GFp_x25519_scalar_mult_generic(out, scalar, point);
+        }
     }
 
+    scalar_mult(
+        out.try_into_()?,
+        my_private_key,
+        peer_public_key,
+        cpu_features,
+    );
+
     let zeros: SharedSecret = [0; SHARED_SECRET_LEN];
     if constant_time::verify_slices_are_equal(out, &zeros).is_ok() {
         // All-zero output results when the input is a point of small order.
@@ -83,6 +131,16 @@
     Ok(())
 }
 
+#[cfg(target_arch = "arm")]
+fn x25519_neon(out: &mut ops::EncodedPoint, scalar: &ops::Scalar, point: &ops::EncodedPoint) {
+    extern "C" {
+        fn GFp_x25519_NEON(
+            out: &mut ops::EncodedPoint, scalar: &ops::Scalar, point: &ops::EncodedPoint,
+        );
+    }
+    unsafe { GFp_x25519_NEON(out, scalar, point) }
+}
+
 const ELEM_AND_SCALAR_LEN: usize = ops::ELEM_LEN;
 
 // An X25519 private key as an unmasked scalar.
@@ -96,10 +154,3 @@
 // An X25519 shared secret as an encoded Curve25519 point.
 type SharedSecret = [u8; SHARED_SECRET_LEN];
 const SHARED_SECRET_LEN: usize = ELEM_AND_SCALAR_LEN;
-
-extern "C" {
-    fn GFp_x25519_public_from_private(public_key_out: &mut PublicKey, private_key: &PrivateKey);
-    fn GFp_x25519_scalar_mult(
-        out: &mut ops::EncodedPoint, scalar: &ops::Scalar, point: &ops::EncodedPoint,
-    );
-}
diff --git a/rustc_deps/vendor/ring/src/ec/keys.rs b/rustc_deps/vendor/ring/src/ec/keys.rs
index 0288d44..3646739 100644
--- a/rustc_deps/vendor/ring/src/ec/keys.rs
+++ b/rustc_deps/vendor/ring/src/ec/keys.rs
@@ -19,25 +19,27 @@
 pub struct Seed {
     bytes: [u8; SEED_MAX_BYTES],
     curve: &'static Curve,
+    pub(crate) cpu_features: cpu::Features,
 }
 
 impl Seed {
-    pub fn generate(
-        curve: &'static Curve, rng: &rand::SecureRandom,
+    pub(crate) fn generate(
+        curve: &'static Curve, rng: &rand::SecureRandom, cpu_features: cpu::Features,
     ) -> Result<Seed, error::Unspecified> {
-        cpu::cache_detected_features();
+        let _ = cpu::features();
         let mut r = Self {
             bytes: [0u8; SEED_MAX_BYTES],
             curve,
+            cpu_features,
         };
         (curve.generate_private_key)(rng, &mut r.bytes[..curve.elem_scalar_seed_len])?;
         Ok(r)
     }
 
-    pub fn from_bytes(
-        curve: &'static Curve, bytes: untrusted::Input,
+    pub(crate) fn from_bytes(
+        curve: &'static Curve, bytes: untrusted::Input, cpu_features: cpu::Features,
     ) -> Result<Seed, error::Unspecified> {
-        cpu::cache_detected_features();
+        let _ = cpu::features();
         let bytes = bytes.as_slice_less_safe();
         if curve.elem_scalar_seed_len != bytes.len() {
             return Err(error::Unspecified);
@@ -46,6 +48,7 @@
         let mut r = Seed {
             bytes: [0; SEED_MAX_BYTES],
             curve,
+            cpu_features,
         };
         r.bytes[..curve.elem_scalar_seed_len].copy_from_slice(bytes);
         Ok(r)
diff --git a/rustc_deps/vendor/ring/src/ec/suite_b.rs b/rustc_deps/vendor/ring/src/ec/suite_b.rs
index e53d532..7ac7d12 100644
--- a/rustc_deps/vendor/ring/src/ec/suite_b.rs
+++ b/rustc_deps/vendor/ring/src/ec/suite_b.rs
@@ -15,7 +15,7 @@
 //! Elliptic curve operations on P-256 & P-384.
 
 use self::ops::*;
-use crate::{arithmetic::montgomery::*, ec, error, io::der, pkcs8};
+use crate::{arithmetic::montgomery::*, cpu, ec, error, io::der, pkcs8};
 use untrusted;
 
 // NIST SP 800-56A Step 3: "If q is an odd prime p, verify that
@@ -151,6 +151,7 @@
 
 pub(crate) fn key_pair_from_pkcs8(
     curve: &'static ec::Curve, template: &pkcs8::Template, input: untrusted::Input,
+    cpu_features: cpu::Features,
 ) -> Result<ec::KeyPair, error::KeyRejected> {
     let (ec_private_key, _) = pkcs8::unwrap_key(template, pkcs8::Version::V1Only, input)?;
     let (private_key, public_key) =
@@ -163,7 +164,7 @@
                 |input| key_pair_from_pkcs8_(template, input),
             )
         })?;
-    key_pair_from_bytes(curve, private_key, public_key)
+    key_pair_from_bytes(curve, private_key, public_key, cpu_features)
 }
 
 fn key_pair_from_pkcs8_<'a>(
@@ -201,11 +202,11 @@
     Ok((private_key, public_key))
 }
 
-pub fn key_pair_from_bytes(
+pub(crate) fn key_pair_from_bytes(
     curve: &'static ec::Curve, private_key_bytes: untrusted::Input,
-    public_key_bytes: untrusted::Input,
+    public_key_bytes: untrusted::Input, cpu_features: cpu::Features,
 ) -> Result<ec::KeyPair, error::KeyRejected> {
-    let seed = ec::Seed::from_bytes(curve, private_key_bytes)
+    let seed = ec::Seed::from_bytes(curve, private_key_bytes, cpu_features)
         .map_err(|error::Unspecified| error::KeyRejected::invalid_component())?;
 
     let r = ec::KeyPair::derive(seed)
diff --git a/rustc_deps/vendor/ring/src/ec/suite_b/ecdsa/digest_scalar.rs b/rustc_deps/vendor/ring/src/ec/suite_b/ecdsa/digest_scalar.rs
index 9b73b8e..82662c0 100644
--- a/rustc_deps/vendor/ring/src/ec/suite_b/ecdsa/digest_scalar.rs
+++ b/rustc_deps/vendor/ring/src/ec/suite_b/ecdsa/digest_scalar.rs
@@ -88,8 +88,8 @@
 
     #[test]
     fn test() {
-        test::from_file(
-            "src/ec/suite_b/ecdsa/ecdsa_digest_scalar_tests.txt",
+        test::run(
+            test_file!("ecdsa_digest_scalar_tests.txt"),
             |section, test_case| {
                 assert_eq!(section, "");
 
diff --git a/rustc_deps/vendor/ring/src/ec/suite_b/ecdsa/signing.rs b/rustc_deps/vendor/ring/src/ec/suite_b/ecdsa/signing.rs
index 0c9a0d0..4a8a4e1 100644
--- a/rustc_deps/vendor/ring/src/ec/suite_b/ecdsa/signing.rs
+++ b/rustc_deps/vendor/ring/src/ec/suite_b/ecdsa/signing.rs
@@ -17,7 +17,7 @@
 use super::digest_scalar::digest_scalar;
 use crate::{
     arithmetic::montgomery::*,
-    digest,
+    cpu, digest,
     ec::{
         self,
         suite_b::{ops::*, private_key},
@@ -83,7 +83,7 @@
     pub fn generate_pkcs8(
         alg: &'static Algorithm, rng: &rand::SecureRandom,
     ) -> Result<pkcs8::Document, error::Unspecified> {
-        let private_key = ec::Seed::generate(alg.curve, rng)?;
+        let private_key = ec::Seed::generate(alg.curve, rng, cpu::features())?;
         let public_key = private_key.compute_public_key()?;
         Ok(pkcs8::wrap_key(
             &alg.pkcs8_template,
@@ -105,7 +105,12 @@
     pub fn from_pkcs8(
         alg: &'static Algorithm, input: untrusted::Input,
     ) -> Result<Self, error::KeyRejected> {
-        let key_pair = ec::suite_b::key_pair_from_pkcs8(alg.curve, alg.pkcs8_template, input)?;
+        let key_pair = ec::suite_b::key_pair_from_pkcs8(
+            alg.curve,
+            alg.pkcs8_template,
+            input,
+            cpu::features(),
+        )?;
         Ok(Self::new(alg, key_pair))
     }
 
@@ -118,7 +123,8 @@
     pub fn from_private_key_and_public_key(
         alg: &'static Algorithm, private_key: untrusted::Input, public_key: untrusted::Input,
     ) -> Result<Self, error::KeyRejected> {
-        let key_pair = ec::suite_b::key_pair_from_bytes(alg.curve, private_key, public_key)?;
+        let key_pair =
+            ec::suite_b::key_pair_from_bytes(alg.curve, private_key, public_key, cpu::features())?;
         Ok(Self::new(alg, key_pair))
     }
 
@@ -381,8 +387,8 @@
 
     #[test]
     fn signature_ecdsa_sign_fixed_test() {
-        test::from_file(
-            "src/ec/suite_b/ecdsa/ecdsa_sign_fixed_tests.txt",
+        test::run(
+            test_file!("ecdsa_sign_fixed_tests.txt"),
             |section, test_case| {
                 assert_eq!(section, "");
 
@@ -425,8 +431,8 @@
 
     #[test]
     fn signature_ecdsa_sign_asn1_test() {
-        test::from_file(
-            "src/ec/suite_b/ecdsa/ecdsa_sign_asn1_tests.txt",
+        test::run(
+            test_file!("ecdsa_sign_asn1_tests.txt"),
             |section, test_case| {
                 assert_eq!(section, "");
 
diff --git a/rustc_deps/vendor/ring/src/ec/suite_b/ecdsa/verification.rs b/rustc_deps/vendor/ring/src/ec/suite_b/ecdsa/verification.rs
index 5996ca0..28a1a20 100644
--- a/rustc_deps/vendor/ring/src/ec/suite_b/ecdsa/verification.rs
+++ b/rustc_deps/vendor/ring/src/ec/suite_b/ecdsa/verification.rs
@@ -278,8 +278,8 @@
 
     #[test]
     fn test_digest_based_test_vectors() {
-        test::from_file(
-            "crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt",
+        test::run(
+            test_file!("../../../../crypto/fipsmodule/ecdsa/ecdsa_verify_tests.txt"),
             |section, test_case| {
                 assert_eq!(section, "");
 
diff --git a/rustc_deps/vendor/ring/src/ec/suite_b/ops.rs b/rustc_deps/vendor/ring/src/ec/suite_b/ops.rs
index 001bbac..10e7212 100644
--- a/rustc_deps/vendor/ring/src/ec/suite_b/ops.rs
+++ b/rustc_deps/vendor/ring/src/ec/suite_b/ops.rs
@@ -473,7 +473,7 @@
     fn p256_elem_add_test() {
         elem_add_test(
             &p256::PUBLIC_SCALAR_OPS,
-            "src/ec/suite_b/ops/p256_elem_sum_tests.txt",
+            test_file!("ops/p256_elem_sum_tests.txt"),
         );
     }
 
@@ -481,12 +481,12 @@
     fn p384_elem_add_test() {
         elem_add_test(
             &p384::PUBLIC_SCALAR_OPS,
-            "src/ec/suite_b/ops/p384_elem_sum_tests.txt",
+            test_file!("ops/p384_elem_sum_tests.txt"),
         );
     }
 
-    fn elem_add_test(ops: &PublicScalarOps, file_path: &str) {
-        test::from_file(file_path, |section, test_case| {
+    fn elem_add_test(ops: &PublicScalarOps, test_file: test::File) {
+        test::run(test_file, |section, test_case| {
             assert_eq!(section, "");
 
             let cops = ops.public_key_ops.common;
@@ -517,16 +517,16 @@
         elem_sub_test(
             &p384::COMMON_OPS,
             GFp_p384_elem_sub,
-            "src/ec/suite_b/ops/p384_elem_sum_tests.txt",
+            test_file!("ops/p384_elem_sum_tests.txt"),
         );
     }
 
     fn elem_sub_test(
         ops: &CommonOps,
         elem_sub: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, b: *const Limb),
-        file_path: &str,
+        test_file: test::File,
     ) {
-        test::from_file(file_path, |section, test_case| {
+        test::run(test_file, |section, test_case| {
             assert_eq!(section, "");
 
             let a = consume_elem(ops, test_case, "a");
@@ -568,15 +568,15 @@
         elem_div_by_2_test(
             &p384::COMMON_OPS,
             GFp_p384_elem_div_by_2,
-            "src/ec/suite_b/ops/p384_elem_div_by_2_tests.txt",
+            test_file!("ops/p384_elem_div_by_2_tests.txt"),
         );
     }
 
     fn elem_div_by_2_test(
         ops: &CommonOps, elem_div_by_2: unsafe extern "C" fn(r: *mut Limb, a: *const Limb),
-        file_path: &str,
+        test_file: test::File,
     ) {
-        test::from_file(file_path, |section, test_case| {
+        test::run(test_file, |section, test_case| {
             assert_eq!(section, "");
 
             let a = consume_elem(ops, test_case, "a");
@@ -601,7 +601,7 @@
         elem_neg_test(
             &p256::COMMON_OPS,
             GFp_nistz256_neg,
-            "src/ec/suite_b/ops/p256_elem_neg_tests.txt",
+            test_file!("ops/p256_elem_neg_tests.txt"),
         );
     }
 
@@ -613,15 +613,15 @@
         elem_neg_test(
             &p384::COMMON_OPS,
             GFp_p384_elem_neg,
-            "src/ec/suite_b/ops/p384_elem_neg_tests.txt",
+            test_file!("ops/p384_elem_neg_tests.txt"),
         );
     }
 
     fn elem_neg_test(
         ops: &CommonOps, elem_neg: unsafe extern "C" fn(r: *mut Limb, a: *const Limb),
-        file_path: &str,
+        test_file: test::File,
     ) {
-        test::from_file(file_path, |section, test_case| {
+        test::run(test_file, |section, test_case| {
             assert_eq!(section, "");
 
             let a = consume_elem(ops, test_case, "a");
@@ -651,22 +651,16 @@
 
     #[test]
     fn p256_elem_mul_test() {
-        elem_mul_test(
-            &p256::COMMON_OPS,
-            "src/ec/suite_b/ops/p256_elem_mul_tests.txt",
-        );
+        elem_mul_test(&p256::COMMON_OPS, test_file!("ops/p256_elem_mul_tests.txt"));
     }
 
     #[test]
     fn p384_elem_mul_test() {
-        elem_mul_test(
-            &p384::COMMON_OPS,
-            "src/ec/suite_b/ops/p384_elem_mul_tests.txt",
-        );
+        elem_mul_test(&p384::COMMON_OPS, test_file!("ops/p384_elem_mul_tests.txt"));
     }
 
-    fn elem_mul_test(ops: &CommonOps, file_path: &str) {
-        test::from_file(file_path, |section, test_case| {
+    fn elem_mul_test(ops: &CommonOps, test_file: test::File) {
+        test::run(test_file, |section, test_case| {
             assert_eq!(section, "");
 
             let mut a = consume_elem(ops, test_case, "a");
@@ -683,7 +677,7 @@
     fn p256_scalar_mul_test() {
         scalar_mul_test(
             &p256::SCALAR_OPS,
-            "src/ec/suite_b/ops/p256_scalar_mul_tests.txt",
+            test_file!("ops/p256_scalar_mul_tests.txt"),
         );
     }
 
@@ -691,12 +685,12 @@
     fn p384_scalar_mul_test() {
         scalar_mul_test(
             &p384::SCALAR_OPS,
-            "src/ec/suite_b/ops/p384_scalar_mul_tests.txt",
+            test_file!("ops/p384_scalar_mul_tests.txt"),
         );
     }
 
-    fn scalar_mul_test(ops: &ScalarOps, file_path: &str) {
-        test::from_file(file_path, |section, test_case| {
+    fn scalar_mul_test(ops: &ScalarOps, test_file: test::File) {
+        test::run(test_file, |section, test_case| {
             assert_eq!(section, "");
             let cops = ops.common;
             let mut a = consume_scalar(cops, test_case, "a");
@@ -717,7 +711,7 @@
         scalar_square_test(
             &p256::SCALAR_OPS,
             GFp_p256_scalar_sqr_rep_mont,
-            "src/ec/suite_b/ops/p256_scalar_square_tests.txt",
+            test_file!("ops/p256_scalar_square_tests.txt"),
         );
     }
 
@@ -726,9 +720,9 @@
 
     fn scalar_square_test(
         ops: &ScalarOps, sqr_rep: unsafe extern "C" fn(r: *mut Limb, a: *const Limb, rep: c::int),
-        file_path: &str,
+        test_file: test::File,
     ) {
-        test::from_file(file_path, |section, test_case| {
+        test::run(test_file, |section, test_case| {
             assert_eq!(section, "");
             let cops = &ops.common;
             let a = consume_scalar(cops, test_case, "a");
@@ -771,7 +765,7 @@
     fn p256_point_sum_test() {
         point_sum_test(
             &p256::PRIVATE_KEY_OPS,
-            "src/ec/suite_b/ops/p256_point_sum_tests.txt",
+            test_file!("ops/p256_point_sum_tests.txt"),
         );
     }
 
@@ -779,12 +773,12 @@
     fn p384_point_sum_test() {
         point_sum_test(
             &p384::PRIVATE_KEY_OPS,
-            "src/ec/suite_b/ops/p384_point_sum_tests.txt",
+            test_file!("ops/p384_point_sum_tests.txt"),
         );
     }
 
-    fn point_sum_test(ops: &PrivateKeyOps, file_path: &str) {
-        test::from_file(file_path, |section, test_case| {
+    fn point_sum_test(ops: &PrivateKeyOps, test_file: test::File) {
+        test::run(test_file, |section, test_case| {
             assert_eq!(section, "");
 
             let a = consume_jacobian_point(ops, test_case, "a");
@@ -810,7 +804,7 @@
         point_sum_mixed_test(
             &p256::PRIVATE_KEY_OPS,
             GFp_nistz256_point_add_affine,
-            "src/ec/suite_b/ops/p256_point_sum_mixed_tests.txt",
+            test_file!("ops/p256_point_sum_mixed_tests.txt"),
         );
     }
 
@@ -823,9 +817,9 @@
             a: *const Limb, // [ops.num_limbs*3]
             b: *const Limb, // [ops.num_limbs*2]
         ),
-        file_path: &str,
+        test_file: test::File,
     ) {
-        test::from_file(file_path, |section, test_case| {
+        test::run(test_file, |section, test_case| {
             assert_eq!(section, "");
 
             let a = consume_jacobian_point(ops, test_case, "a");
@@ -854,7 +848,7 @@
         point_double_test(
             &p256::PRIVATE_KEY_OPS,
             GFp_nistz256_point_double,
-            "src/ec/suite_b/ops/p256_point_double_tests.txt",
+            test_file!("ops/p256_point_double_tests.txt"),
         );
     }
 
@@ -869,7 +863,7 @@
         point_double_test(
             &p384::PRIVATE_KEY_OPS,
             GFp_nistz384_point_double,
-            "src/ec/suite_b/ops/p384_point_double_tests.txt",
+            test_file!("ops/p384_point_double_tests.txt"),
         );
     }
 
@@ -879,9 +873,9 @@
             r: *mut Limb,   // [ops.num_limbs*3]
             a: *const Limb, // [ops.num_limbs*3]
         ),
-        file_path: &str,
+        test_file: test::File,
     ) {
-        test::from_file(file_path, |section, test_case| {
+        test::run(test_file, |section, test_case| {
             assert_eq!(section, "");
 
             let a = consume_jacobian_point(ops, test_case, "a");
@@ -902,7 +896,7 @@
     fn p256_point_mul_test() {
         point_mul_tests(
             &p256::PRIVATE_KEY_OPS,
-            "src/ec/suite_b/ops/p256_point_mul_tests.txt",
+            test_file!("ops/p256_point_mul_tests.txt"),
         );
     }
 
@@ -910,12 +904,12 @@
     fn p384_point_mul_test() {
         point_mul_tests(
             &p384::PRIVATE_KEY_OPS,
-            "src/ec/suite_b/ops/p384_point_mul_tests.txt",
+            test_file!("ops/p384_point_mul_tests.txt"),
         );
     }
 
-    fn point_mul_tests(ops: &PrivateKeyOps, file_path: &str) {
-        test::from_file(file_path, |section, test_case| {
+    fn point_mul_tests(ops: &PrivateKeyOps, test_file: test::File) {
+        test::run(test_file, |section, test_case| {
             assert_eq!(section, "");
             let p_scalar = consume_scalar(ops.common, test_case, "p_scalar");
             let (x, y) = match consume_point(ops, test_case, "p") {
@@ -936,16 +930,16 @@
         point_mul_serialized_test(
             &p256::PRIVATE_KEY_OPS,
             &p256::PUBLIC_KEY_OPS,
-            "src/ec/suite_b/ops/p256_point_mul_serialized_tests.txt",
+            test_file!("ops/p256_point_mul_serialized_tests.txt"),
         );
     }
 
     fn point_mul_serialized_test(
-        priv_ops: &PrivateKeyOps, pub_ops: &PublicKeyOps, file_path: &str,
+        priv_ops: &PrivateKeyOps, pub_ops: &PublicKeyOps, test_file: test::File,
     ) {
         let cops = pub_ops.common;
 
-        test::from_file(file_path, |section, test_case| {
+        test::run(test_file, |section, test_case| {
             assert_eq!(section, "");
             let p_scalar = consume_scalar(cops, test_case, "p_scalar");
 
@@ -982,7 +976,7 @@
     fn p256_point_mul_base_test() {
         point_mul_base_tests(
             &p256::PRIVATE_KEY_OPS,
-            "src/ec/suite_b/ops/p256_point_mul_base_tests.txt",
+            test_file!("ops/p256_point_mul_base_tests.txt"),
         );
     }
 
@@ -990,12 +984,12 @@
     fn p384_point_mul_base_test() {
         point_mul_base_tests(
             &p384::PRIVATE_KEY_OPS,
-            "src/ec/suite_b/ops/p384_point_mul_base_tests.txt",
+            test_file!("ops/p384_point_mul_base_tests.txt"),
         );
     }
 
-    fn point_mul_base_tests(ops: &PrivateKeyOps, file_path: &str) {
-        test::from_file(file_path, |section, test_case| {
+    fn point_mul_base_tests(ops: &PrivateKeyOps, test_file: test::File) {
+        test::run(test_file, |section, test_case| {
             assert_eq!(section, "");
             let g_scalar = consume_scalar(ops.common, test_case, "g_scalar");
             let expected_result = consume_point(ops, test_case, "r");
diff --git a/rustc_deps/vendor/ring/src/ec/suite_b/public_key.rs b/rustc_deps/vendor/ring/src/ec/suite_b/public_key.rs
index fd655dd..8cb5714 100644
--- a/rustc_deps/vendor/ring/src/ec/suite_b/public_key.rs
+++ b/rustc_deps/vendor/ring/src/ec/suite_b/public_key.rs
@@ -72,8 +72,8 @@
 
     #[test]
     fn parse_uncompressed_point_test() {
-        test::from_file(
-            "src/ec/suite_b/suite_b_public_key_tests.txt",
+        test::run(
+            test_file!("suite_b_public_key_tests.txt"),
             |section, test_case| {
                 assert_eq!(section, "");
 
diff --git a/rustc_deps/vendor/ring/src/hmac.rs b/rustc_deps/vendor/ring/src/hmac.rs
index a8d6d08..151bb32 100644
--- a/rustc_deps/vendor/ring/src/hmac.rs
+++ b/rustc_deps/vendor/ring/src/hmac.rs
@@ -251,19 +251,26 @@
         };
 
         const IPAD: u8 = 0x36;
+
+        let mut padded_key = [IPAD; digest::MAX_BLOCK_LEN];
+        let padded_key = &mut padded_key[..digest_alg.block_len];
+
+        // If the key is shorter than one block then we're supposed to act like
+        // it is padded with zero bytes up to the block length. `x ^ 0 == x` so
+        // we can just leave the trailing bytes of `padded_key` untouched.
+        for (padded_key, key_value) in padded_key.iter_mut().zip(key_value.iter()) {
+            *padded_key ^= *key_value;
+        }
+        key.ctx_prototype.inner.update(&padded_key);
+
         const OPAD: u8 = 0x5C;
 
-        for b in key_value {
-            key.ctx_prototype.inner.update(&[IPAD ^ b]);
-            key.ctx_prototype.outer.update(&[OPAD ^ b]);
+        // Remove the `IPAD` masking, leaving the unmasked padded key, then
+        // mask with `OPAD`, all in one step.
+        for b in padded_key.iter_mut() {
+            *b ^= IPAD ^ OPAD;
         }
-
-        // If the key is shorter than one block then act as though the key is
-        // padded with zeros.
-        for _ in key_value.len()..digest_alg.block_len {
-            key.ctx_prototype.inner.update(&[IPAD]);
-            key.ctx_prototype.outer.update(&[OPAD]);
-        }
+        key.ctx_prototype.outer.update(&padded_key);
 
         key
     }
@@ -480,8 +487,8 @@
     // that the generated key fills the entire `key_bytes` parameter.
     #[test]
     pub fn generate_serializable_tests() {
-        test::from_file(
-            "src/hmac_generate_serializable_tests.txt",
+        test::run(
+            test_file!("hmac_generate_serializable_tests.txt"),
             |section, test_case| {
                 assert_eq!(section, "");
                 let digest_alg = test_case.consume_digest_alg("HMAC").unwrap();
diff --git a/rustc_deps/vendor/ring/src/io/der.rs b/rustc_deps/vendor/ring/src/io/der.rs
index 2d6bce5..457e350 100644
--- a/rustc_deps/vendor/ring/src/io/der.rs
+++ b/rustc_deps/vendor/ring/src/io/der.rs
@@ -41,11 +41,15 @@
     ContextSpecificConstructed3 = CONTEXT_SPECIFIC | CONSTRUCTED | 3,
 }
 
+impl From<Tag> for usize {
+    fn from(tag: Tag) -> Self { tag as usize }
+}
+
 pub fn expect_tag_and_get_value<'a>(
     input: &mut untrusted::Reader<'a>, tag: Tag,
 ) -> Result<untrusted::Input<'a>, error::Unspecified> {
     let (actual_tag, inner) = read_tag_and_get_value(input)?;
-    if (tag as usize) != (actual_tag as usize) {
+    if usize::from(tag) != usize::from(actual_tag) {
         return Err(error::Unspecified);
     }
     Ok(inner)
@@ -63,17 +67,17 @@
     // is encoded in the seven remaining bits of that byte. Otherwise, those
     // seven bits represent the number of bytes used to encode the length.
     let length = match input.read_byte()? {
-        n if (n & 0x80) == 0 => n as usize,
+        n if (n & 0x80) == 0 => usize::from(n),
         0x81 => {
             let second_byte = input.read_byte()?;
             if second_byte < 128 {
                 return Err(error::Unspecified); // Not the canonical encoding.
             }
-            second_byte as usize
+            usize::from(second_byte)
         },
         0x82 => {
-            let second_byte = input.read_byte()? as usize;
-            let third_byte = input.read_byte()? as usize;
+            let second_byte = usize::from(input.read_byte()?);
+            let third_byte = usize::from(input.read_byte()?);
             let combined = (second_byte << 8) | third_byte;
             if combined < 256 {
                 return Err(error::Unspecified); // Not the canonical encoding.
diff --git a/rustc_deps/vendor/ring/src/lib.rs b/rustc_deps/vendor/ring/src/lib.rs
index 26c0af9..3455ef7 100644
--- a/rustc_deps/vendor/ring/src/lib.rs
+++ b/rustc_deps/vendor/ring/src/lib.rs
@@ -84,6 +84,10 @@
 #[macro_use]
 mod polyfill;
 
+#[cfg(any(test, feature = "use_heap"))]
+#[macro_use]
+pub mod test;
+
 mod arithmetic;
 
 pub mod aead;
@@ -113,9 +117,6 @@
 
 pub mod signature;
 
-#[cfg(any(test, feature = "use_heap"))]
-pub mod test;
-
 mod sealed {
     /// Traits that are designed to only be implemented internally in *ring*.
     //
diff --git a/rustc_deps/vendor/ring/src/rand.rs b/rustc_deps/vendor/ring/src/rand.rs
index 4912b8d..1d0208e 100644
--- a/rustc_deps/vendor/ring/src/rand.rs
+++ b/rustc_deps/vendor/ring/src/rand.rs
@@ -95,7 +95,13 @@
 
 #[cfg(all(
     feature = "use_heap",
-    not(any(target_os = "linux", target_os = "macos", target_os = "ios", windows))
+    not(any(
+        target_os = "linux",
+        target_os = "macos",
+        target_os = "ios",
+        target_os = "fuchsia",
+        windows
+    ))
 ))]
 use self::urandom::fill as fill_impl;
 
@@ -110,6 +116,10 @@
 
 #[cfg(any(target_os = "macos", target_os = "ios"))]
 use self::darwin::fill as fill_impl;
+
+#[cfg(any(target_os = "fuchsia"))]
+use self::fuchsia::fill as fill_impl;
+
 use crate::sealed;
 
 #[cfg(target_os = "linux")]
@@ -188,7 +198,8 @@
     feature = "use_heap",
     any(target_os = "redox", unix),
     not(any(target_os = "macos", target_os = "ios")),
-    not(all(target_os = "linux", not(feature = "dev_urandom_fallback")))
+    not(all(target_os = "linux", not(feature = "dev_urandom_fallback"))),
+    not(any(target_os = "fuchsia")),
 ))]
 mod urandom {
     use crate::error;
@@ -279,6 +290,23 @@
     }
 }
 
+#[cfg(any(target_os = "fuchsia"))]
+mod fuchsia {
+    use crate::error;
+
+    pub fn fill(dest: &mut [u8]) -> Result<(), error::Unspecified> {
+        unsafe {
+            zx_cprng_draw(dest.as_mut_ptr(), dest.len());
+        }
+        Ok(())
+    }
+
+    #[link(name = "zircon")]
+    extern "C" {
+        fn zx_cprng_draw(buffer: *mut u8, length: usize);
+    }
+}
+
 #[cfg(test)]
 mod tests {
     use crate::rand::{self, SecureRandom};
diff --git a/rustc_deps/vendor/ring/src/rsa/bigint.rs b/rustc_deps/vendor/ring/src/rsa/bigint.rs
index b203d26..a3cdef3 100644
--- a/rustc_deps/vendor/ring/src/rsa/bigint.rs
+++ b/rustc_deps/vendor/ring/src/rsa/bigint.rs
@@ -1224,8 +1224,8 @@
 
     #[test]
     fn test_elem_exp_consttime() {
-        test::from_file(
-            "src/rsa/bigint_elem_exp_consttime_tests.txt",
+        test::run(
+            test_file!("bigint_elem_exp_consttime_tests.txt"),
             |section, test_case| {
                 assert_eq!(section, "");
 
@@ -1253,28 +1253,31 @@
     // verification and signing tests.
     #[test]
     fn test_elem_mul() {
-        test::from_file("src/rsa/bigint_elem_mul_tests.txt", |section, test_case| {
-            assert_eq!(section, "");
+        test::run(
+            test_file!("bigint_elem_mul_tests.txt"),
+            |section, test_case| {
+                assert_eq!(section, "");
 
-            let m = consume_modulus::<M>(test_case, "M");
-            let expected_result = consume_elem(test_case, "ModMul", &m);
-            let a = consume_elem(test_case, "A", &m);
-            let b = consume_elem(test_case, "B", &m);
+                let m = consume_modulus::<M>(test_case, "M");
+                let expected_result = consume_elem(test_case, "ModMul", &m);
+                let a = consume_elem(test_case, "A", &m);
+                let b = consume_elem(test_case, "B", &m);
 
-            let b = into_encoded(b, &m);
-            let a = into_encoded(a, &m);
-            let actual_result = elem_mul(&a, b, &m);
-            let actual_result = actual_result.into_unencoded(&m);
-            assert_elem_eq(&actual_result, &expected_result);
+                let b = into_encoded(b, &m);
+                let a = into_encoded(a, &m);
+                let actual_result = elem_mul(&a, b, &m);
+                let actual_result = actual_result.into_unencoded(&m);
+                assert_elem_eq(&actual_result, &expected_result);
 
-            Ok(())
-        })
+                Ok(())
+            },
+        )
     }
 
     #[test]
     fn test_elem_squared() {
-        test::from_file(
-            "src/rsa/bigint_elem_squared_tests.txt",
+        test::run(
+            test_file!("bigint_elem_squared_tests.txt"),
             |section, test_case| {
                 assert_eq!(section, "");
 
@@ -1294,8 +1297,8 @@
 
     #[test]
     fn test_elem_reduced() {
-        test::from_file(
-            "src/rsa/bigint_elem_reduced_tests.txt",
+        test::run(
+            test_file!("bigint_elem_reduced_tests.txt"),
             |section, test_case| {
                 assert_eq!(section, "");
 
@@ -1320,8 +1323,8 @@
 
     #[test]
     fn test_elem_reduced_once() {
-        test::from_file(
-            "src/rsa/bigint_elem_reduced_once_tests.txt",
+        test::run(
+            test_file!("bigint_elem_reduced_once_tests.txt"),
             |section, test_case| {
                 assert_eq!(section, "");
 
diff --git a/rustc_deps/vendor/ring/src/rsa/padding.rs b/rustc_deps/vendor/ring/src/rsa/padding.rs
index 712be3f..ffc8424 100644
--- a/rustc_deps/vendor/ring/src/rsa/padding.rs
+++ b/rustc_deps/vendor/ring/src/rsa/padding.rs
@@ -498,72 +498,78 @@
 
     #[test]
     fn test_pss_padding_verify() {
-        test::from_file("src/rsa/rsa_pss_padding_tests.txt", |section, test_case| {
-            assert_eq!(section, "");
+        test::run(
+            test_file!("rsa_pss_padding_tests.txt"),
+            |section, test_case| {
+                assert_eq!(section, "");
 
-            let digest_name = test_case.consume_string("Digest");
-            let alg = match digest_name.as_ref() {
-                "SHA256" => &RSA_PSS_SHA256,
-                "SHA384" => &RSA_PSS_SHA384,
-                "SHA512" => &RSA_PSS_SHA512,
-                _ => panic!("Unsupported digest: {}", digest_name),
-            };
+                let digest_name = test_case.consume_string("Digest");
+                let alg = match digest_name.as_ref() {
+                    "SHA256" => &RSA_PSS_SHA256,
+                    "SHA384" => &RSA_PSS_SHA384,
+                    "SHA512" => &RSA_PSS_SHA512,
+                    _ => panic!("Unsupported digest: {}", digest_name),
+                };
 
-            let msg = test_case.consume_bytes("Msg");
-            let msg = untrusted::Input::from(&msg);
-            let m_hash = digest::digest(alg.digest_alg(), msg.as_slice_less_safe());
+                let msg = test_case.consume_bytes("Msg");
+                let msg = untrusted::Input::from(&msg);
+                let m_hash = digest::digest(alg.digest_alg(), msg.as_slice_less_safe());
 
-            let encoded = test_case.consume_bytes("EM");
-            let encoded = untrusted::Input::from(&encoded);
+                let encoded = test_case.consume_bytes("EM");
+                let encoded = untrusted::Input::from(&encoded);
 
-            // Salt is recomputed in verification algorithm.
-            let _ = test_case.consume_bytes("Salt");
+                // Salt is recomputed in verification algorithm.
+                let _ = test_case.consume_bytes("Salt");
 
-            let bit_len = test_case.consume_usize_bits("Len");
-            let expected_result = test_case.consume_string("Result");
+                let bit_len = test_case.consume_usize_bits("Len");
+                let expected_result = test_case.consume_string("Result");
 
-            let actual_result =
-                encoded.read_all(error::Unspecified, |m| alg.verify(&m_hash, m, bit_len));
-            assert_eq!(actual_result.is_ok(), expected_result == "P");
+                let actual_result =
+                    encoded.read_all(error::Unspecified, |m| alg.verify(&m_hash, m, bit_len));
+                assert_eq!(actual_result.is_ok(), expected_result == "P");
 
-            Ok(())
-        });
+                Ok(())
+            },
+        );
     }
 
     // Tests PSS encoding for various public modulus lengths.
     #[cfg(feature = "use_heap")]
     #[test]
     fn test_pss_padding_encode() {
-        test::from_file("src/rsa/rsa_pss_padding_tests.txt", |section, test_case| {
-            assert_eq!(section, "");
+        test::run(
+            test_file!("rsa_pss_padding_tests.txt"),
+            |section, test_case| {
+                assert_eq!(section, "");
 
-            let digest_name = test_case.consume_string("Digest");
-            let alg = match digest_name.as_ref() {
-                "SHA256" => &RSA_PSS_SHA256,
-                "SHA384" => &RSA_PSS_SHA384,
-                "SHA512" => &RSA_PSS_SHA512,
-                _ => panic!("Unsupported digest: {}", digest_name),
-            };
+                let digest_name = test_case.consume_string("Digest");
+                let alg = match digest_name.as_ref() {
+                    "SHA256" => &RSA_PSS_SHA256,
+                    "SHA384" => &RSA_PSS_SHA384,
+                    "SHA512" => &RSA_PSS_SHA512,
+                    _ => panic!("Unsupported digest: {}", digest_name),
+                };
 
-            let msg = test_case.consume_bytes("Msg");
-            let salt = test_case.consume_bytes("Salt");
-            let encoded = test_case.consume_bytes("EM");
-            let bit_len = test_case.consume_usize_bits("Len");
-            let expected_result = test_case.consume_string("Result");
+                let msg = test_case.consume_bytes("Msg");
+                let salt = test_case.consume_bytes("Salt");
+                let encoded = test_case.consume_bytes("EM");
+                let bit_len = test_case.consume_usize_bits("Len");
+                let expected_result = test_case.consume_string("Result");
 
-            // Only test the valid outputs
-            if expected_result != "P" {
-                return Ok(());
-            }
+                // Only test the valid outputs
+                if expected_result != "P" {
+                    return Ok(());
+                }
 
-            let rng = test::rand::FixedSliceRandom { bytes: &salt };
+                let rng = test::rand::FixedSliceRandom { bytes: &salt };
 
-            let mut m_out = vec![0u8; bit_len.as_usize_bytes_rounded_up()];
-            let digest = digest::digest(alg.digest_alg(), &msg);
-            alg.encode(&digest, &mut m_out, bit_len, &rng).unwrap();
-            assert_eq!(m_out, encoded);
+                let mut m_out = vec![0u8; bit_len.as_usize_bytes_rounded_up()];
+                let digest = digest::digest(alg.digest_alg(), &msg);
+                alg.encode(&digest, &mut m_out, bit_len, &rng).unwrap();
+                assert_eq!(m_out, encoded);
 
-            Ok(())
-        });
+                Ok(())
+            },
+        );
     }
 }
diff --git a/rustc_deps/vendor/ring/src/rsa/verification.rs b/rustc_deps/vendor/ring/src/rsa/verification.rs
index 476e241..3ca0f0c 100644
--- a/rustc_deps/vendor/ring/src/rsa/verification.rs
+++ b/rustc_deps/vendor/ring/src/rsa/verification.rs
@@ -204,7 +204,7 @@
     params: &Parameters, (n, e): (untrusted::Input, untrusted::Input), msg: untrusted::Input,
     signature: untrusted::Input,
 ) -> Result<(), error::Unspecified> {
-    cpu::cache_detected_features();
+    let _ = cpu::features();
     verify_rsa_(params, (n, e), msg, signature)
 }
 
diff --git a/rustc_deps/vendor/ring/src/signature.rs b/rustc_deps/vendor/ring/src/signature.rs
index d8a0849..33542e2 100644
--- a/rustc_deps/vendor/ring/src/signature.rs
+++ b/rustc_deps/vendor/ring/src/signature.rs
@@ -401,6 +401,6 @@
     alg: &VerificationAlgorithm, public_key: untrusted::Input, msg: untrusted::Input,
     signature: untrusted::Input,
 ) -> Result<(), error::Unspecified> {
-    cpu::cache_detected_features();
+    let _ = cpu::features();
     alg.verify(public_key, msg, signature)
 }
diff --git a/rustc_deps/vendor/ring/src/test.rs b/rustc_deps/vendor/ring/src/test.rs
index 6166612..901becd 100644
--- a/rustc_deps/vendor/ring/src/test.rs
+++ b/rustc_deps/vendor/ring/src/test.rs
@@ -53,7 +53,7 @@
 //! ```ignore
 //! use ring::test;
 //!
-//! test::from_file("src/hmac_tests.txt", |section, test_case| {
+//! test::run(test::test_file!("hmac_tests.txt"), |section, test_case| {
 //!     assert_eq!(section, ""); // This test doesn't use named sections.
 //!
 //!     let digest_alg = test_case.consume_digest_alg("HMAC");
@@ -122,7 +122,7 @@
 use crate::{digest, error};
 
 use core;
-use std::{self, io::BufRead, string::String, vec::Vec};
+use std::{self, string::String, vec::Vec};
 
 /// `compile_time_assert_clone::<T>();` fails to compile if `T` doesn't
 /// implement `Clone`.
@@ -276,43 +276,40 @@
     }
 }
 
-/// Returns the path for *ring* source code root.
-///
-/// On iOS, source are assumed to be copied in the application bundle, as
-/// a "src" directory along the test runner.
-#[cfg(target_os = "ios")]
-pub fn ring_src_path() -> std::path::PathBuf {
-    std::env::current_exe()
-        .unwrap()
-        .parent()
-        .unwrap()
-        .join("src")
+/// References a test input file.
+#[macro_export]
+macro_rules! test_file {
+    ($file_name:expr) => {
+        crate::test::File {
+            file_name: $file_name,
+            contents: include_str!($file_name),
+        }
+    };
 }
 
-/// Returns the path for *ring* source code root.
-///
-/// On most platforms, the tests are run by cargo, so it's just the current
-/// working directory.
-#[cfg(not(target_os = "ios"))]
-pub fn ring_src_path() -> std::path::PathBuf { std::path::PathBuf::from(".") }
+/// A test input file.
+pub struct File<'a> {
+    /// The name (path) of the file.
+    pub file_name: &'a str,
 
-/// Reads test cases out of the file with the path given by
-/// `test_data_relative_file_path`, calling `f` on each vector until `f` fails
-/// or until all the test vectors have been read. `f` can indicate failure
-/// either by returning `Err()` or by panicking.
-pub fn from_file<F>(test_data_relative_file_path: &str, mut f: F)
+    /// The contents of the file.
+    pub contents: &'a str,
+}
+
+/// Parses test cases out of the given file, calling `f` on each vector until
+/// `f` fails or until all the test vectors have been read. `f` can indicate
+/// failure either by returning `Err()` or by panicking.
+pub fn run<F>(test_file: File, mut f: F)
 where
     F: FnMut(&str, &mut TestCase) -> Result<(), error::Unspecified>,
 {
-    let path = ring_src_path().join(test_data_relative_file_path);
-    let file = std::fs::File::open(path).unwrap();
-    let mut lines = std::io::BufReader::new(&file).lines();
+    let lines = &mut test_file.contents.lines();
 
     let mut current_section = String::from("");
     let mut failed = false;
 
     #[allow(box_pointers)]
-    while let Some(mut test_case) = parse_test_case(&mut current_section, &mut lines) {
+    while let Some(mut test_case) = parse_test_case(&mut current_section, lines) {
         let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
             f(&current_section, &mut test_case)
         }));
@@ -336,7 +333,7 @@
         if let Err(msg) = result {
             failed = true;
 
-            println!("{}: {}", test_data_relative_file_path, msg);
+            println!("{}: {}", test_file.file_name, msg);
             for (name, value, consumed) in test_case.attributes {
                 let consumed_str = if consumed { "" } else { " (unconsumed)" };
                 println!("{}{} = {}", name, consumed_str, value);
@@ -379,17 +376,14 @@
     }
 }
 
-type FileLines<'a> = std::io::Lines<std::io::BufReader<&'a std::fs::File>>;
-
-fn parse_test_case(current_section: &mut String, lines: &mut FileLines) -> Option<TestCase> {
+fn parse_test_case<'a>(
+    current_section: &mut String, lines: &mut Iterator<Item = &'a str>,
+) -> Option<TestCase> {
     let mut attributes = Vec::new();
 
     let mut is_first_line = true;
     loop {
-        let line = match lines.next() {
-            None => None,
-            Some(result) => Some(result.unwrap()),
-        };
+        let line = lines.next();
 
         if cfg!(feature = "test_logging") {
             if let Some(text) = &line {
@@ -539,7 +533,7 @@
 
     #[test]
     fn one_ok() {
-        test::from_file("src/test_1_tests.txt", |_, test_case| {
+        test::run(test_file!("test_1_tests.txt"), |_, test_case| {
             let _ = test_case.consume_string("Key");
             Ok(())
         });
@@ -548,7 +542,7 @@
     #[test]
     #[should_panic(expected = "Test failed.")]
     fn one_err() {
-        test::from_file("src/test_1_tests.txt", |_, test_case| {
+        test::run(test_file!("test_1_tests.txt"), |_, test_case| {
             let _ = test_case.consume_string("Key");
             Err(error::Unspecified)
         });
@@ -557,7 +551,7 @@
     #[test]
     #[should_panic(expected = "Test failed.")]
     fn one_panics() {
-        test::from_file("src/test_1_tests.txt", |_, test_case| {
+        test::run(test_file!("test_1_tests.txt"), |_, test_case| {
             let _ = test_case.consume_string("Key");
             panic!("");
         });
@@ -577,7 +571,7 @@
 
     fn err_one(test_to_fail: usize) {
         let mut n = 0;
-        test::from_file("src/test_3_tests.txt", |_, test_case| {
+        test::run(test_file!("test_3_tests.txt"), |_, test_case| {
             let _ = test_case.consume_string("Key");
             let result = if n != test_to_fail {
                 Ok(())
@@ -603,7 +597,7 @@
 
     fn panic_one(test_to_fail: usize) {
         let mut n = 0;
-        test::from_file("src/test_3_tests.txt", |_, test_case| {
+        test::run(test_file!("test_3_tests.txt"), |_, test_case| {
             let _ = test_case.consume_string("Key");
             if n == test_to_fail {
                 panic!("Oh Noes!");
@@ -615,9 +609,5 @@
 
     #[test]
     #[should_panic(expected = "Syntax error: Expected Key = Value.")]
-    fn syntax_error() { test::from_file("src/test_1_syntax_error_tests.txt", |_, _| Ok(())); }
-
-    #[test]
-    #[should_panic]
-    fn file_not_found() { test::from_file("src/test_file_not_found_tests.txt", |_, _| Ok(())); }
+    fn syntax_error() { test::run(test_file!("test_1_syntax_error_tests.txt"), |_, _| Ok(())); }
 }
diff --git a/rustc_deps/vendor/ring/tests/aead_tests.rs b/rustc_deps/vendor/ring/tests/aead_tests.rs
index e5159f4..6a062d4 100644
--- a/rustc_deps/vendor/ring/tests/aead_tests.rs
+++ b/rustc_deps/vendor/ring/tests/aead_tests.rs
@@ -31,26 +31,26 @@
     warnings
 )]
 
-use ring::{aead, error, test};
+use ring::{aead, error, test, test_file};
 
 #[test]
-fn aead_aes_gcm_128() { test_aead(&aead::AES_128_GCM, "tests/aead_aes_128_gcm_tests.txt"); }
+fn aead_aes_gcm_128() { test_aead(&aead::AES_128_GCM, test_file!("aead_aes_128_gcm_tests.txt")); }
 
 #[test]
-fn aead_aes_gcm_256() { test_aead(&aead::AES_256_GCM, "tests/aead_aes_256_gcm_tests.txt"); }
+fn aead_aes_gcm_256() { test_aead(&aead::AES_256_GCM, test_file!("aead_aes_256_gcm_tests.txt")); }
 
 #[test]
 fn aead_chacha20_poly1305() {
     test_aead(
         &aead::CHACHA20_POLY1305,
-        "tests/aead_chacha20_poly1305_tests.txt",
+        test_file!("aead_chacha20_poly1305_tests.txt"),
     );
 }
 
-fn test_aead(aead_alg: &'static aead::Algorithm, file_path: &str) {
+fn test_aead(aead_alg: &'static aead::Algorithm, test_file: test::File) {
     test_aead_key_sizes(aead_alg);
 
-    test::from_file(file_path, |section, test_case| {
+    test::run(test_file, |section, test_case| {
         assert_eq!(section, "");
         let key_bytes = test_case.consume_bytes("KEY");
         let nonce = test_case.consume_bytes("NONCE");
@@ -258,8 +258,8 @@
 fn aead_chacha20_poly1305_openssh() {
     // TODO: test_aead_key_sizes(...);
 
-    test::from_file(
-        "tests/aead_chacha20_poly1305_openssh_tests.txt",
+    test::run(
+        test_file!("aead_chacha20_poly1305_openssh_tests.txt"),
         |section, test_case| {
             assert_eq!(section, "");
 
@@ -300,3 +300,20 @@
         },
     );
 }
+
+#[test]
+fn test_aead_key_debug() {
+    let key_bytes = [0; 32];
+
+    let key = aead::OpeningKey::new(&aead::AES_256_GCM, &key_bytes).unwrap();
+    assert_eq!(
+        "OpeningKey { key: Key { algorithm: AES_256_GCM } }",
+        format!("{:?}", key)
+    );
+
+    let key = aead::SealingKey::new(&aead::CHACHA20_POLY1305, &key_bytes).unwrap();
+    assert_eq!(
+        "SealingKey { key: Key { algorithm: CHACHA20_POLY1305 } }",
+        format!("{:?}", key)
+    );
+}
diff --git a/rustc_deps/vendor/ring/tests/agreement_tests.rs b/rustc_deps/vendor/ring/tests/agreement_tests.rs
index 3e1b5b7..9a42dd3 100644
--- a/rustc_deps/vendor/ring/tests/agreement_tests.rs
+++ b/rustc_deps/vendor/ring/tests/agreement_tests.rs
@@ -31,13 +31,13 @@
     warnings
 )]
 
-use ring::{agreement, error, rand, test};
+use ring::{agreement, error, rand, test, test_file};
 
 #[test]
 fn agreement_agree_ephemeral() {
     let rng = rand::SystemRandom::new();
 
-    test::from_file("tests/agreement_tests.txt", |section, test_case| {
+    test::run(test_file!("agreement_tests.txt"), |section, test_case| {
         assert_eq!(section, "");
 
         let curve_name = test_case.consume_string("Curve");
diff --git a/rustc_deps/vendor/ring/tests/digest_tests.rs b/rustc_deps/vendor/ring/tests/digest_tests.rs
index 4f3dfdd..5a27d0f 100644
--- a/rustc_deps/vendor/ring/tests/digest_tests.rs
+++ b/rustc_deps/vendor/ring/tests/digest_tests.rs
@@ -31,12 +31,12 @@
     warnings
 )]
 
-use ring::{digest, test};
+use ring::{digest, test, test_file};
 
 /// Test vectors from BoringSSL, Go, and other sources.
 #[test]
 fn digest_misc() {
-    test::from_file("tests/digest_tests.txt", |section, test_case| {
+    test::run(test_file!("digest_tests.txt"), |section, test_case| {
         assert_eq!(section, "");
         let digest_alg = test_case.consume_digest_alg("Hash").unwrap();
         let input = test_case.consume_bytes("Input");
@@ -62,52 +62,9 @@
 mod digest_shavs {
     use ring::{digest, test};
 
-    macro_rules! shavs_tests {
-        ( $algorithm_name:ident ) => {
-            #[allow(non_snake_case)]
-            mod $algorithm_name {
-                use super::{run_known_answer_test, run_monte_carlo_test};
-                use ring::digest;
-
-                #[test]
-                fn short_msg_known_answer_test() {
-                    run_known_answer_test(
-                        &digest::$algorithm_name,
-                        &format!(
-                            "third_party/NIST/SHAVS/{}ShortMsg.rsp",
-                            stringify!($algorithm_name)
-                        ),
-                    );
-                }
-
-                #[test]
-                fn long_msg_known_answer_test() {
-                    run_known_answer_test(
-                        &digest::$algorithm_name,
-                        &format!(
-                            "third_party/NIST/SHAVS/{}LongMsg.rsp",
-                            stringify!($algorithm_name)
-                        ),
-                    );
-                }
-
-                #[test]
-                fn monte_carlo_test() {
-                    run_monte_carlo_test(
-                        &digest::$algorithm_name,
-                        &format!(
-                            "third_party/NIST/SHAVS/{}Monte.rsp",
-                            stringify!($algorithm_name)
-                        ),
-                    );
-                }
-            }
-        };
-    }
-
-    fn run_known_answer_test(digest_alg: &'static digest::Algorithm, file_name: &str) {
+    fn run_known_answer_test(digest_alg: &'static digest::Algorithm, test_file: test::File) {
         let section_name = &format!("L = {}", digest_alg.output_len);
-        test::from_file(file_name, |section, test_case| {
+        test::run(test_file, |section, test_case| {
             assert_eq!(section_name, section);
             let len_bits = test_case.consume_usize("Len");
 
@@ -128,13 +85,59 @@
         });
     }
 
-    fn run_monte_carlo_test(digest_alg: &'static digest::Algorithm, file_name: &str) {
+    macro_rules! shavs_tests {
+        ( $algorithm_name:ident ) => {
+            #[allow(non_snake_case)]
+            mod $algorithm_name {
+                use super::{run_known_answer_test, run_monte_carlo_test};
+                use ring::{digest, test_file};
+
+                #[test]
+                fn short_msg_known_answer_test() {
+                    run_known_answer_test(
+                        &digest::$algorithm_name,
+                        test_file!(concat!(
+                            "../third_party/NIST/SHAVS/",
+                            stringify!($algorithm_name),
+                            "ShortMsg.rsp"
+                        )),
+                    );
+                }
+
+                #[test]
+                fn long_msg_known_answer_test() {
+                    run_known_answer_test(
+                        &digest::$algorithm_name,
+                        test_file!(concat!(
+                            "../third_party/NIST/SHAVS/",
+                            stringify!($algorithm_name),
+                            "LongMsg.rsp"
+                        )),
+                    );
+                }
+
+                #[test]
+                fn monte_carlo_test() {
+                    run_monte_carlo_test(
+                        &digest::$algorithm_name,
+                        test_file!(concat!(
+                            "../third_party/NIST/SHAVS/",
+                            stringify!($algorithm_name),
+                            "Monte.rsp"
+                        )),
+                    );
+                }
+            }
+        };
+    }
+
+    fn run_monte_carlo_test(digest_alg: &'static digest::Algorithm, test_file: test::File) {
         let section_name = &format!("L = {}", digest_alg.output_len);
 
         let mut expected_count: isize = -1;
         let mut seed = Vec::with_capacity(digest_alg.output_len);
 
-        test::from_file(file_name, |section, test_case| {
+        test::run(test_file, |section, test_case| {
             assert_eq!(section_name, section);
 
             if expected_count == -1 {
diff --git a/rustc_deps/vendor/ring/tests/ecdsa_tests.rs b/rustc_deps/vendor/ring/tests/ecdsa_tests.rs
index 3914e85..8bcaf99 100644
--- a/rustc_deps/vendor/ring/tests/ecdsa_tests.rs
+++ b/rustc_deps/vendor/ring/tests/ecdsa_tests.rs
@@ -34,7 +34,7 @@
 use ring::{
     rand,
     signature::{self, KeyPair},
-    test,
+    test, test_file,
 };
 
 // ECDSA *signing* tests are in src/ec/ecdsa/signing.rs.
@@ -42,66 +42,69 @@
 #[cfg(feature = "use_heap")]
 #[test]
 fn ecdsa_from_pkcs8_test() {
-    test::from_file("tests/ecdsa_from_pkcs8_tests.txt", |section, test_case| {
-        use std::error::Error;
+    test::run(
+        test_file!("ecdsa_from_pkcs8_tests.txt"),
+        |section, test_case| {
+            use std::error::Error;
 
-        assert_eq!(section, "");
+            assert_eq!(section, "");
 
-        let curve_name = test_case.consume_string("Curve");
-        let ((this_fixed, this_asn1), (other_fixed, other_asn1)) = match curve_name.as_str() {
-            "P-256" => (
-                (
-                    &signature::ECDSA_P256_SHA256_FIXED_SIGNING,
-                    &signature::ECDSA_P256_SHA256_ASN1_SIGNING,
+            let curve_name = test_case.consume_string("Curve");
+            let ((this_fixed, this_asn1), (other_fixed, other_asn1)) = match curve_name.as_str() {
+                "P-256" => (
+                    (
+                        &signature::ECDSA_P256_SHA256_FIXED_SIGNING,
+                        &signature::ECDSA_P256_SHA256_ASN1_SIGNING,
+                    ),
+                    (
+                        &signature::ECDSA_P384_SHA384_FIXED_SIGNING,
+                        &signature::ECDSA_P384_SHA384_ASN1_SIGNING,
+                    ),
                 ),
-                (
-                    &signature::ECDSA_P384_SHA384_FIXED_SIGNING,
-                    &signature::ECDSA_P384_SHA384_ASN1_SIGNING,
+                "P-384" => (
+                    (
+                        &signature::ECDSA_P384_SHA384_FIXED_SIGNING,
+                        &signature::ECDSA_P384_SHA384_ASN1_SIGNING,
+                    ),
+                    (
+                        &signature::ECDSA_P256_SHA256_FIXED_SIGNING,
+                        &signature::ECDSA_P256_SHA256_ASN1_SIGNING,
+                    ),
                 ),
-            ),
-            "P-384" => (
-                (
-                    &signature::ECDSA_P384_SHA384_FIXED_SIGNING,
-                    &signature::ECDSA_P384_SHA384_ASN1_SIGNING,
-                ),
-                (
-                    &signature::ECDSA_P256_SHA256_FIXED_SIGNING,
-                    &signature::ECDSA_P256_SHA256_ASN1_SIGNING,
-                ),
-            ),
-            _ => unreachable!(),
-        };
+                _ => unreachable!(),
+            };
 
-        let input = test_case.consume_bytes("Input");
-        let input = untrusted::Input::from(&input);
+            let input = test_case.consume_bytes("Input");
+            let input = untrusted::Input::from(&input);
 
-        let error = test_case.consume_optional_string("Error");
+            let error = test_case.consume_optional_string("Error");
 
-        match (
-            signature::EcdsaKeyPair::from_pkcs8(this_fixed, input),
-            error.clone(),
-        ) {
-            (Ok(_), None) => (),
-            (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e),
-            (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e),
-            (Err(actual), Some(expected)) => assert_eq!(actual.description(), expected),
-        };
+            match (
+                signature::EcdsaKeyPair::from_pkcs8(this_fixed, input),
+                error.clone(),
+            ) {
+                (Ok(_), None) => (),
+                (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e),
+                (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e),
+                (Err(actual), Some(expected)) => assert_eq!(actual.description(), expected),
+            };
 
-        match (
-            signature::EcdsaKeyPair::from_pkcs8(this_asn1, input),
-            error.clone(),
-        ) {
-            (Ok(_), None) => (),
-            (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e),
-            (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e),
-            (Err(actual), Some(expected)) => assert_eq!(actual.description(), expected),
-        };
+            match (
+                signature::EcdsaKeyPair::from_pkcs8(this_asn1, input),
+                error.clone(),
+            ) {
+                (Ok(_), None) => (),
+                (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e),
+                (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e),
+                (Err(actual), Some(expected)) => assert_eq!(actual.description(), expected),
+            };
 
-        assert!(signature::EcdsaKeyPair::from_pkcs8(other_fixed, input).is_err());
-        assert!(signature::EcdsaKeyPair::from_pkcs8(other_asn1, input).is_err());
+            assert!(signature::EcdsaKeyPair::from_pkcs8(other_fixed, input).is_err());
+            assert!(signature::EcdsaKeyPair::from_pkcs8(other_asn1, input).is_err());
 
-        Ok(())
-    });
+            Ok(())
+        },
+    );
 }
 
 // Verify that, at least, we generate PKCS#8 documents that we can read.
@@ -131,44 +134,47 @@
 
 #[test]
 fn signature_ecdsa_verify_asn1_test() {
-    test::from_file("tests/ecdsa_verify_asn1_tests.txt", |section, test_case| {
-        assert_eq!(section, "");
+    test::run(
+        test_file!("ecdsa_verify_asn1_tests.txt"),
+        |section, test_case| {
+            assert_eq!(section, "");
 
-        let curve_name = test_case.consume_string("Curve");
-        let digest_name = test_case.consume_string("Digest");
+            let curve_name = test_case.consume_string("Curve");
+            let digest_name = test_case.consume_string("Digest");
 
-        let msg = test_case.consume_bytes("Msg");
-        let msg = untrusted::Input::from(&msg);
+            let msg = test_case.consume_bytes("Msg");
+            let msg = untrusted::Input::from(&msg);
 
-        let public_key = test_case.consume_bytes("Q");
-        let public_key = untrusted::Input::from(&public_key);
+            let public_key = test_case.consume_bytes("Q");
+            let public_key = untrusted::Input::from(&public_key);
 
-        let sig = test_case.consume_bytes("Sig");
-        let sig = untrusted::Input::from(&sig);
+            let sig = test_case.consume_bytes("Sig");
+            let sig = untrusted::Input::from(&sig);
 
-        let expected_result = test_case.consume_string("Result");
+            let expected_result = test_case.consume_string("Result");
 
-        let alg = match (curve_name.as_str(), digest_name.as_str()) {
-            ("P-256", "SHA256") => &signature::ECDSA_P256_SHA256_ASN1,
-            ("P-256", "SHA384") => &signature::ECDSA_P256_SHA384_ASN1,
-            ("P-384", "SHA256") => &signature::ECDSA_P384_SHA256_ASN1,
-            ("P-384", "SHA384") => &signature::ECDSA_P384_SHA384_ASN1,
-            _ => {
-                panic!("Unsupported curve+digest: {}+{}", curve_name, digest_name);
-            },
-        };
+            let alg = match (curve_name.as_str(), digest_name.as_str()) {
+                ("P-256", "SHA256") => &signature::ECDSA_P256_SHA256_ASN1,
+                ("P-256", "SHA384") => &signature::ECDSA_P256_SHA384_ASN1,
+                ("P-384", "SHA256") => &signature::ECDSA_P384_SHA256_ASN1,
+                ("P-384", "SHA384") => &signature::ECDSA_P384_SHA384_ASN1,
+                _ => {
+                    panic!("Unsupported curve+digest: {}+{}", curve_name, digest_name);
+                },
+            };
 
-        let actual_result = signature::verify(alg, public_key, msg, sig);
-        assert_eq!(actual_result.is_ok(), expected_result == "P (0 )");
+            let actual_result = signature::verify(alg, public_key, msg, sig);
+            assert_eq!(actual_result.is_ok(), expected_result == "P (0 )");
 
-        Ok(())
-    });
+            Ok(())
+        },
+    );
 }
 
 #[test]
 fn signature_ecdsa_verify_fixed_test() {
-    test::from_file(
-        "tests/ecdsa_verify_fixed_tests.txt",
+    test::run(
+        test_file!("ecdsa_verify_fixed_tests.txt"),
         |section, test_case| {
             assert_eq!(section, "");
 
diff --git a/rustc_deps/vendor/ring/tests/ed25519_tests.rs b/rustc_deps/vendor/ring/tests/ed25519_tests.rs
index fa1f65e..209bb56 100644
--- a/rustc_deps/vendor/ring/tests/ed25519_tests.rs
+++ b/rustc_deps/vendor/ring/tests/ed25519_tests.rs
@@ -33,13 +33,13 @@
 
 use ring::{
     signature::{self, Ed25519KeyPair, KeyPair},
-    test,
+    test, test_file,
 };
 
 /// Test vectors from BoringSSL.
 #[test]
 fn test_signature_ed25519() {
-    test::from_file("tests/ed25519_tests.txt", |section, test_case| {
+    test::run(test_file!("ed25519_tests.txt"), |section, test_case| {
         assert_eq!(section, "");
         let seed = test_case.consume_bytes("SEED");
         assert_eq!(32, seed.len());
@@ -119,8 +119,8 @@
 #[test]
 fn test_ed25519_from_pkcs8_unchecked() {
     // Just test that we can parse the input.
-    test::from_file(
-        "tests/ed25519_from_pkcs8_unchecked_tests.txt",
+    test::run(
+        test_file!("ed25519_from_pkcs8_unchecked_tests.txt"),
         |section, test_case| {
             assert_eq!(section, "");
             let input = test_case.consume_bytes("Input");
@@ -144,8 +144,8 @@
 #[test]
 fn test_ed25519_from_pkcs8() {
     // Just test that we can parse the input.
-    test::from_file(
-        "tests/ed25519_from_pkcs8_tests.txt",
+    test::run(
+        test_file!("ed25519_from_pkcs8_tests.txt"),
         |section, test_case| {
             assert_eq!(section, "");
             let input = test_case.consume_bytes("Input");
diff --git a/rustc_deps/vendor/ring/tests/hkdf_tests.rs b/rustc_deps/vendor/ring/tests/hkdf_tests.rs
index daa71c2..0b78f96 100644
--- a/rustc_deps/vendor/ring/tests/hkdf_tests.rs
+++ b/rustc_deps/vendor/ring/tests/hkdf_tests.rs
@@ -31,11 +31,11 @@
     warnings
 )]
 
-use ring::{error, hkdf, hmac, test};
+use ring::{error, hkdf, hmac, test, test_file};
 
 #[test]
 fn hkdf_tests() {
-    test::from_file("tests/hkdf_tests.txt", |section, test_case| {
+    test::run(test_file!("hkdf_tests.txt"), |section, test_case| {
         assert_eq!(section, "");
         let digest_alg = test_case
             .consume_digest_alg("Hash")
@@ -43,11 +43,7 @@
         let secret = test_case.consume_bytes("IKM");
         let salt = test_case.consume_bytes("salt");
         let info = test_case.consume_bytes("info");
-
-        // The PRK is an intermediate value that we can't test, but we
-        // have to consume it to make test_util::from_file happy.
         let _ = test_case.consume_bytes("PRK");
-
         let expected_out = test_case.consume_bytes("OKM");
 
         let salt = hmac::SigningKey::new(digest_alg, &salt);
diff --git a/rustc_deps/vendor/ring/tests/hmac_tests.rs b/rustc_deps/vendor/ring/tests/hmac_tests.rs
index 0cd845c..abdbf03 100644
--- a/rustc_deps/vendor/ring/tests/hmac_tests.rs
+++ b/rustc_deps/vendor/ring/tests/hmac_tests.rs
@@ -31,11 +31,11 @@
     warnings
 )]
 
-use ring::{digest, error, hmac, test};
+use ring::{digest, error, hmac, test, test_file};
 
 #[test]
 fn hmac_tests() {
-    test::from_file("tests/hmac_tests.txt", |section, test_case| {
+    test::run(test_file!("hmac_tests.txt"), |section, test_case| {
         assert_eq!(section, "");
         let digest_alg = test_case.consume_digest_alg("HMAC");
         let key_value = test_case.consume_bytes("Key");
diff --git a/rustc_deps/vendor/ring/tests/pbkdf2_tests.rs b/rustc_deps/vendor/ring/tests/pbkdf2_tests.rs
index 4df828b..70cb3f7 100644
--- a/rustc_deps/vendor/ring/tests/pbkdf2_tests.rs
+++ b/rustc_deps/vendor/ring/tests/pbkdf2_tests.rs
@@ -31,12 +31,12 @@
     warnings
 )]
 
-use ring::{digest, error, pbkdf2, test};
+use ring::{digest, error, pbkdf2, test, test_file};
 use std::num::NonZeroU32;
 
 #[test]
 pub fn pbkdf2_tests() {
-    test::from_file("tests/pbkdf2_tests.txt", |section, test_case| {
+    test::run(test_file!("pbkdf2_tests.txt"), |section, test_case| {
         assert_eq!(section, "");
         let digest_alg = &test_case.consume_digest_alg("Hash").unwrap();
         let iterations = test_case.consume_usize("c");
diff --git a/rustc_deps/vendor/ring/tests/quic_tests.rs b/rustc_deps/vendor/ring/tests/quic_tests.rs
index c3c6dac..dcdf549 100644
--- a/rustc_deps/vendor/ring/tests/quic_tests.rs
+++ b/rustc_deps/vendor/ring/tests/quic_tests.rs
@@ -31,21 +31,21 @@
     warnings
 )]
 
-use ring::{aead::quic, test};
+use ring::{aead::quic, test, test_file};
 
 #[test]
-fn quic_aes_128() { test_quic(&quic::AES_128, "tests/quic_aes_128_tests.txt"); }
+fn quic_aes_128() { test_quic(&quic::AES_128, test_file!("quic_aes_128_tests.txt")); }
 
 #[test]
-fn quic_aes_256() { test_quic(&quic::AES_256, "tests/quic_aes_256_tests.txt"); }
+fn quic_aes_256() { test_quic(&quic::AES_256, test_file!("quic_aes_256_tests.txt")); }
 
 #[test]
-fn quic_chacha20() { test_quic(&quic::CHACHA20, "tests/quic_chacha20_tests.txt"); }
+fn quic_chacha20() { test_quic(&quic::CHACHA20, test_file!("quic_chacha20_tests.txt")); }
 
-fn test_quic(alg: &'static quic::Algorithm, file_path: &str) {
+fn test_quic(alg: &'static quic::Algorithm, test_file: test::File) {
     test_sample_len(alg);
 
-    test::from_file(file_path, |section, test_case| {
+    test::run(test_file, |section, test_case| {
         assert_eq!(section, "");
         let key_bytes = test_case.consume_bytes("KEY");
         let sample = test_case.consume_bytes("SAMPLE");
diff --git a/rustc_deps/vendor/ring/tests/rsa_tests.rs b/rustc_deps/vendor/ring/tests/rsa_tests.rs
index 50c1bc1..daf2984 100644
--- a/rustc_deps/vendor/ring/tests/rsa_tests.rs
+++ b/rustc_deps/vendor/ring/tests/rsa_tests.rs
@@ -37,203 +37,218 @@
     io::der,
     rand,
     signature::{self, KeyPair},
-    test,
+    test, test_file,
 };
 
 #[cfg(feature = "use_heap")]
 #[test]
 fn rsa_from_pkcs8_test() {
-    test::from_file("tests/rsa_from_pkcs8_tests.txt", |section, test_case| {
-        use std::error::Error;
+    test::run(
+        test_file!("rsa_from_pkcs8_tests.txt"),
+        |section, test_case| {
+            use std::error::Error;
 
-        assert_eq!(section, "");
+            assert_eq!(section, "");
 
-        let input = test_case.consume_bytes("Input");
-        let input = untrusted::Input::from(&input);
+            let input = test_case.consume_bytes("Input");
+            let input = untrusted::Input::from(&input);
 
-        let error = test_case.consume_optional_string("Error");
+            let error = test_case.consume_optional_string("Error");
 
-        match (signature::RsaKeyPair::from_pkcs8(input), error) {
-            (Ok(_), None) => (),
-            (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e),
-            (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e),
-            (Err(actual), Some(expected)) => assert_eq!(actual.description(), expected),
-        };
+            match (signature::RsaKeyPair::from_pkcs8(input), error) {
+                (Ok(_), None) => (),
+                (Err(e), None) => panic!("Failed with error \"{}\", but expected to succeed", e),
+                (Ok(_), Some(e)) => panic!("Succeeded, but expected error \"{}\"", e),
+                (Err(actual), Some(expected)) => assert_eq!(actual.description(), expected),
+            };
 
-        Ok(())
-    });
+            Ok(())
+        },
+    );
 }
 
 #[cfg(feature = "use_heap")]
 #[test]
 fn test_signature_rsa_pkcs1_sign() {
     let rng = rand::SystemRandom::new();
-    test::from_file("tests/rsa_pkcs1_sign_tests.txt", |section, test_case| {
-        assert_eq!(section, "");
+    test::run(
+        test_file!("rsa_pkcs1_sign_tests.txt"),
+        |section, test_case| {
+            assert_eq!(section, "");
 
-        let digest_name = test_case.consume_string("Digest");
-        let alg = match digest_name.as_ref() {
-            "SHA256" => &signature::RSA_PKCS1_SHA256,
-            "SHA384" => &signature::RSA_PKCS1_SHA384,
-            "SHA512" => &signature::RSA_PKCS1_SHA512,
-            _ => panic!("Unsupported digest: {}", digest_name),
-        };
+            let digest_name = test_case.consume_string("Digest");
+            let alg = match digest_name.as_ref() {
+                "SHA256" => &signature::RSA_PKCS1_SHA256,
+                "SHA384" => &signature::RSA_PKCS1_SHA384,
+                "SHA512" => &signature::RSA_PKCS1_SHA512,
+                _ => panic!("Unsupported digest: {}", digest_name),
+            };
 
-        let private_key = test_case.consume_bytes("Key");
-        let msg = test_case.consume_bytes("Msg");
-        let expected = test_case.consume_bytes("Sig");
-        let result = test_case.consume_string("Result");
+            let private_key = test_case.consume_bytes("Key");
+            let msg = test_case.consume_bytes("Msg");
+            let expected = test_case.consume_bytes("Sig");
+            let result = test_case.consume_string("Result");
 
-        let private_key = untrusted::Input::from(&private_key);
-        let key_pair = signature::RsaKeyPair::from_der(private_key);
-        if result == "Fail-Invalid-Key" {
-            assert!(key_pair.is_err());
-            return Ok(());
-        }
-        let key_pair = key_pair.unwrap();
-        let key_pair = std::sync::Arc::new(key_pair);
+            let private_key = untrusted::Input::from(&private_key);
+            let key_pair = signature::RsaKeyPair::from_der(private_key);
+            if result == "Fail-Invalid-Key" {
+                assert!(key_pair.is_err());
+                return Ok(());
+            }
+            let key_pair = key_pair.unwrap();
+            let key_pair = std::sync::Arc::new(key_pair);
 
-        // XXX: This test is too slow on Android ARM Travis CI builds.
-        // TODO: re-enable these tests on Android ARM.
-        let mut actual = vec![0u8; key_pair.public_modulus_len()];
-        key_pair
-            .sign(alg, &rng, &msg, actual.as_mut_slice())
-            .unwrap();
-        assert_eq!(actual.as_slice() == &expected[..], result == "Pass");
-        Ok(())
-    });
+            // XXX: This test is too slow on Android ARM Travis CI builds.
+            // TODO: re-enable these tests on Android ARM.
+            let mut actual = vec![0u8; key_pair.public_modulus_len()];
+            key_pair
+                .sign(alg, &rng, &msg, actual.as_mut_slice())
+                .unwrap();
+            assert_eq!(actual.as_slice() == &expected[..], result == "Pass");
+            Ok(())
+        },
+    );
 }
 
 #[cfg(feature = "use_heap")]
 #[test]
 fn test_signature_rsa_pss_sign() {
-    test::from_file("tests/rsa_pss_sign_tests.txt", |section, test_case| {
-        assert_eq!(section, "");
+    test::run(
+        test_file!("rsa_pss_sign_tests.txt"),
+        |section, test_case| {
+            assert_eq!(section, "");
 
-        let digest_name = test_case.consume_string("Digest");
-        let alg = match digest_name.as_ref() {
-            "SHA256" => &signature::RSA_PSS_SHA256,
-            "SHA384" => &signature::RSA_PSS_SHA384,
-            "SHA512" => &signature::RSA_PSS_SHA512,
-            _ => panic!("Unsupported digest: {}", digest_name),
-        };
+            let digest_name = test_case.consume_string("Digest");
+            let alg = match digest_name.as_ref() {
+                "SHA256" => &signature::RSA_PSS_SHA256,
+                "SHA384" => &signature::RSA_PSS_SHA384,
+                "SHA512" => &signature::RSA_PSS_SHA512,
+                _ => panic!("Unsupported digest: {}", digest_name),
+            };
 
-        let result = test_case.consume_string("Result");
-        let private_key = test_case.consume_bytes("Key");
-        let private_key = untrusted::Input::from(&private_key);
-        let key_pair = signature::RsaKeyPair::from_der(private_key);
-        if key_pair.is_err() && result == "Fail-Invalid-Key" {
-            return Ok(());
-        }
-        let key_pair = key_pair.unwrap();
-        let msg = test_case.consume_bytes("Msg");
-        let salt = test_case.consume_bytes("Salt");
-        let expected = test_case.consume_bytes("Sig");
+            let result = test_case.consume_string("Result");
+            let private_key = test_case.consume_bytes("Key");
+            let private_key = untrusted::Input::from(&private_key);
+            let key_pair = signature::RsaKeyPair::from_der(private_key);
+            if key_pair.is_err() && result == "Fail-Invalid-Key" {
+                return Ok(());
+            }
+            let key_pair = key_pair.unwrap();
+            let msg = test_case.consume_bytes("Msg");
+            let salt = test_case.consume_bytes("Salt");
+            let expected = test_case.consume_bytes("Sig");
 
-        let rng = test::rand::FixedSliceRandom { bytes: &salt };
+            let rng = test::rand::FixedSliceRandom { bytes: &salt };
 
-        let mut actual = vec![0u8; key_pair.public_modulus_len()];
-        key_pair.sign(alg, &rng, &msg, actual.as_mut_slice())?;
-        assert_eq!(actual.as_slice() == &expected[..], result == "Pass");
-        Ok(())
-    });
+            let mut actual = vec![0u8; key_pair.public_modulus_len()];
+            key_pair.sign(alg, &rng, &msg, actual.as_mut_slice())?;
+            assert_eq!(actual.as_slice() == &expected[..], result == "Pass");
+            Ok(())
+        },
+    );
 }
 
 #[cfg(feature = "use_heap")]
 #[test]
 fn test_signature_rsa_pkcs1_verify() {
-    test::from_file("tests/rsa_pkcs1_verify_tests.txt", |section, test_case| {
-        assert_eq!(section, "");
+    test::run(
+        test_file!("rsa_pkcs1_verify_tests.txt"),
+        |section, test_case| {
+            assert_eq!(section, "");
 
-        let digest_name = test_case.consume_string("Digest");
-        let alg = match digest_name.as_ref() {
-            "SHA1" => &signature::RSA_PKCS1_2048_8192_SHA1,
-            "SHA256" => &signature::RSA_PKCS1_2048_8192_SHA256,
-            "SHA384" => &signature::RSA_PKCS1_2048_8192_SHA384,
-            "SHA512" => &signature::RSA_PKCS1_2048_8192_SHA512,
-            _ => panic!("Unsupported digest: {}", digest_name),
-        };
+            let digest_name = test_case.consume_string("Digest");
+            let alg = match digest_name.as_ref() {
+                "SHA1" => &signature::RSA_PKCS1_2048_8192_SHA1,
+                "SHA256" => &signature::RSA_PKCS1_2048_8192_SHA256,
+                "SHA384" => &signature::RSA_PKCS1_2048_8192_SHA384,
+                "SHA512" => &signature::RSA_PKCS1_2048_8192_SHA512,
+                _ => panic!("Unsupported digest: {}", digest_name),
+            };
 
-        let public_key = test_case.consume_bytes("Key");
-        let public_key = untrusted::Input::from(&public_key);
+            let public_key = test_case.consume_bytes("Key");
+            let public_key = untrusted::Input::from(&public_key);
 
-        // Sanity check that we correctly DER-encoded the originally-
-        // provided separate (n, e) components. When we add test vectors
-        // for improperly-encoded signatures, we'll have to revisit this.
-        assert!(public_key
-            .read_all(error::Unspecified, |input| der::nested(
-                input,
-                der::Tag::Sequence,
-                error::Unspecified,
-                |input| {
-                    let _ = der::positive_integer(input)?;
-                    let _ = der::positive_integer(input)?;
-                    Ok(())
-                }
-            ))
-            .is_ok());
+            // Sanity check that we correctly DER-encoded the originally-
+            // provided separate (n, e) components. When we add test vectors
+            // for improperly-encoded signatures, we'll have to revisit this.
+            assert!(public_key
+                .read_all(error::Unspecified, |input| der::nested(
+                    input,
+                    der::Tag::Sequence,
+                    error::Unspecified,
+                    |input| {
+                        let _ = der::positive_integer(input)?;
+                        let _ = der::positive_integer(input)?;
+                        Ok(())
+                    }
+                ))
+                .is_ok());
 
-        let msg = test_case.consume_bytes("Msg");
-        let msg = untrusted::Input::from(&msg);
+            let msg = test_case.consume_bytes("Msg");
+            let msg = untrusted::Input::from(&msg);
 
-        let sig = test_case.consume_bytes("Sig");
-        let sig = untrusted::Input::from(&sig);
+            let sig = test_case.consume_bytes("Sig");
+            let sig = untrusted::Input::from(&sig);
 
-        let expected_result = test_case.consume_string("Result");
+            let expected_result = test_case.consume_string("Result");
 
-        let actual_result = signature::verify(alg, public_key, msg, sig);
-        assert_eq!(actual_result.is_ok(), expected_result == "P");
+            let actual_result = signature::verify(alg, public_key, msg, sig);
+            assert_eq!(actual_result.is_ok(), expected_result == "P");
 
-        Ok(())
-    });
+            Ok(())
+        },
+    );
 }
 
 #[cfg(feature = "use_heap")]
 #[test]
 fn test_signature_rsa_pss_verify() {
-    test::from_file("tests/rsa_pss_verify_tests.txt", |section, test_case| {
-        assert_eq!(section, "");
+    test::run(
+        test_file!("rsa_pss_verify_tests.txt"),
+        |section, test_case| {
+            assert_eq!(section, "");
 
-        let digest_name = test_case.consume_string("Digest");
-        let alg = match digest_name.as_ref() {
-            "SHA256" => &signature::RSA_PSS_2048_8192_SHA256,
-            "SHA384" => &signature::RSA_PSS_2048_8192_SHA384,
-            "SHA512" => &signature::RSA_PSS_2048_8192_SHA512,
-            _ => panic!("Unsupported digest: {}", digest_name),
-        };
+            let digest_name = test_case.consume_string("Digest");
+            let alg = match digest_name.as_ref() {
+                "SHA256" => &signature::RSA_PSS_2048_8192_SHA256,
+                "SHA384" => &signature::RSA_PSS_2048_8192_SHA384,
+                "SHA512" => &signature::RSA_PSS_2048_8192_SHA512,
+                _ => panic!("Unsupported digest: {}", digest_name),
+            };
 
-        let public_key = test_case.consume_bytes("Key");
-        let public_key = untrusted::Input::from(&public_key);
+            let public_key = test_case.consume_bytes("Key");
+            let public_key = untrusted::Input::from(&public_key);
 
-        // Sanity check that we correctly DER-encoded the originally-
-        // provided separate (n, e) components. When we add test vectors
-        // for improperly-encoded signatures, we'll have to revisit this.
-        assert!(public_key
-            .read_all(error::Unspecified, |input| der::nested(
-                input,
-                der::Tag::Sequence,
-                error::Unspecified,
-                |input| {
-                    let _ = der::positive_integer(input)?;
-                    let _ = der::positive_integer(input)?;
-                    Ok(())
-                }
-            ))
-            .is_ok());
+            // Sanity check that we correctly DER-encoded the originally-
+            // provided separate (n, e) components. When we add test vectors
+            // for improperly-encoded signatures, we'll have to revisit this.
+            assert!(public_key
+                .read_all(error::Unspecified, |input| der::nested(
+                    input,
+                    der::Tag::Sequence,
+                    error::Unspecified,
+                    |input| {
+                        let _ = der::positive_integer(input)?;
+                        let _ = der::positive_integer(input)?;
+                        Ok(())
+                    }
+                ))
+                .is_ok());
 
-        let msg = test_case.consume_bytes("Msg");
-        let msg = untrusted::Input::from(&msg);
+            let msg = test_case.consume_bytes("Msg");
+            let msg = untrusted::Input::from(&msg);
 
-        let sig = test_case.consume_bytes("Sig");
-        let sig = untrusted::Input::from(&sig);
+            let sig = test_case.consume_bytes("Sig");
+            let sig = untrusted::Input::from(&sig);
 
-        let expected_result = test_case.consume_string("Result");
+            let expected_result = test_case.consume_string("Result");
 
-        let actual_result = signature::verify(alg, public_key, msg, sig);
-        assert_eq!(actual_result.is_ok(), expected_result == "P");
+            let actual_result = signature::verify(alg, public_key, msg, sig);
+            assert_eq!(actual_result.is_ok(), expected_result == "P");
 
-        Ok(())
-    });
+            Ok(())
+        },
+    );
 }
 
 // Test for `primitive::verify()`. Read public key parts from a file
@@ -241,8 +256,8 @@
 #[cfg(feature = "use_heap")]
 #[test]
 fn test_signature_rsa_primitive_verification() {
-    test::from_file(
-        "tests/rsa_primitive_verify_tests.txt",
+    test::run(
+        test_file!("rsa_primitive_verify_tests.txt"),
         |section, test_case| {
             assert_eq!(section, "");
             let n = test_case.consume_bytes("n");
diff --git a/rustc_deps/vendor/ring/third_party/fiat/curve25519.c b/rustc_deps/vendor/ring/third_party/fiat/curve25519.c
index cf5dedc..9a87394 100644
--- a/rustc_deps/vendor/ring/third_party/fiat/curve25519.c
+++ b/rustc_deps/vendor/ring/third_party/fiat/curve25519.c
@@ -2869,9 +2869,9 @@
 }
 
 
-static void x25519_scalar_mult_generic(uint8_t out[32],
-                                       const uint8_t scalar[32],
-                                       const uint8_t point[32]) {
+void GFp_x25519_scalar_mult_generic(uint8_t out[32],
+                                    const uint8_t scalar[32],
+                                    const uint8_t point[32]) {
   fe x1, x2, z2, x3, z3, tmp0, tmp1;
   fe_loose x2l, z2l, x3l, tmp0l, tmp1l;
 
@@ -2948,37 +2948,12 @@
   fe_tobytes(out, &x2);
 }
 
-static void x25519_scalar_mult(uint8_t out[32], const uint8_t scalar[32],
-                               const uint8_t point[32]) {
-#if defined(BORINGSSL_X25519_NEON)
-  if (GFp_is_NEON_capable()) {
-    GFp_x25519_NEON(out, scalar, point);
-    return;
-  }
-#endif
-
-  x25519_scalar_mult_generic(out, scalar, point);
-}
-
-void GFp_x25519_scalar_mult(uint8_t out[32], const uint8_t scalar[32],
-                            const uint8_t point[32]) {
-  x25519_scalar_mult(out, scalar, point);
-}
-
 // Prototypes to avoid -Wmissing-prototypes warnings.
-void GFp_x25519_public_from_private(uint8_t out_public_value[32],
-                                    const uint8_t private_key[32]);
+void GFp_x25519_public_from_private_generic(uint8_t out_public_value[32],
+                                            const uint8_t private_key[32]);
 
-void GFp_x25519_public_from_private(uint8_t out_public_value[32],
-                                    const uint8_t private_key[32]) {
-#if defined(BORINGSSL_X25519_NEON)
-  if (GFp_is_NEON_capable()) {
-    static const uint8_t kMongomeryBasePoint[32] = {9};
-    GFp_x25519_NEON(out_public_value, private_key, kMongomeryBasePoint);
-    return;
-  }
-#endif
-
+void GFp_x25519_public_from_private_generic(uint8_t out_public_value[32],
+                                            const uint8_t private_key[32]) {
   uint8_t e[32];
   memcpy(e, private_key, 32);
   GFp_x25519_sc_mask(e);
diff --git a/rustc_deps/vendor/ring/third_party/fiat/internal.h b/rustc_deps/vendor/ring/third_party/fiat/internal.h
index 8f5f97a..9d69ed7 100644
--- a/rustc_deps/vendor/ring/third_party/fiat/internal.h
+++ b/rustc_deps/vendor/ring/third_party/fiat/internal.h
@@ -131,7 +131,8 @@
                           const uint8_t *c);
 void GFp_x25519_sc_mask(uint8_t a[32]);
 void GFp_x25519_sc_reduce(uint8_t s[64]);
-void GFp_x25519_scalar_mult(uint8_t out[32], const uint8_t scalar[32],
-                            const uint8_t point[32]);
+void GFp_x25519_scalar_mult_generic(uint8_t out[32],
+                                    const uint8_t scalar[32],
+                                    const uint8_t point[32]);
 
 #endif  // OPENSSL_HEADER_CURVE25519_INTERNAL_H
diff --git a/rustc_deps/vendor/spin/.cargo-checksum.json b/rustc_deps/vendor/spin/.cargo-checksum.json
new file mode 100644
index 0000000..bf89fc8
--- /dev/null
+++ b/rustc_deps/vendor/spin/.cargo-checksum.json
@@ -0,0 +1 @@
+{"files":{"Cargo.toml":"ce9c48d63c07b42ad18e2c2d651e54df1fa0b4ae122b9a15ce3c4e07212c65a3","LICENSE":"6ac8711fb340c62ce0a4ecd463342d3fa0e8e70de697c863a2e1c0c53006003c","README.md":"90b21c45b2fd68f8dbf12ec8f61339e8689f031eb806ad90e73f11510e53eb72","examples/debug.rs":"0074651d78f8ed6d6c0274ae832c0d78de6c5c59423936f58e79cb3c98baea2c","script/doc-upload.cfg":"7383ee022197c1dade9a2e6888261def4a80df08ecb72b1b4db47d1e8a6ff8e0","src/lib.rs":"865d4759a7ed4b99b9c68f52ac849e7beb43940a8fb12c853e568d817821949a","src/mutex.rs":"013f143a2981bc381e2b5f0eb3b3871ef395c32fb0fcc2f42b6aba78e6e20d6f","src/once.rs":"1a2bfb79230ba0235f2c519d3d3d63154e06b39dcad598cb040e803c0eb1cf78","src/rw_lock.rs":"0cf340ba5c6778b1f47e01d1dcee2e618050aa602622cf597d4362a4fd38572e"},"package":"44363f6f51401c34e7be73db0db371c04705d35efbe9f7d6082e03a921a32c55"}
\ No newline at end of file
diff --git a/rustc_deps/vendor/spin/Cargo.toml b/rustc_deps/vendor/spin/Cargo.toml
new file mode 100644
index 0000000..0250803
--- /dev/null
+++ b/rustc_deps/vendor/spin/Cargo.toml
@@ -0,0 +1,21 @@
+# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
+#
+# When uploading crates to the registry Cargo will automatically
+# "normalize" Cargo.toml files for maximal compatibility
+# with all versions of Cargo and also rewrite `path` dependencies
+# to registry (e.g. crates.io) dependencies
+#
+# If you believe there's an error in this file please file an
+# issue against the rust-lang/cargo repository. If you're
+# editing this file be aware that the upstream Cargo.toml
+# will likely look very different (and much more reasonable)
+
+[package]
+name = "spin"
+version = "0.5.0"
+authors = ["Mathijs van de Nes <git@mathijs.vd-nes.nl>", "John Ericson <git@JohnEricson.me>"]
+description = "Synchronization primitives based on spinning.\nThey may contain data, are usable without `std`,\nand static initializers are available.\n"
+documentation = "https://mvdnes.github.io/rust-docs/spin-rs/spin/index.html"
+keywords = ["spinlock", "mutex", "rwlock"]
+license = "MIT"
+repository = "https://github.com/mvdnes/spin-rs.git"
diff --git a/rustc_deps/vendor/spin/LICENSE b/rustc_deps/vendor/spin/LICENSE
new file mode 100644
index 0000000..b2d7f7b
--- /dev/null
+++ b/rustc_deps/vendor/spin/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Mathijs van de Nes
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/rustc_deps/vendor/spin/README.md b/rustc_deps/vendor/spin/README.md
new file mode 100644
index 0000000..4c99312
--- /dev/null
+++ b/rustc_deps/vendor/spin/README.md
@@ -0,0 +1,64 @@
+spin-rs
+===========
+
+[![Build Status](https://travis-ci.org/mvdnes/spin-rs.svg)](https://travis-ci.org/mvdnes/spin-rs)
+[![Crates.io version](https://img.shields.io/crates/v/spin.svg)](https://crates.io/crates/spin)
+[![docs.rs](https://docs.rs/spin/badge.svg)](https://docs.rs/spin/)
+
+This Rust library implements a simple
+[spinlock](https://en.wikipedia.org/wiki/Spinlock), and is safe for `#[no_std]` environments.
+
+Usage
+-----
+
+Include the following code in your Cargo.toml
+
+```toml
+[dependencies.spin]
+version = "0.5"
+```
+
+Example
+-------
+
+When calling `lock` on a `Mutex` you will get a reference to the data. When this
+reference is dropped, the lock will be unlocked.
+
+```rust
+extern crate spin;
+
+fn main()
+{
+    let mutex   = spin::Mutex::new(0);
+    let rw_lock = spin::RwLock::new(0);
+
+    // Modify the data
+    {
+      let mut data = mutex.lock();
+      *data = 2;
+      let mut data = rw_lock.write();
+      *data = 3;
+    }
+
+    // Read the data
+    let answer =
+    {
+      let data1 = mutex.lock();
+      let data2 = rw_lock.read();
+      let data3 = rw_lock.read(); // sharing
+      (*data1, *data2, *data3)
+    };
+
+    println!("Answers are {:?}", answer);
+}
+```
+
+To share the lock, an `Arc<Mutex<T>>` may be used.
+
+Remarks
+-------
+
+The behaviour of these lock is similar to their namesakes in `std::sync`. they
+differ on the following:
+
+ - The lock will not be poisoned in case of failure;
diff --git a/rustc_deps/vendor/spin/examples/debug.rs b/rustc_deps/vendor/spin/examples/debug.rs
new file mode 100644
index 0000000..64654f6
--- /dev/null
+++ b/rustc_deps/vendor/spin/examples/debug.rs
@@ -0,0 +1,21 @@
+extern crate spin;
+
+fn main() {
+    let mutex = spin::Mutex::new(42);
+    println!("{:?}", mutex);
+    {
+        let x = mutex.lock();
+        println!("{:?}, {:?}", mutex, *x);
+    }
+
+    let rwlock = spin::RwLock::new(42);
+    println!("{:?}", rwlock);
+    {
+        let x = rwlock.read();
+        println!("{:?}, {:?}", rwlock, *x);
+    }
+    {
+        let x = rwlock.write();
+        println!("{:?}, {:?}", rwlock, *x);
+    }
+}
diff --git a/rustc_deps/vendor/spin/script/doc-upload.cfg b/rustc_deps/vendor/spin/script/doc-upload.cfg
new file mode 100644
index 0000000..c6dfbdc
--- /dev/null
+++ b/rustc_deps/vendor/spin/script/doc-upload.cfg
@@ -0,0 +1,3 @@
+PROJECT_NAME=spin-rs
+DOCS_REPO=mvdnes/rust-docs.git
+DOC_RUST_VERSION=stable
diff --git a/rustc_deps/vendor/spin/src/lib.rs b/rustc_deps/vendor/spin/src/lib.rs
new file mode 100644
index 0000000..6e876bf
--- /dev/null
+++ b/rustc_deps/vendor/spin/src/lib.rs
@@ -0,0 +1,18 @@
+#![crate_type = "lib"]
+#![warn(missing_docs)]
+
+//! Synchronization primitives based on spinning
+
+#![no_std]
+
+#[cfg(test)]
+#[macro_use]
+extern crate std;
+
+pub use mutex::*;
+pub use rw_lock::*;
+pub use once::*;
+
+mod mutex;
+mod rw_lock;
+mod once;
diff --git a/rustc_deps/vendor/spin/src/mutex.rs b/rustc_deps/vendor/spin/src/mutex.rs
new file mode 100644
index 0000000..fa5c48d
--- /dev/null
+++ b/rustc_deps/vendor/spin/src/mutex.rs
@@ -0,0 +1,388 @@
+use core::sync::atomic::{AtomicBool, Ordering, ATOMIC_BOOL_INIT, spin_loop_hint as cpu_relax};
+use core::cell::UnsafeCell;
+use core::marker::Sync;
+use core::ops::{Drop, Deref, DerefMut};
+use core::fmt;
+use core::option::Option::{self, None, Some};
+use core::default::Default;
+
+/// This type provides MUTual EXclusion based on spinning.
+///
+/// # Description
+///
+/// The behaviour of these lock is similar to their namesakes in `std::sync`. they
+/// differ on the following:
+///
+/// - The lock will not be poisoned in case of failure;
+///
+/// # Simple examples
+///
+/// ```
+/// use spin;
+/// let spin_mutex = spin::Mutex::new(0);
+///
+/// // Modify the data
+/// {
+///     let mut data = spin_mutex.lock();
+///     *data = 2;
+/// }
+///
+/// // Read the data
+/// let answer =
+/// {
+///     let data = spin_mutex.lock();
+///     *data
+/// };
+///
+/// assert_eq!(answer, 2);
+/// ```
+///
+/// # Thread-safety example
+///
+/// ```
+/// use spin;
+/// use std::sync::{Arc, Barrier};
+///
+/// let numthreads = 1000;
+/// let spin_mutex = Arc::new(spin::Mutex::new(0));
+///
+/// // We use a barrier to ensure the readout happens after all writing
+/// let barrier = Arc::new(Barrier::new(numthreads + 1));
+///
+/// for _ in (0..numthreads)
+/// {
+///     let my_barrier = barrier.clone();
+///     let my_lock = spin_mutex.clone();
+///     std::thread::spawn(move||
+///     {
+///         let mut guard = my_lock.lock();
+///         *guard += 1;
+///
+///         // Release the lock to prevent a deadlock
+///         drop(guard);
+///         my_barrier.wait();
+///     });
+/// }
+///
+/// barrier.wait();
+///
+/// let answer = { *spin_mutex.lock() };
+/// assert_eq!(answer, numthreads);
+/// ```
+pub struct Mutex<T: ?Sized>
+{
+    lock: AtomicBool,
+    data: UnsafeCell<T>,
+}
+
+/// A guard to which the protected data can be accessed
+///
+/// When the guard falls out of scope it will release the lock.
+#[derive(Debug)]
+pub struct MutexGuard<'a, T: ?Sized + 'a>
+{
+    lock: &'a AtomicBool,
+    data: &'a mut T,
+}
+
+// Same unsafe impls as `std::sync::Mutex`
+unsafe impl<T: ?Sized + Send> Sync for Mutex<T> {}
+unsafe impl<T: ?Sized + Send> Send for Mutex<T> {}
+
+impl<T> Mutex<T>
+{
+    /// Creates a new spinlock wrapping the supplied data.
+    ///
+    /// May be used statically:
+    ///
+    /// ```
+    /// use spin;
+    ///
+    /// static MUTEX: spin::Mutex<()> = spin::Mutex::new(());
+    ///
+    /// fn demo() {
+    ///     let lock = MUTEX.lock();
+    ///     // do something with lock
+    ///     drop(lock);
+    /// }
+    /// ```
+    pub const fn new(user_data: T) -> Mutex<T>
+    {
+        Mutex
+        {
+            lock: ATOMIC_BOOL_INIT,
+            data: UnsafeCell::new(user_data),
+        }
+    }
+
+    /// Consumes this mutex, returning the underlying data.
+    pub fn into_inner(self) -> T {
+        // We know statically that there are no outstanding references to
+        // `self` so there's no need to lock.
+        let Mutex { data, .. } = self;
+        data.into_inner()
+    }
+}
+
+impl<T: ?Sized> Mutex<T>
+{
+    fn obtain_lock(&self)
+    {
+        while self.lock.compare_and_swap(false, true, Ordering::Acquire) != false
+        {
+            // Wait until the lock looks unlocked before retrying
+            while self.lock.load(Ordering::Relaxed)
+            {
+                cpu_relax();
+            }
+        }
+    }
+
+    /// Locks the spinlock and returns a guard.
+    ///
+    /// The returned value may be dereferenced for data access
+    /// and the lock will be dropped when the guard falls out of scope.
+    ///
+    /// ```
+    /// let mylock = spin::Mutex::new(0);
+    /// {
+    ///     let mut data = mylock.lock();
+    ///     // The lock is now locked and the data can be accessed
+    ///     *data += 1;
+    ///     // The lock is implicitly dropped
+    /// }
+    ///
+    /// ```
+    pub fn lock(&self) -> MutexGuard<T>
+    {
+        self.obtain_lock();
+        MutexGuard
+        {
+            lock: &self.lock,
+            data: unsafe { &mut *self.data.get() },
+        }
+    }
+
+    /// Force unlock the spinlock.
+    ///
+    /// This is *extremely* unsafe if the lock is not held by the current
+    /// thread. However, this can be useful in some instances for exposing the
+    /// lock to FFI that doesn't know how to deal with RAII.
+    ///
+    /// If the lock isn't held, this is a no-op.
+    pub unsafe fn force_unlock(&self) {
+        self.lock.store(false, Ordering::Release);
+    }
+
+    /// Tries to lock the mutex. If it is already locked, it will return None. Otherwise it returns
+    /// a guard within Some.
+    pub fn try_lock(&self) -> Option<MutexGuard<T>>
+    {
+        if self.lock.compare_and_swap(false, true, Ordering::Acquire) == false
+        {
+            Some(
+                MutexGuard {
+                    lock: &self.lock,
+                    data: unsafe { &mut *self.data.get() },
+                }
+            )
+        }
+        else
+        {
+            None
+        }
+    }
+}
+
+impl<T: ?Sized + fmt::Debug> fmt::Debug for Mutex<T>
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result
+    {
+        match self.try_lock()
+        {
+            Some(guard) => write!(f, "Mutex {{ data: ")
+				.and_then(|()| (&*guard).fmt(f))
+				.and_then(|()| write!(f, "}}")),
+            None => write!(f, "Mutex {{ <locked> }}"),
+        }
+    }
+}
+
+impl<T: ?Sized + Default> Default for Mutex<T> {
+    fn default() -> Mutex<T> {
+        Mutex::new(Default::default())
+    }
+}
+
+impl<'a, T: ?Sized> Deref for MutexGuard<'a, T>
+{
+    type Target = T;
+    fn deref<'b>(&'b self) -> &'b T { &*self.data }
+}
+
+impl<'a, T: ?Sized> DerefMut for MutexGuard<'a, T>
+{
+    fn deref_mut<'b>(&'b mut self) -> &'b mut T { &mut *self.data }
+}
+
+impl<'a, T: ?Sized> Drop for MutexGuard<'a, T>
+{
+    /// The dropping of the MutexGuard will release the lock it was created from.
+    fn drop(&mut self)
+    {
+        self.lock.store(false, Ordering::Release);
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::prelude::v1::*;
+
+    use std::sync::mpsc::channel;
+    use std::sync::Arc;
+    use std::sync::atomic::{AtomicUsize, Ordering};
+    use std::thread;
+
+    use super::*;
+
+    #[derive(Eq, PartialEq, Debug)]
+    struct NonCopy(i32);
+
+    #[test]
+    fn smoke() {
+        let m = Mutex::new(());
+        drop(m.lock());
+        drop(m.lock());
+    }
+
+    #[test]
+    fn lots_and_lots() {
+        static M: Mutex<()>  = Mutex::new(());
+        static mut CNT: u32 = 0;
+        const J: u32 = 1000;
+        const K: u32 = 3;
+
+        fn inc() {
+            for _ in 0..J {
+                unsafe {
+                    let _g = M.lock();
+                    CNT += 1;
+                }
+            }
+        }
+
+        let (tx, rx) = channel();
+        for _ in 0..K {
+            let tx2 = tx.clone();
+            thread::spawn(move|| { inc(); tx2.send(()).unwrap(); });
+            let tx2 = tx.clone();
+            thread::spawn(move|| { inc(); tx2.send(()).unwrap(); });
+        }
+
+        drop(tx);
+        for _ in 0..2 * K {
+            rx.recv().unwrap();
+        }
+        assert_eq!(unsafe {CNT}, J * K * 2);
+    }
+
+    #[test]
+    fn try_lock() {
+        let mutex = Mutex::new(42);
+
+        // First lock succeeds
+        let a = mutex.try_lock();
+        assert_eq!(a.as_ref().map(|r| **r), Some(42));
+
+        // Additional lock failes
+        let b = mutex.try_lock();
+        assert!(b.is_none());
+
+        // After dropping lock, it succeeds again
+        ::core::mem::drop(a);
+        let c = mutex.try_lock();
+        assert_eq!(c.as_ref().map(|r| **r), Some(42));
+    }
+
+    #[test]
+    fn test_into_inner() {
+        let m = Mutex::new(NonCopy(10));
+        assert_eq!(m.into_inner(), NonCopy(10));
+    }
+
+    #[test]
+    fn test_into_inner_drop() {
+        struct Foo(Arc<AtomicUsize>);
+        impl Drop for Foo {
+            fn drop(&mut self) {
+                self.0.fetch_add(1, Ordering::SeqCst);
+            }
+        }
+        let num_drops = Arc::new(AtomicUsize::new(0));
+        let m = Mutex::new(Foo(num_drops.clone()));
+        assert_eq!(num_drops.load(Ordering::SeqCst), 0);
+        {
+            let _inner = m.into_inner();
+            assert_eq!(num_drops.load(Ordering::SeqCst), 0);
+        }
+        assert_eq!(num_drops.load(Ordering::SeqCst), 1);
+    }
+
+    #[test]
+    fn test_mutex_arc_nested() {
+        // Tests nested mutexes and access
+        // to underlying data.
+        let arc = Arc::new(Mutex::new(1));
+        let arc2 = Arc::new(Mutex::new(arc));
+        let (tx, rx) = channel();
+        let _t = thread::spawn(move|| {
+            let lock = arc2.lock();
+            let lock2 = lock.lock();
+            assert_eq!(*lock2, 1);
+            tx.send(()).unwrap();
+        });
+        rx.recv().unwrap();
+    }
+
+    #[test]
+    fn test_mutex_arc_access_in_unwind() {
+        let arc = Arc::new(Mutex::new(1));
+        let arc2 = arc.clone();
+        let _ = thread::spawn(move|| -> () {
+            struct Unwinder {
+                i: Arc<Mutex<i32>>,
+            }
+            impl Drop for Unwinder {
+                fn drop(&mut self) {
+                    *self.i.lock() += 1;
+                }
+            }
+            let _u = Unwinder { i: arc2 };
+            panic!();
+        }).join();
+        let lock = arc.lock();
+        assert_eq!(*lock, 2);
+    }
+
+    #[test]
+    fn test_mutex_unsized() {
+        let mutex: &Mutex<[i32]> = &Mutex::new([1, 2, 3]);
+        {
+            let b = &mut *mutex.lock();
+            b[0] = 4;
+            b[2] = 5;
+        }
+        let comp: &[i32] = &[4, 2, 5];
+        assert_eq!(&*mutex.lock(), comp);
+    }
+
+    #[test]
+    fn test_mutex_force_lock() {
+        let lock = Mutex::new(());
+        ::std::mem::forget(lock.lock());
+        unsafe {
+            lock.force_unlock();
+        } 
+        assert!(lock.try_lock().is_some());
+    }
+}
diff --git a/rustc_deps/vendor/spin/src/once.rs b/rustc_deps/vendor/spin/src/once.rs
new file mode 100644
index 0000000..fc247c6
--- /dev/null
+++ b/rustc_deps/vendor/spin/src/once.rs
@@ -0,0 +1,290 @@
+use core::cell::UnsafeCell;
+use core::sync::atomic::{AtomicUsize, Ordering, spin_loop_hint as cpu_relax};
+use core::fmt;
+
+/// A synchronization primitive which can be used to run a one-time global
+/// initialization. Unlike its std equivalent, this is generalized so that The
+/// closure returns a value and it is stored. Once therefore acts something like
+/// 1a future, too.
+///
+/// # Examples
+///
+/// ```
+/// use spin;
+///
+/// static START: spin::Once<()> = spin::Once::new();
+///
+/// START.call_once(|| {
+///     // run initialization here
+/// });
+/// ```
+pub struct Once<T> {
+    state: AtomicUsize,
+    data: UnsafeCell<Option<T>>, // TODO remove option and use mem::uninitialized
+}
+
+impl<T: fmt::Debug> fmt::Debug for Once<T> {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self.try() {
+            Some(s) => write!(f, "Once {{ data: ")
+				.and_then(|()| s.fmt(f))
+				.and_then(|()| write!(f, "}}")),
+            None => write!(f, "Once {{ <uninitialized> }}")
+        }
+    }
+}
+
+// Same unsafe impls as `std::sync::RwLock`, because this also allows for
+// concurrent reads.
+unsafe impl<T: Send + Sync> Sync for Once<T> {}
+unsafe impl<T: Send> Send for Once<T> {}
+
+// Four states that a Once can be in, encoded into the lower bits of `state` in
+// the Once structure.
+const INCOMPLETE: usize = 0x0;
+const RUNNING: usize = 0x1;
+const COMPLETE: usize = 0x2;
+const PANICKED: usize = 0x3;
+
+use core::hint::unreachable_unchecked as unreachable;
+
+impl<T> Once<T> {
+    /// Initialization constant of `Once`.
+    pub const INIT: Self = Once {
+        state: AtomicUsize::new(INCOMPLETE),
+        data: UnsafeCell::new(None),
+    };
+
+    /// Creates a new `Once` value.
+    pub const fn new() -> Once<T> {
+        Self::INIT
+    }
+
+    fn force_get<'a>(&'a self) -> &'a T {
+        match unsafe { &*self.data.get() }.as_ref() {
+            None    => unsafe { unreachable() },
+            Some(p) => p,
+        }
+    }
+
+    /// Performs an initialization routine once and only once. The given closure
+    /// will be executed if this is the first time `call_once` has been called,
+    /// and otherwise the routine will *not* be invoked.
+    ///
+    /// This method will block the calling thread if another initialization
+    /// routine is currently running.
+    ///
+    /// When this function returns, it is guaranteed that some initialization
+    /// has run and completed (it may not be the closure specified). The
+    /// returned pointer will point to the result from the closure that was
+    /// ran.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use spin;
+    ///
+    /// static INIT: spin::Once<usize> = spin::Once::new();
+    ///
+    /// fn get_cached_val() -> usize {
+    ///     *INIT.call_once(expensive_computation)
+    /// }
+    ///
+    /// fn expensive_computation() -> usize {
+    ///     // ...
+    /// # 2
+    /// }
+    /// ```
+    pub fn call_once<'a, F>(&'a self, builder: F) -> &'a T
+        where F: FnOnce() -> T
+    {
+        let mut status = self.state.load(Ordering::SeqCst);
+
+        if status == INCOMPLETE {
+            status = self.state.compare_and_swap(INCOMPLETE,
+                                                 RUNNING,
+                                                 Ordering::SeqCst);
+            if status == INCOMPLETE { // We init
+                // We use a guard (Finish) to catch panics caused by builder
+                let mut finish = Finish { state: &self.state, panicked: true };
+                unsafe { *self.data.get() = Some(builder()) };
+                finish.panicked = false;
+
+                status = COMPLETE;
+                self.state.store(status, Ordering::SeqCst);
+
+                // This next line is strictly an optomization
+                return self.force_get();
+            }
+        }
+
+        loop {
+            match status {
+                INCOMPLETE => unreachable!(),
+                RUNNING => { // We spin
+                    cpu_relax();
+                    status = self.state.load(Ordering::SeqCst)
+                },
+                PANICKED => panic!("Once has panicked"),
+                COMPLETE => return self.force_get(),
+                _ => unsafe { unreachable() },
+            }
+        }
+    }
+
+    /// Returns a pointer iff the `Once` was previously initialized
+    pub fn try<'a>(&'a self) -> Option<&'a T> {
+        match self.state.load(Ordering::SeqCst) {
+            COMPLETE => Some(self.force_get()),
+            _        => None,
+        }
+    }
+
+    /// Like try, but will spin if the `Once` is in the process of being
+    /// initialized
+    pub fn wait<'a>(&'a self) -> Option<&'a T> {
+        loop {
+            match self.state.load(Ordering::SeqCst) {
+                INCOMPLETE => return None,
+                RUNNING    => cpu_relax(), // We spin
+                COMPLETE   => return Some(self.force_get()),
+                PANICKED   => panic!("Once has panicked"),
+                _ => unsafe { unreachable() },
+            }
+        }
+    }
+}
+
+struct Finish<'a> {
+    state: &'a AtomicUsize,
+    panicked: bool,
+}
+
+impl<'a> Drop for Finish<'a> {
+    fn drop(&mut self) {
+        if self.panicked {
+            self.state.store(PANICKED, Ordering::SeqCst);
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::prelude::v1::*;
+
+    use std::sync::mpsc::channel;
+    use std::thread;
+    use super::Once;
+
+    #[test]
+    fn smoke_once() {
+        static O: Once<()> = Once::new();
+        let mut a = 0;
+        O.call_once(|| a += 1);
+        assert_eq!(a, 1);
+        O.call_once(|| a += 1);
+        assert_eq!(a, 1);
+    }
+
+    #[test]
+    fn smoke_once_value() {
+        static O: Once<usize> = Once::new();
+        let a = O.call_once(|| 1);
+        assert_eq!(*a, 1);
+        let b = O.call_once(|| 2);
+        assert_eq!(*b, 1);
+    }
+
+    #[test]
+    fn stampede_once() {
+        static O: Once<()> = Once::new();
+        static mut RUN: bool = false;
+
+        let (tx, rx) = channel();
+        for _ in 0..10 {
+            let tx = tx.clone();
+            thread::spawn(move|| {
+                for _ in 0..4 { thread::yield_now() }
+                unsafe {
+                    O.call_once(|| {
+                        assert!(!RUN);
+                        RUN = true;
+                    });
+                    assert!(RUN);
+                }
+                tx.send(()).unwrap();
+            });
+        }
+
+        unsafe {
+            O.call_once(|| {
+                assert!(!RUN);
+                RUN = true;
+            });
+            assert!(RUN);
+        }
+
+        for _ in 0..10 {
+            rx.recv().unwrap();
+        }
+    }
+
+    #[test]
+    fn try() {
+        static INIT: Once<usize> = Once::new();
+
+        assert!(INIT.try().is_none());
+        INIT.call_once(|| 2);
+        assert_eq!(INIT.try().map(|r| *r), Some(2));
+    }
+
+    #[test]
+    fn try_no_wait() {
+        static INIT: Once<usize> = Once::new();
+
+        assert!(INIT.try().is_none());
+        thread::spawn(move|| {
+            INIT.call_once(|| loop { });
+        });
+        assert!(INIT.try().is_none());
+    }
+
+
+    #[test]
+    fn wait() {
+        static INIT: Once<usize> = Once::new();
+
+        assert!(INIT.wait().is_none());
+        INIT.call_once(|| 3);
+        assert_eq!(INIT.wait().map(|r| *r), Some(3));
+    }
+
+    #[test]
+    fn panic() {
+        use ::std::panic;
+
+        static INIT: Once<()> = Once::new();
+
+        // poison the once
+        let t = panic::catch_unwind(|| {
+            INIT.call_once(|| panic!());
+        });
+        assert!(t.is_err());
+
+        // poisoning propagates
+        let t = panic::catch_unwind(|| {
+            INIT.call_once(|| {});
+        });
+        assert!(t.is_err());
+    }
+
+    #[test]
+    fn init_constant() {
+        static O: Once<()> = Once::INIT;
+        let mut a = 0;
+        O.call_once(|| a += 1);
+        assert_eq!(a, 1);
+        O.call_once(|| a += 1);
+        assert_eq!(a, 1);
+    }
+}
diff --git a/rustc_deps/vendor/spin/src/rw_lock.rs b/rustc_deps/vendor/spin/src/rw_lock.rs
new file mode 100644
index 0000000..bea8741
--- /dev/null
+++ b/rustc_deps/vendor/spin/src/rw_lock.rs
@@ -0,0 +1,554 @@
+use core::sync::atomic::{AtomicUsize, Ordering, ATOMIC_USIZE_INIT, spin_loop_hint as cpu_relax};
+use core::cell::UnsafeCell;
+use core::ops::{Deref, DerefMut};
+use core::fmt;
+use core::default::Default;
+
+/// A reader-writer lock
+///
+/// This type of lock allows a number of readers or at most one writer at any
+/// point in time. The write portion of this lock typically allows modification
+/// of the underlying data (exclusive access) and the read portion of this lock
+/// typically allows for read-only access (shared access).
+///
+/// The type parameter `T` represents the data that this lock protects. It is
+/// required that `T` satisfies `Send` to be shared across tasks and `Sync` to
+/// allow concurrent access through readers. The RAII guards returned from the
+/// locking methods implement `Deref` (and `DerefMut` for the `write` methods)
+/// to allow access to the contained of the lock.
+///
+/// Based on
+/// <https://jfdube.wordpress.com/2014/01/03/implementing-a-recursive-read-write-spinlock/>
+///
+/// # Examples
+///
+/// ```
+/// use spin;
+///
+/// let lock = spin::RwLock::new(5);
+///
+/// // many reader locks can be held at once
+/// {
+///     let r1 = lock.read();
+///     let r2 = lock.read();
+///     assert_eq!(*r1, 5);
+///     assert_eq!(*r2, 5);
+/// } // read locks are dropped at this point
+///
+/// // only one write lock may be held, however
+/// {
+///     let mut w = lock.write();
+///     *w += 1;
+///     assert_eq!(*w, 6);
+/// } // write lock is dropped here
+/// ```
+pub struct RwLock<T: ?Sized>
+{
+    lock: AtomicUsize,
+    data: UnsafeCell<T>,
+}
+
+/// A guard to which the protected data can be read
+///
+/// When the guard falls out of scope it will decrement the read count,
+/// potentially releasing the lock.
+#[derive(Debug)]
+pub struct RwLockReadGuard<'a, T: 'a + ?Sized>
+{
+    lock: &'a AtomicUsize,
+    data: &'a T,
+}
+
+/// A guard to which the protected data can be written
+///
+/// When the guard falls out of scope it will release the lock.
+#[derive(Debug)]
+pub struct RwLockWriteGuard<'a, T: 'a + ?Sized>
+{
+    lock: &'a AtomicUsize,
+    data: &'a mut T,
+}
+
+// Same unsafe impls as `std::sync::RwLock`
+unsafe impl<T: ?Sized + Send> Send for RwLock<T> {}
+unsafe impl<T: ?Sized + Send + Sync> Sync for RwLock<T> {}
+
+const USIZE_MSB: usize = ::core::isize::MIN as usize;
+
+impl<T> RwLock<T>
+{
+    /// Creates a new spinlock wrapping the supplied data.
+    ///
+    /// May be used statically:
+    ///
+    /// ```
+    /// use spin;
+    ///
+    /// static RW_LOCK: spin::RwLock<()> = spin::RwLock::new(());
+    ///
+    /// fn demo() {
+    ///     let lock = RW_LOCK.read();
+    ///     // do something with lock
+    ///     drop(lock);
+    /// }
+    /// ```
+    #[inline]
+    pub const fn new(user_data: T) -> RwLock<T>
+    {
+        RwLock
+        {
+            lock: ATOMIC_USIZE_INIT,
+            data: UnsafeCell::new(user_data),
+        }
+    }
+
+    /// Consumes this `RwLock`, returning the underlying data.
+    pub fn into_inner(self) -> T
+    {
+        // We know statically that there are no outstanding references to
+        // `self` so there's no need to lock.
+        let RwLock { data, .. } = self;
+        data.into_inner()
+    }
+}
+
+impl<T: ?Sized> RwLock<T>
+{
+    /// Locks this rwlock with shared read access, blocking the current thread
+    /// until it can be acquired.
+    ///
+    /// The calling thread will be blocked until there are no more writers which
+    /// hold the lock. There may be other readers currently inside the lock when
+    /// this method returns. This method does not provide any guarantees with
+    /// respect to the ordering of whether contentious readers or writers will
+    /// acquire the lock first.
+    ///
+    /// Returns an RAII guard which will release this thread's shared access
+    /// once it is dropped.
+    ///
+    /// ```
+    /// let mylock = spin::RwLock::new(0);
+    /// {
+    ///     let mut data = mylock.read();
+    ///     // The lock is now locked and the data can be read
+    ///     println!("{}", *data);
+    ///     // The lock is dropped
+    /// }
+    /// ```
+    #[inline]
+    pub fn read<'a>(&'a self) -> RwLockReadGuard<'a, T>
+    {
+        // (funny do-while loop)
+        while {
+            // Old value, with write bit unset
+            let mut old;
+
+            // Wait for for writer to go away before doing expensive atomic ops
+            // (funny do-while loop)
+            while {
+                old = self.lock.load(Ordering::Relaxed);
+                old & USIZE_MSB != 0
+            } {
+                cpu_relax();
+            }
+
+            // unset write bit
+            old &= !USIZE_MSB;
+
+            let new = old + 1;
+            debug_assert!(new != (!USIZE_MSB) & (!0));
+
+            self.lock.compare_and_swap(old, new, Ordering::SeqCst) != old
+        } {
+            cpu_relax();
+        }
+        RwLockReadGuard {
+            lock: &self.lock,
+            data: unsafe { & *self.data.get() },
+        }
+    }
+
+    /// Attempt to acquire this lock with shared read access.
+    ///
+    /// This function will never block and will return immediately if `read`
+    /// would otherwise succeed. Returns `Some` of an RAII guard which will
+    /// release the shared access of this thread when dropped, or `None` if the
+    /// access could not be granted. This method does not provide any
+    /// guarantees with respect to the ordering of whether contentious readers
+    /// or writers will acquire the lock first.
+    ///
+    /// ```
+    /// let mylock = spin::RwLock::new(0);
+    /// {
+    ///     match mylock.try_read() {
+    ///         Some(data) => {
+    ///             // The lock is now locked and the data can be read
+    ///             println!("{}", *data);
+    ///             // The lock is dropped
+    ///         },
+    ///         None => (), // no cigar
+    ///     };
+    /// }
+    /// ```
+    #[inline]
+    pub fn try_read(&self) -> Option<RwLockReadGuard<T>>
+    {
+        // Old value, with write bit unset
+        let old = (!USIZE_MSB) & self.lock.load(Ordering::Relaxed);
+
+        let new = old + 1;
+        debug_assert!(new != (!USIZE_MSB) & (!0));
+        if self.lock.compare_and_swap(old,
+                                      new,
+                                      Ordering::SeqCst) == old
+        {
+            Some(RwLockReadGuard {
+                lock: &self.lock,
+                data: unsafe { & *self.data.get() },
+            })
+        } else {
+            None
+        }
+    }
+
+    /// Force decrement the reader count.
+    ///
+    /// This is *extremely* unsafe if there are outstanding `RwLockReadGuard`s
+    /// live, or if called more times than `read` has been called, but can be
+    /// useful in FFI contexts where the caller doesn't know how to deal with
+    /// RAII.
+    pub unsafe fn force_read_decrement(&self) {
+        debug_assert!(self.lock.load(Ordering::Relaxed) & (!USIZE_MSB) > 0);
+        self.lock.fetch_sub(1, Ordering::SeqCst);
+    }
+
+    /// Force unlock exclusive write access.
+    ///
+    /// This is *extremely* unsafe if there are outstanding `RwLockWriteGuard`s
+    /// live, or if called when there are current readers, but can be useful in
+    /// FFI contexts where the caller doesn't know how to deal with RAII.
+    pub unsafe fn force_write_unlock(&self) {
+        debug_assert_eq!(self.lock.load(Ordering::Relaxed), USIZE_MSB);
+        self.lock.store(0, Ordering::Relaxed);
+    }
+
+    /// Lock this rwlock with exclusive write access, blocking the current
+    /// thread until it can be acquired.
+    ///
+    /// This function will not return while other writers or other readers
+    /// currently have access to the lock.
+    ///
+    /// Returns an RAII guard which will drop the write access of this rwlock
+    /// when dropped.
+    ///
+    /// ```
+    /// let mylock = spin::RwLock::new(0);
+    /// {
+    ///     let mut data = mylock.write();
+    ///     // The lock is now locked and the data can be written
+    ///     *data += 1;
+    ///     // The lock is dropped
+    /// }
+    /// ```
+    #[inline]
+    pub fn write<'a>(&'a self) -> RwLockWriteGuard<'a, T>
+    {
+        loop
+        {
+            // Old value, with write bit unset.
+            let old = (!USIZE_MSB) & self.lock.load(Ordering::Relaxed);
+            // Old value, with write bit set.
+            let new = USIZE_MSB | old;
+            if self.lock.compare_and_swap(old,
+                                          new,
+                                          Ordering::SeqCst) == old
+            {
+                // Wait for readers to go away, then lock is ours.
+                while self.lock.load(Ordering::Relaxed) != USIZE_MSB {
+                    cpu_relax();
+                }
+                break
+            }
+        }
+        RwLockWriteGuard {
+            lock: &self.lock,
+            data: unsafe { &mut *self.data.get() },
+        }
+    }
+
+    /// Attempt to lock this rwlock with exclusive write access.
+    ///
+    /// This function does not ever block, and it will return `None` if a call
+    /// to `write` would otherwise block. If successful, an RAII guard is
+    /// returned.
+    ///
+    /// ```
+    /// let mylock = spin::RwLock::new(0);
+    /// {
+    ///     match mylock.try_write() {
+    ///         Some(mut data) => {
+    ///             // The lock is now locked and the data can be written
+    ///             *data += 1;
+    ///             // The lock is implicitly dropped
+    ///         },
+    ///         None => (), // no cigar
+    ///     };
+    /// }
+    /// ```
+    #[inline]
+    pub fn try_write(&self) -> Option<RwLockWriteGuard<T>>
+    {
+        if self.lock.compare_and_swap(0,
+                                      USIZE_MSB,
+                                      Ordering::SeqCst) == 0
+        {
+            Some(RwLockWriteGuard {
+                lock: &self.lock,
+                data: unsafe { &mut *self.data.get() },
+            })
+        } else {
+            None
+        }
+    }
+}
+
+impl<T: ?Sized + fmt::Debug> fmt::Debug for RwLock<T>
+{
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result
+    {
+        match self.try_read()
+        {
+            Some(guard) => write!(f, "RwLock {{ data: ")
+                .and_then(|()| (&*guard).fmt(f))
+                .and_then(|()| write!(f, "}}")),
+            None => write!(f, "RwLock {{ <locked> }}"),
+        }
+    }
+}
+
+impl<T: ?Sized + Default> Default for RwLock<T> {
+    fn default() -> RwLock<T> {
+        RwLock::new(Default::default())
+    }
+}
+
+impl<'rwlock, T: ?Sized> Deref for RwLockReadGuard<'rwlock, T> {
+    type Target = T;
+
+    fn deref(&self) -> &T { self.data }
+}
+
+impl<'rwlock, T: ?Sized> Deref for RwLockWriteGuard<'rwlock, T> {
+    type Target = T;
+
+    fn deref(&self) -> &T { self.data }
+}
+
+impl<'rwlock, T: ?Sized> DerefMut for RwLockWriteGuard<'rwlock, T> {
+    fn deref_mut(&mut self) -> &mut T { self.data }
+}
+
+impl<'rwlock, T: ?Sized> Drop for RwLockReadGuard<'rwlock, T> {
+    fn drop(&mut self) {
+        debug_assert!(self.lock.load(Ordering::Relaxed) & (!USIZE_MSB) > 0);
+        self.lock.fetch_sub(1, Ordering::SeqCst);
+    }
+}
+
+impl<'rwlock, T: ?Sized> Drop for RwLockWriteGuard<'rwlock, T> {
+    fn drop(&mut self) {
+        debug_assert_eq!(self.lock.load(Ordering::Relaxed), USIZE_MSB);
+        self.lock.store(0, Ordering::Relaxed);
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use std::prelude::v1::*;
+
+    use std::sync::Arc;
+    use std::sync::mpsc::channel;
+    use std::sync::atomic::{AtomicUsize, Ordering};
+    use std::thread;
+
+    use super::*;
+
+    #[derive(Eq, PartialEq, Debug)]
+    struct NonCopy(i32);
+
+    #[test]
+    fn smoke() {
+        let l = RwLock::new(());
+        drop(l.read());
+        drop(l.write());
+        drop((l.read(), l.read()));
+        drop(l.write());
+    }
+
+    // TODO: needs RNG
+    //#[test]
+    //fn frob() {
+    //    static R: RwLock = RwLock::new();
+    //    const N: usize = 10;
+    //    const M: usize = 1000;
+    //
+    //    let (tx, rx) = channel::<()>();
+    //    for _ in 0..N {
+    //        let tx = tx.clone();
+    //        thread::spawn(move|| {
+    //            let mut rng = rand::thread_rng();
+    //            for _ in 0..M {
+    //                if rng.gen_weighted_bool(N) {
+    //                    drop(R.write());
+    //                } else {
+    //                    drop(R.read());
+    //                }
+    //            }
+    //            drop(tx);
+    //        });
+    //    }
+    //    drop(tx);
+    //    let _ = rx.recv();
+    //    unsafe { R.destroy(); }
+    //}
+
+    #[test]
+    fn test_rw_arc() {
+        let arc = Arc::new(RwLock::new(0));
+        let arc2 = arc.clone();
+        let (tx, rx) = channel();
+
+        thread::spawn(move|| {
+            let mut lock = arc2.write();
+            for _ in 0..10 {
+                let tmp = *lock;
+                *lock = -1;
+                thread::yield_now();
+                *lock = tmp + 1;
+            }
+            tx.send(()).unwrap();
+        });
+
+        // Readers try to catch the writer in the act
+        let mut children = Vec::new();
+        for _ in 0..5 {
+            let arc3 = arc.clone();
+            children.push(thread::spawn(move|| {
+                let lock = arc3.read();
+                assert!(*lock >= 0);
+            }));
+        }
+
+        // Wait for children to pass their asserts
+        for r in children {
+            assert!(r.join().is_ok());
+        }
+
+        // Wait for writer to finish
+        rx.recv().unwrap();
+        let lock = arc.read();
+        assert_eq!(*lock, 10);
+    }
+
+    #[test]
+    fn test_rw_arc_access_in_unwind() {
+        let arc = Arc::new(RwLock::new(1));
+        let arc2 = arc.clone();
+        let _ = thread::spawn(move|| -> () {
+            struct Unwinder {
+                i: Arc<RwLock<isize>>,
+            }
+            impl Drop for Unwinder {
+                fn drop(&mut self) {
+                    let mut lock = self.i.write();
+                    *lock += 1;
+                }
+            }
+            let _u = Unwinder { i: arc2 };
+            panic!();
+        }).join();
+        let lock = arc.read();
+        assert_eq!(*lock, 2);
+    }
+
+    #[test]
+    fn test_rwlock_unsized() {
+        let rw: &RwLock<[i32]> = &RwLock::new([1, 2, 3]);
+        {
+            let b = &mut *rw.write();
+            b[0] = 4;
+            b[2] = 5;
+        }
+        let comp: &[i32] = &[4, 2, 5];
+        assert_eq!(&*rw.read(), comp);
+    }
+
+    #[test]
+    fn test_rwlock_try_write() {
+        use std::mem::drop;
+
+        let lock = RwLock::new(0isize);
+        let read_guard = lock.read();
+
+        let write_result = lock.try_write();
+        match write_result {
+            None => (),
+            Some(_) => assert!(false, "try_write should not succeed while read_guard is in scope"),
+        }
+
+        drop(read_guard);
+    }
+
+    #[test]
+    fn test_into_inner() {
+        let m = RwLock::new(NonCopy(10));
+        assert_eq!(m.into_inner(), NonCopy(10));
+    }
+
+    #[test]
+    fn test_into_inner_drop() {
+        struct Foo(Arc<AtomicUsize>);
+        impl Drop for Foo {
+            fn drop(&mut self) {
+                self.0.fetch_add(1, Ordering::SeqCst);
+            }
+        }
+        let num_drops = Arc::new(AtomicUsize::new(0));
+        let m = RwLock::new(Foo(num_drops.clone()));
+        assert_eq!(num_drops.load(Ordering::SeqCst), 0);
+        {
+            let _inner = m.into_inner();
+            assert_eq!(num_drops.load(Ordering::SeqCst), 0);
+        }
+        assert_eq!(num_drops.load(Ordering::SeqCst), 1);
+    }
+
+    #[test]
+    fn test_force_read_decrement() {
+        let m = RwLock::new(());
+        ::std::mem::forget(m.read());
+        ::std::mem::forget(m.read());
+        ::std::mem::forget(m.read());
+        assert!(m.try_write().is_none());
+        unsafe {
+            m.force_read_decrement();
+            m.force_read_decrement();
+        }
+        assert!(m.try_write().is_none());
+        unsafe {
+            m.force_read_decrement();
+        }
+        assert!(m.try_write().is_some());
+    }
+
+    #[test]
+    fn test_force_write_unlock() {
+        let m = RwLock::new(());
+        ::std::mem::forget(m.write());
+        assert!(m.try_read().is_none());
+        unsafe {
+            m.force_write_unlock();
+        }
+        assert!(m.try_read().is_some());
+    }
+}