external/boringssl: Sync to 2c45fa0b90f61b27973fa81893e014fc8c8e8999.

This includes the following changes:

https://boringssl.googlesource.com/boringssl/+log/faa539f877432814d0f2de19846eb99f2ea1e207..2c45fa0b90f61b27973fa81893e014fc8c8e8999

Test: BoringSSL CTS Presubmits
Change-Id: Ie6dc40e0c979168ec73fa1165cbc6e6b83793439
diff --git a/Android.bp b/Android.bp
index 65f95f0..ec247a0 100644
--- a/Android.bp
+++ b/Android.bp
@@ -43,8 +43,8 @@
 
 // This should be removed when clang can compile everything.
 libcrypto_sources_no_clang = [
-    "linux-arm/crypto/aes/aes-armv4.S",
-    "linux-arm/crypto/aes/bsaes-armv7.S",
+    "linux-arm/crypto/fipsmodule/aes-armv4.S",
+    "linux-arm/crypto/fipsmodule/bsaes-armv7.S",
 ]
 
 cc_defaults {
diff --git a/BORINGSSL_REVISION b/BORINGSSL_REVISION
index ce6eb7a..b2c24d9 100644
--- a/BORINGSSL_REVISION
+++ b/BORINGSSL_REVISION
@@ -1 +1 @@
-faa539f877432814d0f2de19846eb99f2ea1e207
+2c45fa0b90f61b27973fa81893e014fc8c8e8999
diff --git a/err_data.c b/err_data.c
index ea6dd73..fbc962b 100644
--- a/err_data.c
+++ b/err_data.c
@@ -74,51 +74,52 @@
     0xc3a8845,
     0xc3b00ea,
     0x10320845,
-    0x1032943b,
-    0x10331447,
-    0x10339460,
-    0x10341473,
-    0x10348eb4,
+    0x1032947c,
+    0x10331488,
+    0x103394a1,
+    0x103414b4,
+    0x10348ed1,
     0x10350c42,
-    0x10359486,
-    0x1036149b,
-    0x103694ae,
-    0x103714cd,
-    0x103794e6,
-    0x103814fb,
-    0x10389519,
-    0x10391528,
-    0x10399544,
-    0x103a155f,
-    0x103a956e,
-    0x103b158a,
-    0x103b95a5,
-    0x103c15bc,
+    0x103594c7,
+    0x103614dc,
+    0x103694ef,
+    0x1037150e,
+    0x10379527,
+    0x1038153c,
+    0x1038955a,
+    0x10391569,
+    0x10399585,
+    0x103a15a0,
+    0x103a95af,
+    0x103b15cb,
+    0x103b95e6,
+    0x103c15fd,
     0x103c80ea,
-    0x103d15cd,
-    0x103d95e1,
-    0x103e1600,
-    0x103e960f,
-    0x103f1626,
-    0x103f9639,
+    0x103d160e,
+    0x103d9622,
+    0x103e1641,
+    0x103e9650,
+    0x103f1667,
+    0x103f967a,
     0x10400c06,
-    0x1040964c,
-    0x1041166a,
-    0x1041967d,
-    0x10421697,
-    0x104296a7,
-    0x104316bb,
-    0x104396d1,
-    0x104416e9,
-    0x104496fe,
-    0x10451712,
-    0x10459724,
+    0x1040968d,
+    0x104116ab,
+    0x104196be,
+    0x104216d8,
+    0x104296e8,
+    0x104316fc,
+    0x10439712,
+    0x1044172a,
+    0x1044973f,
+    0x10451753,
+    0x10459765,
     0x104605fb,
     0x1046893f,
-    0x10471739,
-    0x10479750,
-    0x10481765,
-    0x10489773,
+    0x1047177a,
+    0x10479791,
+    0x104817a6,
+    0x104897b4,
+    0x10490e33,
     0x14320be9,
     0x14328bf7,
     0x14330c06,
@@ -126,51 +127,53 @@
     0x143400ac,
     0x143480ea,
     0x18320083,
-    0x18328f0a,
+    0x18328f27,
     0x183300ac,
-    0x18338f20,
-    0x18340f34,
+    0x18338f3d,
+    0x18340f51,
     0x183480ea,
-    0x18350f49,
-    0x18358f61,
-    0x18360f76,
-    0x18368f8a,
-    0x18370fae,
-    0x18378fc4,
-    0x18380fd8,
-    0x18388fe8,
+    0x18350f66,
+    0x18358f7e,
+    0x18360f93,
+    0x18368fa7,
+    0x18370fcb,
+    0x18378fe1,
+    0x18380ff5,
+    0x18389005,
     0x18390a57,
-    0x18398ff8,
-    0x183a100d,
-    0x183a9021,
+    0x18399015,
+    0x183a102a,
+    0x183a9050,
     0x183b0c4e,
-    0x183b902e,
-    0x183c1040,
-    0x183c904b,
-    0x183d105b,
-    0x183d906c,
-    0x183e107d,
-    0x183e908f,
-    0x183f10b8,
-    0x183f90d1,
-    0x184010e9,
+    0x183b906f,
+    0x183c1081,
+    0x183c908c,
+    0x183d109c,
+    0x183d90ad,
+    0x183e10be,
+    0x183e90d0,
+    0x183f10f9,
+    0x183f9112,
+    0x1840112a,
     0x184086d3,
-    0x20321110,
-    0x2432111c,
+    0x1841105d,
+    0x1841903e,
+    0x20321151,
+    0x2432115d,
     0x24328985,
-    0x2433112e,
-    0x2433913b,
-    0x24341148,
-    0x2434915a,
-    0x24351169,
-    0x24359186,
-    0x24361193,
-    0x243691a1,
-    0x243711af,
-    0x243791bd,
-    0x243811c6,
-    0x243891d3,
-    0x243911e6,
+    0x2433116f,
+    0x2433917c,
+    0x24341189,
+    0x2434919b,
+    0x243511aa,
+    0x243591c7,
+    0x243611d4,
+    0x243691e2,
+    0x243711f0,
+    0x243791fe,
+    0x24381207,
+    0x24389214,
+    0x24391227,
     0x28320c36,
     0x28328c4e,
     0x28330c06,
@@ -178,42 +181,43 @@
     0x28340c42,
     0x283480ac,
     0x283500ea,
-    0x2c322af1,
-    0x2c32aaff,
-    0x2c332b11,
-    0x2c33ab23,
-    0x2c342b37,
-    0x2c34ab49,
-    0x2c352b64,
-    0x2c35ab76,
-    0x2c362b89,
+    0x2c322b50,
+    0x2c32ab5e,
+    0x2c332b70,
+    0x2c33ab82,
+    0x2c342b96,
+    0x2c34aba8,
+    0x2c352bc3,
+    0x2c35abd5,
+    0x2c362be8,
     0x2c36832d,
-    0x2c372b96,
-    0x2c37aba8,
-    0x2c382bbb,
-    0x2c38abd2,
-    0x2c392be0,
-    0x2c39abf0,
-    0x2c3a2c02,
-    0x2c3aac16,
-    0x2c3b2c27,
-    0x2c3bac46,
-    0x2c3c2c5a,
-    0x2c3cac70,
-    0x2c3d2c89,
-    0x2c3daca6,
-    0x2c3e2cb7,
-    0x2c3eacc5,
-    0x2c3f2cdd,
-    0x2c3facf5,
-    0x2c402d02,
-    0x2c409110,
-    0x2c412d13,
-    0x2c41ad26,
-    0x2c4210e9,
-    0x2c42ad37,
+    0x2c372bf5,
+    0x2c37ac07,
+    0x2c382c2c,
+    0x2c38ac43,
+    0x2c392c51,
+    0x2c39ac61,
+    0x2c3a2c73,
+    0x2c3aac87,
+    0x2c3b2c98,
+    0x2c3bacb7,
+    0x2c3c2ccb,
+    0x2c3cace1,
+    0x2c3d2cfa,
+    0x2c3dad17,
+    0x2c3e2d28,
+    0x2c3ead36,
+    0x2c3f2d4e,
+    0x2c3fad66,
+    0x2c402d73,
+    0x2c409151,
+    0x2c412d84,
+    0x2c41ad97,
+    0x2c42112a,
+    0x2c42ada8,
     0x2c430720,
-    0x2c43ac38,
+    0x2c43aca9,
+    0x2c442c1a,
     0x30320000,
     0x30328015,
     0x3033001f,
@@ -334,228 +338,230 @@
     0x3c3b0df0,
     0x3c3b8e0b,
     0x3c3c0e1d,
-    0x3c3c8e33,
-    0x3c3d0e3d,
-    0x3c3d8e51,
-    0x3c3e0e5f,
-    0x3c3e8e84,
+    0x3c3c8e50,
+    0x3c3d0e5a,
+    0x3c3d8e6e,
+    0x3c3e0e7c,
+    0x3c3e8ea1,
     0x3c3f0c77,
-    0x3c3f8e6d,
+    0x3c3f8e8a,
     0x3c4000ac,
     0x3c4080ea,
     0x3c410cf7,
     0x3c418d36,
-    0x403217a6,
-    0x403297bc,
-    0x403317ea,
-    0x403397f4,
-    0x4034180b,
-    0x40349829,
-    0x40351839,
-    0x4035984b,
-    0x40361858,
-    0x40369864,
-    0x40371879,
-    0x4037988b,
-    0x40381896,
-    0x403898a8,
-    0x40390eb4,
-    0x403998b8,
-    0x403a18cb,
-    0x403a98ec,
-    0x403b18fd,
-    0x403b990d,
+    0x3c420e33,
+    0x403217e7,
+    0x403297fd,
+    0x4033182b,
+    0x40339835,
+    0x4034184c,
+    0x4034986a,
+    0x4035187a,
+    0x4035988c,
+    0x40361899,
+    0x403698a5,
+    0x403718ba,
+    0x403798cc,
+    0x403818d7,
+    0x403898e9,
+    0x40390ed1,
+    0x403998f9,
+    0x403a190c,
+    0x403a992d,
+    0x403b193e,
+    0x403b994e,
     0x403c0064,
     0x403c8083,
-    0x403d1991,
-    0x403d99a7,
-    0x403e19b6,
-    0x403e99ee,
-    0x403f1a08,
-    0x403f9a16,
-    0x40401a2b,
-    0x40409a58,
-    0x40411a75,
-    0x40419a90,
-    0x40421aa9,
-    0x40429abc,
-    0x40431ad0,
-    0x40439ae8,
-    0x40441aff,
+    0x403d19d2,
+    0x403d99e8,
+    0x403e19f7,
+    0x403e9a2f,
+    0x403f1a49,
+    0x403f9a57,
+    0x40401a6c,
+    0x40409a99,
+    0x40411ab6,
+    0x40419ad1,
+    0x40421aea,
+    0x40429afd,
+    0x40431b11,
+    0x40439b29,
+    0x40441b40,
     0x404480ac,
-    0x40451b14,
-    0x40459b26,
-    0x40461b4a,
-    0x40469b6a,
-    0x40471b78,
-    0x40479b9f,
-    0x40481bdc,
-    0x40489bf5,
-    0x40491c0c,
-    0x40499c26,
-    0x404a1c3d,
-    0x404a9c5b,
-    0x404b1c73,
-    0x404b9c8a,
-    0x404c1ca0,
-    0x404c9cb2,
-    0x404d1cd3,
-    0x404d9cf5,
-    0x404e1d09,
-    0x404e9d16,
-    0x404f1d43,
-    0x404f9d6c,
-    0x40501da7,
-    0x40509dbb,
-    0x40511dd6,
-    0x40521de6,
-    0x40529e0a,
-    0x40531e22,
-    0x40539e35,
-    0x40541e4a,
-    0x40549e6d,
-    0x40551e7b,
-    0x40559e98,
-    0x40561ea5,
-    0x40569ebe,
-    0x40571ed6,
-    0x40579ee9,
-    0x40581efe,
-    0x40589f25,
-    0x40591f54,
-    0x40599f81,
-    0x405a1f95,
-    0x405a9fa5,
-    0x405b1fbd,
-    0x405b9fce,
-    0x405c1fe1,
-    0x405ca002,
-    0x405d200f,
-    0x405da026,
-    0x405e2064,
+    0x40451b55,
+    0x40459b67,
+    0x40461b8b,
+    0x40469bab,
+    0x40471bb9,
+    0x40479be0,
+    0x40481c1d,
+    0x40489c36,
+    0x40491c4d,
+    0x40499c67,
+    0x404a1c7e,
+    0x404a9c9c,
+    0x404b1cb4,
+    0x404b9ccb,
+    0x404c1ce1,
+    0x404c9cf3,
+    0x404d1d14,
+    0x404d9d36,
+    0x404e1d4a,
+    0x404e9d57,
+    0x404f1d84,
+    0x404f9dad,
+    0x40501de8,
+    0x40509dfc,
+    0x40511e17,
+    0x40521e27,
+    0x40529e4b,
+    0x40531e63,
+    0x40539e76,
+    0x40541e8b,
+    0x40549eae,
+    0x40551ebc,
+    0x40559ed9,
+    0x40561ee6,
+    0x40569eff,
+    0x40571f17,
+    0x40579f2a,
+    0x40581f3f,
+    0x40589f66,
+    0x40591f95,
+    0x40599fc2,
+    0x405a1fd6,
+    0x405a9fe6,
+    0x405b1ffe,
+    0x405ba00f,
+    0x405c2022,
+    0x405ca061,
+    0x405d206e,
+    0x405da085,
+    0x405e20c3,
     0x405e8a95,
-    0x405f2085,
-    0x405fa092,
-    0x406020a0,
-    0x4060a0c2,
-    0x40612106,
-    0x4061a13e,
-    0x40622155,
-    0x4062a166,
-    0x40632177,
-    0x4063a18c,
-    0x406421a3,
-    0x4064a1cf,
-    0x406521ea,
-    0x4065a201,
-    0x40662219,
-    0x4066a243,
-    0x4067226e,
-    0x4067a28f,
-    0x406822b6,
-    0x4068a2d7,
-    0x40692309,
-    0x4069a337,
-    0x406a2358,
-    0x406aa378,
-    0x406b2500,
-    0x406ba523,
-    0x406c2539,
-    0x406ca7b4,
-    0x406d27e3,
-    0x406da80b,
-    0x406e2839,
-    0x406ea86d,
-    0x406f288c,
-    0x406fa8a1,
-    0x407028b4,
-    0x4070a8d1,
+    0x405f20e4,
+    0x405fa0f1,
+    0x406020ff,
+    0x4060a121,
+    0x40612165,
+    0x4061a19d,
+    0x406221b4,
+    0x4062a1c5,
+    0x406321d6,
+    0x4063a1eb,
+    0x40642202,
+    0x4064a22e,
+    0x40652249,
+    0x4065a260,
+    0x40662278,
+    0x4066a2a2,
+    0x406722cd,
+    0x4067a2ee,
+    0x40682315,
+    0x4068a336,
+    0x40692368,
+    0x4069a396,
+    0x406a23b7,
+    0x406aa3d7,
+    0x406b255f,
+    0x406ba582,
+    0x406c2598,
+    0x406ca813,
+    0x406d2842,
+    0x406da86a,
+    0x406e2898,
+    0x406ea8cc,
+    0x406f28eb,
+    0x406fa900,
+    0x40702913,
+    0x4070a930,
     0x40710800,
-    0x4071a8e3,
-    0x407228f6,
-    0x4072a90f,
-    0x40732927,
-    0x407393aa,
-    0x4074293b,
-    0x4074a955,
-    0x40752966,
-    0x4075a97a,
-    0x40762988,
-    0x407691d3,
-    0x407729ad,
-    0x4077a9cf,
-    0x407829ea,
-    0x4078aa23,
-    0x40792a3a,
-    0x4079aa50,
-    0x407a2a5c,
-    0x407aaa6f,
-    0x407b2a84,
-    0x407baa96,
-    0x407c2ac7,
-    0x407caad0,
-    0x407d22f2,
-    0x407d9d7c,
-    0x407e29ff,
-    0x407e9f35,
-    0x407f1b8c,
-    0x407f9933,
-    0x40801d53,
-    0x40809bb4,
-    0x40811df8,
-    0x40819d2d,
-    0x40822824,
-    0x40829919,
-    0x40831f10,
-    0x4083a1b4,
-    0x40841bc8,
-    0x40849f6d,
-    0x40851ff2,
-    0x4085a0ea,
-    0x40862046,
-    0x40869d96,
-    0x40872851,
-    0x4087a11b,
-    0x4088197a,
-    0x4088a2a2,
-    0x408919c9,
-    0x40899956,
-    0x408a2559,
-    0x408a978a,
-    0x408b2aab,
-    0x408b9a3f,
-    0x41f4242b,
-    0x41f924bd,
-    0x41fe23b0,
-    0x41fea5a5,
-    0x41ff2696,
-    0x42032444,
-    0x42082466,
-    0x4208a4a2,
-    0x42092394,
-    0x4209a4dc,
-    0x420a23eb,
-    0x420aa3cb,
-    0x420b240b,
-    0x420ba484,
-    0x420c26b2,
-    0x420ca572,
-    0x420d258c,
-    0x420da5c3,
-    0x421225dd,
-    0x42172679,
-    0x4217a61f,
-    0x421c2641,
-    0x421f25fc,
-    0x422126c9,
-    0x4226265c,
-    0x422b2798,
-    0x422ba746,
-    0x422c2780,
-    0x422ca705,
-    0x422d26e4,
-    0x422da765,
-    0x422e272b,
+    0x4071a942,
+    0x40722955,
+    0x4072a96e,
+    0x40732986,
+    0x407393eb,
+    0x4074299a,
+    0x4074a9b4,
+    0x407529c5,
+    0x4075a9d9,
+    0x407629e7,
+    0x40769214,
+    0x40772a0c,
+    0x4077aa2e,
+    0x40782a49,
+    0x4078aa82,
+    0x40792a99,
+    0x4079aaaf,
+    0x407a2abb,
+    0x407aaace,
+    0x407b2ae3,
+    0x407baaf5,
+    0x407c2b26,
+    0x407cab2f,
+    0x407d2351,
+    0x407d9dbd,
+    0x407e2a5e,
+    0x407e9f76,
+    0x407f1bcd,
+    0x407f9974,
+    0x40801d94,
+    0x40809bf5,
+    0x40811e39,
+    0x40819d6e,
+    0x40822883,
+    0x4082995a,
+    0x40831f51,
+    0x4083a213,
+    0x40841c09,
+    0x40849fae,
+    0x40852033,
+    0x4085a149,
+    0x408620a5,
+    0x40869dd7,
+    0x408728b0,
+    0x4087a17a,
+    0x408819bb,
+    0x4088a301,
+    0x40891a0a,
+    0x40899997,
+    0x408a25b8,
+    0x408a97cb,
+    0x408b2b0a,
+    0x408b9a80,
+    0x408c2043,
+    0x41f4248a,
+    0x41f9251c,
+    0x41fe240f,
+    0x41fea604,
+    0x41ff26f5,
+    0x420324a3,
+    0x420824c5,
+    0x4208a501,
+    0x420923f3,
+    0x4209a53b,
+    0x420a244a,
+    0x420aa42a,
+    0x420b246a,
+    0x420ba4e3,
+    0x420c2711,
+    0x420ca5d1,
+    0x420d25eb,
+    0x420da622,
+    0x4212263c,
+    0x421726d8,
+    0x4217a67e,
+    0x421c26a0,
+    0x421f265b,
+    0x42212728,
+    0x422626bb,
+    0x422b27f7,
+    0x422ba7a5,
+    0x422c27df,
+    0x422ca764,
+    0x422d2743,
+    0x422da7c4,
+    0x422e278a,
     0x4432072b,
     0x4432873a,
     0x44330746,
@@ -573,110 +579,110 @@
     0x44390800,
     0x4439880e,
     0x443a0821,
-    0x4c321211,
-    0x4c329221,
-    0x4c331234,
-    0x4c339254,
+    0x4c321252,
+    0x4c329262,
+    0x4c331275,
+    0x4c339295,
     0x4c3400ac,
     0x4c3480ea,
-    0x4c351260,
-    0x4c35926e,
-    0x4c36128a,
-    0x4c36929d,
-    0x4c3712ac,
-    0x4c3792ba,
-    0x4c3812cf,
-    0x4c3892db,
-    0x4c3912fb,
-    0x4c399325,
-    0x4c3a133e,
-    0x4c3a9357,
+    0x4c3512a1,
+    0x4c3592af,
+    0x4c3612cb,
+    0x4c3692de,
+    0x4c3712ed,
+    0x4c3792fb,
+    0x4c381310,
+    0x4c38931c,
+    0x4c39133c,
+    0x4c399366,
+    0x4c3a137f,
+    0x4c3a9398,
     0x4c3b05fb,
-    0x4c3b9370,
-    0x4c3c1382,
-    0x4c3c9391,
-    0x4c3d13aa,
+    0x4c3b93b1,
+    0x4c3c13c3,
+    0x4c3c93d2,
+    0x4c3d13eb,
     0x4c3d8c29,
-    0x4c3e1403,
-    0x4c3e93b9,
-    0x4c3f1425,
-    0x4c3f91d3,
-    0x4c4013cf,
-    0x4c4091fd,
-    0x4c4113f3,
-    0x50322d49,
-    0x5032ad58,
-    0x50332d63,
-    0x5033ad73,
-    0x50342d8c,
-    0x5034ada6,
-    0x50352db4,
-    0x5035adca,
-    0x50362ddc,
-    0x5036adf2,
-    0x50372e0b,
-    0x5037ae1e,
-    0x50382e36,
-    0x5038ae47,
-    0x50392e5c,
-    0x5039ae70,
-    0x503a2e90,
-    0x503aaea6,
-    0x503b2ebe,
-    0x503baed0,
-    0x503c2eec,
-    0x503caf03,
-    0x503d2f1c,
-    0x503daf32,
-    0x503e2f3f,
-    0x503eaf55,
-    0x503f2f67,
+    0x4c3e1444,
+    0x4c3e93fa,
+    0x4c3f1466,
+    0x4c3f9214,
+    0x4c401410,
+    0x4c40923e,
+    0x4c411434,
+    0x50322dba,
+    0x5032adc9,
+    0x50332dd4,
+    0x5033ade4,
+    0x50342dfd,
+    0x5034ae17,
+    0x50352e25,
+    0x5035ae3b,
+    0x50362e4d,
+    0x5036ae63,
+    0x50372e7c,
+    0x5037ae8f,
+    0x50382ea7,
+    0x5038aeb8,
+    0x50392ecd,
+    0x5039aee1,
+    0x503a2f01,
+    0x503aaf17,
+    0x503b2f2f,
+    0x503baf41,
+    0x503c2f5d,
+    0x503caf74,
+    0x503d2f8d,
+    0x503dafa3,
+    0x503e2fb0,
+    0x503eafc6,
+    0x503f2fd8,
     0x503f8382,
-    0x50402f7a,
-    0x5040af8a,
-    0x50412fa4,
-    0x5041afb3,
-    0x50422fcd,
-    0x5042afea,
-    0x50432ffa,
-    0x5043b00a,
-    0x50443019,
+    0x50402feb,
+    0x5040affb,
+    0x50413015,
+    0x5041b024,
+    0x5042303e,
+    0x5042b05b,
+    0x5043306b,
+    0x5043b07b,
+    0x5044308a,
     0x5044843f,
-    0x5045302d,
-    0x5045b04b,
-    0x5046305e,
-    0x5046b074,
-    0x50473086,
-    0x5047b09b,
-    0x504830c1,
-    0x5048b0cf,
-    0x504930e2,
-    0x5049b0f7,
-    0x504a310d,
-    0x504ab11d,
-    0x504b313d,
-    0x504bb150,
-    0x504c3173,
-    0x504cb1a1,
-    0x504d31b3,
-    0x504db1d0,
-    0x504e31eb,
-    0x504eb207,
-    0x504f3219,
-    0x504fb230,
-    0x5050323f,
+    0x5045309e,
+    0x5045b0bc,
+    0x504630cf,
+    0x5046b0e5,
+    0x504730f7,
+    0x5047b10c,
+    0x50483132,
+    0x5048b140,
+    0x50493153,
+    0x5049b168,
+    0x504a317e,
+    0x504ab18e,
+    0x504b31ae,
+    0x504bb1c1,
+    0x504c31e4,
+    0x504cb212,
+    0x504d3224,
+    0x504db241,
+    0x504e325c,
+    0x504eb278,
+    0x504f328a,
+    0x504fb2a1,
+    0x505032b0,
     0x505086ef,
-    0x50513252,
-    0x58320ef2,
-    0x68320eb4,
+    0x505132c3,
+    0x58320f0f,
+    0x68320ed1,
     0x68328c4e,
     0x68330c61,
-    0x68338ec2,
-    0x68340ed2,
+    0x68338edf,
+    0x68340eef,
     0x683480ea,
-    0x6c320e90,
+    0x6c320ead,
     0x6c328c18,
-    0x6c330e9b,
+    0x6c330eb8,
     0x74320a0b,
     0x743280ac,
     0x74330c29,
@@ -705,7 +711,7 @@
     0x783d0b19,
     0x783d8b2e,
     0x783e0a84,
-    0x7c3210ff,
+    0x7c321140,
 };
 
 const size_t kOpenSSLReasonValuesLen = sizeof(kOpenSSLReasonValues) / sizeof(kOpenSSLReasonValues[0]);
@@ -899,6 +905,7 @@
     "PKPARAMETERS2GROUP_FAILURE\0"
     "POINT_AT_INFINITY\0"
     "POINT_IS_NOT_ON_CURVE\0"
+    "PUBLIC_KEY_VALIDATION_FAILED\0"
     "SLOT_FULL\0"
     "UNDEFINED_GENERATOR\0"
     "UNKNOWN_GROUP\0"
@@ -924,7 +931,9 @@
     "INVALID_MGF1_MD\0"
     "INVALID_PADDING_MODE\0"
     "INVALID_PSS_SALTLEN\0"
+    "INVALID_SIGNATURE\0"
     "KEYS_NOT_SET\0"
+    "NOT_A_PRIVATE_KEY\0"
     "NO_DEFAULT_DIGEST\0"
     "NO_KEY_SET\0"
     "NO_MDC2_SUPPORT\0"
@@ -1115,6 +1124,7 @@
     "NO_REQUIRED_DIGEST\0"
     "NO_SHARED_CIPHER\0"
     "NO_SHARED_GROUP\0"
+    "NO_SUPPORTED_VERSIONS_ENABLED\0"
     "NULL_SSL_CTX\0"
     "NULL_SSL_METHOD_PASSED\0"
     "OLD_SESSION_CIPHER_NOT_RETURNED\0"
@@ -1230,6 +1240,7 @@
     "IDP_MISMATCH\0"
     "INVALID_DIRECTORY\0"
     "INVALID_FIELD_NAME\0"
+    "INVALID_PARAMETER\0"
     "INVALID_PSS_PARAMETERS\0"
     "INVALID_TRUST\0"
     "ISSUER_MISMATCH\0"
diff --git a/linux-aarch64/crypto/aes/aesv8-armx64.S b/linux-aarch64/crypto/fipsmodule/aesv8-armx64.S
similarity index 100%
rename from linux-aarch64/crypto/aes/aesv8-armx64.S
rename to linux-aarch64/crypto/fipsmodule/aesv8-armx64.S
diff --git a/linux-aarch64/crypto/sha/sha1-armv8.S b/linux-aarch64/crypto/fipsmodule/sha1-armv8.S
similarity index 100%
rename from linux-aarch64/crypto/sha/sha1-armv8.S
rename to linux-aarch64/crypto/fipsmodule/sha1-armv8.S
diff --git a/linux-aarch64/crypto/sha/sha256-armv8.S b/linux-aarch64/crypto/fipsmodule/sha256-armv8.S
similarity index 100%
rename from linux-aarch64/crypto/sha/sha256-armv8.S
rename to linux-aarch64/crypto/fipsmodule/sha256-armv8.S
diff --git a/linux-aarch64/crypto/sha/sha512-armv8.S b/linux-aarch64/crypto/fipsmodule/sha512-armv8.S
similarity index 100%
rename from linux-aarch64/crypto/sha/sha512-armv8.S
rename to linux-aarch64/crypto/fipsmodule/sha512-armv8.S
diff --git a/linux-arm/crypto/aes/aes-armv4.S b/linux-arm/crypto/fipsmodule/aes-armv4.S
similarity index 100%
rename from linux-arm/crypto/aes/aes-armv4.S
rename to linux-arm/crypto/fipsmodule/aes-armv4.S
diff --git a/linux-arm/crypto/aes/aesv8-armx32.S b/linux-arm/crypto/fipsmodule/aesv8-armx32.S
similarity index 100%
rename from linux-arm/crypto/aes/aesv8-armx32.S
rename to linux-arm/crypto/fipsmodule/aesv8-armx32.S
diff --git a/linux-arm/crypto/aes/bsaes-armv7.S b/linux-arm/crypto/fipsmodule/bsaes-armv7.S
similarity index 100%
rename from linux-arm/crypto/aes/bsaes-armv7.S
rename to linux-arm/crypto/fipsmodule/bsaes-armv7.S
diff --git a/linux-arm/crypto/sha/sha1-armv4-large.S b/linux-arm/crypto/fipsmodule/sha1-armv4-large.S
similarity index 100%
rename from linux-arm/crypto/sha/sha1-armv4-large.S
rename to linux-arm/crypto/fipsmodule/sha1-armv4-large.S
diff --git a/linux-arm/crypto/sha/sha256-armv4.S b/linux-arm/crypto/fipsmodule/sha256-armv4.S
similarity index 100%
rename from linux-arm/crypto/sha/sha256-armv4.S
rename to linux-arm/crypto/fipsmodule/sha256-armv4.S
diff --git a/linux-arm/crypto/sha/sha512-armv4.S b/linux-arm/crypto/fipsmodule/sha512-armv4.S
similarity index 100%
rename from linux-arm/crypto/sha/sha512-armv4.S
rename to linux-arm/crypto/fipsmodule/sha512-armv4.S
diff --git a/linux-ppc64le/crypto/fipsmodule/aesp8-ppc.S b/linux-ppc64le/crypto/fipsmodule/aesp8-ppc.S
new file mode 100644
index 0000000..3424ea6
--- /dev/null
+++ b/linux-ppc64le/crypto/fipsmodule/aesp8-ppc.S
@@ -0,0 +1,3633 @@
+.machine	"any"
+
+.text
+
+.align	7
+rcon:
+.byte	0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01
+.byte	0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x1b
+.byte	0x0c,0x0f,0x0e,0x0d,0x0c,0x0f,0x0e,0x0d,0x0c,0x0f,0x0e,0x0d,0x0c,0x0f,0x0e,0x0d
+.byte	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
+Lconsts:
+	mflr	0
+	bcl	20,31,$+4
+	mflr	6
+	addi	6,6,-0x48
+	mtlr	0
+	blr	
+.long	0
+.byte	0,12,0x14,0,0,0,0,0
+.byte	65,69,83,32,102,111,114,32,80,111,119,101,114,73,83,65,32,50,46,48,55,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
+
+.globl	aes_hw_set_encrypt_key
+.align	5
+aes_hw_set_encrypt_key:
+Lset_encrypt_key:
+	mflr	11
+	std	11,16(1)
+
+	li	6,-1
+	cmpldi	3,0
+	beq-	Lenc_key_abort
+	cmpldi	5,0
+	beq-	Lenc_key_abort
+	li	6,-2
+	cmpwi	4,128
+	blt-	Lenc_key_abort
+	cmpwi	4,256
+	bgt-	Lenc_key_abort
+	andi.	0,4,0x3f
+	bne-	Lenc_key_abort
+
+	lis	0,0xfff0
+	mfspr	12,256
+	mtspr	256,0
+
+	bl	Lconsts
+	mtlr	11
+
+	neg	9,3
+	lvx	1,0,3
+	addi	3,3,15
+	lvsr	3,0,9
+	li	8,0x20
+	cmpwi	4,192
+	lvx	2,0,3
+	vspltisb	5,0x0f
+	lvx	4,0,6
+	vxor	3,3,5
+	lvx	5,8,6
+	addi	6,6,0x10
+	vperm	1,1,2,3
+	li	7,8
+	vxor	0,0,0
+	mtctr	7
+
+	lvsl	8,0,5
+	vspltisb	9,-1
+	lvx	10,0,5
+	vperm	9,9,0,8
+
+	blt	Loop128
+	addi	3,3,8
+	beq	L192
+	addi	3,3,8
+	b	L256
+
+.align	4
+Loop128:
+	vperm	3,1,1,5
+	vsldoi	6,0,1,12
+	vperm	11,1,1,8
+	vsel	7,10,11,9
+	vor	10,11,11
+	.long	0x10632509
+	stvx	7,0,5
+	addi	5,5,16
+
+	vxor	1,1,6
+	vsldoi	6,0,6,12
+	vxor	1,1,6
+	vsldoi	6,0,6,12
+	vxor	1,1,6
+	vadduwm	4,4,4
+	vxor	1,1,3
+	bc	16,0,Loop128
+
+	lvx	4,0,6
+
+	vperm	3,1,1,5
+	vsldoi	6,0,1,12
+	vperm	11,1,1,8
+	vsel	7,10,11,9
+	vor	10,11,11
+	.long	0x10632509
+	stvx	7,0,5
+	addi	5,5,16
+
+	vxor	1,1,6
+	vsldoi	6,0,6,12
+	vxor	1,1,6
+	vsldoi	6,0,6,12
+	vxor	1,1,6
+	vadduwm	4,4,4
+	vxor	1,1,3
+
+	vperm	3,1,1,5
+	vsldoi	6,0,1,12
+	vperm	11,1,1,8
+	vsel	7,10,11,9
+	vor	10,11,11
+	.long	0x10632509
+	stvx	7,0,5
+	addi	5,5,16
+
+	vxor	1,1,6
+	vsldoi	6,0,6,12
+	vxor	1,1,6
+	vsldoi	6,0,6,12
+	vxor	1,1,6
+	vxor	1,1,3
+	vperm	11,1,1,8
+	vsel	7,10,11,9
+	vor	10,11,11
+	stvx	7,0,5
+
+	addi	3,5,15
+	addi	5,5,0x50
+
+	li	8,10
+	b	Ldone
+
+.align	4
+L192:
+	lvx	6,0,3
+	li	7,4
+	vperm	11,1,1,8
+	vsel	7,10,11,9
+	vor	10,11,11
+	stvx	7,0,5
+	addi	5,5,16
+	vperm	2,2,6,3
+	vspltisb	3,8
+	mtctr	7
+	vsububm	5,5,3
+
+Loop192:
+	vperm	3,2,2,5
+	vsldoi	6,0,1,12
+	.long	0x10632509
+
+	vxor	1,1,6
+	vsldoi	6,0,6,12
+	vxor	1,1,6
+	vsldoi	6,0,6,12
+	vxor	1,1,6
+
+	vsldoi	7,0,2,8
+	vspltw	6,1,3
+	vxor	6,6,2
+	vsldoi	2,0,2,12
+	vadduwm	4,4,4
+	vxor	2,2,6
+	vxor	1,1,3
+	vxor	2,2,3
+	vsldoi	7,7,1,8
+
+	vperm	3,2,2,5
+	vsldoi	6,0,1,12
+	vperm	11,7,7,8
+	vsel	7,10,11,9
+	vor	10,11,11
+	.long	0x10632509
+	stvx	7,0,5
+	addi	5,5,16
+
+	vsldoi	7,1,2,8
+	vxor	1,1,6
+	vsldoi	6,0,6,12
+	vperm	11,7,7,8
+	vsel	7,10,11,9
+	vor	10,11,11
+	vxor	1,1,6
+	vsldoi	6,0,6,12
+	vxor	1,1,6
+	stvx	7,0,5
+	addi	5,5,16
+
+	vspltw	6,1,3
+	vxor	6,6,2
+	vsldoi	2,0,2,12
+	vadduwm	4,4,4
+	vxor	2,2,6
+	vxor	1,1,3
+	vxor	2,2,3
+	vperm	11,1,1,8
+	vsel	7,10,11,9
+	vor	10,11,11
+	stvx	7,0,5
+	addi	3,5,15
+	addi	5,5,16
+	bc	16,0,Loop192
+
+	li	8,12
+	addi	5,5,0x20
+	b	Ldone
+
+.align	4
+L256:
+	lvx	6,0,3
+	li	7,7
+	li	8,14
+	vperm	11,1,1,8
+	vsel	7,10,11,9
+	vor	10,11,11
+	stvx	7,0,5
+	addi	5,5,16
+	vperm	2,2,6,3
+	mtctr	7
+
+Loop256:
+	vperm	3,2,2,5
+	vsldoi	6,0,1,12
+	vperm	11,2,2,8
+	vsel	7,10,11,9
+	vor	10,11,11
+	.long	0x10632509
+	stvx	7,0,5
+	addi	5,5,16
+
+	vxor	1,1,6
+	vsldoi	6,0,6,12
+	vxor	1,1,6
+	vsldoi	6,0,6,12
+	vxor	1,1,6
+	vadduwm	4,4,4
+	vxor	1,1,3
+	vperm	11,1,1,8
+	vsel	7,10,11,9
+	vor	10,11,11
+	stvx	7,0,5
+	addi	3,5,15
+	addi	5,5,16
+	bdz	Ldone
+
+	vspltw	3,1,3
+	vsldoi	6,0,2,12
+	.long	0x106305C8
+
+	vxor	2,2,6
+	vsldoi	6,0,6,12
+	vxor	2,2,6
+	vsldoi	6,0,6,12
+	vxor	2,2,6
+
+	vxor	2,2,3
+	b	Loop256
+
+.align	4
+Ldone:
+	lvx	2,0,3
+	vsel	2,10,2,9
+	stvx	2,0,3
+	li	6,0
+	mtspr	256,12
+	stw	8,0(5)
+
+Lenc_key_abort:
+	mr	3,6
+	blr	
+.long	0
+.byte	0,12,0x14,1,0,0,3,0
+.long	0
+
+
+.globl	aes_hw_set_decrypt_key
+.align	5
+aes_hw_set_decrypt_key:
+	stdu	1,-64(1)
+	mflr	10
+	std	10,64+16(1)
+	bl	Lset_encrypt_key
+	mtlr	10
+
+	cmpwi	3,0
+	bne-	Ldec_key_abort
+
+	slwi	7,8,4
+	subi	3,5,240
+	srwi	8,8,1
+	add	5,3,7
+	mtctr	8
+
+Ldeckey:
+	lwz	0, 0(3)
+	lwz	6, 4(3)
+	lwz	7, 8(3)
+	lwz	8, 12(3)
+	addi	3,3,16
+	lwz	9, 0(5)
+	lwz	10,4(5)
+	lwz	11,8(5)
+	lwz	12,12(5)
+	stw	0, 0(5)
+	stw	6, 4(5)
+	stw	7, 8(5)
+	stw	8, 12(5)
+	subi	5,5,16
+	stw	9, -16(3)
+	stw	10,-12(3)
+	stw	11,-8(3)
+	stw	12,-4(3)
+	bc	16,0,Ldeckey
+
+	xor	3,3,3
+Ldec_key_abort:
+	addi	1,1,64
+	blr	
+.long	0
+.byte	0,12,4,1,0x80,0,3,0
+.long	0
+
+.globl	aes_hw_encrypt
+.align	5
+aes_hw_encrypt:
+	lwz	6,240(5)
+	lis	0,0xfc00
+	mfspr	12,256
+	li	7,15
+	mtspr	256,0
+
+	lvx	0,0,3
+	neg	11,4
+	lvx	1,7,3
+	lvsl	2,0,3
+	vspltisb	4,0x0f
+	lvsr	3,0,11
+	vxor	2,2,4
+	li	7,16
+	vperm	0,0,1,2
+	lvx	1,0,5
+	lvsr	5,0,5
+	srwi	6,6,1
+	lvx	2,7,5
+	addi	7,7,16
+	subi	6,6,1
+	vperm	1,2,1,5
+
+	vxor	0,0,1
+	lvx	1,7,5
+	addi	7,7,16
+	mtctr	6
+
+Loop_enc:
+	vperm	2,1,2,5
+	.long	0x10001508
+	lvx	2,7,5
+	addi	7,7,16
+	vperm	1,2,1,5
+	.long	0x10000D08
+	lvx	1,7,5
+	addi	7,7,16
+	bc	16,0,Loop_enc
+
+	vperm	2,1,2,5
+	.long	0x10001508
+	lvx	2,7,5
+	vperm	1,2,1,5
+	.long	0x10000D09
+
+	vspltisb	2,-1
+	vxor	1,1,1
+	li	7,15
+	vperm	2,2,1,3
+	vxor	3,3,4
+	lvx	1,0,4
+	vperm	0,0,0,3
+	vsel	1,1,0,2
+	lvx	4,7,4
+	stvx	1,0,4
+	vsel	0,0,4,2
+	stvx	0,7,4
+
+	mtspr	256,12
+	blr	
+.long	0
+.byte	0,12,0x14,0,0,0,3,0
+.long	0
+
+.globl	aes_hw_decrypt
+.align	5
+aes_hw_decrypt:
+	lwz	6,240(5)
+	lis	0,0xfc00
+	mfspr	12,256
+	li	7,15
+	mtspr	256,0
+
+	lvx	0,0,3
+	neg	11,4
+	lvx	1,7,3
+	lvsl	2,0,3
+	vspltisb	4,0x0f
+	lvsr	3,0,11
+	vxor	2,2,4
+	li	7,16
+	vperm	0,0,1,2
+	lvx	1,0,5
+	lvsr	5,0,5
+	srwi	6,6,1
+	lvx	2,7,5
+	addi	7,7,16
+	subi	6,6,1
+	vperm	1,2,1,5
+
+	vxor	0,0,1
+	lvx	1,7,5
+	addi	7,7,16
+	mtctr	6
+
+Loop_dec:
+	vperm	2,1,2,5
+	.long	0x10001548
+	lvx	2,7,5
+	addi	7,7,16
+	vperm	1,2,1,5
+	.long	0x10000D48
+	lvx	1,7,5
+	addi	7,7,16
+	bc	16,0,Loop_dec
+
+	vperm	2,1,2,5
+	.long	0x10001548
+	lvx	2,7,5
+	vperm	1,2,1,5
+	.long	0x10000D49
+
+	vspltisb	2,-1
+	vxor	1,1,1
+	li	7,15
+	vperm	2,2,1,3
+	vxor	3,3,4
+	lvx	1,0,4
+	vperm	0,0,0,3
+	vsel	1,1,0,2
+	lvx	4,7,4
+	stvx	1,0,4
+	vsel	0,0,4,2
+	stvx	0,7,4
+
+	mtspr	256,12
+	blr	
+.long	0
+.byte	0,12,0x14,0,0,0,3,0
+.long	0
+
+.globl	aes_hw_cbc_encrypt
+.align	5
+aes_hw_cbc_encrypt:
+	cmpldi	5,16
+	bclr	14,0
+
+	cmpwi	8,0
+	lis	0,0xffe0
+	mfspr	12,256
+	mtspr	256,0
+
+	li	10,15
+	vxor	0,0,0
+	vspltisb	3,0x0f
+
+	lvx	4,0,7
+	lvsl	6,0,7
+	lvx	5,10,7
+	vxor	6,6,3
+	vperm	4,4,5,6
+
+	neg	11,3
+	lvsr	10,0,6
+	lwz	9,240(6)
+
+	lvsr	6,0,11
+	lvx	5,0,3
+	addi	3,3,15
+	vxor	6,6,3
+
+	lvsl	8,0,4
+	vspltisb	9,-1
+	lvx	7,0,4
+	vperm	9,9,0,8
+	vxor	8,8,3
+
+	srwi	9,9,1
+	li	10,16
+	subi	9,9,1
+	beq	Lcbc_dec
+
+Lcbc_enc:
+	vor	2,5,5
+	lvx	5,0,3
+	addi	3,3,16
+	mtctr	9
+	subi	5,5,16
+
+	lvx	0,0,6
+	vperm	2,2,5,6
+	lvx	1,10,6
+	addi	10,10,16
+	vperm	0,1,0,10
+	vxor	2,2,0
+	lvx	0,10,6
+	addi	10,10,16
+	vxor	2,2,4
+
+Loop_cbc_enc:
+	vperm	1,0,1,10
+	.long	0x10420D08
+	lvx	1,10,6
+	addi	10,10,16
+	vperm	0,1,0,10
+	.long	0x10420508
+	lvx	0,10,6
+	addi	10,10,16
+	bc	16,0,Loop_cbc_enc
+
+	vperm	1,0,1,10
+	.long	0x10420D08
+	lvx	1,10,6
+	li	10,16
+	vperm	0,1,0,10
+	.long	0x10820509
+	cmpldi	5,16
+
+	vperm	3,4,4,8
+	vsel	2,7,3,9
+	vor	7,3,3
+	stvx	2,0,4
+	addi	4,4,16
+	bge	Lcbc_enc
+
+	b	Lcbc_done
+
+.align	4
+Lcbc_dec:
+	cmpldi	5,128
+	bge	_aesp8_cbc_decrypt8x
+	vor	3,5,5
+	lvx	5,0,3
+	addi	3,3,16
+	mtctr	9
+	subi	5,5,16
+
+	lvx	0,0,6
+	vperm	3,3,5,6
+	lvx	1,10,6
+	addi	10,10,16
+	vperm	0,1,0,10
+	vxor	2,3,0
+	lvx	0,10,6
+	addi	10,10,16
+
+Loop_cbc_dec:
+	vperm	1,0,1,10
+	.long	0x10420D48
+	lvx	1,10,6
+	addi	10,10,16
+	vperm	0,1,0,10
+	.long	0x10420548
+	lvx	0,10,6
+	addi	10,10,16
+	bc	16,0,Loop_cbc_dec
+
+	vperm	1,0,1,10
+	.long	0x10420D48
+	lvx	1,10,6
+	li	10,16
+	vperm	0,1,0,10
+	.long	0x10420549
+	cmpldi	5,16
+
+	vxor	2,2,4
+	vor	4,3,3
+	vperm	3,2,2,8
+	vsel	2,7,3,9
+	vor	7,3,3
+	stvx	2,0,4
+	addi	4,4,16
+	bge	Lcbc_dec
+
+Lcbc_done:
+	addi	4,4,-1
+	lvx	2,0,4
+	vsel	2,7,2,9
+	stvx	2,0,4
+
+	neg	8,7
+	li	10,15
+	vxor	0,0,0
+	vspltisb	9,-1
+	vspltisb	3,0x0f
+	lvsr	8,0,8
+	vperm	9,9,0,8
+	vxor	8,8,3
+	lvx	7,0,7
+	vperm	4,4,4,8
+	vsel	2,7,4,9
+	lvx	5,10,7
+	stvx	2,0,7
+	vsel	2,4,5,9
+	stvx	2,10,7
+
+	mtspr	256,12
+	blr	
+.long	0
+.byte	0,12,0x14,0,0,0,6,0
+.long	0
+.align	5
+_aesp8_cbc_decrypt8x:
+	stdu	1,-448(1)
+	li	10,207
+	li	11,223
+	stvx	20,10,1
+	addi	10,10,32
+	stvx	21,11,1
+	addi	11,11,32
+	stvx	22,10,1
+	addi	10,10,32
+	stvx	23,11,1
+	addi	11,11,32
+	stvx	24,10,1
+	addi	10,10,32
+	stvx	25,11,1
+	addi	11,11,32
+	stvx	26,10,1
+	addi	10,10,32
+	stvx	27,11,1
+	addi	11,11,32
+	stvx	28,10,1
+	addi	10,10,32
+	stvx	29,11,1
+	addi	11,11,32
+	stvx	30,10,1
+	stvx	31,11,1
+	li	0,-1
+	stw	12,396(1)
+	li	8,0x10
+	std	26,400(1)
+	li	26,0x20
+	std	27,408(1)
+	li	27,0x30
+	std	28,416(1)
+	li	28,0x40
+	std	29,424(1)
+	li	29,0x50
+	std	30,432(1)
+	li	30,0x60
+	std	31,440(1)
+	li	31,0x70
+	mtspr	256,0
+
+	subi	9,9,3
+	subi	5,5,128
+
+	lvx	23,0,6
+	lvx	30,8,6
+	addi	6,6,0x20
+	lvx	31,0,6
+	vperm	23,30,23,10
+	addi	11,1,64+15
+	mtctr	9
+
+Load_cbc_dec_key:
+	vperm	24,31,30,10
+	lvx	30,8,6
+	addi	6,6,0x20
+	stvx	24,0,11
+	vperm	25,30,31,10
+	lvx	31,0,6
+	stvx	25,8,11
+	addi	11,11,0x20
+	bc	16,0,Load_cbc_dec_key
+
+	lvx	26,8,6
+	vperm	24,31,30,10
+	lvx	27,26,6
+	stvx	24,0,11
+	vperm	25,26,31,10
+	lvx	28,27,6
+	stvx	25,8,11
+	addi	11,1,64+15
+	vperm	26,27,26,10
+	lvx	29,28,6
+	vperm	27,28,27,10
+	lvx	30,29,6
+	vperm	28,29,28,10
+	lvx	31,30,6
+	vperm	29,30,29,10
+	lvx	14,31,6
+	vperm	30,31,30,10
+	lvx	24,0,11
+	vperm	31,14,31,10
+	lvx	25,8,11
+
+
+
+	subi	3,3,15
+
+	li	10,8
+	.long	0x7C001E99
+	lvsl	6,0,10
+	vspltisb	3,0x0f
+	.long	0x7C281E99
+	vxor	6,6,3
+	.long	0x7C5A1E99
+	vperm	0,0,0,6
+	.long	0x7C7B1E99
+	vperm	1,1,1,6
+	.long	0x7D5C1E99
+	vperm	2,2,2,6
+	vxor	14,0,23
+	.long	0x7D7D1E99
+	vperm	3,3,3,6
+	vxor	15,1,23
+	.long	0x7D9E1E99
+	vperm	10,10,10,6
+	vxor	16,2,23
+	.long	0x7DBF1E99
+	addi	3,3,0x80
+	vperm	11,11,11,6
+	vxor	17,3,23
+	vperm	12,12,12,6
+	vxor	18,10,23
+	vperm	13,13,13,6
+	vxor	19,11,23
+	vxor	20,12,23
+	vxor	21,13,23
+
+	mtctr	9
+	b	Loop_cbc_dec8x
+.align	5
+Loop_cbc_dec8x:
+	.long	0x11CEC548
+	.long	0x11EFC548
+	.long	0x1210C548
+	.long	0x1231C548
+	.long	0x1252C548
+	.long	0x1273C548
+	.long	0x1294C548
+	.long	0x12B5C548
+	lvx	24,26,11
+	addi	11,11,0x20
+
+	.long	0x11CECD48
+	.long	0x11EFCD48
+	.long	0x1210CD48
+	.long	0x1231CD48
+	.long	0x1252CD48
+	.long	0x1273CD48
+	.long	0x1294CD48
+	.long	0x12B5CD48
+	lvx	25,8,11
+	bc	16,0,Loop_cbc_dec8x
+
+	subic	5,5,128
+	.long	0x11CEC548
+	.long	0x11EFC548
+	.long	0x1210C548
+	.long	0x1231C548
+	.long	0x1252C548
+	.long	0x1273C548
+	.long	0x1294C548
+	.long	0x12B5C548
+
+	subfe.	0,0,0
+	.long	0x11CECD48
+	.long	0x11EFCD48
+	.long	0x1210CD48
+	.long	0x1231CD48
+	.long	0x1252CD48
+	.long	0x1273CD48
+	.long	0x1294CD48
+	.long	0x12B5CD48
+
+	and	0,0,5
+	.long	0x11CED548
+	.long	0x11EFD548
+	.long	0x1210D548
+	.long	0x1231D548
+	.long	0x1252D548
+	.long	0x1273D548
+	.long	0x1294D548
+	.long	0x12B5D548
+
+	add	3,3,0
+
+
+
+	.long	0x11CEDD48
+	.long	0x11EFDD48
+	.long	0x1210DD48
+	.long	0x1231DD48
+	.long	0x1252DD48
+	.long	0x1273DD48
+	.long	0x1294DD48
+	.long	0x12B5DD48
+
+	addi	11,1,64+15
+	.long	0x11CEE548
+	.long	0x11EFE548
+	.long	0x1210E548
+	.long	0x1231E548
+	.long	0x1252E548
+	.long	0x1273E548
+	.long	0x1294E548
+	.long	0x12B5E548
+	lvx	24,0,11
+
+	.long	0x11CEED48
+	.long	0x11EFED48
+	.long	0x1210ED48
+	.long	0x1231ED48
+	.long	0x1252ED48
+	.long	0x1273ED48
+	.long	0x1294ED48
+	.long	0x12B5ED48
+	lvx	25,8,11
+
+	.long	0x11CEF548
+	vxor	4,4,31
+	.long	0x11EFF548
+	vxor	0,0,31
+	.long	0x1210F548
+	vxor	1,1,31
+	.long	0x1231F548
+	vxor	2,2,31
+	.long	0x1252F548
+	vxor	3,3,31
+	.long	0x1273F548
+	vxor	10,10,31
+	.long	0x1294F548
+	vxor	11,11,31
+	.long	0x12B5F548
+	vxor	12,12,31
+
+	.long	0x11CE2549
+	.long	0x11EF0549
+	.long	0x7C001E99
+	.long	0x12100D49
+	.long	0x7C281E99
+	.long	0x12311549
+	vperm	0,0,0,6
+	.long	0x7C5A1E99
+	.long	0x12521D49
+	vperm	1,1,1,6
+	.long	0x7C7B1E99
+	.long	0x12735549
+	vperm	2,2,2,6
+	.long	0x7D5C1E99
+	.long	0x12945D49
+	vperm	3,3,3,6
+	.long	0x7D7D1E99
+	.long	0x12B56549
+	vperm	10,10,10,6
+	.long	0x7D9E1E99
+	vor	4,13,13
+	vperm	11,11,11,6
+	.long	0x7DBF1E99
+	addi	3,3,0x80
+
+	vperm	14,14,14,6
+	vperm	15,15,15,6
+	.long	0x7DC02799
+	vperm	12,12,12,6
+	vxor	14,0,23
+	vperm	16,16,16,6
+	.long	0x7DE82799
+	vperm	13,13,13,6
+	vxor	15,1,23
+	vperm	17,17,17,6
+	.long	0x7E1A2799
+	vxor	16,2,23
+	vperm	18,18,18,6
+	.long	0x7E3B2799
+	vxor	17,3,23
+	vperm	19,19,19,6
+	.long	0x7E5C2799
+	vxor	18,10,23
+	vperm	20,20,20,6
+	.long	0x7E7D2799
+	vxor	19,11,23
+	vperm	21,21,21,6
+	.long	0x7E9E2799
+	vxor	20,12,23
+	.long	0x7EBF2799
+	addi	4,4,0x80
+	vxor	21,13,23
+
+	mtctr	9
+	beq	Loop_cbc_dec8x
+
+	addic.	5,5,128
+	beq	Lcbc_dec8x_done
+	nop	
+	nop	
+
+Loop_cbc_dec8x_tail:
+	.long	0x11EFC548
+	.long	0x1210C548
+	.long	0x1231C548
+	.long	0x1252C548
+	.long	0x1273C548
+	.long	0x1294C548
+	.long	0x12B5C548
+	lvx	24,26,11
+	addi	11,11,0x20
+
+	.long	0x11EFCD48
+	.long	0x1210CD48
+	.long	0x1231CD48
+	.long	0x1252CD48
+	.long	0x1273CD48
+	.long	0x1294CD48
+	.long	0x12B5CD48
+	lvx	25,8,11
+	bc	16,0,Loop_cbc_dec8x_tail
+
+	.long	0x11EFC548
+	.long	0x1210C548
+	.long	0x1231C548
+	.long	0x1252C548
+	.long	0x1273C548
+	.long	0x1294C548
+	.long	0x12B5C548
+
+	.long	0x11EFCD48
+	.long	0x1210CD48
+	.long	0x1231CD48
+	.long	0x1252CD48
+	.long	0x1273CD48
+	.long	0x1294CD48
+	.long	0x12B5CD48
+
+	.long	0x11EFD548
+	.long	0x1210D548
+	.long	0x1231D548
+	.long	0x1252D548
+	.long	0x1273D548
+	.long	0x1294D548
+	.long	0x12B5D548
+
+	.long	0x11EFDD48
+	.long	0x1210DD48
+	.long	0x1231DD48
+	.long	0x1252DD48
+	.long	0x1273DD48
+	.long	0x1294DD48
+	.long	0x12B5DD48
+
+	.long	0x11EFE548
+	.long	0x1210E548
+	.long	0x1231E548
+	.long	0x1252E548
+	.long	0x1273E548
+	.long	0x1294E548
+	.long	0x12B5E548
+
+	.long	0x11EFED48
+	.long	0x1210ED48
+	.long	0x1231ED48
+	.long	0x1252ED48
+	.long	0x1273ED48
+	.long	0x1294ED48
+	.long	0x12B5ED48
+
+	.long	0x11EFF548
+	vxor	4,4,31
+	.long	0x1210F548
+	vxor	1,1,31
+	.long	0x1231F548
+	vxor	2,2,31
+	.long	0x1252F548
+	vxor	3,3,31
+	.long	0x1273F548
+	vxor	10,10,31
+	.long	0x1294F548
+	vxor	11,11,31
+	.long	0x12B5F548
+	vxor	12,12,31
+
+	cmplwi	5,32
+	blt	Lcbc_dec8x_one
+	nop	
+	beq	Lcbc_dec8x_two
+	cmplwi	5,64
+	blt	Lcbc_dec8x_three
+	nop	
+	beq	Lcbc_dec8x_four
+	cmplwi	5,96
+	blt	Lcbc_dec8x_five
+	nop	
+	beq	Lcbc_dec8x_six
+
+Lcbc_dec8x_seven:
+	.long	0x11EF2549
+	.long	0x12100D49
+	.long	0x12311549
+	.long	0x12521D49
+	.long	0x12735549
+	.long	0x12945D49
+	.long	0x12B56549
+	vor	4,13,13
+
+	vperm	15,15,15,6
+	vperm	16,16,16,6
+	.long	0x7DE02799
+	vperm	17,17,17,6
+	.long	0x7E082799
+	vperm	18,18,18,6
+	.long	0x7E3A2799
+	vperm	19,19,19,6
+	.long	0x7E5B2799
+	vperm	20,20,20,6
+	.long	0x7E7C2799
+	vperm	21,21,21,6
+	.long	0x7E9D2799
+	.long	0x7EBE2799
+	addi	4,4,0x70
+	b	Lcbc_dec8x_done
+
+.align	5
+Lcbc_dec8x_six:
+	.long	0x12102549
+	.long	0x12311549
+	.long	0x12521D49
+	.long	0x12735549
+	.long	0x12945D49
+	.long	0x12B56549
+	vor	4,13,13
+
+	vperm	16,16,16,6
+	vperm	17,17,17,6
+	.long	0x7E002799
+	vperm	18,18,18,6
+	.long	0x7E282799
+	vperm	19,19,19,6
+	.long	0x7E5A2799
+	vperm	20,20,20,6
+	.long	0x7E7B2799
+	vperm	21,21,21,6
+	.long	0x7E9C2799
+	.long	0x7EBD2799
+	addi	4,4,0x60
+	b	Lcbc_dec8x_done
+
+.align	5
+Lcbc_dec8x_five:
+	.long	0x12312549
+	.long	0x12521D49
+	.long	0x12735549
+	.long	0x12945D49
+	.long	0x12B56549
+	vor	4,13,13
+
+	vperm	17,17,17,6
+	vperm	18,18,18,6
+	.long	0x7E202799
+	vperm	19,19,19,6
+	.long	0x7E482799
+	vperm	20,20,20,6
+	.long	0x7E7A2799
+	vperm	21,21,21,6
+	.long	0x7E9B2799
+	.long	0x7EBC2799
+	addi	4,4,0x50
+	b	Lcbc_dec8x_done
+
+.align	5
+Lcbc_dec8x_four:
+	.long	0x12522549
+	.long	0x12735549
+	.long	0x12945D49
+	.long	0x12B56549
+	vor	4,13,13
+
+	vperm	18,18,18,6
+	vperm	19,19,19,6
+	.long	0x7E402799
+	vperm	20,20,20,6
+	.long	0x7E682799
+	vperm	21,21,21,6
+	.long	0x7E9A2799
+	.long	0x7EBB2799
+	addi	4,4,0x40
+	b	Lcbc_dec8x_done
+
+.align	5
+Lcbc_dec8x_three:
+	.long	0x12732549
+	.long	0x12945D49
+	.long	0x12B56549
+	vor	4,13,13
+
+	vperm	19,19,19,6
+	vperm	20,20,20,6
+	.long	0x7E602799
+	vperm	21,21,21,6
+	.long	0x7E882799
+	.long	0x7EBA2799
+	addi	4,4,0x30
+	b	Lcbc_dec8x_done
+
+.align	5
+Lcbc_dec8x_two:
+	.long	0x12942549
+	.long	0x12B56549
+	vor	4,13,13
+
+	vperm	20,20,20,6
+	vperm	21,21,21,6
+	.long	0x7E802799
+	.long	0x7EA82799
+	addi	4,4,0x20
+	b	Lcbc_dec8x_done
+
+.align	5
+Lcbc_dec8x_one:
+	.long	0x12B52549
+	vor	4,13,13
+
+	vperm	21,21,21,6
+	.long	0x7EA02799
+	addi	4,4,0x10
+
+Lcbc_dec8x_done:
+	vperm	4,4,4,6
+	.long	0x7C803F99
+
+	li	10,79
+	li	11,95
+	stvx	6,10,1
+	addi	10,10,32
+	stvx	6,11,1
+	addi	11,11,32
+	stvx	6,10,1
+	addi	10,10,32
+	stvx	6,11,1
+	addi	11,11,32
+	stvx	6,10,1
+	addi	10,10,32
+	stvx	6,11,1
+	addi	11,11,32
+	stvx	6,10,1
+	addi	10,10,32
+	stvx	6,11,1
+	addi	11,11,32
+
+	mtspr	256,12
+	lvx	20,10,1
+	addi	10,10,32
+	lvx	21,11,1
+	addi	11,11,32
+	lvx	22,10,1
+	addi	10,10,32
+	lvx	23,11,1
+	addi	11,11,32
+	lvx	24,10,1
+	addi	10,10,32
+	lvx	25,11,1
+	addi	11,11,32
+	lvx	26,10,1
+	addi	10,10,32
+	lvx	27,11,1
+	addi	11,11,32
+	lvx	28,10,1
+	addi	10,10,32
+	lvx	29,11,1
+	addi	11,11,32
+	lvx	30,10,1
+	lvx	31,11,1
+	ld	26,400(1)
+	ld	27,408(1)
+	ld	28,416(1)
+	ld	29,424(1)
+	ld	30,432(1)
+	ld	31,440(1)
+	addi	1,1,448
+	blr	
+.long	0
+.byte	0,12,0x04,0,0x80,6,6,0
+.long	0
+
+.globl	aes_hw_ctr32_encrypt_blocks
+.align	5
+aes_hw_ctr32_encrypt_blocks:
+	cmpldi	5,1
+	bclr	14,0
+
+	lis	0,0xfff0
+	mfspr	12,256
+	mtspr	256,0
+
+	li	10,15
+	vxor	0,0,0
+	vspltisb	3,0x0f
+
+	lvx	4,0,7
+	lvsl	6,0,7
+	lvx	5,10,7
+	vspltisb	11,1
+	vxor	6,6,3
+	vperm	4,4,5,6
+	vsldoi	11,0,11,1
+
+	neg	11,3
+	lvsr	10,0,6
+	lwz	9,240(6)
+
+	lvsr	6,0,11
+	lvx	5,0,3
+	addi	3,3,15
+	vxor	6,6,3
+
+	srwi	9,9,1
+	li	10,16
+	subi	9,9,1
+
+	cmpldi	5,8
+	bge	_aesp8_ctr32_encrypt8x
+
+	lvsl	8,0,4
+	vspltisb	9,-1
+	lvx	7,0,4
+	vperm	9,9,0,8
+	vxor	8,8,3
+
+	lvx	0,0,6
+	mtctr	9
+	lvx	1,10,6
+	addi	10,10,16
+	vperm	0,1,0,10
+	vxor	2,4,0
+	lvx	0,10,6
+	addi	10,10,16
+	b	Loop_ctr32_enc
+
+.align	5
+Loop_ctr32_enc:
+	vperm	1,0,1,10
+	.long	0x10420D08
+	lvx	1,10,6
+	addi	10,10,16
+	vperm	0,1,0,10
+	.long	0x10420508
+	lvx	0,10,6
+	addi	10,10,16
+	bc	16,0,Loop_ctr32_enc
+
+	vadduwm	4,4,11
+	vor	3,5,5
+	lvx	5,0,3
+	addi	3,3,16
+	subic.	5,5,1
+
+	vperm	1,0,1,10
+	.long	0x10420D08
+	lvx	1,10,6
+	vperm	3,3,5,6
+	li	10,16
+	vperm	1,1,0,10
+	lvx	0,0,6
+	vxor	3,3,1
+	.long	0x10421D09
+
+	lvx	1,10,6
+	addi	10,10,16
+	vperm	2,2,2,8
+	vsel	3,7,2,9
+	mtctr	9
+	vperm	0,1,0,10
+	vor	7,2,2
+	vxor	2,4,0
+	lvx	0,10,6
+	addi	10,10,16
+	stvx	3,0,4
+	addi	4,4,16
+	bne	Loop_ctr32_enc
+
+	addi	4,4,-1
+	lvx	2,0,4
+	vsel	2,7,2,9
+	stvx	2,0,4
+
+	mtspr	256,12
+	blr	
+.long	0
+.byte	0,12,0x14,0,0,0,6,0
+.long	0
+.align	5
+_aesp8_ctr32_encrypt8x:
+	stdu	1,-448(1)
+	li	10,207
+	li	11,223
+	stvx	20,10,1
+	addi	10,10,32
+	stvx	21,11,1
+	addi	11,11,32
+	stvx	22,10,1
+	addi	10,10,32
+	stvx	23,11,1
+	addi	11,11,32
+	stvx	24,10,1
+	addi	10,10,32
+	stvx	25,11,1
+	addi	11,11,32
+	stvx	26,10,1
+	addi	10,10,32
+	stvx	27,11,1
+	addi	11,11,32
+	stvx	28,10,1
+	addi	10,10,32
+	stvx	29,11,1
+	addi	11,11,32
+	stvx	30,10,1
+	stvx	31,11,1
+	li	0,-1
+	stw	12,396(1)
+	li	8,0x10
+	std	26,400(1)
+	li	26,0x20
+	std	27,408(1)
+	li	27,0x30
+	std	28,416(1)
+	li	28,0x40
+	std	29,424(1)
+	li	29,0x50
+	std	30,432(1)
+	li	30,0x60
+	std	31,440(1)
+	li	31,0x70
+	mtspr	256,0
+
+	subi	9,9,3
+
+	lvx	23,0,6
+	lvx	30,8,6
+	addi	6,6,0x20
+	lvx	31,0,6
+	vperm	23,30,23,10
+	addi	11,1,64+15
+	mtctr	9
+
+Load_ctr32_enc_key:
+	vperm	24,31,30,10
+	lvx	30,8,6
+	addi	6,6,0x20
+	stvx	24,0,11
+	vperm	25,30,31,10
+	lvx	31,0,6
+	stvx	25,8,11
+	addi	11,11,0x20
+	bc	16,0,Load_ctr32_enc_key
+
+	lvx	26,8,6
+	vperm	24,31,30,10
+	lvx	27,26,6
+	stvx	24,0,11
+	vperm	25,26,31,10
+	lvx	28,27,6
+	stvx	25,8,11
+	addi	11,1,64+15
+	vperm	26,27,26,10
+	lvx	29,28,6
+	vperm	27,28,27,10
+	lvx	30,29,6
+	vperm	28,29,28,10
+	lvx	31,30,6
+	vperm	29,30,29,10
+	lvx	15,31,6
+	vperm	30,31,30,10
+	lvx	24,0,11
+	vperm	31,15,31,10
+	lvx	25,8,11
+
+	vadduwm	7,11,11
+	subi	3,3,15
+	sldi	5,5,4
+
+	vadduwm	16,4,11
+	vadduwm	17,4,7
+	vxor	15,4,23
+	li	10,8
+	vadduwm	18,16,7
+	vxor	16,16,23
+	lvsl	6,0,10
+	vadduwm	19,17,7
+	vxor	17,17,23
+	vspltisb	3,0x0f
+	vadduwm	20,18,7
+	vxor	18,18,23
+	vxor	6,6,3
+	vadduwm	21,19,7
+	vxor	19,19,23
+	vadduwm	22,20,7
+	vxor	20,20,23
+	vadduwm	4,21,7
+	vxor	21,21,23
+	vxor	22,22,23
+
+	mtctr	9
+	b	Loop_ctr32_enc8x
+.align	5
+Loop_ctr32_enc8x:
+	.long	0x11EFC508
+	.long	0x1210C508
+	.long	0x1231C508
+	.long	0x1252C508
+	.long	0x1273C508
+	.long	0x1294C508
+	.long	0x12B5C508
+	.long	0x12D6C508
+Loop_ctr32_enc8x_middle:
+	lvx	24,26,11
+	addi	11,11,0x20
+
+	.long	0x11EFCD08
+	.long	0x1210CD08
+	.long	0x1231CD08
+	.long	0x1252CD08
+	.long	0x1273CD08
+	.long	0x1294CD08
+	.long	0x12B5CD08
+	.long	0x12D6CD08
+	lvx	25,8,11
+	bc	16,0,Loop_ctr32_enc8x
+
+	subic	11,5,256
+	.long	0x11EFC508
+	.long	0x1210C508
+	.long	0x1231C508
+	.long	0x1252C508
+	.long	0x1273C508
+	.long	0x1294C508
+	.long	0x12B5C508
+	.long	0x12D6C508
+
+	subfe	0,0,0
+	.long	0x11EFCD08
+	.long	0x1210CD08
+	.long	0x1231CD08
+	.long	0x1252CD08
+	.long	0x1273CD08
+	.long	0x1294CD08
+	.long	0x12B5CD08
+	.long	0x12D6CD08
+
+	and	0,0,11
+	addi	11,1,64+15
+	.long	0x11EFD508
+	.long	0x1210D508
+	.long	0x1231D508
+	.long	0x1252D508
+	.long	0x1273D508
+	.long	0x1294D508
+	.long	0x12B5D508
+	.long	0x12D6D508
+	lvx	24,0,11
+
+	subic	5,5,129
+	.long	0x11EFDD08
+	addi	5,5,1
+	.long	0x1210DD08
+	.long	0x1231DD08
+	.long	0x1252DD08
+	.long	0x1273DD08
+	.long	0x1294DD08
+	.long	0x12B5DD08
+	.long	0x12D6DD08
+	lvx	25,8,11
+
+	.long	0x11EFE508
+	.long	0x7C001E99
+	.long	0x1210E508
+	.long	0x7C281E99
+	.long	0x1231E508
+	.long	0x7C5A1E99
+	.long	0x1252E508
+	.long	0x7C7B1E99
+	.long	0x1273E508
+	.long	0x7D5C1E99
+	.long	0x1294E508
+	.long	0x7D9D1E99
+	.long	0x12B5E508
+	.long	0x7DBE1E99
+	.long	0x12D6E508
+	.long	0x7DDF1E99
+	addi	3,3,0x80
+
+	.long	0x11EFED08
+	vperm	0,0,0,6
+	.long	0x1210ED08
+	vperm	1,1,1,6
+	.long	0x1231ED08
+	vperm	2,2,2,6
+	.long	0x1252ED08
+	vperm	3,3,3,6
+	.long	0x1273ED08
+	vperm	10,10,10,6
+	.long	0x1294ED08
+	vperm	12,12,12,6
+	.long	0x12B5ED08
+	vperm	13,13,13,6
+	.long	0x12D6ED08
+	vperm	14,14,14,6
+
+	add	3,3,0
+
+
+
+	subfe.	0,0,0
+	.long	0x11EFF508
+	vxor	0,0,31
+	.long	0x1210F508
+	vxor	1,1,31
+	.long	0x1231F508
+	vxor	2,2,31
+	.long	0x1252F508
+	vxor	3,3,31
+	.long	0x1273F508
+	vxor	10,10,31
+	.long	0x1294F508
+	vxor	12,12,31
+	.long	0x12B5F508
+	vxor	13,13,31
+	.long	0x12D6F508
+	vxor	14,14,31
+
+	bne	Lctr32_enc8x_break
+
+	.long	0x100F0509
+	.long	0x10300D09
+	vadduwm	16,4,11
+	.long	0x10511509
+	vadduwm	17,4,7
+	vxor	15,4,23
+	.long	0x10721D09
+	vadduwm	18,16,7
+	vxor	16,16,23
+	.long	0x11535509
+	vadduwm	19,17,7
+	vxor	17,17,23
+	.long	0x11946509
+	vadduwm	20,18,7
+	vxor	18,18,23
+	.long	0x11B56D09
+	vadduwm	21,19,7
+	vxor	19,19,23
+	.long	0x11D67509
+	vadduwm	22,20,7
+	vxor	20,20,23
+	vperm	0,0,0,6
+	vadduwm	4,21,7
+	vxor	21,21,23
+	vperm	1,1,1,6
+	vxor	22,22,23
+	mtctr	9
+
+	.long	0x11EFC508
+	.long	0x7C002799
+	vperm	2,2,2,6
+	.long	0x1210C508
+	.long	0x7C282799
+	vperm	3,3,3,6
+	.long	0x1231C508
+	.long	0x7C5A2799
+	vperm	10,10,10,6
+	.long	0x1252C508
+	.long	0x7C7B2799
+	vperm	12,12,12,6
+	.long	0x1273C508
+	.long	0x7D5C2799
+	vperm	13,13,13,6
+	.long	0x1294C508
+	.long	0x7D9D2799
+	vperm	14,14,14,6
+	.long	0x12B5C508
+	.long	0x7DBE2799
+	.long	0x12D6C508
+	.long	0x7DDF2799
+	addi	4,4,0x80
+
+	b	Loop_ctr32_enc8x_middle
+
+.align	5
+Lctr32_enc8x_break:
+	cmpwi	5,-0x60
+	blt	Lctr32_enc8x_one
+	nop	
+	beq	Lctr32_enc8x_two
+	cmpwi	5,-0x40
+	blt	Lctr32_enc8x_three
+	nop	
+	beq	Lctr32_enc8x_four
+	cmpwi	5,-0x20
+	blt	Lctr32_enc8x_five
+	nop	
+	beq	Lctr32_enc8x_six
+	cmpwi	5,0x00
+	blt	Lctr32_enc8x_seven
+
+Lctr32_enc8x_eight:
+	.long	0x11EF0509
+	.long	0x12100D09
+	.long	0x12311509
+	.long	0x12521D09
+	.long	0x12735509
+	.long	0x12946509
+	.long	0x12B56D09
+	.long	0x12D67509
+
+	vperm	15,15,15,6
+	vperm	16,16,16,6
+	.long	0x7DE02799
+	vperm	17,17,17,6
+	.long	0x7E082799
+	vperm	18,18,18,6
+	.long	0x7E3A2799
+	vperm	19,19,19,6
+	.long	0x7E5B2799
+	vperm	20,20,20,6
+	.long	0x7E7C2799
+	vperm	21,21,21,6
+	.long	0x7E9D2799
+	vperm	22,22,22,6
+	.long	0x7EBE2799
+	.long	0x7EDF2799
+	addi	4,4,0x80
+	b	Lctr32_enc8x_done
+
+.align	5
+Lctr32_enc8x_seven:
+	.long	0x11EF0D09
+	.long	0x12101509
+	.long	0x12311D09
+	.long	0x12525509
+	.long	0x12736509
+	.long	0x12946D09
+	.long	0x12B57509
+
+	vperm	15,15,15,6
+	vperm	16,16,16,6
+	.long	0x7DE02799
+	vperm	17,17,17,6
+	.long	0x7E082799
+	vperm	18,18,18,6
+	.long	0x7E3A2799
+	vperm	19,19,19,6
+	.long	0x7E5B2799
+	vperm	20,20,20,6
+	.long	0x7E7C2799
+	vperm	21,21,21,6
+	.long	0x7E9D2799
+	.long	0x7EBE2799
+	addi	4,4,0x70
+	b	Lctr32_enc8x_done
+
+.align	5
+Lctr32_enc8x_six:
+	.long	0x11EF1509
+	.long	0x12101D09
+	.long	0x12315509
+	.long	0x12526509
+	.long	0x12736D09
+	.long	0x12947509
+
+	vperm	15,15,15,6
+	vperm	16,16,16,6
+	.long	0x7DE02799
+	vperm	17,17,17,6
+	.long	0x7E082799
+	vperm	18,18,18,6
+	.long	0x7E3A2799
+	vperm	19,19,19,6
+	.long	0x7E5B2799
+	vperm	20,20,20,6
+	.long	0x7E7C2799
+	.long	0x7E9D2799
+	addi	4,4,0x60
+	b	Lctr32_enc8x_done
+
+.align	5
+Lctr32_enc8x_five:
+	.long	0x11EF1D09
+	.long	0x12105509
+	.long	0x12316509
+	.long	0x12526D09
+	.long	0x12737509
+
+	vperm	15,15,15,6
+	vperm	16,16,16,6
+	.long	0x7DE02799
+	vperm	17,17,17,6
+	.long	0x7E082799
+	vperm	18,18,18,6
+	.long	0x7E3A2799
+	vperm	19,19,19,6
+	.long	0x7E5B2799
+	.long	0x7E7C2799
+	addi	4,4,0x50
+	b	Lctr32_enc8x_done
+
+.align	5
+Lctr32_enc8x_four:
+	.long	0x11EF5509
+	.long	0x12106509
+	.long	0x12316D09
+	.long	0x12527509
+
+	vperm	15,15,15,6
+	vperm	16,16,16,6
+	.long	0x7DE02799
+	vperm	17,17,17,6
+	.long	0x7E082799
+	vperm	18,18,18,6
+	.long	0x7E3A2799
+	.long	0x7E5B2799
+	addi	4,4,0x40
+	b	Lctr32_enc8x_done
+
+.align	5
+Lctr32_enc8x_three:
+	.long	0x11EF6509
+	.long	0x12106D09
+	.long	0x12317509
+
+	vperm	15,15,15,6
+	vperm	16,16,16,6
+	.long	0x7DE02799
+	vperm	17,17,17,6
+	.long	0x7E082799
+	.long	0x7E3A2799
+	addi	4,4,0x30
+	b	Lcbc_dec8x_done
+
+.align	5
+Lctr32_enc8x_two:
+	.long	0x11EF6D09
+	.long	0x12107509
+
+	vperm	15,15,15,6
+	vperm	16,16,16,6
+	.long	0x7DE02799
+	.long	0x7E082799
+	addi	4,4,0x20
+	b	Lcbc_dec8x_done
+
+.align	5
+Lctr32_enc8x_one:
+	.long	0x11EF7509
+
+	vperm	15,15,15,6
+	.long	0x7DE02799
+	addi	4,4,0x10
+
+Lctr32_enc8x_done:
+	li	10,79
+	li	11,95
+	stvx	6,10,1
+	addi	10,10,32
+	stvx	6,11,1
+	addi	11,11,32
+	stvx	6,10,1
+	addi	10,10,32
+	stvx	6,11,1
+	addi	11,11,32
+	stvx	6,10,1
+	addi	10,10,32
+	stvx	6,11,1
+	addi	11,11,32
+	stvx	6,10,1
+	addi	10,10,32
+	stvx	6,11,1
+	addi	11,11,32
+
+	mtspr	256,12
+	lvx	20,10,1
+	addi	10,10,32
+	lvx	21,11,1
+	addi	11,11,32
+	lvx	22,10,1
+	addi	10,10,32
+	lvx	23,11,1
+	addi	11,11,32
+	lvx	24,10,1
+	addi	10,10,32
+	lvx	25,11,1
+	addi	11,11,32
+	lvx	26,10,1
+	addi	10,10,32
+	lvx	27,11,1
+	addi	11,11,32
+	lvx	28,10,1
+	addi	10,10,32
+	lvx	29,11,1
+	addi	11,11,32
+	lvx	30,10,1
+	lvx	31,11,1
+	ld	26,400(1)
+	ld	27,408(1)
+	ld	28,416(1)
+	ld	29,424(1)
+	ld	30,432(1)
+	ld	31,440(1)
+	addi	1,1,448
+	blr	
+.long	0
+.byte	0,12,0x04,0,0x80,6,6,0
+.long	0
+
+.globl	aes_hw_xts_encrypt
+.align	5
+aes_hw_xts_encrypt:
+	mr	10,3
+	li	3,-1
+	cmpldi	5,16
+	bclr	14,0
+
+	lis	0,0xfff0
+	mfspr	12,256
+	li	11,0
+	mtspr	256,0
+
+	vspltisb	9,0x07
+	lvsl	6,11,11
+	vspltisb	11,0x0f
+	vxor	6,6,9
+
+	li	3,15
+	lvx	8,0,8
+	lvsl	5,0,8
+	lvx	4,3,8
+	vxor	5,5,11
+	vperm	8,8,4,5
+
+	neg	11,10
+	lvsr	5,0,11
+	lvx	2,0,10
+	addi	10,10,15
+	vxor	5,5,11
+
+	cmpldi	7,0
+	beq	Lxts_enc_no_key2
+
+	lvsr	7,0,7
+	lwz	9,240(7)
+	srwi	9,9,1
+	subi	9,9,1
+	li	3,16
+
+	lvx	0,0,7
+	lvx	1,3,7
+	addi	3,3,16
+	vperm	0,1,0,7
+	vxor	8,8,0
+	lvx	0,3,7
+	addi	3,3,16
+	mtctr	9
+
+Ltweak_xts_enc:
+	vperm	1,0,1,7
+	.long	0x11080D08
+	lvx	1,3,7
+	addi	3,3,16
+	vperm	0,1,0,7
+	.long	0x11080508
+	lvx	0,3,7
+	addi	3,3,16
+	bc	16,0,Ltweak_xts_enc
+
+	vperm	1,0,1,7
+	.long	0x11080D08
+	lvx	1,3,7
+	vperm	0,1,0,7
+	.long	0x11080509
+
+	li	8,0
+	b	Lxts_enc
+
+Lxts_enc_no_key2:
+	li	3,-16
+	and	5,5,3
+
+
+Lxts_enc:
+	lvx	4,0,10
+	addi	10,10,16
+
+	lvsr	7,0,6
+	lwz	9,240(6)
+	srwi	9,9,1
+	subi	9,9,1
+	li	3,16
+
+	vslb	10,9,9
+	vor	10,10,9
+	vspltisb	11,1
+	vsldoi	10,10,11,15
+
+	cmpldi	5,96
+	bge	_aesp8_xts_encrypt6x
+
+	andi.	7,5,15
+	subic	0,5,32
+	subi	7,7,16
+	subfe	0,0,0
+	and	0,0,7
+	add	10,10,0
+
+	lvx	0,0,6
+	lvx	1,3,6
+	addi	3,3,16
+	vperm	2,2,4,5
+	vperm	0,1,0,7
+	vxor	2,2,8
+	vxor	2,2,0
+	lvx	0,3,6
+	addi	3,3,16
+	mtctr	9
+	b	Loop_xts_enc
+
+.align	5
+Loop_xts_enc:
+	vperm	1,0,1,7
+	.long	0x10420D08
+	lvx	1,3,6
+	addi	3,3,16
+	vperm	0,1,0,7
+	.long	0x10420508
+	lvx	0,3,6
+	addi	3,3,16
+	bc	16,0,Loop_xts_enc
+
+	vperm	1,0,1,7
+	.long	0x10420D08
+	lvx	1,3,6
+	li	3,16
+	vperm	0,1,0,7
+	vxor	0,0,8
+	.long	0x10620509
+
+	vperm	11,3,3,6
+
+	.long	0x7D602799
+
+	addi	4,4,16
+
+	subic.	5,5,16
+	beq	Lxts_enc_done
+
+	vor	2,4,4
+	lvx	4,0,10
+	addi	10,10,16
+	lvx	0,0,6
+	lvx	1,3,6
+	addi	3,3,16
+
+	subic	0,5,32
+	subfe	0,0,0
+	and	0,0,7
+	add	10,10,0
+
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vand	11,11,10
+	vxor	8,8,11
+
+	vperm	2,2,4,5
+	vperm	0,1,0,7
+	vxor	2,2,8
+	vxor	3,3,0
+	vxor	2,2,0
+	lvx	0,3,6
+	addi	3,3,16
+
+	mtctr	9
+	cmpldi	5,16
+	bge	Loop_xts_enc
+
+	vxor	3,3,8
+	lvsr	5,0,5
+	vxor	4,4,4
+	vspltisb	11,-1
+	vperm	4,4,11,5
+	vsel	2,2,3,4
+
+	subi	11,4,17
+	subi	4,4,16
+	mtctr	5
+	li	5,16
+Loop_xts_enc_steal:
+	lbzu	0,1(11)
+	stb	0,16(11)
+	bc	16,0,Loop_xts_enc_steal
+
+	mtctr	9
+	b	Loop_xts_enc
+
+Lxts_enc_done:
+	cmpldi	8,0
+	beq	Lxts_enc_ret
+
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vand	11,11,10
+	vxor	8,8,11
+
+	vperm	8,8,8,6
+	.long	0x7D004799
+
+Lxts_enc_ret:
+	mtspr	256,12
+	li	3,0
+	blr	
+.long	0
+.byte	0,12,0x04,0,0x80,6,6,0
+.long	0
+
+
+.globl	aes_hw_xts_decrypt
+.align	5
+aes_hw_xts_decrypt:
+	mr	10,3
+	li	3,-1
+	cmpldi	5,16
+	bclr	14,0
+
+	lis	0,0xfff8
+	mfspr	12,256
+	li	11,0
+	mtspr	256,0
+
+	andi.	0,5,15
+	neg	0,0
+	andi.	0,0,16
+	sub	5,5,0
+
+	vspltisb	9,0x07
+	lvsl	6,11,11
+	vspltisb	11,0x0f
+	vxor	6,6,9
+
+	li	3,15
+	lvx	8,0,8
+	lvsl	5,0,8
+	lvx	4,3,8
+	vxor	5,5,11
+	vperm	8,8,4,5
+
+	neg	11,10
+	lvsr	5,0,11
+	lvx	2,0,10
+	addi	10,10,15
+	vxor	5,5,11
+
+	cmpldi	7,0
+	beq	Lxts_dec_no_key2
+
+	lvsr	7,0,7
+	lwz	9,240(7)
+	srwi	9,9,1
+	subi	9,9,1
+	li	3,16
+
+	lvx	0,0,7
+	lvx	1,3,7
+	addi	3,3,16
+	vperm	0,1,0,7
+	vxor	8,8,0
+	lvx	0,3,7
+	addi	3,3,16
+	mtctr	9
+
+Ltweak_xts_dec:
+	vperm	1,0,1,7
+	.long	0x11080D08
+	lvx	1,3,7
+	addi	3,3,16
+	vperm	0,1,0,7
+	.long	0x11080508
+	lvx	0,3,7
+	addi	3,3,16
+	bc	16,0,Ltweak_xts_dec
+
+	vperm	1,0,1,7
+	.long	0x11080D08
+	lvx	1,3,7
+	vperm	0,1,0,7
+	.long	0x11080509
+
+	li	8,0
+	b	Lxts_dec
+
+Lxts_dec_no_key2:
+	neg	3,5
+	andi.	3,3,15
+	add	5,5,3
+
+
+Lxts_dec:
+	lvx	4,0,10
+	addi	10,10,16
+
+	lvsr	7,0,6
+	lwz	9,240(6)
+	srwi	9,9,1
+	subi	9,9,1
+	li	3,16
+
+	vslb	10,9,9
+	vor	10,10,9
+	vspltisb	11,1
+	vsldoi	10,10,11,15
+
+	cmpldi	5,96
+	bge	_aesp8_xts_decrypt6x
+
+	lvx	0,0,6
+	lvx	1,3,6
+	addi	3,3,16
+	vperm	2,2,4,5
+	vperm	0,1,0,7
+	vxor	2,2,8
+	vxor	2,2,0
+	lvx	0,3,6
+	addi	3,3,16
+	mtctr	9
+
+	cmpldi	5,16
+	blt	Ltail_xts_dec
+
+
+.align	5
+Loop_xts_dec:
+	vperm	1,0,1,7
+	.long	0x10420D48
+	lvx	1,3,6
+	addi	3,3,16
+	vperm	0,1,0,7
+	.long	0x10420548
+	lvx	0,3,6
+	addi	3,3,16
+	bc	16,0,Loop_xts_dec
+
+	vperm	1,0,1,7
+	.long	0x10420D48
+	lvx	1,3,6
+	li	3,16
+	vperm	0,1,0,7
+	vxor	0,0,8
+	.long	0x10620549
+
+	vperm	11,3,3,6
+
+	.long	0x7D602799
+
+	addi	4,4,16
+
+	subic.	5,5,16
+	beq	Lxts_dec_done
+
+	vor	2,4,4
+	lvx	4,0,10
+	addi	10,10,16
+	lvx	0,0,6
+	lvx	1,3,6
+	addi	3,3,16
+
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vand	11,11,10
+	vxor	8,8,11
+
+	vperm	2,2,4,5
+	vperm	0,1,0,7
+	vxor	2,2,8
+	vxor	2,2,0
+	lvx	0,3,6
+	addi	3,3,16
+
+	mtctr	9
+	cmpldi	5,16
+	bge	Loop_xts_dec
+
+Ltail_xts_dec:
+	vsrab	11,8,9
+	vaddubm	12,8,8
+	vsldoi	11,11,11,15
+	vand	11,11,10
+	vxor	12,12,11
+
+	subi	10,10,16
+	add	10,10,5
+
+	vxor	2,2,8
+	vxor	2,2,12
+
+Loop_xts_dec_short:
+	vperm	1,0,1,7
+	.long	0x10420D48
+	lvx	1,3,6
+	addi	3,3,16
+	vperm	0,1,0,7
+	.long	0x10420548
+	lvx	0,3,6
+	addi	3,3,16
+	bc	16,0,Loop_xts_dec_short
+
+	vperm	1,0,1,7
+	.long	0x10420D48
+	lvx	1,3,6
+	li	3,16
+	vperm	0,1,0,7
+	vxor	0,0,12
+	.long	0x10620549
+
+	vperm	11,3,3,6
+
+	.long	0x7D602799
+
+
+	vor	2,4,4
+	lvx	4,0,10
+
+	lvx	0,0,6
+	lvx	1,3,6
+	addi	3,3,16
+	vperm	2,2,4,5
+	vperm	0,1,0,7
+
+	lvsr	5,0,5
+	vxor	4,4,4
+	vspltisb	11,-1
+	vperm	4,4,11,5
+	vsel	2,2,3,4
+
+	vxor	0,0,8
+	vxor	2,2,0
+	lvx	0,3,6
+	addi	3,3,16
+
+	subi	11,4,1
+	mtctr	5
+	li	5,16
+Loop_xts_dec_steal:
+	lbzu	0,1(11)
+	stb	0,16(11)
+	bc	16,0,Loop_xts_dec_steal
+
+	mtctr	9
+	b	Loop_xts_dec
+
+Lxts_dec_done:
+	cmpldi	8,0
+	beq	Lxts_dec_ret
+
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vand	11,11,10
+	vxor	8,8,11
+
+	vperm	8,8,8,6
+	.long	0x7D004799
+
+Lxts_dec_ret:
+	mtspr	256,12
+	li	3,0
+	blr	
+.long	0
+.byte	0,12,0x04,0,0x80,6,6,0
+.long	0
+
+.align	5
+_aesp8_xts_encrypt6x:
+	stdu	1,-448(1)
+	mflr	11
+	li	7,207
+	li	3,223
+	std	11,464(1)
+	stvx	20,7,1
+	addi	7,7,32
+	stvx	21,3,1
+	addi	3,3,32
+	stvx	22,7,1
+	addi	7,7,32
+	stvx	23,3,1
+	addi	3,3,32
+	stvx	24,7,1
+	addi	7,7,32
+	stvx	25,3,1
+	addi	3,3,32
+	stvx	26,7,1
+	addi	7,7,32
+	stvx	27,3,1
+	addi	3,3,32
+	stvx	28,7,1
+	addi	7,7,32
+	stvx	29,3,1
+	addi	3,3,32
+	stvx	30,7,1
+	stvx	31,3,1
+	li	0,-1
+	stw	12,396(1)
+	li	3,0x10
+	std	26,400(1)
+	li	26,0x20
+	std	27,408(1)
+	li	27,0x30
+	std	28,416(1)
+	li	28,0x40
+	std	29,424(1)
+	li	29,0x50
+	std	30,432(1)
+	li	30,0x60
+	std	31,440(1)
+	li	31,0x70
+	mtspr	256,0
+
+	subi	9,9,3
+
+	lvx	23,0,6
+	lvx	30,3,6
+	addi	6,6,0x20
+	lvx	31,0,6
+	vperm	23,30,23,7
+	addi	7,1,64+15
+	mtctr	9
+
+Load_xts_enc_key:
+	vperm	24,31,30,7
+	lvx	30,3,6
+	addi	6,6,0x20
+	stvx	24,0,7
+	vperm	25,30,31,7
+	lvx	31,0,6
+	stvx	25,3,7
+	addi	7,7,0x20
+	bc	16,0,Load_xts_enc_key
+
+	lvx	26,3,6
+	vperm	24,31,30,7
+	lvx	27,26,6
+	stvx	24,0,7
+	vperm	25,26,31,7
+	lvx	28,27,6
+	stvx	25,3,7
+	addi	7,1,64+15
+	vperm	26,27,26,7
+	lvx	29,28,6
+	vperm	27,28,27,7
+	lvx	30,29,6
+	vperm	28,29,28,7
+	lvx	31,30,6
+	vperm	29,30,29,7
+	lvx	22,31,6
+	vperm	30,31,30,7
+	lvx	24,0,7
+	vperm	31,22,31,7
+	lvx	25,3,7
+
+	vperm	0,2,4,5
+	subi	10,10,31
+	vxor	17,8,23
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vand	11,11,10
+	vxor	7,0,17
+	vxor	8,8,11
+
+	.long	0x7C235699
+	vxor	18,8,23
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vperm	1,1,1,6
+	vand	11,11,10
+	vxor	12,1,18
+	vxor	8,8,11
+
+	.long	0x7C5A5699
+	andi.	31,5,15
+	vxor	19,8,23
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vperm	2,2,2,6
+	vand	11,11,10
+	vxor	13,2,19
+	vxor	8,8,11
+
+	.long	0x7C7B5699
+	sub	5,5,31
+	vxor	20,8,23
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vperm	3,3,3,6
+	vand	11,11,10
+	vxor	14,3,20
+	vxor	8,8,11
+
+	.long	0x7C9C5699
+	subi	5,5,0x60
+	vxor	21,8,23
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vperm	4,4,4,6
+	vand	11,11,10
+	vxor	15,4,21
+	vxor	8,8,11
+
+	.long	0x7CBD5699
+	addi	10,10,0x60
+	vxor	22,8,23
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vperm	5,5,5,6
+	vand	11,11,10
+	vxor	16,5,22
+	vxor	8,8,11
+
+	vxor	31,31,23
+	mtctr	9
+	b	Loop_xts_enc6x
+
+.align	5
+Loop_xts_enc6x:
+	.long	0x10E7C508
+	.long	0x118CC508
+	.long	0x11ADC508
+	.long	0x11CEC508
+	.long	0x11EFC508
+	.long	0x1210C508
+	lvx	24,26,7
+	addi	7,7,0x20
+
+	.long	0x10E7CD08
+	.long	0x118CCD08
+	.long	0x11ADCD08
+	.long	0x11CECD08
+	.long	0x11EFCD08
+	.long	0x1210CD08
+	lvx	25,3,7
+	bc	16,0,Loop_xts_enc6x
+
+	subic	5,5,96
+	vxor	0,17,31
+	.long	0x10E7C508
+	.long	0x118CC508
+	vsrab	11,8,9
+	vxor	17,8,23
+	vaddubm	8,8,8
+	.long	0x11ADC508
+	.long	0x11CEC508
+	vsldoi	11,11,11,15
+	.long	0x11EFC508
+	.long	0x1210C508
+
+	subfe.	0,0,0
+	vand	11,11,10
+	.long	0x10E7CD08
+	.long	0x118CCD08
+	vxor	8,8,11
+	.long	0x11ADCD08
+	.long	0x11CECD08
+	vxor	1,18,31
+	vsrab	11,8,9
+	vxor	18,8,23
+	.long	0x11EFCD08
+	.long	0x1210CD08
+
+	and	0,0,5
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	.long	0x10E7D508
+	.long	0x118CD508
+	vand	11,11,10
+	.long	0x11ADD508
+	.long	0x11CED508
+	vxor	8,8,11
+	.long	0x11EFD508
+	.long	0x1210D508
+
+	add	10,10,0
+
+
+
+	vxor	2,19,31
+	vsrab	11,8,9
+	vxor	19,8,23
+	vaddubm	8,8,8
+	.long	0x10E7DD08
+	.long	0x118CDD08
+	vsldoi	11,11,11,15
+	.long	0x11ADDD08
+	.long	0x11CEDD08
+	vand	11,11,10
+	.long	0x11EFDD08
+	.long	0x1210DD08
+
+	addi	7,1,64+15
+	vxor	8,8,11
+	.long	0x10E7E508
+	.long	0x118CE508
+	vxor	3,20,31
+	vsrab	11,8,9
+	vxor	20,8,23
+	.long	0x11ADE508
+	.long	0x11CEE508
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	.long	0x11EFE508
+	.long	0x1210E508
+	lvx	24,0,7
+	vand	11,11,10
+
+	.long	0x10E7ED08
+	.long	0x118CED08
+	vxor	8,8,11
+	.long	0x11ADED08
+	.long	0x11CEED08
+	vxor	4,21,31
+	vsrab	11,8,9
+	vxor	21,8,23
+	.long	0x11EFED08
+	.long	0x1210ED08
+	lvx	25,3,7
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+
+	.long	0x10E7F508
+	.long	0x118CF508
+	vand	11,11,10
+	.long	0x11ADF508
+	.long	0x11CEF508
+	vxor	8,8,11
+	.long	0x11EFF508
+	.long	0x1210F508
+	vxor	5,22,31
+	vsrab	11,8,9
+	vxor	22,8,23
+
+	.long	0x10E70509
+	.long	0x7C005699
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	.long	0x118C0D09
+	.long	0x7C235699
+	.long	0x11AD1509
+	vperm	0,0,0,6
+	.long	0x7C5A5699
+	vand	11,11,10
+	.long	0x11CE1D09
+	vperm	1,1,1,6
+	.long	0x7C7B5699
+	.long	0x11EF2509
+	vperm	2,2,2,6
+	.long	0x7C9C5699
+	vxor	8,8,11
+	.long	0x11702D09
+
+	vperm	3,3,3,6
+	.long	0x7CBD5699
+	addi	10,10,0x60
+	vperm	4,4,4,6
+	vperm	5,5,5,6
+
+	vperm	7,7,7,6
+	vperm	12,12,12,6
+	.long	0x7CE02799
+	vxor	7,0,17
+	vperm	13,13,13,6
+	.long	0x7D832799
+	vxor	12,1,18
+	vperm	14,14,14,6
+	.long	0x7DBA2799
+	vxor	13,2,19
+	vperm	15,15,15,6
+	.long	0x7DDB2799
+	vxor	14,3,20
+	vperm	16,11,11,6
+	.long	0x7DFC2799
+	vxor	15,4,21
+	.long	0x7E1D2799
+
+	vxor	16,5,22
+	addi	4,4,0x60
+
+	mtctr	9
+	beq	Loop_xts_enc6x
+
+	addic.	5,5,0x60
+	beq	Lxts_enc6x_zero
+	cmpwi	5,0x20
+	blt	Lxts_enc6x_one
+	nop	
+	beq	Lxts_enc6x_two
+	cmpwi	5,0x40
+	blt	Lxts_enc6x_three
+	nop	
+	beq	Lxts_enc6x_four
+
+Lxts_enc6x_five:
+	vxor	7,1,17
+	vxor	12,2,18
+	vxor	13,3,19
+	vxor	14,4,20
+	vxor	15,5,21
+
+	bl	_aesp8_xts_enc5x
+
+	vperm	7,7,7,6
+	vor	17,22,22
+	vperm	12,12,12,6
+	.long	0x7CE02799
+	vperm	13,13,13,6
+	.long	0x7D832799
+	vperm	14,14,14,6
+	.long	0x7DBA2799
+	vxor	11,15,22
+	vperm	15,15,15,6
+	.long	0x7DDB2799
+	.long	0x7DFC2799
+	addi	4,4,0x50
+	bne	Lxts_enc6x_steal
+	b	Lxts_enc6x_done
+
+.align	4
+Lxts_enc6x_four:
+	vxor	7,2,17
+	vxor	12,3,18
+	vxor	13,4,19
+	vxor	14,5,20
+	vxor	15,15,15
+
+	bl	_aesp8_xts_enc5x
+
+	vperm	7,7,7,6
+	vor	17,21,21
+	vperm	12,12,12,6
+	.long	0x7CE02799
+	vperm	13,13,13,6
+	.long	0x7D832799
+	vxor	11,14,21
+	vperm	14,14,14,6
+	.long	0x7DBA2799
+	.long	0x7DDB2799
+	addi	4,4,0x40
+	bne	Lxts_enc6x_steal
+	b	Lxts_enc6x_done
+
+.align	4
+Lxts_enc6x_three:
+	vxor	7,3,17
+	vxor	12,4,18
+	vxor	13,5,19
+	vxor	14,14,14
+	vxor	15,15,15
+
+	bl	_aesp8_xts_enc5x
+
+	vperm	7,7,7,6
+	vor	17,20,20
+	vperm	12,12,12,6
+	.long	0x7CE02799
+	vxor	11,13,20
+	vperm	13,13,13,6
+	.long	0x7D832799
+	.long	0x7DBA2799
+	addi	4,4,0x30
+	bne	Lxts_enc6x_steal
+	b	Lxts_enc6x_done
+
+.align	4
+Lxts_enc6x_two:
+	vxor	7,4,17
+	vxor	12,5,18
+	vxor	13,13,13
+	vxor	14,14,14
+	vxor	15,15,15
+
+	bl	_aesp8_xts_enc5x
+
+	vperm	7,7,7,6
+	vor	17,19,19
+	vxor	11,12,19
+	vperm	12,12,12,6
+	.long	0x7CE02799
+	.long	0x7D832799
+	addi	4,4,0x20
+	bne	Lxts_enc6x_steal
+	b	Lxts_enc6x_done
+
+.align	4
+Lxts_enc6x_one:
+	vxor	7,5,17
+	nop	
+Loop_xts_enc1x:
+	.long	0x10E7C508
+	lvx	24,26,7
+	addi	7,7,0x20
+
+	.long	0x10E7CD08
+	lvx	25,3,7
+	bc	16,0,Loop_xts_enc1x
+
+	add	10,10,31
+	cmpwi	31,0
+	.long	0x10E7C508
+
+	subi	10,10,16
+	.long	0x10E7CD08
+
+	lvsr	5,0,31
+	.long	0x10E7D508
+
+	.long	0x7C005699
+	.long	0x10E7DD08
+
+	addi	7,1,64+15
+	.long	0x10E7E508
+	lvx	24,0,7
+
+	.long	0x10E7ED08
+	lvx	25,3,7
+	vxor	17,17,31
+
+	vperm	0,0,0,6
+	.long	0x10E7F508
+
+	vperm	0,0,0,5
+	.long	0x10E78D09
+
+	vor	17,18,18
+	vxor	11,7,18
+	vperm	7,7,7,6
+	.long	0x7CE02799
+	addi	4,4,0x10
+	bne	Lxts_enc6x_steal
+	b	Lxts_enc6x_done
+
+.align	4
+Lxts_enc6x_zero:
+	cmpwi	31,0
+	beq	Lxts_enc6x_done
+
+	add	10,10,31
+	subi	10,10,16
+	.long	0x7C005699
+	lvsr	5,0,31
+	vperm	0,0,0,6
+	vperm	0,0,0,5
+	vxor	11,11,17
+Lxts_enc6x_steal:
+	vxor	0,0,17
+	vxor	7,7,7
+	vspltisb	12,-1
+	vperm	7,7,12,5
+	vsel	7,0,11,7
+
+	subi	30,4,17
+	subi	4,4,16
+	mtctr	31
+Loop_xts_enc6x_steal:
+	lbzu	0,1(30)
+	stb	0,16(30)
+	bc	16,0,Loop_xts_enc6x_steal
+
+	li	31,0
+	mtctr	9
+	b	Loop_xts_enc1x
+
+.align	4
+Lxts_enc6x_done:
+	cmpldi	8,0
+	beq	Lxts_enc6x_ret
+
+	vxor	8,17,23
+	vperm	8,8,8,6
+	.long	0x7D004799
+
+Lxts_enc6x_ret:
+	mtlr	11
+	li	10,79
+	li	11,95
+	stvx	9,10,1
+	addi	10,10,32
+	stvx	9,11,1
+	addi	11,11,32
+	stvx	9,10,1
+	addi	10,10,32
+	stvx	9,11,1
+	addi	11,11,32
+	stvx	9,10,1
+	addi	10,10,32
+	stvx	9,11,1
+	addi	11,11,32
+	stvx	9,10,1
+	addi	10,10,32
+	stvx	9,11,1
+	addi	11,11,32
+
+	mtspr	256,12
+	lvx	20,10,1
+	addi	10,10,32
+	lvx	21,11,1
+	addi	11,11,32
+	lvx	22,10,1
+	addi	10,10,32
+	lvx	23,11,1
+	addi	11,11,32
+	lvx	24,10,1
+	addi	10,10,32
+	lvx	25,11,1
+	addi	11,11,32
+	lvx	26,10,1
+	addi	10,10,32
+	lvx	27,11,1
+	addi	11,11,32
+	lvx	28,10,1
+	addi	10,10,32
+	lvx	29,11,1
+	addi	11,11,32
+	lvx	30,10,1
+	lvx	31,11,1
+	ld	26,400(1)
+	ld	27,408(1)
+	ld	28,416(1)
+	ld	29,424(1)
+	ld	30,432(1)
+	ld	31,440(1)
+	addi	1,1,448
+	blr	
+.long	0
+.byte	0,12,0x04,1,0x80,6,6,0
+.long	0
+
+.align	5
+_aesp8_xts_enc5x:
+	.long	0x10E7C508
+	.long	0x118CC508
+	.long	0x11ADC508
+	.long	0x11CEC508
+	.long	0x11EFC508
+	lvx	24,26,7
+	addi	7,7,0x20
+
+	.long	0x10E7CD08
+	.long	0x118CCD08
+	.long	0x11ADCD08
+	.long	0x11CECD08
+	.long	0x11EFCD08
+	lvx	25,3,7
+	bc	16,0,_aesp8_xts_enc5x
+
+	add	10,10,31
+	cmpwi	31,0
+	.long	0x10E7C508
+	.long	0x118CC508
+	.long	0x11ADC508
+	.long	0x11CEC508
+	.long	0x11EFC508
+
+	subi	10,10,16
+	.long	0x10E7CD08
+	.long	0x118CCD08
+	.long	0x11ADCD08
+	.long	0x11CECD08
+	.long	0x11EFCD08
+	vxor	17,17,31
+
+	.long	0x10E7D508
+	lvsr	5,0,31
+	.long	0x118CD508
+	.long	0x11ADD508
+	.long	0x11CED508
+	.long	0x11EFD508
+	vxor	1,18,31
+
+	.long	0x10E7DD08
+	.long	0x7C005699
+	.long	0x118CDD08
+	.long	0x11ADDD08
+	.long	0x11CEDD08
+	.long	0x11EFDD08
+	vxor	2,19,31
+
+	addi	7,1,64+15
+	.long	0x10E7E508
+	.long	0x118CE508
+	.long	0x11ADE508
+	.long	0x11CEE508
+	.long	0x11EFE508
+	lvx	24,0,7
+	vxor	3,20,31
+
+	.long	0x10E7ED08
+	vperm	0,0,0,6
+	.long	0x118CED08
+	.long	0x11ADED08
+	.long	0x11CEED08
+	.long	0x11EFED08
+	lvx	25,3,7
+	vxor	4,21,31
+
+	.long	0x10E7F508
+	vperm	0,0,0,5
+	.long	0x118CF508
+	.long	0x11ADF508
+	.long	0x11CEF508
+	.long	0x11EFF508
+
+	.long	0x10E78D09
+	.long	0x118C0D09
+	.long	0x11AD1509
+	.long	0x11CE1D09
+	.long	0x11EF2509
+	blr	
+.long	0
+.byte	0,12,0x14,0,0,0,0,0
+
+.align	5
+_aesp8_xts_decrypt6x:
+	stdu	1,-448(1)
+	mflr	11
+	li	7,207
+	li	3,223
+	std	11,464(1)
+	stvx	20,7,1
+	addi	7,7,32
+	stvx	21,3,1
+	addi	3,3,32
+	stvx	22,7,1
+	addi	7,7,32
+	stvx	23,3,1
+	addi	3,3,32
+	stvx	24,7,1
+	addi	7,7,32
+	stvx	25,3,1
+	addi	3,3,32
+	stvx	26,7,1
+	addi	7,7,32
+	stvx	27,3,1
+	addi	3,3,32
+	stvx	28,7,1
+	addi	7,7,32
+	stvx	29,3,1
+	addi	3,3,32
+	stvx	30,7,1
+	stvx	31,3,1
+	li	0,-1
+	stw	12,396(1)
+	li	3,0x10
+	std	26,400(1)
+	li	26,0x20
+	std	27,408(1)
+	li	27,0x30
+	std	28,416(1)
+	li	28,0x40
+	std	29,424(1)
+	li	29,0x50
+	std	30,432(1)
+	li	30,0x60
+	std	31,440(1)
+	li	31,0x70
+	mtspr	256,0
+
+	subi	9,9,3
+
+	lvx	23,0,6
+	lvx	30,3,6
+	addi	6,6,0x20
+	lvx	31,0,6
+	vperm	23,30,23,7
+	addi	7,1,64+15
+	mtctr	9
+
+Load_xts_dec_key:
+	vperm	24,31,30,7
+	lvx	30,3,6
+	addi	6,6,0x20
+	stvx	24,0,7
+	vperm	25,30,31,7
+	lvx	31,0,6
+	stvx	25,3,7
+	addi	7,7,0x20
+	bc	16,0,Load_xts_dec_key
+
+	lvx	26,3,6
+	vperm	24,31,30,7
+	lvx	27,26,6
+	stvx	24,0,7
+	vperm	25,26,31,7
+	lvx	28,27,6
+	stvx	25,3,7
+	addi	7,1,64+15
+	vperm	26,27,26,7
+	lvx	29,28,6
+	vperm	27,28,27,7
+	lvx	30,29,6
+	vperm	28,29,28,7
+	lvx	31,30,6
+	vperm	29,30,29,7
+	lvx	22,31,6
+	vperm	30,31,30,7
+	lvx	24,0,7
+	vperm	31,22,31,7
+	lvx	25,3,7
+
+	vperm	0,2,4,5
+	subi	10,10,31
+	vxor	17,8,23
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vand	11,11,10
+	vxor	7,0,17
+	vxor	8,8,11
+
+	.long	0x7C235699
+	vxor	18,8,23
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vperm	1,1,1,6
+	vand	11,11,10
+	vxor	12,1,18
+	vxor	8,8,11
+
+	.long	0x7C5A5699
+	andi.	31,5,15
+	vxor	19,8,23
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vperm	2,2,2,6
+	vand	11,11,10
+	vxor	13,2,19
+	vxor	8,8,11
+
+	.long	0x7C7B5699
+	sub	5,5,31
+	vxor	20,8,23
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vperm	3,3,3,6
+	vand	11,11,10
+	vxor	14,3,20
+	vxor	8,8,11
+
+	.long	0x7C9C5699
+	subi	5,5,0x60
+	vxor	21,8,23
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vperm	4,4,4,6
+	vand	11,11,10
+	vxor	15,4,21
+	vxor	8,8,11
+
+	.long	0x7CBD5699
+	addi	10,10,0x60
+	vxor	22,8,23
+	vsrab	11,8,9
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	vperm	5,5,5,6
+	vand	11,11,10
+	vxor	16,5,22
+	vxor	8,8,11
+
+	vxor	31,31,23
+	mtctr	9
+	b	Loop_xts_dec6x
+
+.align	5
+Loop_xts_dec6x:
+	.long	0x10E7C548
+	.long	0x118CC548
+	.long	0x11ADC548
+	.long	0x11CEC548
+	.long	0x11EFC548
+	.long	0x1210C548
+	lvx	24,26,7
+	addi	7,7,0x20
+
+	.long	0x10E7CD48
+	.long	0x118CCD48
+	.long	0x11ADCD48
+	.long	0x11CECD48
+	.long	0x11EFCD48
+	.long	0x1210CD48
+	lvx	25,3,7
+	bc	16,0,Loop_xts_dec6x
+
+	subic	5,5,96
+	vxor	0,17,31
+	.long	0x10E7C548
+	.long	0x118CC548
+	vsrab	11,8,9
+	vxor	17,8,23
+	vaddubm	8,8,8
+	.long	0x11ADC548
+	.long	0x11CEC548
+	vsldoi	11,11,11,15
+	.long	0x11EFC548
+	.long	0x1210C548
+
+	subfe.	0,0,0
+	vand	11,11,10
+	.long	0x10E7CD48
+	.long	0x118CCD48
+	vxor	8,8,11
+	.long	0x11ADCD48
+	.long	0x11CECD48
+	vxor	1,18,31
+	vsrab	11,8,9
+	vxor	18,8,23
+	.long	0x11EFCD48
+	.long	0x1210CD48
+
+	and	0,0,5
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	.long	0x10E7D548
+	.long	0x118CD548
+	vand	11,11,10
+	.long	0x11ADD548
+	.long	0x11CED548
+	vxor	8,8,11
+	.long	0x11EFD548
+	.long	0x1210D548
+
+	add	10,10,0
+
+
+
+	vxor	2,19,31
+	vsrab	11,8,9
+	vxor	19,8,23
+	vaddubm	8,8,8
+	.long	0x10E7DD48
+	.long	0x118CDD48
+	vsldoi	11,11,11,15
+	.long	0x11ADDD48
+	.long	0x11CEDD48
+	vand	11,11,10
+	.long	0x11EFDD48
+	.long	0x1210DD48
+
+	addi	7,1,64+15
+	vxor	8,8,11
+	.long	0x10E7E548
+	.long	0x118CE548
+	vxor	3,20,31
+	vsrab	11,8,9
+	vxor	20,8,23
+	.long	0x11ADE548
+	.long	0x11CEE548
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	.long	0x11EFE548
+	.long	0x1210E548
+	lvx	24,0,7
+	vand	11,11,10
+
+	.long	0x10E7ED48
+	.long	0x118CED48
+	vxor	8,8,11
+	.long	0x11ADED48
+	.long	0x11CEED48
+	vxor	4,21,31
+	vsrab	11,8,9
+	vxor	21,8,23
+	.long	0x11EFED48
+	.long	0x1210ED48
+	lvx	25,3,7
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+
+	.long	0x10E7F548
+	.long	0x118CF548
+	vand	11,11,10
+	.long	0x11ADF548
+	.long	0x11CEF548
+	vxor	8,8,11
+	.long	0x11EFF548
+	.long	0x1210F548
+	vxor	5,22,31
+	vsrab	11,8,9
+	vxor	22,8,23
+
+	.long	0x10E70549
+	.long	0x7C005699
+	vaddubm	8,8,8
+	vsldoi	11,11,11,15
+	.long	0x118C0D49
+	.long	0x7C235699
+	.long	0x11AD1549
+	vperm	0,0,0,6
+	.long	0x7C5A5699
+	vand	11,11,10
+	.long	0x11CE1D49
+	vperm	1,1,1,6
+	.long	0x7C7B5699
+	.long	0x11EF2549
+	vperm	2,2,2,6
+	.long	0x7C9C5699
+	vxor	8,8,11
+	.long	0x12102D49
+	vperm	3,3,3,6
+	.long	0x7CBD5699
+	addi	10,10,0x60
+	vperm	4,4,4,6
+	vperm	5,5,5,6
+
+	vperm	7,7,7,6
+	vperm	12,12,12,6
+	.long	0x7CE02799
+	vxor	7,0,17
+	vperm	13,13,13,6
+	.long	0x7D832799
+	vxor	12,1,18
+	vperm	14,14,14,6
+	.long	0x7DBA2799
+	vxor	13,2,19
+	vperm	15,15,15,6
+	.long	0x7DDB2799
+	vxor	14,3,20
+	vperm	16,16,16,6
+	.long	0x7DFC2799
+	vxor	15,4,21
+	.long	0x7E1D2799
+	vxor	16,5,22
+	addi	4,4,0x60
+
+	mtctr	9
+	beq	Loop_xts_dec6x
+
+	addic.	5,5,0x60
+	beq	Lxts_dec6x_zero
+	cmpwi	5,0x20
+	blt	Lxts_dec6x_one
+	nop	
+	beq	Lxts_dec6x_two
+	cmpwi	5,0x40
+	blt	Lxts_dec6x_three
+	nop	
+	beq	Lxts_dec6x_four
+
+Lxts_dec6x_five:
+	vxor	7,1,17
+	vxor	12,2,18
+	vxor	13,3,19
+	vxor	14,4,20
+	vxor	15,5,21
+
+	bl	_aesp8_xts_dec5x
+
+	vperm	7,7,7,6
+	vor	17,22,22
+	vxor	18,8,23
+	vperm	12,12,12,6
+	.long	0x7CE02799
+	vxor	7,0,18
+	vperm	13,13,13,6
+	.long	0x7D832799
+	vperm	14,14,14,6
+	.long	0x7DBA2799
+	vperm	15,15,15,6
+	.long	0x7DDB2799
+	.long	0x7DFC2799
+	addi	4,4,0x50
+	bne	Lxts_dec6x_steal
+	b	Lxts_dec6x_done
+
+.align	4
+Lxts_dec6x_four:
+	vxor	7,2,17
+	vxor	12,3,18
+	vxor	13,4,19
+	vxor	14,5,20
+	vxor	15,15,15
+
+	bl	_aesp8_xts_dec5x
+
+	vperm	7,7,7,6
+	vor	17,21,21
+	vor	18,22,22
+	vperm	12,12,12,6
+	.long	0x7CE02799
+	vxor	7,0,22
+	vperm	13,13,13,6
+	.long	0x7D832799
+	vperm	14,14,14,6
+	.long	0x7DBA2799
+	.long	0x7DDB2799
+	addi	4,4,0x40
+	bne	Lxts_dec6x_steal
+	b	Lxts_dec6x_done
+
+.align	4
+Lxts_dec6x_three:
+	vxor	7,3,17
+	vxor	12,4,18
+	vxor	13,5,19
+	vxor	14,14,14
+	vxor	15,15,15
+
+	bl	_aesp8_xts_dec5x
+
+	vperm	7,7,7,6
+	vor	17,20,20
+	vor	18,21,21
+	vperm	12,12,12,6
+	.long	0x7CE02799
+	vxor	7,0,21
+	vperm	13,13,13,6
+	.long	0x7D832799
+	.long	0x7DBA2799
+	addi	4,4,0x30
+	bne	Lxts_dec6x_steal
+	b	Lxts_dec6x_done
+
+.align	4
+Lxts_dec6x_two:
+	vxor	7,4,17
+	vxor	12,5,18
+	vxor	13,13,13
+	vxor	14,14,14
+	vxor	15,15,15
+
+	bl	_aesp8_xts_dec5x
+
+	vperm	7,7,7,6
+	vor	17,19,19
+	vor	18,20,20
+	vperm	12,12,12,6
+	.long	0x7CE02799
+	vxor	7,0,20
+	.long	0x7D832799
+	addi	4,4,0x20
+	bne	Lxts_dec6x_steal
+	b	Lxts_dec6x_done
+
+.align	4
+Lxts_dec6x_one:
+	vxor	7,5,17
+	nop	
+Loop_xts_dec1x:
+	.long	0x10E7C548
+	lvx	24,26,7
+	addi	7,7,0x20
+
+	.long	0x10E7CD48
+	lvx	25,3,7
+	bc	16,0,Loop_xts_dec1x
+
+	subi	0,31,1
+	.long	0x10E7C548
+
+	andi.	0,0,16
+	cmpwi	31,0
+	.long	0x10E7CD48
+
+	sub	10,10,0
+	.long	0x10E7D548
+
+	.long	0x7C005699
+	.long	0x10E7DD48
+
+	addi	7,1,64+15
+	.long	0x10E7E548
+	lvx	24,0,7
+
+	.long	0x10E7ED48
+	lvx	25,3,7
+	vxor	17,17,31
+
+	vperm	0,0,0,6
+	.long	0x10E7F548
+
+	mtctr	9
+	.long	0x10E78D49
+
+	vor	17,18,18
+	vor	18,19,19
+	vperm	7,7,7,6
+	.long	0x7CE02799
+	addi	4,4,0x10
+	vxor	7,0,19
+	bne	Lxts_dec6x_steal
+	b	Lxts_dec6x_done
+
+.align	4
+Lxts_dec6x_zero:
+	cmpwi	31,0
+	beq	Lxts_dec6x_done
+
+	.long	0x7C005699
+	vperm	0,0,0,6
+	vxor	7,0,18
+Lxts_dec6x_steal:
+	.long	0x10E7C548
+	lvx	24,26,7
+	addi	7,7,0x20
+
+	.long	0x10E7CD48
+	lvx	25,3,7
+	bc	16,0,Lxts_dec6x_steal
+
+	add	10,10,31
+	.long	0x10E7C548
+
+	cmpwi	31,0
+	.long	0x10E7CD48
+
+	.long	0x7C005699
+	.long	0x10E7D548
+
+	lvsr	5,0,31
+	.long	0x10E7DD48
+
+	addi	7,1,64+15
+	.long	0x10E7E548
+	lvx	24,0,7
+
+	.long	0x10E7ED48
+	lvx	25,3,7
+	vxor	18,18,31
+
+	vperm	0,0,0,6
+	.long	0x10E7F548
+
+	vperm	0,0,0,5
+	.long	0x11679549
+
+	vperm	7,11,11,6
+	.long	0x7CE02799
+
+
+	vxor	7,7,7
+	vspltisb	12,-1
+	vperm	7,7,12,5
+	vsel	7,0,11,7
+	vxor	7,7,17
+
+	subi	30,4,1
+	mtctr	31
+Loop_xts_dec6x_steal:
+	lbzu	0,1(30)
+	stb	0,16(30)
+	bc	16,0,Loop_xts_dec6x_steal
+
+	li	31,0
+	mtctr	9
+	b	Loop_xts_dec1x
+
+.align	4
+Lxts_dec6x_done:
+	cmpldi	8,0
+	beq	Lxts_dec6x_ret
+
+	vxor	8,17,23
+	vperm	8,8,8,6
+	.long	0x7D004799
+
+Lxts_dec6x_ret:
+	mtlr	11
+	li	10,79
+	li	11,95
+	stvx	9,10,1
+	addi	10,10,32
+	stvx	9,11,1
+	addi	11,11,32
+	stvx	9,10,1
+	addi	10,10,32
+	stvx	9,11,1
+	addi	11,11,32
+	stvx	9,10,1
+	addi	10,10,32
+	stvx	9,11,1
+	addi	11,11,32
+	stvx	9,10,1
+	addi	10,10,32
+	stvx	9,11,1
+	addi	11,11,32
+
+	mtspr	256,12
+	lvx	20,10,1
+	addi	10,10,32
+	lvx	21,11,1
+	addi	11,11,32
+	lvx	22,10,1
+	addi	10,10,32
+	lvx	23,11,1
+	addi	11,11,32
+	lvx	24,10,1
+	addi	10,10,32
+	lvx	25,11,1
+	addi	11,11,32
+	lvx	26,10,1
+	addi	10,10,32
+	lvx	27,11,1
+	addi	11,11,32
+	lvx	28,10,1
+	addi	10,10,32
+	lvx	29,11,1
+	addi	11,11,32
+	lvx	30,10,1
+	lvx	31,11,1
+	ld	26,400(1)
+	ld	27,408(1)
+	ld	28,416(1)
+	ld	29,424(1)
+	ld	30,432(1)
+	ld	31,440(1)
+	addi	1,1,448
+	blr	
+.long	0
+.byte	0,12,0x04,1,0x80,6,6,0
+.long	0
+
+.align	5
+_aesp8_xts_dec5x:
+	.long	0x10E7C548
+	.long	0x118CC548
+	.long	0x11ADC548
+	.long	0x11CEC548
+	.long	0x11EFC548
+	lvx	24,26,7
+	addi	7,7,0x20
+
+	.long	0x10E7CD48
+	.long	0x118CCD48
+	.long	0x11ADCD48
+	.long	0x11CECD48
+	.long	0x11EFCD48
+	lvx	25,3,7
+	bc	16,0,_aesp8_xts_dec5x
+
+	subi	0,31,1
+	.long	0x10E7C548
+	.long	0x118CC548
+	.long	0x11ADC548
+	.long	0x11CEC548
+	.long	0x11EFC548
+
+	andi.	0,0,16
+	cmpwi	31,0
+	.long	0x10E7CD48
+	.long	0x118CCD48
+	.long	0x11ADCD48
+	.long	0x11CECD48
+	.long	0x11EFCD48
+	vxor	17,17,31
+
+	sub	10,10,0
+	.long	0x10E7D548
+	.long	0x118CD548
+	.long	0x11ADD548
+	.long	0x11CED548
+	.long	0x11EFD548
+	vxor	1,18,31
+
+	.long	0x10E7DD48
+	.long	0x7C005699
+	.long	0x118CDD48
+	.long	0x11ADDD48
+	.long	0x11CEDD48
+	.long	0x11EFDD48
+	vxor	2,19,31
+
+	addi	7,1,64+15
+	.long	0x10E7E548
+	.long	0x118CE548
+	.long	0x11ADE548
+	.long	0x11CEE548
+	.long	0x11EFE548
+	lvx	24,0,7
+	vxor	3,20,31
+
+	.long	0x10E7ED48
+	vperm	0,0,0,6
+	.long	0x118CED48
+	.long	0x11ADED48
+	.long	0x11CEED48
+	.long	0x11EFED48
+	lvx	25,3,7
+	vxor	4,21,31
+
+	.long	0x10E7F548
+	.long	0x118CF548
+	.long	0x11ADF548
+	.long	0x11CEF548
+	.long	0x11EFF548
+
+	.long	0x10E78D49
+	.long	0x118C0D49
+	.long	0x11AD1549
+	.long	0x11CE1D49
+	.long	0x11EF2549
+	mtctr	9
+	blr	
+.long	0
+.byte	0,12,0x14,0,0,0,0,0
diff --git a/linux-x86/crypto/aes/aes-586.S b/linux-x86/crypto/fipsmodule/aes-586.S
similarity index 100%
rename from linux-x86/crypto/aes/aes-586.S
rename to linux-x86/crypto/fipsmodule/aes-586.S
diff --git a/linux-x86/crypto/aes/aesni-x86.S b/linux-x86/crypto/fipsmodule/aesni-x86.S
similarity index 99%
rename from linux-x86/crypto/aes/aesni-x86.S
rename to linux-x86/crypto/fipsmodule/aesni-x86.S
index aec110d..4a1c225 100644
--- a/linux-x86/crypto/aes/aesni-x86.S
+++ b/linux-x86/crypto/fipsmodule/aesni-x86.S
@@ -1,5 +1,5 @@
 #if defined(__i386__)
-.file	"src/crypto/aes/asm/aesni-x86.S"
+.file	"src/crypto/fipsmodule/aes/asm/aesni-x86.S"
 .text
 .globl	aesni_encrypt
 .hidden	aesni_encrypt
diff --git a/linux-x86/crypto/md5/md5-586.S b/linux-x86/crypto/fipsmodule/md5-586.S
similarity index 99%
rename from linux-x86/crypto/md5/md5-586.S
rename to linux-x86/crypto/fipsmodule/md5-586.S
index 734b941..9475694 100644
--- a/linux-x86/crypto/md5/md5-586.S
+++ b/linux-x86/crypto/fipsmodule/md5-586.S
@@ -1,5 +1,5 @@
 #if defined(__i386__)
-.file	"src/crypto/md5/asm/md5-586.S"
+.file	"src/crypto/fipsmodule/md5/asm/md5-586.S"
 .text
 .globl	md5_block_asm_data_order
 .hidden	md5_block_asm_data_order
diff --git a/linux-x86/crypto/sha/sha1-586.S b/linux-x86/crypto/fipsmodule/sha1-586.S
similarity index 100%
rename from linux-x86/crypto/sha/sha1-586.S
rename to linux-x86/crypto/fipsmodule/sha1-586.S
diff --git a/linux-x86/crypto/sha/sha256-586.S b/linux-x86/crypto/fipsmodule/sha256-586.S
similarity index 100%
rename from linux-x86/crypto/sha/sha256-586.S
rename to linux-x86/crypto/fipsmodule/sha256-586.S
diff --git a/linux-x86/crypto/sha/sha512-586.S b/linux-x86/crypto/fipsmodule/sha512-586.S
similarity index 100%
rename from linux-x86/crypto/sha/sha512-586.S
rename to linux-x86/crypto/fipsmodule/sha512-586.S
diff --git a/linux-x86/crypto/aes/vpaes-x86.S b/linux-x86/crypto/fipsmodule/vpaes-x86.S
similarity index 100%
rename from linux-x86/crypto/aes/vpaes-x86.S
rename to linux-x86/crypto/fipsmodule/vpaes-x86.S
diff --git a/linux-x86_64/crypto/aes/aes-x86_64.S b/linux-x86_64/crypto/fipsmodule/aes-x86_64.S
similarity index 99%
rename from linux-x86_64/crypto/aes/aes-x86_64.S
rename to linux-x86_64/crypto/fipsmodule/aes-x86_64.S
index 1a0a512..0063c89 100644
--- a/linux-x86_64/crypto/aes/aes-x86_64.S
+++ b/linux-x86_64/crypto/fipsmodule/aes-x86_64.S
@@ -1294,8 +1294,8 @@
 .globl	asm_AES_cbc_encrypt
 .hidden asm_AES_cbc_encrypt
 .type	asm_AES_cbc_encrypt,@function
-.extern	OPENSSL_ia32cap_P
-.hidden OPENSSL_ia32cap_P
+.extern	OPENSSL_ia32cap_addr
+.hidden OPENSSL_ia32cap_addr
 .hidden	asm_AES_cbc_encrypt
 asm_AES_cbc_encrypt:
 	cmpq	$0,%rdx
@@ -1317,7 +1317,8 @@
 	cmpq	$0,%r9
 	cmoveq	%r10,%r14
 
-	movl	OPENSSL_ia32cap_P(%rip),%r10d
+	movq	OPENSSL_ia32cap_addr(%rip),%r10
+	movl	(%r10),%r10d
 	cmpq	$512,%rdx
 	jb	.Lcbc_slow_prologue
 	testq	$15,%rdx
diff --git a/linux-x86_64/crypto/aes/aesni-x86_64.S b/linux-x86_64/crypto/fipsmodule/aesni-x86_64.S
similarity index 99%
rename from linux-x86_64/crypto/aes/aesni-x86_64.S
rename to linux-x86_64/crypto/fipsmodule/aesni-x86_64.S
index 2890ccf..b5056f2 100644
--- a/linux-x86_64/crypto/aes/aesni-x86_64.S
+++ b/linux-x86_64/crypto/fipsmodule/aesni-x86_64.S
@@ -1,7 +1,7 @@
 #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM)
 .text	
-.extern	OPENSSL_ia32cap_P
-.hidden OPENSSL_ia32cap_P
+.extern	OPENSSL_ia32cap_addr
+.hidden OPENSSL_ia32cap_addr
 .globl	aesni_encrypt
 .hidden aesni_encrypt
 .type	aesni_encrypt,@function
@@ -1087,7 +1087,8 @@
 	leaq	7(%r8),%r9
 	movl	%r10d,96+12(%rsp)
 	bswapl	%r9d
-	movl	OPENSSL_ia32cap_P+4(%rip),%r10d
+	movq	OPENSSL_ia32cap_addr(%rip),%r10
+	movl	4(%r10),%r10d
 	xorl	%ebp,%r9d
 	andl	$71303168,%r10d
 	movl	%r9d,112+12(%rsp)
@@ -3473,7 +3474,8 @@
 	movdqa	%xmm5,%xmm14
 	movdqu	80(%rdi),%xmm7
 	movdqa	%xmm6,%xmm15
-	movl	OPENSSL_ia32cap_P+4(%rip),%r9d
+	movq	OPENSSL_ia32cap_addr(%rip),%r9
+	movl	4(%r9),%r9d
 	cmpq	$0x70,%rdx
 	jbe	.Lcbc_dec_six_or_seven
 
@@ -3994,10 +3996,11 @@
 	testq	%rdx,%rdx
 	jz	.Lenc_key_ret
 
-	movl	$268437504,%r10d
 	movups	(%rdi),%xmm0
 	xorps	%xmm4,%xmm4
-	andl	OPENSSL_ia32cap_P+4(%rip),%r10d
+	movq	OPENSSL_ia32cap_addr(%rip),%r10
+	movl	4(%r10),%r10d
+	andl	$268437504,%r10d
 	leaq	16(%rdx),%rax
 	cmpl	$256,%esi
 	je	.L14rounds
diff --git a/linux-x86_64/crypto/aes/bsaes-x86_64.S b/linux-x86_64/crypto/fipsmodule/bsaes-x86_64.S
similarity index 100%
rename from linux-x86_64/crypto/aes/bsaes-x86_64.S
rename to linux-x86_64/crypto/fipsmodule/bsaes-x86_64.S
diff --git a/linux-x86_64/crypto/md5/md5-x86_64.S b/linux-x86_64/crypto/fipsmodule/md5-x86_64.S
similarity index 100%
rename from linux-x86_64/crypto/md5/md5-x86_64.S
rename to linux-x86_64/crypto/fipsmodule/md5-x86_64.S
diff --git a/linux-x86_64/crypto/sha/sha1-x86_64.S b/linux-x86_64/crypto/fipsmodule/sha1-x86_64.S
similarity index 99%
rename from linux-x86_64/crypto/sha/sha1-x86_64.S
rename to linux-x86_64/crypto/fipsmodule/sha1-x86_64.S
index 350d7d6..b739537 100644
--- a/linux-x86_64/crypto/sha/sha1-x86_64.S
+++ b/linux-x86_64/crypto/fipsmodule/sha1-x86_64.S
@@ -1,16 +1,18 @@
 #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM)
 .text	
-.extern	OPENSSL_ia32cap_P
-.hidden OPENSSL_ia32cap_P
+.extern	OPENSSL_ia32cap_addr
+.hidden OPENSSL_ia32cap_addr
 
 .globl	sha1_block_data_order
 .hidden sha1_block_data_order
 .type	sha1_block_data_order,@function
 .align	16
 sha1_block_data_order:
-	movl	OPENSSL_ia32cap_P+0(%rip),%r9d
-	movl	OPENSSL_ia32cap_P+4(%rip),%r8d
-	movl	OPENSSL_ia32cap_P+8(%rip),%r10d
+	leaq	OPENSSL_ia32cap_addr(%rip),%r10
+	movq	(%r10),%r10
+	movl	0(%r10),%r9d
+	movl	4(%r10),%r8d
+	movl	8(%r10),%r10d
 	testl	$512,%r8d
 	jz	.Lialu
 	andl	$268435456,%r8d
diff --git a/linux-x86_64/crypto/sha/sha256-x86_64.S b/linux-x86_64/crypto/fipsmodule/sha256-x86_64.S
similarity index 99%
rename from linux-x86_64/crypto/sha/sha256-x86_64.S
rename to linux-x86_64/crypto/fipsmodule/sha256-x86_64.S
index 62534be..5983039 100644
--- a/linux-x86_64/crypto/sha/sha256-x86_64.S
+++ b/linux-x86_64/crypto/fipsmodule/sha256-x86_64.S
@@ -1,14 +1,15 @@
 #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM)
 .text	
 
-.extern	OPENSSL_ia32cap_P
-.hidden OPENSSL_ia32cap_P
+.extern	OPENSSL_ia32cap_addr
+.hidden OPENSSL_ia32cap_addr
 .globl	sha256_block_data_order
 .hidden sha256_block_data_order
 .type	sha256_block_data_order,@function
 .align	16
 sha256_block_data_order:
-	leaq	OPENSSL_ia32cap_P(%rip),%r11
+	leaq	OPENSSL_ia32cap_addr(%rip),%r11
+	movq	(%r11),%r11
 	movl	0(%r11),%r9d
 	movl	4(%r11),%r10d
 	movl	8(%r11),%r11d
@@ -44,6 +45,7 @@
 	movl	20(%rdi),%r9d
 	movl	24(%rdi),%r10d
 	movl	28(%rdi),%r11d
+
 	jmp	.Lloop
 
 .align	16
diff --git a/linux-x86_64/crypto/sha/sha512-x86_64.S b/linux-x86_64/crypto/fipsmodule/sha512-x86_64.S
similarity index 99%
rename from linux-x86_64/crypto/sha/sha512-x86_64.S
rename to linux-x86_64/crypto/fipsmodule/sha512-x86_64.S
index 1f1793b..6eedfbc 100644
--- a/linux-x86_64/crypto/sha/sha512-x86_64.S
+++ b/linux-x86_64/crypto/fipsmodule/sha512-x86_64.S
@@ -1,14 +1,15 @@
 #if defined(__x86_64__) && !defined(OPENSSL_NO_ASM)
 .text	
 
-.extern	OPENSSL_ia32cap_P
-.hidden OPENSSL_ia32cap_P
+.extern	OPENSSL_ia32cap_addr
+.hidden OPENSSL_ia32cap_addr
 .globl	sha512_block_data_order
 .hidden sha512_block_data_order
 .type	sha512_block_data_order,@function
 .align	16
 sha512_block_data_order:
-	leaq	OPENSSL_ia32cap_P(%rip),%r11
+	leaq	OPENSSL_ia32cap_addr(%rip),%r11
+	movq	(%r11),%r11
 	movl	0(%r11),%r9d
 	movl	4(%r11),%r10d
 	movl	8(%r11),%r11d
@@ -44,6 +45,7 @@
 	movq	40(%rdi),%r9
 	movq	48(%rdi),%r10
 	movq	56(%rdi),%r11
+
 	jmp	.Lloop
 
 .align	16
diff --git a/linux-x86_64/crypto/aes/vpaes-x86_64.S b/linux-x86_64/crypto/fipsmodule/vpaes-x86_64.S
similarity index 100%
rename from linux-x86_64/crypto/aes/vpaes-x86_64.S
rename to linux-x86_64/crypto/fipsmodule/vpaes-x86_64.S
diff --git a/mac-x86/crypto/aes/aes-586.S b/mac-x86/crypto/fipsmodule/aes-586.S
similarity index 100%
rename from mac-x86/crypto/aes/aes-586.S
rename to mac-x86/crypto/fipsmodule/aes-586.S
diff --git a/mac-x86/crypto/aes/aesni-x86.S b/mac-x86/crypto/fipsmodule/aesni-x86.S
similarity index 99%
rename from mac-x86/crypto/aes/aesni-x86.S
rename to mac-x86/crypto/fipsmodule/aesni-x86.S
index 07719ba..07c7e1f 100644
--- a/mac-x86/crypto/aes/aesni-x86.S
+++ b/mac-x86/crypto/fipsmodule/aesni-x86.S
@@ -1,5 +1,5 @@
 #if defined(__i386__)
-.file	"src/crypto/aes/asm/aesni-x86.S"
+.file	"src/crypto/fipsmodule/aes/asm/aesni-x86.S"
 .text
 .globl	_aesni_encrypt
 .private_extern	_aesni_encrypt
diff --git a/mac-x86/crypto/md5/md5-586.S b/mac-x86/crypto/fipsmodule/md5-586.S
similarity index 99%
rename from mac-x86/crypto/md5/md5-586.S
rename to mac-x86/crypto/fipsmodule/md5-586.S
index 6830b16..40dae12 100644
--- a/mac-x86/crypto/md5/md5-586.S
+++ b/mac-x86/crypto/fipsmodule/md5-586.S
@@ -1,5 +1,5 @@
 #if defined(__i386__)
-.file	"src/crypto/md5/asm/md5-586.S"
+.file	"src/crypto/fipsmodule/md5/asm/md5-586.S"
 .text
 .globl	_md5_block_asm_data_order
 .private_extern	_md5_block_asm_data_order
diff --git a/mac-x86/crypto/sha/sha1-586.S b/mac-x86/crypto/fipsmodule/sha1-586.S
similarity index 100%
rename from mac-x86/crypto/sha/sha1-586.S
rename to mac-x86/crypto/fipsmodule/sha1-586.S
diff --git a/mac-x86/crypto/sha/sha256-586.S b/mac-x86/crypto/fipsmodule/sha256-586.S
similarity index 100%
rename from mac-x86/crypto/sha/sha256-586.S
rename to mac-x86/crypto/fipsmodule/sha256-586.S
diff --git a/mac-x86/crypto/sha/sha512-586.S b/mac-x86/crypto/fipsmodule/sha512-586.S
similarity index 100%
rename from mac-x86/crypto/sha/sha512-586.S
rename to mac-x86/crypto/fipsmodule/sha512-586.S
diff --git a/mac-x86/crypto/aes/vpaes-x86.S b/mac-x86/crypto/fipsmodule/vpaes-x86.S
similarity index 100%
rename from mac-x86/crypto/aes/vpaes-x86.S
rename to mac-x86/crypto/fipsmodule/vpaes-x86.S
diff --git a/mac-x86_64/crypto/aes/aes-x86_64.S b/mac-x86_64/crypto/fipsmodule/aes-x86_64.S
similarity index 99%
rename from mac-x86_64/crypto/aes/aes-x86_64.S
rename to mac-x86_64/crypto/fipsmodule/aes-x86_64.S
index d60757b..891861c 100644
--- a/mac-x86_64/crypto/aes/aes-x86_64.S
+++ b/mac-x86_64/crypto/fipsmodule/aes-x86_64.S
@@ -1316,7 +1316,8 @@
 	cmpq	$0,%r9
 	cmoveq	%r10,%r14
 
-	movl	_OPENSSL_ia32cap_P(%rip),%r10d
+	movq	_OPENSSL_ia32cap_addr(%rip),%r10
+	movl	(%r10),%r10d
 	cmpq	$512,%rdx
 	jb	L$cbc_slow_prologue
 	testq	$15,%rdx
diff --git a/mac-x86_64/crypto/aes/aesni-x86_64.S b/mac-x86_64/crypto/fipsmodule/aesni-x86_64.S
similarity index 99%
rename from mac-x86_64/crypto/aes/aesni-x86_64.S
rename to mac-x86_64/crypto/fipsmodule/aesni-x86_64.S
index fd62bc8..f77b955 100644
--- a/mac-x86_64/crypto/aes/aesni-x86_64.S
+++ b/mac-x86_64/crypto/fipsmodule/aesni-x86_64.S
@@ -1086,7 +1086,8 @@
 	leaq	7(%r8),%r9
 	movl	%r10d,96+12(%rsp)
 	bswapl	%r9d
-	movl	_OPENSSL_ia32cap_P+4(%rip),%r10d
+	movq	_OPENSSL_ia32cap_addr(%rip),%r10
+	movl	4(%r10),%r10d
 	xorl	%ebp,%r9d
 	andl	$71303168,%r10d
 	movl	%r9d,112+12(%rsp)
@@ -3472,7 +3473,8 @@
 	movdqa	%xmm5,%xmm14
 	movdqu	80(%rdi),%xmm7
 	movdqa	%xmm6,%xmm15
-	movl	_OPENSSL_ia32cap_P+4(%rip),%r9d
+	movq	_OPENSSL_ia32cap_addr(%rip),%r9
+	movl	4(%r9),%r9d
 	cmpq	$0x70,%rdx
 	jbe	L$cbc_dec_six_or_seven
 
@@ -3993,10 +3995,11 @@
 	testq	%rdx,%rdx
 	jz	L$enc_key_ret
 
-	movl	$268437504,%r10d
 	movups	(%rdi),%xmm0
 	xorps	%xmm4,%xmm4
-	andl	_OPENSSL_ia32cap_P+4(%rip),%r10d
+	movq	_OPENSSL_ia32cap_addr(%rip),%r10
+	movl	4(%r10),%r10d
+	andl	$268437504,%r10d
 	leaq	16(%rdx),%rax
 	cmpl	$256,%esi
 	je	L$14rounds
diff --git a/mac-x86_64/crypto/aes/bsaes-x86_64.S b/mac-x86_64/crypto/fipsmodule/bsaes-x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/aes/bsaes-x86_64.S
rename to mac-x86_64/crypto/fipsmodule/bsaes-x86_64.S
diff --git a/mac-x86_64/crypto/md5/md5-x86_64.S b/mac-x86_64/crypto/fipsmodule/md5-x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/md5/md5-x86_64.S
rename to mac-x86_64/crypto/fipsmodule/md5-x86_64.S
diff --git a/mac-x86_64/crypto/sha/sha1-x86_64.S b/mac-x86_64/crypto/fipsmodule/sha1-x86_64.S
similarity index 99%
rename from mac-x86_64/crypto/sha/sha1-x86_64.S
rename to mac-x86_64/crypto/fipsmodule/sha1-x86_64.S
index ee70a4b..e5eb4c7 100644
--- a/mac-x86_64/crypto/sha/sha1-x86_64.S
+++ b/mac-x86_64/crypto/fipsmodule/sha1-x86_64.S
@@ -7,9 +7,11 @@
 
 .p2align	4
 _sha1_block_data_order:
-	movl	_OPENSSL_ia32cap_P+0(%rip),%r9d
-	movl	_OPENSSL_ia32cap_P+4(%rip),%r8d
-	movl	_OPENSSL_ia32cap_P+8(%rip),%r10d
+	leaq	_OPENSSL_ia32cap_addr(%rip),%r10
+	movq	(%r10),%r10
+	movl	0(%r10),%r9d
+	movl	4(%r10),%r8d
+	movl	8(%r10),%r10d
 	testl	$512,%r8d
 	jz	L$ialu
 	andl	$268435456,%r8d
diff --git a/mac-x86_64/crypto/sha/sha256-x86_64.S b/mac-x86_64/crypto/fipsmodule/sha256-x86_64.S
similarity index 99%
rename from mac-x86_64/crypto/sha/sha256-x86_64.S
rename to mac-x86_64/crypto/fipsmodule/sha256-x86_64.S
index ac6559e..7699b54 100644
--- a/mac-x86_64/crypto/sha/sha256-x86_64.S
+++ b/mac-x86_64/crypto/fipsmodule/sha256-x86_64.S
@@ -7,7 +7,8 @@
 
 .p2align	4
 _sha256_block_data_order:
-	leaq	_OPENSSL_ia32cap_P(%rip),%r11
+	leaq	_OPENSSL_ia32cap_addr(%rip),%r11
+	movq	(%r11),%r11
 	movl	0(%r11),%r9d
 	movl	4(%r11),%r10d
 	movl	8(%r11),%r11d
@@ -43,6 +44,7 @@
 	movl	20(%rdi),%r9d
 	movl	24(%rdi),%r10d
 	movl	28(%rdi),%r11d
+
 	jmp	L$loop
 
 .p2align	4
diff --git a/mac-x86_64/crypto/sha/sha512-x86_64.S b/mac-x86_64/crypto/fipsmodule/sha512-x86_64.S
similarity index 99%
rename from mac-x86_64/crypto/sha/sha512-x86_64.S
rename to mac-x86_64/crypto/fipsmodule/sha512-x86_64.S
index 0b738e6..e84bde7 100644
--- a/mac-x86_64/crypto/sha/sha512-x86_64.S
+++ b/mac-x86_64/crypto/fipsmodule/sha512-x86_64.S
@@ -7,7 +7,8 @@
 
 .p2align	4
 _sha512_block_data_order:
-	leaq	_OPENSSL_ia32cap_P(%rip),%r11
+	leaq	_OPENSSL_ia32cap_addr(%rip),%r11
+	movq	(%r11),%r11
 	movl	0(%r11),%r9d
 	movl	4(%r11),%r10d
 	movl	8(%r11),%r11d
@@ -43,6 +44,7 @@
 	movq	40(%rdi),%r9
 	movq	48(%rdi),%r10
 	movq	56(%rdi),%r11
+
 	jmp	L$loop
 
 .p2align	4
diff --git a/mac-x86_64/crypto/aes/vpaes-x86_64.S b/mac-x86_64/crypto/fipsmodule/vpaes-x86_64.S
similarity index 100%
rename from mac-x86_64/crypto/aes/vpaes-x86_64.S
rename to mac-x86_64/crypto/fipsmodule/vpaes-x86_64.S
diff --git a/sources.bp b/sources.bp
index cad184c..4780ae9 100644
--- a/sources.bp
+++ b/sources.bp
@@ -18,9 +18,6 @@
     name: "libcrypto_sources",
     srcs: [
         "err_data.c",
-        "src/crypto/aes/aes.c",
-        "src/crypto/aes/key_wrap.c",
-        "src/crypto/aes/mode_wrappers.c",
         "src/crypto/asn1/a_bitstr.c",
         "src/crypto/asn1/a_bool.c",
         "src/crypto/asn1/a_d2i_fp.c",
@@ -93,6 +90,8 @@
         "src/crypto/cipher/cipher.c",
         "src/crypto/cipher/derive_key.c",
         "src/crypto/cipher/e_aes.c",
+        "src/crypto/cipher/e_aesctrhmac.c",
+        "src/crypto/cipher/e_aesgcmsiv.c",
         "src/crypto/cipher/e_chacha20poly1305.c",
         "src/crypto/cipher/e_des.c",
         "src/crypto/cipher/e_null.c",
@@ -117,8 +116,7 @@
         "src/crypto/dh/dh.c",
         "src/crypto/dh/dh_asn1.c",
         "src/crypto/dh/params.c",
-        "src/crypto/digest/digest.c",
-        "src/crypto/digest/digests.c",
+        "src/crypto/digest_extra/digest_extra.c",
         "src/crypto/dsa/dsa.c",
         "src/crypto/dsa/dsa_asn1.c",
         "src/crypto/ec/ec.c",
@@ -144,17 +142,18 @@
         "src/crypto/evp/p_dsa_asn1.c",
         "src/crypto/evp/p_ec.c",
         "src/crypto/evp/p_ec_asn1.c",
+        "src/crypto/evp/p_ed25519.c",
+        "src/crypto/evp/p_ed25519_asn1.c",
         "src/crypto/evp/p_rsa.c",
         "src/crypto/evp/p_rsa_asn1.c",
         "src/crypto/evp/pbkdf.c",
         "src/crypto/evp/print.c",
         "src/crypto/evp/sign.c",
         "src/crypto/ex_data.c",
+        "src/crypto/fipsmodule/bcm.c",
+        "src/crypto/fipsmodule/is_fips.c",
         "src/crypto/hkdf/hkdf.c",
-        "src/crypto/hmac/hmac.c",
         "src/crypto/lhash/lhash.c",
-        "src/crypto/md4/md4.c",
-        "src/crypto/md5/md5.c",
         "src/crypto/mem.c",
         "src/crypto/modes/cbc.c",
         "src/crypto/modes/cfb.c",
@@ -179,7 +178,9 @@
         "src/crypto/poly1305/poly1305_arm.c",
         "src/crypto/poly1305/poly1305_vec.c",
         "src/crypto/pool/pool.c",
+        "src/crypto/rand/ctrdrbg.c",
         "src/crypto/rand/deterministic.c",
+        "src/crypto/rand/forkunsafe.c",
         "src/crypto/rand/fuchsia.c",
         "src/crypto/rand/rand.c",
         "src/crypto/rand/urandom.c",
@@ -192,10 +193,6 @@
         "src/crypto/rsa/rsa.c",
         "src/crypto/rsa/rsa_asn1.c",
         "src/crypto/rsa/rsa_impl.c",
-        "src/crypto/sha/sha1-altivec.c",
-        "src/crypto/sha/sha1.c",
-        "src/crypto/sha/sha256.c",
-        "src/crypto/sha/sha512.c",
         "src/crypto/stack/stack.c",
         "src/crypto/thread.c",
         "src/crypto/thread_none.c",
@@ -288,104 +285,104 @@
     target: {
         android_arm64: {
             srcs: [
-                "linux-aarch64/crypto/aes/aesv8-armx64.S",
                 "linux-aarch64/crypto/bn/armv8-mont.S",
                 "linux-aarch64/crypto/chacha/chacha-armv8.S",
+                "linux-aarch64/crypto/fipsmodule/aesv8-armx64.S",
+                "linux-aarch64/crypto/fipsmodule/sha1-armv8.S",
+                "linux-aarch64/crypto/fipsmodule/sha256-armv8.S",
+                "linux-aarch64/crypto/fipsmodule/sha512-armv8.S",
                 "linux-aarch64/crypto/modes/ghashv8-armx64.S",
-                "linux-aarch64/crypto/sha/sha1-armv8.S",
-                "linux-aarch64/crypto/sha/sha256-armv8.S",
-                "linux-aarch64/crypto/sha/sha512-armv8.S",
             ],
         },
         android_arm: {
             srcs: [
-                "linux-arm/crypto/aes/aes-armv4.S",
-                "linux-arm/crypto/aes/aesv8-armx32.S",
-                "linux-arm/crypto/aes/bsaes-armv7.S",
                 "linux-arm/crypto/bn/armv4-mont.S",
                 "linux-arm/crypto/chacha/chacha-armv4.S",
+                "linux-arm/crypto/fipsmodule/aes-armv4.S",
+                "linux-arm/crypto/fipsmodule/aesv8-armx32.S",
+                "linux-arm/crypto/fipsmodule/bsaes-armv7.S",
+                "linux-arm/crypto/fipsmodule/sha1-armv4-large.S",
+                "linux-arm/crypto/fipsmodule/sha256-armv4.S",
+                "linux-arm/crypto/fipsmodule/sha512-armv4.S",
                 "linux-arm/crypto/modes/ghash-armv4.S",
                 "linux-arm/crypto/modes/ghashv8-armx32.S",
-                "linux-arm/crypto/sha/sha1-armv4-large.S",
-                "linux-arm/crypto/sha/sha256-armv4.S",
-                "linux-arm/crypto/sha/sha512-armv4.S",
                 "src/crypto/curve25519/asm/x25519-asm-arm.S",
                 "src/crypto/poly1305/poly1305_arm_asm.S",
             ],
         },
         android_x86: {
             srcs: [
-                "linux-x86/crypto/aes/aes-586.S",
-                "linux-x86/crypto/aes/aesni-x86.S",
-                "linux-x86/crypto/aes/vpaes-x86.S",
                 "linux-x86/crypto/bn/bn-586.S",
                 "linux-x86/crypto/bn/co-586.S",
                 "linux-x86/crypto/bn/x86-mont.S",
                 "linux-x86/crypto/chacha/chacha-x86.S",
-                "linux-x86/crypto/md5/md5-586.S",
+                "linux-x86/crypto/fipsmodule/aes-586.S",
+                "linux-x86/crypto/fipsmodule/aesni-x86.S",
+                "linux-x86/crypto/fipsmodule/md5-586.S",
+                "linux-x86/crypto/fipsmodule/sha1-586.S",
+                "linux-x86/crypto/fipsmodule/sha256-586.S",
+                "linux-x86/crypto/fipsmodule/sha512-586.S",
+                "linux-x86/crypto/fipsmodule/vpaes-x86.S",
                 "linux-x86/crypto/modes/ghash-x86.S",
-                "linux-x86/crypto/sha/sha1-586.S",
-                "linux-x86/crypto/sha/sha256-586.S",
-                "linux-x86/crypto/sha/sha512-586.S",
             ],
         },
         linux_x86: {
             srcs: [
-                "linux-x86/crypto/aes/aes-586.S",
-                "linux-x86/crypto/aes/aesni-x86.S",
-                "linux-x86/crypto/aes/vpaes-x86.S",
                 "linux-x86/crypto/bn/bn-586.S",
                 "linux-x86/crypto/bn/co-586.S",
                 "linux-x86/crypto/bn/x86-mont.S",
                 "linux-x86/crypto/chacha/chacha-x86.S",
-                "linux-x86/crypto/md5/md5-586.S",
+                "linux-x86/crypto/fipsmodule/aes-586.S",
+                "linux-x86/crypto/fipsmodule/aesni-x86.S",
+                "linux-x86/crypto/fipsmodule/md5-586.S",
+                "linux-x86/crypto/fipsmodule/sha1-586.S",
+                "linux-x86/crypto/fipsmodule/sha256-586.S",
+                "linux-x86/crypto/fipsmodule/sha512-586.S",
+                "linux-x86/crypto/fipsmodule/vpaes-x86.S",
                 "linux-x86/crypto/modes/ghash-x86.S",
-                "linux-x86/crypto/sha/sha1-586.S",
-                "linux-x86/crypto/sha/sha256-586.S",
-                "linux-x86/crypto/sha/sha512-586.S",
             ],
         },
         android_x86_64: {
             srcs: [
-                "linux-x86_64/crypto/aes/aes-x86_64.S",
-                "linux-x86_64/crypto/aes/aesni-x86_64.S",
-                "linux-x86_64/crypto/aes/bsaes-x86_64.S",
-                "linux-x86_64/crypto/aes/vpaes-x86_64.S",
                 "linux-x86_64/crypto/bn/rsaz-avx2.S",
                 "linux-x86_64/crypto/bn/x86_64-mont.S",
                 "linux-x86_64/crypto/bn/x86_64-mont5.S",
                 "linux-x86_64/crypto/chacha/chacha-x86_64.S",
                 "linux-x86_64/crypto/cipher/chacha20_poly1305_x86_64.S",
                 "linux-x86_64/crypto/ec/p256-x86_64-asm.S",
-                "linux-x86_64/crypto/md5/md5-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/aes-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/aesni-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/bsaes-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/md5-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/sha1-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/sha256-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/sha512-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/vpaes-x86_64.S",
                 "linux-x86_64/crypto/modes/aesni-gcm-x86_64.S",
                 "linux-x86_64/crypto/modes/ghash-x86_64.S",
                 "linux-x86_64/crypto/rand/rdrand-x86_64.S",
-                "linux-x86_64/crypto/sha/sha1-x86_64.S",
-                "linux-x86_64/crypto/sha/sha256-x86_64.S",
-                "linux-x86_64/crypto/sha/sha512-x86_64.S",
                 "src/crypto/curve25519/asm/x25519-asm-x86_64.S",
             ],
         },
         linux_x86_64: {
             srcs: [
-                "linux-x86_64/crypto/aes/aes-x86_64.S",
-                "linux-x86_64/crypto/aes/aesni-x86_64.S",
-                "linux-x86_64/crypto/aes/bsaes-x86_64.S",
-                "linux-x86_64/crypto/aes/vpaes-x86_64.S",
                 "linux-x86_64/crypto/bn/rsaz-avx2.S",
                 "linux-x86_64/crypto/bn/x86_64-mont.S",
                 "linux-x86_64/crypto/bn/x86_64-mont5.S",
                 "linux-x86_64/crypto/chacha/chacha-x86_64.S",
                 "linux-x86_64/crypto/cipher/chacha20_poly1305_x86_64.S",
                 "linux-x86_64/crypto/ec/p256-x86_64-asm.S",
-                "linux-x86_64/crypto/md5/md5-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/aes-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/aesni-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/bsaes-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/md5-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/sha1-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/sha256-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/sha512-x86_64.S",
+                "linux-x86_64/crypto/fipsmodule/vpaes-x86_64.S",
                 "linux-x86_64/crypto/modes/aesni-gcm-x86_64.S",
                 "linux-x86_64/crypto/modes/ghash-x86_64.S",
                 "linux-x86_64/crypto/rand/rdrand-x86_64.S",
-                "linux-x86_64/crypto/sha/sha1-x86_64.S",
-                "linux-x86_64/crypto/sha/sha256-x86_64.S",
-                "linux-x86_64/crypto/sha/sha512-x86_64.S",
                 "src/crypto/curve25519/asm/x25519-asm-x86_64.S",
             ],
         },
@@ -441,11 +438,13 @@
         "src/tool/client.cc",
         "src/tool/const.cc",
         "src/tool/digest.cc",
+        "src/tool/file.cc",
         "src/tool/generate_ed25519.cc",
         "src/tool/genrsa.cc",
         "src/tool/pkcs12.cc",
         "src/tool/rand.cc",
         "src/tool/server.cc",
+        "src/tool/sign.cc",
         "src/tool/speed.cc",
         "src/tool/tool.cc",
         "src/tool/transport_common.cc",
@@ -465,7 +464,9 @@
     name: "boringssl_crypto_test_sources",
     srcs: [
         "src/crypto/asn1/asn1_test.cc",
+        "src/crypto/base64/base64_test.cc",
         "src/crypto/bio/bio_test.cc",
+        "src/crypto/bytestring/bytestring_test.cc",
         "src/crypto/chacha/chacha_test.cc",
         "src/crypto/constant_time_test.cc",
         "src/crypto/curve25519/x25519_test.cc",
@@ -474,6 +475,7 @@
         "src/crypto/ec/ec_test.cc",
         "src/crypto/err/err_test.cc",
         "src/crypto/evp/evp_extra_test.cc",
+        "src/crypto/rand/ctrdrbg_test.cc",
         "src/crypto/rsa/rsa_test.cc",
         "src/crypto/test/gtest_main.cc",
     ],
@@ -490,16 +492,13 @@
 cc_defaults {
     name: "boringssl_tests_sources",
     srcs: [
-        "src/crypto/aes/aes_test.cc",
-        "src/crypto/base64/base64_test.cc",
         "src/crypto/bn/bn_test.cc",
-        "src/crypto/bytestring/bytestring_test.cc",
         "src/crypto/cipher/aead_test.cc",
         "src/crypto/cipher/cipher_test.cc",
         "src/crypto/cmac/cmac_test.cc",
         "src/crypto/curve25519/ed25519_test.cc",
         "src/crypto/curve25519/spake25519_test.cc",
-        "src/crypto/digest/digest_test.cc",
+        "src/crypto/digest_extra/digest_test.cc",
         "src/crypto/ec/example_mul.c",
         "src/crypto/ec/p256-x86_64_test.cc",
         "src/crypto/ecdh/ecdh_test.cc",
@@ -508,8 +507,9 @@
         "src/crypto/ecdsa/ecdsa_verify_test.cc",
         "src/crypto/evp/evp_test.cc",
         "src/crypto/evp/pbkdf_test.cc",
+        "src/crypto/fipsmodule/aes/aes_test.cc",
         "src/crypto/hkdf/hkdf_test.cc",
-        "src/crypto/hmac/hmac_test.cc",
+        "src/crypto/hmac_extra/hmac_test.cc",
         "src/crypto/lhash/lhash_test.cc",
         "src/crypto/modes/gcm_test.cc",
         "src/crypto/obj/obj_test.cc",
@@ -517,6 +517,7 @@
         "src/crypto/pkcs8/pkcs8_test.cc",
         "src/crypto/poly1305/poly1305_test.cc",
         "src/crypto/pool/pool_test.cc",
+        "src/crypto/rand/ctrdrbg_vector_test.cc",
         "src/crypto/refcount_test.cc",
         "src/crypto/thread_test.c",
         "src/crypto/x509/pkcs7_test.c",
diff --git a/sources.mk b/sources.mk
index d3d689d..6f5ddc9 100644
--- a/sources.mk
+++ b/sources.mk
@@ -16,9 +16,6 @@
 
 crypto_sources := \
   err_data.c\
-  src/crypto/aes/aes.c\
-  src/crypto/aes/key_wrap.c\
-  src/crypto/aes/mode_wrappers.c\
   src/crypto/asn1/a_bitstr.c\
   src/crypto/asn1/a_bool.c\
   src/crypto/asn1/a_d2i_fp.c\
@@ -91,6 +88,8 @@
   src/crypto/cipher/cipher.c\
   src/crypto/cipher/derive_key.c\
   src/crypto/cipher/e_aes.c\
+  src/crypto/cipher/e_aesctrhmac.c\
+  src/crypto/cipher/e_aesgcmsiv.c\
   src/crypto/cipher/e_chacha20poly1305.c\
   src/crypto/cipher/e_des.c\
   src/crypto/cipher/e_null.c\
@@ -115,8 +114,7 @@
   src/crypto/dh/dh.c\
   src/crypto/dh/dh_asn1.c\
   src/crypto/dh/params.c\
-  src/crypto/digest/digest.c\
-  src/crypto/digest/digests.c\
+  src/crypto/digest_extra/digest_extra.c\
   src/crypto/dsa/dsa.c\
   src/crypto/dsa/dsa_asn1.c\
   src/crypto/ec/ec.c\
@@ -142,17 +140,18 @@
   src/crypto/evp/p_dsa_asn1.c\
   src/crypto/evp/p_ec.c\
   src/crypto/evp/p_ec_asn1.c\
+  src/crypto/evp/p_ed25519.c\
+  src/crypto/evp/p_ed25519_asn1.c\
   src/crypto/evp/p_rsa.c\
   src/crypto/evp/p_rsa_asn1.c\
   src/crypto/evp/pbkdf.c\
   src/crypto/evp/print.c\
   src/crypto/evp/sign.c\
   src/crypto/ex_data.c\
+  src/crypto/fipsmodule/bcm.c\
+  src/crypto/fipsmodule/is_fips.c\
   src/crypto/hkdf/hkdf.c\
-  src/crypto/hmac/hmac.c\
   src/crypto/lhash/lhash.c\
-  src/crypto/md4/md4.c\
-  src/crypto/md5/md5.c\
   src/crypto/mem.c\
   src/crypto/modes/cbc.c\
   src/crypto/modes/cfb.c\
@@ -177,7 +176,9 @@
   src/crypto/poly1305/poly1305_arm.c\
   src/crypto/poly1305/poly1305_vec.c\
   src/crypto/pool/pool.c\
+  src/crypto/rand/ctrdrbg.c\
   src/crypto/rand/deterministic.c\
+  src/crypto/rand/forkunsafe.c\
   src/crypto/rand/fuchsia.c\
   src/crypto/rand/rand.c\
   src/crypto/rand/urandom.c\
@@ -190,10 +191,6 @@
   src/crypto/rsa/rsa.c\
   src/crypto/rsa/rsa_asn1.c\
   src/crypto/rsa/rsa_impl.c\
-  src/crypto/sha/sha1-altivec.c\
-  src/crypto/sha/sha1.c\
-  src/crypto/sha/sha256.c\
-  src/crypto/sha/sha512.c\
   src/crypto/stack/stack.c\
   src/crypto/thread.c\
   src/crypto/thread_none.c\
@@ -284,63 +281,63 @@
   src/crypto/x509v3/v3_utl.c\
 
 linux_aarch64_sources := \
-  linux-aarch64/crypto/aes/aesv8-armx64.S\
   linux-aarch64/crypto/bn/armv8-mont.S\
   linux-aarch64/crypto/chacha/chacha-armv8.S\
+  linux-aarch64/crypto/fipsmodule/aesv8-armx64.S\
+  linux-aarch64/crypto/fipsmodule/sha1-armv8.S\
+  linux-aarch64/crypto/fipsmodule/sha256-armv8.S\
+  linux-aarch64/crypto/fipsmodule/sha512-armv8.S\
   linux-aarch64/crypto/modes/ghashv8-armx64.S\
-  linux-aarch64/crypto/sha/sha1-armv8.S\
-  linux-aarch64/crypto/sha/sha256-armv8.S\
-  linux-aarch64/crypto/sha/sha512-armv8.S\
 
 linux_arm_sources := \
-  linux-arm/crypto/aes/aes-armv4.S\
-  linux-arm/crypto/aes/aesv8-armx32.S\
-  linux-arm/crypto/aes/bsaes-armv7.S\
   linux-arm/crypto/bn/armv4-mont.S\
   linux-arm/crypto/chacha/chacha-armv4.S\
+  linux-arm/crypto/fipsmodule/aes-armv4.S\
+  linux-arm/crypto/fipsmodule/aesv8-armx32.S\
+  linux-arm/crypto/fipsmodule/bsaes-armv7.S\
+  linux-arm/crypto/fipsmodule/sha1-armv4-large.S\
+  linux-arm/crypto/fipsmodule/sha256-armv4.S\
+  linux-arm/crypto/fipsmodule/sha512-armv4.S\
   linux-arm/crypto/modes/ghash-armv4.S\
   linux-arm/crypto/modes/ghashv8-armx32.S\
-  linux-arm/crypto/sha/sha1-armv4-large.S\
-  linux-arm/crypto/sha/sha256-armv4.S\
-  linux-arm/crypto/sha/sha512-armv4.S\
   src/crypto/curve25519/asm/x25519-asm-arm.S\
   src/crypto/poly1305/poly1305_arm_asm.S\
 
 linux_ppc64le_sources := \
-  linux-ppc64le/crypto/aes/aesp8-ppc.S\
+  linux-ppc64le/crypto/fipsmodule/aesp8-ppc.S\
   linux-ppc64le/crypto/modes/ghashp8-ppc.S\
 
 linux_x86_sources := \
-  linux-x86/crypto/aes/aes-586.S\
-  linux-x86/crypto/aes/aesni-x86.S\
-  linux-x86/crypto/aes/vpaes-x86.S\
   linux-x86/crypto/bn/bn-586.S\
   linux-x86/crypto/bn/co-586.S\
   linux-x86/crypto/bn/x86-mont.S\
   linux-x86/crypto/chacha/chacha-x86.S\
-  linux-x86/crypto/md5/md5-586.S\
+  linux-x86/crypto/fipsmodule/aes-586.S\
+  linux-x86/crypto/fipsmodule/aesni-x86.S\
+  linux-x86/crypto/fipsmodule/md5-586.S\
+  linux-x86/crypto/fipsmodule/sha1-586.S\
+  linux-x86/crypto/fipsmodule/sha256-586.S\
+  linux-x86/crypto/fipsmodule/sha512-586.S\
+  linux-x86/crypto/fipsmodule/vpaes-x86.S\
   linux-x86/crypto/modes/ghash-x86.S\
-  linux-x86/crypto/sha/sha1-586.S\
-  linux-x86/crypto/sha/sha256-586.S\
-  linux-x86/crypto/sha/sha512-586.S\
 
 linux_x86_64_sources := \
-  linux-x86_64/crypto/aes/aes-x86_64.S\
-  linux-x86_64/crypto/aes/aesni-x86_64.S\
-  linux-x86_64/crypto/aes/bsaes-x86_64.S\
-  linux-x86_64/crypto/aes/vpaes-x86_64.S\
   linux-x86_64/crypto/bn/rsaz-avx2.S\
   linux-x86_64/crypto/bn/x86_64-mont.S\
   linux-x86_64/crypto/bn/x86_64-mont5.S\
   linux-x86_64/crypto/chacha/chacha-x86_64.S\
   linux-x86_64/crypto/cipher/chacha20_poly1305_x86_64.S\
   linux-x86_64/crypto/ec/p256-x86_64-asm.S\
-  linux-x86_64/crypto/md5/md5-x86_64.S\
+  linux-x86_64/crypto/fipsmodule/aes-x86_64.S\
+  linux-x86_64/crypto/fipsmodule/aesni-x86_64.S\
+  linux-x86_64/crypto/fipsmodule/bsaes-x86_64.S\
+  linux-x86_64/crypto/fipsmodule/md5-x86_64.S\
+  linux-x86_64/crypto/fipsmodule/sha1-x86_64.S\
+  linux-x86_64/crypto/fipsmodule/sha256-x86_64.S\
+  linux-x86_64/crypto/fipsmodule/sha512-x86_64.S\
+  linux-x86_64/crypto/fipsmodule/vpaes-x86_64.S\
   linux-x86_64/crypto/modes/aesni-gcm-x86_64.S\
   linux-x86_64/crypto/modes/ghash-x86_64.S\
   linux-x86_64/crypto/rand/rdrand-x86_64.S\
-  linux-x86_64/crypto/sha/sha1-x86_64.S\
-  linux-x86_64/crypto/sha/sha256-x86_64.S\
-  linux-x86_64/crypto/sha/sha512-x86_64.S\
   src/crypto/curve25519/asm/x25519-asm-x86_64.S\
 
diff --git a/src/BUILDING.md b/src/BUILDING.md
index e691afd..3a2eae8 100644
--- a/src/BUILDING.md
+++ b/src/BUILDING.md
@@ -96,6 +96,15 @@
 
 For other options, see [android-cmake's documentation](./third_party/android-cmake/README.md).
 
+### Building for iOS
+
+To build for iOS, pass `-DCMAKE_OSX_SYSROOT=iphoneos` and
+`-DCMAKE_OSX_ARCHITECTURES=ARCH` to CMake, where `ARCH` is the desired
+architecture, matching values used in the `-arch` flag in Apple's toolchain.
+
+Passing multiple architectures for a multiple-architecture build is not
+supported.
+
 ## Known Limitations on Windows
 
   * Versions of CMake since 3.0.2 have a bug in its Ninja generator that causes
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 844a140..65a55a1 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -158,50 +158,6 @@
   set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
 endif()
 
-if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
-  set(ARCH "x86_64")
-elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "amd64")
-  set(ARCH "x86_64")
-elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64")
-  # cmake reports AMD64 on Windows, but we might be building for 32-bit.
-  if (CMAKE_CL_64)
-    set(ARCH "x86_64")
-  else()
-    set(ARCH "x86")
-  endif()
-elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86")
-  set(ARCH "x86")
-elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i386")
-  set(ARCH "x86")
-elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686")
-  set(ARCH "x86")
-elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^arm*")
-  set(ARCH "arm")
-elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
-  set(ARCH "aarch64")
-elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "mips")
-  # Just to avoid the “unknown processor” error.
-  set(ARCH "generic")
-elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "ppc64le")
-  set(ARCH "ppc64le")
-else()
-  message(FATAL_ERROR "Unknown processor:" ${CMAKE_SYSTEM_PROCESSOR})
-endif()
-
-if (ANDROID AND ${ARCH} STREQUAL "arm")
-  # The Android-NDK CMake files somehow fail to set the -march flag for
-  # assembly files. Without this flag, the compiler believes that it's
-  # building for ARMv5.
-  set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -march=${CMAKE_SYSTEM_PROCESSOR}")
-endif()
-
-if (${ARCH} STREQUAL "x86" AND APPLE)
-  # With CMake 2.8.x, ${CMAKE_SYSTEM_PROCESSOR} evalutes to i386 on OS X,
-  # but clang defaults to 64-bit builds on OS X unless otherwise told.
-  # Set ARCH to x86_64 so clang and CMake agree. This is fixed in CMake 3.
-  set(ARCH "x86_64")
-endif()
-
 if (MSAN)
   if(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
     message(FATAL_ERROR "Cannot enable MSAN unless using Clang")
@@ -231,9 +187,71 @@
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
 endif()
 
+if(FIPS)
+  add_definitions(-DBORINGSSL_FIPS)
+endif()
+
+# CMake's iOS support uses Apple's multiple-architecture toolchain. It takes an
+# architecture list from CMAKE_OSX_ARCHITECTURES, leaves CMAKE_SYSTEM_PROCESSOR
+# alone, and expects all architecture-specific logic to be conditioned within
+# the source files rather than the build. This does not work for our assembly
+# files, so we fix CMAKE_SYSTEM_PROCESSOR and only support single-architecture
+# builds.
+if (NOT OPENSSL_NO_ASM AND CMAKE_OSX_ARCHITECTURES)
+  list(LENGTH CMAKE_OSX_ARCHITECTURES NUM_ARCHES)
+  if (NOT ${NUM_ARCHES} EQUAL 1)
+    message(FATAL_ERROR "Universal binaries not supported.")
+  endif()
+  list(GET CMAKE_OSX_ARCHITECTURES 0 CMAKE_SYSTEM_PROCESSOR)
+endif()
+
 if (OPENSSL_NO_ASM)
   add_definitions(-DOPENSSL_NO_ASM)
   set(ARCH "generic")
+elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
+  set(ARCH "x86_64")
+elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "amd64")
+  set(ARCH "x86_64")
+elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64")
+  # cmake reports AMD64 on Windows, but we might be building for 32-bit.
+  if (CMAKE_CL_64)
+    set(ARCH "x86_64")
+  else()
+    set(ARCH "x86")
+  endif()
+elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86")
+  set(ARCH "x86")
+elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i386")
+  set(ARCH "x86")
+elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686")
+  set(ARCH "x86")
+elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64")
+  set(ARCH "aarch64")
+elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64")
+  set(ARCH "aarch64")
+elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "^arm*")
+  set(ARCH "arm")
+elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "mips")
+  # Just to avoid the “unknown processor” error.
+  set(ARCH "generic")
+elseif (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "ppc64le")
+  set(ARCH "ppc64le")
+else()
+  message(FATAL_ERROR "Unknown processor:" ${CMAKE_SYSTEM_PROCESSOR})
+endif()
+
+if (ANDROID AND ${ARCH} STREQUAL "arm")
+  # The Android-NDK CMake files somehow fail to set the -march flag for
+  # assembly files. Without this flag, the compiler believes that it's
+  # building for ARMv5.
+  set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -march=${CMAKE_SYSTEM_PROCESSOR}")
+endif()
+
+if (${ARCH} STREQUAL "x86" AND APPLE)
+  # With CMake 2.8.x, ${CMAKE_SYSTEM_PROCESSOR} evalutes to i386 on OS X,
+  # but clang defaults to 64-bit builds on OS X unless otherwise told.
+  # Set ARCH to x86_64 so clang and CMake agree. This is fixed in CMake 3.
+  set(ARCH "x86_64")
 endif()
 
 # Add minimal googletest targets. The provided one has many side-effects, and
diff --git a/src/crypto/CMakeLists.txt b/src/crypto/CMakeLists.txt
index 3728e6f..ef8c2d4 100644
--- a/src/crypto/CMakeLists.txt
+++ b/src/crypto/CMakeLists.txt
@@ -1,30 +1,43 @@
 include_directories(../include)
 
-if(APPLE)
-  if (${ARCH} STREQUAL "x86")
-    set(PERLASM_FLAGS "-fPIC -DOPENSSL_IA32_SSE2")
-  endif()
-  set(PERLASM_STYLE macosx)
-  set(ASM_EXT S)
-  enable_language(ASM)
-elseif(UNIX)
+if(UNIX)
   if (${ARCH} STREQUAL "aarch64")
     # The "armx" Perl scripts look for "64" in the style argument
     # in order to decide whether to generate 32- or 64-bit asm.
-    set(PERLASM_STYLE linux64)
+    if (APPLE)
+      set(PERLASM_STYLE ios64)
+    else()
+      set(PERLASM_STYLE linux64)
+    endif()
   elseif (${ARCH} STREQUAL "arm")
-    set(PERLASM_STYLE linux32)
-  elseif (${ARCH} STREQUAL "x86")
-    set(PERLASM_FLAGS "-fPIC -DOPENSSL_IA32_SSE2")
-    set(PERLASM_STYLE elf)
+    if (APPLE)
+      set(PERLASM_STYLE ios32)
+    else()
+      set(PERLASM_STYLE linux32)
+    endif()
   elseif (${ARCH} STREQUAL "ppc64le")
     set(PERLASM_STYLE ppc64le)
   else()
-    set(PERLASM_STYLE elf)
+    if (${ARCH} STREQUAL "x86")
+      set(PERLASM_FLAGS "-fPIC -DOPENSSL_IA32_SSE2")
+    endif()
+    if (APPLE)
+      set(PERLASM_STYLE macosx)
+    else()
+      set(PERLASM_STYLE elf)
+    endif()
   endif()
   set(ASM_EXT S)
   enable_language(ASM)
   set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,--noexecstack")
+
+  # CMake does not add -isysroot and -arch flags to assembly.
+  if (APPLE)
+    set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -isysroot ${CMAKE_OSX_SYSROOT}")
+    foreach(arch ${CMAKE_OSX_ARCHITECTURES})
+      set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -arch ${arch}")
+    endforeach()
+  endif()
 else()
   if (CMAKE_CL_64)
     message("Using nasm")
@@ -67,11 +80,7 @@
 add_subdirectory(pool)
 
 # Level 0.2 - depends on nothing but itself
-add_subdirectory(sha)
-add_subdirectory(md4)
-add_subdirectory(md5)
 add_subdirectory(modes)
-add_subdirectory(aes)
 add_subdirectory(des)
 add_subdirectory(rc4)
 add_subdirectory(conf)
@@ -80,7 +89,7 @@
 add_subdirectory(curve25519)
 
 # Level 1, depends only on 0.*
-add_subdirectory(digest)
+add_subdirectory(digest_extra)
 add_subdirectory(cipher)
 add_subdirectory(rand)
 add_subdirectory(bio)
@@ -96,7 +105,7 @@
 add_subdirectory(ec)
 add_subdirectory(ecdh)
 add_subdirectory(ecdsa)
-add_subdirectory(hmac)
+add_subdirectory(hmac_extra)
 
 # Level 3
 add_subdirectory(cmac)
@@ -112,8 +121,12 @@
 # Test support code
 add_subdirectory(test)
 
+add_subdirectory(fipsmodule)
+
 add_library(
-  crypto
+  crypto_base
+
+  OBJECT
 
   cpu-aarch64-linux.c
   cpu-arm.c
@@ -129,20 +142,33 @@
   thread_none.c
   thread_pthread.c
   thread_win.c
+)
 
+if(FIPS)
+  SET_SOURCE_FILES_PROPERTIES(fipsmodule/bcm.o PROPERTIES EXTERNAL_OBJECT true)
+  SET_SOURCE_FILES_PROPERTIES(fipsmodule/bcm.o PROPERTIES GENERATED true)
+
+  set(
+    CRYPTO_FIPS_OBJECTS
+
+    fipsmodule/bcm.o
+  )
+endif()
+
+add_library(
+  crypto
+
+  $<TARGET_OBJECTS:crypto_base>
   $<TARGET_OBJECTS:stack>
   $<TARGET_OBJECTS:lhash>
   $<TARGET_OBJECTS:err>
   $<TARGET_OBJECTS:base64>
   $<TARGET_OBJECTS:bytestring>
   $<TARGET_OBJECTS:pool>
-  $<TARGET_OBJECTS:sha>
-  $<TARGET_OBJECTS:md4>
-  $<TARGET_OBJECTS:md5>
-  $<TARGET_OBJECTS:digest>
+  $<TARGET_OBJECTS:fipsmodule>
+  $<TARGET_OBJECTS:digest_extra>
   $<TARGET_OBJECTS:cipher>
   $<TARGET_OBJECTS:modes>
-  $<TARGET_OBJECTS:aes>
   $<TARGET_OBJECTS:des>
   $<TARGET_OBJECTS:rc4>
   $<TARGET_OBJECTS:conf>
@@ -162,7 +188,6 @@
   $<TARGET_OBJECTS:ec>
   $<TARGET_OBJECTS:ecdh>
   $<TARGET_OBJECTS:ecdsa>
-  $<TARGET_OBJECTS:hmac>
   $<TARGET_OBJECTS:cmac>
   $<TARGET_OBJECTS:evp>
   $<TARGET_OBJECTS:hkdf>
@@ -170,8 +195,16 @@
   $<TARGET_OBJECTS:x509>
   $<TARGET_OBJECTS:x509v3>
   $<TARGET_OBJECTS:pkcs8_lib>
+
+  ${CRYPTO_FIPS_OBJECTS}
 )
 
+if(FIPS)
+  add_dependencies(crypto bcm_o_target)
+endif()
+
+SET_TARGET_PROPERTIES(crypto PROPERTIES LINKER_LANGUAGE C)
+
 if(NOT MSVC AND NOT ANDROID)
   target_link_libraries(crypto pthread)
 endif()
@@ -201,7 +234,9 @@
   crypto_test
 
   asn1/asn1_test.cc
+  base64/base64_test.cc
   bio/bio_test.cc
+  bytestring/bytestring_test.cc
   chacha/chacha_test.cc
   constant_time_test.cc
   curve25519/x25519_test.cc
@@ -210,6 +245,7 @@
   ec/ec_test.cc
   err/err_test.cc
   evp/evp_extra_test.cc
+  rand/ctrdrbg_test.cc
   rsa/rsa_test.cc
 
   $<TARGET_OBJECTS:gtest_main>
diff --git a/src/crypto/aes/CMakeLists.txt b/src/crypto/aes/CMakeLists.txt
deleted file mode 100644
index 33eebf5..0000000
--- a/src/crypto/aes/CMakeLists.txt
+++ /dev/null
@@ -1,82 +0,0 @@
-include_directories(../../include)
-
-if (${ARCH} STREQUAL "x86_64")
-  set(
-    AES_ARCH_SOURCES
-
-    aes-x86_64.${ASM_EXT}
-    aesni-x86_64.${ASM_EXT}
-    bsaes-x86_64.${ASM_EXT}
-    vpaes-x86_64.${ASM_EXT}
-  )
-endif()
-
-if (${ARCH} STREQUAL "x86")
-  set(
-    AES_ARCH_SOURCES
-
-    aes-586.${ASM_EXT}
-    vpaes-x86.${ASM_EXT}
-    aesni-x86.${ASM_EXT}
-  )
-endif()
-
-if (${ARCH} STREQUAL "arm")
-  set(
-    AES_ARCH_SOURCES
-
-    aes-armv4.${ASM_EXT}
-    bsaes-armv7.${ASM_EXT}
-    aesv8-armx.${ASM_EXT}
-  )
-endif()
-
-if (${ARCH} STREQUAL "aarch64")
-  set(
-    AES_ARCH_SOURCES
-
-    aesv8-armx.${ASM_EXT}
-  )
-endif()
-
-if (${ARCH} STREQUAL "ppc64le")
-  set(
-    AES_ARCH_SOURCES
-
-    aesp8-ppc.${ASM_EXT}
-  )
-endif()
-
-add_library(
-  aes
-
-  OBJECT
-
-  aes.c
-  key_wrap.c
-  mode_wrappers.c
-
-  ${AES_ARCH_SOURCES}
-)
-
-perlasm(aes-x86_64.${ASM_EXT} asm/aes-x86_64.pl)
-perlasm(aesni-x86_64.${ASM_EXT} asm/aesni-x86_64.pl)
-perlasm(bsaes-x86_64.${ASM_EXT} asm/bsaes-x86_64.pl)
-perlasm(vpaes-x86_64.${ASM_EXT} asm/vpaes-x86_64.pl)
-perlasm(aes-586.${ASM_EXT} asm/aes-586.pl)
-perlasm(vpaes-x86.${ASM_EXT} asm/vpaes-x86.pl)
-perlasm(aesni-x86.${ASM_EXT} asm/aesni-x86.pl)
-perlasm(aes-armv4.${ASM_EXT} asm/aes-armv4.pl)
-perlasm(bsaes-armv7.${ASM_EXT} asm/bsaes-armv7.pl)
-perlasm(aesv8-armx.${ASM_EXT} asm/aesv8-armx.pl)
-perlasm(aesp8-ppc.${ASM_EXT} asm/aesp8-ppc.pl)
-
-add_executable(
-  aes_test
-
-  aes_test.cc
-  $<TARGET_OBJECTS:test_support>
-)
-
-target_link_libraries(aes_test crypto)
-add_dependencies(all_tests aes_test)
diff --git a/src/crypto/aes/internal.h b/src/crypto/aes/internal.h
deleted file mode 100644
index 3dc5c63..0000000
--- a/src/crypto/aes/internal.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* ====================================================================
- * Copyright (c) 2002-2006 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.
- * ==================================================================== */
-
-#ifndef OPENSSL_HEADER_AES_INTERNAL_H
-#define OPENSSL_HEADER_AES_INTERNAL_H
-
-#include <openssl/base.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-
-#if defined(_MSC_VER) && \
-    (defined(_M_IX86) || defined(_M_AMD64) || defined(_M_X64))
-#define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)
-#define GETU32(p) SWAP(*((uint32_t *)(p)))
-#define PUTU32(ct, st) \
-  { *((uint32_t *)(ct)) = SWAP((st)); }
-#else
-#define GETU32(pt)                                         \
-  (((uint32_t)(pt)[0] << 24) ^ ((uint32_t)(pt)[1] << 16) ^ \
-   ((uint32_t)(pt)[2] << 8) ^ ((uint32_t)(pt)[3]))
-#define PUTU32(ct, st)          \
-  {                             \
-    (ct)[0] = (uint8_t)((st) >> 24); \
-    (ct)[1] = (uint8_t)((st) >> 16); \
-    (ct)[2] = (uint8_t)((st) >> 8);  \
-    (ct)[3] = (uint8_t)(st);         \
-  }
-#endif
-
-#define MAXKC (256 / 32)
-#define MAXKB (256 / 8)
-#define MAXNR 14
-
-
-#if defined(__cplusplus)
-} /* extern C */
-#endif
-
-#endif /* OPENSSL_HEADER_AES_INTERNAL_H */
diff --git a/src/crypto/base64/CMakeLists.txt b/src/crypto/base64/CMakeLists.txt
index 15ee691..18cf9fe 100644
--- a/src/crypto/base64/CMakeLists.txt
+++ b/src/crypto/base64/CMakeLists.txt
@@ -7,14 +7,3 @@
 
   base64.c
 )
-
-add_executable(
-  base64_test
-
-  base64_test.cc
-
-  $<TARGET_OBJECTS:test_support>
-)
-
-target_link_libraries(base64_test crypto)
-add_dependencies(all_tests base64_test)
diff --git a/src/crypto/base64/base64.c b/src/crypto/base64/base64.c
index 7afadf7..a47cb15 100644
--- a/src/crypto/base64/base64.c
+++ b/src/crypto/base64/base64.c
@@ -67,10 +67,16 @@
 
 /* Encoding. */
 
-static const unsigned char data_bin2ascii[65] =
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-#define conv_bin2ascii(a) (data_bin2ascii[(a) & 0x3f])
+static uint8_t conv_bin2ascii(uint8_t a) {
+  /* Since PEM is sometimes used to carry private keys, we encode base64 data
+   * itself in constant-time. */
+  a &= 0x3f;
+  uint8_t ret = constant_time_select_8(constant_time_eq_8(a, 62), '+', '/');
+  ret = constant_time_select_8(constant_time_lt_8(a, 62), a - 52 + '0', ret);
+  ret = constant_time_select_8(constant_time_lt_8(a, 52), a - 26 + 'a', ret);
+  ret = constant_time_select_8(constant_time_lt_8(a, 26), a + 'A', ret);
+  return ret;
+}
 
 OPENSSL_COMPILE_ASSERT(sizeof(((EVP_ENCODE_CTX *)(NULL))->data) % 3 == 0,
                        data_length_must_be_multiple_of_base64_chunk_size);
@@ -229,29 +235,28 @@
   OPENSSL_memset(ctx, 0, sizeof(EVP_ENCODE_CTX));
 }
 
-/* kBase64ASCIIToBinData maps characters (c < 128) to their base64 value, or
- * else 0xff if they are invalid. As a special case, the padding character
- * ('=') is mapped to zero. */
-static const uint8_t kBase64ASCIIToBinData[128] = {
-    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff,
-    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff,
-    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f,
-    0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xff, 0xff,
-    0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
-    0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12,
-    0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff,
-    0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
-    0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
-    0x31, 0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff,
-};
-
 static uint8_t base64_ascii_to_bin(uint8_t a) {
-  if (a >= 128) {
-    return 0xFF;
-  }
+  /* Since PEM is sometimes used to carry private keys, we decode base64 data
+   * itself in constant-time. */
+  const uint8_t is_upper =
+      constant_time_ge_8(a, 'A') & constant_time_ge_8('Z', a);
+  const uint8_t is_lower =
+      constant_time_ge_8(a, 'a') & constant_time_ge_8('z', a);
+  const uint8_t is_digit =
+      constant_time_ge_8(a, '0') & constant_time_ge_8('9', a);
+  const uint8_t is_plus = constant_time_eq_8(a, '+');
+  const uint8_t is_slash = constant_time_eq_8(a, '/');
+  const uint8_t is_equals = constant_time_eq_8(a, '=');
 
-  return kBase64ASCIIToBinData[a];
+  uint8_t ret = 0xff; /* 0xff signals invalid. */
+  ret = constant_time_select_8(is_upper, a - 'A', ret);      /* [0,26) */
+  ret = constant_time_select_8(is_lower, a - 'a' + 26, ret); /* [26,52) */
+  ret = constant_time_select_8(is_digit, a - '0' + 52, ret); /* [52,62) */
+  ret = constant_time_select_8(is_plus, 62, ret);
+  ret = constant_time_select_8(is_slash, 63, ret);
+  /* Padding maps to zero, to be further handled by the caller. */
+  ret = constant_time_select_8(is_equals, 0, ret);
+  return ret;
 }
 
 /* base64_decode_quad decodes a single “quad” (i.e. four characters) of base64
diff --git a/src/crypto/base64/base64_test.cc b/src/crypto/base64/base64_test.cc
index bdf3d9a..108c782 100644
--- a/src/crypto/base64/base64_test.cc
+++ b/src/crypto/base64/base64_test.cc
@@ -18,11 +18,14 @@
 #include <string>
 #include <vector>
 
+#include <gtest/gtest.h>
+
 #include <openssl/base64.h>
 #include <openssl/crypto.h>
 #include <openssl/err.h>
 
 #include "../internal.h"
+#include "../test/test_util.h"
 
 
 enum encoding_relation {
@@ -100,7 +103,9 @@
      "=======\n"},
 };
 
-static const size_t kNumTests = OPENSSL_ARRAY_SIZE(kTestVectors);
+class Base64Test : public testing::TestWithParam<TestVector> {};
+
+INSTANTIATE_TEST_CASE_P(, Base64Test, testing::ValuesIn(kTestVectors));
 
 // RemoveNewlines returns a copy of |in| with all '\n' characters removed.
 static std::string RemoveNewlines(const char *in) {
@@ -116,281 +121,187 @@
   return ret;
 }
 
-static bool TestEncodeBlock() {
-  for (unsigned i = 0; i < kNumTests; i++) {
-    const TestVector *t = &kTestVectors[i];
-    if (t->relation != canonical) {
-      continue;
-    }
+TEST_P(Base64Test, EncodeBlock) {
+  const TestVector &t = GetParam();
+  if (t.relation != canonical) {
+    return;
+  }
 
-    const size_t decoded_len = strlen(t->decoded);
+  const size_t decoded_len = strlen(t.decoded);
+  size_t max_encoded_len;
+  ASSERT_TRUE(EVP_EncodedLength(&max_encoded_len, decoded_len));
+
+  std::vector<uint8_t> out_vec(max_encoded_len);
+  uint8_t *out = out_vec.data();
+  size_t len = EVP_EncodeBlock(out, (const uint8_t *)t.decoded, decoded_len);
+
+  std::string encoded(RemoveNewlines(t.encoded));
+  EXPECT_EQ(Bytes(encoded), Bytes(out, len));
+}
+
+TEST_P(Base64Test, DecodeBase64) {
+  const TestVector &t = GetParam();
+  if (t.relation == valid) {
+    // The non-canonical encodings will generally have odd whitespace etc
+    // that |EVP_DecodeBase64| will reject.
+    return;
+  }
+
+  const std::string encoded(RemoveNewlines(t.encoded));
+  std::vector<uint8_t> out_vec(encoded.size());
+  uint8_t *out = out_vec.data();
+
+  size_t len;
+  int ok = EVP_DecodeBase64(out, &len, out_vec.size(),
+                            (const uint8_t *)encoded.data(), encoded.size());
+
+  if (t.relation == invalid) {
+    EXPECT_FALSE(ok);
+  } else if (t.relation == canonical) {
+    ASSERT_TRUE(ok);
+    EXPECT_EQ(Bytes(t.decoded), Bytes(out, len));
+  }
+}
+
+TEST_P(Base64Test, DecodeBlock) {
+  const TestVector &t = GetParam();
+  if (t.relation != canonical) {
+    return;
+  }
+
+  std::string encoded(RemoveNewlines(t.encoded));
+
+  std::vector<uint8_t> out_vec(encoded.size());
+  uint8_t *out = out_vec.data();
+
+  // Test that the padding behavior of the deprecated API is preserved.
+  int ret =
+      EVP_DecodeBlock(out, (const uint8_t *)encoded.data(), encoded.size());
+  ASSERT_GE(ret, 0);
+  // EVP_DecodeBlock should ignore padding.
+  ASSERT_EQ(0, ret % 3);
+  size_t expected_len = strlen(t.decoded);
+  if (expected_len % 3 != 0) {
+    ret -= 3 - (expected_len % 3);
+  }
+  EXPECT_EQ(Bytes(t.decoded), Bytes(out, static_cast<size_t>(ret)));
+}
+
+TEST_P(Base64Test, EncodeDecode) {
+  const TestVector &t = GetParam();
+
+  EVP_ENCODE_CTX ctx;
+  const size_t decoded_len = strlen(t.decoded);
+
+  if (t.relation == canonical) {
     size_t max_encoded_len;
-    if (!EVP_EncodedLength(&max_encoded_len, decoded_len)) {
-      fprintf(stderr, "#%u: EVP_EncodedLength failed\n", i);
-      return false;
-    }
+    ASSERT_TRUE(EVP_EncodedLength(&max_encoded_len, decoded_len));
 
+    // EVP_EncodeUpdate will output new lines every 64 bytes of output so we
+    // need slightly more than |EVP_EncodedLength| returns. */
+    max_encoded_len += (max_encoded_len + 63) >> 6;
     std::vector<uint8_t> out_vec(max_encoded_len);
     uint8_t *out = out_vec.data();
-    size_t len = EVP_EncodeBlock(out, (const uint8_t *)t->decoded, decoded_len);
 
-    std::string encoded(RemoveNewlines(t->encoded));
-    if (len != encoded.size() ||
-        OPENSSL_memcmp(out, encoded.data(), len) != 0) {
-      fprintf(stderr, "encode(\"%s\") = \"%.*s\", want \"%s\"\n",
-              t->decoded, (int)len, (const char*)out, encoded.c_str());
-      return false;
-    }
-  }
+    EVP_EncodeInit(&ctx);
 
-  return true;
-}
-
-static bool TestDecodeBase64() {
-  size_t len;
-
-  for (unsigned i = 0; i < kNumTests; i++) {
-    const TestVector *t = &kTestVectors[i];
-
-    if (t->relation == valid) {
-      // The non-canonical encodings will generally have odd whitespace etc
-      // that |EVP_DecodeBase64| will reject.
-      continue;
-    }
-
-    const std::string encoded(RemoveNewlines(t->encoded));
-    std::vector<uint8_t> out_vec(encoded.size());
-    uint8_t *out = out_vec.data();
-
-    int ok = EVP_DecodeBase64(out, &len, out_vec.size(),
-                              (const uint8_t *)encoded.data(), encoded.size());
-
-    if (t->relation == invalid) {
-      if (ok) {
-        fprintf(stderr, "decode(\"%s\") didn't fail but should have\n",
-                encoded.c_str());
-        return false;
-      }
-    } else if (t->relation == canonical) {
-      if (!ok) {
-        fprintf(stderr, "decode(\"%s\") failed\n", encoded.c_str());
-        return false;
-      }
-
-      if (len != strlen(t->decoded) ||
-          OPENSSL_memcmp(out, t->decoded, len) != 0) {
-        fprintf(stderr, "decode(\"%s\") = \"%.*s\", want \"%s\"\n",
-                encoded.c_str(), (int)len, (const char*)out, t->decoded);
-        return false;
-      }
-    }
-  }
-
-  return true;
-}
-
-static bool TestDecodeBlock() {
-  for (unsigned i = 0; i < kNumTests; i++) {
-    const TestVector *t = &kTestVectors[i];
-    if (t->relation != canonical) {
-      continue;
-    }
-
-    std::string encoded(RemoveNewlines(t->encoded));
-
-    std::vector<uint8_t> out_vec(encoded.size());
-    uint8_t *out = out_vec.data();
-
-    // Test that the padding behavior of the deprecated API is preserved.
-    int ret =
-        EVP_DecodeBlock(out, (const uint8_t *)encoded.data(), encoded.size());
-    if (ret < 0) {
-      fprintf(stderr, "EVP_DecodeBlock(\"%s\") failed\n", t->encoded);
-      return false;
-    }
-    if (ret % 3 != 0) {
-      fprintf(stderr, "EVP_DecodeBlock did not ignore padding\n");
-      return false;
-    }
-    size_t expected_len = strlen(t->decoded);
-    if (expected_len % 3 != 0) {
-      ret -= 3 - (expected_len % 3);
-    }
-    if (static_cast<size_t>(ret) != strlen(t->decoded) ||
-        OPENSSL_memcmp(out, t->decoded, ret) != 0) {
-      fprintf(stderr, "decode(\"%s\") = \"%.*s\", want \"%s\"\n",
-              t->encoded, ret, (const char*)out, t->decoded);
-      return false;
-    }
-  }
-
-  return true;
-}
-
-static bool TestEncodeDecode() {
-  for (unsigned test_num = 0; test_num < kNumTests; test_num++) {
-    const TestVector *t = &kTestVectors[test_num];
-
-    EVP_ENCODE_CTX ctx;
-    const size_t decoded_len = strlen(t->decoded);
-
-    if (t->relation == canonical) {
-      size_t max_encoded_len;
-      if (!EVP_EncodedLength(&max_encoded_len, decoded_len)) {
-        fprintf(stderr, "#%u: EVP_EncodedLength failed\n", test_num);
-        return false;
-      }
-
-      // EVP_EncodeUpdate will output new lines every 64 bytes of output so we
-      // need slightly more than |EVP_EncodedLength| returns. */
-      max_encoded_len += (max_encoded_len + 63) >> 6;
-      std::vector<uint8_t> out_vec(max_encoded_len);
-      uint8_t *out = out_vec.data();
-
-      EVP_EncodeInit(&ctx);
-
-      int out_len;
-      EVP_EncodeUpdate(&ctx, out, &out_len,
-                       reinterpret_cast<const uint8_t *>(t->decoded),
-                       decoded_len);
-      size_t total = out_len;
-
-      EVP_EncodeFinal(&ctx, out + total, &out_len);
-      total += out_len;
-
-      if (total != strlen(t->encoded) ||
-          OPENSSL_memcmp(out, t->encoded, total) != 0) {
-        fprintf(stderr, "#%u: EVP_EncodeUpdate produced different output: '%s' (%u)\n",
-                test_num, out, static_cast<unsigned>(total));
-        return false;
-      }
-    }
-
-    std::vector<uint8_t> out_vec(strlen(t->encoded));
-    uint8_t *out = out_vec.data();
-
-    EVP_DecodeInit(&ctx);
     int out_len;
-    size_t total = 0;
-    int ret = EVP_DecodeUpdate(&ctx, out, &out_len,
-                               reinterpret_cast<const uint8_t *>(t->encoded),
-                               strlen(t->encoded));
-    if (ret != -1) {
-      total = out_len;
-      ret = EVP_DecodeFinal(&ctx, out + total, &out_len);
-      total += out_len;
-    }
+    EVP_EncodeUpdate(&ctx, out, &out_len,
+                     reinterpret_cast<const uint8_t *>(t.decoded),
+                     decoded_len);
+    size_t total = out_len;
 
-    switch (t->relation) {
-      case canonical:
-      case valid:
-        if (ret == -1) {
-          fprintf(stderr, "#%u: EVP_DecodeUpdate failed\n", test_num);
-          return false;
-        }
-        if (total != decoded_len ||
-            OPENSSL_memcmp(out, t->decoded, decoded_len)) {
-          fprintf(stderr, "#%u: EVP_DecodeUpdate produced incorrect output\n",
-                  test_num);
-          return false;
-        }
-        break;
+    EVP_EncodeFinal(&ctx, out + total, &out_len);
+    total += out_len;
 
-      case invalid:
-        if (ret != -1) {
-          fprintf(stderr, "#%u: EVP_DecodeUpdate was successful but shouldn't have been\n", test_num);
-          return false;
-        }
-        break;
-    }
+    EXPECT_EQ(Bytes(t.encoded), Bytes(out, total));
   }
 
-  return true;
+  std::vector<uint8_t> out_vec(strlen(t.encoded));
+  uint8_t *out = out_vec.data();
+
+  EVP_DecodeInit(&ctx);
+  int out_len;
+  size_t total = 0;
+  int ret = EVP_DecodeUpdate(&ctx, out, &out_len,
+                             reinterpret_cast<const uint8_t *>(t.encoded),
+                             strlen(t.encoded));
+  if (ret != -1) {
+    total = out_len;
+    ret = EVP_DecodeFinal(&ctx, out + total, &out_len);
+    total += out_len;
+  }
+
+  switch (t.relation) {
+    case canonical:
+    case valid:
+      ASSERT_NE(-1, ret);
+      EXPECT_EQ(Bytes(t.decoded), Bytes(out, total));
+      break;
+
+    case invalid:
+      EXPECT_EQ(-1, ret);
+      break;
+  }
 }
 
-static bool TestDecodeUpdateStreaming() {
-  for (unsigned test_num = 0; test_num < kNumTests; test_num++) {
-    const TestVector *t = &kTestVectors[test_num];
-    if (t->relation == invalid) {
-      continue;
-    }
+TEST_P(Base64Test, DecodeUpdateStreaming) {
+  const TestVector &t = GetParam();
+  if (t.relation == invalid) {
+    return;
+  }
 
-    const size_t encoded_len = strlen(t->encoded);
+  const size_t encoded_len = strlen(t.encoded);
 
-    std::vector<uint8_t> out(encoded_len);
+  std::vector<uint8_t> out(encoded_len);
 
-    for (size_t chunk_size = 1; chunk_size <= encoded_len; chunk_size++) {
-      size_t out_len = 0;
-      EVP_ENCODE_CTX ctx;
-      EVP_DecodeInit(&ctx);
+  for (size_t chunk_size = 1; chunk_size <= encoded_len; chunk_size++) {
+    SCOPED_TRACE(chunk_size);
+    size_t out_len = 0;
+    EVP_ENCODE_CTX ctx;
+    EVP_DecodeInit(&ctx);
 
-      for (size_t i = 0; i < encoded_len;) {
-        size_t todo = encoded_len - i;
-        if (todo > chunk_size) {
-          todo = chunk_size;
-        }
-
-        int bytes_written;
-        int ret = EVP_DecodeUpdate(
-            &ctx, out.data() + out_len, &bytes_written,
-            reinterpret_cast<const uint8_t *>(t->encoded + i), todo);
-        i += todo;
-
-        switch (ret) {
-          case -1:
-            fprintf(stderr, "#%u: EVP_DecodeUpdate returned error\n", test_num);
-            return 0;
-          case 0:
-            out_len += bytes_written;
-            if (i == encoded_len ||
-                (i + 1 == encoded_len && t->encoded[i] == '\n') ||
-                /* If there was an '-' in the input (which means “EOF”) then
-                 * this loop will continue to test that |EVP_DecodeUpdate| will
-                 * ignore the remainder of the input. */
-                strchr(t->encoded, '-') != nullptr) {
-              break;
-            }
-
-            fprintf(stderr,
-                    "#%u: EVP_DecodeUpdate returned zero before end of "
-                    "encoded data\n",
-                    test_num);
-            return 0;
-          default:
-            out_len += bytes_written;
-        }
+    for (size_t i = 0; i < encoded_len;) {
+      size_t todo = encoded_len - i;
+      if (todo > chunk_size) {
+        todo = chunk_size;
       }
 
       int bytes_written;
-      int ret = EVP_DecodeFinal(&ctx, out.data() + out_len, &bytes_written);
-      if (ret == -1) {
-        fprintf(stderr, "#%u: EVP_DecodeFinal returned error\n", test_num);
-        return 0;
-      }
-      out_len += bytes_written;
+      int ret = EVP_DecodeUpdate(
+          &ctx, out.data() + out_len, &bytes_written,
+          reinterpret_cast<const uint8_t *>(t.encoded + i), todo);
+      i += todo;
 
-      if (out_len != strlen(t->decoded) ||
-          OPENSSL_memcmp(out.data(), t->decoded, out_len) != 0) {
-        fprintf(stderr, "#%u: incorrect output\n", test_num);
-        return 0;
+      switch (ret) {
+        case -1:
+          FAIL() << "EVP_DecodeUpdate failed";
+        case 0:
+          out_len += bytes_written;
+          if (i == encoded_len ||
+              (i + 1 == encoded_len && t.encoded[i] == '\n') ||
+              /* If there was an '-' in the input (which means “EOF”) then
+               * this loop will continue to test that |EVP_DecodeUpdate| will
+               * ignore the remainder of the input. */
+              strchr(t.encoded, '-') != nullptr) {
+            break;
+          }
+
+          FAIL()
+              << "EVP_DecodeUpdate returned zero before end of encoded data.";
+        case 1:
+          out_len += bytes_written;
+          break;
+        default:
+          FAIL() << "Invalid return value " << ret;
       }
     }
+
+    int bytes_written;
+    int ret = EVP_DecodeFinal(&ctx, out.data() + out_len, &bytes_written);
+    ASSERT_NE(ret, -1);
+    out_len += bytes_written;
+
+    EXPECT_EQ(Bytes(t.decoded), Bytes(out.data(), out_len));
   }
-
-  return true;
-}
-
-int main(void) {
-  CRYPTO_library_init();
-
-  if (!TestEncodeBlock() ||
-      !TestDecodeBase64() ||
-      !TestDecodeBlock() ||
-      !TestDecodeUpdateStreaming() ||
-      !TestEncodeDecode()) {
-    return 1;
-  }
-
-  printf("PASS\n");
-  return 0;
 }
diff --git a/src/crypto/bn/bn_test.cc b/src/crypto/bn/bn_test.cc
index c0af58d..9597956 100644
--- a/src/crypto/bn/bn_test.cc
+++ b/src/crypto/bn/bn_test.cc
@@ -1105,6 +1105,49 @@
   return true;
 }
 
+static bool TestRandRange() {
+  bssl::UniquePtr<BIGNUM> bn(BN_new()), six(BN_new());
+  if (!bn || !six ||
+      !BN_set_word(six.get(), 6)) {
+    return false;
+  }
+
+  // Generate 1,000 random numbers and ensure they all stay in range. This check
+  // may flakily pass when it should have failed but will not flakily fail.
+  bool seen[6] = {false, false, false, false, false};
+  for (unsigned i = 0; i < 1000; i++) {
+    if (!BN_rand_range_ex(bn.get(), 1, six.get())) {
+      return false;
+    }
+
+    BN_ULONG word = BN_get_word(bn.get());
+    if (BN_is_negative(bn.get()) ||
+        word < 1 ||
+        word >= 6) {
+      fprintf(stderr,
+              "BN_rand_range_ex generated invalid value: " BN_DEC_FMT1 "\n",
+              word);
+      return false;
+    }
+
+    seen[word] = true;
+  }
+
+  // Test that all numbers were accounted for. Note this test is probabilistic
+  // and may flakily fail when it should have passed. As an upper-bound on the
+  // failure probability, we'll never see any one number with probability
+  // (4/5)^1000, so the probability of failure is at most 5*(4/5)^1000. This is
+  // around 1 in 2^320.
+  for (unsigned i = 1; i < 6; i++) {
+    if (!seen[i]) {
+      fprintf(stderr, "BN_rand_range failed to generate %u.\n", i);
+      return false;
+    }
+  }
+
+  return true;
+}
+
 struct ASN1Test {
   const char *value_ascii;
   const char *der;
@@ -1775,6 +1818,7 @@
       !TestLittleEndian() ||
       !TestMPI() ||
       !TestRand() ||
+      !TestRandRange() ||
       !TestASN1() ||
       !TestNegativeZero(ctx.get()) ||
       !TestBadModulus(ctx.get()) ||
@@ -1784,6 +1828,7 @@
       !TestBN2Dec() ||
       !TestBNSetGetU64() ||
       !TestBNPow2(ctx.get())) {
+    ERR_print_errors_fp(stderr);
     return 1;
   }
 
diff --git a/src/crypto/bn/prime.c b/src/crypto/bn/prime.c
index 0f668d7..1dff9e7 100644
--- a/src/crypto/bn/prime.c
+++ b/src/crypto/bn/prime.c
@@ -113,24 +113,6 @@
 
 #include "internal.h"
 
-/* number of Miller-Rabin iterations for an error rate  of less than 2^-80
- * for random 'b'-bit input, b >= 100 (taken from table 4.4 in the Handbook
- * of Applied Cryptography [Menezes, van Oorschot, Vanstone; CRC Press 1996];
- * original paper: Damgaard, Landrock, Pomerance: Average case error estimates
- * for the strong probable prime test. -- Math. Comp. 61 (1993) 177-194) */
-#define BN_prime_checks_for_size(b) ((b) >= 1300 ?  2 : \
-                                (b) >=  850 ?  3 : \
-                                (b) >=  650 ?  4 : \
-                                (b) >=  550 ?  5 : \
-                                (b) >=  450 ?  6 : \
-                                (b) >=  400 ?  7 : \
-                                (b) >=  350 ?  8 : \
-                                (b) >=  300 ?  9 : \
-                                (b) >=  250 ? 12 : \
-                                (b) >=  200 ? 15 : \
-                                (b) >=  150 ? 18 : \
-                                /* b >= 100 */ 27)
-
 /* The quick sieve algorithm approach to weeding out primes is Philip
  * Zimmermann's, as implemented in PGP.  I have had a read of his comments and
  * implemented my own version. */
@@ -329,6 +311,37 @@
     17851, 17863,
 };
 
+/* BN_prime_checks_for_size returns the number of Miller-Rabin iterations
+ * necessary for a 'bits'-bit prime, in order to maintain an error rate greater
+ * than the security level for an RSA prime of that many bits (calculated using
+ * the FIPS SP 800-57 security level and 186-4 Section F.1; original paper:
+ * Damgaard, Landrock, Pomerance: Average case error estimates for the strong
+ * probable prime test. -- Math. Comp. 61 (1993) 177-194) */
+static int BN_prime_checks_for_size(int bits) {
+  if (bits >= 3747) {
+    return 3;
+  }
+  if (bits >= 1345) {
+    return 4;
+  }
+  if (bits >= 476) {
+    return 5;
+  }
+  if (bits >= 400) {
+    return 6;
+  }
+  if (bits >= 308) {
+    return 8;
+  }
+  if (bits >= 205) {
+    return 13;
+  }
+  if (bits >= 155) {
+    return 19;
+  }
+  return 28;
+}
+
 static int witness(BIGNUM *w, const BIGNUM *a, const BIGNUM *a1,
                    const BIGNUM *a1_odd, int k, BN_CTX *ctx, BN_MONT_CTX *mont);
 static int probable_prime(BIGNUM *rnd, int bits);
@@ -636,13 +649,6 @@
   return 1;
 }
 
-static BN_ULONG get_word(const BIGNUM *bn) {
-  if (bn->top == 1) {
-    return bn->d[0];
-  }
-  return 0;
-}
-
 static int probable_prime(BIGNUM *rnd, int bits) {
   int i;
   uint16_t mods[NUMPRIMES];
@@ -669,9 +675,9 @@
     BN_ULONG size_limit;
     if (bits == BN_BITS2) {
       /* Avoid undefined behavior. */
-      size_limit = ~((BN_ULONG)0) - get_word(rnd);
+      size_limit = ~((BN_ULONG)0) - BN_get_word(rnd);
     } else {
-      size_limit = (((BN_ULONG)1) << bits) - get_word(rnd) - 1;
+      size_limit = (((BN_ULONG)1) << bits) - BN_get_word(rnd) - 1;
     }
     if (size_limit < maxdelta) {
       maxdelta = size_limit;
@@ -681,7 +687,7 @@
 
 loop:
   if (is_single_word) {
-    BN_ULONG rnd_word = get_word(rnd);
+    BN_ULONG rnd_word = BN_get_word(rnd);
 
     /* In the case that the candidate prime is a single word then
      * we check that:
diff --git a/src/crypto/bn/random.c b/src/crypto/bn/random.c
index 6f922c0..55eca80 100644
--- a/src/crypto/bn/random.c
+++ b/src/crypto/bn/random.c
@@ -114,11 +114,17 @@
 #include <openssl/mem.h>
 #include <openssl/rand.h>
 #include <openssl/sha.h>
+#include <openssl/type_check.h>
 
 #include "../internal.h"
+#include "../rand/internal.h"
 
 
-int BN_rand(BIGNUM *rnd, int bits, int top, int bottom) {
+static const uint8_t kZeroAdditionalData[32] = {0};
+
+static int bn_rand_with_additional_data(BIGNUM *rnd, int bits, int top,
+                                        int bottom,
+                                        const uint8_t additional_data[32]) {
   uint8_t *buf = NULL;
   int ret = 0, bit, bytes, mask;
 
@@ -153,9 +159,7 @@
   }
 
   /* Make a random number and set the top and bottom bits. */
-  if (!RAND_bytes(buf, bytes)) {
-    goto err;
-  }
+  RAND_bytes_with_additional_data(buf, bytes, additional_data);
 
   if (top != BN_RAND_TOP_ANY) {
     if (top == BN_RAND_TOP_TWO && bits > 1) {
@@ -191,68 +195,56 @@
   return (ret);
 }
 
+int BN_rand(BIGNUM *rnd, int bits, int top, int bottom) {
+  return bn_rand_with_additional_data(rnd, bits, top, bottom,
+                                      kZeroAdditionalData);
+}
+
 int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom) {
   return BN_rand(rnd, bits, top, bottom);
 }
 
-int BN_rand_range_ex(BIGNUM *r, BN_ULONG min_inclusive,
-                     const BIGNUM *max_exclusive) {
-  unsigned n;
-  unsigned count = 100;
-
+static int bn_rand_range_with_additional_data(
+    BIGNUM *r, BN_ULONG min_inclusive, const BIGNUM *max_exclusive,
+    const uint8_t additional_data[32]) {
   if (BN_cmp_word(max_exclusive, min_inclusive) <= 0) {
     OPENSSL_PUT_ERROR(BN, BN_R_INVALID_RANGE);
     return 0;
   }
 
-  n = BN_num_bits(max_exclusive); /* n > 0 */
-
-  /* BN_is_bit_set(range, n - 1) always holds */
-  if (n == 1) {
-    BN_zero(r);
-    return 1;
-  }
-
+  /* This function is used to implement steps 4 through 7 of FIPS 186-4
+   * appendices B.4.2 and B.5.2. When called in those contexts, |max_exclusive|
+   * is n and |min_inclusive| is one. */
+  unsigned count = 100;
+  unsigned n = BN_num_bits(max_exclusive); /* n > 0 */
   do {
     if (!--count) {
       OPENSSL_PUT_ERROR(BN, BN_R_TOO_MANY_ITERATIONS);
       return 0;
     }
 
-    if (!BN_is_bit_set(max_exclusive, n - 2) &&
-        !BN_is_bit_set(max_exclusive, n - 3)) {
-      /* range = 100..._2, so 3*range (= 11..._2) is exactly one bit longer
-       * than range. This is a common scenario when generating a random value
-       * modulo an RSA public modulus, e.g. for RSA base blinding. */
-      if (!BN_rand(r, n + 1, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY)) {
-        return 0;
-      }
-
-      /* If r < 3*range, use r := r MOD range (which is either r, r - range, or
-       * r - 2*range). Otherwise, iterate again. Since 3*range = 11..._2, each
-       * iteration succeeds with probability >= .75. */
-      if (BN_cmp(r, max_exclusive) >= 0) {
-        if (!BN_sub(r, r, max_exclusive)) {
-          return 0;
-        }
-        if (BN_cmp(r, max_exclusive) >= 0) {
-          if (!BN_sub(r, r, max_exclusive)) {
-            return 0;
-          }
-        }
-      }
-    } else {
-      /* range = 11..._2  or  range = 101..._2 */
-      if (!BN_rand(r, n, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY)) {
-        return 0;
-      }
+    if (/* steps 4 and 5 */
+        !bn_rand_with_additional_data(r, n, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY,
+                                      additional_data) ||
+        /* step 7 */
+        !BN_add_word(r, min_inclusive)) {
+      return 0;
     }
-  } while (BN_cmp_word(r, min_inclusive) < 0 ||
-           BN_cmp(r, max_exclusive) >= 0);
+
+    /* Step 6. This loops if |r| >= |max_exclusive|. This is identical to
+     * checking |r| > |max_exclusive| - 1 or |r| - 1 > |max_exclusive| - 2, the
+     * formulation stated in FIPS 186-4. */
+  } while (BN_cmp(r, max_exclusive) >= 0);
 
   return 1;
 }
 
+int BN_rand_range_ex(BIGNUM *r, BN_ULONG min_inclusive,
+                     const BIGNUM *max_exclusive) {
+  return bn_rand_range_with_additional_data(r, min_inclusive, max_exclusive,
+                                            kZeroAdditionalData);
+}
+
 int BN_rand_range(BIGNUM *r, const BIGNUM *range) {
   return BN_rand_range_ex(r, 0, range);
 }
@@ -264,80 +256,31 @@
 int BN_generate_dsa_nonce(BIGNUM *out, const BIGNUM *range, const BIGNUM *priv,
                           const uint8_t *message, size_t message_len,
                           BN_CTX *ctx) {
-  SHA512_CTX sha;
-  /* We use 512 bits of random data per iteration to
-   * ensure that we have at least |range| bits of randomness. */
-  uint8_t random_bytes[64];
-  uint8_t digest[SHA512_DIGEST_LENGTH];
-  size_t done, todo, attempt;
-  const unsigned num_k_bytes = BN_num_bytes(range);
-  const unsigned bits_to_mask = (8 - (BN_num_bits(range) % 8)) % 8;
-  uint8_t private_bytes[96];
-  uint8_t *k_bytes = NULL;
-  int ret = 0;
-
-  if (out == NULL) {
-    return 0;
-  }
-
-  if (BN_is_zero(range)) {
-    OPENSSL_PUT_ERROR(BN, BN_R_DIV_BY_ZERO);
-    goto err;
-  }
-
-  k_bytes = OPENSSL_malloc(num_k_bytes);
-  if (!k_bytes) {
-    OPENSSL_PUT_ERROR(BN, ERR_R_MALLOC_FAILURE);
-    goto err;
-  }
-
   /* We copy |priv| into a local buffer to avoid furthur exposing its
    * length. */
-  todo = sizeof(priv->d[0]) * priv->top;
+  uint8_t private_bytes[96];
+  size_t todo = sizeof(priv->d[0]) * priv->top;
   if (todo > sizeof(private_bytes)) {
     /* No reasonable DSA or ECDSA key should have a private key
      * this large and we don't handle this case in order to avoid
      * leaking the length of the private key. */
     OPENSSL_PUT_ERROR(BN, BN_R_PRIVATE_KEY_TOO_LARGE);
-    goto err;
+    return 0;
   }
   OPENSSL_memcpy(private_bytes, priv->d, todo);
   OPENSSL_memset(private_bytes + todo, 0, sizeof(private_bytes) - todo);
 
-  for (attempt = 0;; attempt++) {
-    for (done = 0; done < num_k_bytes;) {
-      if (!RAND_bytes(random_bytes, sizeof(random_bytes))) {
-        goto err;
-      }
-      SHA512_Init(&sha);
-      SHA512_Update(&sha, &attempt, sizeof(attempt));
-      SHA512_Update(&sha, &done, sizeof(done));
-      SHA512_Update(&sha, private_bytes, sizeof(private_bytes));
-      SHA512_Update(&sha, message, message_len);
-      SHA512_Update(&sha, random_bytes, sizeof(random_bytes));
-      SHA512_Final(digest, &sha);
+  /* Pass a SHA256 hash of the private key and message as additional data into
+   * the RBG. This is a hardening measure against entropy failure. */
+  OPENSSL_COMPILE_ASSERT(SHA256_DIGEST_LENGTH == 32,
+                         additional_data_is_different_size_from_sha256);
+  SHA256_CTX sha;
+  uint8_t digest[SHA256_DIGEST_LENGTH];
+  SHA256_Init(&sha);
+  SHA256_Update(&sha, private_bytes, sizeof(private_bytes));
+  SHA256_Update(&sha, message, message_len);
+  SHA256_Final(digest, &sha);
 
-      todo = num_k_bytes - done;
-      if (todo > SHA512_DIGEST_LENGTH) {
-        todo = SHA512_DIGEST_LENGTH;
-      }
-      OPENSSL_memcpy(k_bytes + done, digest, todo);
-      done += todo;
-    }
-
-    k_bytes[0] &= 0xff >> bits_to_mask;
-
-    if (!BN_bin2bn(k_bytes, num_k_bytes, out)) {
-      goto err;
-    }
-    if (BN_cmp(out, range) < 0) {
-      break;
-    }
-  }
-
-  ret = 1;
-
-err:
-  OPENSSL_free(k_bytes);
-  return ret;
+  /* Select a value k from [1, range-1], following FIPS 186-4 appendix B.5.2. */
+  return bn_rand_range_with_additional_data(out, 1, range, digest);
 }
diff --git a/src/crypto/bytestring/CMakeLists.txt b/src/crypto/bytestring/CMakeLists.txt
index 362e702..37ff51c 100644
--- a/src/crypto/bytestring/CMakeLists.txt
+++ b/src/crypto/bytestring/CMakeLists.txt
@@ -10,14 +10,3 @@
   cbs.c
   cbb.c
 )
-
-add_executable(
-  bytestring_test
-
-  bytestring_test.cc
-
-  $<TARGET_OBJECTS:test_support>
-)
-
-target_link_libraries(bytestring_test crypto)
-add_dependencies(all_tests bytestring_test)
diff --git a/src/crypto/bytestring/bytestring_test.cc b/src/crypto/bytestring/bytestring_test.cc
index 6ec6fcf..e8e14d9 100644
--- a/src/crypto/bytestring/bytestring_test.cc
+++ b/src/crypto/bytestring/bytestring_test.cc
@@ -22,49 +22,54 @@
 
 #include <vector>
 
+#include <gtest/gtest.h>
+
 #include <openssl/bytestring.h>
 #include <openssl/crypto.h>
 
 #include "internal.h"
 #include "../internal.h"
+#include "../test/test_util.h"
 
 
-static bool TestSkip() {
+TEST(CBSTest, Skip) {
   static const uint8_t kData[] = {1, 2, 3};
   CBS data;
 
   CBS_init(&data, kData, sizeof(kData));
-  return CBS_len(&data) == 3 &&
-      CBS_skip(&data, 1) &&
-      CBS_len(&data) == 2 &&
-      CBS_skip(&data, 2) &&
-      CBS_len(&data) == 0 &&
-      !CBS_skip(&data, 1);
+  EXPECT_EQ(3u, CBS_len(&data));
+  EXPECT_TRUE(CBS_skip(&data, 1));
+  EXPECT_EQ(2u, CBS_len(&data));
+  EXPECT_TRUE(CBS_skip(&data, 2));
+  EXPECT_EQ(0u, CBS_len(&data));
+  EXPECT_FALSE(CBS_skip(&data, 1));
 }
 
-static bool TestGetUint() {
-  static const uint8_t kData[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
+TEST(CBSTest, GetUint) {
+  static const uint8_t kData[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
   uint8_t u8;
   uint16_t u16;
   uint32_t u32;
   CBS data;
 
   CBS_init(&data, kData, sizeof(kData));
-  return CBS_get_u8(&data, &u8) &&
-    u8 == 1 &&
-    CBS_get_u16(&data, &u16) &&
-    u16 == 0x203 &&
-    CBS_get_u24(&data, &u32) &&
-    u32 == 0x40506 &&
-    CBS_get_u32(&data, &u32) &&
-    u32 == 0x708090a &&
-    CBS_get_last_u8(&data, &u8) &&
-    u8 == 0xb &&
-    !CBS_get_u8(&data, &u8) &&
-    !CBS_get_last_u8(&data, &u8);
+  ASSERT_TRUE(CBS_get_u8(&data, &u8));
+  EXPECT_EQ(1u, u8);
+  ASSERT_TRUE(CBS_get_u16(&data, &u16));
+  EXPECT_EQ(0x203u, u16);
+  ASSERT_TRUE(CBS_get_u24(&data, &u32));
+  EXPECT_EQ(0x40506u, u32);
+  ASSERT_TRUE(CBS_get_u32(&data, &u32));
+  EXPECT_EQ(0x708090au, u32);
+  ASSERT_TRUE(CBS_get_last_u8(&data, &u8));
+  EXPECT_EQ(0xcu, u8);
+  ASSERT_TRUE(CBS_get_last_u8(&data, &u8));
+  EXPECT_EQ(0xbu, u8);
+  EXPECT_FALSE(CBS_get_u8(&data, &u8));
+  EXPECT_FALSE(CBS_get_last_u8(&data, &u8));
 }
 
-static bool TestGetPrefixed() {
+TEST(CBSTest, GetPrefixed) {
   static const uint8_t kData[] = {1, 2, 0, 2, 3, 4, 0, 0, 3, 3, 2, 1};
   uint8_t u8;
   uint16_t u16;
@@ -72,45 +77,37 @@
   CBS data, prefixed;
 
   CBS_init(&data, kData, sizeof(kData));
-  return CBS_get_u8_length_prefixed(&data, &prefixed) &&
-    CBS_len(&prefixed) == 1 &&
-    CBS_get_u8(&prefixed, &u8) &&
-    u8 == 2 &&
-    CBS_get_u16_length_prefixed(&data, &prefixed) &&
-    CBS_len(&prefixed) == 2 &&
-    CBS_get_u16(&prefixed, &u16) &&
-    u16 == 0x304 &&
-    CBS_get_u24_length_prefixed(&data, &prefixed) &&
-    CBS_len(&prefixed) == 3 &&
-    CBS_get_u24(&prefixed, &u32) &&
-    u32 == 0x30201;
+  ASSERT_TRUE(CBS_get_u8_length_prefixed(&data, &prefixed));
+  EXPECT_EQ(1u, CBS_len(&prefixed));
+  ASSERT_TRUE(CBS_get_u8(&prefixed, &u8));
+  EXPECT_EQ(2u, u8);
+  ASSERT_TRUE(CBS_get_u16_length_prefixed(&data, &prefixed));
+  EXPECT_EQ(2u, CBS_len(&prefixed));
+  ASSERT_TRUE(CBS_get_u16(&prefixed, &u16));
+  EXPECT_EQ(0x304u, u16);
+  ASSERT_TRUE(CBS_get_u24_length_prefixed(&data, &prefixed));
+  EXPECT_EQ(3u, CBS_len(&prefixed));
+  ASSERT_TRUE(CBS_get_u24(&prefixed, &u32));
+  EXPECT_EQ(0x30201u, u32);
 }
 
-static bool TestGetPrefixedBad() {
+TEST(CBSTest, GetPrefixedBad) {
   static const uint8_t kData1[] = {2, 1};
   static const uint8_t kData2[] = {0, 2, 1};
   static const uint8_t kData3[] = {0, 0, 2, 1};
   CBS data, prefixed;
 
   CBS_init(&data, kData1, sizeof(kData1));
-  if (CBS_get_u8_length_prefixed(&data, &prefixed)) {
-    return false;
-  }
+  EXPECT_FALSE(CBS_get_u8_length_prefixed(&data, &prefixed));
 
   CBS_init(&data, kData2, sizeof(kData2));
-  if (CBS_get_u16_length_prefixed(&data, &prefixed)) {
-    return false;
-  }
+  EXPECT_FALSE(CBS_get_u16_length_prefixed(&data, &prefixed));
 
   CBS_init(&data, kData3, sizeof(kData3));
-  if (CBS_get_u24_length_prefixed(&data, &prefixed)) {
-    return false;
-  }
-
-  return true;
+  EXPECT_FALSE(CBS_get_u24_length_prefixed(&data, &prefixed));
 }
 
-static bool TestGetASN1() {
+TEST(CBSTest, GetASN1) {
   static const uint8_t kData1[] = {0x30, 2, 1, 2};
   static const uint8_t kData2[] = {0x30, 3, 1, 2};
   static const uint8_t kData3[] = {0x30, 0x80};
@@ -126,133 +123,101 @@
   uint64_t value;
 
   CBS_init(&data, kData1, sizeof(kData1));
-  if (CBS_peek_asn1_tag(&data, 0x1) ||
-      !CBS_peek_asn1_tag(&data, 0x30)) {
-    return false;
-  }
-  if (!CBS_get_asn1(&data, &contents, 0x30) ||
-      CBS_len(&contents) != 2 ||
-      OPENSSL_memcmp(CBS_data(&contents), "\x01\x02", 2) != 0) {
-    return false;
-  }
+  EXPECT_FALSE(CBS_peek_asn1_tag(&data, 0x1));
+  EXPECT_TRUE(CBS_peek_asn1_tag(&data, 0x30));
+
+  ASSERT_TRUE(CBS_get_asn1(&data, &contents, 0x30));
+  EXPECT_EQ(Bytes("\x01\x02"), Bytes(CBS_data(&contents), CBS_len(&contents)));
 
   CBS_init(&data, kData2, sizeof(kData2));
   // data is truncated
-  if (CBS_get_asn1(&data, &contents, 0x30)) {
-    return false;
-  }
+  EXPECT_FALSE(CBS_get_asn1(&data, &contents, 0x30));
 
   CBS_init(&data, kData3, sizeof(kData3));
   // zero byte length of length
-  if (CBS_get_asn1(&data, &contents, 0x30)) {
-    return false;
-  }
+  EXPECT_FALSE(CBS_get_asn1(&data, &contents, 0x30));
 
   CBS_init(&data, kData4, sizeof(kData4));
   // long form mistakenly used.
-  if (CBS_get_asn1(&data, &contents, 0x30)) {
-    return false;
-  }
+  EXPECT_FALSE(CBS_get_asn1(&data, &contents, 0x30));
 
   CBS_init(&data, kData5, sizeof(kData5));
   // length takes too many bytes.
-  if (CBS_get_asn1(&data, &contents, 0x30)) {
-    return false;
-  }
+  EXPECT_FALSE(CBS_get_asn1(&data, &contents, 0x30));
 
   CBS_init(&data, kData1, sizeof(kData1));
   // wrong tag.
-  if (CBS_get_asn1(&data, &contents, 0x31)) {
-    return false;
-  }
+  EXPECT_FALSE(CBS_get_asn1(&data, &contents, 0x31));
 
   CBS_init(&data, NULL, 0);
   // peek at empty data.
-  if (CBS_peek_asn1_tag(&data, 0x30)) {
-    return false;
-  }
+  EXPECT_FALSE(CBS_peek_asn1_tag(&data, 0x30));
 
   CBS_init(&data, NULL, 0);
   // optional elements at empty data.
-  if (!CBS_get_optional_asn1(&data, &contents, &present, 0xa0) ||
-      present ||
-      !CBS_get_optional_asn1_octet_string(&data, &contents, &present, 0xa0) ||
-      present ||
-      CBS_len(&contents) != 0 ||
-      !CBS_get_optional_asn1_octet_string(&data, &contents, NULL, 0xa0) ||
-      CBS_len(&contents) != 0 ||
-      !CBS_get_optional_asn1_uint64(&data, &value, 0xa0, 42) ||
-      value != 42) {
-    return false;
-  }
+  ASSERT_TRUE(CBS_get_optional_asn1(&data, &contents, &present, 0xa0));
+  EXPECT_FALSE(present);
+  ASSERT_TRUE(
+      CBS_get_optional_asn1_octet_string(&data, &contents, &present, 0xa0));
+  EXPECT_FALSE(present);
+  EXPECT_EQ(0u, CBS_len(&contents));
+  ASSERT_TRUE(CBS_get_optional_asn1_octet_string(&data, &contents, NULL, 0xa0));
+  EXPECT_EQ(0u, CBS_len(&contents));
+  ASSERT_TRUE(CBS_get_optional_asn1_uint64(&data, &value, 0xa0, 42));
+  EXPECT_EQ(42u, value);
 
   CBS_init(&data, kData6, sizeof(kData6));
   // optional element.
-  if (!CBS_get_optional_asn1(&data, &contents, &present, 0xa0) ||
-      present ||
-      !CBS_get_optional_asn1(&data, &contents, &present, 0xa1) ||
-      !present ||
-      CBS_len(&contents) != 3 ||
-      OPENSSL_memcmp(CBS_data(&contents), "\x04\x01\x01", 3) != 0) {
-    return false;
-  }
+  ASSERT_TRUE(CBS_get_optional_asn1(&data, &contents, &present, 0xa0));
+  EXPECT_FALSE(present);
+  ASSERT_TRUE(CBS_get_optional_asn1(&data, &contents, &present, 0xa1));
+  EXPECT_TRUE(present);
+  EXPECT_EQ(Bytes("\x04\x01\x01"),
+            Bytes(CBS_data(&contents), CBS_len(&contents)));
 
   CBS_init(&data, kData6, sizeof(kData6));
   // optional octet string.
-  if (!CBS_get_optional_asn1_octet_string(&data, &contents, &present, 0xa0) ||
-      present ||
-      CBS_len(&contents) != 0 ||
-      !CBS_get_optional_asn1_octet_string(&data, &contents, &present, 0xa1) ||
-      !present ||
-      CBS_len(&contents) != 1 ||
-      CBS_data(&contents)[0] != 1) {
-    return false;
-  }
+  ASSERT_TRUE(
+      CBS_get_optional_asn1_octet_string(&data, &contents, &present, 0xa0));
+  EXPECT_FALSE(present);
+  EXPECT_EQ(0u, CBS_len(&contents));
+  ASSERT_TRUE(
+      CBS_get_optional_asn1_octet_string(&data, &contents, &present, 0xa1));
+  EXPECT_TRUE(present);
+  EXPECT_EQ(Bytes("\x01"), Bytes(CBS_data(&contents), CBS_len(&contents)));
 
   CBS_init(&data, kData7, sizeof(kData7));
   // invalid optional octet string.
-  if (CBS_get_optional_asn1_octet_string(&data, &contents, &present, 0xa1)) {
-    return false;
-  }
+  EXPECT_FALSE(
+      CBS_get_optional_asn1_octet_string(&data, &contents, &present, 0xa1));
 
   CBS_init(&data, kData8, sizeof(kData8));
-  // optional octet string.
-  if (!CBS_get_optional_asn1_uint64(&data, &value, 0xa0, 42) ||
-      value != 42 ||
-      !CBS_get_optional_asn1_uint64(&data, &value, 0xa1, 42) ||
-      value != 1) {
-    return false;
-  }
+  // optional integer.
+  ASSERT_TRUE(CBS_get_optional_asn1_uint64(&data, &value, 0xa0, 42));
+  EXPECT_EQ(42u, value);
+  ASSERT_TRUE(CBS_get_optional_asn1_uint64(&data, &value, 0xa1, 42));
+  EXPECT_EQ(1u, value);
 
   CBS_init(&data, kData9, sizeof(kData9));
   // invalid optional integer.
-  if (CBS_get_optional_asn1_uint64(&data, &value, 0xa1, 42)) {
-    return false;
-  }
+  EXPECT_FALSE(CBS_get_optional_asn1_uint64(&data, &value, 0xa1, 42));
 
   unsigned tag;
   CBS_init(&data, kData1, sizeof(kData1));
-  if (!CBS_get_any_asn1(&data, &contents, &tag) ||
-      tag != CBS_ASN1_SEQUENCE ||
-      CBS_len(&contents) != 2 ||
-      OPENSSL_memcmp(CBS_data(&contents), "\x01\x02", 2) != 0) {
-    return false;
-  }
+  ASSERT_TRUE(CBS_get_any_asn1(&data, &contents, &tag));
+  EXPECT_EQ(CBS_ASN1_SEQUENCE, tag);
+  EXPECT_EQ(Bytes("\x01\x02"), Bytes(CBS_data(&contents), CBS_len(&contents)));
 
   size_t header_len;
   CBS_init(&data, kData1, sizeof(kData1));
-  if (!CBS_get_any_asn1_element(&data, &contents, &tag, &header_len) ||
-      tag != CBS_ASN1_SEQUENCE ||
-      header_len != 2 ||
-      CBS_len(&contents) != 4 ||
-      OPENSSL_memcmp(CBS_data(&contents), "\x30\x02\x01\x02", 2) != 0) {
-    return false;
-  }
-
-  return true;
+  ASSERT_TRUE(CBS_get_any_asn1_element(&data, &contents, &tag, &header_len));
+  EXPECT_EQ(CBS_ASN1_SEQUENCE, tag);
+  EXPECT_EQ(2u, header_len);
+  EXPECT_EQ(Bytes("\x30\x02\x01\x02"),
+            Bytes(CBS_data(&contents), CBS_len(&contents)));
 }
 
-static bool TestGetOptionalASN1Bool() {
+TEST(CBSTest, GetOptionalASN1Bool) {
   static const uint8_t kTrue[] = {0x0a, 3, CBS_ASN1_BOOLEAN, 1, 0xff};
   static const uint8_t kFalse[] = {0x0a, 3, CBS_ASN1_BOOLEAN, 1, 0x00};
   static const uint8_t kInvalid[] = {0x0a, 3, CBS_ASN1_BOOLEAN, 1, 0x01};
@@ -260,183 +225,156 @@
   CBS data;
   CBS_init(&data, NULL, 0);
   int val = 2;
-  if (!CBS_get_optional_asn1_bool(&data, &val, 0x0a, 0) ||
-      val != 0) {
-    return false;
-  }
+  ASSERT_TRUE(CBS_get_optional_asn1_bool(&data, &val, 0x0a, 0));
+  EXPECT_EQ(0, val);
 
   CBS_init(&data, kTrue, sizeof(kTrue));
   val = 2;
-  if (!CBS_get_optional_asn1_bool(&data, &val, 0x0a, 0) ||
-      val != 1) {
-    return false;
-  }
+  ASSERT_TRUE(CBS_get_optional_asn1_bool(&data, &val, 0x0a, 0));
+  EXPECT_EQ(1, val);
 
   CBS_init(&data, kFalse, sizeof(kFalse));
   val = 2;
-  if (!CBS_get_optional_asn1_bool(&data, &val, 0x0a, 1) ||
-      val != 0) {
-    return false;
-  }
+  ASSERT_TRUE(CBS_get_optional_asn1_bool(&data, &val, 0x0a, 1));
+  EXPECT_EQ(0, val);
 
   CBS_init(&data, kInvalid, sizeof(kInvalid));
-  if (CBS_get_optional_asn1_bool(&data, &val, 0x0a, 1)) {
-    return false;
-  }
-
-  return true;
+  EXPECT_FALSE(CBS_get_optional_asn1_bool(&data, &val, 0x0a, 1));
 }
 
-static bool TestCBBBasic() {
+// Test that CBB_init may be used on an uninitialized input.
+TEST(CBBTest, InitUninitialized) {
+  CBB cbb;
+  ASSERT_TRUE(CBB_init(&cbb, 100));
+  CBB_cleanup(&cbb);
+}
+
+TEST(CBBTest, Basic) {
   static const uint8_t kExpected[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0xa, 0xb, 0xc};
   uint8_t *buf;
   size_t buf_len;
-  CBB cbb;
 
-  if (!CBB_init(&cbb, 100)) {
-    return false;
-  }
-  CBB_cleanup(&cbb);
+  bssl::ScopedCBB cbb;
+  ASSERT_TRUE(CBB_init(cbb.get(), 100));
+  cbb.Reset();
 
-  if (!CBB_init(&cbb, 0)) {
-    return false;
-  }
-  if (!CBB_add_u8(&cbb, 1) ||
-      !CBB_add_u16(&cbb, 0x203) ||
-      !CBB_add_u24(&cbb, 0x40506) ||
-      !CBB_add_u32(&cbb, 0x708090a) ||
-      !CBB_add_bytes(&cbb, (const uint8_t*) "\x0b\x0c", 2) ||
-      !CBB_finish(&cbb, &buf, &buf_len)) {
-    CBB_cleanup(&cbb);
-    return false;
-  }
+  ASSERT_TRUE(CBB_init(cbb.get(), 0));
+  ASSERT_TRUE(CBB_add_u8(cbb.get(), 1));
+  ASSERT_TRUE(CBB_add_u16(cbb.get(), 0x203));
+  ASSERT_TRUE(CBB_add_u24(cbb.get(), 0x40506));
+  ASSERT_TRUE(CBB_add_u32(cbb.get(), 0x708090a));
+  ASSERT_TRUE(CBB_add_bytes(cbb.get(), (const uint8_t *)"\x0b\x0c", 2));
+  ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
 
   bssl::UniquePtr<uint8_t> scoper(buf);
-  return buf_len == sizeof(kExpected) &&
-         OPENSSL_memcmp(buf, kExpected, buf_len) == 0;
+  EXPECT_EQ(Bytes(kExpected), Bytes(buf, buf_len));
 }
 
-static bool TestCBBFixed() {
+TEST(CBBTest, Fixed) {
   bssl::ScopedCBB cbb;
   uint8_t buf[1];
   uint8_t *out_buf;
   size_t out_size;
 
-  if (!CBB_init_fixed(cbb.get(), NULL, 0) ||
-      !CBB_finish(cbb.get(), &out_buf, &out_size) ||
-      out_buf != NULL ||
-      out_size != 0) {
-    return false;
-  }
+  ASSERT_TRUE(CBB_init_fixed(cbb.get(), NULL, 0));
+  ASSERT_TRUE(CBB_finish(cbb.get(), &out_buf, &out_size));
+  EXPECT_EQ(NULL, out_buf);
+  EXPECT_EQ(0u, out_size);
 
   cbb.Reset();
-  if (!CBB_init_fixed(cbb.get(), buf, 1) ||
-      !CBB_add_u8(cbb.get(), 1) ||
-      !CBB_finish(cbb.get(), &out_buf, &out_size) ||
-      out_buf != buf ||
-      out_size != 1 ||
-      buf[0] != 1) {
-    return false;
-  }
+  ASSERT_TRUE(CBB_init_fixed(cbb.get(), buf, 1));
+  ASSERT_TRUE(CBB_add_u8(cbb.get(), 1));
+  ASSERT_TRUE(CBB_finish(cbb.get(), &out_buf, &out_size));
+  EXPECT_EQ(buf, out_buf);
+  EXPECT_EQ(1u, out_size);
+  EXPECT_EQ(1u, buf[0]);
 
   cbb.Reset();
-  if (!CBB_init_fixed(cbb.get(), buf, 1) ||
-      !CBB_add_u8(cbb.get(), 1) ||
-      CBB_add_u8(cbb.get(), 2)) {
-    return false;
-  }
-
-  return true;
+  ASSERT_TRUE(CBB_init_fixed(cbb.get(), buf, 1));
+  ASSERT_TRUE(CBB_add_u8(cbb.get(), 1));
+  EXPECT_FALSE(CBB_add_u8(cbb.get(), 2));
 }
 
-static bool TestCBBFinishChild() {
-  CBB cbb, child;
+// Test that calling CBB_finish on a child does nothing.
+TEST(CBBTest, FinishChild) {
+  CBB child;
   uint8_t *out_buf;
   size_t out_size;
 
-  if (!CBB_init(&cbb, 16)) {
-    return false;
-  }
-  if (!CBB_add_u8_length_prefixed(&cbb, &child) ||
-      CBB_finish(&child, &out_buf, &out_size) ||
-      !CBB_finish(&cbb, &out_buf, &out_size)) {
-    CBB_cleanup(&cbb);
-    return false;
-  }
+  bssl::ScopedCBB cbb;
+  ASSERT_TRUE(CBB_init(cbb.get(), 16));
+  ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &child));
+
+  EXPECT_FALSE(CBB_finish(&child, &out_buf, &out_size));
+
+  ASSERT_TRUE(CBB_finish(cbb.get(), &out_buf, &out_size));
   bssl::UniquePtr<uint8_t> scoper(out_buf);
-  return out_size == 1 && out_buf[0] == 0;
+  ASSERT_EQ(1u, out_size);
+  EXPECT_EQ(0u, out_buf[0]);
 }
 
-static bool TestCBBPrefixed() {
+TEST(CBBTest, Prefixed) {
   static const uint8_t kExpected[] = {0, 1, 1, 0, 2, 2, 3, 0, 0, 3,
                                       4, 5, 6, 5, 4, 1, 0, 1, 2};
   uint8_t *buf;
   size_t buf_len;
-  CBB cbb, contents, inner_contents, inner_inner_contents;
-
-  if (!CBB_init(&cbb, 0) ||
-      CBB_len(&cbb) != 0 ||
-      !CBB_add_u8_length_prefixed(&cbb, &contents) ||
-      !CBB_add_u8_length_prefixed(&cbb, &contents) ||
-      !CBB_add_u8(&contents, 1) ||
-      CBB_len(&contents) != 1 ||
-      !CBB_flush(&cbb) ||
-      CBB_len(&cbb) != 3 ||
-      !CBB_add_u16_length_prefixed(&cbb, &contents) ||
-      !CBB_add_u16(&contents, 0x203) ||
-      !CBB_add_u24_length_prefixed(&cbb, &contents) ||
-      !CBB_add_u24(&contents, 0x40506) ||
-      !CBB_add_u8_length_prefixed(&cbb, &contents) ||
-      !CBB_add_u8_length_prefixed(&contents, &inner_contents) ||
-      !CBB_add_u8(&inner_contents, 1) ||
-      !CBB_add_u16_length_prefixed(&inner_contents, &inner_inner_contents) ||
-      !CBB_add_u8(&inner_inner_contents, 2) ||
-      !CBB_finish(&cbb, &buf, &buf_len)) {
-    CBB_cleanup(&cbb);
-    return false;
-  }
+  bssl::ScopedCBB cbb;
+  CBB contents, inner_contents, inner_inner_contents;
+  ASSERT_TRUE(CBB_init(cbb.get(), 0));
+  EXPECT_EQ(0u, CBB_len(cbb.get()));
+  ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &contents));
+  ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &contents));
+  ASSERT_TRUE(CBB_add_u8(&contents, 1));
+  EXPECT_EQ(1u, CBB_len(&contents));
+  ASSERT_TRUE(CBB_flush(cbb.get()));
+  EXPECT_EQ(3u, CBB_len(cbb.get()));
+  ASSERT_TRUE(CBB_add_u16_length_prefixed(cbb.get(), &contents));
+  ASSERT_TRUE(CBB_add_u16(&contents, 0x203));
+  ASSERT_TRUE(CBB_add_u24_length_prefixed(cbb.get(), &contents));
+  ASSERT_TRUE(CBB_add_u24(&contents, 0x40506));
+  ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &contents));
+  ASSERT_TRUE(CBB_add_u8_length_prefixed(&contents, &inner_contents));
+  ASSERT_TRUE(CBB_add_u8(&inner_contents, 1));
+  ASSERT_TRUE(
+      CBB_add_u16_length_prefixed(&inner_contents, &inner_inner_contents));
+  ASSERT_TRUE(CBB_add_u8(&inner_inner_contents, 2));
+  ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
 
   bssl::UniquePtr<uint8_t> scoper(buf);
-  return buf_len == sizeof(kExpected) &&
-         OPENSSL_memcmp(buf, kExpected, buf_len) == 0;
+  EXPECT_EQ(Bytes(kExpected), Bytes(buf, buf_len));
 }
 
-static bool TestCBBDiscardChild() {
+TEST(CBBTest, DiscardChild) {
   bssl::ScopedCBB cbb;
   CBB contents, inner_contents, inner_inner_contents;
 
-  if (!CBB_init(cbb.get(), 0) ||
-      !CBB_add_u8(cbb.get(), 0xaa)) {
-    return false;
-  }
+  ASSERT_TRUE(CBB_init(cbb.get(), 0));
+  ASSERT_TRUE(CBB_add_u8(cbb.get(), 0xaa));
 
   // Discarding |cbb|'s children preserves the byte written.
   CBB_discard_child(cbb.get());
 
-  if (!CBB_add_u8_length_prefixed(cbb.get(), &contents) ||
-      !CBB_add_u8_length_prefixed(cbb.get(), &contents) ||
-      !CBB_add_u8(&contents, 0xbb) ||
-      !CBB_add_u16_length_prefixed(cbb.get(), &contents) ||
-      !CBB_add_u16(&contents, 0xcccc) ||
-      !CBB_add_u24_length_prefixed(cbb.get(), &contents) ||
-      !CBB_add_u24(&contents, 0xdddddd) ||
-      !CBB_add_u8_length_prefixed(cbb.get(), &contents) ||
-      !CBB_add_u8(&contents, 0xff) ||
-      !CBB_add_u8_length_prefixed(&contents, &inner_contents) ||
-      !CBB_add_u8(&inner_contents, 0x42) ||
-      !CBB_add_u16_length_prefixed(&inner_contents, &inner_inner_contents) ||
-      !CBB_add_u8(&inner_inner_contents, 0x99)) {
-    return false;
-  }
+  ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &contents));
+  ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &contents));
+  ASSERT_TRUE(CBB_add_u8(&contents, 0xbb));
+  ASSERT_TRUE(CBB_add_u16_length_prefixed(cbb.get(), &contents));
+  ASSERT_TRUE(CBB_add_u16(&contents, 0xcccc));
+  ASSERT_TRUE(CBB_add_u24_length_prefixed(cbb.get(), &contents));
+  ASSERT_TRUE(CBB_add_u24(&contents, 0xdddddd));
+  ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &contents));
+  ASSERT_TRUE(CBB_add_u8(&contents, 0xff));
+  ASSERT_TRUE(CBB_add_u8_length_prefixed(&contents, &inner_contents));
+  ASSERT_TRUE(CBB_add_u8(&inner_contents, 0x42));
+  ASSERT_TRUE(
+      CBB_add_u16_length_prefixed(&inner_contents, &inner_inner_contents));
+  ASSERT_TRUE(CBB_add_u8(&inner_inner_contents, 0x99));
 
   // Discard everything from |inner_contents| down.
   CBB_discard_child(&contents);
 
   uint8_t *buf;
   size_t buf_len;
-  if (!CBB_finish(cbb.get(), &buf, &buf_len)) {
-    return false;
-  }
+  ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
   bssl::UniquePtr<uint8_t> scoper(buf);
 
   static const uint8_t kExpected[] = {
@@ -447,166 +385,105 @@
         0, 0, 3, 0xdd, 0xdd, 0xdd,
         1, 0xff,
   };
-  return buf_len == sizeof(kExpected) &&
-         OPENSSL_memcmp(buf, kExpected, buf_len) == 0;
+  EXPECT_EQ(Bytes(kExpected), Bytes(buf, buf_len));
 }
 
-static bool TestCBBMisuse() {
-  CBB cbb, child, contents;
+TEST(CBBTest, Misuse) {
+  bssl::ScopedCBB cbb;
+  CBB child, contents;
   uint8_t *buf;
   size_t buf_len;
 
-  if (!CBB_init(&cbb, 0)) {
-    return false;
-  }
-  if (!CBB_add_u8_length_prefixed(&cbb, &child) ||
-      !CBB_add_u8(&child, 1) ||
-      !CBB_add_u8(&cbb, 2)) {
-    CBB_cleanup(&cbb);
-    return false;
-  }
+  ASSERT_TRUE(CBB_init(cbb.get(), 0));
+  ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &child));
+  ASSERT_TRUE(CBB_add_u8(&child, 1));
+  ASSERT_TRUE(CBB_add_u8(cbb.get(), 2));
 
   // Since we wrote to |cbb|, |child| is now invalid and attempts to write to
   // it should fail.
-  if (CBB_add_u8(&child, 1) ||
-      CBB_add_u16(&child, 1) ||
-      CBB_add_u24(&child, 1) ||
-      CBB_add_u8_length_prefixed(&child, &contents) ||
-      CBB_add_u16_length_prefixed(&child, &contents) ||
-      CBB_add_asn1(&child, &contents, 1) ||
-      CBB_add_bytes(&child, (const uint8_t*) "a", 1)) {
-    fprintf(stderr, "CBB operation on invalid CBB did not fail.\n");
-    CBB_cleanup(&cbb);
-    return false;
-  }
+  EXPECT_FALSE(CBB_add_u8(&child, 1));
+  EXPECT_FALSE(CBB_add_u16(&child, 1));
+  EXPECT_FALSE(CBB_add_u24(&child, 1));
+  EXPECT_FALSE(CBB_add_u8_length_prefixed(&child, &contents));
+  EXPECT_FALSE(CBB_add_u16_length_prefixed(&child, &contents));
+  EXPECT_FALSE(CBB_add_asn1(&child, &contents, 1));
+  EXPECT_FALSE(CBB_add_bytes(&child, (const uint8_t*) "a", 1));
 
-  if (!CBB_finish(&cbb, &buf, &buf_len)) {
-    CBB_cleanup(&cbb);
-    return false;
-  }
+  ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
   bssl::UniquePtr<uint8_t> scoper(buf);
 
-  if (buf_len != 3 ||
-      OPENSSL_memcmp(buf, "\x01\x01\x02", 3) != 0) {
-    return false;
-  }
-  return true;
+  EXPECT_EQ(Bytes("\x01\x01\x02"), Bytes(buf, buf_len));
 }
 
-static bool TestCBBASN1() {
+TEST(CBBTest, ASN1) {
   static const uint8_t kExpected[] = {0x30, 3, 1, 2, 3};
   uint8_t *buf;
   size_t buf_len;
-  CBB cbb, contents, inner_contents;
+  bssl::ScopedCBB cbb;
+  CBB contents, inner_contents;
 
-  if (!CBB_init(&cbb, 0)) {
-    return false;
-  }
-  if (!CBB_add_asn1(&cbb, &contents, 0x30) ||
-      !CBB_add_bytes(&contents, (const uint8_t*) "\x01\x02\x03", 3) ||
-      !CBB_finish(&cbb, &buf, &buf_len)) {
-    CBB_cleanup(&cbb);
-    return false;
-  }
+  ASSERT_TRUE(CBB_init(cbb.get(), 0));
+  ASSERT_TRUE(CBB_add_asn1(cbb.get(), &contents, 0x30));
+  ASSERT_TRUE(CBB_add_bytes(&contents, (const uint8_t *)"\x01\x02\x03", 3));
+  ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
   bssl::UniquePtr<uint8_t> scoper(buf);
 
-  if (buf_len != sizeof(kExpected) ||
-      OPENSSL_memcmp(buf, kExpected, buf_len) != 0) {
-    return false;
-  }
+  EXPECT_EQ(Bytes(kExpected), Bytes(buf, buf_len));
 
   std::vector<uint8_t> test_data(100000, 0x42);
-
-  if (!CBB_init(&cbb, 0)) {
-    return false;
-  }
-  if (!CBB_add_asn1(&cbb, &contents, 0x30) ||
-      !CBB_add_bytes(&contents, test_data.data(), 130) ||
-      !CBB_finish(&cbb, &buf, &buf_len)) {
-    CBB_cleanup(&cbb);
-    return false;
-  }
+  ASSERT_TRUE(CBB_init(cbb.get(), 0));
+  ASSERT_TRUE(CBB_add_asn1(cbb.get(), &contents, 0x30));
+  ASSERT_TRUE(CBB_add_bytes(&contents, test_data.data(), 130));
+  ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
   scoper.reset(buf);
 
-  if (buf_len != 3 + 130 ||
-      OPENSSL_memcmp(buf, "\x30\x81\x82", 3) != 0 ||
-      OPENSSL_memcmp(buf + 3, test_data.data(), 130) != 0) {
-    return false;
-  }
+  ASSERT_EQ(3u + 130u, buf_len);
+  EXPECT_EQ(Bytes("\x30\x81\x82"), Bytes(buf, 3));
+  EXPECT_EQ(Bytes(test_data.data(), 130), Bytes(buf + 3, 130));
 
-  if (!CBB_init(&cbb, 0)) {
-    return false;
-  }
-  if (!CBB_add_asn1(&cbb, &contents, 0x30) ||
-      !CBB_add_bytes(&contents, test_data.data(), 1000) ||
-      !CBB_finish(&cbb, &buf, &buf_len)) {
-    CBB_cleanup(&cbb);
-    return false;
-  }
+  ASSERT_TRUE(CBB_init(cbb.get(), 0));
+  ASSERT_TRUE(CBB_add_asn1(cbb.get(), &contents, 0x30));
+  ASSERT_TRUE(CBB_add_bytes(&contents, test_data.data(), 1000));
+  ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
   scoper.reset(buf);
 
-  if (buf_len != 4 + 1000 ||
-      OPENSSL_memcmp(buf, "\x30\x82\x03\xe8", 4) != 0 ||
-      OPENSSL_memcmp(buf + 4, test_data.data(), 1000)) {
-    return false;
-  }
+  ASSERT_EQ(4u + 1000u, buf_len);
+  EXPECT_EQ(Bytes("\x30\x82\x03\xe8"), Bytes(buf, 4));
+  EXPECT_EQ(Bytes(test_data.data(), 1000), Bytes(buf + 4, 1000));
 
-  if (!CBB_init(&cbb, 0)) {
-    return false;
-  }
-  if (!CBB_add_asn1(&cbb, &contents, 0x30) ||
-      !CBB_add_asn1(&contents, &inner_contents, 0x30) ||
-      !CBB_add_bytes(&inner_contents, test_data.data(), 100000) ||
-      !CBB_finish(&cbb, &buf, &buf_len)) {
-    CBB_cleanup(&cbb);
-    return false;
-  }
+  ASSERT_TRUE(CBB_init(cbb.get(), 0));
+  ASSERT_TRUE(CBB_add_asn1(cbb.get(), &contents, 0x30));
+  ASSERT_TRUE(CBB_add_asn1(&contents, &inner_contents, 0x30));
+  ASSERT_TRUE(CBB_add_bytes(&inner_contents, test_data.data(), 100000));
+  ASSERT_TRUE(CBB_finish(cbb.get(), &buf, &buf_len));
   scoper.reset(buf);
 
-  if (buf_len != 5 + 5 + 100000 ||
-      OPENSSL_memcmp(buf, "\x30\x83\x01\x86\xa5\x30\x83\x01\x86\xa0", 10) !=
-          0 ||
-      OPENSSL_memcmp(buf + 10, test_data.data(), 100000)) {
-    return false;
-  }
-
-  return true;
+  ASSERT_EQ(5u + 5u + 100000u, buf_len);
+  EXPECT_EQ(Bytes("\x30\x83\x01\x86\xa5\x30\x83\x01\x86\xa0"), Bytes(buf, 10));
+  EXPECT_EQ(Bytes(test_data.data(), test_data.size()), Bytes(buf + 10, 100000));
 }
 
-static bool DoBerConvert(const char *name,
-                         const uint8_t *der_expected, size_t der_len,
-                         const uint8_t *ber, size_t ber_len) {
+static void ExpectBerConvert(const char *name, const uint8_t *der_expected,
+                             size_t der_len, const uint8_t *ber,
+                             size_t ber_len) {
+  SCOPED_TRACE(name);
   CBS in;
   uint8_t *out;
   size_t out_len;
 
   CBS_init(&in, ber, ber_len);
-  if (!CBS_asn1_ber_to_der(&in, &out, &out_len)) {
-    fprintf(stderr, "%s: CBS_asn1_ber_to_der failed.\n", name);
-    return false;
-  }
+  ASSERT_TRUE(CBS_asn1_ber_to_der(&in, &out, &out_len));
   bssl::UniquePtr<uint8_t> scoper(out);
 
   if (out == NULL) {
-    if (ber_len != der_len ||
-        OPENSSL_memcmp(der_expected, ber, ber_len) != 0) {
-      fprintf(stderr, "%s: incorrect unconverted result.\n", name);
-      return false;
-    }
-
-    return true;
+    EXPECT_EQ(Bytes(der_expected, der_len), Bytes(ber, ber_len));
+  } else {
+    EXPECT_NE(Bytes(der_expected, der_len), Bytes(ber, ber_len));
+    EXPECT_EQ(Bytes(der_expected, der_len), Bytes(out, out_len));
   }
-
-  if (out_len != der_len ||
-      OPENSSL_memcmp(out, der_expected, der_len) != 0) {
-    fprintf(stderr, "%s: incorrect converted result.\n", name);
-    return false;
-  }
-
-  return true;
 }
 
-static bool TestBerConvert() {
+TEST(CBSTest, BerConvert) {
   static const uint8_t kSimpleBER[] = {0x01, 0x01, 0x00};
 
   // kIndefBER contains a SEQUENCE with an indefinite length.
@@ -653,18 +530,17 @@
       0xa0, 0x08, 0x04, 0x02, 0x00, 0x01, 0x04, 0x02, 0x02, 0x03,
   };
 
-  return DoBerConvert("kSimpleBER", kSimpleBER, sizeof(kSimpleBER),
-                      kSimpleBER, sizeof(kSimpleBER)) &&
-         DoBerConvert("kIndefBER", kIndefDER, sizeof(kIndefDER), kIndefBER,
-                      sizeof(kIndefBER)) &&
-         DoBerConvert("kOctetStringBER", kOctetStringDER,
-                      sizeof(kOctetStringDER), kOctetStringBER,
-                      sizeof(kOctetStringBER)) &&
-         DoBerConvert("kNSSBER", kNSSDER, sizeof(kNSSDER), kNSSBER,
-                      sizeof(kNSSBER)) &&
-         DoBerConvert("kConstructedStringBER", kConstructedStringDER,
-                      sizeof(kConstructedStringDER), kConstructedStringBER,
-                      sizeof(kConstructedStringBER));
+  ExpectBerConvert("kSimpleBER", kSimpleBER, sizeof(kSimpleBER), kSimpleBER,
+                   sizeof(kSimpleBER));
+  ExpectBerConvert("kIndefBER", kIndefDER, sizeof(kIndefDER), kIndefBER,
+                   sizeof(kIndefBER));
+  ExpectBerConvert("kOctetStringBER", kOctetStringDER, sizeof(kOctetStringDER),
+                   kOctetStringBER, sizeof(kOctetStringBER));
+  ExpectBerConvert("kNSSBER", kNSSDER, sizeof(kNSSDER), kNSSBER,
+                   sizeof(kNSSBER));
+  ExpectBerConvert("kConstructedStringBER", kConstructedStringDER,
+                   sizeof(kConstructedStringDER), kConstructedStringBER,
+                   sizeof(kConstructedStringBER));
 }
 
 struct ImplicitStringTest {
@@ -690,8 +566,9 @@
     {"\xa1\x09\x0c\x01\x61\x0c\x01\x61\x0c\x01\x61", 11, false, nullptr, 0},
 };
 
-static bool TestImplicitString() {
+TEST(CBSTest, ImplicitString) {
   for (const auto &test : kImplicitStringTests) {
+    SCOPED_TRACE(Bytes(test.in, test.in_len));
     uint8_t *storage = nullptr;
     CBS in, out;
     CBS_init(&in, reinterpret_cast<const uint8_t *>(test.in), test.in_len);
@@ -699,21 +576,13 @@
                                           CBS_ASN1_CONTEXT_SPECIFIC | 0,
                                           CBS_ASN1_OCTETSTRING);
     bssl::UniquePtr<uint8_t> scoper(storage);
+    EXPECT_EQ(test.ok, static_cast<bool>(ok));
 
-    if (static_cast<bool>(ok) != test.ok) {
-      fprintf(stderr, "CBS_get_asn1_implicit_string unexpectedly %s\n",
-              ok ? "succeeded" : "failed");
-      return false;
-    }
-
-    if (ok && (CBS_len(&out) != test.out_len ||
-               OPENSSL_memcmp(CBS_data(&out), test.out, test.out_len) != 0)) {
-      fprintf(stderr, "CBS_get_asn1_implicit_string gave the wrong output\n");
-      return false;
+    if (ok) {
+      EXPECT_EQ(Bytes(test.out, test.out_len),
+                Bytes(CBS_data(&out), CBS_len(&out)));
     }
   }
-
-  return true;
 }
 
 struct ASN1Uint64Test {
@@ -752,35 +621,26 @@
     {"\x02\x02\x00\x01", 4},
 };
 
-static bool TestASN1Uint64() {
+TEST(CBSTest, ASN1Uint64) {
   for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kASN1Uint64Tests); i++) {
+    SCOPED_TRACE(i);
     const ASN1Uint64Test *test = &kASN1Uint64Tests[i];
     CBS cbs;
     uint64_t value;
-    CBB cbb;
     uint8_t *out;
     size_t len;
 
     CBS_init(&cbs, (const uint8_t *)test->encoding, test->encoding_len);
-    if (!CBS_get_asn1_uint64(&cbs, &value) ||
-        CBS_len(&cbs) != 0 ||
-        value != test->value) {
-      return false;
-    }
+    ASSERT_TRUE(CBS_get_asn1_uint64(&cbs, &value));
+    EXPECT_EQ(0u, CBS_len(&cbs));
+    EXPECT_EQ(test->value, value);
 
-    if (!CBB_init(&cbb, 0)) {
-      return false;
-    }
-    if (!CBB_add_asn1_uint64(&cbb, test->value) ||
-        !CBB_finish(&cbb, &out, &len)) {
-      CBB_cleanup(&cbb);
-      return false;
-    }
+    bssl::ScopedCBB cbb;
+    ASSERT_TRUE(CBB_init(cbb.get(), 0));
+    ASSERT_TRUE(CBB_add_asn1_uint64(cbb.get(), test->value));
+    ASSERT_TRUE(CBB_finish(cbb.get(), &out, &len));
     bssl::UniquePtr<uint8_t> scoper(out);
-    if (len != test->encoding_len ||
-        OPENSSL_memcmp(out, test->encoding, len) != 0) {
-      return false;
-    }
+    EXPECT_EQ(Bytes(test->encoding, test->encoding_len), Bytes(out, len));
   }
 
   for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kASN1InvalidUint64Tests); i++) {
@@ -789,113 +649,76 @@
     uint64_t value;
 
     CBS_init(&cbs, (const uint8_t *)test->encoding, test->encoding_len);
-    if (CBS_get_asn1_uint64(&cbs, &value)) {
-      return false;
-    }
+    EXPECT_FALSE(CBS_get_asn1_uint64(&cbs, &value));
   }
-
-  return true;
 }
 
-static bool TestZero() {
+TEST(CBBTest, Zero) {
   CBB cbb;
   CBB_zero(&cbb);
   // Calling |CBB_cleanup| on a zero-state |CBB| must not crash.
   CBB_cleanup(&cbb);
-  return true;
 }
 
-static bool TestCBBReserve() {
+TEST(CBBTest, Reserve) {
   uint8_t buf[10];
   uint8_t *ptr;
   size_t len;
   bssl::ScopedCBB cbb;
-  if (!CBB_init_fixed(cbb.get(), buf, sizeof(buf)) ||
-      // Too large.
-      CBB_reserve(cbb.get(), &ptr, 11)) {
-    return false;
-  }
+  ASSERT_TRUE(CBB_init_fixed(cbb.get(), buf, sizeof(buf)));
+  // Too large.
+  EXPECT_FALSE(CBB_reserve(cbb.get(), &ptr, 11));
 
   cbb.Reset();
-  if (!CBB_init_fixed(cbb.get(), buf, sizeof(buf)) ||
-      // Successfully reserve the entire space.
-      !CBB_reserve(cbb.get(), &ptr, 10) ||
-      ptr != buf ||
-      // Advancing under the maximum bytes is legal.
-      !CBB_did_write(cbb.get(), 5) ||
-      !CBB_finish(cbb.get(), NULL, &len) ||
-      len != 5) {
-    return false;
-  }
-  return true;
+  ASSERT_TRUE(CBB_init_fixed(cbb.get(), buf, sizeof(buf)));
+  // Successfully reserve the entire space.
+  ASSERT_TRUE(CBB_reserve(cbb.get(), &ptr, 10));
+  EXPECT_EQ(buf, ptr);
+  // Advancing under the maximum bytes is legal.
+  ASSERT_TRUE(CBB_did_write(cbb.get(), 5));
+  ASSERT_TRUE(CBB_finish(cbb.get(), NULL, &len));
+  EXPECT_EQ(5u, len);
 }
 
-static bool TestStickyError() {
+// Test that CBB errors are sticky; once on operation on CBB fails, all
+// subsequent ones do.
+TEST(CBBTest, StickyError) {
   // Write an input that exceeds the limit for its length prefix.
   bssl::ScopedCBB cbb;
   CBB child;
   static const uint8_t kZeros[256] = {0};
-  if (!CBB_init(cbb.get(), 0) ||
-      !CBB_add_u8_length_prefixed(cbb.get(), &child) ||
-      !CBB_add_bytes(&child, kZeros, sizeof(kZeros))) {
-    return false;
-  }
-
-  if (CBB_flush(cbb.get())) {
-    fprintf(stderr, "CBB_flush unexpectedly succeeded.\n");
-    return false;
-  }
+  ASSERT_TRUE(CBB_init(cbb.get(), 0));
+  ASSERT_TRUE(CBB_add_u8_length_prefixed(cbb.get(), &child));
+  ASSERT_TRUE(CBB_add_bytes(&child, kZeros, sizeof(kZeros)));
+  ASSERT_FALSE(CBB_flush(cbb.get()));
 
   // All future operations should fail.
   uint8_t *ptr;
   size_t len;
-  if (CBB_add_u8(cbb.get(), 0) ||
-      CBB_finish(cbb.get(), &ptr, &len)) {
-    fprintf(stderr, "Future operations unexpectedly succeeded.\n");
-    return false;
-  }
+  EXPECT_FALSE(CBB_add_u8(cbb.get(), 0));
+  EXPECT_FALSE(CBB_finish(cbb.get(), &ptr, &len));
 
   // Write an input that cannot fit in a fixed CBB.
   cbb.Reset();
   uint8_t buf;
-  if (!CBB_init_fixed(cbb.get(), &buf, 1)) {
-    return false;
-  }
-
-  if (CBB_add_bytes(cbb.get(), kZeros, sizeof(kZeros))) {
-    fprintf(stderr, "CBB_add_bytes unexpectedly succeeded.\n");
-    return false;
-  }
+  ASSERT_TRUE(CBB_init_fixed(cbb.get(), &buf, 1));
+  ASSERT_FALSE(CBB_add_bytes(cbb.get(), kZeros, sizeof(kZeros)));
 
   // All future operations should fail.
-  if (CBB_add_u8(cbb.get(), 0) ||
-      CBB_finish(cbb.get(), &ptr, &len)) {
-    fprintf(stderr, "Future operations unexpectedly succeeded.\n");
-    return false;
-  }
+  EXPECT_FALSE(CBB_add_u8(cbb.get(), 0));
+  EXPECT_FALSE(CBB_finish(cbb.get(), &ptr, &len));
 
   // Write a u32 that cannot fit in a u24.
   cbb.Reset();
-  if (!CBB_init(cbb.get(), 0)) {
-    return false;
-  }
-
-  if (CBB_add_u24(cbb.get(), 1u << 24)) {
-    fprintf(stderr, "CBB_add_u24 unexpectedly succeeded.\n");
-    return false;
-  }
+  ASSERT_TRUE(CBB_init(cbb.get(), 0));
+  ASSERT_FALSE(CBB_add_u24(cbb.get(), 1u << 24));
 
   // All future operations should fail.
-  if (CBB_add_u8(cbb.get(), 0) ||
-      CBB_finish(cbb.get(), &ptr, &len)) {
-    fprintf(stderr, "Future operations unexpectedly succeeded.\n");
-    return false;
-  }
-
-  return true;
+  EXPECT_FALSE(CBB_add_u8(cbb.get(), 0));
+  EXPECT_FALSE(CBB_finish(cbb.get(), &ptr, &len));
 }
 
-static bool TestBitString() {
+TEST(CBSTest, BitString) {
   static const std::vector<uint8_t> kValidBitStrings[] = {
       {0x00},                                      // 0 bits
       {0x07, 0x80},                                // 1 bit
@@ -904,11 +727,10 @@
       {0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0},  // 42 bits
   };
   for (const auto& test : kValidBitStrings) {
+    SCOPED_TRACE(Bytes(test.data(), test.size()));
     CBS cbs;
     CBS_init(&cbs, test.data(), test.size());
-    if (!CBS_is_valid_asn1_bitstring(&cbs)) {
-      return false;
-    }
+    EXPECT_TRUE(CBS_is_valid_asn1_bitstring(&cbs));
   }
 
   static const std::vector<uint8_t> kInvalidBitStrings[] = {
@@ -923,16 +745,13 @@
       {0x06, 0xff, 0xc1},
   };
   for (const auto& test : kInvalidBitStrings) {
+    SCOPED_TRACE(Bytes(test.data(), test.size()));
     CBS cbs;
     CBS_init(&cbs, test.data(), test.size());
-    if (CBS_is_valid_asn1_bitstring(&cbs)) {
-      return false;
-    }
+    EXPECT_FALSE(CBS_is_valid_asn1_bitstring(&cbs));
 
     // CBS_asn1_bitstring_has_bit returns false on invalid inputs.
-    if (CBS_asn1_bitstring_has_bit(&cbs, 0)) {
-      return false;
-    }
+    EXPECT_FALSE(CBS_asn1_bitstring_has_bit(&cbs, 0));
   }
 
   static const struct {
@@ -960,43 +779,11 @@
       {{0x06, 0x0f, 0x40}, 1000, false},
   };
   for (const auto& test : kBitTests) {
+    SCOPED_TRACE(Bytes(test.in.data(), test.in.size()));
+    SCOPED_TRACE(test.bit);
     CBS cbs;
     CBS_init(&cbs, test.in.data(), test.in.size());
-    if (CBS_asn1_bitstring_has_bit(&cbs, test.bit) !=
-        static_cast<int>(test.bit_set)) {
-      return false;
-    }
+    EXPECT_EQ(static_cast<int>(test.bit_set),
+              CBS_asn1_bitstring_has_bit(&cbs, test.bit));
   }
-
-  return true;
-}
-
-int main() {
-  CRYPTO_library_init();
-
-  if (!TestSkip() ||
-      !TestGetUint() ||
-      !TestGetPrefixed() ||
-      !TestGetPrefixedBad() ||
-      !TestGetASN1() ||
-      !TestCBBBasic() ||
-      !TestCBBFixed() ||
-      !TestCBBFinishChild() ||
-      !TestCBBMisuse() ||
-      !TestCBBPrefixed() ||
-      !TestCBBDiscardChild() ||
-      !TestCBBASN1() ||
-      !TestBerConvert() ||
-      !TestImplicitString() ||
-      !TestASN1Uint64() ||
-      !TestGetOptionalASN1Bool() ||
-      !TestZero() ||
-      !TestCBBReserve() ||
-      !TestStickyError() ||
-      !TestBitString()) {
-    return 1;
-  }
-
-  printf("PASS\n");
-  return 0;
 }
diff --git a/src/crypto/bytestring/cbs.c b/src/crypto/bytestring/cbs.c
index 14c55a4..8328b7f 100644
--- a/src/crypto/bytestring/cbs.c
+++ b/src/crypto/bytestring/cbs.c
@@ -329,16 +329,13 @@
 
 int CBS_get_asn1_uint64(CBS *cbs, uint64_t *out) {
   CBS bytes;
-  const uint8_t *data;
-  size_t i, len;
-
   if (!CBS_get_asn1(cbs, &bytes, CBS_ASN1_INTEGER)) {
     return 0;
   }
 
   *out = 0;
-  data = CBS_data(&bytes);
-  len = CBS_len(&bytes);
+  const uint8_t *data = CBS_data(&bytes);
+  size_t len = CBS_len(&bytes);
 
   if (len == 0) {
     /* An INTEGER is encoded with at least one octet. */
@@ -355,7 +352,7 @@
     return 0;
   }
 
-  for (i = 0; i < len; i++) {
+  for (size_t i = 0; i < len; i++) {
     if ((*out >> 56) != 0) {
       /* Too large to represent as a uint64_t. */
       return 0;
diff --git a/src/crypto/cipher/CMakeLists.txt b/src/crypto/cipher/CMakeLists.txt
index db46c4b..49f2833 100644
--- a/src/crypto/cipher/CMakeLists.txt
+++ b/src/crypto/cipher/CMakeLists.txt
@@ -22,6 +22,8 @@
   e_rc4.c
   e_des.c
   e_aes.c
+  e_aesgcmsiv.c
+  e_aesctrhmac.c
   e_chacha20poly1305.c
 
   tls_cbc.c
diff --git a/src/crypto/cipher/cipher_test.cc b/src/crypto/cipher/cipher_test.cc
index 09802c2..bdfcf23 100644
--- a/src/crypto/cipher/cipher_test.cc
+++ b/src/crypto/cipher/cipher_test.cc
@@ -71,6 +71,8 @@
     return EVP_des_ecb();
   } else if (name == "DES-EDE") {
     return EVP_des_ede();
+  } else if (name == "DES-EDE3") {
+    return EVP_des_ede3();
   } else if (name == "DES-EDE-CBC") {
     return EVP_des_ede_cbc();
   } else if (name == "DES-EDE3-CBC") {
@@ -89,6 +91,8 @@
     return EVP_aes_128_ofb();
   } else if (name == "AES-192-CBC") {
     return EVP_aes_192_cbc();
+  } else if (name == "AES-192-CTR") {
+    return EVP_aes_192_ctr();
   } else if (name == "AES-192-ECB") {
     return EVP_aes_192_ecb();
   } else if (name == "AES-256-CBC") {
diff --git a/src/crypto/cipher/e_aes.c b/src/crypto/cipher/e_aes.c
index f67cdad..861a563 100644
--- a/src/crypto/cipher/e_aes.c
+++ b/src/crypto/cipher/e_aes.c
@@ -56,7 +56,6 @@
 #include <openssl/mem.h>
 #include <openssl/nid.h>
 #include <openssl/rand.h>
-#include <openssl/sha.h>
 
 #include "internal.h"
 #include "../internal.h"
@@ -399,11 +398,11 @@
 
 static char aesni_capable(void);
 
-static ctr128_f aes_ctr_set_key(AES_KEY *aes_key, GCM128_CONTEXT *gcm_ctx,
-                                block128_f *out_block, const uint8_t *key,
-                                size_t key_len) {
+ctr128_f aes_ctr_set_key(AES_KEY *aes_key, GCM128_CONTEXT *gcm_ctx,
+                         block128_f *out_block, const uint8_t *key,
+                         size_t key_bytes) {
   if (aesni_capable()) {
-    aesni_set_encrypt_key(key, key_len * 8, aes_key);
+    aesni_set_encrypt_key(key, key_bytes * 8, aes_key);
     if (gcm_ctx != NULL) {
       CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)aesni_encrypt);
     }
@@ -414,7 +413,7 @@
   }
 
   if (hwaes_capable()) {
-    aes_hw_set_encrypt_key(key, key_len * 8, aes_key);
+    aes_hw_set_encrypt_key(key, key_bytes * 8, aes_key);
     if (gcm_ctx != NULL) {
       CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)aes_hw_encrypt);
     }
@@ -425,7 +424,7 @@
   }
 
   if (bsaes_capable()) {
-    AES_set_encrypt_key(key, key_len * 8, aes_key);
+    AES_set_encrypt_key(key, key_bytes * 8, aes_key);
     if (gcm_ctx != NULL) {
       CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)AES_encrypt);
     }
@@ -436,7 +435,7 @@
   }
 
   if (vpaes_capable()) {
-    vpaes_set_encrypt_key(key, key_len * 8, aes_key);
+    vpaes_set_encrypt_key(key, key_bytes * 8, aes_key);
     if (out_block) {
       *out_block = (block128_f) vpaes_encrypt;
     }
@@ -446,7 +445,7 @@
     return NULL;
   }
 
-  AES_set_encrypt_key(key, key_len * 8, aes_key);
+  AES_set_encrypt_key(key, key_bytes * 8, aes_key);
   if (gcm_ctx != NULL) {
     CRYPTO_gcm128_init(gcm_ctx, aes_key, (block128_f)AES_encrypt);
   }
@@ -1179,587 +1178,6 @@
 const EVP_AEAD *EVP_aead_aes_256_gcm(void) { return &aead_aes_256_gcm; }
 
 
-#define EVP_AEAD_AES_CTR_HMAC_SHA256_TAG_LEN SHA256_DIGEST_LENGTH
-#define EVP_AEAD_AES_CTR_HMAC_SHA256_NONCE_LEN 12
-
-struct aead_aes_ctr_hmac_sha256_ctx {
-  union {
-    double align;
-    AES_KEY ks;
-  } ks;
-  ctr128_f ctr;
-  block128_f block;
-  SHA256_CTX inner_init_state;
-  SHA256_CTX outer_init_state;
-  uint8_t tag_len;
-};
-
-static void hmac_init(SHA256_CTX *out_inner, SHA256_CTX *out_outer,
-                      const uint8_t hmac_key[32]) {
-  static const size_t hmac_key_len = 32;
-  uint8_t block[SHA256_CBLOCK];
-  OPENSSL_memcpy(block, hmac_key, hmac_key_len);
-  OPENSSL_memset(block + hmac_key_len, 0x36, sizeof(block) - hmac_key_len);
-
-  unsigned i;
-  for (i = 0; i < hmac_key_len; i++) {
-    block[i] ^= 0x36;
-  }
-
-  SHA256_Init(out_inner);
-  SHA256_Update(out_inner, block, sizeof(block));
-
-  OPENSSL_memset(block + hmac_key_len, 0x5c, sizeof(block) - hmac_key_len);
-  for (i = 0; i < hmac_key_len; i++) {
-    block[i] ^= (0x36 ^ 0x5c);
-  }
-
-  SHA256_Init(out_outer);
-  SHA256_Update(out_outer, block, sizeof(block));
-}
-
-static int aead_aes_ctr_hmac_sha256_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
-                                         size_t key_len, size_t tag_len) {
-  struct aead_aes_ctr_hmac_sha256_ctx *aes_ctx;
-  static const size_t hmac_key_len = 32;
-
-  if (key_len < hmac_key_len) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_KEY_LENGTH);
-    return 0; /* EVP_AEAD_CTX_init should catch this. */
-  }
-
-  const size_t aes_key_len = key_len - hmac_key_len;
-  if (aes_key_len != 16 && aes_key_len != 32) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_KEY_LENGTH);
-    return 0; /* EVP_AEAD_CTX_init should catch this. */
-  }
-
-  if (tag_len == EVP_AEAD_DEFAULT_TAG_LENGTH) {
-    tag_len = EVP_AEAD_AES_CTR_HMAC_SHA256_TAG_LEN;
-  }
-
-  if (tag_len > EVP_AEAD_AES_CTR_HMAC_SHA256_TAG_LEN) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_TAG_TOO_LARGE);
-    return 0;
-  }
-
-  aes_ctx = OPENSSL_malloc(sizeof(struct aead_aes_ctr_hmac_sha256_ctx));
-  if (aes_ctx == NULL) {
-    OPENSSL_PUT_ERROR(CIPHER, ERR_R_MALLOC_FAILURE);
-    return 0;
-  }
-
-  aes_ctx->ctr =
-      aes_ctr_set_key(&aes_ctx->ks.ks, NULL, &aes_ctx->block, key, aes_key_len);
-  aes_ctx->tag_len = tag_len;
-  hmac_init(&aes_ctx->inner_init_state, &aes_ctx->outer_init_state,
-            key + aes_key_len);
-
-  ctx->aead_state = aes_ctx;
-
-  return 1;
-}
-
-static void aead_aes_ctr_hmac_sha256_cleanup(EVP_AEAD_CTX *ctx) {
-  struct aead_aes_ctr_hmac_sha256_ctx *aes_ctx = ctx->aead_state;
-  OPENSSL_cleanse(aes_ctx, sizeof(struct aead_aes_ctr_hmac_sha256_ctx));
-  OPENSSL_free(aes_ctx);
-}
-
-static void hmac_update_uint64(SHA256_CTX *sha256, uint64_t value) {
-  unsigned i;
-  uint8_t bytes[8];
-
-  for (i = 0; i < sizeof(bytes); i++) {
-    bytes[i] = value & 0xff;
-    value >>= 8;
-  }
-  SHA256_Update(sha256, bytes, sizeof(bytes));
-}
-
-static void hmac_calculate(uint8_t out[SHA256_DIGEST_LENGTH],
-                           const SHA256_CTX *inner_init_state,
-                           const SHA256_CTX *outer_init_state,
-                           const uint8_t *ad, size_t ad_len,
-                           const uint8_t *nonce, const uint8_t *ciphertext,
-                           size_t ciphertext_len) {
-  SHA256_CTX sha256;
-  OPENSSL_memcpy(&sha256, inner_init_state, sizeof(sha256));
-  hmac_update_uint64(&sha256, ad_len);
-  hmac_update_uint64(&sha256, ciphertext_len);
-  SHA256_Update(&sha256, nonce, EVP_AEAD_AES_CTR_HMAC_SHA256_NONCE_LEN);
-  SHA256_Update(&sha256, ad, ad_len);
-
-  /* Pad with zeros to the end of the SHA-256 block. */
-  const unsigned num_padding =
-      (SHA256_CBLOCK - ((sizeof(uint64_t)*2 +
-                         EVP_AEAD_AES_CTR_HMAC_SHA256_NONCE_LEN + ad_len) %
-                        SHA256_CBLOCK)) %
-      SHA256_CBLOCK;
-  uint8_t padding[SHA256_CBLOCK];
-  OPENSSL_memset(padding, 0, num_padding);
-  SHA256_Update(&sha256, padding, num_padding);
-
-  SHA256_Update(&sha256, ciphertext, ciphertext_len);
-
-  uint8_t inner_digest[SHA256_DIGEST_LENGTH];
-  SHA256_Final(inner_digest, &sha256);
-
-  OPENSSL_memcpy(&sha256, outer_init_state, sizeof(sha256));
-  SHA256_Update(&sha256, inner_digest, sizeof(inner_digest));
-  SHA256_Final(out, &sha256);
-}
-
-static void aead_aes_ctr_hmac_sha256_crypt(
-    const struct aead_aes_ctr_hmac_sha256_ctx *aes_ctx, uint8_t *out,
-    const uint8_t *in, size_t len, const uint8_t *nonce) {
-  /* Since the AEAD operation is one-shot, keeping a buffer of unused keystream
-   * bytes is pointless. However, |CRYPTO_ctr128_encrypt| requires it. */
-  uint8_t partial_block_buffer[AES_BLOCK_SIZE];
-  unsigned partial_block_offset = 0;
-  OPENSSL_memset(partial_block_buffer, 0, sizeof(partial_block_buffer));
-
-  uint8_t counter[AES_BLOCK_SIZE];
-  OPENSSL_memcpy(counter, nonce, EVP_AEAD_AES_CTR_HMAC_SHA256_NONCE_LEN);
-  OPENSSL_memset(counter + EVP_AEAD_AES_CTR_HMAC_SHA256_NONCE_LEN, 0, 4);
-
-  if (aes_ctx->ctr) {
-    CRYPTO_ctr128_encrypt_ctr32(in, out, len, &aes_ctx->ks.ks, counter,
-                                partial_block_buffer, &partial_block_offset,
-                                aes_ctx->ctr);
-  } else {
-    CRYPTO_ctr128_encrypt(in, out, len, &aes_ctx->ks.ks, counter,
-                          partial_block_buffer, &partial_block_offset,
-                          aes_ctx->block);
-  }
-}
-
-static int aead_aes_ctr_hmac_sha256_seal(const EVP_AEAD_CTX *ctx, uint8_t *out,
-                                         size_t *out_len, size_t max_out_len,
-                                         const uint8_t *nonce, size_t nonce_len,
-                                         const uint8_t *in, size_t in_len,
-                                         const uint8_t *ad, size_t ad_len) {
-  const struct aead_aes_ctr_hmac_sha256_ctx *aes_ctx = ctx->aead_state;
-  const uint64_t in_len_64 = in_len;
-
-  if (in_len + aes_ctx->tag_len < in_len ||
-      /* This input is so large it would overflow the 32-bit block counter. */
-      in_len_64 >= (UINT64_C(1) << 32) * AES_BLOCK_SIZE) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_TOO_LARGE);
-    return 0;
-  }
-
-  if (max_out_len < in_len + aes_ctx->tag_len) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BUFFER_TOO_SMALL);
-    return 0;
-  }
-
-  if (nonce_len != EVP_AEAD_AES_CTR_HMAC_SHA256_NONCE_LEN) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_UNSUPPORTED_NONCE_SIZE);
-    return 0;
-  }
-
-  aead_aes_ctr_hmac_sha256_crypt(aes_ctx, out, in, in_len, nonce);
-
-  uint8_t hmac_result[SHA256_DIGEST_LENGTH];
-  hmac_calculate(hmac_result, &aes_ctx->inner_init_state,
-                 &aes_ctx->outer_init_state, ad, ad_len, nonce, out, in_len);
-  OPENSSL_memcpy(out + in_len, hmac_result, aes_ctx->tag_len);
-  *out_len = in_len + aes_ctx->tag_len;
-
-  return 1;
-}
-
-static int aead_aes_ctr_hmac_sha256_open(const EVP_AEAD_CTX *ctx, uint8_t *out,
-                                         size_t *out_len, size_t max_out_len,
-                                         const uint8_t *nonce, size_t nonce_len,
-                                         const uint8_t *in, size_t in_len,
-                                         const uint8_t *ad, size_t ad_len) {
-  const struct aead_aes_ctr_hmac_sha256_ctx *aes_ctx = ctx->aead_state;
-  size_t plaintext_len;
-
-  if (in_len < aes_ctx->tag_len) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_DECRYPT);
-    return 0;
-  }
-
-  plaintext_len = in_len - aes_ctx->tag_len;
-
-  if (max_out_len < plaintext_len) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BUFFER_TOO_SMALL);
-    return 0;
-  }
-
-  if (nonce_len != EVP_AEAD_AES_CTR_HMAC_SHA256_NONCE_LEN) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_UNSUPPORTED_NONCE_SIZE);
-    return 0;
-  }
-
-  uint8_t hmac_result[SHA256_DIGEST_LENGTH];
-  hmac_calculate(hmac_result, &aes_ctx->inner_init_state,
-                 &aes_ctx->outer_init_state, ad, ad_len, nonce, in,
-                 plaintext_len);
-  if (CRYPTO_memcmp(hmac_result, in + plaintext_len, aes_ctx->tag_len) != 0) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_DECRYPT);
-    return 0;
-  }
-
-  aead_aes_ctr_hmac_sha256_crypt(aes_ctx, out, in, plaintext_len, nonce);
-
-  *out_len = plaintext_len;
-  return 1;
-}
-
-static const EVP_AEAD aead_aes_128_ctr_hmac_sha256 = {
-    16 /* AES key */ + 32 /* HMAC key */,
-    12,                                       /* nonce length */
-    EVP_AEAD_AES_CTR_HMAC_SHA256_TAG_LEN,     /* overhead */
-    EVP_AEAD_AES_CTR_HMAC_SHA256_TAG_LEN,     /* max tag length */
-
-    aead_aes_ctr_hmac_sha256_init,
-    NULL /* init_with_direction */,
-    aead_aes_ctr_hmac_sha256_cleanup,
-    aead_aes_ctr_hmac_sha256_seal,
-    aead_aes_ctr_hmac_sha256_open,
-    NULL /* get_iv */,
-};
-
-static const EVP_AEAD aead_aes_256_ctr_hmac_sha256 = {
-    32 /* AES key */ + 32 /* HMAC key */,
-    12,                                       /* nonce length */
-    EVP_AEAD_AES_CTR_HMAC_SHA256_TAG_LEN,     /* overhead */
-    EVP_AEAD_AES_CTR_HMAC_SHA256_TAG_LEN,     /* max tag length */
-
-    aead_aes_ctr_hmac_sha256_init,
-    NULL /* init_with_direction */,
-    aead_aes_ctr_hmac_sha256_cleanup,
-    aead_aes_ctr_hmac_sha256_seal,
-    aead_aes_ctr_hmac_sha256_open,
-    NULL /* get_iv */,
-};
-
-const EVP_AEAD *EVP_aead_aes_128_ctr_hmac_sha256(void) {
-  return &aead_aes_128_ctr_hmac_sha256;
-}
-
-const EVP_AEAD *EVP_aead_aes_256_ctr_hmac_sha256(void) {
-  return &aead_aes_256_ctr_hmac_sha256;
-}
-
-#if !defined(OPENSSL_SMALL)
-
-#define EVP_AEAD_AES_GCM_SIV_NONCE_LEN 12
-#define EVP_AEAD_AES_GCM_SIV_TAG_LEN 16
-
-struct aead_aes_gcm_siv_ctx {
-  union {
-    double align;
-    AES_KEY ks;
-  } ks;
-  block128_f kgk_block;
-  unsigned is_256:1;
-};
-
-static int aead_aes_gcm_siv_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
-                                 size_t key_len, size_t tag_len) {
-  const size_t key_bits = key_len * 8;
-
-  if (key_bits != 128 && key_bits != 256) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_KEY_LENGTH);
-    return 0; /* EVP_AEAD_CTX_init should catch this. */
-  }
-
-  if (tag_len == EVP_AEAD_DEFAULT_TAG_LENGTH) {
-    tag_len = EVP_AEAD_AES_GCM_SIV_TAG_LEN;
-  }
-
-  if (tag_len != EVP_AEAD_AES_GCM_SIV_TAG_LEN) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_TAG_TOO_LARGE);
-    return 0;
-  }
-
-  struct aead_aes_gcm_siv_ctx *gcm_siv_ctx =
-      OPENSSL_malloc(sizeof(struct aead_aes_gcm_siv_ctx));
-  if (gcm_siv_ctx == NULL) {
-    return 0;
-  }
-  OPENSSL_memset(gcm_siv_ctx, 0, sizeof(struct aead_aes_gcm_siv_ctx));
-
-  if (aesni_capable()) {
-    aesni_set_encrypt_key(key, key_len * 8, &gcm_siv_ctx->ks.ks);
-    gcm_siv_ctx->kgk_block = (block128_f)aesni_encrypt;
-  } else if (hwaes_capable()) {
-    aes_hw_set_encrypt_key(key, key_len * 8, &gcm_siv_ctx->ks.ks);
-    gcm_siv_ctx->kgk_block = (block128_f)aes_hw_encrypt;
-  } else if (vpaes_capable()) {
-    vpaes_set_encrypt_key(key, key_len * 8, &gcm_siv_ctx->ks.ks);
-    gcm_siv_ctx->kgk_block = (block128_f)vpaes_encrypt;
-  } else {
-    AES_set_encrypt_key(key, key_len * 8, &gcm_siv_ctx->ks.ks);
-    gcm_siv_ctx->kgk_block = (block128_f)AES_encrypt;
-  }
-
-  gcm_siv_ctx->is_256 = (key_len == 32);
-  ctx->aead_state = gcm_siv_ctx;
-
-  return 1;
-}
-
-static void aead_aes_gcm_siv_cleanup(EVP_AEAD_CTX *ctx) {
-  struct aead_aes_gcm_siv_ctx *gcm_siv_ctx = ctx->aead_state;
-  OPENSSL_cleanse(gcm_siv_ctx, sizeof(struct aead_aes_gcm_siv_ctx));
-  OPENSSL_free(gcm_siv_ctx);
-}
-
-/* gcm_siv_crypt encrypts (or decrypts—it's the same thing) |in_len| bytes from
- * |in| to |out|, using the block function |enc_block| with |key| in counter
- * mode, starting at |initial_counter|. This differs from the traditional
- * counter mode code in that the counter is handled little-endian, only the
- * first four bytes are used and the GCM-SIV tweak to the final byte is
- * applied. The |in| and |out| pointers may be equal but otherwise must not
- * alias. */
-static void gcm_siv_crypt(uint8_t *out, const uint8_t *in, size_t in_len,
-                          const uint8_t initial_counter[AES_BLOCK_SIZE],
-                          block128_f enc_block, const AES_KEY *key) {
-  union {
-    uint32_t w[4];
-    uint8_t c[16];
-  } counter;
-
-  OPENSSL_memcpy(counter.c, initial_counter, AES_BLOCK_SIZE);
-  counter.c[15] |= 0x80;
-
-  for (size_t done = 0; done < in_len;) {
-    uint8_t keystream[AES_BLOCK_SIZE];
-    enc_block(counter.c, keystream, key);
-    counter.w[0]++;
-
-    size_t todo = AES_BLOCK_SIZE;
-    if (in_len - done < todo) {
-      todo = in_len - done;
-    }
-
-    for (size_t i = 0; i < todo; i++) {
-      out[done + i] = keystream[i] ^ in[done + i];
-    }
-
-    done += todo;
-  }
-}
-
-/* gcm_siv_polyval evaluates POLYVAL at |auth_key| on the given plaintext and
- * AD. The result is written to |out_tag|. */
-static void gcm_siv_polyval(
-    uint8_t out_tag[16], const uint8_t *in, size_t in_len, const uint8_t *ad,
-    size_t ad_len, const uint8_t auth_key[16],
-    const uint8_t nonce[EVP_AEAD_AES_GCM_SIV_NONCE_LEN]) {
-  struct polyval_ctx polyval_ctx;
-  CRYPTO_POLYVAL_init(&polyval_ctx, auth_key);
-
-  CRYPTO_POLYVAL_update_blocks(&polyval_ctx, ad, ad_len & ~15);
-
-  uint8_t scratch[16];
-  if (ad_len & 15) {
-    OPENSSL_memset(scratch, 0, sizeof(scratch));
-    OPENSSL_memcpy(scratch, &ad[ad_len & ~15], ad_len & 15);
-    CRYPTO_POLYVAL_update_blocks(&polyval_ctx, scratch, sizeof(scratch));
-  }
-
-  CRYPTO_POLYVAL_update_blocks(&polyval_ctx, in, in_len & ~15);
-  if (in_len & 15) {
-    OPENSSL_memset(scratch, 0, sizeof(scratch));
-    OPENSSL_memcpy(scratch, &in[in_len & ~15], in_len & 15);
-    CRYPTO_POLYVAL_update_blocks(&polyval_ctx, scratch, sizeof(scratch));
-  }
-
-  union {
-    uint8_t c[16];
-    struct {
-      uint64_t ad;
-      uint64_t in;
-    } bitlens;
-  } length_block;
-
-  length_block.bitlens.ad = ad_len * 8;
-  length_block.bitlens.in = in_len * 8;
-  CRYPTO_POLYVAL_update_blocks(&polyval_ctx, length_block.c,
-                               sizeof(length_block));
-
-  CRYPTO_POLYVAL_finish(&polyval_ctx, out_tag);
-  for (size_t i = 0; i < EVP_AEAD_AES_GCM_SIV_NONCE_LEN; i++) {
-    out_tag[i] ^= nonce[i];
-  }
-  out_tag[15] &= 0x7f;
-}
-
-/* gcm_siv_record_keys contains the keys used for a specific GCM-SIV record. */
-struct gcm_siv_record_keys {
-  uint8_t auth_key[16];
-  union {
-    double align;
-    AES_KEY ks;
-  } enc_key;
-  block128_f enc_block;
-};
-
-/* gcm_siv_keys calculates the keys for a specific GCM-SIV record with the
- * given nonce and writes them to |*out_keys|. */
-static void gcm_siv_keys(
-    const struct aead_aes_gcm_siv_ctx *gcm_siv_ctx,
-    struct gcm_siv_record_keys *out_keys,
-    const uint8_t nonce[EVP_AEAD_AES_GCM_SIV_NONCE_LEN]) {
-  const AES_KEY *const key = &gcm_siv_ctx->ks.ks;
-  uint8_t key_material[(128 /* POLYVAL key */ + 256 /* max AES key */) / 8];
-  const size_t blocks_needed = gcm_siv_ctx->is_256 ? 6 : 4;
-
-  uint8_t counter[AES_BLOCK_SIZE];
-  OPENSSL_memset(counter, 0, AES_BLOCK_SIZE - EVP_AEAD_AES_GCM_SIV_NONCE_LEN);
-  OPENSSL_memcpy(counter + AES_BLOCK_SIZE - EVP_AEAD_AES_GCM_SIV_NONCE_LEN,
-                 nonce, EVP_AEAD_AES_GCM_SIV_NONCE_LEN);
-  for (size_t i = 0; i < blocks_needed; i++) {
-    counter[0] = i;
-
-    uint8_t ciphertext[AES_BLOCK_SIZE];
-    gcm_siv_ctx->kgk_block(counter, ciphertext, key);
-    OPENSSL_memcpy(&key_material[i * 8], ciphertext, 8);
-  }
-
-  OPENSSL_memcpy(out_keys->auth_key, key_material, 16);
-  aes_ctr_set_key(&out_keys->enc_key.ks, NULL, &out_keys->enc_block,
-                  key_material + 16, gcm_siv_ctx->is_256 ? 32 : 16);
-}
-
-static int aead_aes_gcm_siv_seal(const EVP_AEAD_CTX *ctx, uint8_t *out,
-                                 size_t *out_len, size_t max_out_len,
-                                 const uint8_t *nonce, size_t nonce_len,
-                                 const uint8_t *in, size_t in_len,
-                                 const uint8_t *ad, size_t ad_len) {
-  const struct aead_aes_gcm_siv_ctx *gcm_siv_ctx = ctx->aead_state;
-  const uint64_t in_len_64 = in_len;
-  const uint64_t ad_len_64 = ad_len;
-
-  if (in_len + EVP_AEAD_AES_GCM_SIV_TAG_LEN < in_len ||
-      in_len_64 > (UINT64_C(1) << 36) ||
-      ad_len_64 >= (UINT64_C(1) << 61)) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_TOO_LARGE);
-    return 0;
-  }
-
-  if (max_out_len < in_len + EVP_AEAD_AES_GCM_SIV_TAG_LEN) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BUFFER_TOO_SMALL);
-    return 0;
-  }
-
-  if (nonce_len != EVP_AEAD_AES_GCM_SIV_NONCE_LEN) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_UNSUPPORTED_NONCE_SIZE);
-    return 0;
-  }
-
-  struct gcm_siv_record_keys keys;
-  gcm_siv_keys(gcm_siv_ctx, &keys, nonce);
-
-  uint8_t tag[16];
-  gcm_siv_polyval(tag, in, in_len, ad, ad_len, keys.auth_key, nonce);
-  keys.enc_block(tag, tag, &keys.enc_key.ks);
-
-  gcm_siv_crypt(out, in, in_len, tag, keys.enc_block, &keys.enc_key.ks);
-
-  OPENSSL_memcpy(&out[in_len], tag, EVP_AEAD_AES_GCM_SIV_TAG_LEN);
-  *out_len = in_len + EVP_AEAD_AES_GCM_SIV_TAG_LEN;
-
-  return 1;
-}
-
-static int aead_aes_gcm_siv_open(const EVP_AEAD_CTX *ctx, uint8_t *out,
-                                 size_t *out_len, size_t max_out_len,
-                                 const uint8_t *nonce, size_t nonce_len,
-                                 const uint8_t *in, size_t in_len,
-                                 const uint8_t *ad, size_t ad_len) {
-  const uint64_t ad_len_64 = ad_len;
-  if (ad_len_64 >= (UINT64_C(1) << 61)) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_TOO_LARGE);
-    return 0;
-  }
-
-  const uint64_t in_len_64 = in_len;
-  if (in_len < EVP_AEAD_AES_GCM_SIV_TAG_LEN ||
-      in_len_64 > (UINT64_C(1) << 36) + AES_BLOCK_SIZE) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_DECRYPT);
-    return 0;
-  }
-
-  if (nonce_len != EVP_AEAD_AES_GCM_SIV_NONCE_LEN) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_UNSUPPORTED_NONCE_SIZE);
-    return 0;
-  }
-
-  const struct aead_aes_gcm_siv_ctx *gcm_siv_ctx = ctx->aead_state;
-  const size_t plaintext_len = in_len - EVP_AEAD_AES_GCM_SIV_TAG_LEN;
-
-  if (max_out_len < plaintext_len) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BUFFER_TOO_SMALL);
-    return 0;
-  }
-
-  struct gcm_siv_record_keys keys;
-  gcm_siv_keys(gcm_siv_ctx, &keys, nonce);
-
-  gcm_siv_crypt(out, in, plaintext_len, &in[plaintext_len], keys.enc_block,
-                &keys.enc_key.ks);
-
-  uint8_t expected_tag[EVP_AEAD_AES_GCM_SIV_TAG_LEN];
-  gcm_siv_polyval(expected_tag, out, plaintext_len, ad, ad_len, keys.auth_key,
-                  nonce);
-  keys.enc_block(expected_tag, expected_tag, &keys.enc_key.ks);
-
-  if (CRYPTO_memcmp(expected_tag, &in[plaintext_len], sizeof(expected_tag)) !=
-      0) {
-    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_DECRYPT);
-    return 0;
-  }
-
-  *out_len = plaintext_len;
-  return 1;
-}
-
-static const EVP_AEAD aead_aes_128_gcm_siv = {
-    16,                             /* key length */
-    EVP_AEAD_AES_GCM_SIV_NONCE_LEN, /* nonce length */
-    EVP_AEAD_AES_GCM_SIV_TAG_LEN,   /* overhead */
-    EVP_AEAD_AES_GCM_SIV_TAG_LEN,   /* max tag length */
-
-    aead_aes_gcm_siv_init,
-    NULL /* init_with_direction */,
-    aead_aes_gcm_siv_cleanup,
-    aead_aes_gcm_siv_seal,
-    aead_aes_gcm_siv_open,
-    NULL /* get_iv */,
-};
-
-static const EVP_AEAD aead_aes_256_gcm_siv = {
-    32,                             /* key length */
-    EVP_AEAD_AES_GCM_SIV_NONCE_LEN, /* nonce length */
-    EVP_AEAD_AES_GCM_SIV_TAG_LEN,   /* overhead */
-    EVP_AEAD_AES_GCM_SIV_TAG_LEN,   /* max tag length */
-
-    aead_aes_gcm_siv_init,
-    NULL /* init_with_direction */,
-    aead_aes_gcm_siv_cleanup,
-    aead_aes_gcm_siv_seal,
-    aead_aes_gcm_siv_open,
-    NULL /* get_iv */,
-};
-
-const EVP_AEAD *EVP_aead_aes_128_gcm_siv(void) {
-  return &aead_aes_128_gcm_siv;
-}
-
-const EVP_AEAD *EVP_aead_aes_256_gcm_siv(void) {
-  return &aead_aes_256_gcm_siv;
-}
-
-#endif  /* !OPENSSL_SMALL */
-
 int EVP_has_aes_hardware(void) {
 #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
   return aesni_capable() && crypto_gcm_clmul_enabled();
diff --git a/src/crypto/cipher/e_aesctrhmac.c b/src/crypto/cipher/e_aesctrhmac.c
new file mode 100644
index 0000000..f7cd412
--- /dev/null
+++ b/src/crypto/cipher/e_aesctrhmac.c
@@ -0,0 +1,289 @@
+/* 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. */
+
+#include <openssl/aead.h>
+#include <openssl/cipher.h>
+#include <openssl/crypto.h>
+#include <openssl/err.h>
+#include <openssl/sha.h>
+
+#include "internal.h"
+
+
+#define EVP_AEAD_AES_CTR_HMAC_SHA256_TAG_LEN SHA256_DIGEST_LENGTH
+#define EVP_AEAD_AES_CTR_HMAC_SHA256_NONCE_LEN 12
+
+struct aead_aes_ctr_hmac_sha256_ctx {
+  union {
+    double align;
+    AES_KEY ks;
+  } ks;
+  ctr128_f ctr;
+  block128_f block;
+  SHA256_CTX inner_init_state;
+  SHA256_CTX outer_init_state;
+  uint8_t tag_len;
+};
+
+static void hmac_init(SHA256_CTX *out_inner, SHA256_CTX *out_outer,
+                      const uint8_t hmac_key[32]) {
+  static const size_t hmac_key_len = 32;
+  uint8_t block[SHA256_CBLOCK];
+  OPENSSL_memcpy(block, hmac_key, hmac_key_len);
+  OPENSSL_memset(block + hmac_key_len, 0x36, sizeof(block) - hmac_key_len);
+
+  unsigned i;
+  for (i = 0; i < hmac_key_len; i++) {
+    block[i] ^= 0x36;
+  }
+
+  SHA256_Init(out_inner);
+  SHA256_Update(out_inner, block, sizeof(block));
+
+  OPENSSL_memset(block + hmac_key_len, 0x5c, sizeof(block) - hmac_key_len);
+  for (i = 0; i < hmac_key_len; i++) {
+    block[i] ^= (0x36 ^ 0x5c);
+  }
+
+  SHA256_Init(out_outer);
+  SHA256_Update(out_outer, block, sizeof(block));
+}
+
+static int aead_aes_ctr_hmac_sha256_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
+                                         size_t key_len, size_t tag_len) {
+  struct aead_aes_ctr_hmac_sha256_ctx *aes_ctx;
+  static const size_t hmac_key_len = 32;
+
+  if (key_len < hmac_key_len) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_KEY_LENGTH);
+    return 0; /* EVP_AEAD_CTX_init should catch this. */
+  }
+
+  const size_t aes_key_len = key_len - hmac_key_len;
+  if (aes_key_len != 16 && aes_key_len != 32) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_KEY_LENGTH);
+    return 0; /* EVP_AEAD_CTX_init should catch this. */
+  }
+
+  if (tag_len == EVP_AEAD_DEFAULT_TAG_LENGTH) {
+    tag_len = EVP_AEAD_AES_CTR_HMAC_SHA256_TAG_LEN;
+  }
+
+  if (tag_len > EVP_AEAD_AES_CTR_HMAC_SHA256_TAG_LEN) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_TAG_TOO_LARGE);
+    return 0;
+  }
+
+  aes_ctx = OPENSSL_malloc(sizeof(struct aead_aes_ctr_hmac_sha256_ctx));
+  if (aes_ctx == NULL) {
+    OPENSSL_PUT_ERROR(CIPHER, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
+
+  aes_ctx->ctr =
+      aes_ctr_set_key(&aes_ctx->ks.ks, NULL, &aes_ctx->block, key, aes_key_len);
+  aes_ctx->tag_len = tag_len;
+  hmac_init(&aes_ctx->inner_init_state, &aes_ctx->outer_init_state,
+            key + aes_key_len);
+
+  ctx->aead_state = aes_ctx;
+
+  return 1;
+}
+
+static void aead_aes_ctr_hmac_sha256_cleanup(EVP_AEAD_CTX *ctx) {
+  struct aead_aes_ctr_hmac_sha256_ctx *aes_ctx = ctx->aead_state;
+  OPENSSL_cleanse(aes_ctx, sizeof(struct aead_aes_ctr_hmac_sha256_ctx));
+  OPENSSL_free(aes_ctx);
+}
+
+static void hmac_update_uint64(SHA256_CTX *sha256, uint64_t value) {
+  unsigned i;
+  uint8_t bytes[8];
+
+  for (i = 0; i < sizeof(bytes); i++) {
+    bytes[i] = value & 0xff;
+    value >>= 8;
+  }
+  SHA256_Update(sha256, bytes, sizeof(bytes));
+}
+
+static void hmac_calculate(uint8_t out[SHA256_DIGEST_LENGTH],
+                           const SHA256_CTX *inner_init_state,
+                           const SHA256_CTX *outer_init_state,
+                           const uint8_t *ad, size_t ad_len,
+                           const uint8_t *nonce, const uint8_t *ciphertext,
+                           size_t ciphertext_len) {
+  SHA256_CTX sha256;
+  OPENSSL_memcpy(&sha256, inner_init_state, sizeof(sha256));
+  hmac_update_uint64(&sha256, ad_len);
+  hmac_update_uint64(&sha256, ciphertext_len);
+  SHA256_Update(&sha256, nonce, EVP_AEAD_AES_CTR_HMAC_SHA256_NONCE_LEN);
+  SHA256_Update(&sha256, ad, ad_len);
+
+  /* Pad with zeros to the end of the SHA-256 block. */
+  const unsigned num_padding =
+      (SHA256_CBLOCK - ((sizeof(uint64_t)*2 +
+                         EVP_AEAD_AES_CTR_HMAC_SHA256_NONCE_LEN + ad_len) %
+                        SHA256_CBLOCK)) %
+      SHA256_CBLOCK;
+  uint8_t padding[SHA256_CBLOCK];
+  OPENSSL_memset(padding, 0, num_padding);
+  SHA256_Update(&sha256, padding, num_padding);
+
+  SHA256_Update(&sha256, ciphertext, ciphertext_len);
+
+  uint8_t inner_digest[SHA256_DIGEST_LENGTH];
+  SHA256_Final(inner_digest, &sha256);
+
+  OPENSSL_memcpy(&sha256, outer_init_state, sizeof(sha256));
+  SHA256_Update(&sha256, inner_digest, sizeof(inner_digest));
+  SHA256_Final(out, &sha256);
+}
+
+static void aead_aes_ctr_hmac_sha256_crypt(
+    const struct aead_aes_ctr_hmac_sha256_ctx *aes_ctx, uint8_t *out,
+    const uint8_t *in, size_t len, const uint8_t *nonce) {
+  /* Since the AEAD operation is one-shot, keeping a buffer of unused keystream
+   * bytes is pointless. However, |CRYPTO_ctr128_encrypt| requires it. */
+  uint8_t partial_block_buffer[AES_BLOCK_SIZE];
+  unsigned partial_block_offset = 0;
+  OPENSSL_memset(partial_block_buffer, 0, sizeof(partial_block_buffer));
+
+  uint8_t counter[AES_BLOCK_SIZE];
+  OPENSSL_memcpy(counter, nonce, EVP_AEAD_AES_CTR_HMAC_SHA256_NONCE_LEN);
+  OPENSSL_memset(counter + EVP_AEAD_AES_CTR_HMAC_SHA256_NONCE_LEN, 0, 4);
+
+  if (aes_ctx->ctr) {
+    CRYPTO_ctr128_encrypt_ctr32(in, out, len, &aes_ctx->ks.ks, counter,
+                                partial_block_buffer, &partial_block_offset,
+                                aes_ctx->ctr);
+  } else {
+    CRYPTO_ctr128_encrypt(in, out, len, &aes_ctx->ks.ks, counter,
+                          partial_block_buffer, &partial_block_offset,
+                          aes_ctx->block);
+  }
+}
+
+static int aead_aes_ctr_hmac_sha256_seal(const EVP_AEAD_CTX *ctx, uint8_t *out,
+                                         size_t *out_len, size_t max_out_len,
+                                         const uint8_t *nonce, size_t nonce_len,
+                                         const uint8_t *in, size_t in_len,
+                                         const uint8_t *ad, size_t ad_len) {
+  const struct aead_aes_ctr_hmac_sha256_ctx *aes_ctx = ctx->aead_state;
+  const uint64_t in_len_64 = in_len;
+
+  if (in_len + aes_ctx->tag_len < in_len ||
+      /* This input is so large it would overflow the 32-bit block counter. */
+      in_len_64 >= (UINT64_C(1) << 32) * AES_BLOCK_SIZE) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_TOO_LARGE);
+    return 0;
+  }
+
+  if (max_out_len < in_len + aes_ctx->tag_len) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BUFFER_TOO_SMALL);
+    return 0;
+  }
+
+  if (nonce_len != EVP_AEAD_AES_CTR_HMAC_SHA256_NONCE_LEN) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_UNSUPPORTED_NONCE_SIZE);
+    return 0;
+  }
+
+  aead_aes_ctr_hmac_sha256_crypt(aes_ctx, out, in, in_len, nonce);
+
+  uint8_t hmac_result[SHA256_DIGEST_LENGTH];
+  hmac_calculate(hmac_result, &aes_ctx->inner_init_state,
+                 &aes_ctx->outer_init_state, ad, ad_len, nonce, out, in_len);
+  OPENSSL_memcpy(out + in_len, hmac_result, aes_ctx->tag_len);
+  *out_len = in_len + aes_ctx->tag_len;
+
+  return 1;
+}
+
+static int aead_aes_ctr_hmac_sha256_open(const EVP_AEAD_CTX *ctx, uint8_t *out,
+                                         size_t *out_len, size_t max_out_len,
+                                         const uint8_t *nonce, size_t nonce_len,
+                                         const uint8_t *in, size_t in_len,
+                                         const uint8_t *ad, size_t ad_len) {
+  const struct aead_aes_ctr_hmac_sha256_ctx *aes_ctx = ctx->aead_state;
+  size_t plaintext_len;
+
+  if (in_len < aes_ctx->tag_len) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_DECRYPT);
+    return 0;
+  }
+
+  plaintext_len = in_len - aes_ctx->tag_len;
+
+  if (max_out_len < plaintext_len) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BUFFER_TOO_SMALL);
+    return 0;
+  }
+
+  if (nonce_len != EVP_AEAD_AES_CTR_HMAC_SHA256_NONCE_LEN) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_UNSUPPORTED_NONCE_SIZE);
+    return 0;
+  }
+
+  uint8_t hmac_result[SHA256_DIGEST_LENGTH];
+  hmac_calculate(hmac_result, &aes_ctx->inner_init_state,
+                 &aes_ctx->outer_init_state, ad, ad_len, nonce, in,
+                 plaintext_len);
+  if (CRYPTO_memcmp(hmac_result, in + plaintext_len, aes_ctx->tag_len) != 0) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_DECRYPT);
+    return 0;
+  }
+
+  aead_aes_ctr_hmac_sha256_crypt(aes_ctx, out, in, plaintext_len, nonce);
+
+  *out_len = plaintext_len;
+  return 1;
+}
+
+static const EVP_AEAD aead_aes_128_ctr_hmac_sha256 = {
+    16 /* AES key */ + 32 /* HMAC key */,
+    12,                                       /* nonce length */
+    EVP_AEAD_AES_CTR_HMAC_SHA256_TAG_LEN,     /* overhead */
+    EVP_AEAD_AES_CTR_HMAC_SHA256_TAG_LEN,     /* max tag length */
+
+    aead_aes_ctr_hmac_sha256_init,
+    NULL /* init_with_direction */,
+    aead_aes_ctr_hmac_sha256_cleanup,
+    aead_aes_ctr_hmac_sha256_seal,
+    aead_aes_ctr_hmac_sha256_open,
+    NULL /* get_iv */,
+};
+
+static const EVP_AEAD aead_aes_256_ctr_hmac_sha256 = {
+    32 /* AES key */ + 32 /* HMAC key */,
+    12,                                       /* nonce length */
+    EVP_AEAD_AES_CTR_HMAC_SHA256_TAG_LEN,     /* overhead */
+    EVP_AEAD_AES_CTR_HMAC_SHA256_TAG_LEN,     /* max tag length */
+
+    aead_aes_ctr_hmac_sha256_init,
+    NULL /* init_with_direction */,
+    aead_aes_ctr_hmac_sha256_cleanup,
+    aead_aes_ctr_hmac_sha256_seal,
+    aead_aes_ctr_hmac_sha256_open,
+    NULL /* get_iv */,
+};
+
+const EVP_AEAD *EVP_aead_aes_128_ctr_hmac_sha256(void) {
+  return &aead_aes_128_ctr_hmac_sha256;
+}
+
+const EVP_AEAD *EVP_aead_aes_256_ctr_hmac_sha256(void) {
+  return &aead_aes_256_ctr_hmac_sha256;
+}
diff --git a/src/crypto/cipher/e_aesgcmsiv.c b/src/crypto/cipher/e_aesgcmsiv.c
new file mode 100644
index 0000000..f966861
--- /dev/null
+++ b/src/crypto/cipher/e_aesgcmsiv.c
@@ -0,0 +1,323 @@
+/* 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. */
+
+#include <openssl/aead.h>
+#include <openssl/cipher.h>
+#include <openssl/crypto.h>
+#include <openssl/err.h>
+
+#include "internal.h"
+
+
+#if !defined(OPENSSL_SMALL)
+
+#define EVP_AEAD_AES_GCM_SIV_NONCE_LEN 12
+#define EVP_AEAD_AES_GCM_SIV_TAG_LEN 16
+
+struct aead_aes_gcm_siv_ctx {
+  union {
+    double align;
+    AES_KEY ks;
+  } ks;
+  block128_f kgk_block;
+  unsigned is_256:1;
+};
+
+static int aead_aes_gcm_siv_init(EVP_AEAD_CTX *ctx, const uint8_t *key,
+                                 size_t key_len, size_t tag_len) {
+  const size_t key_bits = key_len * 8;
+
+  if (key_bits != 128 && key_bits != 256) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_KEY_LENGTH);
+    return 0; /* EVP_AEAD_CTX_init should catch this. */
+  }
+
+  if (tag_len == EVP_AEAD_DEFAULT_TAG_LENGTH) {
+    tag_len = EVP_AEAD_AES_GCM_SIV_TAG_LEN;
+  }
+
+  if (tag_len != EVP_AEAD_AES_GCM_SIV_TAG_LEN) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_TAG_TOO_LARGE);
+    return 0;
+  }
+
+  struct aead_aes_gcm_siv_ctx *gcm_siv_ctx =
+      OPENSSL_malloc(sizeof(struct aead_aes_gcm_siv_ctx));
+  if (gcm_siv_ctx == NULL) {
+    return 0;
+  }
+  OPENSSL_memset(gcm_siv_ctx, 0, sizeof(struct aead_aes_gcm_siv_ctx));
+
+  aes_ctr_set_key(&gcm_siv_ctx->ks.ks, NULL, &gcm_siv_ctx->kgk_block, key,
+                  key_len);
+  gcm_siv_ctx->is_256 = (key_len == 32);
+  ctx->aead_state = gcm_siv_ctx;
+
+  return 1;
+}
+
+static void aead_aes_gcm_siv_cleanup(EVP_AEAD_CTX *ctx) {
+  struct aead_aes_gcm_siv_ctx *gcm_siv_ctx = ctx->aead_state;
+  OPENSSL_cleanse(gcm_siv_ctx, sizeof(struct aead_aes_gcm_siv_ctx));
+  OPENSSL_free(gcm_siv_ctx);
+}
+
+/* gcm_siv_crypt encrypts (or decrypts—it's the same thing) |in_len| bytes from
+ * |in| to |out|, using the block function |enc_block| with |key| in counter
+ * mode, starting at |initial_counter|. This differs from the traditional
+ * counter mode code in that the counter is handled little-endian, only the
+ * first four bytes are used and the GCM-SIV tweak to the final byte is
+ * applied. The |in| and |out| pointers may be equal but otherwise must not
+ * alias. */
+static void gcm_siv_crypt(uint8_t *out, const uint8_t *in, size_t in_len,
+                          const uint8_t initial_counter[AES_BLOCK_SIZE],
+                          block128_f enc_block, const AES_KEY *key) {
+  union {
+    uint32_t w[4];
+    uint8_t c[16];
+  } counter;
+
+  OPENSSL_memcpy(counter.c, initial_counter, AES_BLOCK_SIZE);
+  counter.c[15] |= 0x80;
+
+  for (size_t done = 0; done < in_len;) {
+    uint8_t keystream[AES_BLOCK_SIZE];
+    enc_block(counter.c, keystream, key);
+    counter.w[0]++;
+
+    size_t todo = AES_BLOCK_SIZE;
+    if (in_len - done < todo) {
+      todo = in_len - done;
+    }
+
+    for (size_t i = 0; i < todo; i++) {
+      out[done + i] = keystream[i] ^ in[done + i];
+    }
+
+    done += todo;
+  }
+}
+
+/* gcm_siv_polyval evaluates POLYVAL at |auth_key| on the given plaintext and
+ * AD. The result is written to |out_tag|. */
+static void gcm_siv_polyval(
+    uint8_t out_tag[16], const uint8_t *in, size_t in_len, const uint8_t *ad,
+    size_t ad_len, const uint8_t auth_key[16],
+    const uint8_t nonce[EVP_AEAD_AES_GCM_SIV_NONCE_LEN]) {
+  struct polyval_ctx polyval_ctx;
+  CRYPTO_POLYVAL_init(&polyval_ctx, auth_key);
+
+  CRYPTO_POLYVAL_update_blocks(&polyval_ctx, ad, ad_len & ~15);
+
+  uint8_t scratch[16];
+  if (ad_len & 15) {
+    OPENSSL_memset(scratch, 0, sizeof(scratch));
+    OPENSSL_memcpy(scratch, &ad[ad_len & ~15], ad_len & 15);
+    CRYPTO_POLYVAL_update_blocks(&polyval_ctx, scratch, sizeof(scratch));
+  }
+
+  CRYPTO_POLYVAL_update_blocks(&polyval_ctx, in, in_len & ~15);
+  if (in_len & 15) {
+    OPENSSL_memset(scratch, 0, sizeof(scratch));
+    OPENSSL_memcpy(scratch, &in[in_len & ~15], in_len & 15);
+    CRYPTO_POLYVAL_update_blocks(&polyval_ctx, scratch, sizeof(scratch));
+  }
+
+  union {
+    uint8_t c[16];
+    struct {
+      uint64_t ad;
+      uint64_t in;
+    } bitlens;
+  } length_block;
+
+  length_block.bitlens.ad = ad_len * 8;
+  length_block.bitlens.in = in_len * 8;
+  CRYPTO_POLYVAL_update_blocks(&polyval_ctx, length_block.c,
+                               sizeof(length_block));
+
+  CRYPTO_POLYVAL_finish(&polyval_ctx, out_tag);
+  for (size_t i = 0; i < EVP_AEAD_AES_GCM_SIV_NONCE_LEN; i++) {
+    out_tag[i] ^= nonce[i];
+  }
+  out_tag[15] &= 0x7f;
+}
+
+/* gcm_siv_record_keys contains the keys used for a specific GCM-SIV record. */
+struct gcm_siv_record_keys {
+  uint8_t auth_key[16];
+  union {
+    double align;
+    AES_KEY ks;
+  } enc_key;
+  block128_f enc_block;
+};
+
+/* gcm_siv_keys calculates the keys for a specific GCM-SIV record with the
+ * given nonce and writes them to |*out_keys|. */
+static void gcm_siv_keys(
+    const struct aead_aes_gcm_siv_ctx *gcm_siv_ctx,
+    struct gcm_siv_record_keys *out_keys,
+    const uint8_t nonce[EVP_AEAD_AES_GCM_SIV_NONCE_LEN]) {
+  const AES_KEY *const key = &gcm_siv_ctx->ks.ks;
+  uint8_t key_material[(128 /* POLYVAL key */ + 256 /* max AES key */) / 8];
+  const size_t blocks_needed = gcm_siv_ctx->is_256 ? 6 : 4;
+
+  uint8_t counter[AES_BLOCK_SIZE];
+  OPENSSL_memset(counter, 0, AES_BLOCK_SIZE - EVP_AEAD_AES_GCM_SIV_NONCE_LEN);
+  OPENSSL_memcpy(counter + AES_BLOCK_SIZE - EVP_AEAD_AES_GCM_SIV_NONCE_LEN,
+                 nonce, EVP_AEAD_AES_GCM_SIV_NONCE_LEN);
+  for (size_t i = 0; i < blocks_needed; i++) {
+    counter[0] = i;
+
+    uint8_t ciphertext[AES_BLOCK_SIZE];
+    gcm_siv_ctx->kgk_block(counter, ciphertext, key);
+    OPENSSL_memcpy(&key_material[i * 8], ciphertext, 8);
+  }
+
+  OPENSSL_memcpy(out_keys->auth_key, key_material, 16);
+  aes_ctr_set_key(&out_keys->enc_key.ks, NULL, &out_keys->enc_block,
+                  key_material + 16, gcm_siv_ctx->is_256 ? 32 : 16);
+}
+
+static int aead_aes_gcm_siv_seal(const EVP_AEAD_CTX *ctx, uint8_t *out,
+                                 size_t *out_len, size_t max_out_len,
+                                 const uint8_t *nonce, size_t nonce_len,
+                                 const uint8_t *in, size_t in_len,
+                                 const uint8_t *ad, size_t ad_len) {
+  const struct aead_aes_gcm_siv_ctx *gcm_siv_ctx = ctx->aead_state;
+  const uint64_t in_len_64 = in_len;
+  const uint64_t ad_len_64 = ad_len;
+
+  if (in_len + EVP_AEAD_AES_GCM_SIV_TAG_LEN < in_len ||
+      in_len_64 > (UINT64_C(1) << 36) ||
+      ad_len_64 >= (UINT64_C(1) << 61)) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_TOO_LARGE);
+    return 0;
+  }
+
+  if (max_out_len < in_len + EVP_AEAD_AES_GCM_SIV_TAG_LEN) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BUFFER_TOO_SMALL);
+    return 0;
+  }
+
+  if (nonce_len != EVP_AEAD_AES_GCM_SIV_NONCE_LEN) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_UNSUPPORTED_NONCE_SIZE);
+    return 0;
+  }
+
+  struct gcm_siv_record_keys keys;
+  gcm_siv_keys(gcm_siv_ctx, &keys, nonce);
+
+  uint8_t tag[16];
+  gcm_siv_polyval(tag, in, in_len, ad, ad_len, keys.auth_key, nonce);
+  keys.enc_block(tag, tag, &keys.enc_key.ks);
+
+  gcm_siv_crypt(out, in, in_len, tag, keys.enc_block, &keys.enc_key.ks);
+
+  OPENSSL_memcpy(&out[in_len], tag, EVP_AEAD_AES_GCM_SIV_TAG_LEN);
+  *out_len = in_len + EVP_AEAD_AES_GCM_SIV_TAG_LEN;
+
+  return 1;
+}
+
+static int aead_aes_gcm_siv_open(const EVP_AEAD_CTX *ctx, uint8_t *out,
+                                 size_t *out_len, size_t max_out_len,
+                                 const uint8_t *nonce, size_t nonce_len,
+                                 const uint8_t *in, size_t in_len,
+                                 const uint8_t *ad, size_t ad_len) {
+  const uint64_t ad_len_64 = ad_len;
+  if (ad_len_64 >= (UINT64_C(1) << 61)) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_TOO_LARGE);
+    return 0;
+  }
+
+  const uint64_t in_len_64 = in_len;
+  if (in_len < EVP_AEAD_AES_GCM_SIV_TAG_LEN ||
+      in_len_64 > (UINT64_C(1) << 36) + AES_BLOCK_SIZE) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_DECRYPT);
+    return 0;
+  }
+
+  if (nonce_len != EVP_AEAD_AES_GCM_SIV_NONCE_LEN) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_UNSUPPORTED_NONCE_SIZE);
+    return 0;
+  }
+
+  const struct aead_aes_gcm_siv_ctx *gcm_siv_ctx = ctx->aead_state;
+  const size_t plaintext_len = in_len - EVP_AEAD_AES_GCM_SIV_TAG_LEN;
+
+  if (max_out_len < plaintext_len) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BUFFER_TOO_SMALL);
+    return 0;
+  }
+
+  struct gcm_siv_record_keys keys;
+  gcm_siv_keys(gcm_siv_ctx, &keys, nonce);
+
+  gcm_siv_crypt(out, in, plaintext_len, &in[plaintext_len], keys.enc_block,
+                &keys.enc_key.ks);
+
+  uint8_t expected_tag[EVP_AEAD_AES_GCM_SIV_TAG_LEN];
+  gcm_siv_polyval(expected_tag, out, plaintext_len, ad, ad_len, keys.auth_key,
+                  nonce);
+  keys.enc_block(expected_tag, expected_tag, &keys.enc_key.ks);
+
+  if (CRYPTO_memcmp(expected_tag, &in[plaintext_len], sizeof(expected_tag)) !=
+      0) {
+    OPENSSL_PUT_ERROR(CIPHER, CIPHER_R_BAD_DECRYPT);
+    return 0;
+  }
+
+  *out_len = plaintext_len;
+  return 1;
+}
+
+static const EVP_AEAD aead_aes_128_gcm_siv = {
+    16,                             /* key length */
+    EVP_AEAD_AES_GCM_SIV_NONCE_LEN, /* nonce length */
+    EVP_AEAD_AES_GCM_SIV_TAG_LEN,   /* overhead */
+    EVP_AEAD_AES_GCM_SIV_TAG_LEN,   /* max tag length */
+
+    aead_aes_gcm_siv_init,
+    NULL /* init_with_direction */,
+    aead_aes_gcm_siv_cleanup,
+    aead_aes_gcm_siv_seal,
+    aead_aes_gcm_siv_open,
+    NULL /* get_iv */,
+};
+
+static const EVP_AEAD aead_aes_256_gcm_siv = {
+    32,                             /* key length */
+    EVP_AEAD_AES_GCM_SIV_NONCE_LEN, /* nonce length */
+    EVP_AEAD_AES_GCM_SIV_TAG_LEN,   /* overhead */
+    EVP_AEAD_AES_GCM_SIV_TAG_LEN,   /* max tag length */
+
+    aead_aes_gcm_siv_init,
+    NULL /* init_with_direction */,
+    aead_aes_gcm_siv_cleanup,
+    aead_aes_gcm_siv_seal,
+    aead_aes_gcm_siv_open,
+    NULL /* get_iv */,
+};
+
+const EVP_AEAD *EVP_aead_aes_128_gcm_siv(void) {
+  return &aead_aes_128_gcm_siv;
+}
+
+const EVP_AEAD *EVP_aead_aes_256_gcm_siv(void) {
+  return &aead_aes_256_gcm_siv;
+}
+
+#endif  /* !OPENSSL_SMALL */
diff --git a/src/crypto/cipher/e_des.c b/src/crypto/cipher/e_des.c
index 6834a42..e72f003 100644
--- a/src/crypto/cipher/e_des.c
+++ b/src/crypto/cipher/e_des.c
@@ -203,3 +203,13 @@
     NULL /* cleanup */,  NULL /* ctrl */, };
 
 const EVP_CIPHER *EVP_des_ede(void) { return &des_ede_ecb; }
+
+
+static const EVP_CIPHER des_ede3_ecb = {
+    NID_des_ede3_cbc,    8 /* block_size */,  24 /* key_size */,
+    0 /* iv_len */,      sizeof(DES_EDE_KEY), EVP_CIPH_ECB_MODE,
+    NULL /* app_data */, des_ede3_init_key,   des_ede_ecb_cipher,
+    NULL /* cleanup */,  NULL /* ctrl */,
+};
+
+const EVP_CIPHER *EVP_des_ede3(void) { return &des_ede3_ecb; }
diff --git a/src/crypto/cipher/internal.h b/src/crypto/cipher/internal.h
index b9f88f2..549412c 100644
--- a/src/crypto/cipher/internal.h
+++ b/src/crypto/cipher/internal.h
@@ -60,6 +60,9 @@
 #include <openssl/base.h>
 
 #include <openssl/aead.h>
+#include <openssl/aes.h>
+
+#include "../modes/internal.h"
 
 #if defined(__cplusplus)
 extern "C" {
@@ -154,6 +157,16 @@
                               const uint8_t *mac_secret,
                               unsigned mac_secret_length);
 
+/* aes_ctr_set_key initialises |*aes_key| using |key_bytes| bytes from |key|,
+ * where |key_bytes| must either be 16, 24 or 32. If not NULL, |*out_block| is
+ * set to a function that encrypts single blocks. If not NULL, |*gcm_ctx| is
+ * initialised to do GHASH with the given key. It returns a function for
+ * optimised CTR-mode, or NULL if CTR-mode should be built using
+ * |*out_block|. */
+ctr128_f aes_ctr_set_key(AES_KEY *aes_key, GCM128_CONTEXT *gcm_ctx,
+                         block128_f *out_block, const uint8_t *key,
+                         size_t key_bytes);
+
 #if defined(__cplusplus)
 } /* extern C */
 #endif
diff --git a/src/crypto/cipher/test/cipher_tests.txt b/src/crypto/cipher/test/cipher_tests.txt
index e75e664..8bffdf9 100644
--- a/src/crypto/cipher/test/cipher_tests.txt
+++ b/src/crypto/cipher/test/cipher_tests.txt
@@ -30,6 +30,58 @@
 Ciphertext = d6a141a7ec3c38dfbd61
 
 
+# DES EDE3 ECB tests
+Cipher = DES-EDE3
+Key = 2eaf97304cfaeb822c04a7b7bef328c7b82fef2ae81b06b5
+Plaintext = b3ed255d4f5e2d6d9a1aa2bc03489064d28fe1431eceee183b7231fad3273140
+Ciphertext = 629d608789e51dff699343d061ec01d94c0681c7698ab617ea0145f37304c8e2
+
+Cipher = DES-EDE3
+Key = 72f52e1ded0a88eac6c88d2901b27c2fd6e9f3f3387432ee
+Plaintext = 60de7b5667a1ad5995f178553d695d9b0fb537562876faa9b6cc50d05a1271ac
+Ciphertext = 09875b215ed2499318c2d99c48209ca5f288830cc6edb9538190fa3ca31fa175
+
+Cipher = DES-EDE3
+Key = 4cd30f1e14d485dbc05c69b65ebf44e556056a2261c9e714
+Plaintext = 7ae59441bbd665d8867273386fc72a8cd62cc5bc6bb7cbd57fc1f5dcdc73adfd
+Ciphertext = 004d0daad970bfee944c8779927867b964dd0afaae7a830c2b8e7fdcaeac2158
+
+Cipher = DES-EDE3
+Key = 7a07ac63adfaf1b26860ce39edfc402758bc4d1edda156ab
+Plaintext = ed4f18cf10bfcbd4354710df053d3e2b776860137349471b8dcf526b8eea8b22
+Ciphertext = a1fc1014abda7e198ac8e096a368f65d9b59e1eddf5d97715015a2408dd8e799
+
+Cipher = DES-EDE3
+Key = 37c443ab336fed59b0efae51ea7f5d07b7040868beefcd99
+Plaintext = a10a180cc94b75fc9d6556dfc0a816b71020dc3906f9d59d9dd4c839dfc1c1d3
+Ciphertext = 0a874652b621618635138a7d4b33bb624f91a39ef1422b3e0490311ac6df3602
+
+Cipher = DES-EDE3
+Key = 1ff1a7f4839d484e308d9b8c2c052b126def413d5fb8e0c5
+Plaintext = 4f28ef6683d36c80556ff240b247a3967aec23f859e3afb93aefad93b1e9964b
+Ciphertext = 87a8f3fb4c51b3caf19c4ac51363d92025acc053e538c1502d347a618314a4bd
+
+Cipher = DES-EDE3
+Key = 5642c4d1859a85b342e3f253fd8bd835e856c451e63673e5
+Plaintext = 687af9b298db752b47982f64ad9bff52a9ae487aa5e5c08f902035b0633225bf
+Ciphertext = ca2ed48392ba5d70879ac8772180c3028ef946b6ac1df0348f206ce16bc449bd
+
+Cipher = DES-EDE3
+Key = 30f9d27472f9deee309dbca76ba29ca174c39d0631084735
+Plaintext = 85db2c266902932c8e46d0207459b203f90955adcd7506b49bc82e2796de764f
+Ciphertext = bbb5940b45add7c587cc9fcfc40674bac7e081baf71285891c65ed9573947a07
+
+Cipher = DES-EDE3
+Key = ebc5a73005b77a812c3f4f61669ba859939852580fa61cbc
+Plaintext = 808d22c60b883a986dcb0860e8d92a75441cca0a2a4b06dd78dbcbec198b38d9
+Ciphertext = 75d39d30862431ab07227e22b4c8218f1fbc2a3816daebc555c1b999c86d15c9
+
+Cipher = DES-EDE3
+Key = 2e8eb05dd8a2b7a5a61a6b8a3830b12da2c4b1bea1e884d5
+Plaintext = cc7569d005afd1a365f5c5836c14475fc15091199902af4a78460d56c16f91ca
+Ciphertext = 64db8af7a30363051a017cc92ed67ac6c0e2e1ffda0c94bbf0eeb803ba6b3d22
+
+
 # DES EDE3 CBC tests (from destest)
 Cipher = DES-EDE3-CBC
 Key = 0123456789abcdeff1e0d3c2b5a49786fedcba9876543210
diff --git a/src/crypto/cipher/test/make_nist_aesvs_kat_tests.go b/src/crypto/cipher/test/make_nist_aesvs_kat_tests.go
new file mode 100644
index 0000000..672c158
--- /dev/null
+++ b/src/crypto/cipher/test/make_nist_aesvs_kat_tests.go
@@ -0,0 +1,200 @@
+// 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.
+
+// The make_nist_aesvs_kat_tests utility converts a Known Answer Test
+// (KAT) files from the NIST CAVP AES Validation Suite (AESVS) into a
+// format that can be consumed by cipher_test.
+//
+// The AESVS specification can be found at
+// http://csrc.nist.gov/groups/STM/cavp/documents/aes/AESAVS.pdf.
+//
+// The KAT vectors are located at
+// http://csrc.nist.gov/groups/STM/cavp/documents/aes/KAT_AES.zip
+// (linked from
+// http://csrc.nist.gov/groups/STM/cavp/block-ciphers.html).
+package main
+
+import (
+	"bufio"
+	"flag"
+	"fmt"
+	"io"
+	"log"
+	"os"
+	"strings"
+)
+
+var (
+	inFile             = flag.String("in", "", "The input file name.")
+	cmdLineLabelStr    = flag.String("extra-labels", "", "Comma-separated list of additional label pairs to add (e.g. 'Cipher=AES-128-CBC,Operation=ENCRYPT')")
+	swapIVAndPlaintext = flag.Bool("swap-iv-plaintext", false, "When processing CBC vector files for CTR mode, swap IV and plaintext.")
+)
+
+// The character to delimit key-value pairs throughout the file ('=' or ':').
+var kvDelim rune
+
+func parseKeyValue(s string) (key, value string) {
+	if kvDelim == 0 {
+		i := strings.IndexAny(s, "=:")
+		if i != -1 {
+			kvDelim = rune(s[i])
+		}
+	}
+	if i := strings.IndexRune(s, kvDelim); kvDelim != 0 && i != -1 {
+		key, value = s[:i], s[i+1:]
+	} else {
+		key = s
+	}
+	return strings.TrimSpace(key), strings.TrimSpace(value)
+}
+
+type kvPair struct {
+	key, value string
+}
+
+var kvTranslations = map[kvPair]kvPair{
+	{"ENCRYPT", ""}:    {"Operation", "ENCRYPT"},
+	{"DECRYPT", ""}:    {"Operation", "DECRYPT"},
+	{"COUNT", ""}:      {"Count", ""},
+	{"KEY", ""}:        {"Key", ""},
+	{"PLAINTEXT", ""}:  {"Plaintext", ""},
+	{"CIPHERTEXT", ""}: {"Ciphertext", ""},
+	{"COUNT", ""}:      {"", ""}, // delete
+}
+
+func translateKeyValue(key, value string) (string, string) {
+	if t, ok := kvTranslations[kvPair{key, ""}]; ok {
+		if len(t.value) == 0 && len(value) != 0 {
+			return t.key, value
+		}
+		return t.key, t.value
+	}
+	if t, ok := kvTranslations[kvPair{key, value}]; ok {
+		return t.key, t.value
+	}
+	return key, value
+}
+
+func printKeyValue(key, value string) {
+	if len(value) == 0 {
+		fmt.Println(key)
+	} else {
+		fmt.Printf("%s: %s\n", key, value)
+	}
+}
+
+func generateTest(r io.Reader) {
+	s := bufio.NewScanner(r)
+
+	// Label blocks consist of lines of the form "[key]" or "[key =
+	// value]". |labels| holds keys and values of the most recent block
+	// of labels.
+	var labels map[string]string
+
+	// Auxiliary labels passed as a flag.
+	cmdLineLabels := make(map[string]string)
+	if len(*cmdLineLabelStr) != 0 {
+		pairs := strings.Split(*cmdLineLabelStr, ",")
+		for _, p := range pairs {
+			key, value := parseKeyValue(p)
+			cmdLineLabels[key] = value
+		}
+	}
+
+	kvDelim = 0
+
+	// Whether we are in a test or a label section.
+	inLabels := false
+	inTest := false
+
+	n := 0
+	for s.Scan() {
+		n++
+		line := s.Text()
+		l := strings.TrimSpace(line)
+		l = strings.SplitN(l, "#", 2)[0] // Trim trailing comments.
+
+		// Blank line.
+		if len(l) == 0 {
+			if inTest {
+				fmt.Println()
+			}
+			inTest = false
+			inLabels = false
+			continue
+		}
+
+		// Label section.
+		if l[0] == '[' {
+			if l[len(l)-1] != ']' {
+				log.Fatalf("line #%d invalid: %q", n, line)
+			}
+			if !inLabels {
+				labels = make(map[string]string)
+				inLabels = true
+			}
+
+			k, v := parseKeyValue(l[1 : len(l)-1])
+			k, v = translateKeyValue(k, v)
+			if len(k) != 0 {
+				labels[k] = v
+			}
+
+			continue
+		}
+
+		// Repeat the label map at the beginning of each test section.
+		if !inTest {
+			inTest = true
+			for k, v := range cmdLineLabels {
+				printKeyValue(k, v)
+			}
+			for k, v := range labels {
+				printKeyValue(k, v)
+			}
+		}
+
+		k, v := parseKeyValue(l)
+		k, v = translateKeyValue(k, v)
+		if len(k) != 0 {
+			printKeyValue(k, v)
+		}
+	}
+}
+
+func main() {
+	flag.Parse()
+
+	if *swapIVAndPlaintext {
+		kvTranslations[kvPair{"PLAINTEXT", ""}] = kvPair{"IV", ""}
+		kvTranslations[kvPair{"IV", ""}] = kvPair{"Plaintext", ""}
+	}
+
+	if len(*inFile) == 0 {
+		fmt.Fprintln(os.Stderr, "-in required")
+		flag.Usage()
+		os.Exit(1)
+	}
+
+	f, err := os.Open(*inFile)
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer f.Close()
+
+	args := append([]string{"make_nist_aesvs_kat_tests"}, os.Args[1:]...)
+	fmt.Printf("# Generated by %q\n\n", strings.Join(args, " "))
+
+	generateTest(f)
+}
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_gf_sbox.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_gf_sbox.txt
new file mode 100644
index 0000000..6f79916
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_gf_sbox.txt
@@ -0,0 +1,100 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCGFSbox128.rsp -extra-labels=Cipher=AES-128-CBC"
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: f34481ec3cc627bacd5dc3fb08f273e6
+Ciphertext: 0336763e966d92595a567cc9ce537f5e
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 9798c4640bad75c7c3227db910174e72
+Ciphertext: a9a1631bf4996954ebc093957b234589
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 96ab5c2ff612d9dfaae8c31f30c42168
+Ciphertext: ff4f8391a6a40ca5b25d23bedd44a597
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 6a118a874519e64e9963798a503f1d35
+Ciphertext: dc43be40be0e53712f7e2bf5ca707209
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: cb9fceec81286ca3e989bd979b0cb284
+Ciphertext: 92beedab1895a94faa69b632e5cc47ce
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: b26aeb1874e47ca8358ff22378f09144
+Ciphertext: 459264f4798f6a78bacb89c15ed3d601
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 58c8e00b2631686d54eab84b91f0aca1
+Ciphertext: 08a4e2efec8a8e3312ca7460b9040bbf
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0336763e966d92595a567cc9ce537f5e
+Plaintext: f34481ec3cc627bacd5dc3fb08f273e6
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a9a1631bf4996954ebc093957b234589
+Plaintext: 9798c4640bad75c7c3227db910174e72
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ff4f8391a6a40ca5b25d23bedd44a597
+Plaintext: 96ab5c2ff612d9dfaae8c31f30c42168
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dc43be40be0e53712f7e2bf5ca707209
+Plaintext: 6a118a874519e64e9963798a503f1d35
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 92beedab1895a94faa69b632e5cc47ce
+Plaintext: cb9fceec81286ca3e989bd979b0cb284
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 459264f4798f6a78bacb89c15ed3d601
+Plaintext: b26aeb1874e47ca8358ff22378f09144
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 08a4e2efec8a8e3312ca7460b9040bbf
+Plaintext: 58c8e00b2631686d54eab84b91f0aca1
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_key_sbox.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_key_sbox.txt
new file mode 100644
index 0000000..4948d6f
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_key_sbox.txt
@@ -0,0 +1,296 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCKeySbox128.rsp -extra-labels=Cipher=AES-128-CBC"
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 10a58869d74be5a374cf867cfb473859
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6d251e6944b051e04eaa6fb4dbf78465
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: caea65cdbb75e9169ecd22ebe6e54675
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6e29201190152df4ee058139def610bb
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: a2e2fa9baf7d20822ca9f0542f764a41
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c3b44b95d9d2f25670eee9a0de099fa3
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: b6364ac4e1de1e285eaf144a2415f7a0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5d9b05578fc944b3cf1ccf0e746cd581
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 64cf9c7abc50b888af65f49d521944b2
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f7efc89d5dba578104016ce5ad659c05
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 47d6742eefcc0465dc96355e851b64d9
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0306194f666d183624aa230a8b264ae7
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 3eb39790678c56bee34bbcdeccf6cdb5
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 858075d536d79ccee571f7d7204b1f67
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 64110a924f0743d500ccadae72c13427
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 35870c6a57e9e92314bcb8087cde72ce
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 18d8126516f8a12ab1a36d9f04d68e51
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6c68e9be5ec41e22c825b7c7affb4363
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: f530357968578480b398a3c251cd1093
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f5df39990fc688f1b07224cc03e86cea
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: da84367f325d42d601b4326964802e8e
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: bba071bcb470f8f6586e5d3add18bc66
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: e37b1c6aa2846f6fdb413f238b089f23
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 43c9f7e62f5d288bb27aa40ef8fe1ea8
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 6c002b682483e0cabcc731c253be5674
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3580d19cff44f1014a7c966a69059de5
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 143ae8ed6555aba96110ab58893a8ae1
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 806da864dd29d48deafbe764f8202aef
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: b69418a85332240dc82492353956ae0c
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a303d940ded8f0baff6f75414cac5243
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 71b5c08a1993e1362e4d0ce9b22b78d5
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c2dabd117f8a3ecabfbb11d12194d9d0
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: e234cdca2606b81f29408d5f6da21206
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fff60a4740086b3b9c56195b98d91a7b
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 13237c49074a3da078dc1d828bb78c6f
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8146a08e2357f0caa30ca8c94d1a0544
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 3071a2a48fe6cbd04f1a129098e308f8
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4b98e06d356deb07ebb824e5713f7be3
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 90f42ec0f68385f2ffc5dfc03a654dce
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7a20a53d460fc9ce0423a7a0764c6cf2
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: febd9a24d8b65c1c787d50a4ed3619a9
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f4a70d8af877f9b02b4c40df57d45b17
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 10a58869d74be5a374cf867cfb473859
+IV: 00000000000000000000000000000000
+Ciphertext: 6d251e6944b051e04eaa6fb4dbf78465
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: caea65cdbb75e9169ecd22ebe6e54675
+IV: 00000000000000000000000000000000
+Ciphertext: 6e29201190152df4ee058139def610bb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: a2e2fa9baf7d20822ca9f0542f764a41
+IV: 00000000000000000000000000000000
+Ciphertext: c3b44b95d9d2f25670eee9a0de099fa3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: b6364ac4e1de1e285eaf144a2415f7a0
+IV: 00000000000000000000000000000000
+Ciphertext: 5d9b05578fc944b3cf1ccf0e746cd581
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 64cf9c7abc50b888af65f49d521944b2
+IV: 00000000000000000000000000000000
+Ciphertext: f7efc89d5dba578104016ce5ad659c05
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 47d6742eefcc0465dc96355e851b64d9
+IV: 00000000000000000000000000000000
+Ciphertext: 0306194f666d183624aa230a8b264ae7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 3eb39790678c56bee34bbcdeccf6cdb5
+IV: 00000000000000000000000000000000
+Ciphertext: 858075d536d79ccee571f7d7204b1f67
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 64110a924f0743d500ccadae72c13427
+IV: 00000000000000000000000000000000
+Ciphertext: 35870c6a57e9e92314bcb8087cde72ce
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 18d8126516f8a12ab1a36d9f04d68e51
+IV: 00000000000000000000000000000000
+Ciphertext: 6c68e9be5ec41e22c825b7c7affb4363
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: f530357968578480b398a3c251cd1093
+IV: 00000000000000000000000000000000
+Ciphertext: f5df39990fc688f1b07224cc03e86cea
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: da84367f325d42d601b4326964802e8e
+IV: 00000000000000000000000000000000
+Ciphertext: bba071bcb470f8f6586e5d3add18bc66
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: e37b1c6aa2846f6fdb413f238b089f23
+IV: 00000000000000000000000000000000
+Ciphertext: 43c9f7e62f5d288bb27aa40ef8fe1ea8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 6c002b682483e0cabcc731c253be5674
+IV: 00000000000000000000000000000000
+Ciphertext: 3580d19cff44f1014a7c966a69059de5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 143ae8ed6555aba96110ab58893a8ae1
+IV: 00000000000000000000000000000000
+Ciphertext: 806da864dd29d48deafbe764f8202aef
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: b69418a85332240dc82492353956ae0c
+IV: 00000000000000000000000000000000
+Ciphertext: a303d940ded8f0baff6f75414cac5243
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 71b5c08a1993e1362e4d0ce9b22b78d5
+IV: 00000000000000000000000000000000
+Ciphertext: c2dabd117f8a3ecabfbb11d12194d9d0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: e234cdca2606b81f29408d5f6da21206
+IV: 00000000000000000000000000000000
+Ciphertext: fff60a4740086b3b9c56195b98d91a7b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 13237c49074a3da078dc1d828bb78c6f
+IV: 00000000000000000000000000000000
+Ciphertext: 8146a08e2357f0caa30ca8c94d1a0544
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 3071a2a48fe6cbd04f1a129098e308f8
+IV: 00000000000000000000000000000000
+Ciphertext: 4b98e06d356deb07ebb824e5713f7be3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 90f42ec0f68385f2ffc5dfc03a654dce
+IV: 00000000000000000000000000000000
+Ciphertext: 7a20a53d460fc9ce0423a7a0764c6cf2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: febd9a24d8b65c1c787d50a4ed3619a9
+IV: 00000000000000000000000000000000
+Ciphertext: f4a70d8af877f9b02b4c40df57d45b17
+Plaintext: 00000000000000000000000000000000
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_var_key.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_var_key.txt
new file mode 100644
index 0000000..29d6377
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_var_key.txt
@@ -0,0 +1,1794 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCVarKey128.rsp -extra-labels=Cipher=AES-128-CBC"
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 80000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0edd33d3c621e546455bd8ba1418bec8
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: c0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4bc3f883450c113c64ca42e1112a9e87
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: e0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 72a1da770f5d7ac4c9ef94d822affd97
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: f0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 970014d634e2b7650777e8e84d03ccd8
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: f8000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f17e79aed0db7e279e955b5f493875a7
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fc000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9ed5a75136a940d0963da379db4af26a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fe000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c4295f83465c7755e8fa364bac6a7ea5
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ff000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b1d758256b28fd850ad4944208cf1155
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ff800000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 42ffb34c743de4d88ca38011c990890b
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffc00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9958f0ecea8b2172c0c1995f9182c0f3
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffe00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 956d7798fac20f82a8823f984d06f7f5
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fff00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a01bf44f2d16be928ca44aaf7b9b106b
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fff80000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b5f1a33e50d40d103764c76bd4c6b6f8
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffc0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2637050c9fc0d4817e2d69de878aee8d
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffe0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 113ecbe4a453269a0dd26069467fb5b5
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffff0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 97d0754fe68f11b9e375d070a608c884
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffff8000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c6a0b3e998d05068a5399778405200b4
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffc000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: df556a33438db87bc41b1752c55e5e49
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffe000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 90fb128d3a1af6e548521bb962bf1f05
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffff000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 26298e9c1db517c215fadfb7d2a8d691
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffff800000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a6cb761d61f8292d0df393a279ad0380
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffc00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 12acd89b13cd5f8726e34d44fd486108
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffe00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 95b1703fc57ba09fe0c3580febdd7ed4
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffff00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: de11722d893e9f9121c381becc1da59a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffff80000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6d114ccb27bf391012e8974c546d9bf2
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffc0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5ce37e17eb4646ecfac29b9cc38d9340
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffe0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 18c1b6e2157122056d0243d8a165cddb
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffff0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 99693e6a59d1366c74d823562d7e1431
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffff8000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6c7c64dc84a8bba758ed17eb025a57e3
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffc000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e17bc79f30eaab2fac2cbbe3458d687a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffe000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1114bc2028009b923f0b01915ce5e7c4
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffff000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9c28524a16a1e1c1452971caa8d13476
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffff800000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ed62e16363638360fdd6ad62112794f0
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffc00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5a8688f0b2a2c16224c161658ffd4044
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffe00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 23f710842b9bb9c32f26648c786807ca
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffff00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 44a98bf11e163f632c47ec6a49683a89
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffff80000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0f18aff94274696d9b61848bd50ac5e5
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffc0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 82408571c3e2424540207f833b6dda69
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffe0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 303ff996947f0c7d1f43c8f3027b9b75
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffff0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7df4daf4ad29a3615a9b6ece5c99518a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffff8000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c72954a48d0774db0b4971c526260415
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffc000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1df9b76112dc6531e07d2cfda04411f0
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffe000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8e4d8e699119e1fc87545a647fb1d34f
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffff000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e6c4807ae11f36f091c57d9fb68548d1
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffff800000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8ebf73aad49c82007f77a5c1ccec6ab4
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffc00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4fb288cc2040049001d2c7585ad123fc
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffe00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 04497110efb9dceb13e2b13fb4465564
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffff00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 75550e6cb5a88e49634c9ab69eda0430
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffff80000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b6768473ce9843ea66a81405dd50b345
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffc0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cb2f430383f9084e03a653571e065de6
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffe0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ff4e66c07bae3e79fb7d210847a3b0ba
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffff0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7b90785125505fad59b13c186dd66ce3
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffff8000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8b527a6aebdaec9eaef8eda2cb7783e5
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffc000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 43fdaf53ebbc9880c228617d6a9b548b
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffe000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 53786104b9744b98f052c46f1c850d0b
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffff000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b5ab3013dd1e61df06cbaf34ca2aee78
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffff800000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7470469be9723030fdcc73a8cd4fbb10
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffc00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a35a63f5343ebe9ef8167bcb48ad122e
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffe00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fd8687f0757a210e9fdf181204c30863
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffff00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7a181e84bd5457d26a88fbae96018fb0
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffff80000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 653317b9362b6f9b9e1a580e68d494b5
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffc0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 995c9dc0b689f03c45867b5faa5c18d1
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffe0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 77a4d96d56dda398b9aabecfc75729fd
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffff0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 84be19e053635f09f2665e7bae85b42d
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffff8000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 32cd652842926aea4aa6137bb2be2b5e
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffc000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 493d4a4f38ebb337d10aa84e9171a554
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffe000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d9bff7ff454b0ec5a4a2a69566e2cb84
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffff000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3535d565ace3f31eb249ba2cc6765d7a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffff800000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f60e91fc3269eecf3231c6e9945697c6
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffc00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ab69cfadf51f8e604d9cc37182f6635a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffe00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7866373f24a0b6ed56e0d96fcdafb877
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffff00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1ea448c2aac954f5d812e9d78494446a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffff80000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: acc5599dd8ac02239a0fef4a36dd1668
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffc0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d8764468bb103828cf7e1473ce895073
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffe0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1b0d02893683b9f180458e4aa6b73982
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffff0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 96d9b017d302df410a937dcdb8bb6e43
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffff8000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ef1623cc44313cff440b1594a7e21cc6
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffc000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 284ca2fa35807b8b0ae4d19e11d7dbd7
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffe000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f2e976875755f9401d54f36e2a23a594
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffff000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ec198a18e10e532403b7e20887c8dd80
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffff800000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 545d50ebd919e4a6949d96ad47e46a80
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffc00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dbdfb527060e0a71009c7bb0c68f1d44
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffe00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9cfa1322ea33da2173a024f2ff0d896d
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffff00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8785b1a75b0f3bd958dcd0e29318c521
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffff80000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 38f67b9e98e4a97b6df030a9fcdd0104
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffc0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 192afffb2c880e82b05926d0fc6c448b
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffe0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6a7980ce7b105cf530952d74daaf798c
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffff0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ea3695e1351b9d6858bd958cf513ef6c
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffff8000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6da0490ba0ba0343b935681d2cce5ba1
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffc000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f0ea23af08534011c60009ab29ada2f1
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffe000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ff13806cf19cc38721554d7c0fcdcd4b
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffff000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6838af1f4f69bae9d85dd188dcdf0688
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffff800000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 36cf44c92d550bfb1ed28ef583ddf5d7
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffc00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d06e3195b5376f109d5c4ec6c5d62ced
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffe00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c440de014d3d610707279b13242a5c36
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffff00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f0c5c6ffa5e0bd3a94c88f6b6f7c16b9
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffff80000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3e40c3901cd7effc22bffc35dee0b4d9
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffc0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b63305c72bedfab97382c406d0c49bc6
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffe0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 36bbaab22a6bd4925a99a2b408d2dbae
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffff0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 307c5b8fcd0533ab98bc51e27a6ce461
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffff8000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 829c04ff4c07513c0b3ef05c03e337b5
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffc000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f17af0e895dda5eb98efc68066e84c54
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffe000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 277167f3812afff1ffacb4a934379fc3
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffff000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2cb1dc3a9c72972e425ae2ef3eb597cd
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffff800000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 36aeaa3a213e968d4b5b679d3a2c97fe
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffc00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9241daca4fdd034a82372db50e1a0f3f
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffe00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c14574d9cd00cf2b5a7f77e53cd57885
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffff00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 793de39236570aba83ab9b737cb521c9
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffff80000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 16591c0f27d60e29b85a96c33861a7ef
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffc0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 44fb5c4d4f5cb79be5c174a3b1c97348
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffe0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 674d2b61633d162be59dde04222f4740
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffff0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b4750ff263a65e1f9e924ccfd98f3e37
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffff8000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 62d0662d6eaeddedebae7f7ea3a4f6b6
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffc000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 70c46bb30692be657f7eaa93ebad9897
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffe000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 323994cfb9da285a5d9642e1759b224a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffff000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1dbf57877b7b17385c85d0b54851e371
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffff800
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dfa5c097cdc1532ac071d57b1d28d1bd
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffc00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3a0c53fa37311fc10bd2a9981f513174
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffe00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ba4f970c0a25c41814bdae2e506be3b4
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffff00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2dce3acb727cd13ccd76d425ea56e4f6
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffff80
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5160474d504b9b3eefb68d35f245f4b3
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffc0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 41a8a947766635dec37553d9a6c0cbb7
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffe0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 25d6cfe6881f2bf497dd14cd4ddf445b
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffff0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 41c78c135ed9e98c096640647265da1e
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffff8
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5a4d404d8917e353e92a21072c3b2305
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffc
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 02bc96846b3fdc71643f384cd3cc3eaf
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffe
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9ba4a9143f4e5d4048521c4f8877d88e
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffff
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a1f6258c877d5fcd8964484538bfc92c
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 80000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0edd33d3c621e546455bd8ba1418bec8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: c0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4bc3f883450c113c64ca42e1112a9e87
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: e0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 72a1da770f5d7ac4c9ef94d822affd97
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: f0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 970014d634e2b7650777e8e84d03ccd8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: f8000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f17e79aed0db7e279e955b5f493875a7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fc000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9ed5a75136a940d0963da379db4af26a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fe000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c4295f83465c7755e8fa364bac6a7ea5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ff000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b1d758256b28fd850ad4944208cf1155
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ff800000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 42ffb34c743de4d88ca38011c990890b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffc00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9958f0ecea8b2172c0c1995f9182c0f3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffe00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 956d7798fac20f82a8823f984d06f7f5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fff00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a01bf44f2d16be928ca44aaf7b9b106b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fff80000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b5f1a33e50d40d103764c76bd4c6b6f8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffc0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2637050c9fc0d4817e2d69de878aee8d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffe0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 113ecbe4a453269a0dd26069467fb5b5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffff0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 97d0754fe68f11b9e375d070a608c884
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffff8000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c6a0b3e998d05068a5399778405200b4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffc000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: df556a33438db87bc41b1752c55e5e49
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffe000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 90fb128d3a1af6e548521bb962bf1f05
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffff000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 26298e9c1db517c215fadfb7d2a8d691
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffff800000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a6cb761d61f8292d0df393a279ad0380
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffc00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 12acd89b13cd5f8726e34d44fd486108
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffe00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 95b1703fc57ba09fe0c3580febdd7ed4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffff00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: de11722d893e9f9121c381becc1da59a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffff80000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6d114ccb27bf391012e8974c546d9bf2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffc0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5ce37e17eb4646ecfac29b9cc38d9340
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffe0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 18c1b6e2157122056d0243d8a165cddb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffff0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 99693e6a59d1366c74d823562d7e1431
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffff8000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6c7c64dc84a8bba758ed17eb025a57e3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffc000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e17bc79f30eaab2fac2cbbe3458d687a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffe000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1114bc2028009b923f0b01915ce5e7c4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffff000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9c28524a16a1e1c1452971caa8d13476
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffff800000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ed62e16363638360fdd6ad62112794f0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffc00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5a8688f0b2a2c16224c161658ffd4044
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffe00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 23f710842b9bb9c32f26648c786807ca
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffff00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 44a98bf11e163f632c47ec6a49683a89
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffff80000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0f18aff94274696d9b61848bd50ac5e5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffc0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 82408571c3e2424540207f833b6dda69
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffe0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 303ff996947f0c7d1f43c8f3027b9b75
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffff0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7df4daf4ad29a3615a9b6ece5c99518a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffff8000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c72954a48d0774db0b4971c526260415
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffc000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1df9b76112dc6531e07d2cfda04411f0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffe000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8e4d8e699119e1fc87545a647fb1d34f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffff000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e6c4807ae11f36f091c57d9fb68548d1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffff800000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8ebf73aad49c82007f77a5c1ccec6ab4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffc00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4fb288cc2040049001d2c7585ad123fc
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffe00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 04497110efb9dceb13e2b13fb4465564
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffff00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 75550e6cb5a88e49634c9ab69eda0430
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffff80000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b6768473ce9843ea66a81405dd50b345
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffc0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cb2f430383f9084e03a653571e065de6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffe0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ff4e66c07bae3e79fb7d210847a3b0ba
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffff0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7b90785125505fad59b13c186dd66ce3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffff8000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8b527a6aebdaec9eaef8eda2cb7783e5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffc000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 43fdaf53ebbc9880c228617d6a9b548b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffe000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 53786104b9744b98f052c46f1c850d0b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffff000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b5ab3013dd1e61df06cbaf34ca2aee78
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffff800000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7470469be9723030fdcc73a8cd4fbb10
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffc00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a35a63f5343ebe9ef8167bcb48ad122e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffe00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fd8687f0757a210e9fdf181204c30863
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffff00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7a181e84bd5457d26a88fbae96018fb0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffff80000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 653317b9362b6f9b9e1a580e68d494b5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffc0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 995c9dc0b689f03c45867b5faa5c18d1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffe0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 77a4d96d56dda398b9aabecfc75729fd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffff0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 84be19e053635f09f2665e7bae85b42d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffff8000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 32cd652842926aea4aa6137bb2be2b5e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffc000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 493d4a4f38ebb337d10aa84e9171a554
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffe000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d9bff7ff454b0ec5a4a2a69566e2cb84
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffff000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3535d565ace3f31eb249ba2cc6765d7a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffff800000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f60e91fc3269eecf3231c6e9945697c6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffc00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ab69cfadf51f8e604d9cc37182f6635a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffe00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7866373f24a0b6ed56e0d96fcdafb877
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffff00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1ea448c2aac954f5d812e9d78494446a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffff80000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: acc5599dd8ac02239a0fef4a36dd1668
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffc0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d8764468bb103828cf7e1473ce895073
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffe0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1b0d02893683b9f180458e4aa6b73982
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffff0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 96d9b017d302df410a937dcdb8bb6e43
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffff8000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ef1623cc44313cff440b1594a7e21cc6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffc000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 284ca2fa35807b8b0ae4d19e11d7dbd7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffe000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f2e976875755f9401d54f36e2a23a594
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffff000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ec198a18e10e532403b7e20887c8dd80
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffff800000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 545d50ebd919e4a6949d96ad47e46a80
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffc00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dbdfb527060e0a71009c7bb0c68f1d44
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffe00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9cfa1322ea33da2173a024f2ff0d896d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffff00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8785b1a75b0f3bd958dcd0e29318c521
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffff80000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 38f67b9e98e4a97b6df030a9fcdd0104
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffc0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 192afffb2c880e82b05926d0fc6c448b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffe0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6a7980ce7b105cf530952d74daaf798c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffff0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ea3695e1351b9d6858bd958cf513ef6c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffff8000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6da0490ba0ba0343b935681d2cce5ba1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffc000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f0ea23af08534011c60009ab29ada2f1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffe000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ff13806cf19cc38721554d7c0fcdcd4b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffff000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6838af1f4f69bae9d85dd188dcdf0688
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffff800000000
+IV: 00000000000000000000000000000000
+Ciphertext: 36cf44c92d550bfb1ed28ef583ddf5d7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffc00000000
+IV: 00000000000000000000000000000000
+Ciphertext: d06e3195b5376f109d5c4ec6c5d62ced
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffe00000000
+IV: 00000000000000000000000000000000
+Ciphertext: c440de014d3d610707279b13242a5c36
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffff00000000
+IV: 00000000000000000000000000000000
+Ciphertext: f0c5c6ffa5e0bd3a94c88f6b6f7c16b9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffff80000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3e40c3901cd7effc22bffc35dee0b4d9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffc0000000
+IV: 00000000000000000000000000000000
+Ciphertext: b63305c72bedfab97382c406d0c49bc6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffe0000000
+IV: 00000000000000000000000000000000
+Ciphertext: 36bbaab22a6bd4925a99a2b408d2dbae
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffff0000000
+IV: 00000000000000000000000000000000
+Ciphertext: 307c5b8fcd0533ab98bc51e27a6ce461
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffff8000000
+IV: 00000000000000000000000000000000
+Ciphertext: 829c04ff4c07513c0b3ef05c03e337b5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffc000000
+IV: 00000000000000000000000000000000
+Ciphertext: f17af0e895dda5eb98efc68066e84c54
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffe000000
+IV: 00000000000000000000000000000000
+Ciphertext: 277167f3812afff1ffacb4a934379fc3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffff000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2cb1dc3a9c72972e425ae2ef3eb597cd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffff800000
+IV: 00000000000000000000000000000000
+Ciphertext: 36aeaa3a213e968d4b5b679d3a2c97fe
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffc00000
+IV: 00000000000000000000000000000000
+Ciphertext: 9241daca4fdd034a82372db50e1a0f3f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffe00000
+IV: 00000000000000000000000000000000
+Ciphertext: c14574d9cd00cf2b5a7f77e53cd57885
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffff00000
+IV: 00000000000000000000000000000000
+Ciphertext: 793de39236570aba83ab9b737cb521c9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffff80000
+IV: 00000000000000000000000000000000
+Ciphertext: 16591c0f27d60e29b85a96c33861a7ef
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffc0000
+IV: 00000000000000000000000000000000
+Ciphertext: 44fb5c4d4f5cb79be5c174a3b1c97348
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffe0000
+IV: 00000000000000000000000000000000
+Ciphertext: 674d2b61633d162be59dde04222f4740
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffff0000
+IV: 00000000000000000000000000000000
+Ciphertext: b4750ff263a65e1f9e924ccfd98f3e37
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffff8000
+IV: 00000000000000000000000000000000
+Ciphertext: 62d0662d6eaeddedebae7f7ea3a4f6b6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffc000
+IV: 00000000000000000000000000000000
+Ciphertext: 70c46bb30692be657f7eaa93ebad9897
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffe000
+IV: 00000000000000000000000000000000
+Ciphertext: 323994cfb9da285a5d9642e1759b224a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffff000
+IV: 00000000000000000000000000000000
+Ciphertext: 1dbf57877b7b17385c85d0b54851e371
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffff800
+IV: 00000000000000000000000000000000
+Ciphertext: dfa5c097cdc1532ac071d57b1d28d1bd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffc00
+IV: 00000000000000000000000000000000
+Ciphertext: 3a0c53fa37311fc10bd2a9981f513174
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffe00
+IV: 00000000000000000000000000000000
+Ciphertext: ba4f970c0a25c41814bdae2e506be3b4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffff00
+IV: 00000000000000000000000000000000
+Ciphertext: 2dce3acb727cd13ccd76d425ea56e4f6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffff80
+IV: 00000000000000000000000000000000
+Ciphertext: 5160474d504b9b3eefb68d35f245f4b3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffc0
+IV: 00000000000000000000000000000000
+Ciphertext: 41a8a947766635dec37553d9a6c0cbb7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffe0
+IV: 00000000000000000000000000000000
+Ciphertext: 25d6cfe6881f2bf497dd14cd4ddf445b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffff0
+IV: 00000000000000000000000000000000
+Ciphertext: 41c78c135ed9e98c096640647265da1e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffff8
+IV: 00000000000000000000000000000000
+Ciphertext: 5a4d404d8917e353e92a21072c3b2305
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffc
+IV: 00000000000000000000000000000000
+Ciphertext: 02bc96846b3fdc71643f384cd3cc3eaf
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffe
+IV: 00000000000000000000000000000000
+Ciphertext: 9ba4a9143f4e5d4048521c4f8877d88e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffff
+IV: 00000000000000000000000000000000
+Ciphertext: a1f6258c877d5fcd8964484538bfc92c
+Plaintext: 00000000000000000000000000000000
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_var_txt.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_var_txt.txt
new file mode 100644
index 0000000..1f11c12
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_var_txt.txt
@@ -0,0 +1,1794 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCVarTxt128.rsp -extra-labels=Cipher=AES-128-CBC"
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 80000000000000000000000000000000
+Ciphertext: 3ad78e726c1ec02b7ebfe92b23d9ec34
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: c0000000000000000000000000000000
+Ciphertext: aae5939c8efdf2f04e60b9fe7117b2c2
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: e0000000000000000000000000000000
+Ciphertext: f031d4d74f5dcbf39daaf8ca3af6e527
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: f0000000000000000000000000000000
+Ciphertext: 96d9fd5cc4f07441727df0f33e401a36
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: f8000000000000000000000000000000
+Ciphertext: 30ccdb044646d7e1f3ccea3dca08b8c0
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fc000000000000000000000000000000
+Ciphertext: 16ae4ce5042a67ee8e177b7c587ecc82
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fe000000000000000000000000000000
+Ciphertext: b6da0bb11a23855d9c5cb1b4c6412e0a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ff000000000000000000000000000000
+Ciphertext: db4f1aa530967d6732ce4715eb0ee24b
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ff800000000000000000000000000000
+Ciphertext: a81738252621dd180a34f3455b4baa2f
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffc00000000000000000000000000000
+Ciphertext: 77e2b508db7fd89234caf7939ee5621a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffe00000000000000000000000000000
+Ciphertext: b8499c251f8442ee13f0933b688fcd19
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fff00000000000000000000000000000
+Ciphertext: 965135f8a81f25c9d630b17502f68e53
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fff80000000000000000000000000000
+Ciphertext: 8b87145a01ad1c6cede995ea3670454f
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffc0000000000000000000000000000
+Ciphertext: 8eae3b10a0c8ca6d1d3b0fa61e56b0b2
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffe0000000000000000000000000000
+Ciphertext: 64b4d629810fda6bafdf08f3b0d8d2c5
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffff0000000000000000000000000000
+Ciphertext: d7e5dbd3324595f8fdc7d7c571da6c2a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffff8000000000000000000000000000
+Ciphertext: f3f72375264e167fca9de2c1527d9606
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffc000000000000000000000000000
+Ciphertext: 8ee79dd4f401ff9b7ea945d86666c13b
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffe000000000000000000000000000
+Ciphertext: dd35cea2799940b40db3f819cb94c08b
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffff000000000000000000000000000
+Ciphertext: 6941cb6b3e08c2b7afa581ebdd607b87
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffff800000000000000000000000000
+Ciphertext: 2c20f439f6bb097b29b8bd6d99aad799
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffc00000000000000000000000000
+Ciphertext: 625d01f058e565f77ae86378bd2c49b3
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffe00000000000000000000000000
+Ciphertext: c0b5fd98190ef45fbb4301438d095950
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffff00000000000000000000000000
+Ciphertext: 13001ff5d99806efd25da34f56be854b
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffff80000000000000000000000000
+Ciphertext: 3b594c60f5c8277a5113677f94208d82
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffc0000000000000000000000000
+Ciphertext: e9c0fc1818e4aa46bd2e39d638f89e05
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffe0000000000000000000000000
+Ciphertext: f8023ee9c3fdc45a019b4e985c7e1a54
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffff0000000000000000000000000
+Ciphertext: 35f40182ab4662f3023baec1ee796b57
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffff8000000000000000000000000
+Ciphertext: 3aebbad7303649b4194a6945c6cc3694
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffc000000000000000000000000
+Ciphertext: a2124bea53ec2834279bed7f7eb0f938
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffe000000000000000000000000
+Ciphertext: b9fb4399fa4facc7309e14ec98360b0a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffff000000000000000000000000
+Ciphertext: c26277437420c5d634f715aea81a9132
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffff800000000000000000000000
+Ciphertext: 171a0e1b2dd424f0e089af2c4c10f32f
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffc00000000000000000000000
+Ciphertext: 7cadbe402d1b208fe735edce00aee7ce
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffe00000000000000000000000
+Ciphertext: 43b02ff929a1485af6f5c6d6558baa0f
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffff00000000000000000000000
+Ciphertext: 092faacc9bf43508bf8fa8613ca75dea
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffff80000000000000000000000
+Ciphertext: cb2bf8280f3f9742c7ed513fe802629c
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffc0000000000000000000000
+Ciphertext: 215a41ee442fa992a6e323986ded3f68
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffe0000000000000000000000
+Ciphertext: f21e99cf4f0f77cea836e11a2fe75fb1
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffff0000000000000000000000
+Ciphertext: 95e3a0ca9079e646331df8b4e70d2cd6
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffff8000000000000000000000
+Ciphertext: 4afe7f120ce7613f74fc12a01a828073
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffc000000000000000000000
+Ciphertext: 827f000e75e2c8b9d479beed913fe678
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffe000000000000000000000
+Ciphertext: 35830c8e7aaefe2d30310ef381cbf691
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffff000000000000000000000
+Ciphertext: 191aa0f2c8570144f38657ea4085ebe5
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffff800000000000000000000
+Ciphertext: 85062c2c909f15d9269b6c18ce99c4f0
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffc00000000000000000000
+Ciphertext: 678034dc9e41b5a560ed239eeab1bc78
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffe00000000000000000000
+Ciphertext: c2f93a4ce5ab6d5d56f1b93cf19911c1
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffff00000000000000000000
+Ciphertext: 1c3112bcb0c1dcc749d799743691bf82
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffff80000000000000000000
+Ciphertext: 00c55bd75c7f9c881989d3ec1911c0d4
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffc0000000000000000000
+Ciphertext: ea2e6b5ef182b7dff3629abd6a12045f
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffe0000000000000000000
+Ciphertext: 22322327e01780b17397f24087f8cc6f
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffff0000000000000000000
+Ciphertext: c9cacb5cd11692c373b2411768149ee7
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffff8000000000000000000
+Ciphertext: a18e3dbbca577860dab6b80da3139256
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffc000000000000000000
+Ciphertext: 79b61c37bf328ecca8d743265a3d425c
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffe000000000000000000
+Ciphertext: d2d99c6bcc1f06fda8e27e8ae3f1ccc7
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffff000000000000000000
+Ciphertext: 1bfd4b91c701fd6b61b7f997829d663b
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffff800000000000000000
+Ciphertext: 11005d52f25f16bdc9545a876a63490a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffc00000000000000000
+Ciphertext: 3a4d354f02bb5a5e47d39666867f246a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffe00000000000000000
+Ciphertext: d451b8d6e1e1a0ebb155fbbf6e7b7dc3
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffff00000000000000000
+Ciphertext: 6898d4f42fa7ba6a10ac05e87b9f2080
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffff80000000000000000
+Ciphertext: b611295e739ca7d9b50f8e4c0e754a3f
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffc0000000000000000
+Ciphertext: 7d33fc7d8abe3ca1936759f8f5deaf20
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffe0000000000000000
+Ciphertext: 3b5e0f566dc96c298f0c12637539b25c
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffff0000000000000000
+Ciphertext: f807c3e7985fe0f5a50e2cdb25c5109e
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffff8000000000000000
+Ciphertext: 41f992a856fb278b389a62f5d274d7e9
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffc000000000000000
+Ciphertext: 10d3ed7a6fe15ab4d91acbc7d0767ab1
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffe000000000000000
+Ciphertext: 21feecd45b2e675973ac33bf0c5424fc
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffff000000000000000
+Ciphertext: 1480cb3955ba62d09eea668f7c708817
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffff800000000000000
+Ciphertext: 66404033d6b72b609354d5496e7eb511
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffc00000000000000
+Ciphertext: 1c317a220a7d700da2b1e075b00266e1
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffe00000000000000
+Ciphertext: ab3b89542233f1271bf8fd0c0f403545
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffff00000000000000
+Ciphertext: d93eae966fac46dca927d6b114fa3f9e
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffff80000000000000
+Ciphertext: 1bdec521316503d9d5ee65df3ea94ddf
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffc0000000000000
+Ciphertext: eef456431dea8b4acf83bdae3717f75f
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffe0000000000000
+Ciphertext: 06f2519a2fafaa596bfef5cfa15c21b9
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffff0000000000000
+Ciphertext: 251a7eac7e2fe809e4aa8d0d7012531a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffff8000000000000
+Ciphertext: 3bffc16e4c49b268a20f8d96a60b4058
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffc000000000000
+Ciphertext: e886f9281999c5bb3b3e8862e2f7c988
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffe000000000000
+Ciphertext: 563bf90d61beef39f48dd625fcef1361
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffff000000000000
+Ciphertext: 4d37c850644563c69fd0acd9a049325b
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffff800000000000
+Ciphertext: b87c921b91829ef3b13ca541ee1130a6
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffc00000000000
+Ciphertext: 2e65eb6b6ea383e109accce8326b0393
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffe00000000000
+Ciphertext: 9ca547f7439edc3e255c0f4d49aa8990
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffff00000000000
+Ciphertext: a5e652614c9300f37816b1f9fd0c87f9
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffff80000000000
+Ciphertext: 14954f0b4697776f44494fe458d814ed
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffc0000000000
+Ciphertext: 7c8d9ab6c2761723fe42f8bb506cbcf7
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffe0000000000
+Ciphertext: db7e1932679fdd99742aab04aa0d5a80
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffff0000000000
+Ciphertext: 4c6a1c83e568cd10f27c2d73ded19c28
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffff8000000000
+Ciphertext: 90ecbe6177e674c98de412413f7ac915
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffc000000000
+Ciphertext: 90684a2ac55fe1ec2b8ebd5622520b73
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffe000000000
+Ciphertext: 7472f9a7988607ca79707795991035e6
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffff000000000
+Ciphertext: 56aff089878bf3352f8df172a3ae47d8
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffff800000000
+Ciphertext: 65c0526cbe40161b8019a2a3171abd23
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffc00000000
+Ciphertext: 377be0be33b4e3e310b4aabda173f84f
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffe00000000
+Ciphertext: 9402e9aa6f69de6504da8d20c4fcaa2f
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffff00000000
+Ciphertext: 123c1f4af313ad8c2ce648b2e71fb6e1
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffff80000000
+Ciphertext: 1ffc626d30203dcdb0019fb80f726cf4
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffc0000000
+Ciphertext: 76da1fbe3a50728c50fd2e621b5ad885
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffe0000000
+Ciphertext: 082eb8be35f442fb52668e16a591d1d6
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffff0000000
+Ciphertext: e656f9ecf5fe27ec3e4a73d00c282fb3
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffff8000000
+Ciphertext: 2ca8209d63274cd9a29bb74bcd77683a
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffc000000
+Ciphertext: 79bf5dce14bb7dd73a8e3611de7ce026
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffe000000
+Ciphertext: 3c849939a5d29399f344c4a0eca8a576
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffff000000
+Ciphertext: ed3c0a94d59bece98835da7aa4f07ca2
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffff800000
+Ciphertext: 63919ed4ce10196438b6ad09d99cd795
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffc00000
+Ciphertext: 7678f3a833f19fea95f3c6029e2bc610
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffe00000
+Ciphertext: 3aa426831067d36b92be7c5f81c13c56
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffff00000
+Ciphertext: 9272e2d2cdd11050998c845077a30ea0
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffff80000
+Ciphertext: 088c4b53f5ec0ff814c19adae7f6246c
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffc0000
+Ciphertext: 4010a5e401fdf0a0354ddbcc0d012b17
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffe0000
+Ciphertext: a87a385736c0a6189bd6589bd8445a93
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffff0000
+Ciphertext: 545f2b83d9616dccf60fa9830e9cd287
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffff8000
+Ciphertext: 4b706f7f92406352394037a6d4f4688d
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffc000
+Ciphertext: b7972b3941c44b90afa7b264bfba7387
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffe000
+Ciphertext: 6f45732cf10881546f0fd23896d2bb60
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffff000
+Ciphertext: 2e3579ca15af27f64b3c955a5bfc30ba
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffff800
+Ciphertext: 34a2c5a91ae2aec99b7d1b5fa6780447
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffc00
+Ciphertext: a4d6616bd04f87335b0e53351227a9ee
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffe00
+Ciphertext: 7f692b03945867d16179a8cefc83ea3f
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffff00
+Ciphertext: 3bd141ee84a0e6414a26e7a4f281f8a2
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffff80
+Ciphertext: d1788f572d98b2b16ec5d5f3922b99bc
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffffc0
+Ciphertext: 0833ff6f61d98a57b288e8c3586b85a6
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffffe0
+Ciphertext: 8568261797de176bf0b43becc6285afb
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffff0
+Ciphertext: f9b0fda0c4a898f5b9e6f661c4ce4d07
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffff8
+Ciphertext: 8ade895913685c67c5269f8aae42983e
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffffc
+Ciphertext: 39bde67d5c8ed8a8b1c37eb8fa9f5ac0
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffffe
+Ciphertext: 5c005e72c1418c44f569f2ea33ba54f3
+
+Cipher: AES-128-CBC
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffffff
+Ciphertext: 3f5b8cc9ea855a0afa7347d23e8d664e
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3ad78e726c1ec02b7ebfe92b23d9ec34
+Plaintext: 80000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: aae5939c8efdf2f04e60b9fe7117b2c2
+Plaintext: c0000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f031d4d74f5dcbf39daaf8ca3af6e527
+Plaintext: e0000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 96d9fd5cc4f07441727df0f33e401a36
+Plaintext: f0000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 30ccdb044646d7e1f3ccea3dca08b8c0
+Plaintext: f8000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 16ae4ce5042a67ee8e177b7c587ecc82
+Plaintext: fc000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b6da0bb11a23855d9c5cb1b4c6412e0a
+Plaintext: fe000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: db4f1aa530967d6732ce4715eb0ee24b
+Plaintext: ff000000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a81738252621dd180a34f3455b4baa2f
+Plaintext: ff800000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 77e2b508db7fd89234caf7939ee5621a
+Plaintext: ffc00000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b8499c251f8442ee13f0933b688fcd19
+Plaintext: ffe00000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 965135f8a81f25c9d630b17502f68e53
+Plaintext: fff00000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8b87145a01ad1c6cede995ea3670454f
+Plaintext: fff80000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8eae3b10a0c8ca6d1d3b0fa61e56b0b2
+Plaintext: fffc0000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 64b4d629810fda6bafdf08f3b0d8d2c5
+Plaintext: fffe0000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d7e5dbd3324595f8fdc7d7c571da6c2a
+Plaintext: ffff0000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f3f72375264e167fca9de2c1527d9606
+Plaintext: ffff8000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8ee79dd4f401ff9b7ea945d86666c13b
+Plaintext: ffffc000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dd35cea2799940b40db3f819cb94c08b
+Plaintext: ffffe000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6941cb6b3e08c2b7afa581ebdd607b87
+Plaintext: fffff000000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2c20f439f6bb097b29b8bd6d99aad799
+Plaintext: fffff800000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 625d01f058e565f77ae86378bd2c49b3
+Plaintext: fffffc00000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c0b5fd98190ef45fbb4301438d095950
+Plaintext: fffffe00000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 13001ff5d99806efd25da34f56be854b
+Plaintext: ffffff00000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3b594c60f5c8277a5113677f94208d82
+Plaintext: ffffff80000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e9c0fc1818e4aa46bd2e39d638f89e05
+Plaintext: ffffffc0000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f8023ee9c3fdc45a019b4e985c7e1a54
+Plaintext: ffffffe0000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 35f40182ab4662f3023baec1ee796b57
+Plaintext: fffffff0000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3aebbad7303649b4194a6945c6cc3694
+Plaintext: fffffff8000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a2124bea53ec2834279bed7f7eb0f938
+Plaintext: fffffffc000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b9fb4399fa4facc7309e14ec98360b0a
+Plaintext: fffffffe000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c26277437420c5d634f715aea81a9132
+Plaintext: ffffffff000000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 171a0e1b2dd424f0e089af2c4c10f32f
+Plaintext: ffffffff800000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7cadbe402d1b208fe735edce00aee7ce
+Plaintext: ffffffffc00000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 43b02ff929a1485af6f5c6d6558baa0f
+Plaintext: ffffffffe00000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 092faacc9bf43508bf8fa8613ca75dea
+Plaintext: fffffffff00000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cb2bf8280f3f9742c7ed513fe802629c
+Plaintext: fffffffff80000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 215a41ee442fa992a6e323986ded3f68
+Plaintext: fffffffffc0000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f21e99cf4f0f77cea836e11a2fe75fb1
+Plaintext: fffffffffe0000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 95e3a0ca9079e646331df8b4e70d2cd6
+Plaintext: ffffffffff0000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4afe7f120ce7613f74fc12a01a828073
+Plaintext: ffffffffff8000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 827f000e75e2c8b9d479beed913fe678
+Plaintext: ffffffffffc000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 35830c8e7aaefe2d30310ef381cbf691
+Plaintext: ffffffffffe000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 191aa0f2c8570144f38657ea4085ebe5
+Plaintext: fffffffffff000000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 85062c2c909f15d9269b6c18ce99c4f0
+Plaintext: fffffffffff800000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 678034dc9e41b5a560ed239eeab1bc78
+Plaintext: fffffffffffc00000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c2f93a4ce5ab6d5d56f1b93cf19911c1
+Plaintext: fffffffffffe00000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1c3112bcb0c1dcc749d799743691bf82
+Plaintext: ffffffffffff00000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 00c55bd75c7f9c881989d3ec1911c0d4
+Plaintext: ffffffffffff80000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ea2e6b5ef182b7dff3629abd6a12045f
+Plaintext: ffffffffffffc0000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 22322327e01780b17397f24087f8cc6f
+Plaintext: ffffffffffffe0000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c9cacb5cd11692c373b2411768149ee7
+Plaintext: fffffffffffff0000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a18e3dbbca577860dab6b80da3139256
+Plaintext: fffffffffffff8000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 79b61c37bf328ecca8d743265a3d425c
+Plaintext: fffffffffffffc000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d2d99c6bcc1f06fda8e27e8ae3f1ccc7
+Plaintext: fffffffffffffe000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1bfd4b91c701fd6b61b7f997829d663b
+Plaintext: ffffffffffffff000000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 11005d52f25f16bdc9545a876a63490a
+Plaintext: ffffffffffffff800000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3a4d354f02bb5a5e47d39666867f246a
+Plaintext: ffffffffffffffc00000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d451b8d6e1e1a0ebb155fbbf6e7b7dc3
+Plaintext: ffffffffffffffe00000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6898d4f42fa7ba6a10ac05e87b9f2080
+Plaintext: fffffffffffffff00000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b611295e739ca7d9b50f8e4c0e754a3f
+Plaintext: fffffffffffffff80000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7d33fc7d8abe3ca1936759f8f5deaf20
+Plaintext: fffffffffffffffc0000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3b5e0f566dc96c298f0c12637539b25c
+Plaintext: fffffffffffffffe0000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f807c3e7985fe0f5a50e2cdb25c5109e
+Plaintext: ffffffffffffffff0000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 41f992a856fb278b389a62f5d274d7e9
+Plaintext: ffffffffffffffff8000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 10d3ed7a6fe15ab4d91acbc7d0767ab1
+Plaintext: ffffffffffffffffc000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 21feecd45b2e675973ac33bf0c5424fc
+Plaintext: ffffffffffffffffe000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1480cb3955ba62d09eea668f7c708817
+Plaintext: fffffffffffffffff000000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 66404033d6b72b609354d5496e7eb511
+Plaintext: fffffffffffffffff800000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1c317a220a7d700da2b1e075b00266e1
+Plaintext: fffffffffffffffffc00000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ab3b89542233f1271bf8fd0c0f403545
+Plaintext: fffffffffffffffffe00000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d93eae966fac46dca927d6b114fa3f9e
+Plaintext: ffffffffffffffffff00000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1bdec521316503d9d5ee65df3ea94ddf
+Plaintext: ffffffffffffffffff80000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: eef456431dea8b4acf83bdae3717f75f
+Plaintext: ffffffffffffffffffc0000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 06f2519a2fafaa596bfef5cfa15c21b9
+Plaintext: ffffffffffffffffffe0000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 251a7eac7e2fe809e4aa8d0d7012531a
+Plaintext: fffffffffffffffffff0000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3bffc16e4c49b268a20f8d96a60b4058
+Plaintext: fffffffffffffffffff8000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e886f9281999c5bb3b3e8862e2f7c988
+Plaintext: fffffffffffffffffffc000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 563bf90d61beef39f48dd625fcef1361
+Plaintext: fffffffffffffffffffe000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4d37c850644563c69fd0acd9a049325b
+Plaintext: ffffffffffffffffffff000000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b87c921b91829ef3b13ca541ee1130a6
+Plaintext: ffffffffffffffffffff800000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2e65eb6b6ea383e109accce8326b0393
+Plaintext: ffffffffffffffffffffc00000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9ca547f7439edc3e255c0f4d49aa8990
+Plaintext: ffffffffffffffffffffe00000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a5e652614c9300f37816b1f9fd0c87f9
+Plaintext: fffffffffffffffffffff00000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 14954f0b4697776f44494fe458d814ed
+Plaintext: fffffffffffffffffffff80000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7c8d9ab6c2761723fe42f8bb506cbcf7
+Plaintext: fffffffffffffffffffffc0000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: db7e1932679fdd99742aab04aa0d5a80
+Plaintext: fffffffffffffffffffffe0000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4c6a1c83e568cd10f27c2d73ded19c28
+Plaintext: ffffffffffffffffffffff0000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 90ecbe6177e674c98de412413f7ac915
+Plaintext: ffffffffffffffffffffff8000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 90684a2ac55fe1ec2b8ebd5622520b73
+Plaintext: ffffffffffffffffffffffc000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7472f9a7988607ca79707795991035e6
+Plaintext: ffffffffffffffffffffffe000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 56aff089878bf3352f8df172a3ae47d8
+Plaintext: fffffffffffffffffffffff000000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 65c0526cbe40161b8019a2a3171abd23
+Plaintext: fffffffffffffffffffffff800000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 377be0be33b4e3e310b4aabda173f84f
+Plaintext: fffffffffffffffffffffffc00000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9402e9aa6f69de6504da8d20c4fcaa2f
+Plaintext: fffffffffffffffffffffffe00000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 123c1f4af313ad8c2ce648b2e71fb6e1
+Plaintext: ffffffffffffffffffffffff00000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1ffc626d30203dcdb0019fb80f726cf4
+Plaintext: ffffffffffffffffffffffff80000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 76da1fbe3a50728c50fd2e621b5ad885
+Plaintext: ffffffffffffffffffffffffc0000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 082eb8be35f442fb52668e16a591d1d6
+Plaintext: ffffffffffffffffffffffffe0000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e656f9ecf5fe27ec3e4a73d00c282fb3
+Plaintext: fffffffffffffffffffffffff0000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2ca8209d63274cd9a29bb74bcd77683a
+Plaintext: fffffffffffffffffffffffff8000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 79bf5dce14bb7dd73a8e3611de7ce026
+Plaintext: fffffffffffffffffffffffffc000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3c849939a5d29399f344c4a0eca8a576
+Plaintext: fffffffffffffffffffffffffe000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ed3c0a94d59bece98835da7aa4f07ca2
+Plaintext: ffffffffffffffffffffffffff000000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 63919ed4ce10196438b6ad09d99cd795
+Plaintext: ffffffffffffffffffffffffff800000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7678f3a833f19fea95f3c6029e2bc610
+Plaintext: ffffffffffffffffffffffffffc00000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3aa426831067d36b92be7c5f81c13c56
+Plaintext: ffffffffffffffffffffffffffe00000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9272e2d2cdd11050998c845077a30ea0
+Plaintext: fffffffffffffffffffffffffff00000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 088c4b53f5ec0ff814c19adae7f6246c
+Plaintext: fffffffffffffffffffffffffff80000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4010a5e401fdf0a0354ddbcc0d012b17
+Plaintext: fffffffffffffffffffffffffffc0000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a87a385736c0a6189bd6589bd8445a93
+Plaintext: fffffffffffffffffffffffffffe0000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 545f2b83d9616dccf60fa9830e9cd287
+Plaintext: ffffffffffffffffffffffffffff0000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4b706f7f92406352394037a6d4f4688d
+Plaintext: ffffffffffffffffffffffffffff8000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b7972b3941c44b90afa7b264bfba7387
+Plaintext: ffffffffffffffffffffffffffffc000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6f45732cf10881546f0fd23896d2bb60
+Plaintext: ffffffffffffffffffffffffffffe000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2e3579ca15af27f64b3c955a5bfc30ba
+Plaintext: fffffffffffffffffffffffffffff000
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 34a2c5a91ae2aec99b7d1b5fa6780447
+Plaintext: fffffffffffffffffffffffffffff800
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a4d6616bd04f87335b0e53351227a9ee
+Plaintext: fffffffffffffffffffffffffffffc00
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7f692b03945867d16179a8cefc83ea3f
+Plaintext: fffffffffffffffffffffffffffffe00
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3bd141ee84a0e6414a26e7a4f281f8a2
+Plaintext: ffffffffffffffffffffffffffffff00
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d1788f572d98b2b16ec5d5f3922b99bc
+Plaintext: ffffffffffffffffffffffffffffff80
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0833ff6f61d98a57b288e8c3586b85a6
+Plaintext: ffffffffffffffffffffffffffffffc0
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8568261797de176bf0b43becc6285afb
+Plaintext: ffffffffffffffffffffffffffffffe0
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f9b0fda0c4a898f5b9e6f661c4ce4d07
+Plaintext: fffffffffffffffffffffffffffffff0
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8ade895913685c67c5269f8aae42983e
+Plaintext: fffffffffffffffffffffffffffffff8
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 39bde67d5c8ed8a8b1c37eb8fa9f5ac0
+Plaintext: fffffffffffffffffffffffffffffffc
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5c005e72c1418c44f569f2ea33ba54f3
+Plaintext: fffffffffffffffffffffffffffffffe
+
+Cipher: AES-128-CBC
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3f5b8cc9ea855a0afa7347d23e8d664e
+Plaintext: ffffffffffffffffffffffffffffffff
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_gf_sbox.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_gf_sbox.txt
new file mode 100644
index 0000000..578175b
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_gf_sbox.txt
@@ -0,0 +1,100 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCGFSbox128.rsp -extra-labels=Cipher=AES-128-CTR -swap-iv-plaintext"
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: f34481ec3cc627bacd5dc3fb08f273e6
+Ciphertext: 0336763e966d92595a567cc9ce537f5e
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 9798c4640bad75c7c3227db910174e72
+Ciphertext: a9a1631bf4996954ebc093957b234589
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 96ab5c2ff612d9dfaae8c31f30c42168
+Ciphertext: ff4f8391a6a40ca5b25d23bedd44a597
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 6a118a874519e64e9963798a503f1d35
+Ciphertext: dc43be40be0e53712f7e2bf5ca707209
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: cb9fceec81286ca3e989bd979b0cb284
+Ciphertext: 92beedab1895a94faa69b632e5cc47ce
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: b26aeb1874e47ca8358ff22378f09144
+Ciphertext: 459264f4798f6a78bacb89c15ed3d601
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 58c8e00b2631686d54eab84b91f0aca1
+Ciphertext: 08a4e2efec8a8e3312ca7460b9040bbf
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0336763e966d92595a567cc9ce537f5e
+IV: f34481ec3cc627bacd5dc3fb08f273e6
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a9a1631bf4996954ebc093957b234589
+IV: 9798c4640bad75c7c3227db910174e72
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ff4f8391a6a40ca5b25d23bedd44a597
+IV: 96ab5c2ff612d9dfaae8c31f30c42168
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dc43be40be0e53712f7e2bf5ca707209
+IV: 6a118a874519e64e9963798a503f1d35
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 92beedab1895a94faa69b632e5cc47ce
+IV: cb9fceec81286ca3e989bd979b0cb284
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 459264f4798f6a78bacb89c15ed3d601
+IV: b26aeb1874e47ca8358ff22378f09144
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 08a4e2efec8a8e3312ca7460b9040bbf
+IV: 58c8e00b2631686d54eab84b91f0aca1
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_key_sbox.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_key_sbox.txt
new file mode 100644
index 0000000..aa2a49e
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_key_sbox.txt
@@ -0,0 +1,296 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCKeySbox128.rsp -extra-labels=Cipher=AES-128-CTR"
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 10a58869d74be5a374cf867cfb473859
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6d251e6944b051e04eaa6fb4dbf78465
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: caea65cdbb75e9169ecd22ebe6e54675
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6e29201190152df4ee058139def610bb
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: a2e2fa9baf7d20822ca9f0542f764a41
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c3b44b95d9d2f25670eee9a0de099fa3
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: b6364ac4e1de1e285eaf144a2415f7a0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5d9b05578fc944b3cf1ccf0e746cd581
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 64cf9c7abc50b888af65f49d521944b2
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f7efc89d5dba578104016ce5ad659c05
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 47d6742eefcc0465dc96355e851b64d9
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0306194f666d183624aa230a8b264ae7
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 3eb39790678c56bee34bbcdeccf6cdb5
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 858075d536d79ccee571f7d7204b1f67
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 64110a924f0743d500ccadae72c13427
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 35870c6a57e9e92314bcb8087cde72ce
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 18d8126516f8a12ab1a36d9f04d68e51
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6c68e9be5ec41e22c825b7c7affb4363
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: f530357968578480b398a3c251cd1093
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f5df39990fc688f1b07224cc03e86cea
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: da84367f325d42d601b4326964802e8e
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: bba071bcb470f8f6586e5d3add18bc66
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: e37b1c6aa2846f6fdb413f238b089f23
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 43c9f7e62f5d288bb27aa40ef8fe1ea8
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 6c002b682483e0cabcc731c253be5674
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3580d19cff44f1014a7c966a69059de5
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 143ae8ed6555aba96110ab58893a8ae1
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 806da864dd29d48deafbe764f8202aef
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: b69418a85332240dc82492353956ae0c
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a303d940ded8f0baff6f75414cac5243
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 71b5c08a1993e1362e4d0ce9b22b78d5
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c2dabd117f8a3ecabfbb11d12194d9d0
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: e234cdca2606b81f29408d5f6da21206
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fff60a4740086b3b9c56195b98d91a7b
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 13237c49074a3da078dc1d828bb78c6f
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8146a08e2357f0caa30ca8c94d1a0544
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 3071a2a48fe6cbd04f1a129098e308f8
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4b98e06d356deb07ebb824e5713f7be3
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 90f42ec0f68385f2ffc5dfc03a654dce
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7a20a53d460fc9ce0423a7a0764c6cf2
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: febd9a24d8b65c1c787d50a4ed3619a9
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f4a70d8af877f9b02b4c40df57d45b17
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 10a58869d74be5a374cf867cfb473859
+IV: 00000000000000000000000000000000
+Ciphertext: 6d251e6944b051e04eaa6fb4dbf78465
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: caea65cdbb75e9169ecd22ebe6e54675
+IV: 00000000000000000000000000000000
+Ciphertext: 6e29201190152df4ee058139def610bb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: a2e2fa9baf7d20822ca9f0542f764a41
+IV: 00000000000000000000000000000000
+Ciphertext: c3b44b95d9d2f25670eee9a0de099fa3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: b6364ac4e1de1e285eaf144a2415f7a0
+IV: 00000000000000000000000000000000
+Ciphertext: 5d9b05578fc944b3cf1ccf0e746cd581
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 64cf9c7abc50b888af65f49d521944b2
+IV: 00000000000000000000000000000000
+Ciphertext: f7efc89d5dba578104016ce5ad659c05
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 47d6742eefcc0465dc96355e851b64d9
+IV: 00000000000000000000000000000000
+Ciphertext: 0306194f666d183624aa230a8b264ae7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 3eb39790678c56bee34bbcdeccf6cdb5
+IV: 00000000000000000000000000000000
+Ciphertext: 858075d536d79ccee571f7d7204b1f67
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 64110a924f0743d500ccadae72c13427
+IV: 00000000000000000000000000000000
+Ciphertext: 35870c6a57e9e92314bcb8087cde72ce
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 18d8126516f8a12ab1a36d9f04d68e51
+IV: 00000000000000000000000000000000
+Ciphertext: 6c68e9be5ec41e22c825b7c7affb4363
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: f530357968578480b398a3c251cd1093
+IV: 00000000000000000000000000000000
+Ciphertext: f5df39990fc688f1b07224cc03e86cea
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: da84367f325d42d601b4326964802e8e
+IV: 00000000000000000000000000000000
+Ciphertext: bba071bcb470f8f6586e5d3add18bc66
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: e37b1c6aa2846f6fdb413f238b089f23
+IV: 00000000000000000000000000000000
+Ciphertext: 43c9f7e62f5d288bb27aa40ef8fe1ea8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 6c002b682483e0cabcc731c253be5674
+IV: 00000000000000000000000000000000
+Ciphertext: 3580d19cff44f1014a7c966a69059de5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 143ae8ed6555aba96110ab58893a8ae1
+IV: 00000000000000000000000000000000
+Ciphertext: 806da864dd29d48deafbe764f8202aef
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: b69418a85332240dc82492353956ae0c
+IV: 00000000000000000000000000000000
+Ciphertext: a303d940ded8f0baff6f75414cac5243
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 71b5c08a1993e1362e4d0ce9b22b78d5
+IV: 00000000000000000000000000000000
+Ciphertext: c2dabd117f8a3ecabfbb11d12194d9d0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: e234cdca2606b81f29408d5f6da21206
+IV: 00000000000000000000000000000000
+Ciphertext: fff60a4740086b3b9c56195b98d91a7b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 13237c49074a3da078dc1d828bb78c6f
+IV: 00000000000000000000000000000000
+Ciphertext: 8146a08e2357f0caa30ca8c94d1a0544
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 3071a2a48fe6cbd04f1a129098e308f8
+IV: 00000000000000000000000000000000
+Ciphertext: 4b98e06d356deb07ebb824e5713f7be3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 90f42ec0f68385f2ffc5dfc03a654dce
+IV: 00000000000000000000000000000000
+Ciphertext: 7a20a53d460fc9ce0423a7a0764c6cf2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: febd9a24d8b65c1c787d50a4ed3619a9
+IV: 00000000000000000000000000000000
+Ciphertext: f4a70d8af877f9b02b4c40df57d45b17
+Plaintext: 00000000000000000000000000000000
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_var_key.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_var_key.txt
new file mode 100644
index 0000000..f679187
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_var_key.txt
@@ -0,0 +1,1794 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCVarKey128.rsp -extra-labels=Cipher=AES-128-CTR"
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 80000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0edd33d3c621e546455bd8ba1418bec8
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: c0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4bc3f883450c113c64ca42e1112a9e87
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: e0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 72a1da770f5d7ac4c9ef94d822affd97
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: f0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 970014d634e2b7650777e8e84d03ccd8
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: f8000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f17e79aed0db7e279e955b5f493875a7
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fc000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9ed5a75136a940d0963da379db4af26a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fe000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c4295f83465c7755e8fa364bac6a7ea5
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ff000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b1d758256b28fd850ad4944208cf1155
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ff800000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 42ffb34c743de4d88ca38011c990890b
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffc00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9958f0ecea8b2172c0c1995f9182c0f3
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffe00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 956d7798fac20f82a8823f984d06f7f5
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fff00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a01bf44f2d16be928ca44aaf7b9b106b
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fff80000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b5f1a33e50d40d103764c76bd4c6b6f8
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffc0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2637050c9fc0d4817e2d69de878aee8d
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffe0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 113ecbe4a453269a0dd26069467fb5b5
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffff0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 97d0754fe68f11b9e375d070a608c884
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffff8000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c6a0b3e998d05068a5399778405200b4
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffc000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: df556a33438db87bc41b1752c55e5e49
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffe000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 90fb128d3a1af6e548521bb962bf1f05
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffff000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 26298e9c1db517c215fadfb7d2a8d691
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffff800000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a6cb761d61f8292d0df393a279ad0380
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffc00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 12acd89b13cd5f8726e34d44fd486108
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffe00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 95b1703fc57ba09fe0c3580febdd7ed4
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffff00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: de11722d893e9f9121c381becc1da59a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffff80000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6d114ccb27bf391012e8974c546d9bf2
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffc0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5ce37e17eb4646ecfac29b9cc38d9340
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffe0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 18c1b6e2157122056d0243d8a165cddb
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffff0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 99693e6a59d1366c74d823562d7e1431
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffff8000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6c7c64dc84a8bba758ed17eb025a57e3
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffc000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e17bc79f30eaab2fac2cbbe3458d687a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffe000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1114bc2028009b923f0b01915ce5e7c4
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffff000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9c28524a16a1e1c1452971caa8d13476
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffff800000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ed62e16363638360fdd6ad62112794f0
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffc00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5a8688f0b2a2c16224c161658ffd4044
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffe00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 23f710842b9bb9c32f26648c786807ca
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffff00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 44a98bf11e163f632c47ec6a49683a89
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffff80000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0f18aff94274696d9b61848bd50ac5e5
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffc0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 82408571c3e2424540207f833b6dda69
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffe0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 303ff996947f0c7d1f43c8f3027b9b75
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffff0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7df4daf4ad29a3615a9b6ece5c99518a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffff8000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c72954a48d0774db0b4971c526260415
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffc000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1df9b76112dc6531e07d2cfda04411f0
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffe000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8e4d8e699119e1fc87545a647fb1d34f
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffff000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e6c4807ae11f36f091c57d9fb68548d1
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffff800000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8ebf73aad49c82007f77a5c1ccec6ab4
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffc00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4fb288cc2040049001d2c7585ad123fc
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffe00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 04497110efb9dceb13e2b13fb4465564
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffff00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 75550e6cb5a88e49634c9ab69eda0430
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffff80000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b6768473ce9843ea66a81405dd50b345
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffc0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cb2f430383f9084e03a653571e065de6
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffe0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ff4e66c07bae3e79fb7d210847a3b0ba
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffff0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7b90785125505fad59b13c186dd66ce3
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffff8000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8b527a6aebdaec9eaef8eda2cb7783e5
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffc000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 43fdaf53ebbc9880c228617d6a9b548b
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffe000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 53786104b9744b98f052c46f1c850d0b
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffff000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b5ab3013dd1e61df06cbaf34ca2aee78
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffff800000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7470469be9723030fdcc73a8cd4fbb10
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffc00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a35a63f5343ebe9ef8167bcb48ad122e
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffe00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fd8687f0757a210e9fdf181204c30863
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffff00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7a181e84bd5457d26a88fbae96018fb0
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffff80000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 653317b9362b6f9b9e1a580e68d494b5
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffc0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 995c9dc0b689f03c45867b5faa5c18d1
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffe0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 77a4d96d56dda398b9aabecfc75729fd
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffff0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 84be19e053635f09f2665e7bae85b42d
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffff8000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 32cd652842926aea4aa6137bb2be2b5e
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffc000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 493d4a4f38ebb337d10aa84e9171a554
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffe000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d9bff7ff454b0ec5a4a2a69566e2cb84
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffff000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3535d565ace3f31eb249ba2cc6765d7a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffff800000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f60e91fc3269eecf3231c6e9945697c6
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffc00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ab69cfadf51f8e604d9cc37182f6635a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffe00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7866373f24a0b6ed56e0d96fcdafb877
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffff00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1ea448c2aac954f5d812e9d78494446a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffff80000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: acc5599dd8ac02239a0fef4a36dd1668
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffc0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d8764468bb103828cf7e1473ce895073
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffe0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1b0d02893683b9f180458e4aa6b73982
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffff0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 96d9b017d302df410a937dcdb8bb6e43
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffff8000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ef1623cc44313cff440b1594a7e21cc6
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffc000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 284ca2fa35807b8b0ae4d19e11d7dbd7
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffe000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f2e976875755f9401d54f36e2a23a594
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffff000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ec198a18e10e532403b7e20887c8dd80
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffff800000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 545d50ebd919e4a6949d96ad47e46a80
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffc00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dbdfb527060e0a71009c7bb0c68f1d44
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffe00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9cfa1322ea33da2173a024f2ff0d896d
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffff00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8785b1a75b0f3bd958dcd0e29318c521
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffff80000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 38f67b9e98e4a97b6df030a9fcdd0104
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffc0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 192afffb2c880e82b05926d0fc6c448b
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffe0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6a7980ce7b105cf530952d74daaf798c
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffff0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ea3695e1351b9d6858bd958cf513ef6c
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffff8000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6da0490ba0ba0343b935681d2cce5ba1
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffc000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f0ea23af08534011c60009ab29ada2f1
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffe000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ff13806cf19cc38721554d7c0fcdcd4b
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffff000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6838af1f4f69bae9d85dd188dcdf0688
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffff800000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 36cf44c92d550bfb1ed28ef583ddf5d7
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffc00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d06e3195b5376f109d5c4ec6c5d62ced
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffe00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c440de014d3d610707279b13242a5c36
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffff00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f0c5c6ffa5e0bd3a94c88f6b6f7c16b9
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffff80000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3e40c3901cd7effc22bffc35dee0b4d9
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffc0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b63305c72bedfab97382c406d0c49bc6
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffe0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 36bbaab22a6bd4925a99a2b408d2dbae
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffff0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 307c5b8fcd0533ab98bc51e27a6ce461
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffff8000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 829c04ff4c07513c0b3ef05c03e337b5
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffc000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f17af0e895dda5eb98efc68066e84c54
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffe000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 277167f3812afff1ffacb4a934379fc3
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffff000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2cb1dc3a9c72972e425ae2ef3eb597cd
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffff800000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 36aeaa3a213e968d4b5b679d3a2c97fe
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffc00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9241daca4fdd034a82372db50e1a0f3f
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffe00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c14574d9cd00cf2b5a7f77e53cd57885
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffff00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 793de39236570aba83ab9b737cb521c9
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffff80000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 16591c0f27d60e29b85a96c33861a7ef
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffc0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 44fb5c4d4f5cb79be5c174a3b1c97348
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffe0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 674d2b61633d162be59dde04222f4740
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffff0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b4750ff263a65e1f9e924ccfd98f3e37
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffff8000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 62d0662d6eaeddedebae7f7ea3a4f6b6
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffc000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 70c46bb30692be657f7eaa93ebad9897
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffe000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 323994cfb9da285a5d9642e1759b224a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffff000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1dbf57877b7b17385c85d0b54851e371
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffff800
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dfa5c097cdc1532ac071d57b1d28d1bd
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffc00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3a0c53fa37311fc10bd2a9981f513174
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffe00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ba4f970c0a25c41814bdae2e506be3b4
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffff00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2dce3acb727cd13ccd76d425ea56e4f6
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffff80
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5160474d504b9b3eefb68d35f245f4b3
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffc0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 41a8a947766635dec37553d9a6c0cbb7
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffe0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 25d6cfe6881f2bf497dd14cd4ddf445b
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffff0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 41c78c135ed9e98c096640647265da1e
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffff8
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5a4d404d8917e353e92a21072c3b2305
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffc
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 02bc96846b3fdc71643f384cd3cc3eaf
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffe
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9ba4a9143f4e5d4048521c4f8877d88e
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffff
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a1f6258c877d5fcd8964484538bfc92c
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 80000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0edd33d3c621e546455bd8ba1418bec8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: c0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4bc3f883450c113c64ca42e1112a9e87
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: e0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 72a1da770f5d7ac4c9ef94d822affd97
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: f0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 970014d634e2b7650777e8e84d03ccd8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: f8000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f17e79aed0db7e279e955b5f493875a7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fc000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9ed5a75136a940d0963da379db4af26a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fe000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c4295f83465c7755e8fa364bac6a7ea5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ff000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b1d758256b28fd850ad4944208cf1155
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ff800000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 42ffb34c743de4d88ca38011c990890b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffc00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9958f0ecea8b2172c0c1995f9182c0f3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffe00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 956d7798fac20f82a8823f984d06f7f5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fff00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a01bf44f2d16be928ca44aaf7b9b106b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fff80000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b5f1a33e50d40d103764c76bd4c6b6f8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffc0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2637050c9fc0d4817e2d69de878aee8d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffe0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 113ecbe4a453269a0dd26069467fb5b5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffff0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 97d0754fe68f11b9e375d070a608c884
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffff8000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c6a0b3e998d05068a5399778405200b4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffc000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: df556a33438db87bc41b1752c55e5e49
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffe000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 90fb128d3a1af6e548521bb962bf1f05
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffff000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 26298e9c1db517c215fadfb7d2a8d691
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffff800000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a6cb761d61f8292d0df393a279ad0380
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffc00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 12acd89b13cd5f8726e34d44fd486108
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffe00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 95b1703fc57ba09fe0c3580febdd7ed4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffff00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: de11722d893e9f9121c381becc1da59a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffff80000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6d114ccb27bf391012e8974c546d9bf2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffc0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5ce37e17eb4646ecfac29b9cc38d9340
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffe0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 18c1b6e2157122056d0243d8a165cddb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffff0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 99693e6a59d1366c74d823562d7e1431
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffff8000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6c7c64dc84a8bba758ed17eb025a57e3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffc000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e17bc79f30eaab2fac2cbbe3458d687a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffe000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1114bc2028009b923f0b01915ce5e7c4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffff000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9c28524a16a1e1c1452971caa8d13476
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffff800000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ed62e16363638360fdd6ad62112794f0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffc00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5a8688f0b2a2c16224c161658ffd4044
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffe00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 23f710842b9bb9c32f26648c786807ca
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffff00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 44a98bf11e163f632c47ec6a49683a89
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffff80000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0f18aff94274696d9b61848bd50ac5e5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffc0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 82408571c3e2424540207f833b6dda69
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffe0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 303ff996947f0c7d1f43c8f3027b9b75
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffff0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7df4daf4ad29a3615a9b6ece5c99518a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffff8000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c72954a48d0774db0b4971c526260415
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffc000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1df9b76112dc6531e07d2cfda04411f0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffe000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8e4d8e699119e1fc87545a647fb1d34f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffff000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e6c4807ae11f36f091c57d9fb68548d1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffff800000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8ebf73aad49c82007f77a5c1ccec6ab4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffc00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4fb288cc2040049001d2c7585ad123fc
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffe00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 04497110efb9dceb13e2b13fb4465564
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffff00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 75550e6cb5a88e49634c9ab69eda0430
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffff80000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b6768473ce9843ea66a81405dd50b345
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffc0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cb2f430383f9084e03a653571e065de6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffe0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ff4e66c07bae3e79fb7d210847a3b0ba
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffff0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7b90785125505fad59b13c186dd66ce3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffff8000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8b527a6aebdaec9eaef8eda2cb7783e5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffc000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 43fdaf53ebbc9880c228617d6a9b548b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffe000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 53786104b9744b98f052c46f1c850d0b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffff000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b5ab3013dd1e61df06cbaf34ca2aee78
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffff800000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7470469be9723030fdcc73a8cd4fbb10
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffc00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a35a63f5343ebe9ef8167bcb48ad122e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffe00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fd8687f0757a210e9fdf181204c30863
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffff00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7a181e84bd5457d26a88fbae96018fb0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffff80000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 653317b9362b6f9b9e1a580e68d494b5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffc0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 995c9dc0b689f03c45867b5faa5c18d1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffe0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 77a4d96d56dda398b9aabecfc75729fd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffff0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 84be19e053635f09f2665e7bae85b42d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffff8000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 32cd652842926aea4aa6137bb2be2b5e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffc000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 493d4a4f38ebb337d10aa84e9171a554
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffe000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d9bff7ff454b0ec5a4a2a69566e2cb84
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffff000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3535d565ace3f31eb249ba2cc6765d7a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffff800000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f60e91fc3269eecf3231c6e9945697c6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffc00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ab69cfadf51f8e604d9cc37182f6635a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffe00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7866373f24a0b6ed56e0d96fcdafb877
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffff00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1ea448c2aac954f5d812e9d78494446a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffff80000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: acc5599dd8ac02239a0fef4a36dd1668
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffc0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d8764468bb103828cf7e1473ce895073
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffe0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1b0d02893683b9f180458e4aa6b73982
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffff0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 96d9b017d302df410a937dcdb8bb6e43
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffff8000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ef1623cc44313cff440b1594a7e21cc6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffc000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 284ca2fa35807b8b0ae4d19e11d7dbd7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffe000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f2e976875755f9401d54f36e2a23a594
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffff000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ec198a18e10e532403b7e20887c8dd80
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffff800000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 545d50ebd919e4a6949d96ad47e46a80
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffc00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dbdfb527060e0a71009c7bb0c68f1d44
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffe00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9cfa1322ea33da2173a024f2ff0d896d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffff00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8785b1a75b0f3bd958dcd0e29318c521
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffff80000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 38f67b9e98e4a97b6df030a9fcdd0104
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffc0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 192afffb2c880e82b05926d0fc6c448b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffe0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6a7980ce7b105cf530952d74daaf798c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffff0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ea3695e1351b9d6858bd958cf513ef6c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffff8000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6da0490ba0ba0343b935681d2cce5ba1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffc000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f0ea23af08534011c60009ab29ada2f1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffe000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ff13806cf19cc38721554d7c0fcdcd4b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffff000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6838af1f4f69bae9d85dd188dcdf0688
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffff800000000
+IV: 00000000000000000000000000000000
+Ciphertext: 36cf44c92d550bfb1ed28ef583ddf5d7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffc00000000
+IV: 00000000000000000000000000000000
+Ciphertext: d06e3195b5376f109d5c4ec6c5d62ced
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffe00000000
+IV: 00000000000000000000000000000000
+Ciphertext: c440de014d3d610707279b13242a5c36
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffff00000000
+IV: 00000000000000000000000000000000
+Ciphertext: f0c5c6ffa5e0bd3a94c88f6b6f7c16b9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffff80000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3e40c3901cd7effc22bffc35dee0b4d9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffc0000000
+IV: 00000000000000000000000000000000
+Ciphertext: b63305c72bedfab97382c406d0c49bc6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffe0000000
+IV: 00000000000000000000000000000000
+Ciphertext: 36bbaab22a6bd4925a99a2b408d2dbae
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffff0000000
+IV: 00000000000000000000000000000000
+Ciphertext: 307c5b8fcd0533ab98bc51e27a6ce461
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffff8000000
+IV: 00000000000000000000000000000000
+Ciphertext: 829c04ff4c07513c0b3ef05c03e337b5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffc000000
+IV: 00000000000000000000000000000000
+Ciphertext: f17af0e895dda5eb98efc68066e84c54
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffe000000
+IV: 00000000000000000000000000000000
+Ciphertext: 277167f3812afff1ffacb4a934379fc3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffff000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2cb1dc3a9c72972e425ae2ef3eb597cd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffff800000
+IV: 00000000000000000000000000000000
+Ciphertext: 36aeaa3a213e968d4b5b679d3a2c97fe
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffc00000
+IV: 00000000000000000000000000000000
+Ciphertext: 9241daca4fdd034a82372db50e1a0f3f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffe00000
+IV: 00000000000000000000000000000000
+Ciphertext: c14574d9cd00cf2b5a7f77e53cd57885
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffff00000
+IV: 00000000000000000000000000000000
+Ciphertext: 793de39236570aba83ab9b737cb521c9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffff80000
+IV: 00000000000000000000000000000000
+Ciphertext: 16591c0f27d60e29b85a96c33861a7ef
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffc0000
+IV: 00000000000000000000000000000000
+Ciphertext: 44fb5c4d4f5cb79be5c174a3b1c97348
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffe0000
+IV: 00000000000000000000000000000000
+Ciphertext: 674d2b61633d162be59dde04222f4740
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffff0000
+IV: 00000000000000000000000000000000
+Ciphertext: b4750ff263a65e1f9e924ccfd98f3e37
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffff8000
+IV: 00000000000000000000000000000000
+Ciphertext: 62d0662d6eaeddedebae7f7ea3a4f6b6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffc000
+IV: 00000000000000000000000000000000
+Ciphertext: 70c46bb30692be657f7eaa93ebad9897
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffe000
+IV: 00000000000000000000000000000000
+Ciphertext: 323994cfb9da285a5d9642e1759b224a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffff000
+IV: 00000000000000000000000000000000
+Ciphertext: 1dbf57877b7b17385c85d0b54851e371
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffff800
+IV: 00000000000000000000000000000000
+Ciphertext: dfa5c097cdc1532ac071d57b1d28d1bd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffc00
+IV: 00000000000000000000000000000000
+Ciphertext: 3a0c53fa37311fc10bd2a9981f513174
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffe00
+IV: 00000000000000000000000000000000
+Ciphertext: ba4f970c0a25c41814bdae2e506be3b4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffff00
+IV: 00000000000000000000000000000000
+Ciphertext: 2dce3acb727cd13ccd76d425ea56e4f6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffff80
+IV: 00000000000000000000000000000000
+Ciphertext: 5160474d504b9b3eefb68d35f245f4b3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffc0
+IV: 00000000000000000000000000000000
+Ciphertext: 41a8a947766635dec37553d9a6c0cbb7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffe0
+IV: 00000000000000000000000000000000
+Ciphertext: 25d6cfe6881f2bf497dd14cd4ddf445b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffff0
+IV: 00000000000000000000000000000000
+Ciphertext: 41c78c135ed9e98c096640647265da1e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffff8
+IV: 00000000000000000000000000000000
+Ciphertext: 5a4d404d8917e353e92a21072c3b2305
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffc
+IV: 00000000000000000000000000000000
+Ciphertext: 02bc96846b3fdc71643f384cd3cc3eaf
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffe
+IV: 00000000000000000000000000000000
+Ciphertext: 9ba4a9143f4e5d4048521c4f8877d88e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffff
+IV: 00000000000000000000000000000000
+Ciphertext: a1f6258c877d5fcd8964484538bfc92c
+Plaintext: 00000000000000000000000000000000
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_var_txt.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_var_txt.txt
new file mode 100644
index 0000000..e7e59df
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_var_txt.txt
@@ -0,0 +1,1794 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCVarTxt128.rsp -extra-labels=Cipher=AES-128-CTR -swap-iv-plaintext"
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 80000000000000000000000000000000
+Ciphertext: 3ad78e726c1ec02b7ebfe92b23d9ec34
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: c0000000000000000000000000000000
+Ciphertext: aae5939c8efdf2f04e60b9fe7117b2c2
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: e0000000000000000000000000000000
+Ciphertext: f031d4d74f5dcbf39daaf8ca3af6e527
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: f0000000000000000000000000000000
+Ciphertext: 96d9fd5cc4f07441727df0f33e401a36
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: f8000000000000000000000000000000
+Ciphertext: 30ccdb044646d7e1f3ccea3dca08b8c0
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fc000000000000000000000000000000
+Ciphertext: 16ae4ce5042a67ee8e177b7c587ecc82
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fe000000000000000000000000000000
+Ciphertext: b6da0bb11a23855d9c5cb1b4c6412e0a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ff000000000000000000000000000000
+Ciphertext: db4f1aa530967d6732ce4715eb0ee24b
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ff800000000000000000000000000000
+Ciphertext: a81738252621dd180a34f3455b4baa2f
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffc00000000000000000000000000000
+Ciphertext: 77e2b508db7fd89234caf7939ee5621a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffe00000000000000000000000000000
+Ciphertext: b8499c251f8442ee13f0933b688fcd19
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fff00000000000000000000000000000
+Ciphertext: 965135f8a81f25c9d630b17502f68e53
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fff80000000000000000000000000000
+Ciphertext: 8b87145a01ad1c6cede995ea3670454f
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffc0000000000000000000000000000
+Ciphertext: 8eae3b10a0c8ca6d1d3b0fa61e56b0b2
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffe0000000000000000000000000000
+Ciphertext: 64b4d629810fda6bafdf08f3b0d8d2c5
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffff0000000000000000000000000000
+Ciphertext: d7e5dbd3324595f8fdc7d7c571da6c2a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffff8000000000000000000000000000
+Ciphertext: f3f72375264e167fca9de2c1527d9606
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffc000000000000000000000000000
+Ciphertext: 8ee79dd4f401ff9b7ea945d86666c13b
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffe000000000000000000000000000
+Ciphertext: dd35cea2799940b40db3f819cb94c08b
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffff000000000000000000000000000
+Ciphertext: 6941cb6b3e08c2b7afa581ebdd607b87
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffff800000000000000000000000000
+Ciphertext: 2c20f439f6bb097b29b8bd6d99aad799
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffc00000000000000000000000000
+Ciphertext: 625d01f058e565f77ae86378bd2c49b3
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffe00000000000000000000000000
+Ciphertext: c0b5fd98190ef45fbb4301438d095950
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffff00000000000000000000000000
+Ciphertext: 13001ff5d99806efd25da34f56be854b
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffff80000000000000000000000000
+Ciphertext: 3b594c60f5c8277a5113677f94208d82
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffc0000000000000000000000000
+Ciphertext: e9c0fc1818e4aa46bd2e39d638f89e05
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffe0000000000000000000000000
+Ciphertext: f8023ee9c3fdc45a019b4e985c7e1a54
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffff0000000000000000000000000
+Ciphertext: 35f40182ab4662f3023baec1ee796b57
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffff8000000000000000000000000
+Ciphertext: 3aebbad7303649b4194a6945c6cc3694
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffc000000000000000000000000
+Ciphertext: a2124bea53ec2834279bed7f7eb0f938
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffe000000000000000000000000
+Ciphertext: b9fb4399fa4facc7309e14ec98360b0a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffff000000000000000000000000
+Ciphertext: c26277437420c5d634f715aea81a9132
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffff800000000000000000000000
+Ciphertext: 171a0e1b2dd424f0e089af2c4c10f32f
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffc00000000000000000000000
+Ciphertext: 7cadbe402d1b208fe735edce00aee7ce
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffe00000000000000000000000
+Ciphertext: 43b02ff929a1485af6f5c6d6558baa0f
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffff00000000000000000000000
+Ciphertext: 092faacc9bf43508bf8fa8613ca75dea
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffff80000000000000000000000
+Ciphertext: cb2bf8280f3f9742c7ed513fe802629c
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffc0000000000000000000000
+Ciphertext: 215a41ee442fa992a6e323986ded3f68
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffe0000000000000000000000
+Ciphertext: f21e99cf4f0f77cea836e11a2fe75fb1
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffff0000000000000000000000
+Ciphertext: 95e3a0ca9079e646331df8b4e70d2cd6
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffff8000000000000000000000
+Ciphertext: 4afe7f120ce7613f74fc12a01a828073
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffc000000000000000000000
+Ciphertext: 827f000e75e2c8b9d479beed913fe678
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffe000000000000000000000
+Ciphertext: 35830c8e7aaefe2d30310ef381cbf691
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffff000000000000000000000
+Ciphertext: 191aa0f2c8570144f38657ea4085ebe5
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffff800000000000000000000
+Ciphertext: 85062c2c909f15d9269b6c18ce99c4f0
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffc00000000000000000000
+Ciphertext: 678034dc9e41b5a560ed239eeab1bc78
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffe00000000000000000000
+Ciphertext: c2f93a4ce5ab6d5d56f1b93cf19911c1
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffff00000000000000000000
+Ciphertext: 1c3112bcb0c1dcc749d799743691bf82
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffff80000000000000000000
+Ciphertext: 00c55bd75c7f9c881989d3ec1911c0d4
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffc0000000000000000000
+Ciphertext: ea2e6b5ef182b7dff3629abd6a12045f
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffe0000000000000000000
+Ciphertext: 22322327e01780b17397f24087f8cc6f
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffff0000000000000000000
+Ciphertext: c9cacb5cd11692c373b2411768149ee7
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffff8000000000000000000
+Ciphertext: a18e3dbbca577860dab6b80da3139256
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffc000000000000000000
+Ciphertext: 79b61c37bf328ecca8d743265a3d425c
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffe000000000000000000
+Ciphertext: d2d99c6bcc1f06fda8e27e8ae3f1ccc7
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffff000000000000000000
+Ciphertext: 1bfd4b91c701fd6b61b7f997829d663b
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffff800000000000000000
+Ciphertext: 11005d52f25f16bdc9545a876a63490a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffc00000000000000000
+Ciphertext: 3a4d354f02bb5a5e47d39666867f246a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffe00000000000000000
+Ciphertext: d451b8d6e1e1a0ebb155fbbf6e7b7dc3
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffff00000000000000000
+Ciphertext: 6898d4f42fa7ba6a10ac05e87b9f2080
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffff80000000000000000
+Ciphertext: b611295e739ca7d9b50f8e4c0e754a3f
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffc0000000000000000
+Ciphertext: 7d33fc7d8abe3ca1936759f8f5deaf20
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffe0000000000000000
+Ciphertext: 3b5e0f566dc96c298f0c12637539b25c
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffff0000000000000000
+Ciphertext: f807c3e7985fe0f5a50e2cdb25c5109e
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffff8000000000000000
+Ciphertext: 41f992a856fb278b389a62f5d274d7e9
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffc000000000000000
+Ciphertext: 10d3ed7a6fe15ab4d91acbc7d0767ab1
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffe000000000000000
+Ciphertext: 21feecd45b2e675973ac33bf0c5424fc
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffff000000000000000
+Ciphertext: 1480cb3955ba62d09eea668f7c708817
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffff800000000000000
+Ciphertext: 66404033d6b72b609354d5496e7eb511
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffc00000000000000
+Ciphertext: 1c317a220a7d700da2b1e075b00266e1
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffe00000000000000
+Ciphertext: ab3b89542233f1271bf8fd0c0f403545
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffff00000000000000
+Ciphertext: d93eae966fac46dca927d6b114fa3f9e
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffff80000000000000
+Ciphertext: 1bdec521316503d9d5ee65df3ea94ddf
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffc0000000000000
+Ciphertext: eef456431dea8b4acf83bdae3717f75f
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffe0000000000000
+Ciphertext: 06f2519a2fafaa596bfef5cfa15c21b9
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffff0000000000000
+Ciphertext: 251a7eac7e2fe809e4aa8d0d7012531a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffff8000000000000
+Ciphertext: 3bffc16e4c49b268a20f8d96a60b4058
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffc000000000000
+Ciphertext: e886f9281999c5bb3b3e8862e2f7c988
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffe000000000000
+Ciphertext: 563bf90d61beef39f48dd625fcef1361
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffff000000000000
+Ciphertext: 4d37c850644563c69fd0acd9a049325b
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffff800000000000
+Ciphertext: b87c921b91829ef3b13ca541ee1130a6
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffc00000000000
+Ciphertext: 2e65eb6b6ea383e109accce8326b0393
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffe00000000000
+Ciphertext: 9ca547f7439edc3e255c0f4d49aa8990
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffff00000000000
+Ciphertext: a5e652614c9300f37816b1f9fd0c87f9
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffff80000000000
+Ciphertext: 14954f0b4697776f44494fe458d814ed
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffc0000000000
+Ciphertext: 7c8d9ab6c2761723fe42f8bb506cbcf7
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffe0000000000
+Ciphertext: db7e1932679fdd99742aab04aa0d5a80
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffff0000000000
+Ciphertext: 4c6a1c83e568cd10f27c2d73ded19c28
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffff8000000000
+Ciphertext: 90ecbe6177e674c98de412413f7ac915
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffc000000000
+Ciphertext: 90684a2ac55fe1ec2b8ebd5622520b73
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffe000000000
+Ciphertext: 7472f9a7988607ca79707795991035e6
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffff000000000
+Ciphertext: 56aff089878bf3352f8df172a3ae47d8
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffff800000000
+Ciphertext: 65c0526cbe40161b8019a2a3171abd23
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffc00000000
+Ciphertext: 377be0be33b4e3e310b4aabda173f84f
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffe00000000
+Ciphertext: 9402e9aa6f69de6504da8d20c4fcaa2f
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffff00000000
+Ciphertext: 123c1f4af313ad8c2ce648b2e71fb6e1
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffff80000000
+Ciphertext: 1ffc626d30203dcdb0019fb80f726cf4
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffc0000000
+Ciphertext: 76da1fbe3a50728c50fd2e621b5ad885
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffe0000000
+Ciphertext: 082eb8be35f442fb52668e16a591d1d6
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffff0000000
+Ciphertext: e656f9ecf5fe27ec3e4a73d00c282fb3
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffff8000000
+Ciphertext: 2ca8209d63274cd9a29bb74bcd77683a
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffc000000
+Ciphertext: 79bf5dce14bb7dd73a8e3611de7ce026
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffe000000
+Ciphertext: 3c849939a5d29399f344c4a0eca8a576
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffff000000
+Ciphertext: ed3c0a94d59bece98835da7aa4f07ca2
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffff800000
+Ciphertext: 63919ed4ce10196438b6ad09d99cd795
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffc00000
+Ciphertext: 7678f3a833f19fea95f3c6029e2bc610
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffe00000
+Ciphertext: 3aa426831067d36b92be7c5f81c13c56
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffff00000
+Ciphertext: 9272e2d2cdd11050998c845077a30ea0
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffff80000
+Ciphertext: 088c4b53f5ec0ff814c19adae7f6246c
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffc0000
+Ciphertext: 4010a5e401fdf0a0354ddbcc0d012b17
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffe0000
+Ciphertext: a87a385736c0a6189bd6589bd8445a93
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffff0000
+Ciphertext: 545f2b83d9616dccf60fa9830e9cd287
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffff8000
+Ciphertext: 4b706f7f92406352394037a6d4f4688d
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffc000
+Ciphertext: b7972b3941c44b90afa7b264bfba7387
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffe000
+Ciphertext: 6f45732cf10881546f0fd23896d2bb60
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffff000
+Ciphertext: 2e3579ca15af27f64b3c955a5bfc30ba
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffff800
+Ciphertext: 34a2c5a91ae2aec99b7d1b5fa6780447
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffc00
+Ciphertext: a4d6616bd04f87335b0e53351227a9ee
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffe00
+Ciphertext: 7f692b03945867d16179a8cefc83ea3f
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffff00
+Ciphertext: 3bd141ee84a0e6414a26e7a4f281f8a2
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffff80
+Ciphertext: d1788f572d98b2b16ec5d5f3922b99bc
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffffc0
+Ciphertext: 0833ff6f61d98a57b288e8c3586b85a6
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffffe0
+Ciphertext: 8568261797de176bf0b43becc6285afb
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffff0
+Ciphertext: f9b0fda0c4a898f5b9e6f661c4ce4d07
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffff8
+Ciphertext: 8ade895913685c67c5269f8aae42983e
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffffc
+Ciphertext: 39bde67d5c8ed8a8b1c37eb8fa9f5ac0
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffffe
+Ciphertext: 5c005e72c1418c44f569f2ea33ba54f3
+
+Cipher: AES-128-CTR
+Operation: ENCRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffffff
+Ciphertext: 3f5b8cc9ea855a0afa7347d23e8d664e
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3ad78e726c1ec02b7ebfe92b23d9ec34
+IV: 80000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: aae5939c8efdf2f04e60b9fe7117b2c2
+IV: c0000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f031d4d74f5dcbf39daaf8ca3af6e527
+IV: e0000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 96d9fd5cc4f07441727df0f33e401a36
+IV: f0000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 30ccdb044646d7e1f3ccea3dca08b8c0
+IV: f8000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 16ae4ce5042a67ee8e177b7c587ecc82
+IV: fc000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b6da0bb11a23855d9c5cb1b4c6412e0a
+IV: fe000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: db4f1aa530967d6732ce4715eb0ee24b
+IV: ff000000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a81738252621dd180a34f3455b4baa2f
+IV: ff800000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 77e2b508db7fd89234caf7939ee5621a
+IV: ffc00000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b8499c251f8442ee13f0933b688fcd19
+IV: ffe00000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 965135f8a81f25c9d630b17502f68e53
+IV: fff00000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8b87145a01ad1c6cede995ea3670454f
+IV: fff80000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8eae3b10a0c8ca6d1d3b0fa61e56b0b2
+IV: fffc0000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 64b4d629810fda6bafdf08f3b0d8d2c5
+IV: fffe0000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d7e5dbd3324595f8fdc7d7c571da6c2a
+IV: ffff0000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f3f72375264e167fca9de2c1527d9606
+IV: ffff8000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8ee79dd4f401ff9b7ea945d86666c13b
+IV: ffffc000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dd35cea2799940b40db3f819cb94c08b
+IV: ffffe000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6941cb6b3e08c2b7afa581ebdd607b87
+IV: fffff000000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2c20f439f6bb097b29b8bd6d99aad799
+IV: fffff800000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 625d01f058e565f77ae86378bd2c49b3
+IV: fffffc00000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c0b5fd98190ef45fbb4301438d095950
+IV: fffffe00000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 13001ff5d99806efd25da34f56be854b
+IV: ffffff00000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3b594c60f5c8277a5113677f94208d82
+IV: ffffff80000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e9c0fc1818e4aa46bd2e39d638f89e05
+IV: ffffffc0000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f8023ee9c3fdc45a019b4e985c7e1a54
+IV: ffffffe0000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 35f40182ab4662f3023baec1ee796b57
+IV: fffffff0000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3aebbad7303649b4194a6945c6cc3694
+IV: fffffff8000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a2124bea53ec2834279bed7f7eb0f938
+IV: fffffffc000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b9fb4399fa4facc7309e14ec98360b0a
+IV: fffffffe000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c26277437420c5d634f715aea81a9132
+IV: ffffffff000000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 171a0e1b2dd424f0e089af2c4c10f32f
+IV: ffffffff800000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7cadbe402d1b208fe735edce00aee7ce
+IV: ffffffffc00000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 43b02ff929a1485af6f5c6d6558baa0f
+IV: ffffffffe00000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 092faacc9bf43508bf8fa8613ca75dea
+IV: fffffffff00000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cb2bf8280f3f9742c7ed513fe802629c
+IV: fffffffff80000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 215a41ee442fa992a6e323986ded3f68
+IV: fffffffffc0000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f21e99cf4f0f77cea836e11a2fe75fb1
+IV: fffffffffe0000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 95e3a0ca9079e646331df8b4e70d2cd6
+IV: ffffffffff0000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4afe7f120ce7613f74fc12a01a828073
+IV: ffffffffff8000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 827f000e75e2c8b9d479beed913fe678
+IV: ffffffffffc000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 35830c8e7aaefe2d30310ef381cbf691
+IV: ffffffffffe000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 191aa0f2c8570144f38657ea4085ebe5
+IV: fffffffffff000000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 85062c2c909f15d9269b6c18ce99c4f0
+IV: fffffffffff800000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 678034dc9e41b5a560ed239eeab1bc78
+IV: fffffffffffc00000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c2f93a4ce5ab6d5d56f1b93cf19911c1
+IV: fffffffffffe00000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1c3112bcb0c1dcc749d799743691bf82
+IV: ffffffffffff00000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 00c55bd75c7f9c881989d3ec1911c0d4
+IV: ffffffffffff80000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ea2e6b5ef182b7dff3629abd6a12045f
+IV: ffffffffffffc0000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 22322327e01780b17397f24087f8cc6f
+IV: ffffffffffffe0000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c9cacb5cd11692c373b2411768149ee7
+IV: fffffffffffff0000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a18e3dbbca577860dab6b80da3139256
+IV: fffffffffffff8000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 79b61c37bf328ecca8d743265a3d425c
+IV: fffffffffffffc000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d2d99c6bcc1f06fda8e27e8ae3f1ccc7
+IV: fffffffffffffe000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1bfd4b91c701fd6b61b7f997829d663b
+IV: ffffffffffffff000000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 11005d52f25f16bdc9545a876a63490a
+IV: ffffffffffffff800000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3a4d354f02bb5a5e47d39666867f246a
+IV: ffffffffffffffc00000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d451b8d6e1e1a0ebb155fbbf6e7b7dc3
+IV: ffffffffffffffe00000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6898d4f42fa7ba6a10ac05e87b9f2080
+IV: fffffffffffffff00000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b611295e739ca7d9b50f8e4c0e754a3f
+IV: fffffffffffffff80000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7d33fc7d8abe3ca1936759f8f5deaf20
+IV: fffffffffffffffc0000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3b5e0f566dc96c298f0c12637539b25c
+IV: fffffffffffffffe0000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f807c3e7985fe0f5a50e2cdb25c5109e
+IV: ffffffffffffffff0000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 41f992a856fb278b389a62f5d274d7e9
+IV: ffffffffffffffff8000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 10d3ed7a6fe15ab4d91acbc7d0767ab1
+IV: ffffffffffffffffc000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 21feecd45b2e675973ac33bf0c5424fc
+IV: ffffffffffffffffe000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1480cb3955ba62d09eea668f7c708817
+IV: fffffffffffffffff000000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 66404033d6b72b609354d5496e7eb511
+IV: fffffffffffffffff800000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1c317a220a7d700da2b1e075b00266e1
+IV: fffffffffffffffffc00000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ab3b89542233f1271bf8fd0c0f403545
+IV: fffffffffffffffffe00000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d93eae966fac46dca927d6b114fa3f9e
+IV: ffffffffffffffffff00000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1bdec521316503d9d5ee65df3ea94ddf
+IV: ffffffffffffffffff80000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: eef456431dea8b4acf83bdae3717f75f
+IV: ffffffffffffffffffc0000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 06f2519a2fafaa596bfef5cfa15c21b9
+IV: ffffffffffffffffffe0000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 251a7eac7e2fe809e4aa8d0d7012531a
+IV: fffffffffffffffffff0000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3bffc16e4c49b268a20f8d96a60b4058
+IV: fffffffffffffffffff8000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e886f9281999c5bb3b3e8862e2f7c988
+IV: fffffffffffffffffffc000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 563bf90d61beef39f48dd625fcef1361
+IV: fffffffffffffffffffe000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4d37c850644563c69fd0acd9a049325b
+IV: ffffffffffffffffffff000000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b87c921b91829ef3b13ca541ee1130a6
+IV: ffffffffffffffffffff800000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2e65eb6b6ea383e109accce8326b0393
+IV: ffffffffffffffffffffc00000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9ca547f7439edc3e255c0f4d49aa8990
+IV: ffffffffffffffffffffe00000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a5e652614c9300f37816b1f9fd0c87f9
+IV: fffffffffffffffffffff00000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 14954f0b4697776f44494fe458d814ed
+IV: fffffffffffffffffffff80000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7c8d9ab6c2761723fe42f8bb506cbcf7
+IV: fffffffffffffffffffffc0000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: db7e1932679fdd99742aab04aa0d5a80
+IV: fffffffffffffffffffffe0000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4c6a1c83e568cd10f27c2d73ded19c28
+IV: ffffffffffffffffffffff0000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 90ecbe6177e674c98de412413f7ac915
+IV: ffffffffffffffffffffff8000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 90684a2ac55fe1ec2b8ebd5622520b73
+IV: ffffffffffffffffffffffc000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7472f9a7988607ca79707795991035e6
+IV: ffffffffffffffffffffffe000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 56aff089878bf3352f8df172a3ae47d8
+IV: fffffffffffffffffffffff000000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 65c0526cbe40161b8019a2a3171abd23
+IV: fffffffffffffffffffffff800000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 377be0be33b4e3e310b4aabda173f84f
+IV: fffffffffffffffffffffffc00000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9402e9aa6f69de6504da8d20c4fcaa2f
+IV: fffffffffffffffffffffffe00000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 123c1f4af313ad8c2ce648b2e71fb6e1
+IV: ffffffffffffffffffffffff00000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1ffc626d30203dcdb0019fb80f726cf4
+IV: ffffffffffffffffffffffff80000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 76da1fbe3a50728c50fd2e621b5ad885
+IV: ffffffffffffffffffffffffc0000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 082eb8be35f442fb52668e16a591d1d6
+IV: ffffffffffffffffffffffffe0000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e656f9ecf5fe27ec3e4a73d00c282fb3
+IV: fffffffffffffffffffffffff0000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2ca8209d63274cd9a29bb74bcd77683a
+IV: fffffffffffffffffffffffff8000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 79bf5dce14bb7dd73a8e3611de7ce026
+IV: fffffffffffffffffffffffffc000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3c849939a5d29399f344c4a0eca8a576
+IV: fffffffffffffffffffffffffe000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ed3c0a94d59bece98835da7aa4f07ca2
+IV: ffffffffffffffffffffffffff000000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 63919ed4ce10196438b6ad09d99cd795
+IV: ffffffffffffffffffffffffff800000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7678f3a833f19fea95f3c6029e2bc610
+IV: ffffffffffffffffffffffffffc00000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3aa426831067d36b92be7c5f81c13c56
+IV: ffffffffffffffffffffffffffe00000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9272e2d2cdd11050998c845077a30ea0
+IV: fffffffffffffffffffffffffff00000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 088c4b53f5ec0ff814c19adae7f6246c
+IV: fffffffffffffffffffffffffff80000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4010a5e401fdf0a0354ddbcc0d012b17
+IV: fffffffffffffffffffffffffffc0000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a87a385736c0a6189bd6589bd8445a93
+IV: fffffffffffffffffffffffffffe0000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 545f2b83d9616dccf60fa9830e9cd287
+IV: ffffffffffffffffffffffffffff0000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4b706f7f92406352394037a6d4f4688d
+IV: ffffffffffffffffffffffffffff8000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b7972b3941c44b90afa7b264bfba7387
+IV: ffffffffffffffffffffffffffffc000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6f45732cf10881546f0fd23896d2bb60
+IV: ffffffffffffffffffffffffffffe000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2e3579ca15af27f64b3c955a5bfc30ba
+IV: fffffffffffffffffffffffffffff000
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 34a2c5a91ae2aec99b7d1b5fa6780447
+IV: fffffffffffffffffffffffffffff800
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a4d6616bd04f87335b0e53351227a9ee
+IV: fffffffffffffffffffffffffffffc00
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7f692b03945867d16179a8cefc83ea3f
+IV: fffffffffffffffffffffffffffffe00
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3bd141ee84a0e6414a26e7a4f281f8a2
+IV: ffffffffffffffffffffffffffffff00
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d1788f572d98b2b16ec5d5f3922b99bc
+IV: ffffffffffffffffffffffffffffff80
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0833ff6f61d98a57b288e8c3586b85a6
+IV: ffffffffffffffffffffffffffffffc0
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8568261797de176bf0b43becc6285afb
+IV: ffffffffffffffffffffffffffffffe0
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f9b0fda0c4a898f5b9e6f661c4ce4d07
+IV: fffffffffffffffffffffffffffffff0
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8ade895913685c67c5269f8aae42983e
+IV: fffffffffffffffffffffffffffffff8
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 39bde67d5c8ed8a8b1c37eb8fa9f5ac0
+IV: fffffffffffffffffffffffffffffffc
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5c005e72c1418c44f569f2ea33ba54f3
+IV: fffffffffffffffffffffffffffffffe
+
+Cipher: AES-128-CTR
+Operation: DECRYPT
+Key: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3f5b8cc9ea855a0afa7347d23e8d664e
+IV: ffffffffffffffffffffffffffffffff
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_gf_sbox.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_gf_sbox.txt
new file mode 100644
index 0000000..56ab85b
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_gf_sbox.txt
@@ -0,0 +1,86 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCGFSbox192.rsp -extra-labels=Cipher=AES-192-CBC"
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 1b077a6af4b7f98229de786d7516b639
+Ciphertext: 275cfc0413d8ccb70513c3859b1d0f72
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 9c2d8842e5f48f57648205d39a239af1
+Ciphertext: c9b8135ff1b5adc413dfd053b21bd96d
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: bff52510095f518ecca60af4205444bb
+Ciphertext: 4a3650c3371ce2eb35e389a171427440
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 51719783d3185a535bd75adc65071ce1
+Ciphertext: 4f354592ff7c8847d2d0870ca9481b7c
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 26aa49dcfe7629a8901a69a9914e6dfd
+Ciphertext: d5e08bf9a182e857cf40b3a36ee248cc
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 941a4773058224e1ef66d10e0a6ee782
+Ciphertext: 067cd9d3749207791841562507fa9626
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 275cfc0413d8ccb70513c3859b1d0f72
+Plaintext: 1b077a6af4b7f98229de786d7516b639
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c9b8135ff1b5adc413dfd053b21bd96d
+Plaintext: 9c2d8842e5f48f57648205d39a239af1
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4a3650c3371ce2eb35e389a171427440
+Plaintext: bff52510095f518ecca60af4205444bb
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4f354592ff7c8847d2d0870ca9481b7c
+Plaintext: 51719783d3185a535bd75adc65071ce1
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d5e08bf9a182e857cf40b3a36ee248cc
+Plaintext: 26aa49dcfe7629a8901a69a9914e6dfd
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 067cd9d3749207791841562507fa9626
+Plaintext: 941a4773058224e1ef66d10e0a6ee782
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_key_sbox.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_key_sbox.txt
new file mode 100644
index 0000000..1633528
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_key_sbox.txt
@@ -0,0 +1,338 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCKeySbox192.rsp -extra-labels=Cipher=AES-192-CBC"
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: e9f065d7c13573587f7875357dfbb16c53489f6a4bd0f7cd
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0956259c9cd5cfd0181cca53380cde06
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 15d20f6ebc7e649fd95b76b107e6daba967c8a9484797f29
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8e4e18424e591a3d5b6f0876f16f8594
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: a8a282ee31c03fae4f8e9b8930d5473c2ed695a347e88b7c
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 93f3270cfc877ef17e106ce938979cb0
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: cd62376d5ebb414917f0c78f05266433dc9192a1ec943300
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7f6c25ff41858561bb62f36492e93c29
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 502a6ab36984af268bf423c7f509205207fc1552af4a91e5
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8e06556dcbb00b809a025047cff2a940
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 25a39dbfd8034f71a81f9ceb55026e4037f8f6aa30ab44ce
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3608c344868e94555d23a120f8a5502d
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: e08c15411774ec4a908b64eadc6ac4199c7cd453f3aaef53
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 77da2021935b840b7f5dcc39132da9e5
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 3b375a1ff7e8d44409696e6326ec9dec86138e2ae010b980
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3b7c24f825e3bf9873c9f14d39a0e6f4
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 950bb9f22cc35be6fe79f52c320af93dec5bc9c0c2f9cd53
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 64ebf95686b353508c90ecd8b6134316
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 7001c487cc3e572cfc92f4d0e697d982e8856fdcc957da40
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ff558c5d27210b7929b73fc708eb4cf1
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: f029ce61d4e5a405b41ead0a883cc6a737da2cf50a6c92ae
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a2c3b2a818075490a7b4c14380f02702
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 61257134a518a0d57d9d244d45f6498cbc32f2bafc522d79
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cfe4d74002696ccf7d87b14a2f9cafc9
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: b0ab0a6a818baef2d11fa33eac947284fb7d748cfb75e570
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d2eafd86f63b109b91f5dbb3a3fb7e13
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ee053aa011c8b428cdcc3636313c54d6a03cac01c71579d6
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9b9fdd1c5975655f539998b306a324af
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: d2926527e0aa9f37b45e2ec2ade5853ef807576104c7ace3
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dd619e1cf204446112e0af2b9afa8f8c
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 982215f4e173dfa0fcffe5d3da41c4812c7bcc8ed3540f93
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d4f0aae13c8fe9339fbf9e69ed0ad74d
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 98c6b8e01e379fbd14e61af6af891596583565f2a27d59e9
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 19c80ec4a6deb7e5ed1033dda933498f
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: b3ad5cea1dddc214ca969ac35f37dae1a9a9d1528f89bb35
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3cf5e1d21a17956d1dffad6a7c41c659
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 45899367c3132849763073c435a9288a766c8b9ec2308516
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 69fd12e8505f8ded2fdcb197a121b362
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ec250e04c3903f602647b85a401a1ae7ca2f02f67fa4253e
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8aa584e2cc4d17417a97cb9a28ba29c8
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: d077a03bd8a38973928ccafe4a9d2f455130bd0af5ae46a9
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: abc786fb1edb504580c4d882ef29a0c7
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: d184c36cf0dddfec39e654195006022237871a47c33d3198
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2e19fb60a3e1de0166f483c97824a978
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 4c6994ffa9dcdc805b60c2c0095334c42d95a8fc0ca5b080
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7656709538dd5fec41e0ce6a0f8e207d
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: c88f5b00a4ef9a6840e2acaf33f00a3bdc4e25895303fa72
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a67cf333b314d411d3c0ae6e1cfcd8f5
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: e9f065d7c13573587f7875357dfbb16c53489f6a4bd0f7cd
+IV: 00000000000000000000000000000000
+Ciphertext: 0956259c9cd5cfd0181cca53380cde06
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 15d20f6ebc7e649fd95b76b107e6daba967c8a9484797f29
+IV: 00000000000000000000000000000000
+Ciphertext: 8e4e18424e591a3d5b6f0876f16f8594
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: a8a282ee31c03fae4f8e9b8930d5473c2ed695a347e88b7c
+IV: 00000000000000000000000000000000
+Ciphertext: 93f3270cfc877ef17e106ce938979cb0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: cd62376d5ebb414917f0c78f05266433dc9192a1ec943300
+IV: 00000000000000000000000000000000
+Ciphertext: 7f6c25ff41858561bb62f36492e93c29
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 502a6ab36984af268bf423c7f509205207fc1552af4a91e5
+IV: 00000000000000000000000000000000
+Ciphertext: 8e06556dcbb00b809a025047cff2a940
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 25a39dbfd8034f71a81f9ceb55026e4037f8f6aa30ab44ce
+IV: 00000000000000000000000000000000
+Ciphertext: 3608c344868e94555d23a120f8a5502d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: e08c15411774ec4a908b64eadc6ac4199c7cd453f3aaef53
+IV: 00000000000000000000000000000000
+Ciphertext: 77da2021935b840b7f5dcc39132da9e5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 3b375a1ff7e8d44409696e6326ec9dec86138e2ae010b980
+IV: 00000000000000000000000000000000
+Ciphertext: 3b7c24f825e3bf9873c9f14d39a0e6f4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 950bb9f22cc35be6fe79f52c320af93dec5bc9c0c2f9cd53
+IV: 00000000000000000000000000000000
+Ciphertext: 64ebf95686b353508c90ecd8b6134316
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 7001c487cc3e572cfc92f4d0e697d982e8856fdcc957da40
+IV: 00000000000000000000000000000000
+Ciphertext: ff558c5d27210b7929b73fc708eb4cf1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: f029ce61d4e5a405b41ead0a883cc6a737da2cf50a6c92ae
+IV: 00000000000000000000000000000000
+Ciphertext: a2c3b2a818075490a7b4c14380f02702
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 61257134a518a0d57d9d244d45f6498cbc32f2bafc522d79
+IV: 00000000000000000000000000000000
+Ciphertext: cfe4d74002696ccf7d87b14a2f9cafc9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: b0ab0a6a818baef2d11fa33eac947284fb7d748cfb75e570
+IV: 00000000000000000000000000000000
+Ciphertext: d2eafd86f63b109b91f5dbb3a3fb7e13
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ee053aa011c8b428cdcc3636313c54d6a03cac01c71579d6
+IV: 00000000000000000000000000000000
+Ciphertext: 9b9fdd1c5975655f539998b306a324af
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: d2926527e0aa9f37b45e2ec2ade5853ef807576104c7ace3
+IV: 00000000000000000000000000000000
+Ciphertext: dd619e1cf204446112e0af2b9afa8f8c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 982215f4e173dfa0fcffe5d3da41c4812c7bcc8ed3540f93
+IV: 00000000000000000000000000000000
+Ciphertext: d4f0aae13c8fe9339fbf9e69ed0ad74d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 98c6b8e01e379fbd14e61af6af891596583565f2a27d59e9
+IV: 00000000000000000000000000000000
+Ciphertext: 19c80ec4a6deb7e5ed1033dda933498f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: b3ad5cea1dddc214ca969ac35f37dae1a9a9d1528f89bb35
+IV: 00000000000000000000000000000000
+Ciphertext: 3cf5e1d21a17956d1dffad6a7c41c659
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 45899367c3132849763073c435a9288a766c8b9ec2308516
+IV: 00000000000000000000000000000000
+Ciphertext: 69fd12e8505f8ded2fdcb197a121b362
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ec250e04c3903f602647b85a401a1ae7ca2f02f67fa4253e
+IV: 00000000000000000000000000000000
+Ciphertext: 8aa584e2cc4d17417a97cb9a28ba29c8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: d077a03bd8a38973928ccafe4a9d2f455130bd0af5ae46a9
+IV: 00000000000000000000000000000000
+Ciphertext: abc786fb1edb504580c4d882ef29a0c7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: d184c36cf0dddfec39e654195006022237871a47c33d3198
+IV: 00000000000000000000000000000000
+Ciphertext: 2e19fb60a3e1de0166f483c97824a978
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 4c6994ffa9dcdc805b60c2c0095334c42d95a8fc0ca5b080
+IV: 00000000000000000000000000000000
+Ciphertext: 7656709538dd5fec41e0ce6a0f8e207d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: c88f5b00a4ef9a6840e2acaf33f00a3bdc4e25895303fa72
+IV: 00000000000000000000000000000000
+Ciphertext: a67cf333b314d411d3c0ae6e1cfcd8f5
+Plaintext: 00000000000000000000000000000000
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_var_key.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_var_key.txt
new file mode 100644
index 0000000..1085e6c
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_var_key.txt
@@ -0,0 +1,2690 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCVarKey192.rsp -extra-labels=Cipher=AES-192-CBC"
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 800000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: de885dc87f5a92594082d02cc1e1b42c
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: c00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 132b074e80f2a597bf5febd8ea5da55e
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: e00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6eccedf8de592c22fb81347b79f2db1f
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: f00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 180b09f267c45145db2f826c2582d35c
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: f80000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: edd807ef7652d7eb0e13c8b5e15b3bc0
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fc0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9978bcf8dd8fd72241223ad24b31b8a4
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fe0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5310f654343e8f27e12c83a48d24ff81
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ff0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 833f71258d53036b02952c76c744f5a1
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ff8000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: eba83ff200cff9318a92f8691a06b09f
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffc000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ff620ccbe9f3292abdf2176b09f04eba
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffe000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7ababc4b3f516c9aafb35f4140b548f9
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fff000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: aa187824d9c4582b0916493ecbde8c57
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fff800000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1c0ad553177fd5ea1092c9d626a29dc4
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffc00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a5dc46c37261194124ecaebd680408ec
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffe00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e4f2f2ae23e9b10bacfa58601531ba54
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffff00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b7d67cf1a1e91e8ff3a57a172c7bf412
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffff80000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 26706be06967884e847d137128ce47b3
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffc0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b2f8b409b0585909aad3a7b5a219072a
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffe0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5e4b7bff0290c78344c54a23b722cd20
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffff0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 07093657552d4414227ce161e9ebf7dd
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffff8000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e1af1e7d8bc225ed4dffb771ecbb9e67
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffc000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ef6555253635d8432156cfd9c11b145a
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffe000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fb4035074a5d4260c90cbd6da6c3fceb
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffff000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 446ee416f9ad1c103eb0cc96751c88e1
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffff800000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 198ae2a4637ac0a7890a8fd1485445c9
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffc00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 562012ec8faded0825fb2fa70ab30cbd
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffe00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cc8a64b46b5d88bf7f247d4dbaf38f05
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffff00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a168253762e2cc81b42d1e5001762699
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffff80000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1b41f83b38ce5032c6cd7af98cf62061
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffc0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 61a89990cd1411750d5fb0dc988447d4
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffe0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b5accc8ed629edf8c68a539183b1ea82
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffff0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b16fa71f846b81a13f361c43a851f290
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffff8000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4fad6efdff5975aee7692234bcd54488
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffc000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ebfdb05a783d03082dfe5fdd80a00b17
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffe000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: eb81b584766997af6ba5529d3bdd8609
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffff000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0cf4ff4f49c8a0ca060c443499e29313
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffff800000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cc4ba8a8e029f8b26d8afff9df133bb6
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffc00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fefebf64360f38e4e63558f0ffc550c3
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffe00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 12ad98cbf725137d6a8108c2bed99322
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffff00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6afaa996226198b3e2610413ce1b3f78
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffff80000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2a8ce6747a7e39367828e290848502d9
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffc0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 223736e8b8f89ca1e37b6deab40facf1
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffe0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c0f797e50418b95fa6013333917a9480
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffff0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a758de37c2ece2a02c73c01fedc9a132
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffff8000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3a9b87ae77bae706803966c66c73adbd
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffc000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d365ab8df8ffd782e358121a4a4fc541
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffe000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c8dcd9e6f75e6c36c8daee0466f0ed74
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffff000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c79a637beb1c0304f14014c037e736dd
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffff800000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 105f0a25e84ac930d996281a5f954dd9
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffc00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 42e4074b2927973e8d17ffa92f7fe615
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffe00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4fe2a9d2c1824449c69e3e0398f12963
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffff00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b7f29c1e1f62847a15253b28a1e9d712
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffff80000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 36ed5d29b903f31e8983ef8b0a2bf990
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffc0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 27b8070270810f9d023f9dd7ff3b4aa2
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffe0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 94d46e155c1228f61d1a0db4815ecc4b
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffff0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ca6108d1d98071428eeceef1714b96dd
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffff8000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dc5b25b71b6296cf73dd2cdcac2f70b1
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffc000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 44aba95e8a06a2d9d3530d2677878c80
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffe000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a570d20e89b467e8f5176061b81dd396
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffff000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 758f4467a5d8f1e7307dc30b34e404f4
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffff800000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: bcea28e9071b5a2302970ff352451bc5
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffc00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7523c00bc177d331ad312e09c9015c1c
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffe00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ccac61e3183747b3f5836da21a1bc4f4
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffff00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 707b075791878880b44189d3522b8c30
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffff80000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7132d0c0e4a07593cf12ebb12be7688c
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffc0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: effbac1644deb0c784275fe56e19ead3
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffe0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a005063f30f4228b374e2459738f26bb
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffff0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 29975b5f48bb68fcbbc7cea93b452ed7
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffff8000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cf3f2576e2afedc74bb1ca7eeec1c0e7
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffc000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 07c403f5f966e0e3d9f296d6226dca28
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffe000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c8c20908249ab4a34d6dd0a31327ff1a
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffff000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c0541329ecb6159ab23b7fc5e6a21bca
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffff800000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7aa1acf1a2ed9ba72bc6deb31d88b863
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffc00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 808bd8eddabb6f3bf0d5a8a27be1fe8a
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffe00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 273c7d7685e14ec66bbb96b8f05b6ddd
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffff00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 32752eefc8c2a93f91b6e73eb07cca6e
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffff80000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d893e7d62f6ce502c64f75e281f9c000
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffc0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8dfd999be5d0cfa35732c0ddc88ff5a5
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffe0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 02647c76a300c3173b841487eb2bae9f
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffff0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 172df8b02f04b53adab028b4e01acd87
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffff8000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 054b3bf4998aeb05afd87ec536533a36
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffc000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3783f7bf44c97f065258a666cae03020
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffe000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: aad4c8a63f80954104de7b92cede1be1
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffff000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cbfe61810fd5467ccdacb75800f3ac07
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffff800000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 830d8a2590f7d8e1b55a737f4af45f34
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffc00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fffcd4683f858058e74314671d43fa2c
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffe00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 523d0babbb82f46ebc9e70b1cd41ddd0
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffff00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 344aab37080d7486f7d542a309e53eed
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffff80000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 56c5609d0906b23ab9caca816f5dbebd
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffc0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7026026eedd91adc6d831cdf9894bdc6
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffe0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 88330baa4f2b618fc9d9b021bf503d5a
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffff0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fc9e0ea22480b0bac935c8a8ebefcdcf
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffff8000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 29ca779f398fb04f867da7e8a44756cb
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffc000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 51f89c42985786bfc43c6df8ada36832
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffe000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6ac1de5fb8f21d874e91c53b560c50e3
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffff000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 03aa9058490eda306001a8a9f48d0ca7
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffff800000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e34ec71d6128d4871865d617c30b37e3
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffc00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 14be1c535b17cabd0c4d93529d69bf47
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffe00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c9ef67756507beec9dd3862883478044
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffff00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 40e231fa5a5948ce2134e92fc0664d4b
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffff80000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 03194b8e5dda5530d0c678c0b48f5d92
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffc0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 90bd086f237cc4fd99f4d76bde6b4826
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffe0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 19259761ca17130d6ed86d57cd7951ee
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffff0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d7cbb3f34b9b450f24b0e8518e54da6d
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffff8000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 725b9caebe9f7f417f4068d0d2ee20b3
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffc000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9d924b934a90ce1fd39b8a9794f82672
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffe000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c50562bf094526a91c5bc63c0c224995
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffff000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d2f11805046743bd74f57188d9188df7
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffff800000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8dd274bd0f1b58ae345d9e7233f9b8f3
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffc00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9d6bdc8f4ce5feb0f3bed2e4b9a9bb0b
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffe00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fd5548bcf3f42565f7efa94562528d46
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffff00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d2ccaebd3a4c3e80b063748131ba4a71
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffff80000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e03cb23d9e11c9d93f117e9c0a91b576
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffc0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 78f933a2081ac1db84f69d10f4523fe0
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffe0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4061f7412ed320de0edc8851c2e2436f
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffff0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9064ba1cd04ce6bab98474330814b4d4
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffff8000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 48391bffb9cfff80ac238c886ef0a461
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffc000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b8d2a67df5a999fdbf93edd0343296c9
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffe000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: aaca7367396b69a221bd632bea386eec
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffff000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a80fd5020dfe65f5f16293ec92c6fd89
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffff800000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2162995b8217a67f1abc342e146406f8
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffc00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c6a6164b7a60bae4e986ffac28dfadd9
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffe00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 64e0d7f900e3d9c83e4b8f96717b2146
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffff00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1ad2561de8c1232f5d8dbab4739b6cbb
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffff80000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 279689e9a557f58b1c3bf40c97a90964
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffc0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c4637e4a5e6377f9cc5a8638045de029
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffe0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 492e607e5aea4688594b45f3aee3df90
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffff0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e8c4e4381feec74054954c05b777a00a
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffff8000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 91549514605f38246c9b724ad839f01d
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffc000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 74b24e3b6fefe40a4f9ef7ac6e44d76a
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffe000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2437a683dc5d4b52abb4a123a8df86c6
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffff000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: bb2852c891c5947d2ed44032c421b85f
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffff800000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1b9f5fbd5e8a4264c0a85b80409afa5e
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffc00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 30dab809f85a917fe924733f424ac589
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffe00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: eaef5c1f8d605192646695ceadc65f32
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffff00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b8aa90040b4c15a12316b78e0f9586fc
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffff80000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 97fac8297ceaabc87d454350601e0673
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffc0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9b47ef567ac28dfe488492f157e2b2e0
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffe0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1b8426027ddb962b5c5ba7eb8bc9ab63
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffff0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e917fc77e71992a12dbe4c18068bec82
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffff8000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dceebbc98840f8ae6daf76573b7e56f4
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffc000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4e11a9f74205125b61e0aee047eca20d
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffe000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f60467f55a1f17eab88e800120cbc284
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffff000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d436649f600b449ee276530f0cd83c11
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffff800000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3bc0e3656a9e3ac7cd378a737f53b637
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffc00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6bacae63d33b928aa8380f8d54d88c17
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffe00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8935ffbc75ae6251bf8e859f085adcb9
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffff00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 93dc4970fe35f67747cb0562c06d875a
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffff80000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 14f9df858975851797ba604fb0d16cc7
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffc0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 02ea0c98dca10b38c21b3b14e8d1b71f
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffe0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8f091b1b5b0749b2adc803e63dda9b72
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffff0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 05b389e3322c6da08384345a4137fd08
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffff8000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 381308c438f35b399f10ad71b05027d8
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffc000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 68c230fcfa9279c3409fc423e2acbe04
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffe000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1c84a475acb011f3f59f4f46b76274c0
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffff000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 45119b68cb3f8399ee60066b5611a4d7
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffff800000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9423762f527a4060ffca312dcca22a16
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffc00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f361a2745a33f056a5ac6ace2f08e344
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffe00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5ef145766eca849f5d011536a6557fdb
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c9af27b2c89c9b4cf4a0c4106ac80318
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff80000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fb9c4f16c621f4eab7e9ac1d7551dd57
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffc0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 138e06fba466fa70854d8c2e524cffb2
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffe0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fb4bc78b225070773f04c40466d4e90c
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8b2cbff1ed0150feda8a4799be94551f
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff8000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 08b30d7b3f27962709a36bcadfb974bd
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffc000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fdf6d32e044d77adcf37fb97ac213326
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffe000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 93cb284ecdcfd781a8afe32077949e88
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7b017bb02ec87b2b94c96e40a26fc71a
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff800000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c5c038b6990664ab08a3aaa5df9f3266
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffc00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4b7020be37fab6259b2a27f4ec551576
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffe00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 60136703374f64e860b48ce31f930716
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8d63a269b14d506ccc401ab8a9f1b591
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff80000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d317f81dc6aa454aee4bd4a5a5cff4bd
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffc0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dddececd5354f04d530d76ed884246eb
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffe0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 41c5205cc8fd8eda9a3cffd2518f365a
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cf42fb474293d96eca9db1b37b1ba676
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff8000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a231692607169b4ecdead5cd3b10db3e
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffc000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ace4b91c9c669e77e7acacd19859ed49
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffe000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 75db7cfd4a7b2b62ab78a48f3ddaf4af
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c1faba2d46e259cf480d7c38e4572a58
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff800
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 241c45bc6ae16dee6eb7bea128701582
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffc00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8fd03057cf1364420c2b78069a3e2502
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffe00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ddb505e6cc1384cbaec1df90b80beb20
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5674a3bed27bf4bd3622f9f5fe208306
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff80
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b687f26a89cfbfbb8e5eeac54055315e
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffc0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0547dd32d3b29ab6a4caeb606c5b6f78
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffe0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 186861f8bc5386d31fb77f720c3226e6
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: eacf1e6c4224efb38900b185ab1dfd42
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff8
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d241aab05a42d319de81d874f5c7b90d
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffc
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5eb9bc759e2ad8d2140a6c762ae9e1ab
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffe
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 018596e15e78e2c064159defce5f3085
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffff
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dd8a493514231cbf56eccee4c40889fb
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 800000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: de885dc87f5a92594082d02cc1e1b42c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: c00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 132b074e80f2a597bf5febd8ea5da55e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: e00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6eccedf8de592c22fb81347b79f2db1f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: f00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 180b09f267c45145db2f826c2582d35c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: f80000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: edd807ef7652d7eb0e13c8b5e15b3bc0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fc0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9978bcf8dd8fd72241223ad24b31b8a4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fe0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5310f654343e8f27e12c83a48d24ff81
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ff0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 833f71258d53036b02952c76c744f5a1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ff8000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: eba83ff200cff9318a92f8691a06b09f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffc000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ff620ccbe9f3292abdf2176b09f04eba
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffe000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7ababc4b3f516c9aafb35f4140b548f9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fff000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: aa187824d9c4582b0916493ecbde8c57
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fff800000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1c0ad553177fd5ea1092c9d626a29dc4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffc00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a5dc46c37261194124ecaebd680408ec
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffe00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e4f2f2ae23e9b10bacfa58601531ba54
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffff00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b7d67cf1a1e91e8ff3a57a172c7bf412
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffff80000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 26706be06967884e847d137128ce47b3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffc0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b2f8b409b0585909aad3a7b5a219072a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffe0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5e4b7bff0290c78344c54a23b722cd20
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffff0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 07093657552d4414227ce161e9ebf7dd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffff8000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e1af1e7d8bc225ed4dffb771ecbb9e67
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffc000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ef6555253635d8432156cfd9c11b145a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffe000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fb4035074a5d4260c90cbd6da6c3fceb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffff000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 446ee416f9ad1c103eb0cc96751c88e1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffff800000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 198ae2a4637ac0a7890a8fd1485445c9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffc00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 562012ec8faded0825fb2fa70ab30cbd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffe00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cc8a64b46b5d88bf7f247d4dbaf38f05
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffff00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a168253762e2cc81b42d1e5001762699
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffff80000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1b41f83b38ce5032c6cd7af98cf62061
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffc0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 61a89990cd1411750d5fb0dc988447d4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffe0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b5accc8ed629edf8c68a539183b1ea82
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffff0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b16fa71f846b81a13f361c43a851f290
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffff8000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4fad6efdff5975aee7692234bcd54488
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffc000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ebfdb05a783d03082dfe5fdd80a00b17
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffe000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: eb81b584766997af6ba5529d3bdd8609
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffff000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0cf4ff4f49c8a0ca060c443499e29313
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffff800000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cc4ba8a8e029f8b26d8afff9df133bb6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffc00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fefebf64360f38e4e63558f0ffc550c3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffe00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 12ad98cbf725137d6a8108c2bed99322
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffff00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6afaa996226198b3e2610413ce1b3f78
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffff80000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2a8ce6747a7e39367828e290848502d9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffc0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 223736e8b8f89ca1e37b6deab40facf1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffe0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c0f797e50418b95fa6013333917a9480
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffff0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a758de37c2ece2a02c73c01fedc9a132
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffff8000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3a9b87ae77bae706803966c66c73adbd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffc000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d365ab8df8ffd782e358121a4a4fc541
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffe000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c8dcd9e6f75e6c36c8daee0466f0ed74
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffff000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c79a637beb1c0304f14014c037e736dd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffff800000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 105f0a25e84ac930d996281a5f954dd9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffc00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 42e4074b2927973e8d17ffa92f7fe615
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffe00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4fe2a9d2c1824449c69e3e0398f12963
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffff00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b7f29c1e1f62847a15253b28a1e9d712
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffff80000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 36ed5d29b903f31e8983ef8b0a2bf990
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffc0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 27b8070270810f9d023f9dd7ff3b4aa2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffe0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 94d46e155c1228f61d1a0db4815ecc4b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffff0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ca6108d1d98071428eeceef1714b96dd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffff8000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dc5b25b71b6296cf73dd2cdcac2f70b1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffc000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 44aba95e8a06a2d9d3530d2677878c80
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffe000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a570d20e89b467e8f5176061b81dd396
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffff000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 758f4467a5d8f1e7307dc30b34e404f4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffff800000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: bcea28e9071b5a2302970ff352451bc5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffc00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7523c00bc177d331ad312e09c9015c1c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffe00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ccac61e3183747b3f5836da21a1bc4f4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffff00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 707b075791878880b44189d3522b8c30
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffff80000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7132d0c0e4a07593cf12ebb12be7688c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffc0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: effbac1644deb0c784275fe56e19ead3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffe0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a005063f30f4228b374e2459738f26bb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffff0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 29975b5f48bb68fcbbc7cea93b452ed7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffff8000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cf3f2576e2afedc74bb1ca7eeec1c0e7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffc000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 07c403f5f966e0e3d9f296d6226dca28
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffe000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c8c20908249ab4a34d6dd0a31327ff1a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffff000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c0541329ecb6159ab23b7fc5e6a21bca
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffff800000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7aa1acf1a2ed9ba72bc6deb31d88b863
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffc00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 808bd8eddabb6f3bf0d5a8a27be1fe8a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffe00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 273c7d7685e14ec66bbb96b8f05b6ddd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffff00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 32752eefc8c2a93f91b6e73eb07cca6e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffff80000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d893e7d62f6ce502c64f75e281f9c000
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffc0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8dfd999be5d0cfa35732c0ddc88ff5a5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffe0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 02647c76a300c3173b841487eb2bae9f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffff0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 172df8b02f04b53adab028b4e01acd87
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffff8000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 054b3bf4998aeb05afd87ec536533a36
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffc000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3783f7bf44c97f065258a666cae03020
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffe000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: aad4c8a63f80954104de7b92cede1be1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffff000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cbfe61810fd5467ccdacb75800f3ac07
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffff800000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 830d8a2590f7d8e1b55a737f4af45f34
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffc00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fffcd4683f858058e74314671d43fa2c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffe00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 523d0babbb82f46ebc9e70b1cd41ddd0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffff00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 344aab37080d7486f7d542a309e53eed
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffff80000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 56c5609d0906b23ab9caca816f5dbebd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffc0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7026026eedd91adc6d831cdf9894bdc6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffe0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 88330baa4f2b618fc9d9b021bf503d5a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffff0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fc9e0ea22480b0bac935c8a8ebefcdcf
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffff8000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 29ca779f398fb04f867da7e8a44756cb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffc000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 51f89c42985786bfc43c6df8ada36832
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffe000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6ac1de5fb8f21d874e91c53b560c50e3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffff000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 03aa9058490eda306001a8a9f48d0ca7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffff800000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e34ec71d6128d4871865d617c30b37e3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffc00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 14be1c535b17cabd0c4d93529d69bf47
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffe00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c9ef67756507beec9dd3862883478044
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffff00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 40e231fa5a5948ce2134e92fc0664d4b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffff80000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 03194b8e5dda5530d0c678c0b48f5d92
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffc0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 90bd086f237cc4fd99f4d76bde6b4826
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffe0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 19259761ca17130d6ed86d57cd7951ee
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffff0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d7cbb3f34b9b450f24b0e8518e54da6d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffff8000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 725b9caebe9f7f417f4068d0d2ee20b3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffc000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9d924b934a90ce1fd39b8a9794f82672
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffe000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c50562bf094526a91c5bc63c0c224995
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffff000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d2f11805046743bd74f57188d9188df7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffff800000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8dd274bd0f1b58ae345d9e7233f9b8f3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffc00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9d6bdc8f4ce5feb0f3bed2e4b9a9bb0b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffe00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fd5548bcf3f42565f7efa94562528d46
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffff00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d2ccaebd3a4c3e80b063748131ba4a71
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffff80000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e03cb23d9e11c9d93f117e9c0a91b576
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffc0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 78f933a2081ac1db84f69d10f4523fe0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffe0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4061f7412ed320de0edc8851c2e2436f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffff0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9064ba1cd04ce6bab98474330814b4d4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffff8000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 48391bffb9cfff80ac238c886ef0a461
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffc000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b8d2a67df5a999fdbf93edd0343296c9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffe000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: aaca7367396b69a221bd632bea386eec
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffff000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a80fd5020dfe65f5f16293ec92c6fd89
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffff800000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2162995b8217a67f1abc342e146406f8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffc00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c6a6164b7a60bae4e986ffac28dfadd9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffe00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 64e0d7f900e3d9c83e4b8f96717b2146
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffff00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1ad2561de8c1232f5d8dbab4739b6cbb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffff80000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 279689e9a557f58b1c3bf40c97a90964
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffc0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c4637e4a5e6377f9cc5a8638045de029
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffe0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 492e607e5aea4688594b45f3aee3df90
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffff0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e8c4e4381feec74054954c05b777a00a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffff8000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 91549514605f38246c9b724ad839f01d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffc000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 74b24e3b6fefe40a4f9ef7ac6e44d76a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffe000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2437a683dc5d4b52abb4a123a8df86c6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffff000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: bb2852c891c5947d2ed44032c421b85f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffff800000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1b9f5fbd5e8a4264c0a85b80409afa5e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffc00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 30dab809f85a917fe924733f424ac589
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffe00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: eaef5c1f8d605192646695ceadc65f32
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffff00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b8aa90040b4c15a12316b78e0f9586fc
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffff80000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 97fac8297ceaabc87d454350601e0673
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffc0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9b47ef567ac28dfe488492f157e2b2e0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffe0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1b8426027ddb962b5c5ba7eb8bc9ab63
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffff0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e917fc77e71992a12dbe4c18068bec82
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffff8000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dceebbc98840f8ae6daf76573b7e56f4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffc000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4e11a9f74205125b61e0aee047eca20d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffe000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f60467f55a1f17eab88e800120cbc284
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffff000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d436649f600b449ee276530f0cd83c11
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffff800000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3bc0e3656a9e3ac7cd378a737f53b637
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffc00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6bacae63d33b928aa8380f8d54d88c17
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffe00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8935ffbc75ae6251bf8e859f085adcb9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffff00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 93dc4970fe35f67747cb0562c06d875a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffff80000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 14f9df858975851797ba604fb0d16cc7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffc0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 02ea0c98dca10b38c21b3b14e8d1b71f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffe0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8f091b1b5b0749b2adc803e63dda9b72
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffff0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 05b389e3322c6da08384345a4137fd08
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffff8000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 381308c438f35b399f10ad71b05027d8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffc000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 68c230fcfa9279c3409fc423e2acbe04
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffe000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1c84a475acb011f3f59f4f46b76274c0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffff000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 45119b68cb3f8399ee60066b5611a4d7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffff800000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9423762f527a4060ffca312dcca22a16
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffc00000000
+IV: 00000000000000000000000000000000
+Ciphertext: f361a2745a33f056a5ac6ace2f08e344
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffe00000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5ef145766eca849f5d011536a6557fdb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff00000000
+IV: 00000000000000000000000000000000
+Ciphertext: c9af27b2c89c9b4cf4a0c4106ac80318
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff80000000
+IV: 00000000000000000000000000000000
+Ciphertext: fb9c4f16c621f4eab7e9ac1d7551dd57
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffc0000000
+IV: 00000000000000000000000000000000
+Ciphertext: 138e06fba466fa70854d8c2e524cffb2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffe0000000
+IV: 00000000000000000000000000000000
+Ciphertext: fb4bc78b225070773f04c40466d4e90c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff0000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8b2cbff1ed0150feda8a4799be94551f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff8000000
+IV: 00000000000000000000000000000000
+Ciphertext: 08b30d7b3f27962709a36bcadfb974bd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffc000000
+IV: 00000000000000000000000000000000
+Ciphertext: fdf6d32e044d77adcf37fb97ac213326
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffe000000
+IV: 00000000000000000000000000000000
+Ciphertext: 93cb284ecdcfd781a8afe32077949e88
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7b017bb02ec87b2b94c96e40a26fc71a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff800000
+IV: 00000000000000000000000000000000
+Ciphertext: c5c038b6990664ab08a3aaa5df9f3266
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffc00000
+IV: 00000000000000000000000000000000
+Ciphertext: 4b7020be37fab6259b2a27f4ec551576
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffe00000
+IV: 00000000000000000000000000000000
+Ciphertext: 60136703374f64e860b48ce31f930716
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff00000
+IV: 00000000000000000000000000000000
+Ciphertext: 8d63a269b14d506ccc401ab8a9f1b591
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff80000
+IV: 00000000000000000000000000000000
+Ciphertext: d317f81dc6aa454aee4bd4a5a5cff4bd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffc0000
+IV: 00000000000000000000000000000000
+Ciphertext: dddececd5354f04d530d76ed884246eb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffe0000
+IV: 00000000000000000000000000000000
+Ciphertext: 41c5205cc8fd8eda9a3cffd2518f365a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff0000
+IV: 00000000000000000000000000000000
+Ciphertext: cf42fb474293d96eca9db1b37b1ba676
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff8000
+IV: 00000000000000000000000000000000
+Ciphertext: a231692607169b4ecdead5cd3b10db3e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffc000
+IV: 00000000000000000000000000000000
+Ciphertext: ace4b91c9c669e77e7acacd19859ed49
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffe000
+IV: 00000000000000000000000000000000
+Ciphertext: 75db7cfd4a7b2b62ab78a48f3ddaf4af
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff000
+IV: 00000000000000000000000000000000
+Ciphertext: c1faba2d46e259cf480d7c38e4572a58
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff800
+IV: 00000000000000000000000000000000
+Ciphertext: 241c45bc6ae16dee6eb7bea128701582
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffc00
+IV: 00000000000000000000000000000000
+Ciphertext: 8fd03057cf1364420c2b78069a3e2502
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffe00
+IV: 00000000000000000000000000000000
+Ciphertext: ddb505e6cc1384cbaec1df90b80beb20
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff00
+IV: 00000000000000000000000000000000
+Ciphertext: 5674a3bed27bf4bd3622f9f5fe208306
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff80
+IV: 00000000000000000000000000000000
+Ciphertext: b687f26a89cfbfbb8e5eeac54055315e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffc0
+IV: 00000000000000000000000000000000
+Ciphertext: 0547dd32d3b29ab6a4caeb606c5b6f78
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffe0
+IV: 00000000000000000000000000000000
+Ciphertext: 186861f8bc5386d31fb77f720c3226e6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff0
+IV: 00000000000000000000000000000000
+Ciphertext: eacf1e6c4224efb38900b185ab1dfd42
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff8
+IV: 00000000000000000000000000000000
+Ciphertext: d241aab05a42d319de81d874f5c7b90d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffc
+IV: 00000000000000000000000000000000
+Ciphertext: 5eb9bc759e2ad8d2140a6c762ae9e1ab
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffe
+IV: 00000000000000000000000000000000
+Ciphertext: 018596e15e78e2c064159defce5f3085
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffff
+IV: 00000000000000000000000000000000
+Ciphertext: dd8a493514231cbf56eccee4c40889fb
+Plaintext: 00000000000000000000000000000000
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_var_txt.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_var_txt.txt
new file mode 100644
index 0000000..2340d2a
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_var_txt.txt
@@ -0,0 +1,1794 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCVarTxt192.rsp -extra-labels=Cipher=AES-192-CBC"
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 80000000000000000000000000000000
+Ciphertext: 6cd02513e8d4dc986b4afe087a60bd0c
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: c0000000000000000000000000000000
+Ciphertext: 2ce1f8b7e30627c1c4519eada44bc436
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: e0000000000000000000000000000000
+Ciphertext: 9946b5f87af446f5796c1fee63a2da24
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: f0000000000000000000000000000000
+Ciphertext: 2a560364ce529efc21788779568d5555
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: f8000000000000000000000000000000
+Ciphertext: 35c1471837af446153bce55d5ba72a0a
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fc000000000000000000000000000000
+Ciphertext: ce60bc52386234f158f84341e534cd9e
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fe000000000000000000000000000000
+Ciphertext: 8c7c27ff32bcf8dc2dc57c90c2903961
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ff000000000000000000000000000000
+Ciphertext: 32bb6a7ec84499e166f936003d55a5bb
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ff800000000000000000000000000000
+Ciphertext: a5c772e5c62631ef660ee1d5877f6d1b
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffc00000000000000000000000000000
+Ciphertext: 030d7e5b64f380a7e4ea5387b5cd7f49
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffe00000000000000000000000000000
+Ciphertext: 0dc9a2610037009b698f11bb7e86c83e
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fff00000000000000000000000000000
+Ciphertext: 0046612c766d1840c226364f1fa7ed72
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fff80000000000000000000000000000
+Ciphertext: 4880c7e08f27befe78590743c05e698b
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffc0000000000000000000000000000
+Ciphertext: 2520ce829a26577f0f4822c4ecc87401
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffe0000000000000000000000000000
+Ciphertext: 8765e8acc169758319cb46dc7bcf3dca
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffff0000000000000000000000000000
+Ciphertext: e98f4ba4f073df4baa116d011dc24a28
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffff8000000000000000000000000000
+Ciphertext: f378f68c5dbf59e211b3a659a7317d94
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffc000000000000000000000000000
+Ciphertext: 283d3b069d8eb9fb432d74b96ca762b4
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffe000000000000000000000000000
+Ciphertext: a7e1842e8a87861c221a500883245c51
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffff000000000000000000000000000
+Ciphertext: 77aa270471881be070fb52c7067ce732
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffff800000000000000000000000000
+Ciphertext: 01b0f476d484f43f1aeb6efa9361a8ac
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffc00000000000000000000000000
+Ciphertext: 1c3a94f1c052c55c2d8359aff2163b4f
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffe00000000000000000000000000
+Ciphertext: e8a067b604d5373d8b0f2e05a03b341b
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffff00000000000000000000000000
+Ciphertext: a7876ec87f5a09bfea42c77da30fd50e
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffff80000000000000000000000000
+Ciphertext: 0cf3e9d3a42be5b854ca65b13f35f48d
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffc0000000000000000000000000
+Ciphertext: 6c62f6bbcab7c3e821c9290f08892dda
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffe0000000000000000000000000
+Ciphertext: 7f5e05bd2068738196fee79ace7e3aec
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffff0000000000000000000000000
+Ciphertext: 440e0d733255cda92fb46e842fe58054
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffff8000000000000000000000000
+Ciphertext: aa5d5b1c4ea1b7a22e5583ac2e9ed8a7
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffc000000000000000000000000
+Ciphertext: 77e537e89e8491e8662aae3bc809421d
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffe000000000000000000000000
+Ciphertext: 997dd3e9f1598bfa73f75973f7e93b76
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffff000000000000000000000000
+Ciphertext: 1b38d4f7452afefcb7fc721244e4b72e
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffff800000000000000000000000
+Ciphertext: 0be2b18252e774dda30cdda02c6906e3
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffc00000000000000000000000
+Ciphertext: d2695e59c20361d82652d7d58b6f11b2
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffe00000000000000000000000
+Ciphertext: 902d88d13eae52089abd6143cfe394e9
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffff00000000000000000000000
+Ciphertext: d49bceb3b823fedd602c305345734bd2
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffff80000000000000000000000
+Ciphertext: 707b1dbb0ffa40ef7d95def421233fae
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffc0000000000000000000000
+Ciphertext: 7ca0c1d93356d9eb8aa952084d75f913
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffe0000000000000000000000
+Ciphertext: f2cbf9cb186e270dd7bdb0c28febc57d
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffff0000000000000000000000
+Ciphertext: c94337c37c4e790ab45780bd9c3674a0
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffff8000000000000000000000
+Ciphertext: 8e3558c135252fb9c9f367ed609467a1
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffc000000000000000000000
+Ciphertext: 1b72eeaee4899b443914e5b3a57fba92
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffe000000000000000000000
+Ciphertext: 011865f91bc56868d051e52c9efd59b7
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffff000000000000000000000
+Ciphertext: e4771318ad7a63dd680f6e583b7747ea
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffff800000000000000000000
+Ciphertext: 61e3d194088dc8d97e9e6db37457eac5
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffc00000000000000000000
+Ciphertext: 36ff1ec9ccfbc349e5d356d063693ad6
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffe00000000000000000000
+Ciphertext: 3cc9e9a9be8cc3f6fb2ea24088e9bb19
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffff00000000000000000000
+Ciphertext: 1ee5ab003dc8722e74905d9a8fe3d350
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffff80000000000000000000
+Ciphertext: 245339319584b0a412412869d6c2eada
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffc0000000000000000000
+Ciphertext: 7bd496918115d14ed5380852716c8814
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffe0000000000000000000
+Ciphertext: 273ab2f2b4a366a57d582a339313c8b1
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffff0000000000000000000
+Ciphertext: 113365a9ffbe3b0ca61e98507554168b
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffff8000000000000000000
+Ciphertext: afa99c997ac478a0dea4119c9e45f8b1
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffc000000000000000000
+Ciphertext: 9216309a7842430b83ffb98638011512
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffe000000000000000000
+Ciphertext: 62abc792288258492a7cb45145f4b759
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffff000000000000000000
+Ciphertext: 534923c169d504d7519c15d30e756c50
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffff800000000000000000
+Ciphertext: fa75e05bcdc7e00c273fa33f6ee441d2
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffc00000000000000000
+Ciphertext: 7d350fa6057080f1086a56b17ec240db
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffe00000000000000000
+Ciphertext: f34e4a6324ea4a5c39a661c8fe5ada8f
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffff00000000000000000
+Ciphertext: 0882a16f44088d42447a29ac090ec17e
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffff80000000000000000
+Ciphertext: 3a3c15bfc11a9537c130687004e136ee
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffc0000000000000000
+Ciphertext: 22c0a7678dc6d8cf5c8a6d5a9960767c
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffe0000000000000000
+Ciphertext: b46b09809d68b9a456432a79bdc2e38c
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffff0000000000000000
+Ciphertext: 93baaffb35fbe739c17c6ac22eecf18f
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffff8000000000000000
+Ciphertext: c8aa80a7850675bc007c46df06b49868
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffc000000000000000
+Ciphertext: 12c6f3877af421a918a84b775858021d
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffe000000000000000
+Ciphertext: 33f123282c5d633924f7d5ba3f3cab11
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffff000000000000000
+Ciphertext: a8f161002733e93ca4527d22c1a0c5bb
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffff800000000000000
+Ciphertext: b72f70ebf3e3fda23f508eec76b42c02
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffc00000000000000
+Ciphertext: 6a9d965e6274143f25afdcfc88ffd77c
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffe00000000000000
+Ciphertext: a0c74fd0b9361764ce91c5200b095357
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffff00000000000000
+Ciphertext: 091d1fdc2bd2c346cd5046a8c6209146
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffff80000000000000
+Ciphertext: e2a37580116cfb71856254496ab0aca8
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffc0000000000000
+Ciphertext: e0b3a00785917c7efc9adba322813571
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffe0000000000000
+Ciphertext: 733d41f4727b5ef0df4af4cf3cffa0cb
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffff0000000000000
+Ciphertext: a99ebb030260826f981ad3e64490aa4f
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffff8000000000000
+Ciphertext: 73f34c7d3eae5e80082c1647524308ee
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffc000000000000
+Ciphertext: 40ebd5ad082345b7a2097ccd3464da02
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffe000000000000
+Ciphertext: 7cc4ae9a424b2cec90c97153c2457ec5
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffff000000000000
+Ciphertext: 54d632d03aba0bd0f91877ebdd4d09cb
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffff800000000000
+Ciphertext: d3427be7e4d27cd54f5fe37b03cf0897
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffc00000000000
+Ciphertext: b2099795e88cc158fd75ea133d7e7fbe
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffe00000000000
+Ciphertext: a6cae46fb6fadfe7a2c302a34242817b
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffff00000000000
+Ciphertext: 026a7024d6a902e0b3ffccbaa910cc3f
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffff80000000000
+Ciphertext: 156f07767a85a4312321f63968338a01
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffc0000000000
+Ciphertext: 15eec9ebf42b9ca76897d2cd6c5a12e2
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffe0000000000
+Ciphertext: db0d3a6fdcc13f915e2b302ceeb70fd8
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffff0000000000
+Ciphertext: 71dbf37e87a2e34d15b20e8f10e48924
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffff8000000000
+Ciphertext: c745c451e96ff3c045e4367c833e3b54
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffc000000000
+Ciphertext: 340da09c2dd11c3b679d08ccd27dd595
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffe000000000
+Ciphertext: 8279f7c0c2a03ee660c6d392db025d18
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffff000000000
+Ciphertext: a4b2c7d8eba531ff47c5041a55fbd1ec
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffff800000000
+Ciphertext: 74569a2ca5a7bd5131ce8dc7cbfbf72f
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffc00000000
+Ciphertext: 3713da0c0219b63454035613b5a403dd
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffe00000000
+Ciphertext: 8827551ddcc9df23fa72a3de4e9f0b07
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffff00000000
+Ciphertext: 2e3febfd625bfcd0a2c06eb460da1732
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffff80000000
+Ciphertext: ee82e6ba488156f76496311da6941deb
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffc0000000
+Ciphertext: 4770446f01d1f391256e85a1b30d89d3
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffe0000000
+Ciphertext: af04b68f104f21ef2afb4767cf74143c
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffff0000000
+Ciphertext: cf3579a9ba38c8e43653173e14f3a4c6
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffff8000000
+Ciphertext: b3bba904f4953e09b54800af2f62e7d4
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffc000000
+Ciphertext: fc4249656e14b29eb9c44829b4c59a46
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffe000000
+Ciphertext: 9b31568febe81cfc2e65af1c86d1a308
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffff000000
+Ciphertext: 9ca09c25f273a766db98a480ce8dfedc
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffff800000
+Ciphertext: b909925786f34c3c92d971883c9fbedf
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffc00000
+Ciphertext: 82647f1332fe570a9d4d92b2ee771d3b
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffe00000
+Ciphertext: 3604a7e80832b3a99954bca6f5b9f501
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffff00000
+Ciphertext: 884607b128c5de3ab39a529a1ef51bef
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffff80000
+Ciphertext: 670cfa093d1dbdb2317041404102435e
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffc0000
+Ciphertext: 7a867195f3ce8769cbd336502fbb5130
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffe0000
+Ciphertext: 52efcf64c72b2f7ca5b3c836b1078c15
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffff0000
+Ciphertext: 4019250f6eefb2ac5ccbcae044e75c7e
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffff8000
+Ciphertext: 022c4f6f5a017d292785627667ddef24
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffc000
+Ciphertext: e9c21078a2eb7e03250f71000fa9e3ed
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffe000
+Ciphertext: a13eaeeb9cd391da4e2b09490b3e7fad
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffff000
+Ciphertext: c958a171dca1d4ed53e1af1d380803a9
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffff800
+Ciphertext: 21442e07a110667f2583eaeeee44dc8c
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffc00
+Ciphertext: 59bbb353cf1dd867a6e33737af655e99
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffe00
+Ciphertext: 43cd3b25375d0ce41087ff9fe2829639
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffff00
+Ciphertext: 6b98b17e80d1118e3516bd768b285a84
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffff80
+Ciphertext: ae47ed3676ca0c08deea02d95b81db58
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffffc0
+Ciphertext: 34ec40dc20413795ed53628ea748720b
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffffe0
+Ciphertext: 4dc68163f8e9835473253542c8a65d46
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffff0
+Ciphertext: 2aabb999f43693175af65c6c612c46fb
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffff8
+Ciphertext: e01f94499dac3547515c5b1d756f0f58
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffffc
+Ciphertext: 9d12435a46480ce00ea349f71799df9a
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffffe
+Ciphertext: cef41d16d266bdfe46938ad7884cc0cf
+
+Cipher: AES-192-CBC
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffffff
+Ciphertext: b13db4da1f718bc6904797c82bcf2d32
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6cd02513e8d4dc986b4afe087a60bd0c
+Plaintext: 80000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2ce1f8b7e30627c1c4519eada44bc436
+Plaintext: c0000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9946b5f87af446f5796c1fee63a2da24
+Plaintext: e0000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2a560364ce529efc21788779568d5555
+Plaintext: f0000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 35c1471837af446153bce55d5ba72a0a
+Plaintext: f8000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ce60bc52386234f158f84341e534cd9e
+Plaintext: fc000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8c7c27ff32bcf8dc2dc57c90c2903961
+Plaintext: fe000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 32bb6a7ec84499e166f936003d55a5bb
+Plaintext: ff000000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a5c772e5c62631ef660ee1d5877f6d1b
+Plaintext: ff800000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 030d7e5b64f380a7e4ea5387b5cd7f49
+Plaintext: ffc00000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0dc9a2610037009b698f11bb7e86c83e
+Plaintext: ffe00000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0046612c766d1840c226364f1fa7ed72
+Plaintext: fff00000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4880c7e08f27befe78590743c05e698b
+Plaintext: fff80000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2520ce829a26577f0f4822c4ecc87401
+Plaintext: fffc0000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8765e8acc169758319cb46dc7bcf3dca
+Plaintext: fffe0000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e98f4ba4f073df4baa116d011dc24a28
+Plaintext: ffff0000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f378f68c5dbf59e211b3a659a7317d94
+Plaintext: ffff8000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 283d3b069d8eb9fb432d74b96ca762b4
+Plaintext: ffffc000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a7e1842e8a87861c221a500883245c51
+Plaintext: ffffe000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 77aa270471881be070fb52c7067ce732
+Plaintext: fffff000000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 01b0f476d484f43f1aeb6efa9361a8ac
+Plaintext: fffff800000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1c3a94f1c052c55c2d8359aff2163b4f
+Plaintext: fffffc00000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e8a067b604d5373d8b0f2e05a03b341b
+Plaintext: fffffe00000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a7876ec87f5a09bfea42c77da30fd50e
+Plaintext: ffffff00000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0cf3e9d3a42be5b854ca65b13f35f48d
+Plaintext: ffffff80000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6c62f6bbcab7c3e821c9290f08892dda
+Plaintext: ffffffc0000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7f5e05bd2068738196fee79ace7e3aec
+Plaintext: ffffffe0000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 440e0d733255cda92fb46e842fe58054
+Plaintext: fffffff0000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: aa5d5b1c4ea1b7a22e5583ac2e9ed8a7
+Plaintext: fffffff8000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 77e537e89e8491e8662aae3bc809421d
+Plaintext: fffffffc000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 997dd3e9f1598bfa73f75973f7e93b76
+Plaintext: fffffffe000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1b38d4f7452afefcb7fc721244e4b72e
+Plaintext: ffffffff000000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0be2b18252e774dda30cdda02c6906e3
+Plaintext: ffffffff800000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d2695e59c20361d82652d7d58b6f11b2
+Plaintext: ffffffffc00000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 902d88d13eae52089abd6143cfe394e9
+Plaintext: ffffffffe00000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d49bceb3b823fedd602c305345734bd2
+Plaintext: fffffffff00000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 707b1dbb0ffa40ef7d95def421233fae
+Plaintext: fffffffff80000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7ca0c1d93356d9eb8aa952084d75f913
+Plaintext: fffffffffc0000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f2cbf9cb186e270dd7bdb0c28febc57d
+Plaintext: fffffffffe0000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c94337c37c4e790ab45780bd9c3674a0
+Plaintext: ffffffffff0000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8e3558c135252fb9c9f367ed609467a1
+Plaintext: ffffffffff8000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1b72eeaee4899b443914e5b3a57fba92
+Plaintext: ffffffffffc000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 011865f91bc56868d051e52c9efd59b7
+Plaintext: ffffffffffe000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e4771318ad7a63dd680f6e583b7747ea
+Plaintext: fffffffffff000000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 61e3d194088dc8d97e9e6db37457eac5
+Plaintext: fffffffffff800000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 36ff1ec9ccfbc349e5d356d063693ad6
+Plaintext: fffffffffffc00000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3cc9e9a9be8cc3f6fb2ea24088e9bb19
+Plaintext: fffffffffffe00000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1ee5ab003dc8722e74905d9a8fe3d350
+Plaintext: ffffffffffff00000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 245339319584b0a412412869d6c2eada
+Plaintext: ffffffffffff80000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7bd496918115d14ed5380852716c8814
+Plaintext: ffffffffffffc0000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 273ab2f2b4a366a57d582a339313c8b1
+Plaintext: ffffffffffffe0000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 113365a9ffbe3b0ca61e98507554168b
+Plaintext: fffffffffffff0000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: afa99c997ac478a0dea4119c9e45f8b1
+Plaintext: fffffffffffff8000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9216309a7842430b83ffb98638011512
+Plaintext: fffffffffffffc000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 62abc792288258492a7cb45145f4b759
+Plaintext: fffffffffffffe000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 534923c169d504d7519c15d30e756c50
+Plaintext: ffffffffffffff000000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fa75e05bcdc7e00c273fa33f6ee441d2
+Plaintext: ffffffffffffff800000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7d350fa6057080f1086a56b17ec240db
+Plaintext: ffffffffffffffc00000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f34e4a6324ea4a5c39a661c8fe5ada8f
+Plaintext: ffffffffffffffe00000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0882a16f44088d42447a29ac090ec17e
+Plaintext: fffffffffffffff00000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3a3c15bfc11a9537c130687004e136ee
+Plaintext: fffffffffffffff80000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 22c0a7678dc6d8cf5c8a6d5a9960767c
+Plaintext: fffffffffffffffc0000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b46b09809d68b9a456432a79bdc2e38c
+Plaintext: fffffffffffffffe0000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 93baaffb35fbe739c17c6ac22eecf18f
+Plaintext: ffffffffffffffff0000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c8aa80a7850675bc007c46df06b49868
+Plaintext: ffffffffffffffff8000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 12c6f3877af421a918a84b775858021d
+Plaintext: ffffffffffffffffc000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 33f123282c5d633924f7d5ba3f3cab11
+Plaintext: ffffffffffffffffe000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a8f161002733e93ca4527d22c1a0c5bb
+Plaintext: fffffffffffffffff000000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b72f70ebf3e3fda23f508eec76b42c02
+Plaintext: fffffffffffffffff800000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6a9d965e6274143f25afdcfc88ffd77c
+Plaintext: fffffffffffffffffc00000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a0c74fd0b9361764ce91c5200b095357
+Plaintext: fffffffffffffffffe00000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 091d1fdc2bd2c346cd5046a8c6209146
+Plaintext: ffffffffffffffffff00000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e2a37580116cfb71856254496ab0aca8
+Plaintext: ffffffffffffffffff80000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e0b3a00785917c7efc9adba322813571
+Plaintext: ffffffffffffffffffc0000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 733d41f4727b5ef0df4af4cf3cffa0cb
+Plaintext: ffffffffffffffffffe0000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a99ebb030260826f981ad3e64490aa4f
+Plaintext: fffffffffffffffffff0000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 73f34c7d3eae5e80082c1647524308ee
+Plaintext: fffffffffffffffffff8000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 40ebd5ad082345b7a2097ccd3464da02
+Plaintext: fffffffffffffffffffc000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7cc4ae9a424b2cec90c97153c2457ec5
+Plaintext: fffffffffffffffffffe000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 54d632d03aba0bd0f91877ebdd4d09cb
+Plaintext: ffffffffffffffffffff000000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d3427be7e4d27cd54f5fe37b03cf0897
+Plaintext: ffffffffffffffffffff800000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b2099795e88cc158fd75ea133d7e7fbe
+Plaintext: ffffffffffffffffffffc00000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a6cae46fb6fadfe7a2c302a34242817b
+Plaintext: ffffffffffffffffffffe00000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 026a7024d6a902e0b3ffccbaa910cc3f
+Plaintext: fffffffffffffffffffff00000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 156f07767a85a4312321f63968338a01
+Plaintext: fffffffffffffffffffff80000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 15eec9ebf42b9ca76897d2cd6c5a12e2
+Plaintext: fffffffffffffffffffffc0000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: db0d3a6fdcc13f915e2b302ceeb70fd8
+Plaintext: fffffffffffffffffffffe0000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 71dbf37e87a2e34d15b20e8f10e48924
+Plaintext: ffffffffffffffffffffff0000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c745c451e96ff3c045e4367c833e3b54
+Plaintext: ffffffffffffffffffffff8000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 340da09c2dd11c3b679d08ccd27dd595
+Plaintext: ffffffffffffffffffffffc000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8279f7c0c2a03ee660c6d392db025d18
+Plaintext: ffffffffffffffffffffffe000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a4b2c7d8eba531ff47c5041a55fbd1ec
+Plaintext: fffffffffffffffffffffff000000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 74569a2ca5a7bd5131ce8dc7cbfbf72f
+Plaintext: fffffffffffffffffffffff800000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3713da0c0219b63454035613b5a403dd
+Plaintext: fffffffffffffffffffffffc00000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8827551ddcc9df23fa72a3de4e9f0b07
+Plaintext: fffffffffffffffffffffffe00000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2e3febfd625bfcd0a2c06eb460da1732
+Plaintext: ffffffffffffffffffffffff00000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ee82e6ba488156f76496311da6941deb
+Plaintext: ffffffffffffffffffffffff80000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4770446f01d1f391256e85a1b30d89d3
+Plaintext: ffffffffffffffffffffffffc0000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: af04b68f104f21ef2afb4767cf74143c
+Plaintext: ffffffffffffffffffffffffe0000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cf3579a9ba38c8e43653173e14f3a4c6
+Plaintext: fffffffffffffffffffffffff0000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b3bba904f4953e09b54800af2f62e7d4
+Plaintext: fffffffffffffffffffffffff8000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fc4249656e14b29eb9c44829b4c59a46
+Plaintext: fffffffffffffffffffffffffc000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9b31568febe81cfc2e65af1c86d1a308
+Plaintext: fffffffffffffffffffffffffe000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9ca09c25f273a766db98a480ce8dfedc
+Plaintext: ffffffffffffffffffffffffff000000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b909925786f34c3c92d971883c9fbedf
+Plaintext: ffffffffffffffffffffffffff800000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 82647f1332fe570a9d4d92b2ee771d3b
+Plaintext: ffffffffffffffffffffffffffc00000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3604a7e80832b3a99954bca6f5b9f501
+Plaintext: ffffffffffffffffffffffffffe00000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 884607b128c5de3ab39a529a1ef51bef
+Plaintext: fffffffffffffffffffffffffff00000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 670cfa093d1dbdb2317041404102435e
+Plaintext: fffffffffffffffffffffffffff80000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7a867195f3ce8769cbd336502fbb5130
+Plaintext: fffffffffffffffffffffffffffc0000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 52efcf64c72b2f7ca5b3c836b1078c15
+Plaintext: fffffffffffffffffffffffffffe0000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4019250f6eefb2ac5ccbcae044e75c7e
+Plaintext: ffffffffffffffffffffffffffff0000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 022c4f6f5a017d292785627667ddef24
+Plaintext: ffffffffffffffffffffffffffff8000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e9c21078a2eb7e03250f71000fa9e3ed
+Plaintext: ffffffffffffffffffffffffffffc000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a13eaeeb9cd391da4e2b09490b3e7fad
+Plaintext: ffffffffffffffffffffffffffffe000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c958a171dca1d4ed53e1af1d380803a9
+Plaintext: fffffffffffffffffffffffffffff000
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 21442e07a110667f2583eaeeee44dc8c
+Plaintext: fffffffffffffffffffffffffffff800
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 59bbb353cf1dd867a6e33737af655e99
+Plaintext: fffffffffffffffffffffffffffffc00
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 43cd3b25375d0ce41087ff9fe2829639
+Plaintext: fffffffffffffffffffffffffffffe00
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6b98b17e80d1118e3516bd768b285a84
+Plaintext: ffffffffffffffffffffffffffffff00
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ae47ed3676ca0c08deea02d95b81db58
+Plaintext: ffffffffffffffffffffffffffffff80
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 34ec40dc20413795ed53628ea748720b
+Plaintext: ffffffffffffffffffffffffffffffc0
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4dc68163f8e9835473253542c8a65d46
+Plaintext: ffffffffffffffffffffffffffffffe0
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2aabb999f43693175af65c6c612c46fb
+Plaintext: fffffffffffffffffffffffffffffff0
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e01f94499dac3547515c5b1d756f0f58
+Plaintext: fffffffffffffffffffffffffffffff8
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9d12435a46480ce00ea349f71799df9a
+Plaintext: fffffffffffffffffffffffffffffffc
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cef41d16d266bdfe46938ad7884cc0cf
+Plaintext: fffffffffffffffffffffffffffffffe
+
+Cipher: AES-192-CBC
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b13db4da1f718bc6904797c82bcf2d32
+Plaintext: ffffffffffffffffffffffffffffffff
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_gf_sbox.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_gf_sbox.txt
new file mode 100644
index 0000000..6314f8f
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_gf_sbox.txt
@@ -0,0 +1,86 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCGFSbox192.rsp -extra-labels=Cipher=AES-192-CTR -swap-iv-plaintext"
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 1b077a6af4b7f98229de786d7516b639
+Ciphertext: 275cfc0413d8ccb70513c3859b1d0f72
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 9c2d8842e5f48f57648205d39a239af1
+Ciphertext: c9b8135ff1b5adc413dfd053b21bd96d
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: bff52510095f518ecca60af4205444bb
+Ciphertext: 4a3650c3371ce2eb35e389a171427440
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 51719783d3185a535bd75adc65071ce1
+Ciphertext: 4f354592ff7c8847d2d0870ca9481b7c
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 26aa49dcfe7629a8901a69a9914e6dfd
+Ciphertext: d5e08bf9a182e857cf40b3a36ee248cc
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 941a4773058224e1ef66d10e0a6ee782
+Ciphertext: 067cd9d3749207791841562507fa9626
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 275cfc0413d8ccb70513c3859b1d0f72
+IV: 1b077a6af4b7f98229de786d7516b639
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c9b8135ff1b5adc413dfd053b21bd96d
+IV: 9c2d8842e5f48f57648205d39a239af1
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4a3650c3371ce2eb35e389a171427440
+IV: bff52510095f518ecca60af4205444bb
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4f354592ff7c8847d2d0870ca9481b7c
+IV: 51719783d3185a535bd75adc65071ce1
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d5e08bf9a182e857cf40b3a36ee248cc
+IV: 26aa49dcfe7629a8901a69a9914e6dfd
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 067cd9d3749207791841562507fa9626
+IV: 941a4773058224e1ef66d10e0a6ee782
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_key_sbox.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_key_sbox.txt
new file mode 100644
index 0000000..5f12a64
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_key_sbox.txt
@@ -0,0 +1,338 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCKeySbox192.rsp -extra-labels=Cipher=AES-192-CTR"
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: e9f065d7c13573587f7875357dfbb16c53489f6a4bd0f7cd
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0956259c9cd5cfd0181cca53380cde06
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 15d20f6ebc7e649fd95b76b107e6daba967c8a9484797f29
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8e4e18424e591a3d5b6f0876f16f8594
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: a8a282ee31c03fae4f8e9b8930d5473c2ed695a347e88b7c
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 93f3270cfc877ef17e106ce938979cb0
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: cd62376d5ebb414917f0c78f05266433dc9192a1ec943300
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7f6c25ff41858561bb62f36492e93c29
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 502a6ab36984af268bf423c7f509205207fc1552af4a91e5
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8e06556dcbb00b809a025047cff2a940
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 25a39dbfd8034f71a81f9ceb55026e4037f8f6aa30ab44ce
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3608c344868e94555d23a120f8a5502d
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: e08c15411774ec4a908b64eadc6ac4199c7cd453f3aaef53
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 77da2021935b840b7f5dcc39132da9e5
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 3b375a1ff7e8d44409696e6326ec9dec86138e2ae010b980
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3b7c24f825e3bf9873c9f14d39a0e6f4
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 950bb9f22cc35be6fe79f52c320af93dec5bc9c0c2f9cd53
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 64ebf95686b353508c90ecd8b6134316
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 7001c487cc3e572cfc92f4d0e697d982e8856fdcc957da40
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ff558c5d27210b7929b73fc708eb4cf1
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: f029ce61d4e5a405b41ead0a883cc6a737da2cf50a6c92ae
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a2c3b2a818075490a7b4c14380f02702
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 61257134a518a0d57d9d244d45f6498cbc32f2bafc522d79
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cfe4d74002696ccf7d87b14a2f9cafc9
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: b0ab0a6a818baef2d11fa33eac947284fb7d748cfb75e570
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d2eafd86f63b109b91f5dbb3a3fb7e13
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ee053aa011c8b428cdcc3636313c54d6a03cac01c71579d6
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9b9fdd1c5975655f539998b306a324af
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: d2926527e0aa9f37b45e2ec2ade5853ef807576104c7ace3
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dd619e1cf204446112e0af2b9afa8f8c
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 982215f4e173dfa0fcffe5d3da41c4812c7bcc8ed3540f93
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d4f0aae13c8fe9339fbf9e69ed0ad74d
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 98c6b8e01e379fbd14e61af6af891596583565f2a27d59e9
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 19c80ec4a6deb7e5ed1033dda933498f
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: b3ad5cea1dddc214ca969ac35f37dae1a9a9d1528f89bb35
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3cf5e1d21a17956d1dffad6a7c41c659
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 45899367c3132849763073c435a9288a766c8b9ec2308516
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 69fd12e8505f8ded2fdcb197a121b362
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ec250e04c3903f602647b85a401a1ae7ca2f02f67fa4253e
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8aa584e2cc4d17417a97cb9a28ba29c8
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: d077a03bd8a38973928ccafe4a9d2f455130bd0af5ae46a9
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: abc786fb1edb504580c4d882ef29a0c7
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: d184c36cf0dddfec39e654195006022237871a47c33d3198
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2e19fb60a3e1de0166f483c97824a978
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 4c6994ffa9dcdc805b60c2c0095334c42d95a8fc0ca5b080
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7656709538dd5fec41e0ce6a0f8e207d
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: c88f5b00a4ef9a6840e2acaf33f00a3bdc4e25895303fa72
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a67cf333b314d411d3c0ae6e1cfcd8f5
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: e9f065d7c13573587f7875357dfbb16c53489f6a4bd0f7cd
+IV: 00000000000000000000000000000000
+Ciphertext: 0956259c9cd5cfd0181cca53380cde06
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 15d20f6ebc7e649fd95b76b107e6daba967c8a9484797f29
+IV: 00000000000000000000000000000000
+Ciphertext: 8e4e18424e591a3d5b6f0876f16f8594
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: a8a282ee31c03fae4f8e9b8930d5473c2ed695a347e88b7c
+IV: 00000000000000000000000000000000
+Ciphertext: 93f3270cfc877ef17e106ce938979cb0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: cd62376d5ebb414917f0c78f05266433dc9192a1ec943300
+IV: 00000000000000000000000000000000
+Ciphertext: 7f6c25ff41858561bb62f36492e93c29
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 502a6ab36984af268bf423c7f509205207fc1552af4a91e5
+IV: 00000000000000000000000000000000
+Ciphertext: 8e06556dcbb00b809a025047cff2a940
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 25a39dbfd8034f71a81f9ceb55026e4037f8f6aa30ab44ce
+IV: 00000000000000000000000000000000
+Ciphertext: 3608c344868e94555d23a120f8a5502d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: e08c15411774ec4a908b64eadc6ac4199c7cd453f3aaef53
+IV: 00000000000000000000000000000000
+Ciphertext: 77da2021935b840b7f5dcc39132da9e5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 3b375a1ff7e8d44409696e6326ec9dec86138e2ae010b980
+IV: 00000000000000000000000000000000
+Ciphertext: 3b7c24f825e3bf9873c9f14d39a0e6f4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 950bb9f22cc35be6fe79f52c320af93dec5bc9c0c2f9cd53
+IV: 00000000000000000000000000000000
+Ciphertext: 64ebf95686b353508c90ecd8b6134316
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 7001c487cc3e572cfc92f4d0e697d982e8856fdcc957da40
+IV: 00000000000000000000000000000000
+Ciphertext: ff558c5d27210b7929b73fc708eb4cf1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: f029ce61d4e5a405b41ead0a883cc6a737da2cf50a6c92ae
+IV: 00000000000000000000000000000000
+Ciphertext: a2c3b2a818075490a7b4c14380f02702
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 61257134a518a0d57d9d244d45f6498cbc32f2bafc522d79
+IV: 00000000000000000000000000000000
+Ciphertext: cfe4d74002696ccf7d87b14a2f9cafc9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: b0ab0a6a818baef2d11fa33eac947284fb7d748cfb75e570
+IV: 00000000000000000000000000000000
+Ciphertext: d2eafd86f63b109b91f5dbb3a3fb7e13
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ee053aa011c8b428cdcc3636313c54d6a03cac01c71579d6
+IV: 00000000000000000000000000000000
+Ciphertext: 9b9fdd1c5975655f539998b306a324af
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: d2926527e0aa9f37b45e2ec2ade5853ef807576104c7ace3
+IV: 00000000000000000000000000000000
+Ciphertext: dd619e1cf204446112e0af2b9afa8f8c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 982215f4e173dfa0fcffe5d3da41c4812c7bcc8ed3540f93
+IV: 00000000000000000000000000000000
+Ciphertext: d4f0aae13c8fe9339fbf9e69ed0ad74d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 98c6b8e01e379fbd14e61af6af891596583565f2a27d59e9
+IV: 00000000000000000000000000000000
+Ciphertext: 19c80ec4a6deb7e5ed1033dda933498f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: b3ad5cea1dddc214ca969ac35f37dae1a9a9d1528f89bb35
+IV: 00000000000000000000000000000000
+Ciphertext: 3cf5e1d21a17956d1dffad6a7c41c659
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 45899367c3132849763073c435a9288a766c8b9ec2308516
+IV: 00000000000000000000000000000000
+Ciphertext: 69fd12e8505f8ded2fdcb197a121b362
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ec250e04c3903f602647b85a401a1ae7ca2f02f67fa4253e
+IV: 00000000000000000000000000000000
+Ciphertext: 8aa584e2cc4d17417a97cb9a28ba29c8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: d077a03bd8a38973928ccafe4a9d2f455130bd0af5ae46a9
+IV: 00000000000000000000000000000000
+Ciphertext: abc786fb1edb504580c4d882ef29a0c7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: d184c36cf0dddfec39e654195006022237871a47c33d3198
+IV: 00000000000000000000000000000000
+Ciphertext: 2e19fb60a3e1de0166f483c97824a978
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 4c6994ffa9dcdc805b60c2c0095334c42d95a8fc0ca5b080
+IV: 00000000000000000000000000000000
+Ciphertext: 7656709538dd5fec41e0ce6a0f8e207d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: c88f5b00a4ef9a6840e2acaf33f00a3bdc4e25895303fa72
+IV: 00000000000000000000000000000000
+Ciphertext: a67cf333b314d411d3c0ae6e1cfcd8f5
+Plaintext: 00000000000000000000000000000000
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_var_key.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_var_key.txt
new file mode 100644
index 0000000..a859e62
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_var_key.txt
@@ -0,0 +1,2690 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCVarKey192.rsp -extra-labels=Cipher=AES-192-CTR"
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 800000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: de885dc87f5a92594082d02cc1e1b42c
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: c00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 132b074e80f2a597bf5febd8ea5da55e
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: e00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6eccedf8de592c22fb81347b79f2db1f
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: f00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 180b09f267c45145db2f826c2582d35c
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: f80000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: edd807ef7652d7eb0e13c8b5e15b3bc0
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fc0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9978bcf8dd8fd72241223ad24b31b8a4
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fe0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5310f654343e8f27e12c83a48d24ff81
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ff0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 833f71258d53036b02952c76c744f5a1
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ff8000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: eba83ff200cff9318a92f8691a06b09f
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffc000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ff620ccbe9f3292abdf2176b09f04eba
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffe000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7ababc4b3f516c9aafb35f4140b548f9
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fff000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: aa187824d9c4582b0916493ecbde8c57
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fff800000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1c0ad553177fd5ea1092c9d626a29dc4
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffc00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a5dc46c37261194124ecaebd680408ec
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffe00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e4f2f2ae23e9b10bacfa58601531ba54
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffff00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b7d67cf1a1e91e8ff3a57a172c7bf412
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffff80000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 26706be06967884e847d137128ce47b3
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffc0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b2f8b409b0585909aad3a7b5a219072a
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffe0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5e4b7bff0290c78344c54a23b722cd20
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffff0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 07093657552d4414227ce161e9ebf7dd
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffff8000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e1af1e7d8bc225ed4dffb771ecbb9e67
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffc000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ef6555253635d8432156cfd9c11b145a
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffe000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fb4035074a5d4260c90cbd6da6c3fceb
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffff000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 446ee416f9ad1c103eb0cc96751c88e1
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffff800000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 198ae2a4637ac0a7890a8fd1485445c9
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffc00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 562012ec8faded0825fb2fa70ab30cbd
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffe00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cc8a64b46b5d88bf7f247d4dbaf38f05
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffff00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a168253762e2cc81b42d1e5001762699
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffff80000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1b41f83b38ce5032c6cd7af98cf62061
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffc0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 61a89990cd1411750d5fb0dc988447d4
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffe0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b5accc8ed629edf8c68a539183b1ea82
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffff0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b16fa71f846b81a13f361c43a851f290
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffff8000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4fad6efdff5975aee7692234bcd54488
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffc000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ebfdb05a783d03082dfe5fdd80a00b17
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffe000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: eb81b584766997af6ba5529d3bdd8609
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffff000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0cf4ff4f49c8a0ca060c443499e29313
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffff800000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cc4ba8a8e029f8b26d8afff9df133bb6
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffc00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fefebf64360f38e4e63558f0ffc550c3
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffe00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 12ad98cbf725137d6a8108c2bed99322
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffff00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6afaa996226198b3e2610413ce1b3f78
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffff80000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2a8ce6747a7e39367828e290848502d9
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffc0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 223736e8b8f89ca1e37b6deab40facf1
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffe0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c0f797e50418b95fa6013333917a9480
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffff0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a758de37c2ece2a02c73c01fedc9a132
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffff8000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3a9b87ae77bae706803966c66c73adbd
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffc000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d365ab8df8ffd782e358121a4a4fc541
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffe000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c8dcd9e6f75e6c36c8daee0466f0ed74
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffff000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c79a637beb1c0304f14014c037e736dd
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffff800000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 105f0a25e84ac930d996281a5f954dd9
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffc00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 42e4074b2927973e8d17ffa92f7fe615
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffe00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4fe2a9d2c1824449c69e3e0398f12963
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffff00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b7f29c1e1f62847a15253b28a1e9d712
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffff80000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 36ed5d29b903f31e8983ef8b0a2bf990
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffc0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 27b8070270810f9d023f9dd7ff3b4aa2
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffe0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 94d46e155c1228f61d1a0db4815ecc4b
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffff0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ca6108d1d98071428eeceef1714b96dd
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffff8000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dc5b25b71b6296cf73dd2cdcac2f70b1
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffc000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 44aba95e8a06a2d9d3530d2677878c80
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffe000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a570d20e89b467e8f5176061b81dd396
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffff000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 758f4467a5d8f1e7307dc30b34e404f4
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffff800000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: bcea28e9071b5a2302970ff352451bc5
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffc00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7523c00bc177d331ad312e09c9015c1c
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffe00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ccac61e3183747b3f5836da21a1bc4f4
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffff00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 707b075791878880b44189d3522b8c30
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffff80000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7132d0c0e4a07593cf12ebb12be7688c
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffc0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: effbac1644deb0c784275fe56e19ead3
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffe0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a005063f30f4228b374e2459738f26bb
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffff0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 29975b5f48bb68fcbbc7cea93b452ed7
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffff8000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cf3f2576e2afedc74bb1ca7eeec1c0e7
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffc000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 07c403f5f966e0e3d9f296d6226dca28
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffe000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c8c20908249ab4a34d6dd0a31327ff1a
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffff000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c0541329ecb6159ab23b7fc5e6a21bca
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffff800000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7aa1acf1a2ed9ba72bc6deb31d88b863
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffc00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 808bd8eddabb6f3bf0d5a8a27be1fe8a
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffe00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 273c7d7685e14ec66bbb96b8f05b6ddd
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffff00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 32752eefc8c2a93f91b6e73eb07cca6e
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffff80000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d893e7d62f6ce502c64f75e281f9c000
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffc0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8dfd999be5d0cfa35732c0ddc88ff5a5
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffe0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 02647c76a300c3173b841487eb2bae9f
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffff0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 172df8b02f04b53adab028b4e01acd87
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffff8000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 054b3bf4998aeb05afd87ec536533a36
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffc000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3783f7bf44c97f065258a666cae03020
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffe000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: aad4c8a63f80954104de7b92cede1be1
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffff000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cbfe61810fd5467ccdacb75800f3ac07
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffff800000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 830d8a2590f7d8e1b55a737f4af45f34
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffc00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fffcd4683f858058e74314671d43fa2c
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffe00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 523d0babbb82f46ebc9e70b1cd41ddd0
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffff00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 344aab37080d7486f7d542a309e53eed
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffff80000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 56c5609d0906b23ab9caca816f5dbebd
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffc0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7026026eedd91adc6d831cdf9894bdc6
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffe0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 88330baa4f2b618fc9d9b021bf503d5a
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffff0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fc9e0ea22480b0bac935c8a8ebefcdcf
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffff8000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 29ca779f398fb04f867da7e8a44756cb
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffc000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 51f89c42985786bfc43c6df8ada36832
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffe000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6ac1de5fb8f21d874e91c53b560c50e3
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffff000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 03aa9058490eda306001a8a9f48d0ca7
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffff800000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e34ec71d6128d4871865d617c30b37e3
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffc00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 14be1c535b17cabd0c4d93529d69bf47
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffe00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c9ef67756507beec9dd3862883478044
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffff00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 40e231fa5a5948ce2134e92fc0664d4b
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffff80000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 03194b8e5dda5530d0c678c0b48f5d92
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffc0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 90bd086f237cc4fd99f4d76bde6b4826
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffe0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 19259761ca17130d6ed86d57cd7951ee
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffff0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d7cbb3f34b9b450f24b0e8518e54da6d
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffff8000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 725b9caebe9f7f417f4068d0d2ee20b3
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffc000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9d924b934a90ce1fd39b8a9794f82672
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffe000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c50562bf094526a91c5bc63c0c224995
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffff000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d2f11805046743bd74f57188d9188df7
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffff800000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8dd274bd0f1b58ae345d9e7233f9b8f3
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffc00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9d6bdc8f4ce5feb0f3bed2e4b9a9bb0b
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffe00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fd5548bcf3f42565f7efa94562528d46
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffff00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d2ccaebd3a4c3e80b063748131ba4a71
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffff80000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e03cb23d9e11c9d93f117e9c0a91b576
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffc0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 78f933a2081ac1db84f69d10f4523fe0
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffe0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4061f7412ed320de0edc8851c2e2436f
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffff0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9064ba1cd04ce6bab98474330814b4d4
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffff8000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 48391bffb9cfff80ac238c886ef0a461
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffc000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b8d2a67df5a999fdbf93edd0343296c9
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffe000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: aaca7367396b69a221bd632bea386eec
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffff000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a80fd5020dfe65f5f16293ec92c6fd89
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffff800000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2162995b8217a67f1abc342e146406f8
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffc00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c6a6164b7a60bae4e986ffac28dfadd9
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffe00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 64e0d7f900e3d9c83e4b8f96717b2146
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffff00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1ad2561de8c1232f5d8dbab4739b6cbb
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffff80000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 279689e9a557f58b1c3bf40c97a90964
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffc0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c4637e4a5e6377f9cc5a8638045de029
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffe0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 492e607e5aea4688594b45f3aee3df90
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffff0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e8c4e4381feec74054954c05b777a00a
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffff8000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 91549514605f38246c9b724ad839f01d
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffc000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 74b24e3b6fefe40a4f9ef7ac6e44d76a
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffe000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2437a683dc5d4b52abb4a123a8df86c6
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffff000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: bb2852c891c5947d2ed44032c421b85f
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffff800000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1b9f5fbd5e8a4264c0a85b80409afa5e
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffc00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 30dab809f85a917fe924733f424ac589
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffe00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: eaef5c1f8d605192646695ceadc65f32
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffff00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b8aa90040b4c15a12316b78e0f9586fc
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffff80000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 97fac8297ceaabc87d454350601e0673
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffc0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9b47ef567ac28dfe488492f157e2b2e0
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffe0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1b8426027ddb962b5c5ba7eb8bc9ab63
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffff0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e917fc77e71992a12dbe4c18068bec82
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffff8000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dceebbc98840f8ae6daf76573b7e56f4
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffc000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4e11a9f74205125b61e0aee047eca20d
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffe000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f60467f55a1f17eab88e800120cbc284
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffff000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d436649f600b449ee276530f0cd83c11
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffff800000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3bc0e3656a9e3ac7cd378a737f53b637
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffc00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6bacae63d33b928aa8380f8d54d88c17
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffe00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8935ffbc75ae6251bf8e859f085adcb9
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffff00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 93dc4970fe35f67747cb0562c06d875a
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffff80000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 14f9df858975851797ba604fb0d16cc7
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffc0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 02ea0c98dca10b38c21b3b14e8d1b71f
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffe0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8f091b1b5b0749b2adc803e63dda9b72
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffff0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 05b389e3322c6da08384345a4137fd08
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffff8000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 381308c438f35b399f10ad71b05027d8
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffc000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 68c230fcfa9279c3409fc423e2acbe04
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffe000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1c84a475acb011f3f59f4f46b76274c0
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffff000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 45119b68cb3f8399ee60066b5611a4d7
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffff800000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9423762f527a4060ffca312dcca22a16
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffc00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f361a2745a33f056a5ac6ace2f08e344
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffe00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5ef145766eca849f5d011536a6557fdb
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c9af27b2c89c9b4cf4a0c4106ac80318
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff80000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fb9c4f16c621f4eab7e9ac1d7551dd57
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffc0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 138e06fba466fa70854d8c2e524cffb2
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffe0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fb4bc78b225070773f04c40466d4e90c
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8b2cbff1ed0150feda8a4799be94551f
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff8000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 08b30d7b3f27962709a36bcadfb974bd
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffc000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fdf6d32e044d77adcf37fb97ac213326
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffe000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 93cb284ecdcfd781a8afe32077949e88
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7b017bb02ec87b2b94c96e40a26fc71a
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff800000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c5c038b6990664ab08a3aaa5df9f3266
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffc00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4b7020be37fab6259b2a27f4ec551576
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffe00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 60136703374f64e860b48ce31f930716
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8d63a269b14d506ccc401ab8a9f1b591
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff80000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d317f81dc6aa454aee4bd4a5a5cff4bd
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffc0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dddececd5354f04d530d76ed884246eb
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffe0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 41c5205cc8fd8eda9a3cffd2518f365a
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cf42fb474293d96eca9db1b37b1ba676
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff8000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a231692607169b4ecdead5cd3b10db3e
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffc000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ace4b91c9c669e77e7acacd19859ed49
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffe000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 75db7cfd4a7b2b62ab78a48f3ddaf4af
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c1faba2d46e259cf480d7c38e4572a58
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff800
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 241c45bc6ae16dee6eb7bea128701582
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffc00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8fd03057cf1364420c2b78069a3e2502
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffe00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ddb505e6cc1384cbaec1df90b80beb20
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5674a3bed27bf4bd3622f9f5fe208306
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff80
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b687f26a89cfbfbb8e5eeac54055315e
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffc0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0547dd32d3b29ab6a4caeb606c5b6f78
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffe0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 186861f8bc5386d31fb77f720c3226e6
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: eacf1e6c4224efb38900b185ab1dfd42
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff8
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d241aab05a42d319de81d874f5c7b90d
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffc
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5eb9bc759e2ad8d2140a6c762ae9e1ab
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffe
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 018596e15e78e2c064159defce5f3085
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffff
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dd8a493514231cbf56eccee4c40889fb
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 800000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: de885dc87f5a92594082d02cc1e1b42c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: c00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 132b074e80f2a597bf5febd8ea5da55e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: e00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6eccedf8de592c22fb81347b79f2db1f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: f00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 180b09f267c45145db2f826c2582d35c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: f80000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: edd807ef7652d7eb0e13c8b5e15b3bc0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fc0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9978bcf8dd8fd72241223ad24b31b8a4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fe0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5310f654343e8f27e12c83a48d24ff81
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ff0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 833f71258d53036b02952c76c744f5a1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ff8000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: eba83ff200cff9318a92f8691a06b09f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffc000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ff620ccbe9f3292abdf2176b09f04eba
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffe000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7ababc4b3f516c9aafb35f4140b548f9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fff000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: aa187824d9c4582b0916493ecbde8c57
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fff800000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1c0ad553177fd5ea1092c9d626a29dc4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffc00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a5dc46c37261194124ecaebd680408ec
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffe00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e4f2f2ae23e9b10bacfa58601531ba54
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffff00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b7d67cf1a1e91e8ff3a57a172c7bf412
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffff80000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 26706be06967884e847d137128ce47b3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffc0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b2f8b409b0585909aad3a7b5a219072a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffe0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5e4b7bff0290c78344c54a23b722cd20
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffff0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 07093657552d4414227ce161e9ebf7dd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffff8000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e1af1e7d8bc225ed4dffb771ecbb9e67
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffc000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ef6555253635d8432156cfd9c11b145a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffe000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fb4035074a5d4260c90cbd6da6c3fceb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffff000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 446ee416f9ad1c103eb0cc96751c88e1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffff800000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 198ae2a4637ac0a7890a8fd1485445c9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffc00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 562012ec8faded0825fb2fa70ab30cbd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffe00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cc8a64b46b5d88bf7f247d4dbaf38f05
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffff00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a168253762e2cc81b42d1e5001762699
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffff80000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1b41f83b38ce5032c6cd7af98cf62061
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffc0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 61a89990cd1411750d5fb0dc988447d4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffe0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b5accc8ed629edf8c68a539183b1ea82
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffff0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b16fa71f846b81a13f361c43a851f290
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffff8000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4fad6efdff5975aee7692234bcd54488
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffc000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ebfdb05a783d03082dfe5fdd80a00b17
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffe000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: eb81b584766997af6ba5529d3bdd8609
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffff000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0cf4ff4f49c8a0ca060c443499e29313
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffff800000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cc4ba8a8e029f8b26d8afff9df133bb6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffc00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fefebf64360f38e4e63558f0ffc550c3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffe00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 12ad98cbf725137d6a8108c2bed99322
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffff00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6afaa996226198b3e2610413ce1b3f78
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffff80000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2a8ce6747a7e39367828e290848502d9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffc0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 223736e8b8f89ca1e37b6deab40facf1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffe0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c0f797e50418b95fa6013333917a9480
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffff0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a758de37c2ece2a02c73c01fedc9a132
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffff8000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3a9b87ae77bae706803966c66c73adbd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffc000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d365ab8df8ffd782e358121a4a4fc541
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffe000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c8dcd9e6f75e6c36c8daee0466f0ed74
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffff000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c79a637beb1c0304f14014c037e736dd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffff800000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 105f0a25e84ac930d996281a5f954dd9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffc00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 42e4074b2927973e8d17ffa92f7fe615
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffe00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4fe2a9d2c1824449c69e3e0398f12963
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffff00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b7f29c1e1f62847a15253b28a1e9d712
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffff80000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 36ed5d29b903f31e8983ef8b0a2bf990
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffc0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 27b8070270810f9d023f9dd7ff3b4aa2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffe0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 94d46e155c1228f61d1a0db4815ecc4b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffff0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ca6108d1d98071428eeceef1714b96dd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffff8000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dc5b25b71b6296cf73dd2cdcac2f70b1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffc000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 44aba95e8a06a2d9d3530d2677878c80
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffe000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a570d20e89b467e8f5176061b81dd396
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffff000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 758f4467a5d8f1e7307dc30b34e404f4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffff800000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: bcea28e9071b5a2302970ff352451bc5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffc00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7523c00bc177d331ad312e09c9015c1c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffe00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ccac61e3183747b3f5836da21a1bc4f4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffff00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 707b075791878880b44189d3522b8c30
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffff80000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7132d0c0e4a07593cf12ebb12be7688c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffc0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: effbac1644deb0c784275fe56e19ead3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffe0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a005063f30f4228b374e2459738f26bb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffff0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 29975b5f48bb68fcbbc7cea93b452ed7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffff8000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cf3f2576e2afedc74bb1ca7eeec1c0e7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffc000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 07c403f5f966e0e3d9f296d6226dca28
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffe000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c8c20908249ab4a34d6dd0a31327ff1a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffff000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c0541329ecb6159ab23b7fc5e6a21bca
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffff800000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7aa1acf1a2ed9ba72bc6deb31d88b863
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffc00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 808bd8eddabb6f3bf0d5a8a27be1fe8a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffe00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 273c7d7685e14ec66bbb96b8f05b6ddd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffff00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 32752eefc8c2a93f91b6e73eb07cca6e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffff80000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d893e7d62f6ce502c64f75e281f9c000
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffc0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8dfd999be5d0cfa35732c0ddc88ff5a5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffe0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 02647c76a300c3173b841487eb2bae9f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffff0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 172df8b02f04b53adab028b4e01acd87
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffff8000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 054b3bf4998aeb05afd87ec536533a36
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffc000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3783f7bf44c97f065258a666cae03020
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffe000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: aad4c8a63f80954104de7b92cede1be1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffff000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cbfe61810fd5467ccdacb75800f3ac07
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffff800000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 830d8a2590f7d8e1b55a737f4af45f34
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffc00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fffcd4683f858058e74314671d43fa2c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffe00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 523d0babbb82f46ebc9e70b1cd41ddd0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffff00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 344aab37080d7486f7d542a309e53eed
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffff80000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 56c5609d0906b23ab9caca816f5dbebd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffc0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7026026eedd91adc6d831cdf9894bdc6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffe0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 88330baa4f2b618fc9d9b021bf503d5a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffff0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fc9e0ea22480b0bac935c8a8ebefcdcf
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffff8000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 29ca779f398fb04f867da7e8a44756cb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffc000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 51f89c42985786bfc43c6df8ada36832
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffe000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6ac1de5fb8f21d874e91c53b560c50e3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffff000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 03aa9058490eda306001a8a9f48d0ca7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffff800000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e34ec71d6128d4871865d617c30b37e3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffc00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 14be1c535b17cabd0c4d93529d69bf47
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffe00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c9ef67756507beec9dd3862883478044
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffff00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 40e231fa5a5948ce2134e92fc0664d4b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffff80000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 03194b8e5dda5530d0c678c0b48f5d92
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffc0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 90bd086f237cc4fd99f4d76bde6b4826
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffe0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 19259761ca17130d6ed86d57cd7951ee
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffff0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d7cbb3f34b9b450f24b0e8518e54da6d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffff8000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 725b9caebe9f7f417f4068d0d2ee20b3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffc000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9d924b934a90ce1fd39b8a9794f82672
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffe000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c50562bf094526a91c5bc63c0c224995
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffff000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d2f11805046743bd74f57188d9188df7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffff800000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8dd274bd0f1b58ae345d9e7233f9b8f3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffc00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9d6bdc8f4ce5feb0f3bed2e4b9a9bb0b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffe00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fd5548bcf3f42565f7efa94562528d46
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffff00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d2ccaebd3a4c3e80b063748131ba4a71
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffff80000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e03cb23d9e11c9d93f117e9c0a91b576
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffc0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 78f933a2081ac1db84f69d10f4523fe0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffe0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4061f7412ed320de0edc8851c2e2436f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffff0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9064ba1cd04ce6bab98474330814b4d4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffff8000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 48391bffb9cfff80ac238c886ef0a461
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffc000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b8d2a67df5a999fdbf93edd0343296c9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffe000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: aaca7367396b69a221bd632bea386eec
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffff000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a80fd5020dfe65f5f16293ec92c6fd89
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffff800000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2162995b8217a67f1abc342e146406f8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffc00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c6a6164b7a60bae4e986ffac28dfadd9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffe00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 64e0d7f900e3d9c83e4b8f96717b2146
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffff00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1ad2561de8c1232f5d8dbab4739b6cbb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffff80000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 279689e9a557f58b1c3bf40c97a90964
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffc0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c4637e4a5e6377f9cc5a8638045de029
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffe0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 492e607e5aea4688594b45f3aee3df90
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffff0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e8c4e4381feec74054954c05b777a00a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffff8000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 91549514605f38246c9b724ad839f01d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffc000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 74b24e3b6fefe40a4f9ef7ac6e44d76a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffe000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2437a683dc5d4b52abb4a123a8df86c6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffff000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: bb2852c891c5947d2ed44032c421b85f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffff800000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1b9f5fbd5e8a4264c0a85b80409afa5e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffc00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 30dab809f85a917fe924733f424ac589
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffe00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: eaef5c1f8d605192646695ceadc65f32
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffff00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b8aa90040b4c15a12316b78e0f9586fc
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffff80000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 97fac8297ceaabc87d454350601e0673
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffc0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9b47ef567ac28dfe488492f157e2b2e0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffe0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1b8426027ddb962b5c5ba7eb8bc9ab63
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffff0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e917fc77e71992a12dbe4c18068bec82
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffff8000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dceebbc98840f8ae6daf76573b7e56f4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffc000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4e11a9f74205125b61e0aee047eca20d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffe000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f60467f55a1f17eab88e800120cbc284
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffff000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d436649f600b449ee276530f0cd83c11
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffff800000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3bc0e3656a9e3ac7cd378a737f53b637
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffc00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6bacae63d33b928aa8380f8d54d88c17
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffe00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8935ffbc75ae6251bf8e859f085adcb9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffff00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 93dc4970fe35f67747cb0562c06d875a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffff80000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 14f9df858975851797ba604fb0d16cc7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffc0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 02ea0c98dca10b38c21b3b14e8d1b71f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffe0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8f091b1b5b0749b2adc803e63dda9b72
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffff0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 05b389e3322c6da08384345a4137fd08
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffff8000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 381308c438f35b399f10ad71b05027d8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffc000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 68c230fcfa9279c3409fc423e2acbe04
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffe000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1c84a475acb011f3f59f4f46b76274c0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffff000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 45119b68cb3f8399ee60066b5611a4d7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffff800000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9423762f527a4060ffca312dcca22a16
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffc00000000
+IV: 00000000000000000000000000000000
+Ciphertext: f361a2745a33f056a5ac6ace2f08e344
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffe00000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5ef145766eca849f5d011536a6557fdb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff00000000
+IV: 00000000000000000000000000000000
+Ciphertext: c9af27b2c89c9b4cf4a0c4106ac80318
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff80000000
+IV: 00000000000000000000000000000000
+Ciphertext: fb9c4f16c621f4eab7e9ac1d7551dd57
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffc0000000
+IV: 00000000000000000000000000000000
+Ciphertext: 138e06fba466fa70854d8c2e524cffb2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffe0000000
+IV: 00000000000000000000000000000000
+Ciphertext: fb4bc78b225070773f04c40466d4e90c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff0000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8b2cbff1ed0150feda8a4799be94551f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff8000000
+IV: 00000000000000000000000000000000
+Ciphertext: 08b30d7b3f27962709a36bcadfb974bd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffc000000
+IV: 00000000000000000000000000000000
+Ciphertext: fdf6d32e044d77adcf37fb97ac213326
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffe000000
+IV: 00000000000000000000000000000000
+Ciphertext: 93cb284ecdcfd781a8afe32077949e88
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7b017bb02ec87b2b94c96e40a26fc71a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff800000
+IV: 00000000000000000000000000000000
+Ciphertext: c5c038b6990664ab08a3aaa5df9f3266
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffc00000
+IV: 00000000000000000000000000000000
+Ciphertext: 4b7020be37fab6259b2a27f4ec551576
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffe00000
+IV: 00000000000000000000000000000000
+Ciphertext: 60136703374f64e860b48ce31f930716
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff00000
+IV: 00000000000000000000000000000000
+Ciphertext: 8d63a269b14d506ccc401ab8a9f1b591
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff80000
+IV: 00000000000000000000000000000000
+Ciphertext: d317f81dc6aa454aee4bd4a5a5cff4bd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffc0000
+IV: 00000000000000000000000000000000
+Ciphertext: dddececd5354f04d530d76ed884246eb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffe0000
+IV: 00000000000000000000000000000000
+Ciphertext: 41c5205cc8fd8eda9a3cffd2518f365a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff0000
+IV: 00000000000000000000000000000000
+Ciphertext: cf42fb474293d96eca9db1b37b1ba676
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff8000
+IV: 00000000000000000000000000000000
+Ciphertext: a231692607169b4ecdead5cd3b10db3e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffc000
+IV: 00000000000000000000000000000000
+Ciphertext: ace4b91c9c669e77e7acacd19859ed49
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffe000
+IV: 00000000000000000000000000000000
+Ciphertext: 75db7cfd4a7b2b62ab78a48f3ddaf4af
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff000
+IV: 00000000000000000000000000000000
+Ciphertext: c1faba2d46e259cf480d7c38e4572a58
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff800
+IV: 00000000000000000000000000000000
+Ciphertext: 241c45bc6ae16dee6eb7bea128701582
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffc00
+IV: 00000000000000000000000000000000
+Ciphertext: 8fd03057cf1364420c2b78069a3e2502
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffe00
+IV: 00000000000000000000000000000000
+Ciphertext: ddb505e6cc1384cbaec1df90b80beb20
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff00
+IV: 00000000000000000000000000000000
+Ciphertext: 5674a3bed27bf4bd3622f9f5fe208306
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff80
+IV: 00000000000000000000000000000000
+Ciphertext: b687f26a89cfbfbb8e5eeac54055315e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffc0
+IV: 00000000000000000000000000000000
+Ciphertext: 0547dd32d3b29ab6a4caeb606c5b6f78
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffe0
+IV: 00000000000000000000000000000000
+Ciphertext: 186861f8bc5386d31fb77f720c3226e6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff0
+IV: 00000000000000000000000000000000
+Ciphertext: eacf1e6c4224efb38900b185ab1dfd42
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff8
+IV: 00000000000000000000000000000000
+Ciphertext: d241aab05a42d319de81d874f5c7b90d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffc
+IV: 00000000000000000000000000000000
+Ciphertext: 5eb9bc759e2ad8d2140a6c762ae9e1ab
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffe
+IV: 00000000000000000000000000000000
+Ciphertext: 018596e15e78e2c064159defce5f3085
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffff
+IV: 00000000000000000000000000000000
+Ciphertext: dd8a493514231cbf56eccee4c40889fb
+Plaintext: 00000000000000000000000000000000
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_var_txt.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_var_txt.txt
new file mode 100644
index 0000000..e3934da
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_var_txt.txt
@@ -0,0 +1,1794 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCVarTxt192.rsp -extra-labels=Cipher=AES-192-CTR -swap-iv-plaintext"
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 80000000000000000000000000000000
+Ciphertext: 6cd02513e8d4dc986b4afe087a60bd0c
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: c0000000000000000000000000000000
+Ciphertext: 2ce1f8b7e30627c1c4519eada44bc436
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: e0000000000000000000000000000000
+Ciphertext: 9946b5f87af446f5796c1fee63a2da24
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: f0000000000000000000000000000000
+Ciphertext: 2a560364ce529efc21788779568d5555
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: f8000000000000000000000000000000
+Ciphertext: 35c1471837af446153bce55d5ba72a0a
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fc000000000000000000000000000000
+Ciphertext: ce60bc52386234f158f84341e534cd9e
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fe000000000000000000000000000000
+Ciphertext: 8c7c27ff32bcf8dc2dc57c90c2903961
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ff000000000000000000000000000000
+Ciphertext: 32bb6a7ec84499e166f936003d55a5bb
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ff800000000000000000000000000000
+Ciphertext: a5c772e5c62631ef660ee1d5877f6d1b
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffc00000000000000000000000000000
+Ciphertext: 030d7e5b64f380a7e4ea5387b5cd7f49
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffe00000000000000000000000000000
+Ciphertext: 0dc9a2610037009b698f11bb7e86c83e
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fff00000000000000000000000000000
+Ciphertext: 0046612c766d1840c226364f1fa7ed72
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fff80000000000000000000000000000
+Ciphertext: 4880c7e08f27befe78590743c05e698b
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffc0000000000000000000000000000
+Ciphertext: 2520ce829a26577f0f4822c4ecc87401
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffe0000000000000000000000000000
+Ciphertext: 8765e8acc169758319cb46dc7bcf3dca
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffff0000000000000000000000000000
+Ciphertext: e98f4ba4f073df4baa116d011dc24a28
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffff8000000000000000000000000000
+Ciphertext: f378f68c5dbf59e211b3a659a7317d94
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffc000000000000000000000000000
+Ciphertext: 283d3b069d8eb9fb432d74b96ca762b4
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffe000000000000000000000000000
+Ciphertext: a7e1842e8a87861c221a500883245c51
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffff000000000000000000000000000
+Ciphertext: 77aa270471881be070fb52c7067ce732
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffff800000000000000000000000000
+Ciphertext: 01b0f476d484f43f1aeb6efa9361a8ac
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffc00000000000000000000000000
+Ciphertext: 1c3a94f1c052c55c2d8359aff2163b4f
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffe00000000000000000000000000
+Ciphertext: e8a067b604d5373d8b0f2e05a03b341b
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffff00000000000000000000000000
+Ciphertext: a7876ec87f5a09bfea42c77da30fd50e
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffff80000000000000000000000000
+Ciphertext: 0cf3e9d3a42be5b854ca65b13f35f48d
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffc0000000000000000000000000
+Ciphertext: 6c62f6bbcab7c3e821c9290f08892dda
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffe0000000000000000000000000
+Ciphertext: 7f5e05bd2068738196fee79ace7e3aec
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffff0000000000000000000000000
+Ciphertext: 440e0d733255cda92fb46e842fe58054
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffff8000000000000000000000000
+Ciphertext: aa5d5b1c4ea1b7a22e5583ac2e9ed8a7
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffc000000000000000000000000
+Ciphertext: 77e537e89e8491e8662aae3bc809421d
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffe000000000000000000000000
+Ciphertext: 997dd3e9f1598bfa73f75973f7e93b76
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffff000000000000000000000000
+Ciphertext: 1b38d4f7452afefcb7fc721244e4b72e
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffff800000000000000000000000
+Ciphertext: 0be2b18252e774dda30cdda02c6906e3
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffc00000000000000000000000
+Ciphertext: d2695e59c20361d82652d7d58b6f11b2
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffe00000000000000000000000
+Ciphertext: 902d88d13eae52089abd6143cfe394e9
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffff00000000000000000000000
+Ciphertext: d49bceb3b823fedd602c305345734bd2
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffff80000000000000000000000
+Ciphertext: 707b1dbb0ffa40ef7d95def421233fae
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffc0000000000000000000000
+Ciphertext: 7ca0c1d93356d9eb8aa952084d75f913
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffe0000000000000000000000
+Ciphertext: f2cbf9cb186e270dd7bdb0c28febc57d
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffff0000000000000000000000
+Ciphertext: c94337c37c4e790ab45780bd9c3674a0
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffff8000000000000000000000
+Ciphertext: 8e3558c135252fb9c9f367ed609467a1
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffc000000000000000000000
+Ciphertext: 1b72eeaee4899b443914e5b3a57fba92
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffe000000000000000000000
+Ciphertext: 011865f91bc56868d051e52c9efd59b7
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffff000000000000000000000
+Ciphertext: e4771318ad7a63dd680f6e583b7747ea
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffff800000000000000000000
+Ciphertext: 61e3d194088dc8d97e9e6db37457eac5
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffc00000000000000000000
+Ciphertext: 36ff1ec9ccfbc349e5d356d063693ad6
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffe00000000000000000000
+Ciphertext: 3cc9e9a9be8cc3f6fb2ea24088e9bb19
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffff00000000000000000000
+Ciphertext: 1ee5ab003dc8722e74905d9a8fe3d350
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffff80000000000000000000
+Ciphertext: 245339319584b0a412412869d6c2eada
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffc0000000000000000000
+Ciphertext: 7bd496918115d14ed5380852716c8814
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffe0000000000000000000
+Ciphertext: 273ab2f2b4a366a57d582a339313c8b1
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffff0000000000000000000
+Ciphertext: 113365a9ffbe3b0ca61e98507554168b
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffff8000000000000000000
+Ciphertext: afa99c997ac478a0dea4119c9e45f8b1
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffc000000000000000000
+Ciphertext: 9216309a7842430b83ffb98638011512
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffe000000000000000000
+Ciphertext: 62abc792288258492a7cb45145f4b759
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffff000000000000000000
+Ciphertext: 534923c169d504d7519c15d30e756c50
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffff800000000000000000
+Ciphertext: fa75e05bcdc7e00c273fa33f6ee441d2
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffc00000000000000000
+Ciphertext: 7d350fa6057080f1086a56b17ec240db
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffe00000000000000000
+Ciphertext: f34e4a6324ea4a5c39a661c8fe5ada8f
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffff00000000000000000
+Ciphertext: 0882a16f44088d42447a29ac090ec17e
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffff80000000000000000
+Ciphertext: 3a3c15bfc11a9537c130687004e136ee
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffc0000000000000000
+Ciphertext: 22c0a7678dc6d8cf5c8a6d5a9960767c
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffe0000000000000000
+Ciphertext: b46b09809d68b9a456432a79bdc2e38c
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffff0000000000000000
+Ciphertext: 93baaffb35fbe739c17c6ac22eecf18f
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffff8000000000000000
+Ciphertext: c8aa80a7850675bc007c46df06b49868
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffc000000000000000
+Ciphertext: 12c6f3877af421a918a84b775858021d
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffe000000000000000
+Ciphertext: 33f123282c5d633924f7d5ba3f3cab11
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffff000000000000000
+Ciphertext: a8f161002733e93ca4527d22c1a0c5bb
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffff800000000000000
+Ciphertext: b72f70ebf3e3fda23f508eec76b42c02
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffc00000000000000
+Ciphertext: 6a9d965e6274143f25afdcfc88ffd77c
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffe00000000000000
+Ciphertext: a0c74fd0b9361764ce91c5200b095357
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffff00000000000000
+Ciphertext: 091d1fdc2bd2c346cd5046a8c6209146
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffff80000000000000
+Ciphertext: e2a37580116cfb71856254496ab0aca8
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffc0000000000000
+Ciphertext: e0b3a00785917c7efc9adba322813571
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffe0000000000000
+Ciphertext: 733d41f4727b5ef0df4af4cf3cffa0cb
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffff0000000000000
+Ciphertext: a99ebb030260826f981ad3e64490aa4f
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffff8000000000000
+Ciphertext: 73f34c7d3eae5e80082c1647524308ee
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffc000000000000
+Ciphertext: 40ebd5ad082345b7a2097ccd3464da02
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffe000000000000
+Ciphertext: 7cc4ae9a424b2cec90c97153c2457ec5
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffff000000000000
+Ciphertext: 54d632d03aba0bd0f91877ebdd4d09cb
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffff800000000000
+Ciphertext: d3427be7e4d27cd54f5fe37b03cf0897
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffc00000000000
+Ciphertext: b2099795e88cc158fd75ea133d7e7fbe
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffe00000000000
+Ciphertext: a6cae46fb6fadfe7a2c302a34242817b
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffff00000000000
+Ciphertext: 026a7024d6a902e0b3ffccbaa910cc3f
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffff80000000000
+Ciphertext: 156f07767a85a4312321f63968338a01
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffc0000000000
+Ciphertext: 15eec9ebf42b9ca76897d2cd6c5a12e2
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffe0000000000
+Ciphertext: db0d3a6fdcc13f915e2b302ceeb70fd8
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffff0000000000
+Ciphertext: 71dbf37e87a2e34d15b20e8f10e48924
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffff8000000000
+Ciphertext: c745c451e96ff3c045e4367c833e3b54
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffc000000000
+Ciphertext: 340da09c2dd11c3b679d08ccd27dd595
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffe000000000
+Ciphertext: 8279f7c0c2a03ee660c6d392db025d18
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffff000000000
+Ciphertext: a4b2c7d8eba531ff47c5041a55fbd1ec
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffff800000000
+Ciphertext: 74569a2ca5a7bd5131ce8dc7cbfbf72f
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffc00000000
+Ciphertext: 3713da0c0219b63454035613b5a403dd
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffe00000000
+Ciphertext: 8827551ddcc9df23fa72a3de4e9f0b07
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffff00000000
+Ciphertext: 2e3febfd625bfcd0a2c06eb460da1732
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffff80000000
+Ciphertext: ee82e6ba488156f76496311da6941deb
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffc0000000
+Ciphertext: 4770446f01d1f391256e85a1b30d89d3
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffe0000000
+Ciphertext: af04b68f104f21ef2afb4767cf74143c
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffff0000000
+Ciphertext: cf3579a9ba38c8e43653173e14f3a4c6
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffff8000000
+Ciphertext: b3bba904f4953e09b54800af2f62e7d4
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffc000000
+Ciphertext: fc4249656e14b29eb9c44829b4c59a46
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffe000000
+Ciphertext: 9b31568febe81cfc2e65af1c86d1a308
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffff000000
+Ciphertext: 9ca09c25f273a766db98a480ce8dfedc
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffff800000
+Ciphertext: b909925786f34c3c92d971883c9fbedf
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffc00000
+Ciphertext: 82647f1332fe570a9d4d92b2ee771d3b
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffe00000
+Ciphertext: 3604a7e80832b3a99954bca6f5b9f501
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffff00000
+Ciphertext: 884607b128c5de3ab39a529a1ef51bef
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffff80000
+Ciphertext: 670cfa093d1dbdb2317041404102435e
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffc0000
+Ciphertext: 7a867195f3ce8769cbd336502fbb5130
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffe0000
+Ciphertext: 52efcf64c72b2f7ca5b3c836b1078c15
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffff0000
+Ciphertext: 4019250f6eefb2ac5ccbcae044e75c7e
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffff8000
+Ciphertext: 022c4f6f5a017d292785627667ddef24
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffc000
+Ciphertext: e9c21078a2eb7e03250f71000fa9e3ed
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffe000
+Ciphertext: a13eaeeb9cd391da4e2b09490b3e7fad
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffff000
+Ciphertext: c958a171dca1d4ed53e1af1d380803a9
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffff800
+Ciphertext: 21442e07a110667f2583eaeeee44dc8c
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffc00
+Ciphertext: 59bbb353cf1dd867a6e33737af655e99
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffe00
+Ciphertext: 43cd3b25375d0ce41087ff9fe2829639
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffff00
+Ciphertext: 6b98b17e80d1118e3516bd768b285a84
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffff80
+Ciphertext: ae47ed3676ca0c08deea02d95b81db58
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffffc0
+Ciphertext: 34ec40dc20413795ed53628ea748720b
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffffe0
+Ciphertext: 4dc68163f8e9835473253542c8a65d46
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffff0
+Ciphertext: 2aabb999f43693175af65c6c612c46fb
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffff8
+Ciphertext: e01f94499dac3547515c5b1d756f0f58
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffffc
+Ciphertext: 9d12435a46480ce00ea349f71799df9a
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffffe
+Ciphertext: cef41d16d266bdfe46938ad7884cc0cf
+
+Cipher: AES-192-CTR
+Operation: ENCRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffffff
+Ciphertext: b13db4da1f718bc6904797c82bcf2d32
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6cd02513e8d4dc986b4afe087a60bd0c
+IV: 80000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2ce1f8b7e30627c1c4519eada44bc436
+IV: c0000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9946b5f87af446f5796c1fee63a2da24
+IV: e0000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2a560364ce529efc21788779568d5555
+IV: f0000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 35c1471837af446153bce55d5ba72a0a
+IV: f8000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ce60bc52386234f158f84341e534cd9e
+IV: fc000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8c7c27ff32bcf8dc2dc57c90c2903961
+IV: fe000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 32bb6a7ec84499e166f936003d55a5bb
+IV: ff000000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a5c772e5c62631ef660ee1d5877f6d1b
+IV: ff800000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 030d7e5b64f380a7e4ea5387b5cd7f49
+IV: ffc00000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0dc9a2610037009b698f11bb7e86c83e
+IV: ffe00000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0046612c766d1840c226364f1fa7ed72
+IV: fff00000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4880c7e08f27befe78590743c05e698b
+IV: fff80000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2520ce829a26577f0f4822c4ecc87401
+IV: fffc0000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8765e8acc169758319cb46dc7bcf3dca
+IV: fffe0000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e98f4ba4f073df4baa116d011dc24a28
+IV: ffff0000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f378f68c5dbf59e211b3a659a7317d94
+IV: ffff8000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 283d3b069d8eb9fb432d74b96ca762b4
+IV: ffffc000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a7e1842e8a87861c221a500883245c51
+IV: ffffe000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 77aa270471881be070fb52c7067ce732
+IV: fffff000000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 01b0f476d484f43f1aeb6efa9361a8ac
+IV: fffff800000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1c3a94f1c052c55c2d8359aff2163b4f
+IV: fffffc00000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e8a067b604d5373d8b0f2e05a03b341b
+IV: fffffe00000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a7876ec87f5a09bfea42c77da30fd50e
+IV: ffffff00000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0cf3e9d3a42be5b854ca65b13f35f48d
+IV: ffffff80000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6c62f6bbcab7c3e821c9290f08892dda
+IV: ffffffc0000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7f5e05bd2068738196fee79ace7e3aec
+IV: ffffffe0000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 440e0d733255cda92fb46e842fe58054
+IV: fffffff0000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: aa5d5b1c4ea1b7a22e5583ac2e9ed8a7
+IV: fffffff8000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 77e537e89e8491e8662aae3bc809421d
+IV: fffffffc000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 997dd3e9f1598bfa73f75973f7e93b76
+IV: fffffffe000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1b38d4f7452afefcb7fc721244e4b72e
+IV: ffffffff000000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0be2b18252e774dda30cdda02c6906e3
+IV: ffffffff800000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d2695e59c20361d82652d7d58b6f11b2
+IV: ffffffffc00000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 902d88d13eae52089abd6143cfe394e9
+IV: ffffffffe00000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d49bceb3b823fedd602c305345734bd2
+IV: fffffffff00000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 707b1dbb0ffa40ef7d95def421233fae
+IV: fffffffff80000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7ca0c1d93356d9eb8aa952084d75f913
+IV: fffffffffc0000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f2cbf9cb186e270dd7bdb0c28febc57d
+IV: fffffffffe0000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c94337c37c4e790ab45780bd9c3674a0
+IV: ffffffffff0000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8e3558c135252fb9c9f367ed609467a1
+IV: ffffffffff8000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1b72eeaee4899b443914e5b3a57fba92
+IV: ffffffffffc000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 011865f91bc56868d051e52c9efd59b7
+IV: ffffffffffe000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e4771318ad7a63dd680f6e583b7747ea
+IV: fffffffffff000000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 61e3d194088dc8d97e9e6db37457eac5
+IV: fffffffffff800000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 36ff1ec9ccfbc349e5d356d063693ad6
+IV: fffffffffffc00000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3cc9e9a9be8cc3f6fb2ea24088e9bb19
+IV: fffffffffffe00000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1ee5ab003dc8722e74905d9a8fe3d350
+IV: ffffffffffff00000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 245339319584b0a412412869d6c2eada
+IV: ffffffffffff80000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7bd496918115d14ed5380852716c8814
+IV: ffffffffffffc0000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 273ab2f2b4a366a57d582a339313c8b1
+IV: ffffffffffffe0000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 113365a9ffbe3b0ca61e98507554168b
+IV: fffffffffffff0000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: afa99c997ac478a0dea4119c9e45f8b1
+IV: fffffffffffff8000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9216309a7842430b83ffb98638011512
+IV: fffffffffffffc000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 62abc792288258492a7cb45145f4b759
+IV: fffffffffffffe000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 534923c169d504d7519c15d30e756c50
+IV: ffffffffffffff000000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fa75e05bcdc7e00c273fa33f6ee441d2
+IV: ffffffffffffff800000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7d350fa6057080f1086a56b17ec240db
+IV: ffffffffffffffc00000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f34e4a6324ea4a5c39a661c8fe5ada8f
+IV: ffffffffffffffe00000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0882a16f44088d42447a29ac090ec17e
+IV: fffffffffffffff00000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3a3c15bfc11a9537c130687004e136ee
+IV: fffffffffffffff80000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 22c0a7678dc6d8cf5c8a6d5a9960767c
+IV: fffffffffffffffc0000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b46b09809d68b9a456432a79bdc2e38c
+IV: fffffffffffffffe0000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 93baaffb35fbe739c17c6ac22eecf18f
+IV: ffffffffffffffff0000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c8aa80a7850675bc007c46df06b49868
+IV: ffffffffffffffff8000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 12c6f3877af421a918a84b775858021d
+IV: ffffffffffffffffc000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 33f123282c5d633924f7d5ba3f3cab11
+IV: ffffffffffffffffe000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a8f161002733e93ca4527d22c1a0c5bb
+IV: fffffffffffffffff000000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b72f70ebf3e3fda23f508eec76b42c02
+IV: fffffffffffffffff800000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6a9d965e6274143f25afdcfc88ffd77c
+IV: fffffffffffffffffc00000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a0c74fd0b9361764ce91c5200b095357
+IV: fffffffffffffffffe00000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 091d1fdc2bd2c346cd5046a8c6209146
+IV: ffffffffffffffffff00000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e2a37580116cfb71856254496ab0aca8
+IV: ffffffffffffffffff80000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e0b3a00785917c7efc9adba322813571
+IV: ffffffffffffffffffc0000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 733d41f4727b5ef0df4af4cf3cffa0cb
+IV: ffffffffffffffffffe0000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a99ebb030260826f981ad3e64490aa4f
+IV: fffffffffffffffffff0000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 73f34c7d3eae5e80082c1647524308ee
+IV: fffffffffffffffffff8000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 40ebd5ad082345b7a2097ccd3464da02
+IV: fffffffffffffffffffc000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7cc4ae9a424b2cec90c97153c2457ec5
+IV: fffffffffffffffffffe000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 54d632d03aba0bd0f91877ebdd4d09cb
+IV: ffffffffffffffffffff000000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d3427be7e4d27cd54f5fe37b03cf0897
+IV: ffffffffffffffffffff800000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b2099795e88cc158fd75ea133d7e7fbe
+IV: ffffffffffffffffffffc00000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a6cae46fb6fadfe7a2c302a34242817b
+IV: ffffffffffffffffffffe00000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 026a7024d6a902e0b3ffccbaa910cc3f
+IV: fffffffffffffffffffff00000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 156f07767a85a4312321f63968338a01
+IV: fffffffffffffffffffff80000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 15eec9ebf42b9ca76897d2cd6c5a12e2
+IV: fffffffffffffffffffffc0000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: db0d3a6fdcc13f915e2b302ceeb70fd8
+IV: fffffffffffffffffffffe0000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 71dbf37e87a2e34d15b20e8f10e48924
+IV: ffffffffffffffffffffff0000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c745c451e96ff3c045e4367c833e3b54
+IV: ffffffffffffffffffffff8000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 340da09c2dd11c3b679d08ccd27dd595
+IV: ffffffffffffffffffffffc000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8279f7c0c2a03ee660c6d392db025d18
+IV: ffffffffffffffffffffffe000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a4b2c7d8eba531ff47c5041a55fbd1ec
+IV: fffffffffffffffffffffff000000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 74569a2ca5a7bd5131ce8dc7cbfbf72f
+IV: fffffffffffffffffffffff800000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3713da0c0219b63454035613b5a403dd
+IV: fffffffffffffffffffffffc00000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8827551ddcc9df23fa72a3de4e9f0b07
+IV: fffffffffffffffffffffffe00000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2e3febfd625bfcd0a2c06eb460da1732
+IV: ffffffffffffffffffffffff00000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ee82e6ba488156f76496311da6941deb
+IV: ffffffffffffffffffffffff80000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4770446f01d1f391256e85a1b30d89d3
+IV: ffffffffffffffffffffffffc0000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: af04b68f104f21ef2afb4767cf74143c
+IV: ffffffffffffffffffffffffe0000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cf3579a9ba38c8e43653173e14f3a4c6
+IV: fffffffffffffffffffffffff0000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b3bba904f4953e09b54800af2f62e7d4
+IV: fffffffffffffffffffffffff8000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fc4249656e14b29eb9c44829b4c59a46
+IV: fffffffffffffffffffffffffc000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9b31568febe81cfc2e65af1c86d1a308
+IV: fffffffffffffffffffffffffe000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9ca09c25f273a766db98a480ce8dfedc
+IV: ffffffffffffffffffffffffff000000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b909925786f34c3c92d971883c9fbedf
+IV: ffffffffffffffffffffffffff800000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 82647f1332fe570a9d4d92b2ee771d3b
+IV: ffffffffffffffffffffffffffc00000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3604a7e80832b3a99954bca6f5b9f501
+IV: ffffffffffffffffffffffffffe00000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 884607b128c5de3ab39a529a1ef51bef
+IV: fffffffffffffffffffffffffff00000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 670cfa093d1dbdb2317041404102435e
+IV: fffffffffffffffffffffffffff80000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7a867195f3ce8769cbd336502fbb5130
+IV: fffffffffffffffffffffffffffc0000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 52efcf64c72b2f7ca5b3c836b1078c15
+IV: fffffffffffffffffffffffffffe0000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4019250f6eefb2ac5ccbcae044e75c7e
+IV: ffffffffffffffffffffffffffff0000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 022c4f6f5a017d292785627667ddef24
+IV: ffffffffffffffffffffffffffff8000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e9c21078a2eb7e03250f71000fa9e3ed
+IV: ffffffffffffffffffffffffffffc000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a13eaeeb9cd391da4e2b09490b3e7fad
+IV: ffffffffffffffffffffffffffffe000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c958a171dca1d4ed53e1af1d380803a9
+IV: fffffffffffffffffffffffffffff000
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 21442e07a110667f2583eaeeee44dc8c
+IV: fffffffffffffffffffffffffffff800
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 59bbb353cf1dd867a6e33737af655e99
+IV: fffffffffffffffffffffffffffffc00
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 43cd3b25375d0ce41087ff9fe2829639
+IV: fffffffffffffffffffffffffffffe00
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6b98b17e80d1118e3516bd768b285a84
+IV: ffffffffffffffffffffffffffffff00
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ae47ed3676ca0c08deea02d95b81db58
+IV: ffffffffffffffffffffffffffffff80
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 34ec40dc20413795ed53628ea748720b
+IV: ffffffffffffffffffffffffffffffc0
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4dc68163f8e9835473253542c8a65d46
+IV: ffffffffffffffffffffffffffffffe0
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2aabb999f43693175af65c6c612c46fb
+IV: fffffffffffffffffffffffffffffff0
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e01f94499dac3547515c5b1d756f0f58
+IV: fffffffffffffffffffffffffffffff8
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9d12435a46480ce00ea349f71799df9a
+IV: fffffffffffffffffffffffffffffffc
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cef41d16d266bdfe46938ad7884cc0cf
+IV: fffffffffffffffffffffffffffffffe
+
+Cipher: AES-192-CTR
+Operation: DECRYPT
+Key: 000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b13db4da1f718bc6904797c82bcf2d32
+IV: ffffffffffffffffffffffffffffffff
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_gf_sbox.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_gf_sbox.txt
new file mode 100644
index 0000000..5ff60f5
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_gf_sbox.txt
@@ -0,0 +1,72 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCGFSbox256.rsp -extra-labels=Cipher=AES-256-CBC"
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 014730f80ac625fe84f026c60bfd547d
+Ciphertext: 5c9d844ed46f9885085e5d6a4f94c7d7
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 0b24af36193ce4665f2825d7b4749c98
+Ciphertext: a9ff75bd7cf6613d3731c77c3b6d0c04
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 761c1fe41a18acf20d241650611d90f1
+Ciphertext: 623a52fcea5d443e48d9181ab32c7421
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 8a560769d605868ad80d819bdba03771
+Ciphertext: 38f2c7ae10612415d27ca190d27da8b4
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 91fbef2d15a97816060bee1feaa49afe
+Ciphertext: 1bc704f1bce135ceb810341b216d7abe
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5c9d844ed46f9885085e5d6a4f94c7d7
+Plaintext: 014730f80ac625fe84f026c60bfd547d
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a9ff75bd7cf6613d3731c77c3b6d0c04
+Plaintext: 0b24af36193ce4665f2825d7b4749c98
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 623a52fcea5d443e48d9181ab32c7421
+Plaintext: 761c1fe41a18acf20d241650611d90f1
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 38f2c7ae10612415d27ca190d27da8b4
+Plaintext: 8a560769d605868ad80d819bdba03771
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1bc704f1bce135ceb810341b216d7abe
+Plaintext: 91fbef2d15a97816060bee1feaa49afe
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_key_sbox.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_key_sbox.txt
new file mode 100644
index 0000000..951472e
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_key_sbox.txt
@@ -0,0 +1,226 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCKeySbox256.rsp -extra-labels=Cipher=AES-256-CBC"
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: c47b0294dbbbee0fec4757f22ffeee3587ca4730c3d33b691df38bab076bc558
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 46f2fb342d6f0ab477476fc501242c5f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 28d46cffa158533194214a91e712fc2b45b518076675affd910edeca5f41ac64
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4bf3b0a69aeb6657794f2901b1440ad4
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: c1cc358b449909a19436cfbb3f852ef8bcb5ed12ac7058325f56e6099aab1a1c
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 352065272169abf9856843927d0674fd
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 984ca75f4ee8d706f46c2d98c0bf4a45f5b00d791c2dfeb191b5ed8e420fd627
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4307456a9e67813b452e15fa8fffe398
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: b43d08a447ac8609baadae4ff12918b9f68fc1653f1269222f123981ded7a92f
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4663446607354989477a5c6f0f007ef4
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 1d85a181b54cde51f0e098095b2962fdc93b51fe9b88602b3f54130bf76a5bd9
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 531c2c38344578b84d50b3c917bbb6e1
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: dc0eba1f2232a7879ded34ed8428eeb8769b056bbaf8ad77cb65c3541430b4cf
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fc6aec906323480005c58e7e1ab004ad
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: f8be9ba615c5a952cabbca24f68f8593039624d524c816acda2c9183bd917cb9
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a3944b95ca0b52043584ef02151926a8
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 797f8b3d176dac5b7e34a2d539c4ef367a16f8635f6264737591c5c07bf57a3e
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a74289fe73a4c123ca189ea1e1b49ad5
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 6838d40caf927749c13f0329d331f448e202c73ef52c5f73a37ca635d4c47707
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b91d4ea4488644b56cf0812fa7fcf5fc
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ccd1bc3c659cd3c59bc437484e3c5c724441da8d6e90ce556cd57d0752663bbc
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 304f81ab61a80c2e743b94d5002a126b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 13428b5e4c005e0636dd338405d173ab135dec2a25c22c5df0722d69dcc43887
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 649a71545378c783e368c9ade7114f6c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 07eb03a08d291d1b07408bf3512ab40c91097ac77461aad4bb859647f74f00ee
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 47cb030da2ab051dfc6c4bf6910d12bb
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 90143ae20cd78c5d8ebdd6cb9dc1762427a96c78c639bccc41a61424564eafe1
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 798c7c005dee432b2c8ea5dfa381ecc3
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: b7a5794d52737475d53d5a377200849be0260a67a2b22ced8bbef12882270d07
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 637c31dc2591a07636f646b72daabbe7
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fca02f3d5011cfc5c1e23165d413a049d4526a991827424d896fe3435e0bf68e
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 179a49c712154bbffbe6e7a84a18e220
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: c47b0294dbbbee0fec4757f22ffeee3587ca4730c3d33b691df38bab076bc558
+IV: 00000000000000000000000000000000
+Ciphertext: 46f2fb342d6f0ab477476fc501242c5f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 28d46cffa158533194214a91e712fc2b45b518076675affd910edeca5f41ac64
+IV: 00000000000000000000000000000000
+Ciphertext: 4bf3b0a69aeb6657794f2901b1440ad4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: c1cc358b449909a19436cfbb3f852ef8bcb5ed12ac7058325f56e6099aab1a1c
+IV: 00000000000000000000000000000000
+Ciphertext: 352065272169abf9856843927d0674fd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 984ca75f4ee8d706f46c2d98c0bf4a45f5b00d791c2dfeb191b5ed8e420fd627
+IV: 00000000000000000000000000000000
+Ciphertext: 4307456a9e67813b452e15fa8fffe398
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: b43d08a447ac8609baadae4ff12918b9f68fc1653f1269222f123981ded7a92f
+IV: 00000000000000000000000000000000
+Ciphertext: 4663446607354989477a5c6f0f007ef4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 1d85a181b54cde51f0e098095b2962fdc93b51fe9b88602b3f54130bf76a5bd9
+IV: 00000000000000000000000000000000
+Ciphertext: 531c2c38344578b84d50b3c917bbb6e1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: dc0eba1f2232a7879ded34ed8428eeb8769b056bbaf8ad77cb65c3541430b4cf
+IV: 00000000000000000000000000000000
+Ciphertext: fc6aec906323480005c58e7e1ab004ad
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: f8be9ba615c5a952cabbca24f68f8593039624d524c816acda2c9183bd917cb9
+IV: 00000000000000000000000000000000
+Ciphertext: a3944b95ca0b52043584ef02151926a8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 797f8b3d176dac5b7e34a2d539c4ef367a16f8635f6264737591c5c07bf57a3e
+IV: 00000000000000000000000000000000
+Ciphertext: a74289fe73a4c123ca189ea1e1b49ad5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 6838d40caf927749c13f0329d331f448e202c73ef52c5f73a37ca635d4c47707
+IV: 00000000000000000000000000000000
+Ciphertext: b91d4ea4488644b56cf0812fa7fcf5fc
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ccd1bc3c659cd3c59bc437484e3c5c724441da8d6e90ce556cd57d0752663bbc
+IV: 00000000000000000000000000000000
+Ciphertext: 304f81ab61a80c2e743b94d5002a126b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 13428b5e4c005e0636dd338405d173ab135dec2a25c22c5df0722d69dcc43887
+IV: 00000000000000000000000000000000
+Ciphertext: 649a71545378c783e368c9ade7114f6c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 07eb03a08d291d1b07408bf3512ab40c91097ac77461aad4bb859647f74f00ee
+IV: 00000000000000000000000000000000
+Ciphertext: 47cb030da2ab051dfc6c4bf6910d12bb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 90143ae20cd78c5d8ebdd6cb9dc1762427a96c78c639bccc41a61424564eafe1
+IV: 00000000000000000000000000000000
+Ciphertext: 798c7c005dee432b2c8ea5dfa381ecc3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: b7a5794d52737475d53d5a377200849be0260a67a2b22ced8bbef12882270d07
+IV: 00000000000000000000000000000000
+Ciphertext: 637c31dc2591a07636f646b72daabbe7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fca02f3d5011cfc5c1e23165d413a049d4526a991827424d896fe3435e0bf68e
+IV: 00000000000000000000000000000000
+Ciphertext: 179a49c712154bbffbe6e7a84a18e220
+Plaintext: 00000000000000000000000000000000
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_var_key.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_var_key.txt
new file mode 100644
index 0000000..101780e
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_var_key.txt
@@ -0,0 +1,3586 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCVarKey256.rsp -extra-labels=Cipher=AES-256-CBC"
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 8000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e35a6dcb19b201a01ebcfa8aa22b5759
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: c000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b29169cdcf2d83e838125a12ee6aa400
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: e000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d8f3a72fc3cdf74dfaf6c3e6b97b2fa6
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: f000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1c777679d50037c79491a94da76a9a35
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: f800000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9cf4893ecafa0a0247a898e040691559
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fc00000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8fbb413703735326310a269bd3aa94b2
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fe00000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 60e32246bed2b0e859e55c1cc6b26502
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ff00000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ec52a212f80a09df6317021bc2a9819e
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ff80000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f23e5b600eb70dbccf6c0b1d9a68182c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffc0000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a3f599d63a82a968c33fe26590745970
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffe0000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d1ccb9b1337002cbac42c520b5d67722
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fff0000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cc111f6c37cf40a1159d00fb59fb0488
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fff8000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dc43b51ab609052372989a26e9cdd714
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffc000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4dcede8da9e2578f39703d4433dc6459
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffe000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1a4c1c263bbccfafc11782894685e3a8
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffff000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 937ad84880db50613423d6d527a2823d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffff800000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 610b71dfc688e150d8152c5b35ebc14d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffc00000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 27ef2495dabf323885aab39c80f18d8b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffe00000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 633cafea395bc03adae3a1e2068e4b4e
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffff00000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6e1b482b53761cf631819b749a6f3724
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffff80000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 976e6f851ab52c771998dbb2d71c75a9
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffc0000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 85f2ba84f8c307cf525e124c3e22e6cc
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffe0000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6bcca98bf6a835fa64955f72de4115fe
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffff0000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2c75e2d36eebd65411f14fd0eb1d2a06
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffff8000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: bd49295006250ffca5100b6007a0eade
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffc000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a190527d0ef7c70f459cd3940df316ec
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffe000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: bbd1097a62433f79449fa97d4ee80dbf
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffff000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 07058e408f5b99b0e0f061a1761b5b3b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffff800000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5fd1f13fa0f31e37fabde328f894eac2
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffc00000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fc4af7c948df26e2ef3e01c1ee5b8f6f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffe00000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 829fd7208fb92d44a074a677ee9861ac
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffff00000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ad9fc613a703251b54c64a0e76431711
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffff80000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 33ac9eccc4cc75e2711618f80b1548e8
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffc0000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2025c74b8ad8f4cda17ee2049c4c902d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffe0000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f85ca05fe528f1ce9b790166e8d551e7
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffff0000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6f6238d8966048d4967154e0dad5a6c9
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffff8000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f2b21b4e7640a9b3346de8b82fb41e49
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffc000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f836f251ad1d11d49dc344628b1884e1
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffe000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 077e9470ae7abea5a9769d49182628c3
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffff000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e0dcc2d27fc9865633f85223cf0d611f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffff800000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: be66cfea2fecd6bf0ec7b4352c99bcaa
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffc00000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: df31144f87a2ef523facdcf21a427804
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffe00000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b5bb0f5629fb6aae5e1839a3c3625d63
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffff00000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3c9db3335306fe1ec612bdbfae6b6028
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffff80000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3dd5c34634a79d3cfcc8339760e6f5f4
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffc0000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 82bda118a3ed7af314fa2ccc5c07b761
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffe0000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2937a64f7d4f46fe6fea3b349ec78e38
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffff0000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 225f068c28476605735ad671bb8f39f3
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffff8000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ae682c5ecd71898e08942ac9aa89875c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffc000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5e031cb9d676c3022d7f26227e85c38f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffe000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a78463fb064db5d52bb64bfef64f2dda
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffff000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8aa9b75e784593876c53a00eae5af52b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffff800000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3f84566df23da48af692722fe980573a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffc00000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 31690b5ed41c7eb42a1e83270a7ff0e6
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffe00000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 77dd7702646d55f08365e477d3590eda
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffff00000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4c022ac62b3cb78d739cc67b3e20bb7e
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffff80000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 092fa137ce18b5dfe7906f550bb13370
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffc0000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3e0cdadf2e68353c0027672c97144dd3
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffe0000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d8c4b200b383fc1f2b2ea677618a1d27
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffff0000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 11825f99b0e9bb3477c1c0713b015aac
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffff8000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f8b9fffb5c187f7ddc7ab10f4fb77576
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffc000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ffb4e87a32b37d6f2c8328d3b5377802
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffe000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d276c13a5d220f4da9224e74896391ce
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffff000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 94efe7a0e2e031e2536da01df799c927
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffff800000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8f8fd822680a85974e53a5a8eb9d38de
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffc00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e0f0a91b2e45f8cc37b7805a3042588d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffe00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 597a6252255e46d6364dbeeda31e279c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffff00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f51a0f694442b8f05571797fec7ee8bf
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffff80000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9ff071b165b5198a93dddeebc54d09b5
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffc0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c20a19fd5758b0c4bc1a5df89cf73877
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffe0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 97120166307119ca2280e9315668e96f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffff0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4b3b9f1e099c2a09dc091e90e4f18f0a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffff8000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: eb040b891d4b37f6851f7ec219cd3f6d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffc000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9f0fdec08b7fd79aa39535bea42db92a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffe000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2e70f168fc74bf911df240bcd2cef236
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffff000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 462ccd7f5fd1108dbc152f3cacad328b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffff800000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a4af534a7d0b643a01868785d86dfb95
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffc00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ab980296197e1a5022326c31da4bf6f3
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffe00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f97d57b3333b6281b07d486db2d4e20c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffff00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f33fa36720231afe4c759ade6bd62eb6
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffff80000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fdcfac0c02ca538343c68117e0a15938
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffc0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ad4916f5ee5772be764fc027b8a6e539
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffe0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2e16873e1678610d7e14c02d002ea845
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffff0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4e6e627c1acc51340053a8236d579576
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffff8000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ab0c8410aeeead92feec1eb430d652cb
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffc000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e86f7e23e835e114977f60e1a592202e
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffe000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e68ad5055a367041fade09d9a70a794b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffff000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0791823a3c666bb6162825e78606a7fe
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffff800000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dcca366a9bf47b7b868b77e25c18a364
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffc00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 684c9efc237e4a442965f84bce20247a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffe00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a858411ffbe63fdb9c8aa1bfaed67b52
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffff00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 04bc3da2179c3015498b0e03910db5b8
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffff80000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 40071eeab3f935dbc25d00841460260f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffc0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0ebd7c30ed2016e08ba806ddb008bcc8
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffe0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 15c6becf0f4cec7129cbd22d1a79b1b8
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffff0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0aeede5b91f721700e9e62edbf60b781
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffff8000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 266581af0dcfbed1585e0a242c64b8df
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffc000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6693dc911662ae473216ba22189a511a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffe000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7606fa36d86473e6fb3a1bb0e2c0adf5
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffff000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 112078e9e11fbb78e26ffb8899e96b9a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffff800000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 40b264e921e9e4a82694589ef3798262
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffc00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8d4595cb4fa7026715f55bd68e2882f9
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffe00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b588a302bdbc09197df1edae68926ed9
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffff00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 33f7502390b8a4a221cfecd0666624ba
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffff80000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3d20253adbce3be2373767c4d822c566
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffc0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a42734a3929bf84cf0116c9856a3c18c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffe0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e3abc4939457422bb957da3c56938c6d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffff0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 972bdd2e7c525130fadc8f76fc6f4b3f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffff8000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 84a83d7b94c699cbcb8a7d9b61f64093
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffc000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ce61d63514aded03d43e6ebfc3a9001f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffe000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6c839dd58eeae6b8a36af48ed63d2dc9
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffff000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cd5ece55b8da3bf622c4100df5de46f9
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffff800000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3b6f46f40e0ac5fc0a9c1105f800f48d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffc00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ba26d47da3aeb028de4fb5b3a854a24b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffe00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 87f53bf620d3677268445212904389d5
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffff00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 10617d28b5e0f4605492b182a5d7f9f6
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffff80000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9aaec4fabbf6fae2a71feff02e372b39
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffc0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3a90c62d88b5c42809abf782488ed130
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffe0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f1f1c5a40899e15772857ccb65c7a09a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffff0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 190843d29b25a3897c692ce1dd81ee52
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffff8000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a866bc65b6941d86e8420a7ffb0964db
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffc000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8193c6ff85225ced4255e92f6e078a14
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffe000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9661cb2424d7d4a380d547f9e7ec1cb9
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffff000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 86f93d9ec08453a071e2e2877877a9c8
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffff800000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 27eefa80ce6a4a9d598e3fec365434d2
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffc00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d62068444578e3ab39ce7ec95dd045dc
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffe00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b5f71d4dd9a71fe5d8bc8ba7e6ea3048
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffff00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6825a347ac479d4f9d95c5cb8d3fd7e9
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffff80000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e3714e94a5778955cc0346358e94783a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffc0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d836b44bb29e0c7d89fa4b2d4b677d2a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffe0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5d454b75021d76d4b84f873a8f877b92
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffff0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c3498f7eced2095314fc28115885b33f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffff8000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6e668856539ad8e405bd123fe6c88530
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffc000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8680db7f3a87b8605543cfdbe6754076
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffe000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6c5d03b13069c3658b3179be91b0800c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffff000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ef1b384ac4d93eda00c92add0995ea5f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffff800000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: bf8115805471741bd5ad20a03944790f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffc00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c64c24b6894b038b3c0d09b1df068b0b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffe00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3967a10cffe27d0178545fbf6a40544b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffff00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7c85e9c95de1a9ec5a5363a8a053472d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffff80000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a9eec03c8abec7ba68315c2c8c2316e0
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffc0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cac8e414c2f388227ae14986fc983524
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffe0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5d942b7f4622ce056c3ce3ce5f1dd9d6
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffff0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d240d648ce21a3020282c3f1b528a0b6
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffff8000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 45d089c36d5c5a4efc689e3b0de10dd5
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffc000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b4da5df4becb5462e03a0ed00d295629
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffe000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dcf4e129136c1a4b7a0f38935cc34b2b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffff000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d9a4c7618b0ce48a3d5aee1a1c0114c4
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffff800000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ca352df025c65c7b0bf306fbee0f36ba
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffc00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 238aca23fd3409f38af63378ed2f5473
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffe00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 59836a0e06a79691b36667d5380d8188
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffff00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 33905080f7acf1cdae0a91fc3e85aee4
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffff80000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 72c9e4646dbc3d6320fc6689d93e8833
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffc0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ba77413dea5925b7f5417ea47ff19f59
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffe0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6cae8129f843d86dc786a0fb1a184970
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffff0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fcfefb534100796eebbd990206754e19
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffff8000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8c791d5fdddf470da04f3e6dc4a5b5b5
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffc000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c93bbdc07a4611ae4bb266ea5034a387
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffe000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c102e38e489aa74762f3efc5bb23205a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 93201481665cbafc1fcc220bc545fb3d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff800000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4960757ec6ce68cf195e454cfd0f32ca
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffc00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: feec7ce6a6cbd07c043416737f1bbb33
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffe00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 11c5413904487a805d70a8edd9c35527
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 347846b2b2e36f1f0324c86f7f1b98e2
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff80000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 332eee1a0cbd19ca2d69b426894044f0
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffc0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 866b5b3977ba6efa5128efbda9ff03cd
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffe0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cc1445ee94c0f08cdee5c344ecd1e233
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: be288319029363c2622feba4b05dfdfe
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff8000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cfd1875523f3cd21c395651e6ee15e56
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffc000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cb5a408657837c53bf16f9d8465dce19
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffe000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ca0bf42cb107f55ccff2fc09ee08ca15
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fdd9bbb4a7dc2e4a23536a5880a2db67
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff800000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ede447b362c484993dec9442a3b46aef
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffc00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 10dffb05904bff7c4781df780ad26837
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffe00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c33bc13e8de88ac25232aa7496398783
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ca359c70803a3b2a3d542e8781dea975
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff80000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: bcc65b526f88d05b89ce8a52021fdb06
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffc0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: db91a38855c8c4643851fbfb358b0109
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ca6e8893a114ae8e27d5ab03a5499610
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6629d2b8df97da728cdd8b1e7f945077
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff8000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4570a5a18cfc0dd582f1d88d5c9a1720
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffc000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 72bc65aa8e89562e3f274d45af1cd10b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffe000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 98551da1a6503276ae1c77625f9ea615
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0ddfe51ced7e3f4ae927daa3fe452cee
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff800000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: db826251e4ce384b80218b0e1da1dd4c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffc00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2cacf728b88abbad7011ed0e64a1680c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 330d8ee7c5677e099ac74c9994ee4cfb
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: edf61ae362e882ddc0167474a7a77f3a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff80000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6168b00ba7859e0970ecfd757efecf7c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d1415447866230d28bb1ea18a4cdfd02
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 516183392f7a8763afec68a060264141
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 77565c8d73cfd4130b4aa14d8911710f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 37232a4ed21ccc27c19c9610078cabac
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffc000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 804f32ea71828c7d329077e712231666
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d64424f23cb97215e9c2c6f28d29eab7
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 023e82b533f68c75c238cebdb2ee89a2
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffff800000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 193a3d24157a51f1ee0893f6777417e7
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffc00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 84ecacfcd400084d078612b1945f2ef5
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1dcd8bb173259eb33a5242b0de31a455
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 35e9eddbc375e792c19992c19165012b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8a772231c01dfdd7c98e4cfddcc0807a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6eda7ff6b8319180ff0d6e65629d01c3
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c267ef0e2d01a993944dd397101413cb
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e9f80e9d845bcc0f62926af72eabca39
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6702990727aa0878637b45dcd3a3b074
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffc000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2e2e647d5360e09230a5d738ca33471e
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1f56413c7add6f43d1d56e4f02190330
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 69cd0606e15af729d6bca143016d9842
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffff800000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a085d7c1a500873a20099c4caa3c3f5b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffc00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4fc0d230f8891415b87b83f95f2e09d1
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4327d08c523d8eba697a4336507d1f42
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7a15aab82701efa5ae36ab1d6b76290f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffff80000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5bf0051893a18bb30e139a58fed0fa54
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffc0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 97e8adf65638fd9cdf3bc22c17fe4dbd
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1ee6ee326583a0586491c96418d1a35d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 26b549c2ec756f82ecc48008e529956b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 70377b6da669b072129e057cc28e9ca5
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffc000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9c94b8b0cb8bcc919072262b3fa05ad9
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2fbb83dfd0d7abcb05cd28cad2dfb523
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 96877803de77744bb970d0a91f4debae
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffff800000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7379f3370cf6e5ce12ae5969c8eea312
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 02dc99fa3d4f98ce80985e7233889313
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1e38e759075ba5cab6457da51844295a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 70bed8dbf615868a1f9d9b05d3e7a267
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 234b148b8cb1d8c32b287e896903d150
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 294b033df4da853f4be3e243f7e513f4
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3f58c950f0367160adec45f2441e7411
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 37f655536a704e5ace182d742a820cf4
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ea7bd6bb63418731aeac790fe42d61e8
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffc000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e74a4c999b4c064e48bb1e413f51e5ea
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ba9ebefdb4ccf30f296cecb3bc1943e8
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3194367a4898c502c13bb7478640a72d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: da797713263d6f33a5478a65ef60d412
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d1ac39bb1ef86b9c1344f214679aa376
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2fdea9e650532be5bc0e7325337fd363
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d3a204dbd9c2af158b6ca67a5156ce4a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3a0a0e75a8da36735aee6684d965a778
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 52fc3e620492ea99641ea168da5b6d52
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d2e0c7f15b4772467d2cfc873000b2ca
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 563531135e0c4d70a38f8bdb190ba04e
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a8a39a0f5663f4c0fe5f2d3cafff421a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d94b5e90db354c1e42f61fabe167b2c0
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 50e6d3c9b6698a7cd276f96b1473f35a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9338f08e0ebee96905d8f2e825208f43
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8b378c86672aa54a3a266ba19d2580ca
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cca7c3086f5f9511b31233da7cab9160
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5b40ff4ec9be536ba23035fa4f06064c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 60eb5af8416b257149372194e8b88749
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2f005a8aed8a361c92e440c15520cbd1
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7b03627611678a997717578807a800e2
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cf78618f74f6f3696e0a4779b90b5a77
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 03720371a04962eaea0a852e69972858
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1f8a8133aa8ccf70e2bd3285831ca6b7
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 27936bd27fb1468fc8b48bc483321725
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b07d4f3e2cd2ef2eb545980754dfea0f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4bf85f1b5d54adbc307b0a048389adcb
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 8000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e35a6dcb19b201a01ebcfa8aa22b5759
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: c000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b29169cdcf2d83e838125a12ee6aa400
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: e000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d8f3a72fc3cdf74dfaf6c3e6b97b2fa6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: f000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1c777679d50037c79491a94da76a9a35
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: f800000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9cf4893ecafa0a0247a898e040691559
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fc00000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8fbb413703735326310a269bd3aa94b2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fe00000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 60e32246bed2b0e859e55c1cc6b26502
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ff00000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ec52a212f80a09df6317021bc2a9819e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ff80000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f23e5b600eb70dbccf6c0b1d9a68182c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffc0000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a3f599d63a82a968c33fe26590745970
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffe0000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d1ccb9b1337002cbac42c520b5d67722
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fff0000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cc111f6c37cf40a1159d00fb59fb0488
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fff8000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dc43b51ab609052372989a26e9cdd714
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffc000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4dcede8da9e2578f39703d4433dc6459
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffe000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1a4c1c263bbccfafc11782894685e3a8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffff000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 937ad84880db50613423d6d527a2823d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffff800000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 610b71dfc688e150d8152c5b35ebc14d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffc00000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 27ef2495dabf323885aab39c80f18d8b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffe00000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 633cafea395bc03adae3a1e2068e4b4e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffff00000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6e1b482b53761cf631819b749a6f3724
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffff80000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 976e6f851ab52c771998dbb2d71c75a9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffc0000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 85f2ba84f8c307cf525e124c3e22e6cc
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffe0000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6bcca98bf6a835fa64955f72de4115fe
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffff0000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2c75e2d36eebd65411f14fd0eb1d2a06
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffff8000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: bd49295006250ffca5100b6007a0eade
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffc000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a190527d0ef7c70f459cd3940df316ec
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffe000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: bbd1097a62433f79449fa97d4ee80dbf
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffff000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 07058e408f5b99b0e0f061a1761b5b3b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffff800000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5fd1f13fa0f31e37fabde328f894eac2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffc00000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fc4af7c948df26e2ef3e01c1ee5b8f6f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffe00000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 829fd7208fb92d44a074a677ee9861ac
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffff00000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ad9fc613a703251b54c64a0e76431711
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffff80000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 33ac9eccc4cc75e2711618f80b1548e8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffc0000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2025c74b8ad8f4cda17ee2049c4c902d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffe0000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f85ca05fe528f1ce9b790166e8d551e7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffff0000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6f6238d8966048d4967154e0dad5a6c9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffff8000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f2b21b4e7640a9b3346de8b82fb41e49
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffc000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f836f251ad1d11d49dc344628b1884e1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffe000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 077e9470ae7abea5a9769d49182628c3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffff000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e0dcc2d27fc9865633f85223cf0d611f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffff800000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: be66cfea2fecd6bf0ec7b4352c99bcaa
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffc00000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: df31144f87a2ef523facdcf21a427804
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffe00000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b5bb0f5629fb6aae5e1839a3c3625d63
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffff00000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3c9db3335306fe1ec612bdbfae6b6028
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffff80000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3dd5c34634a79d3cfcc8339760e6f5f4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffc0000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 82bda118a3ed7af314fa2ccc5c07b761
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffe0000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2937a64f7d4f46fe6fea3b349ec78e38
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffff0000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 225f068c28476605735ad671bb8f39f3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffff8000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ae682c5ecd71898e08942ac9aa89875c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffc000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5e031cb9d676c3022d7f26227e85c38f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffe000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a78463fb064db5d52bb64bfef64f2dda
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffff000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8aa9b75e784593876c53a00eae5af52b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffff800000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3f84566df23da48af692722fe980573a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffc00000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 31690b5ed41c7eb42a1e83270a7ff0e6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffe00000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 77dd7702646d55f08365e477d3590eda
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffff00000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4c022ac62b3cb78d739cc67b3e20bb7e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffff80000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 092fa137ce18b5dfe7906f550bb13370
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffc0000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3e0cdadf2e68353c0027672c97144dd3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffe0000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d8c4b200b383fc1f2b2ea677618a1d27
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffff0000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 11825f99b0e9bb3477c1c0713b015aac
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffff8000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f8b9fffb5c187f7ddc7ab10f4fb77576
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffc000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ffb4e87a32b37d6f2c8328d3b5377802
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffe000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d276c13a5d220f4da9224e74896391ce
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffff000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 94efe7a0e2e031e2536da01df799c927
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffff800000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8f8fd822680a85974e53a5a8eb9d38de
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffc00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e0f0a91b2e45f8cc37b7805a3042588d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffe00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 597a6252255e46d6364dbeeda31e279c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffff00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f51a0f694442b8f05571797fec7ee8bf
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffff80000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9ff071b165b5198a93dddeebc54d09b5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffc0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c20a19fd5758b0c4bc1a5df89cf73877
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffe0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 97120166307119ca2280e9315668e96f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffff0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4b3b9f1e099c2a09dc091e90e4f18f0a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffff8000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: eb040b891d4b37f6851f7ec219cd3f6d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffc000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9f0fdec08b7fd79aa39535bea42db92a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffe000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2e70f168fc74bf911df240bcd2cef236
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffff000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 462ccd7f5fd1108dbc152f3cacad328b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffff800000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a4af534a7d0b643a01868785d86dfb95
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffc00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ab980296197e1a5022326c31da4bf6f3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffe00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f97d57b3333b6281b07d486db2d4e20c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffff00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f33fa36720231afe4c759ade6bd62eb6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffff80000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fdcfac0c02ca538343c68117e0a15938
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffc0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ad4916f5ee5772be764fc027b8a6e539
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffe0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2e16873e1678610d7e14c02d002ea845
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffff0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4e6e627c1acc51340053a8236d579576
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffff8000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ab0c8410aeeead92feec1eb430d652cb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffc000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e86f7e23e835e114977f60e1a592202e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffe000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e68ad5055a367041fade09d9a70a794b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffff000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0791823a3c666bb6162825e78606a7fe
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffff800000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dcca366a9bf47b7b868b77e25c18a364
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffc00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 684c9efc237e4a442965f84bce20247a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffe00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a858411ffbe63fdb9c8aa1bfaed67b52
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffff00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 04bc3da2179c3015498b0e03910db5b8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffff80000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 40071eeab3f935dbc25d00841460260f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffc0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0ebd7c30ed2016e08ba806ddb008bcc8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffe0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 15c6becf0f4cec7129cbd22d1a79b1b8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffff0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0aeede5b91f721700e9e62edbf60b781
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffff8000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 266581af0dcfbed1585e0a242c64b8df
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffc000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6693dc911662ae473216ba22189a511a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffe000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7606fa36d86473e6fb3a1bb0e2c0adf5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffff000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 112078e9e11fbb78e26ffb8899e96b9a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffff800000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 40b264e921e9e4a82694589ef3798262
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffc00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8d4595cb4fa7026715f55bd68e2882f9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffe00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b588a302bdbc09197df1edae68926ed9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffff00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 33f7502390b8a4a221cfecd0666624ba
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffff80000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3d20253adbce3be2373767c4d822c566
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffc0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a42734a3929bf84cf0116c9856a3c18c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffe0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e3abc4939457422bb957da3c56938c6d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffff0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 972bdd2e7c525130fadc8f76fc6f4b3f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffff8000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 84a83d7b94c699cbcb8a7d9b61f64093
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffc000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ce61d63514aded03d43e6ebfc3a9001f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffe000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6c839dd58eeae6b8a36af48ed63d2dc9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffff000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cd5ece55b8da3bf622c4100df5de46f9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffff800000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3b6f46f40e0ac5fc0a9c1105f800f48d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffc00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ba26d47da3aeb028de4fb5b3a854a24b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffe00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 87f53bf620d3677268445212904389d5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffff00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 10617d28b5e0f4605492b182a5d7f9f6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffff80000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9aaec4fabbf6fae2a71feff02e372b39
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffc0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3a90c62d88b5c42809abf782488ed130
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffe0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f1f1c5a40899e15772857ccb65c7a09a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffff0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 190843d29b25a3897c692ce1dd81ee52
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffff8000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a866bc65b6941d86e8420a7ffb0964db
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffc000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8193c6ff85225ced4255e92f6e078a14
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffe000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9661cb2424d7d4a380d547f9e7ec1cb9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffff000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 86f93d9ec08453a071e2e2877877a9c8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffff800000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 27eefa80ce6a4a9d598e3fec365434d2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffc00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d62068444578e3ab39ce7ec95dd045dc
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffe00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b5f71d4dd9a71fe5d8bc8ba7e6ea3048
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffff00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6825a347ac479d4f9d95c5cb8d3fd7e9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffff80000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e3714e94a5778955cc0346358e94783a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffc0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d836b44bb29e0c7d89fa4b2d4b677d2a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffe0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5d454b75021d76d4b84f873a8f877b92
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffff0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c3498f7eced2095314fc28115885b33f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffff8000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6e668856539ad8e405bd123fe6c88530
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffc000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8680db7f3a87b8605543cfdbe6754076
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffe000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6c5d03b13069c3658b3179be91b0800c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffff000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ef1b384ac4d93eda00c92add0995ea5f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffff800000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: bf8115805471741bd5ad20a03944790f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffc00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c64c24b6894b038b3c0d09b1df068b0b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffe00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3967a10cffe27d0178545fbf6a40544b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffff00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7c85e9c95de1a9ec5a5363a8a053472d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffff80000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a9eec03c8abec7ba68315c2c8c2316e0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffc0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cac8e414c2f388227ae14986fc983524
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffe0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5d942b7f4622ce056c3ce3ce5f1dd9d6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffff0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d240d648ce21a3020282c3f1b528a0b6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffff8000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 45d089c36d5c5a4efc689e3b0de10dd5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffc000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b4da5df4becb5462e03a0ed00d295629
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffe000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dcf4e129136c1a4b7a0f38935cc34b2b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffff000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d9a4c7618b0ce48a3d5aee1a1c0114c4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffff800000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ca352df025c65c7b0bf306fbee0f36ba
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffc00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 238aca23fd3409f38af63378ed2f5473
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffe00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 59836a0e06a79691b36667d5380d8188
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffff00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 33905080f7acf1cdae0a91fc3e85aee4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffff80000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 72c9e4646dbc3d6320fc6689d93e8833
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffc0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ba77413dea5925b7f5417ea47ff19f59
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffe0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6cae8129f843d86dc786a0fb1a184970
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffff0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fcfefb534100796eebbd990206754e19
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffff8000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8c791d5fdddf470da04f3e6dc4a5b5b5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffc000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c93bbdc07a4611ae4bb266ea5034a387
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffe000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c102e38e489aa74762f3efc5bb23205a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 93201481665cbafc1fcc220bc545fb3d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff800000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4960757ec6ce68cf195e454cfd0f32ca
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffc00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: feec7ce6a6cbd07c043416737f1bbb33
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffe00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 11c5413904487a805d70a8edd9c35527
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 347846b2b2e36f1f0324c86f7f1b98e2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff80000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 332eee1a0cbd19ca2d69b426894044f0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffc0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 866b5b3977ba6efa5128efbda9ff03cd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffe0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cc1445ee94c0f08cdee5c344ecd1e233
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: be288319029363c2622feba4b05dfdfe
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff8000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cfd1875523f3cd21c395651e6ee15e56
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffc000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cb5a408657837c53bf16f9d8465dce19
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffe000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ca0bf42cb107f55ccff2fc09ee08ca15
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fdd9bbb4a7dc2e4a23536a5880a2db67
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff800000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ede447b362c484993dec9442a3b46aef
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffc00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 10dffb05904bff7c4781df780ad26837
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffe00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c33bc13e8de88ac25232aa7496398783
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ca359c70803a3b2a3d542e8781dea975
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff80000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: bcc65b526f88d05b89ce8a52021fdb06
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffc0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: db91a38855c8c4643851fbfb358b0109
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ca6e8893a114ae8e27d5ab03a5499610
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6629d2b8df97da728cdd8b1e7f945077
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff8000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4570a5a18cfc0dd582f1d88d5c9a1720
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffc000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 72bc65aa8e89562e3f274d45af1cd10b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffe000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 98551da1a6503276ae1c77625f9ea615
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0ddfe51ced7e3f4ae927daa3fe452cee
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff800000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: db826251e4ce384b80218b0e1da1dd4c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffc00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2cacf728b88abbad7011ed0e64a1680c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 330d8ee7c5677e099ac74c9994ee4cfb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: edf61ae362e882ddc0167474a7a77f3a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff80000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6168b00ba7859e0970ecfd757efecf7c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d1415447866230d28bb1ea18a4cdfd02
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 516183392f7a8763afec68a060264141
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 77565c8d73cfd4130b4aa14d8911710f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 37232a4ed21ccc27c19c9610078cabac
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffc000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 804f32ea71828c7d329077e712231666
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d64424f23cb97215e9c2c6f28d29eab7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 023e82b533f68c75c238cebdb2ee89a2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffff800000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 193a3d24157a51f1ee0893f6777417e7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffc00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 84ecacfcd400084d078612b1945f2ef5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1dcd8bb173259eb33a5242b0de31a455
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 35e9eddbc375e792c19992c19165012b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8a772231c01dfdd7c98e4cfddcc0807a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6eda7ff6b8319180ff0d6e65629d01c3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c267ef0e2d01a993944dd397101413cb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e9f80e9d845bcc0f62926af72eabca39
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6702990727aa0878637b45dcd3a3b074
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffc000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2e2e647d5360e09230a5d738ca33471e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1f56413c7add6f43d1d56e4f02190330
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 69cd0606e15af729d6bca143016d9842
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffff800000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a085d7c1a500873a20099c4caa3c3f5b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffc00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4fc0d230f8891415b87b83f95f2e09d1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4327d08c523d8eba697a4336507d1f42
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7a15aab82701efa5ae36ab1d6b76290f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffff80000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5bf0051893a18bb30e139a58fed0fa54
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffc0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 97e8adf65638fd9cdf3bc22c17fe4dbd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1ee6ee326583a0586491c96418d1a35d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 26b549c2ec756f82ecc48008e529956b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 70377b6da669b072129e057cc28e9ca5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffc000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9c94b8b0cb8bcc919072262b3fa05ad9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2fbb83dfd0d7abcb05cd28cad2dfb523
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 96877803de77744bb970d0a91f4debae
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffff800000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7379f3370cf6e5ce12ae5969c8eea312
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000000
+IV: 00000000000000000000000000000000
+Ciphertext: 02dc99fa3d4f98ce80985e7233889313
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1e38e759075ba5cab6457da51844295a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+IV: 00000000000000000000000000000000
+Ciphertext: 70bed8dbf615868a1f9d9b05d3e7a267
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000
+IV: 00000000000000000000000000000000
+Ciphertext: 234b148b8cb1d8c32b287e896903d150
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0000000
+IV: 00000000000000000000000000000000
+Ciphertext: 294b033df4da853f4be3e243f7e513f4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3f58c950f0367160adec45f2441e7411
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000
+IV: 00000000000000000000000000000000
+Ciphertext: 37f655536a704e5ace182d742a820cf4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000
+IV: 00000000000000000000000000000000
+Ciphertext: ea7bd6bb63418731aeac790fe42d61e8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffc000000
+IV: 00000000000000000000000000000000
+Ciphertext: e74a4c999b4c064e48bb1e413f51e5ea
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000
+IV: 00000000000000000000000000000000
+Ciphertext: ba9ebefdb4ccf30f296cecb3bc1943e8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3194367a4898c502c13bb7478640a72d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800000
+IV: 00000000000000000000000000000000
+Ciphertext: da797713263d6f33a5478a65ef60d412
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000
+IV: 00000000000000000000000000000000
+Ciphertext: d1ac39bb1ef86b9c1344f214679aa376
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000
+IV: 00000000000000000000000000000000
+Ciphertext: 2fdea9e650532be5bc0e7325337fd363
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000
+IV: 00000000000000000000000000000000
+Ciphertext: d3a204dbd9c2af158b6ca67a5156ce4a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000
+IV: 00000000000000000000000000000000
+Ciphertext: 3a0a0e75a8da36735aee6684d965a778
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0000
+IV: 00000000000000000000000000000000
+Ciphertext: 52fc3e620492ea99641ea168da5b6d52
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000
+IV: 00000000000000000000000000000000
+Ciphertext: d2e0c7f15b4772467d2cfc873000b2ca
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+IV: 00000000000000000000000000000000
+Ciphertext: 563531135e0c4d70a38f8bdb190ba04e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000
+IV: 00000000000000000000000000000000
+Ciphertext: a8a39a0f5663f4c0fe5f2d3cafff421a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc000
+IV: 00000000000000000000000000000000
+Ciphertext: d94b5e90db354c1e42f61fabe167b2c0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000
+IV: 00000000000000000000000000000000
+Ciphertext: 50e6d3c9b6698a7cd276f96b1473f35a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000
+IV: 00000000000000000000000000000000
+Ciphertext: 9338f08e0ebee96905d8f2e825208f43
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800
+IV: 00000000000000000000000000000000
+Ciphertext: 8b378c86672aa54a3a266ba19d2580ca
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00
+IV: 00000000000000000000000000000000
+Ciphertext: cca7c3086f5f9511b31233da7cab9160
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00
+IV: 00000000000000000000000000000000
+Ciphertext: 5b40ff4ec9be536ba23035fa4f06064c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+IV: 00000000000000000000000000000000
+Ciphertext: 60eb5af8416b257149372194e8b88749
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80
+IV: 00000000000000000000000000000000
+Ciphertext: 2f005a8aed8a361c92e440c15520cbd1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0
+IV: 00000000000000000000000000000000
+Ciphertext: 7b03627611678a997717578807a800e2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0
+IV: 00000000000000000000000000000000
+Ciphertext: cf78618f74f6f3696e0a4779b90b5a77
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0
+IV: 00000000000000000000000000000000
+Ciphertext: 03720371a04962eaea0a852e69972858
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8
+IV: 00000000000000000000000000000000
+Ciphertext: 1f8a8133aa8ccf70e2bd3285831ca6b7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc
+IV: 00000000000000000000000000000000
+Ciphertext: 27936bd27fb1468fc8b48bc483321725
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe
+IV: 00000000000000000000000000000000
+Ciphertext: b07d4f3e2cd2ef2eb545980754dfea0f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+IV: 00000000000000000000000000000000
+Ciphertext: 4bf85f1b5d54adbc307b0a048389adcb
+Plaintext: 00000000000000000000000000000000
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_var_txt.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_var_txt.txt
new file mode 100644
index 0000000..6a30add
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_var_txt.txt
@@ -0,0 +1,1794 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCVarTxt256.rsp -extra-labels=Cipher=AES-256-CBC"
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 80000000000000000000000000000000
+Ciphertext: ddc6bf790c15760d8d9aeb6f9a75fd4e
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: c0000000000000000000000000000000
+Ciphertext: 0a6bdc6d4c1e6280301fd8e97ddbe601
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: e0000000000000000000000000000000
+Ciphertext: 9b80eefb7ebe2d2b16247aa0efc72f5d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: f0000000000000000000000000000000
+Ciphertext: 7f2c5ece07a98d8bee13c51177395ff7
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: f8000000000000000000000000000000
+Ciphertext: 7818d800dcf6f4be1e0e94f403d1e4c2
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fc000000000000000000000000000000
+Ciphertext: e74cd1c92f0919c35a0324123d6177d3
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fe000000000000000000000000000000
+Ciphertext: 8092a4dcf2da7e77e93bdd371dfed82e
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ff000000000000000000000000000000
+Ciphertext: 49af6b372135acef10132e548f217b17
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ff800000000000000000000000000000
+Ciphertext: 8bcd40f94ebb63b9f7909676e667f1e7
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffc00000000000000000000000000000
+Ciphertext: fe1cffb83f45dcfb38b29be438dbd3ab
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffe00000000000000000000000000000
+Ciphertext: 0dc58a8d886623705aec15cb1e70dc0e
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fff00000000000000000000000000000
+Ciphertext: c218faa16056bd0774c3e8d79c35a5e4
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fff80000000000000000000000000000
+Ciphertext: 047bba83f7aa841731504e012208fc9e
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffc0000000000000000000000000000
+Ciphertext: dc8f0e4915fd81ba70a331310882f6da
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffe0000000000000000000000000000
+Ciphertext: 1569859ea6b7206c30bf4fd0cbfac33c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffff0000000000000000000000000000
+Ciphertext: 300ade92f88f48fa2df730ec16ef44cd
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffff8000000000000000000000000000
+Ciphertext: 1fe6cc3c05965dc08eb0590c95ac71d0
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffc000000000000000000000000000
+Ciphertext: 59e858eaaa97fec38111275b6cf5abc0
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffe000000000000000000000000000
+Ciphertext: 2239455e7afe3b0616100288cc5a723b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffff000000000000000000000000000
+Ciphertext: 3ee500c5c8d63479717163e55c5c4522
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffff800000000000000000000000000
+Ciphertext: d5e38bf15f16d90e3e214041d774daa8
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffc00000000000000000000000000
+Ciphertext: b1f4066e6f4f187dfe5f2ad1b17819d0
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffe00000000000000000000000000
+Ciphertext: 6ef4cc4de49b11065d7af2909854794a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffff00000000000000000000000000
+Ciphertext: ac86bc606b6640c309e782f232bf367f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffff80000000000000000000000000
+Ciphertext: 36aff0ef7bf3280772cf4cac80a0d2b2
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffc0000000000000000000000000
+Ciphertext: 1f8eedea0f62a1406d58cfc3ecea72cf
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffe0000000000000000000000000
+Ciphertext: abf4154a3375a1d3e6b1d454438f95a6
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffff0000000000000000000000000
+Ciphertext: 96f96e9d607f6615fc192061ee648b07
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffff8000000000000000000000000
+Ciphertext: cf37cdaaa0d2d536c71857634c792064
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffc000000000000000000000000
+Ciphertext: fbd6640c80245c2b805373f130703127
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffe000000000000000000000000
+Ciphertext: 8d6a8afe55a6e481badae0d146f436db
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffff000000000000000000000000
+Ciphertext: 6a4981f2915e3e68af6c22385dd06756
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffff800000000000000000000000
+Ciphertext: 42a1136e5f8d8d21d3101998642d573b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffc00000000000000000000000
+Ciphertext: 9b471596dc69ae1586cee6158b0b0181
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffe00000000000000000000000
+Ciphertext: 753665c4af1eff33aa8b628bf8741cfd
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffff00000000000000000000000
+Ciphertext: 9a682acf40be01f5b2a4193c9a82404d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffff80000000000000000000000
+Ciphertext: 54fafe26e4287f17d1935f87eb9ade01
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffc0000000000000000000000
+Ciphertext: 49d541b2e74cfe73e6a8e8225f7bd449
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffe0000000000000000000000
+Ciphertext: 11a45530f624ff6f76a1b3826626ff7b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffff0000000000000000000000
+Ciphertext: f96b0c4a8bc6c86130289f60b43b8fba
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffff8000000000000000000000
+Ciphertext: 48c7d0e80834ebdc35b6735f76b46c8b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffc000000000000000000000
+Ciphertext: 2463531ab54d66955e73edc4cb8eaa45
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffe000000000000000000000
+Ciphertext: ac9bd8e2530469134b9d5b065d4f565b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffff000000000000000000000
+Ciphertext: 3f5f9106d0e52f973d4890e6f37e8a00
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffff800000000000000000000
+Ciphertext: 20ebc86f1304d272e2e207e59db639f0
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffc00000000000000000000
+Ciphertext: e67ae6426bf9526c972cff072b52252c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffe00000000000000000000
+Ciphertext: 1a518dddaf9efa0d002cc58d107edfc8
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffff00000000000000000000
+Ciphertext: ead731af4d3a2fe3b34bed047942a49f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffff80000000000000000000
+Ciphertext: b1d4efe40242f83e93b6c8d7efb5eae9
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffc0000000000000000000
+Ciphertext: cd2b1fec11fd906c5c7630099443610a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffe0000000000000000000
+Ciphertext: a1853fe47fe29289d153161d06387d21
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffff0000000000000000000
+Ciphertext: 4632154179a555c17ea604d0889fab14
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffff8000000000000000000
+Ciphertext: dd27cac6401a022e8f38f9f93e774417
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffc000000000000000000
+Ciphertext: c090313eb98674f35f3123385fb95d4d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffe000000000000000000
+Ciphertext: cc3526262b92f02edce548f716b9f45c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffff000000000000000000
+Ciphertext: c0838d1a2b16a7c7f0dfcc433c399c33
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffff800000000000000000
+Ciphertext: 0d9ac756eb297695eed4d382eb126d26
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffc00000000000000000
+Ciphertext: 56ede9dda3f6f141bff1757fa689c3e1
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffe00000000000000000
+Ciphertext: 768f520efe0f23e61d3ec8ad9ce91774
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffff00000000000000000
+Ciphertext: b1144ddfa75755213390e7c596660490
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffff80000000000000000
+Ciphertext: 1d7c0c4040b355b9d107a99325e3b050
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffc0000000000000000
+Ciphertext: d8e2bb1ae8ee3dcf5bf7d6c38da82a1a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffe0000000000000000
+Ciphertext: faf82d178af25a9886a47e7f789b98d7
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffff0000000000000000
+Ciphertext: 9b58dbfd77fe5aca9cfc190cd1b82d19
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffff8000000000000000
+Ciphertext: 77f392089042e478ac16c0c86a0b5db5
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffc000000000000000
+Ciphertext: 19f08e3420ee69b477ca1420281c4782
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffe000000000000000
+Ciphertext: a1b19beee4e117139f74b3c53fdcb875
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffff000000000000000
+Ciphertext: a37a5869b218a9f3a0868d19aea0ad6a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffff800000000000000
+Ciphertext: bc3594e865bcd0261b13202731f33580
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffc00000000000000
+Ciphertext: 811441ce1d309eee7185e8c752c07557
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffe00000000000000
+Ciphertext: 959971ce4134190563518e700b9874d1
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffff00000000000000
+Ciphertext: 76b5614a042707c98e2132e2e805fe63
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffff80000000000000
+Ciphertext: 7d9fa6a57530d0f036fec31c230b0cc6
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffc0000000000000
+Ciphertext: 964153a83bf6989a4ba80daa91c3e081
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffe0000000000000
+Ciphertext: a013014d4ce8054cf2591d06f6f2f176
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffff0000000000000
+Ciphertext: d1c5f6399bf382502e385eee1474a869
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffff8000000000000
+Ciphertext: 0007e20b8298ec354f0f5fe7470f36bd
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffc000000000000
+Ciphertext: b95ba05b332da61ef63a2b31fcad9879
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffe000000000000
+Ciphertext: 4620a49bd967491561669ab25dce45f4
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffff000000000000
+Ciphertext: 12e71214ae8e04f0bb63d7425c6f14d5
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffff800000000000
+Ciphertext: 4cc42fc1407b008fe350907c092e80ac
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffc00000000000
+Ciphertext: 08b244ce7cbc8ee97fbba808cb146fda
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffe00000000000
+Ciphertext: 39b333e8694f21546ad1edd9d87ed95b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffff00000000000
+Ciphertext: 3b271f8ab2e6e4a20ba8090f43ba78f3
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffff80000000000
+Ciphertext: 9ad983f3bf651cd0393f0a73cccdea50
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffc0000000000
+Ciphertext: 8f476cbff75c1f725ce18e4bbcd19b32
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffe0000000000
+Ciphertext: 905b6267f1d6ab5320835a133f096f2a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffff0000000000
+Ciphertext: 145b60d6d0193c23f4221848a892d61a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffff8000000000
+Ciphertext: 55cfb3fb6d75cad0445bbc8dafa25b0f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffc000000000
+Ciphertext: 7b8e7098e357ef71237d46d8b075b0f5
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffe000000000
+Ciphertext: 2bf27229901eb40f2df9d8398d1505ae
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffff000000000
+Ciphertext: 83a63402a77f9ad5c1e931a931ecd706
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffff800000000
+Ciphertext: 6f8ba6521152d31f2bada1843e26b973
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffc00000000
+Ciphertext: e5c3b8e30fd2d8e6239b17b44bd23bbd
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffe00000000
+Ciphertext: 1ac1f7102c59933e8b2ddc3f14e94baa
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffff00000000
+Ciphertext: 21d9ba49f276b45f11af8fc71a088e3d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffff80000000
+Ciphertext: 649f1cddc3792b4638635a392bc9bade
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffc0000000
+Ciphertext: e2775e4b59c1bc2e31a2078c11b5a08c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffe0000000
+Ciphertext: 2be1fae5048a25582a679ca10905eb80
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffff0000000
+Ciphertext: da86f292c6f41ea34fb2068df75ecc29
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffff8000000
+Ciphertext: 220df19f85d69b1b562fa69a3c5beca5
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffc000000
+Ciphertext: 1f11d5d0355e0b556ccdb6c7f5083b4d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffe000000
+Ciphertext: 62526b78be79cb384633c91f83b4151b
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffff000000
+Ciphertext: 90ddbcb950843592dd47bbef00fdc876
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffff800000
+Ciphertext: 2fd0e41c5b8402277354a7391d2618e2
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffc00000
+Ciphertext: 3cdf13e72dee4c581bafec70b85f9660
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffe00000
+Ciphertext: afa2ffc137577092e2b654fa199d2c43
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffff00000
+Ciphertext: 8d683ee63e60d208e343ce48dbc44cac
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffff80000
+Ciphertext: 705a4ef8ba2133729c20185c3d3a4763
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffc0000
+Ciphertext: 0861a861c3db4e94194211b77ed761b9
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffe0000
+Ciphertext: 4b00c27e8b26da7eab9d3a88dec8b031
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffff0000
+Ciphertext: 5f397bf03084820cc8810d52e5b666e9
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffff8000
+Ciphertext: 63fafabb72c07bfbd3ddc9b1203104b8
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffc000
+Ciphertext: 683e2140585b18452dd4ffbb93c95df9
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffe000
+Ciphertext: 286894e48e537f8763b56707d7d155c8
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffff000
+Ciphertext: a423deabc173dcf7e2c4c53e77d37cd1
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffff800
+Ciphertext: eb8168313e1cfdfdb5e986d5429cf172
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffc00
+Ciphertext: 27127daafc9accd2fb334ec3eba52323
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffe00
+Ciphertext: ee0715b96f72e3f7a22a5064fc592f4c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffff00
+Ciphertext: 29ee526770f2a11dcfa989d1ce88830f
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffff80
+Ciphertext: 0493370e054b09871130fe49af730a5a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffffc0
+Ciphertext: 9b7b940f6c509f9e44a4ee140448ee46
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffffe0
+Ciphertext: 2915be4a1ecfdcbe3e023811a12bb6c7
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffff0
+Ciphertext: 7240e524bc51d8c4d440b1be55d1062c
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffff8
+Ciphertext: da63039d38cb4612b2dc36ba26684b93
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffffc
+Ciphertext: 0f59cb5a4b522e2ac56c1a64f558ad9a
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: fffffffffffffffffffffffffffffffe
+Ciphertext: 7bfe9d876c6d63c1d035da8fe21c409d
+
+Cipher: AES-256-CBC
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: ffffffffffffffffffffffffffffffff
+Ciphertext: acdace8078a32b1a182bfa4987ca1347
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ddc6bf790c15760d8d9aeb6f9a75fd4e
+Plaintext: 80000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0a6bdc6d4c1e6280301fd8e97ddbe601
+Plaintext: c0000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9b80eefb7ebe2d2b16247aa0efc72f5d
+Plaintext: e0000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7f2c5ece07a98d8bee13c51177395ff7
+Plaintext: f0000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7818d800dcf6f4be1e0e94f403d1e4c2
+Plaintext: f8000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e74cd1c92f0919c35a0324123d6177d3
+Plaintext: fc000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8092a4dcf2da7e77e93bdd371dfed82e
+Plaintext: fe000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 49af6b372135acef10132e548f217b17
+Plaintext: ff000000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8bcd40f94ebb63b9f7909676e667f1e7
+Plaintext: ff800000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fe1cffb83f45dcfb38b29be438dbd3ab
+Plaintext: ffc00000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0dc58a8d886623705aec15cb1e70dc0e
+Plaintext: ffe00000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c218faa16056bd0774c3e8d79c35a5e4
+Plaintext: fff00000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 047bba83f7aa841731504e012208fc9e
+Plaintext: fff80000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dc8f0e4915fd81ba70a331310882f6da
+Plaintext: fffc0000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1569859ea6b7206c30bf4fd0cbfac33c
+Plaintext: fffe0000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 300ade92f88f48fa2df730ec16ef44cd
+Plaintext: ffff0000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1fe6cc3c05965dc08eb0590c95ac71d0
+Plaintext: ffff8000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 59e858eaaa97fec38111275b6cf5abc0
+Plaintext: ffffc000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2239455e7afe3b0616100288cc5a723b
+Plaintext: ffffe000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3ee500c5c8d63479717163e55c5c4522
+Plaintext: fffff000000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d5e38bf15f16d90e3e214041d774daa8
+Plaintext: fffff800000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b1f4066e6f4f187dfe5f2ad1b17819d0
+Plaintext: fffffc00000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6ef4cc4de49b11065d7af2909854794a
+Plaintext: fffffe00000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ac86bc606b6640c309e782f232bf367f
+Plaintext: ffffff00000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 36aff0ef7bf3280772cf4cac80a0d2b2
+Plaintext: ffffff80000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1f8eedea0f62a1406d58cfc3ecea72cf
+Plaintext: ffffffc0000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: abf4154a3375a1d3e6b1d454438f95a6
+Plaintext: ffffffe0000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 96f96e9d607f6615fc192061ee648b07
+Plaintext: fffffff0000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cf37cdaaa0d2d536c71857634c792064
+Plaintext: fffffff8000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fbd6640c80245c2b805373f130703127
+Plaintext: fffffffc000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8d6a8afe55a6e481badae0d146f436db
+Plaintext: fffffffe000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6a4981f2915e3e68af6c22385dd06756
+Plaintext: ffffffff000000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 42a1136e5f8d8d21d3101998642d573b
+Plaintext: ffffffff800000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9b471596dc69ae1586cee6158b0b0181
+Plaintext: ffffffffc00000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 753665c4af1eff33aa8b628bf8741cfd
+Plaintext: ffffffffe00000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9a682acf40be01f5b2a4193c9a82404d
+Plaintext: fffffffff00000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 54fafe26e4287f17d1935f87eb9ade01
+Plaintext: fffffffff80000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 49d541b2e74cfe73e6a8e8225f7bd449
+Plaintext: fffffffffc0000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 11a45530f624ff6f76a1b3826626ff7b
+Plaintext: fffffffffe0000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f96b0c4a8bc6c86130289f60b43b8fba
+Plaintext: ffffffffff0000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 48c7d0e80834ebdc35b6735f76b46c8b
+Plaintext: ffffffffff8000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2463531ab54d66955e73edc4cb8eaa45
+Plaintext: ffffffffffc000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ac9bd8e2530469134b9d5b065d4f565b
+Plaintext: ffffffffffe000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3f5f9106d0e52f973d4890e6f37e8a00
+Plaintext: fffffffffff000000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 20ebc86f1304d272e2e207e59db639f0
+Plaintext: fffffffffff800000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e67ae6426bf9526c972cff072b52252c
+Plaintext: fffffffffffc00000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1a518dddaf9efa0d002cc58d107edfc8
+Plaintext: fffffffffffe00000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ead731af4d3a2fe3b34bed047942a49f
+Plaintext: ffffffffffff00000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b1d4efe40242f83e93b6c8d7efb5eae9
+Plaintext: ffffffffffff80000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cd2b1fec11fd906c5c7630099443610a
+Plaintext: ffffffffffffc0000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a1853fe47fe29289d153161d06387d21
+Plaintext: ffffffffffffe0000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4632154179a555c17ea604d0889fab14
+Plaintext: fffffffffffff0000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dd27cac6401a022e8f38f9f93e774417
+Plaintext: fffffffffffff8000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c090313eb98674f35f3123385fb95d4d
+Plaintext: fffffffffffffc000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cc3526262b92f02edce548f716b9f45c
+Plaintext: fffffffffffffe000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c0838d1a2b16a7c7f0dfcc433c399c33
+Plaintext: ffffffffffffff000000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0d9ac756eb297695eed4d382eb126d26
+Plaintext: ffffffffffffff800000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 56ede9dda3f6f141bff1757fa689c3e1
+Plaintext: ffffffffffffffc00000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 768f520efe0f23e61d3ec8ad9ce91774
+Plaintext: ffffffffffffffe00000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b1144ddfa75755213390e7c596660490
+Plaintext: fffffffffffffff00000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1d7c0c4040b355b9d107a99325e3b050
+Plaintext: fffffffffffffff80000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d8e2bb1ae8ee3dcf5bf7d6c38da82a1a
+Plaintext: fffffffffffffffc0000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: faf82d178af25a9886a47e7f789b98d7
+Plaintext: fffffffffffffffe0000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9b58dbfd77fe5aca9cfc190cd1b82d19
+Plaintext: ffffffffffffffff0000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 77f392089042e478ac16c0c86a0b5db5
+Plaintext: ffffffffffffffff8000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 19f08e3420ee69b477ca1420281c4782
+Plaintext: ffffffffffffffffc000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a1b19beee4e117139f74b3c53fdcb875
+Plaintext: ffffffffffffffffe000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a37a5869b218a9f3a0868d19aea0ad6a
+Plaintext: fffffffffffffffff000000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: bc3594e865bcd0261b13202731f33580
+Plaintext: fffffffffffffffff800000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 811441ce1d309eee7185e8c752c07557
+Plaintext: fffffffffffffffffc00000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 959971ce4134190563518e700b9874d1
+Plaintext: fffffffffffffffffe00000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 76b5614a042707c98e2132e2e805fe63
+Plaintext: ffffffffffffffffff00000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7d9fa6a57530d0f036fec31c230b0cc6
+Plaintext: ffffffffffffffffff80000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 964153a83bf6989a4ba80daa91c3e081
+Plaintext: ffffffffffffffffffc0000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a013014d4ce8054cf2591d06f6f2f176
+Plaintext: ffffffffffffffffffe0000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d1c5f6399bf382502e385eee1474a869
+Plaintext: fffffffffffffffffff0000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0007e20b8298ec354f0f5fe7470f36bd
+Plaintext: fffffffffffffffffff8000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b95ba05b332da61ef63a2b31fcad9879
+Plaintext: fffffffffffffffffffc000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4620a49bd967491561669ab25dce45f4
+Plaintext: fffffffffffffffffffe000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 12e71214ae8e04f0bb63d7425c6f14d5
+Plaintext: ffffffffffffffffffff000000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4cc42fc1407b008fe350907c092e80ac
+Plaintext: ffffffffffffffffffff800000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 08b244ce7cbc8ee97fbba808cb146fda
+Plaintext: ffffffffffffffffffffc00000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 39b333e8694f21546ad1edd9d87ed95b
+Plaintext: ffffffffffffffffffffe00000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3b271f8ab2e6e4a20ba8090f43ba78f3
+Plaintext: fffffffffffffffffffff00000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9ad983f3bf651cd0393f0a73cccdea50
+Plaintext: fffffffffffffffffffff80000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8f476cbff75c1f725ce18e4bbcd19b32
+Plaintext: fffffffffffffffffffffc0000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 905b6267f1d6ab5320835a133f096f2a
+Plaintext: fffffffffffffffffffffe0000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 145b60d6d0193c23f4221848a892d61a
+Plaintext: ffffffffffffffffffffff0000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 55cfb3fb6d75cad0445bbc8dafa25b0f
+Plaintext: ffffffffffffffffffffff8000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7b8e7098e357ef71237d46d8b075b0f5
+Plaintext: ffffffffffffffffffffffc000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2bf27229901eb40f2df9d8398d1505ae
+Plaintext: ffffffffffffffffffffffe000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 83a63402a77f9ad5c1e931a931ecd706
+Plaintext: fffffffffffffffffffffff000000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6f8ba6521152d31f2bada1843e26b973
+Plaintext: fffffffffffffffffffffff800000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e5c3b8e30fd2d8e6239b17b44bd23bbd
+Plaintext: fffffffffffffffffffffffc00000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1ac1f7102c59933e8b2ddc3f14e94baa
+Plaintext: fffffffffffffffffffffffe00000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 21d9ba49f276b45f11af8fc71a088e3d
+Plaintext: ffffffffffffffffffffffff00000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 649f1cddc3792b4638635a392bc9bade
+Plaintext: ffffffffffffffffffffffff80000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e2775e4b59c1bc2e31a2078c11b5a08c
+Plaintext: ffffffffffffffffffffffffc0000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2be1fae5048a25582a679ca10905eb80
+Plaintext: ffffffffffffffffffffffffe0000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: da86f292c6f41ea34fb2068df75ecc29
+Plaintext: fffffffffffffffffffffffff0000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 220df19f85d69b1b562fa69a3c5beca5
+Plaintext: fffffffffffffffffffffffff8000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1f11d5d0355e0b556ccdb6c7f5083b4d
+Plaintext: fffffffffffffffffffffffffc000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 62526b78be79cb384633c91f83b4151b
+Plaintext: fffffffffffffffffffffffffe000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 90ddbcb950843592dd47bbef00fdc876
+Plaintext: ffffffffffffffffffffffffff000000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2fd0e41c5b8402277354a7391d2618e2
+Plaintext: ffffffffffffffffffffffffff800000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3cdf13e72dee4c581bafec70b85f9660
+Plaintext: ffffffffffffffffffffffffffc00000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: afa2ffc137577092e2b654fa199d2c43
+Plaintext: ffffffffffffffffffffffffffe00000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8d683ee63e60d208e343ce48dbc44cac
+Plaintext: fffffffffffffffffffffffffff00000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 705a4ef8ba2133729c20185c3d3a4763
+Plaintext: fffffffffffffffffffffffffff80000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0861a861c3db4e94194211b77ed761b9
+Plaintext: fffffffffffffffffffffffffffc0000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4b00c27e8b26da7eab9d3a88dec8b031
+Plaintext: fffffffffffffffffffffffffffe0000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5f397bf03084820cc8810d52e5b666e9
+Plaintext: ffffffffffffffffffffffffffff0000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 63fafabb72c07bfbd3ddc9b1203104b8
+Plaintext: ffffffffffffffffffffffffffff8000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 683e2140585b18452dd4ffbb93c95df9
+Plaintext: ffffffffffffffffffffffffffffc000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 286894e48e537f8763b56707d7d155c8
+Plaintext: ffffffffffffffffffffffffffffe000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a423deabc173dcf7e2c4c53e77d37cd1
+Plaintext: fffffffffffffffffffffffffffff000
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: eb8168313e1cfdfdb5e986d5429cf172
+Plaintext: fffffffffffffffffffffffffffff800
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 27127daafc9accd2fb334ec3eba52323
+Plaintext: fffffffffffffffffffffffffffffc00
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ee0715b96f72e3f7a22a5064fc592f4c
+Plaintext: fffffffffffffffffffffffffffffe00
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 29ee526770f2a11dcfa989d1ce88830f
+Plaintext: ffffffffffffffffffffffffffffff00
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0493370e054b09871130fe49af730a5a
+Plaintext: ffffffffffffffffffffffffffffff80
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9b7b940f6c509f9e44a4ee140448ee46
+Plaintext: ffffffffffffffffffffffffffffffc0
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2915be4a1ecfdcbe3e023811a12bb6c7
+Plaintext: ffffffffffffffffffffffffffffffe0
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7240e524bc51d8c4d440b1be55d1062c
+Plaintext: fffffffffffffffffffffffffffffff0
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: da63039d38cb4612b2dc36ba26684b93
+Plaintext: fffffffffffffffffffffffffffffff8
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0f59cb5a4b522e2ac56c1a64f558ad9a
+Plaintext: fffffffffffffffffffffffffffffffc
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7bfe9d876c6d63c1d035da8fe21c409d
+Plaintext: fffffffffffffffffffffffffffffffe
+
+Cipher: AES-256-CBC
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: acdace8078a32b1a182bfa4987ca1347
+Plaintext: ffffffffffffffffffffffffffffffff
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_gf_sbox.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_gf_sbox.txt
new file mode 100644
index 0000000..110eb9b
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_gf_sbox.txt
@@ -0,0 +1,72 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCGFSbox256.rsp -extra-labels=Cipher=AES-256-CTR -swap-iv-plaintext"
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 014730f80ac625fe84f026c60bfd547d
+Ciphertext: 5c9d844ed46f9885085e5d6a4f94c7d7
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 0b24af36193ce4665f2825d7b4749c98
+Ciphertext: a9ff75bd7cf6613d3731c77c3b6d0c04
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 761c1fe41a18acf20d241650611d90f1
+Ciphertext: 623a52fcea5d443e48d9181ab32c7421
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 8a560769d605868ad80d819bdba03771
+Ciphertext: 38f2c7ae10612415d27ca190d27da8b4
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 91fbef2d15a97816060bee1feaa49afe
+Ciphertext: 1bc704f1bce135ceb810341b216d7abe
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5c9d844ed46f9885085e5d6a4f94c7d7
+IV: 014730f80ac625fe84f026c60bfd547d
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a9ff75bd7cf6613d3731c77c3b6d0c04
+IV: 0b24af36193ce4665f2825d7b4749c98
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 623a52fcea5d443e48d9181ab32c7421
+IV: 761c1fe41a18acf20d241650611d90f1
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 38f2c7ae10612415d27ca190d27da8b4
+IV: 8a560769d605868ad80d819bdba03771
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1bc704f1bce135ceb810341b216d7abe
+IV: 91fbef2d15a97816060bee1feaa49afe
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_key_sbox.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_key_sbox.txt
new file mode 100644
index 0000000..32769e4
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_key_sbox.txt
@@ -0,0 +1,226 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCKeySbox256.rsp -extra-labels=Cipher=AES-256-CTR"
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: c47b0294dbbbee0fec4757f22ffeee3587ca4730c3d33b691df38bab076bc558
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 46f2fb342d6f0ab477476fc501242c5f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 28d46cffa158533194214a91e712fc2b45b518076675affd910edeca5f41ac64
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4bf3b0a69aeb6657794f2901b1440ad4
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: c1cc358b449909a19436cfbb3f852ef8bcb5ed12ac7058325f56e6099aab1a1c
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 352065272169abf9856843927d0674fd
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 984ca75f4ee8d706f46c2d98c0bf4a45f5b00d791c2dfeb191b5ed8e420fd627
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4307456a9e67813b452e15fa8fffe398
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: b43d08a447ac8609baadae4ff12918b9f68fc1653f1269222f123981ded7a92f
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4663446607354989477a5c6f0f007ef4
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 1d85a181b54cde51f0e098095b2962fdc93b51fe9b88602b3f54130bf76a5bd9
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 531c2c38344578b84d50b3c917bbb6e1
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: dc0eba1f2232a7879ded34ed8428eeb8769b056bbaf8ad77cb65c3541430b4cf
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fc6aec906323480005c58e7e1ab004ad
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: f8be9ba615c5a952cabbca24f68f8593039624d524c816acda2c9183bd917cb9
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a3944b95ca0b52043584ef02151926a8
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 797f8b3d176dac5b7e34a2d539c4ef367a16f8635f6264737591c5c07bf57a3e
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a74289fe73a4c123ca189ea1e1b49ad5
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 6838d40caf927749c13f0329d331f448e202c73ef52c5f73a37ca635d4c47707
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b91d4ea4488644b56cf0812fa7fcf5fc
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ccd1bc3c659cd3c59bc437484e3c5c724441da8d6e90ce556cd57d0752663bbc
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 304f81ab61a80c2e743b94d5002a126b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 13428b5e4c005e0636dd338405d173ab135dec2a25c22c5df0722d69dcc43887
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 649a71545378c783e368c9ade7114f6c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 07eb03a08d291d1b07408bf3512ab40c91097ac77461aad4bb859647f74f00ee
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 47cb030da2ab051dfc6c4bf6910d12bb
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 90143ae20cd78c5d8ebdd6cb9dc1762427a96c78c639bccc41a61424564eafe1
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 798c7c005dee432b2c8ea5dfa381ecc3
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: b7a5794d52737475d53d5a377200849be0260a67a2b22ced8bbef12882270d07
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 637c31dc2591a07636f646b72daabbe7
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fca02f3d5011cfc5c1e23165d413a049d4526a991827424d896fe3435e0bf68e
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 179a49c712154bbffbe6e7a84a18e220
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: c47b0294dbbbee0fec4757f22ffeee3587ca4730c3d33b691df38bab076bc558
+IV: 00000000000000000000000000000000
+Ciphertext: 46f2fb342d6f0ab477476fc501242c5f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 28d46cffa158533194214a91e712fc2b45b518076675affd910edeca5f41ac64
+IV: 00000000000000000000000000000000
+Ciphertext: 4bf3b0a69aeb6657794f2901b1440ad4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: c1cc358b449909a19436cfbb3f852ef8bcb5ed12ac7058325f56e6099aab1a1c
+IV: 00000000000000000000000000000000
+Ciphertext: 352065272169abf9856843927d0674fd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 984ca75f4ee8d706f46c2d98c0bf4a45f5b00d791c2dfeb191b5ed8e420fd627
+IV: 00000000000000000000000000000000
+Ciphertext: 4307456a9e67813b452e15fa8fffe398
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: b43d08a447ac8609baadae4ff12918b9f68fc1653f1269222f123981ded7a92f
+IV: 00000000000000000000000000000000
+Ciphertext: 4663446607354989477a5c6f0f007ef4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 1d85a181b54cde51f0e098095b2962fdc93b51fe9b88602b3f54130bf76a5bd9
+IV: 00000000000000000000000000000000
+Ciphertext: 531c2c38344578b84d50b3c917bbb6e1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: dc0eba1f2232a7879ded34ed8428eeb8769b056bbaf8ad77cb65c3541430b4cf
+IV: 00000000000000000000000000000000
+Ciphertext: fc6aec906323480005c58e7e1ab004ad
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: f8be9ba615c5a952cabbca24f68f8593039624d524c816acda2c9183bd917cb9
+IV: 00000000000000000000000000000000
+Ciphertext: a3944b95ca0b52043584ef02151926a8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 797f8b3d176dac5b7e34a2d539c4ef367a16f8635f6264737591c5c07bf57a3e
+IV: 00000000000000000000000000000000
+Ciphertext: a74289fe73a4c123ca189ea1e1b49ad5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 6838d40caf927749c13f0329d331f448e202c73ef52c5f73a37ca635d4c47707
+IV: 00000000000000000000000000000000
+Ciphertext: b91d4ea4488644b56cf0812fa7fcf5fc
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ccd1bc3c659cd3c59bc437484e3c5c724441da8d6e90ce556cd57d0752663bbc
+IV: 00000000000000000000000000000000
+Ciphertext: 304f81ab61a80c2e743b94d5002a126b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 13428b5e4c005e0636dd338405d173ab135dec2a25c22c5df0722d69dcc43887
+IV: 00000000000000000000000000000000
+Ciphertext: 649a71545378c783e368c9ade7114f6c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 07eb03a08d291d1b07408bf3512ab40c91097ac77461aad4bb859647f74f00ee
+IV: 00000000000000000000000000000000
+Ciphertext: 47cb030da2ab051dfc6c4bf6910d12bb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 90143ae20cd78c5d8ebdd6cb9dc1762427a96c78c639bccc41a61424564eafe1
+IV: 00000000000000000000000000000000
+Ciphertext: 798c7c005dee432b2c8ea5dfa381ecc3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: b7a5794d52737475d53d5a377200849be0260a67a2b22ced8bbef12882270d07
+IV: 00000000000000000000000000000000
+Ciphertext: 637c31dc2591a07636f646b72daabbe7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fca02f3d5011cfc5c1e23165d413a049d4526a991827424d896fe3435e0bf68e
+IV: 00000000000000000000000000000000
+Ciphertext: 179a49c712154bbffbe6e7a84a18e220
+Plaintext: 00000000000000000000000000000000
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_var_key.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_var_key.txt
new file mode 100644
index 0000000..1a7e034
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_var_key.txt
@@ -0,0 +1,3586 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCVarKey256.rsp -extra-labels=Cipher=AES-256-CTR"
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 8000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e35a6dcb19b201a01ebcfa8aa22b5759
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: c000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b29169cdcf2d83e838125a12ee6aa400
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: e000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d8f3a72fc3cdf74dfaf6c3e6b97b2fa6
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: f000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1c777679d50037c79491a94da76a9a35
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: f800000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9cf4893ecafa0a0247a898e040691559
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fc00000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8fbb413703735326310a269bd3aa94b2
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fe00000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 60e32246bed2b0e859e55c1cc6b26502
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ff00000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ec52a212f80a09df6317021bc2a9819e
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ff80000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f23e5b600eb70dbccf6c0b1d9a68182c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffc0000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a3f599d63a82a968c33fe26590745970
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffe0000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d1ccb9b1337002cbac42c520b5d67722
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fff0000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cc111f6c37cf40a1159d00fb59fb0488
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fff8000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dc43b51ab609052372989a26e9cdd714
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffc000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4dcede8da9e2578f39703d4433dc6459
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffe000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1a4c1c263bbccfafc11782894685e3a8
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffff000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 937ad84880db50613423d6d527a2823d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffff800000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 610b71dfc688e150d8152c5b35ebc14d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffc00000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 27ef2495dabf323885aab39c80f18d8b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffe00000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 633cafea395bc03adae3a1e2068e4b4e
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffff00000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6e1b482b53761cf631819b749a6f3724
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffff80000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 976e6f851ab52c771998dbb2d71c75a9
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffc0000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 85f2ba84f8c307cf525e124c3e22e6cc
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffe0000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6bcca98bf6a835fa64955f72de4115fe
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffff0000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2c75e2d36eebd65411f14fd0eb1d2a06
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffff8000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: bd49295006250ffca5100b6007a0eade
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffc000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a190527d0ef7c70f459cd3940df316ec
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffe000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: bbd1097a62433f79449fa97d4ee80dbf
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffff000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 07058e408f5b99b0e0f061a1761b5b3b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffff800000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5fd1f13fa0f31e37fabde328f894eac2
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffc00000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fc4af7c948df26e2ef3e01c1ee5b8f6f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffe00000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 829fd7208fb92d44a074a677ee9861ac
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffff00000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ad9fc613a703251b54c64a0e76431711
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffff80000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 33ac9eccc4cc75e2711618f80b1548e8
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffc0000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2025c74b8ad8f4cda17ee2049c4c902d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffe0000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f85ca05fe528f1ce9b790166e8d551e7
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffff0000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6f6238d8966048d4967154e0dad5a6c9
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffff8000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f2b21b4e7640a9b3346de8b82fb41e49
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffc000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f836f251ad1d11d49dc344628b1884e1
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffe000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 077e9470ae7abea5a9769d49182628c3
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffff000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e0dcc2d27fc9865633f85223cf0d611f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffff800000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: be66cfea2fecd6bf0ec7b4352c99bcaa
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffc00000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: df31144f87a2ef523facdcf21a427804
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffe00000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b5bb0f5629fb6aae5e1839a3c3625d63
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffff00000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3c9db3335306fe1ec612bdbfae6b6028
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffff80000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3dd5c34634a79d3cfcc8339760e6f5f4
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffc0000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 82bda118a3ed7af314fa2ccc5c07b761
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffe0000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2937a64f7d4f46fe6fea3b349ec78e38
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffff0000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 225f068c28476605735ad671bb8f39f3
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffff8000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ae682c5ecd71898e08942ac9aa89875c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffc000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5e031cb9d676c3022d7f26227e85c38f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffe000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a78463fb064db5d52bb64bfef64f2dda
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffff000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8aa9b75e784593876c53a00eae5af52b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffff800000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3f84566df23da48af692722fe980573a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffc00000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 31690b5ed41c7eb42a1e83270a7ff0e6
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffe00000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 77dd7702646d55f08365e477d3590eda
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffff00000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4c022ac62b3cb78d739cc67b3e20bb7e
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffff80000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 092fa137ce18b5dfe7906f550bb13370
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffc0000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3e0cdadf2e68353c0027672c97144dd3
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffe0000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d8c4b200b383fc1f2b2ea677618a1d27
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffff0000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 11825f99b0e9bb3477c1c0713b015aac
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffff8000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f8b9fffb5c187f7ddc7ab10f4fb77576
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffc000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ffb4e87a32b37d6f2c8328d3b5377802
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffe000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d276c13a5d220f4da9224e74896391ce
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffff000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 94efe7a0e2e031e2536da01df799c927
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffff800000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8f8fd822680a85974e53a5a8eb9d38de
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffc00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e0f0a91b2e45f8cc37b7805a3042588d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffe00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 597a6252255e46d6364dbeeda31e279c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffff00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f51a0f694442b8f05571797fec7ee8bf
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffff80000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9ff071b165b5198a93dddeebc54d09b5
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffc0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c20a19fd5758b0c4bc1a5df89cf73877
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffe0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 97120166307119ca2280e9315668e96f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffff0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4b3b9f1e099c2a09dc091e90e4f18f0a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffff8000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: eb040b891d4b37f6851f7ec219cd3f6d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffc000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9f0fdec08b7fd79aa39535bea42db92a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffe000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2e70f168fc74bf911df240bcd2cef236
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffff000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 462ccd7f5fd1108dbc152f3cacad328b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffff800000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a4af534a7d0b643a01868785d86dfb95
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffc00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ab980296197e1a5022326c31da4bf6f3
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffe00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f97d57b3333b6281b07d486db2d4e20c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffff00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f33fa36720231afe4c759ade6bd62eb6
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffff80000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fdcfac0c02ca538343c68117e0a15938
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffc0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ad4916f5ee5772be764fc027b8a6e539
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffe0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2e16873e1678610d7e14c02d002ea845
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffff0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4e6e627c1acc51340053a8236d579576
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffff8000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ab0c8410aeeead92feec1eb430d652cb
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffc000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e86f7e23e835e114977f60e1a592202e
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffe000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e68ad5055a367041fade09d9a70a794b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffff000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0791823a3c666bb6162825e78606a7fe
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffff800000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dcca366a9bf47b7b868b77e25c18a364
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffc00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 684c9efc237e4a442965f84bce20247a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffe00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a858411ffbe63fdb9c8aa1bfaed67b52
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffff00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 04bc3da2179c3015498b0e03910db5b8
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffff80000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 40071eeab3f935dbc25d00841460260f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffc0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0ebd7c30ed2016e08ba806ddb008bcc8
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffe0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 15c6becf0f4cec7129cbd22d1a79b1b8
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffff0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0aeede5b91f721700e9e62edbf60b781
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffff8000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 266581af0dcfbed1585e0a242c64b8df
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffc000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6693dc911662ae473216ba22189a511a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffe000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7606fa36d86473e6fb3a1bb0e2c0adf5
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffff000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 112078e9e11fbb78e26ffb8899e96b9a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffff800000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 40b264e921e9e4a82694589ef3798262
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffc00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8d4595cb4fa7026715f55bd68e2882f9
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffe00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b588a302bdbc09197df1edae68926ed9
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffff00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 33f7502390b8a4a221cfecd0666624ba
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffff80000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3d20253adbce3be2373767c4d822c566
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffc0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a42734a3929bf84cf0116c9856a3c18c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffe0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e3abc4939457422bb957da3c56938c6d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffff0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 972bdd2e7c525130fadc8f76fc6f4b3f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffff8000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 84a83d7b94c699cbcb8a7d9b61f64093
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffc000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ce61d63514aded03d43e6ebfc3a9001f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffe000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6c839dd58eeae6b8a36af48ed63d2dc9
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffff000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cd5ece55b8da3bf622c4100df5de46f9
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffff800000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3b6f46f40e0ac5fc0a9c1105f800f48d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffc00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ba26d47da3aeb028de4fb5b3a854a24b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffe00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 87f53bf620d3677268445212904389d5
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffff00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 10617d28b5e0f4605492b182a5d7f9f6
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffff80000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9aaec4fabbf6fae2a71feff02e372b39
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffc0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3a90c62d88b5c42809abf782488ed130
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffe0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f1f1c5a40899e15772857ccb65c7a09a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffff0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 190843d29b25a3897c692ce1dd81ee52
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffff8000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a866bc65b6941d86e8420a7ffb0964db
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffc000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8193c6ff85225ced4255e92f6e078a14
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffe000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9661cb2424d7d4a380d547f9e7ec1cb9
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffff000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 86f93d9ec08453a071e2e2877877a9c8
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffff800000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 27eefa80ce6a4a9d598e3fec365434d2
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffc00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d62068444578e3ab39ce7ec95dd045dc
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffe00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b5f71d4dd9a71fe5d8bc8ba7e6ea3048
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffff00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6825a347ac479d4f9d95c5cb8d3fd7e9
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffff80000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e3714e94a5778955cc0346358e94783a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffc0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d836b44bb29e0c7d89fa4b2d4b677d2a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffe0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5d454b75021d76d4b84f873a8f877b92
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffff0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c3498f7eced2095314fc28115885b33f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffff8000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6e668856539ad8e405bd123fe6c88530
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffc000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8680db7f3a87b8605543cfdbe6754076
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffe000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6c5d03b13069c3658b3179be91b0800c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffff000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ef1b384ac4d93eda00c92add0995ea5f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffff800000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: bf8115805471741bd5ad20a03944790f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffc00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c64c24b6894b038b3c0d09b1df068b0b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffe00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3967a10cffe27d0178545fbf6a40544b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffff00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7c85e9c95de1a9ec5a5363a8a053472d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffff80000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a9eec03c8abec7ba68315c2c8c2316e0
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffc0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cac8e414c2f388227ae14986fc983524
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffe0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5d942b7f4622ce056c3ce3ce5f1dd9d6
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffff0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d240d648ce21a3020282c3f1b528a0b6
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffff8000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 45d089c36d5c5a4efc689e3b0de10dd5
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffc000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b4da5df4becb5462e03a0ed00d295629
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffe000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dcf4e129136c1a4b7a0f38935cc34b2b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffff000000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d9a4c7618b0ce48a3d5aee1a1c0114c4
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffff800000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ca352df025c65c7b0bf306fbee0f36ba
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffc00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 238aca23fd3409f38af63378ed2f5473
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffe00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 59836a0e06a79691b36667d5380d8188
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffff00000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 33905080f7acf1cdae0a91fc3e85aee4
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffff80000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 72c9e4646dbc3d6320fc6689d93e8833
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffc0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ba77413dea5925b7f5417ea47ff19f59
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffe0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6cae8129f843d86dc786a0fb1a184970
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffff0000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fcfefb534100796eebbd990206754e19
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffff8000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8c791d5fdddf470da04f3e6dc4a5b5b5
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffc000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c93bbdc07a4611ae4bb266ea5034a387
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffe000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c102e38e489aa74762f3efc5bb23205a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff000000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 93201481665cbafc1fcc220bc545fb3d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff800000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4960757ec6ce68cf195e454cfd0f32ca
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffc00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: feec7ce6a6cbd07c043416737f1bbb33
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffe00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 11c5413904487a805d70a8edd9c35527
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff00000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 347846b2b2e36f1f0324c86f7f1b98e2
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff80000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 332eee1a0cbd19ca2d69b426894044f0
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffc0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 866b5b3977ba6efa5128efbda9ff03cd
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffe0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cc1445ee94c0f08cdee5c344ecd1e233
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff0000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: be288319029363c2622feba4b05dfdfe
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff8000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cfd1875523f3cd21c395651e6ee15e56
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffc000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cb5a408657837c53bf16f9d8465dce19
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffe000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ca0bf42cb107f55ccff2fc09ee08ca15
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff000000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fdd9bbb4a7dc2e4a23536a5880a2db67
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff800000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ede447b362c484993dec9442a3b46aef
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffc00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 10dffb05904bff7c4781df780ad26837
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffe00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c33bc13e8de88ac25232aa7496398783
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff00000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ca359c70803a3b2a3d542e8781dea975
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff80000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: bcc65b526f88d05b89ce8a52021fdb06
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffc0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: db91a38855c8c4643851fbfb358b0109
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ca6e8893a114ae8e27d5ab03a5499610
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6629d2b8df97da728cdd8b1e7f945077
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff8000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4570a5a18cfc0dd582f1d88d5c9a1720
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffc000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 72bc65aa8e89562e3f274d45af1cd10b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffe000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 98551da1a6503276ae1c77625f9ea615
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff000000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0ddfe51ced7e3f4ae927daa3fe452cee
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff800000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: db826251e4ce384b80218b0e1da1dd4c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffc00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2cacf728b88abbad7011ed0e64a1680c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 330d8ee7c5677e099ac74c9994ee4cfb
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff00000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: edf61ae362e882ddc0167474a7a77f3a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff80000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6168b00ba7859e0970ecfd757efecf7c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d1415447866230d28bb1ea18a4cdfd02
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 516183392f7a8763afec68a060264141
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 77565c8d73cfd4130b4aa14d8911710f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 37232a4ed21ccc27c19c9610078cabac
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffc000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 804f32ea71828c7d329077e712231666
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d64424f23cb97215e9c2c6f28d29eab7
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 023e82b533f68c75c238cebdb2ee89a2
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffff800000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 193a3d24157a51f1ee0893f6777417e7
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffc00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 84ecacfcd400084d078612b1945f2ef5
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1dcd8bb173259eb33a5242b0de31a455
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 35e9eddbc375e792c19992c19165012b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8a772231c01dfdd7c98e4cfddcc0807a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6eda7ff6b8319180ff0d6e65629d01c3
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c267ef0e2d01a993944dd397101413cb
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e9f80e9d845bcc0f62926af72eabca39
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6702990727aa0878637b45dcd3a3b074
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffc000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2e2e647d5360e09230a5d738ca33471e
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1f56413c7add6f43d1d56e4f02190330
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 69cd0606e15af729d6bca143016d9842
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffff800000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a085d7c1a500873a20099c4caa3c3f5b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffc00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4fc0d230f8891415b87b83f95f2e09d1
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4327d08c523d8eba697a4336507d1f42
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7a15aab82701efa5ae36ab1d6b76290f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffff80000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5bf0051893a18bb30e139a58fed0fa54
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffc0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 97e8adf65638fd9cdf3bc22c17fe4dbd
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1ee6ee326583a0586491c96418d1a35d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 26b549c2ec756f82ecc48008e529956b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 70377b6da669b072129e057cc28e9ca5
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffc000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9c94b8b0cb8bcc919072262b3fa05ad9
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2fbb83dfd0d7abcb05cd28cad2dfb523
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 96877803de77744bb970d0a91f4debae
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffff800000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7379f3370cf6e5ce12ae5969c8eea312
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 02dc99fa3d4f98ce80985e7233889313
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1e38e759075ba5cab6457da51844295a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 70bed8dbf615868a1f9d9b05d3e7a267
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 234b148b8cb1d8c32b287e896903d150
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 294b033df4da853f4be3e243f7e513f4
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3f58c950f0367160adec45f2441e7411
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 37f655536a704e5ace182d742a820cf4
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ea7bd6bb63418731aeac790fe42d61e8
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffc000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e74a4c999b4c064e48bb1e413f51e5ea
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ba9ebefdb4ccf30f296cecb3bc1943e8
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3194367a4898c502c13bb7478640a72d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: da797713263d6f33a5478a65ef60d412
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d1ac39bb1ef86b9c1344f214679aa376
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2fdea9e650532be5bc0e7325337fd363
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d3a204dbd9c2af158b6ca67a5156ce4a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3a0a0e75a8da36735aee6684d965a778
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 52fc3e620492ea99641ea168da5b6d52
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d2e0c7f15b4772467d2cfc873000b2ca
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 563531135e0c4d70a38f8bdb190ba04e
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a8a39a0f5663f4c0fe5f2d3cafff421a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d94b5e90db354c1e42f61fabe167b2c0
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 50e6d3c9b6698a7cd276f96b1473f35a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9338f08e0ebee96905d8f2e825208f43
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8b378c86672aa54a3a266ba19d2580ca
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cca7c3086f5f9511b31233da7cab9160
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5b40ff4ec9be536ba23035fa4f06064c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 60eb5af8416b257149372194e8b88749
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2f005a8aed8a361c92e440c15520cbd1
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7b03627611678a997717578807a800e2
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cf78618f74f6f3696e0a4779b90b5a77
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 03720371a04962eaea0a852e69972858
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1f8a8133aa8ccf70e2bd3285831ca6b7
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 27936bd27fb1468fc8b48bc483321725
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b07d4f3e2cd2ef2eb545980754dfea0f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+IV: 00000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4bf85f1b5d54adbc307b0a048389adcb
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 8000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e35a6dcb19b201a01ebcfa8aa22b5759
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: c000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b29169cdcf2d83e838125a12ee6aa400
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: e000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d8f3a72fc3cdf74dfaf6c3e6b97b2fa6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: f000000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1c777679d50037c79491a94da76a9a35
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: f800000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9cf4893ecafa0a0247a898e040691559
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fc00000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8fbb413703735326310a269bd3aa94b2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fe00000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 60e32246bed2b0e859e55c1cc6b26502
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ff00000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ec52a212f80a09df6317021bc2a9819e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ff80000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f23e5b600eb70dbccf6c0b1d9a68182c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffc0000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a3f599d63a82a968c33fe26590745970
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffe0000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d1ccb9b1337002cbac42c520b5d67722
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fff0000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cc111f6c37cf40a1159d00fb59fb0488
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fff8000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dc43b51ab609052372989a26e9cdd714
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffc000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4dcede8da9e2578f39703d4433dc6459
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffe000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1a4c1c263bbccfafc11782894685e3a8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffff000000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 937ad84880db50613423d6d527a2823d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffff800000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 610b71dfc688e150d8152c5b35ebc14d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffc00000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 27ef2495dabf323885aab39c80f18d8b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffe00000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 633cafea395bc03adae3a1e2068e4b4e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffff00000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6e1b482b53761cf631819b749a6f3724
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffff80000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 976e6f851ab52c771998dbb2d71c75a9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffc0000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 85f2ba84f8c307cf525e124c3e22e6cc
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffe0000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6bcca98bf6a835fa64955f72de4115fe
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffff0000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2c75e2d36eebd65411f14fd0eb1d2a06
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffff8000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: bd49295006250ffca5100b6007a0eade
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffc000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a190527d0ef7c70f459cd3940df316ec
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffe000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: bbd1097a62433f79449fa97d4ee80dbf
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffff000000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 07058e408f5b99b0e0f061a1761b5b3b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffff800000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5fd1f13fa0f31e37fabde328f894eac2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffc00000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fc4af7c948df26e2ef3e01c1ee5b8f6f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffe00000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 829fd7208fb92d44a074a677ee9861ac
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffff00000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ad9fc613a703251b54c64a0e76431711
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffff80000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 33ac9eccc4cc75e2711618f80b1548e8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffc0000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2025c74b8ad8f4cda17ee2049c4c902d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffe0000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f85ca05fe528f1ce9b790166e8d551e7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffff0000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6f6238d8966048d4967154e0dad5a6c9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffff8000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f2b21b4e7640a9b3346de8b82fb41e49
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffc000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f836f251ad1d11d49dc344628b1884e1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffe000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 077e9470ae7abea5a9769d49182628c3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffff000000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e0dcc2d27fc9865633f85223cf0d611f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffff800000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: be66cfea2fecd6bf0ec7b4352c99bcaa
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffc00000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: df31144f87a2ef523facdcf21a427804
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffe00000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b5bb0f5629fb6aae5e1839a3c3625d63
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffff00000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3c9db3335306fe1ec612bdbfae6b6028
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffff80000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3dd5c34634a79d3cfcc8339760e6f5f4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffc0000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 82bda118a3ed7af314fa2ccc5c07b761
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffe0000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2937a64f7d4f46fe6fea3b349ec78e38
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffff0000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 225f068c28476605735ad671bb8f39f3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffff8000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ae682c5ecd71898e08942ac9aa89875c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffc000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5e031cb9d676c3022d7f26227e85c38f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffe000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a78463fb064db5d52bb64bfef64f2dda
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffff000000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8aa9b75e784593876c53a00eae5af52b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffff800000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3f84566df23da48af692722fe980573a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffc00000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 31690b5ed41c7eb42a1e83270a7ff0e6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffe00000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 77dd7702646d55f08365e477d3590eda
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffff00000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4c022ac62b3cb78d739cc67b3e20bb7e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffff80000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 092fa137ce18b5dfe7906f550bb13370
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffc0000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3e0cdadf2e68353c0027672c97144dd3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffe0000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d8c4b200b383fc1f2b2ea677618a1d27
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffff0000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 11825f99b0e9bb3477c1c0713b015aac
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffff8000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f8b9fffb5c187f7ddc7ab10f4fb77576
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffc000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ffb4e87a32b37d6f2c8328d3b5377802
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffe000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d276c13a5d220f4da9224e74896391ce
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffff000000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 94efe7a0e2e031e2536da01df799c927
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffff800000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8f8fd822680a85974e53a5a8eb9d38de
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffc00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e0f0a91b2e45f8cc37b7805a3042588d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffe00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 597a6252255e46d6364dbeeda31e279c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffff00000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f51a0f694442b8f05571797fec7ee8bf
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffff80000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9ff071b165b5198a93dddeebc54d09b5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffc0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c20a19fd5758b0c4bc1a5df89cf73877
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffe0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 97120166307119ca2280e9315668e96f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffff0000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4b3b9f1e099c2a09dc091e90e4f18f0a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffff8000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: eb040b891d4b37f6851f7ec219cd3f6d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffc000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9f0fdec08b7fd79aa39535bea42db92a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffe000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2e70f168fc74bf911df240bcd2cef236
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffff000000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 462ccd7f5fd1108dbc152f3cacad328b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffff800000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a4af534a7d0b643a01868785d86dfb95
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffc00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ab980296197e1a5022326c31da4bf6f3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffe00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f97d57b3333b6281b07d486db2d4e20c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffff00000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f33fa36720231afe4c759ade6bd62eb6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffff80000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fdcfac0c02ca538343c68117e0a15938
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffc0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ad4916f5ee5772be764fc027b8a6e539
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffe0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2e16873e1678610d7e14c02d002ea845
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffff0000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4e6e627c1acc51340053a8236d579576
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffff8000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ab0c8410aeeead92feec1eb430d652cb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffc000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e86f7e23e835e114977f60e1a592202e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffe000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e68ad5055a367041fade09d9a70a794b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffff000000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0791823a3c666bb6162825e78606a7fe
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffff800000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dcca366a9bf47b7b868b77e25c18a364
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffc00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 684c9efc237e4a442965f84bce20247a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffe00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a858411ffbe63fdb9c8aa1bfaed67b52
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffff00000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 04bc3da2179c3015498b0e03910db5b8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffff80000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 40071eeab3f935dbc25d00841460260f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffc0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0ebd7c30ed2016e08ba806ddb008bcc8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffe0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 15c6becf0f4cec7129cbd22d1a79b1b8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffff0000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0aeede5b91f721700e9e62edbf60b781
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffff8000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 266581af0dcfbed1585e0a242c64b8df
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffc000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6693dc911662ae473216ba22189a511a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffe000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7606fa36d86473e6fb3a1bb0e2c0adf5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffff000000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 112078e9e11fbb78e26ffb8899e96b9a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffff800000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 40b264e921e9e4a82694589ef3798262
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffc00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8d4595cb4fa7026715f55bd68e2882f9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffe00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b588a302bdbc09197df1edae68926ed9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffff00000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 33f7502390b8a4a221cfecd0666624ba
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffff80000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3d20253adbce3be2373767c4d822c566
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffc0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a42734a3929bf84cf0116c9856a3c18c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffe0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e3abc4939457422bb957da3c56938c6d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffff0000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 972bdd2e7c525130fadc8f76fc6f4b3f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffff8000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 84a83d7b94c699cbcb8a7d9b61f64093
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffc000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ce61d63514aded03d43e6ebfc3a9001f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffe000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6c839dd58eeae6b8a36af48ed63d2dc9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffff000000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cd5ece55b8da3bf622c4100df5de46f9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffff800000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3b6f46f40e0ac5fc0a9c1105f800f48d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffc00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ba26d47da3aeb028de4fb5b3a854a24b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffe00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 87f53bf620d3677268445212904389d5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffff00000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 10617d28b5e0f4605492b182a5d7f9f6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffff80000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9aaec4fabbf6fae2a71feff02e372b39
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffc0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3a90c62d88b5c42809abf782488ed130
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffe0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: f1f1c5a40899e15772857ccb65c7a09a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffff0000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 190843d29b25a3897c692ce1dd81ee52
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffff8000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a866bc65b6941d86e8420a7ffb0964db
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffc000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8193c6ff85225ced4255e92f6e078a14
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffe000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9661cb2424d7d4a380d547f9e7ec1cb9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffff000000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 86f93d9ec08453a071e2e2877877a9c8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffff800000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 27eefa80ce6a4a9d598e3fec365434d2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffc00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d62068444578e3ab39ce7ec95dd045dc
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffe00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b5f71d4dd9a71fe5d8bc8ba7e6ea3048
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffff00000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6825a347ac479d4f9d95c5cb8d3fd7e9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffff80000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e3714e94a5778955cc0346358e94783a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffc0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d836b44bb29e0c7d89fa4b2d4b677d2a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffe0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5d454b75021d76d4b84f873a8f877b92
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffff0000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c3498f7eced2095314fc28115885b33f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffff8000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6e668856539ad8e405bd123fe6c88530
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffc000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8680db7f3a87b8605543cfdbe6754076
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffe000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6c5d03b13069c3658b3179be91b0800c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffff000000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ef1b384ac4d93eda00c92add0995ea5f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffff800000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: bf8115805471741bd5ad20a03944790f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffc00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c64c24b6894b038b3c0d09b1df068b0b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffe00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3967a10cffe27d0178545fbf6a40544b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffff00000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7c85e9c95de1a9ec5a5363a8a053472d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffff80000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a9eec03c8abec7ba68315c2c8c2316e0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffc0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cac8e414c2f388227ae14986fc983524
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffe0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5d942b7f4622ce056c3ce3ce5f1dd9d6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffff0000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d240d648ce21a3020282c3f1b528a0b6
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffff8000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 45d089c36d5c5a4efc689e3b0de10dd5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffc000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: b4da5df4becb5462e03a0ed00d295629
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffe000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: dcf4e129136c1a4b7a0f38935cc34b2b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffff000000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d9a4c7618b0ce48a3d5aee1a1c0114c4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffff800000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ca352df025c65c7b0bf306fbee0f36ba
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffc00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 238aca23fd3409f38af63378ed2f5473
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffe00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 59836a0e06a79691b36667d5380d8188
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffff00000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 33905080f7acf1cdae0a91fc3e85aee4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffff80000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 72c9e4646dbc3d6320fc6689d93e8833
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffc0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ba77413dea5925b7f5417ea47ff19f59
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffe0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6cae8129f843d86dc786a0fb1a184970
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffff0000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fcfefb534100796eebbd990206754e19
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffff8000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8c791d5fdddf470da04f3e6dc4a5b5b5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffc000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c93bbdc07a4611ae4bb266ea5034a387
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffe000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c102e38e489aa74762f3efc5bb23205a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff000000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 93201481665cbafc1fcc220bc545fb3d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffff800000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4960757ec6ce68cf195e454cfd0f32ca
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffc00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: feec7ce6a6cbd07c043416737f1bbb33
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffe00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 11c5413904487a805d70a8edd9c35527
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff00000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 347846b2b2e36f1f0324c86f7f1b98e2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffff80000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 332eee1a0cbd19ca2d69b426894044f0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffc0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 866b5b3977ba6efa5128efbda9ff03cd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffe0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cc1445ee94c0f08cdee5c344ecd1e233
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff0000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: be288319029363c2622feba4b05dfdfe
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffff8000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cfd1875523f3cd21c395651e6ee15e56
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffc000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: cb5a408657837c53bf16f9d8465dce19
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffe000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ca0bf42cb107f55ccff2fc09ee08ca15
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff000000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: fdd9bbb4a7dc2e4a23536a5880a2db67
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffff800000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ede447b362c484993dec9442a3b46aef
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffc00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 10dffb05904bff7c4781df780ad26837
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffe00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c33bc13e8de88ac25232aa7496398783
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff00000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ca359c70803a3b2a3d542e8781dea975
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffff80000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: bcc65b526f88d05b89ce8a52021fdb06
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffc0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: db91a38855c8c4643851fbfb358b0109
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: ca6e8893a114ae8e27d5ab03a5499610
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6629d2b8df97da728cdd8b1e7f945077
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffff8000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4570a5a18cfc0dd582f1d88d5c9a1720
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffc000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 72bc65aa8e89562e3f274d45af1cd10b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffe000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 98551da1a6503276ae1c77625f9ea615
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff000000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 0ddfe51ced7e3f4ae927daa3fe452cee
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffff800000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: db826251e4ce384b80218b0e1da1dd4c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffc00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2cacf728b88abbad7011ed0e64a1680c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffe00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 330d8ee7c5677e099ac74c9994ee4cfb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff00000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: edf61ae362e882ddc0167474a7a77f3a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffff80000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6168b00ba7859e0970ecfd757efecf7c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d1415447866230d28bb1ea18a4cdfd02
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 516183392f7a8763afec68a060264141
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 77565c8d73cfd4130b4aa14d8911710f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffff8000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 37232a4ed21ccc27c19c9610078cabac
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffc000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 804f32ea71828c7d329077e712231666
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffe000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: d64424f23cb97215e9c2c6f28d29eab7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 023e82b533f68c75c238cebdb2ee89a2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffff800000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 193a3d24157a51f1ee0893f6777417e7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffc00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 84ecacfcd400084d078612b1945f2ef5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffe00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1dcd8bb173259eb33a5242b0de31a455
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 35e9eddbc375e792c19992c19165012b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 8a772231c01dfdd7c98e4cfddcc0807a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffc0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6eda7ff6b8319180ff0d6e65629d01c3
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: c267ef0e2d01a993944dd397101413cb
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: e9f80e9d845bcc0f62926af72eabca39
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 6702990727aa0878637b45dcd3a3b074
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffc000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2e2e647d5360e09230a5d738ca33471e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffe000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1f56413c7add6f43d1d56e4f02190330
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 69cd0606e15af729d6bca143016d9842
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffff800000000000
+IV: 00000000000000000000000000000000
+Ciphertext: a085d7c1a500873a20099c4caa3c3f5b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffc00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4fc0d230f8891415b87b83f95f2e09d1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 4327d08c523d8eba697a4336507d1f42
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7a15aab82701efa5ae36ab1d6b76290f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffff80000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 5bf0051893a18bb30e139a58fed0fa54
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffc0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 97e8adf65638fd9cdf3bc22c17fe4dbd
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1ee6ee326583a0586491c96418d1a35d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 26b549c2ec756f82ecc48008e529956b
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 70377b6da669b072129e057cc28e9ca5
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffc000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 9c94b8b0cb8bcc919072262b3fa05ad9
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 2fbb83dfd0d7abcb05cd28cad2dfb523
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000
+IV: 00000000000000000000000000000000
+Ciphertext: 96877803de77744bb970d0a91f4debae
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffff800000000
+IV: 00000000000000000000000000000000
+Ciphertext: 7379f3370cf6e5ce12ae5969c8eea312
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000000
+IV: 00000000000000000000000000000000
+Ciphertext: 02dc99fa3d4f98ce80985e7233889313
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000000
+IV: 00000000000000000000000000000000
+Ciphertext: 1e38e759075ba5cab6457da51844295a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000
+IV: 00000000000000000000000000000000
+Ciphertext: 70bed8dbf615868a1f9d9b05d3e7a267
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000
+IV: 00000000000000000000000000000000
+Ciphertext: 234b148b8cb1d8c32b287e896903d150
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0000000
+IV: 00000000000000000000000000000000
+Ciphertext: 294b033df4da853f4be3e243f7e513f4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3f58c950f0367160adec45f2441e7411
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000
+IV: 00000000000000000000000000000000
+Ciphertext: 37f655536a704e5ace182d742a820cf4
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000000
+IV: 00000000000000000000000000000000
+Ciphertext: ea7bd6bb63418731aeac790fe42d61e8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffc000000
+IV: 00000000000000000000000000000000
+Ciphertext: e74a4c999b4c064e48bb1e413f51e5ea
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000000
+IV: 00000000000000000000000000000000
+Ciphertext: ba9ebefdb4ccf30f296cecb3bc1943e8
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000
+IV: 00000000000000000000000000000000
+Ciphertext: 3194367a4898c502c13bb7478640a72d
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800000
+IV: 00000000000000000000000000000000
+Ciphertext: da797713263d6f33a5478a65ef60d412
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000
+IV: 00000000000000000000000000000000
+Ciphertext: d1ac39bb1ef86b9c1344f214679aa376
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00000
+IV: 00000000000000000000000000000000
+Ciphertext: 2fdea9e650532be5bc0e7325337fd363
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000
+IV: 00000000000000000000000000000000
+Ciphertext: d3a204dbd9c2af158b6ca67a5156ce4a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000
+IV: 00000000000000000000000000000000
+Ciphertext: 3a0a0e75a8da36735aee6684d965a778
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0000
+IV: 00000000000000000000000000000000
+Ciphertext: 52fc3e620492ea99641ea168da5b6d52
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000
+IV: 00000000000000000000000000000000
+Ciphertext: d2e0c7f15b4772467d2cfc873000b2ca
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000
+IV: 00000000000000000000000000000000
+Ciphertext: 563531135e0c4d70a38f8bdb190ba04e
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000
+IV: 00000000000000000000000000000000
+Ciphertext: a8a39a0f5663f4c0fe5f2d3cafff421a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc000
+IV: 00000000000000000000000000000000
+Ciphertext: d94b5e90db354c1e42f61fabe167b2c0
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe000
+IV: 00000000000000000000000000000000
+Ciphertext: 50e6d3c9b6698a7cd276f96b1473f35a
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000
+IV: 00000000000000000000000000000000
+Ciphertext: 9338f08e0ebee96905d8f2e825208f43
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff800
+IV: 00000000000000000000000000000000
+Ciphertext: 8b378c86672aa54a3a266ba19d2580ca
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00
+IV: 00000000000000000000000000000000
+Ciphertext: cca7c3086f5f9511b31233da7cab9160
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00
+IV: 00000000000000000000000000000000
+Ciphertext: 5b40ff4ec9be536ba23035fa4f06064c
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
+IV: 00000000000000000000000000000000
+Ciphertext: 60eb5af8416b257149372194e8b88749
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80
+IV: 00000000000000000000000000000000
+Ciphertext: 2f005a8aed8a361c92e440c15520cbd1
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0
+IV: 00000000000000000000000000000000
+Ciphertext: 7b03627611678a997717578807a800e2
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0
+IV: 00000000000000000000000000000000
+Ciphertext: cf78618f74f6f3696e0a4779b90b5a77
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0
+IV: 00000000000000000000000000000000
+Ciphertext: 03720371a04962eaea0a852e69972858
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8
+IV: 00000000000000000000000000000000
+Ciphertext: 1f8a8133aa8ccf70e2bd3285831ca6b7
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc
+IV: 00000000000000000000000000000000
+Ciphertext: 27936bd27fb1468fc8b48bc483321725
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe
+IV: 00000000000000000000000000000000
+Ciphertext: b07d4f3e2cd2ef2eb545980754dfea0f
+Plaintext: 00000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+IV: 00000000000000000000000000000000
+Ciphertext: 4bf85f1b5d54adbc307b0a048389adcb
+Plaintext: 00000000000000000000000000000000
+
diff --git a/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_var_txt.txt b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_var_txt.txt
new file mode 100644
index 0000000..3a1c919
--- /dev/null
+++ b/src/crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_var_txt.txt
@@ -0,0 +1,1794 @@
+# Generated by "make_nist_aesvs_kat_tests -in kat_aes/CBCVarTxt256.rsp -extra-labels=Cipher=AES-256-CTR -swap-iv-plaintext"
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: 80000000000000000000000000000000
+Ciphertext: ddc6bf790c15760d8d9aeb6f9a75fd4e
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: c0000000000000000000000000000000
+Ciphertext: 0a6bdc6d4c1e6280301fd8e97ddbe601
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: e0000000000000000000000000000000
+Ciphertext: 9b80eefb7ebe2d2b16247aa0efc72f5d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: f0000000000000000000000000000000
+Ciphertext: 7f2c5ece07a98d8bee13c51177395ff7
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: f8000000000000000000000000000000
+Ciphertext: 7818d800dcf6f4be1e0e94f403d1e4c2
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fc000000000000000000000000000000
+Ciphertext: e74cd1c92f0919c35a0324123d6177d3
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fe000000000000000000000000000000
+Ciphertext: 8092a4dcf2da7e77e93bdd371dfed82e
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ff000000000000000000000000000000
+Ciphertext: 49af6b372135acef10132e548f217b17
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ff800000000000000000000000000000
+Ciphertext: 8bcd40f94ebb63b9f7909676e667f1e7
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffc00000000000000000000000000000
+Ciphertext: fe1cffb83f45dcfb38b29be438dbd3ab
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffe00000000000000000000000000000
+Ciphertext: 0dc58a8d886623705aec15cb1e70dc0e
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fff00000000000000000000000000000
+Ciphertext: c218faa16056bd0774c3e8d79c35a5e4
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fff80000000000000000000000000000
+Ciphertext: 047bba83f7aa841731504e012208fc9e
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffc0000000000000000000000000000
+Ciphertext: dc8f0e4915fd81ba70a331310882f6da
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffe0000000000000000000000000000
+Ciphertext: 1569859ea6b7206c30bf4fd0cbfac33c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffff0000000000000000000000000000
+Ciphertext: 300ade92f88f48fa2df730ec16ef44cd
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffff8000000000000000000000000000
+Ciphertext: 1fe6cc3c05965dc08eb0590c95ac71d0
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffc000000000000000000000000000
+Ciphertext: 59e858eaaa97fec38111275b6cf5abc0
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffe000000000000000000000000000
+Ciphertext: 2239455e7afe3b0616100288cc5a723b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffff000000000000000000000000000
+Ciphertext: 3ee500c5c8d63479717163e55c5c4522
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffff800000000000000000000000000
+Ciphertext: d5e38bf15f16d90e3e214041d774daa8
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffc00000000000000000000000000
+Ciphertext: b1f4066e6f4f187dfe5f2ad1b17819d0
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffe00000000000000000000000000
+Ciphertext: 6ef4cc4de49b11065d7af2909854794a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffff00000000000000000000000000
+Ciphertext: ac86bc606b6640c309e782f232bf367f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffff80000000000000000000000000
+Ciphertext: 36aff0ef7bf3280772cf4cac80a0d2b2
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffc0000000000000000000000000
+Ciphertext: 1f8eedea0f62a1406d58cfc3ecea72cf
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffe0000000000000000000000000
+Ciphertext: abf4154a3375a1d3e6b1d454438f95a6
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffff0000000000000000000000000
+Ciphertext: 96f96e9d607f6615fc192061ee648b07
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffff8000000000000000000000000
+Ciphertext: cf37cdaaa0d2d536c71857634c792064
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffc000000000000000000000000
+Ciphertext: fbd6640c80245c2b805373f130703127
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffe000000000000000000000000
+Ciphertext: 8d6a8afe55a6e481badae0d146f436db
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffff000000000000000000000000
+Ciphertext: 6a4981f2915e3e68af6c22385dd06756
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffff800000000000000000000000
+Ciphertext: 42a1136e5f8d8d21d3101998642d573b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffc00000000000000000000000
+Ciphertext: 9b471596dc69ae1586cee6158b0b0181
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffe00000000000000000000000
+Ciphertext: 753665c4af1eff33aa8b628bf8741cfd
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffff00000000000000000000000
+Ciphertext: 9a682acf40be01f5b2a4193c9a82404d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffff80000000000000000000000
+Ciphertext: 54fafe26e4287f17d1935f87eb9ade01
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffc0000000000000000000000
+Ciphertext: 49d541b2e74cfe73e6a8e8225f7bd449
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffe0000000000000000000000
+Ciphertext: 11a45530f624ff6f76a1b3826626ff7b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffff0000000000000000000000
+Ciphertext: f96b0c4a8bc6c86130289f60b43b8fba
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffff8000000000000000000000
+Ciphertext: 48c7d0e80834ebdc35b6735f76b46c8b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffc000000000000000000000
+Ciphertext: 2463531ab54d66955e73edc4cb8eaa45
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffe000000000000000000000
+Ciphertext: ac9bd8e2530469134b9d5b065d4f565b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffff000000000000000000000
+Ciphertext: 3f5f9106d0e52f973d4890e6f37e8a00
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffff800000000000000000000
+Ciphertext: 20ebc86f1304d272e2e207e59db639f0
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffc00000000000000000000
+Ciphertext: e67ae6426bf9526c972cff072b52252c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffe00000000000000000000
+Ciphertext: 1a518dddaf9efa0d002cc58d107edfc8
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffff00000000000000000000
+Ciphertext: ead731af4d3a2fe3b34bed047942a49f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffff80000000000000000000
+Ciphertext: b1d4efe40242f83e93b6c8d7efb5eae9
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffc0000000000000000000
+Ciphertext: cd2b1fec11fd906c5c7630099443610a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffe0000000000000000000
+Ciphertext: a1853fe47fe29289d153161d06387d21
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffff0000000000000000000
+Ciphertext: 4632154179a555c17ea604d0889fab14
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffff8000000000000000000
+Ciphertext: dd27cac6401a022e8f38f9f93e774417
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffc000000000000000000
+Ciphertext: c090313eb98674f35f3123385fb95d4d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffe000000000000000000
+Ciphertext: cc3526262b92f02edce548f716b9f45c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffff000000000000000000
+Ciphertext: c0838d1a2b16a7c7f0dfcc433c399c33
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffff800000000000000000
+Ciphertext: 0d9ac756eb297695eed4d382eb126d26
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffc00000000000000000
+Ciphertext: 56ede9dda3f6f141bff1757fa689c3e1
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffe00000000000000000
+Ciphertext: 768f520efe0f23e61d3ec8ad9ce91774
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffff00000000000000000
+Ciphertext: b1144ddfa75755213390e7c596660490
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffff80000000000000000
+Ciphertext: 1d7c0c4040b355b9d107a99325e3b050
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffc0000000000000000
+Ciphertext: d8e2bb1ae8ee3dcf5bf7d6c38da82a1a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffe0000000000000000
+Ciphertext: faf82d178af25a9886a47e7f789b98d7
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffff0000000000000000
+Ciphertext: 9b58dbfd77fe5aca9cfc190cd1b82d19
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffff8000000000000000
+Ciphertext: 77f392089042e478ac16c0c86a0b5db5
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffc000000000000000
+Ciphertext: 19f08e3420ee69b477ca1420281c4782
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffe000000000000000
+Ciphertext: a1b19beee4e117139f74b3c53fdcb875
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffff000000000000000
+Ciphertext: a37a5869b218a9f3a0868d19aea0ad6a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffff800000000000000
+Ciphertext: bc3594e865bcd0261b13202731f33580
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffc00000000000000
+Ciphertext: 811441ce1d309eee7185e8c752c07557
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffe00000000000000
+Ciphertext: 959971ce4134190563518e700b9874d1
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffff00000000000000
+Ciphertext: 76b5614a042707c98e2132e2e805fe63
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffff80000000000000
+Ciphertext: 7d9fa6a57530d0f036fec31c230b0cc6
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffc0000000000000
+Ciphertext: 964153a83bf6989a4ba80daa91c3e081
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffe0000000000000
+Ciphertext: a013014d4ce8054cf2591d06f6f2f176
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffff0000000000000
+Ciphertext: d1c5f6399bf382502e385eee1474a869
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffff8000000000000
+Ciphertext: 0007e20b8298ec354f0f5fe7470f36bd
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffc000000000000
+Ciphertext: b95ba05b332da61ef63a2b31fcad9879
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffe000000000000
+Ciphertext: 4620a49bd967491561669ab25dce45f4
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffff000000000000
+Ciphertext: 12e71214ae8e04f0bb63d7425c6f14d5
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffff800000000000
+Ciphertext: 4cc42fc1407b008fe350907c092e80ac
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffc00000000000
+Ciphertext: 08b244ce7cbc8ee97fbba808cb146fda
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffe00000000000
+Ciphertext: 39b333e8694f21546ad1edd9d87ed95b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffff00000000000
+Ciphertext: 3b271f8ab2e6e4a20ba8090f43ba78f3
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffff80000000000
+Ciphertext: 9ad983f3bf651cd0393f0a73cccdea50
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffc0000000000
+Ciphertext: 8f476cbff75c1f725ce18e4bbcd19b32
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffe0000000000
+Ciphertext: 905b6267f1d6ab5320835a133f096f2a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffff0000000000
+Ciphertext: 145b60d6d0193c23f4221848a892d61a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffff8000000000
+Ciphertext: 55cfb3fb6d75cad0445bbc8dafa25b0f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffc000000000
+Ciphertext: 7b8e7098e357ef71237d46d8b075b0f5
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffe000000000
+Ciphertext: 2bf27229901eb40f2df9d8398d1505ae
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffff000000000
+Ciphertext: 83a63402a77f9ad5c1e931a931ecd706
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffff800000000
+Ciphertext: 6f8ba6521152d31f2bada1843e26b973
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffc00000000
+Ciphertext: e5c3b8e30fd2d8e6239b17b44bd23bbd
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffe00000000
+Ciphertext: 1ac1f7102c59933e8b2ddc3f14e94baa
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffff00000000
+Ciphertext: 21d9ba49f276b45f11af8fc71a088e3d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffff80000000
+Ciphertext: 649f1cddc3792b4638635a392bc9bade
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffc0000000
+Ciphertext: e2775e4b59c1bc2e31a2078c11b5a08c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffe0000000
+Ciphertext: 2be1fae5048a25582a679ca10905eb80
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffff0000000
+Ciphertext: da86f292c6f41ea34fb2068df75ecc29
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffff8000000
+Ciphertext: 220df19f85d69b1b562fa69a3c5beca5
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffc000000
+Ciphertext: 1f11d5d0355e0b556ccdb6c7f5083b4d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffe000000
+Ciphertext: 62526b78be79cb384633c91f83b4151b
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffff000000
+Ciphertext: 90ddbcb950843592dd47bbef00fdc876
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffff800000
+Ciphertext: 2fd0e41c5b8402277354a7391d2618e2
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffc00000
+Ciphertext: 3cdf13e72dee4c581bafec70b85f9660
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffe00000
+Ciphertext: afa2ffc137577092e2b654fa199d2c43
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffff00000
+Ciphertext: 8d683ee63e60d208e343ce48dbc44cac
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffff80000
+Ciphertext: 705a4ef8ba2133729c20185c3d3a4763
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffc0000
+Ciphertext: 0861a861c3db4e94194211b77ed761b9
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffe0000
+Ciphertext: 4b00c27e8b26da7eab9d3a88dec8b031
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffff0000
+Ciphertext: 5f397bf03084820cc8810d52e5b666e9
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffff8000
+Ciphertext: 63fafabb72c07bfbd3ddc9b1203104b8
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffc000
+Ciphertext: 683e2140585b18452dd4ffbb93c95df9
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffe000
+Ciphertext: 286894e48e537f8763b56707d7d155c8
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffff000
+Ciphertext: a423deabc173dcf7e2c4c53e77d37cd1
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffff800
+Ciphertext: eb8168313e1cfdfdb5e986d5429cf172
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffc00
+Ciphertext: 27127daafc9accd2fb334ec3eba52323
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffe00
+Ciphertext: ee0715b96f72e3f7a22a5064fc592f4c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffff00
+Ciphertext: 29ee526770f2a11dcfa989d1ce88830f
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffff80
+Ciphertext: 0493370e054b09871130fe49af730a5a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffffc0
+Ciphertext: 9b7b940f6c509f9e44a4ee140448ee46
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffffe0
+Ciphertext: 2915be4a1ecfdcbe3e023811a12bb6c7
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffff0
+Ciphertext: 7240e524bc51d8c4d440b1be55d1062c
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffff8
+Ciphertext: da63039d38cb4612b2dc36ba26684b93
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffffc
+Ciphertext: 0f59cb5a4b522e2ac56c1a64f558ad9a
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: fffffffffffffffffffffffffffffffe
+Ciphertext: 7bfe9d876c6d63c1d035da8fe21c409d
+
+Cipher: AES-256-CTR
+Operation: ENCRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+IV: ffffffffffffffffffffffffffffffff
+Ciphertext: acdace8078a32b1a182bfa4987ca1347
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ddc6bf790c15760d8d9aeb6f9a75fd4e
+IV: 80000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0a6bdc6d4c1e6280301fd8e97ddbe601
+IV: c0000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9b80eefb7ebe2d2b16247aa0efc72f5d
+IV: e0000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7f2c5ece07a98d8bee13c51177395ff7
+IV: f0000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7818d800dcf6f4be1e0e94f403d1e4c2
+IV: f8000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e74cd1c92f0919c35a0324123d6177d3
+IV: fc000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8092a4dcf2da7e77e93bdd371dfed82e
+IV: fe000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 49af6b372135acef10132e548f217b17
+IV: ff000000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8bcd40f94ebb63b9f7909676e667f1e7
+IV: ff800000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fe1cffb83f45dcfb38b29be438dbd3ab
+IV: ffc00000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0dc58a8d886623705aec15cb1e70dc0e
+IV: ffe00000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c218faa16056bd0774c3e8d79c35a5e4
+IV: fff00000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 047bba83f7aa841731504e012208fc9e
+IV: fff80000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dc8f0e4915fd81ba70a331310882f6da
+IV: fffc0000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1569859ea6b7206c30bf4fd0cbfac33c
+IV: fffe0000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 300ade92f88f48fa2df730ec16ef44cd
+IV: ffff0000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1fe6cc3c05965dc08eb0590c95ac71d0
+IV: ffff8000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 59e858eaaa97fec38111275b6cf5abc0
+IV: ffffc000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2239455e7afe3b0616100288cc5a723b
+IV: ffffe000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3ee500c5c8d63479717163e55c5c4522
+IV: fffff000000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d5e38bf15f16d90e3e214041d774daa8
+IV: fffff800000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b1f4066e6f4f187dfe5f2ad1b17819d0
+IV: fffffc00000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6ef4cc4de49b11065d7af2909854794a
+IV: fffffe00000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ac86bc606b6640c309e782f232bf367f
+IV: ffffff00000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 36aff0ef7bf3280772cf4cac80a0d2b2
+IV: ffffff80000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1f8eedea0f62a1406d58cfc3ecea72cf
+IV: ffffffc0000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: abf4154a3375a1d3e6b1d454438f95a6
+IV: ffffffe0000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 96f96e9d607f6615fc192061ee648b07
+IV: fffffff0000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cf37cdaaa0d2d536c71857634c792064
+IV: fffffff8000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: fbd6640c80245c2b805373f130703127
+IV: fffffffc000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8d6a8afe55a6e481badae0d146f436db
+IV: fffffffe000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6a4981f2915e3e68af6c22385dd06756
+IV: ffffffff000000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 42a1136e5f8d8d21d3101998642d573b
+IV: ffffffff800000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9b471596dc69ae1586cee6158b0b0181
+IV: ffffffffc00000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 753665c4af1eff33aa8b628bf8741cfd
+IV: ffffffffe00000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9a682acf40be01f5b2a4193c9a82404d
+IV: fffffffff00000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 54fafe26e4287f17d1935f87eb9ade01
+IV: fffffffff80000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 49d541b2e74cfe73e6a8e8225f7bd449
+IV: fffffffffc0000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 11a45530f624ff6f76a1b3826626ff7b
+IV: fffffffffe0000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: f96b0c4a8bc6c86130289f60b43b8fba
+IV: ffffffffff0000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 48c7d0e80834ebdc35b6735f76b46c8b
+IV: ffffffffff8000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2463531ab54d66955e73edc4cb8eaa45
+IV: ffffffffffc000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ac9bd8e2530469134b9d5b065d4f565b
+IV: ffffffffffe000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3f5f9106d0e52f973d4890e6f37e8a00
+IV: fffffffffff000000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 20ebc86f1304d272e2e207e59db639f0
+IV: fffffffffff800000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e67ae6426bf9526c972cff072b52252c
+IV: fffffffffffc00000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1a518dddaf9efa0d002cc58d107edfc8
+IV: fffffffffffe00000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ead731af4d3a2fe3b34bed047942a49f
+IV: ffffffffffff00000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b1d4efe40242f83e93b6c8d7efb5eae9
+IV: ffffffffffff80000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cd2b1fec11fd906c5c7630099443610a
+IV: ffffffffffffc0000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a1853fe47fe29289d153161d06387d21
+IV: ffffffffffffe0000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4632154179a555c17ea604d0889fab14
+IV: fffffffffffff0000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: dd27cac6401a022e8f38f9f93e774417
+IV: fffffffffffff8000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c090313eb98674f35f3123385fb95d4d
+IV: fffffffffffffc000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: cc3526262b92f02edce548f716b9f45c
+IV: fffffffffffffe000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: c0838d1a2b16a7c7f0dfcc433c399c33
+IV: ffffffffffffff000000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0d9ac756eb297695eed4d382eb126d26
+IV: ffffffffffffff800000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 56ede9dda3f6f141bff1757fa689c3e1
+IV: ffffffffffffffc00000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 768f520efe0f23e61d3ec8ad9ce91774
+IV: ffffffffffffffe00000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b1144ddfa75755213390e7c596660490
+IV: fffffffffffffff00000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1d7c0c4040b355b9d107a99325e3b050
+IV: fffffffffffffff80000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d8e2bb1ae8ee3dcf5bf7d6c38da82a1a
+IV: fffffffffffffffc0000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: faf82d178af25a9886a47e7f789b98d7
+IV: fffffffffffffffe0000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9b58dbfd77fe5aca9cfc190cd1b82d19
+IV: ffffffffffffffff0000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 77f392089042e478ac16c0c86a0b5db5
+IV: ffffffffffffffff8000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 19f08e3420ee69b477ca1420281c4782
+IV: ffffffffffffffffc000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a1b19beee4e117139f74b3c53fdcb875
+IV: ffffffffffffffffe000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a37a5869b218a9f3a0868d19aea0ad6a
+IV: fffffffffffffffff000000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: bc3594e865bcd0261b13202731f33580
+IV: fffffffffffffffff800000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 811441ce1d309eee7185e8c752c07557
+IV: fffffffffffffffffc00000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 959971ce4134190563518e700b9874d1
+IV: fffffffffffffffffe00000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 76b5614a042707c98e2132e2e805fe63
+IV: ffffffffffffffffff00000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7d9fa6a57530d0f036fec31c230b0cc6
+IV: ffffffffffffffffff80000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 964153a83bf6989a4ba80daa91c3e081
+IV: ffffffffffffffffffc0000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a013014d4ce8054cf2591d06f6f2f176
+IV: ffffffffffffffffffe0000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: d1c5f6399bf382502e385eee1474a869
+IV: fffffffffffffffffff0000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0007e20b8298ec354f0f5fe7470f36bd
+IV: fffffffffffffffffff8000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: b95ba05b332da61ef63a2b31fcad9879
+IV: fffffffffffffffffffc000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4620a49bd967491561669ab25dce45f4
+IV: fffffffffffffffffffe000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 12e71214ae8e04f0bb63d7425c6f14d5
+IV: ffffffffffffffffffff000000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4cc42fc1407b008fe350907c092e80ac
+IV: ffffffffffffffffffff800000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 08b244ce7cbc8ee97fbba808cb146fda
+IV: ffffffffffffffffffffc00000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 39b333e8694f21546ad1edd9d87ed95b
+IV: ffffffffffffffffffffe00000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3b271f8ab2e6e4a20ba8090f43ba78f3
+IV: fffffffffffffffffffff00000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9ad983f3bf651cd0393f0a73cccdea50
+IV: fffffffffffffffffffff80000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8f476cbff75c1f725ce18e4bbcd19b32
+IV: fffffffffffffffffffffc0000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 905b6267f1d6ab5320835a133f096f2a
+IV: fffffffffffffffffffffe0000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 145b60d6d0193c23f4221848a892d61a
+IV: ffffffffffffffffffffff0000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 55cfb3fb6d75cad0445bbc8dafa25b0f
+IV: ffffffffffffffffffffff8000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7b8e7098e357ef71237d46d8b075b0f5
+IV: ffffffffffffffffffffffc000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2bf27229901eb40f2df9d8398d1505ae
+IV: ffffffffffffffffffffffe000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 83a63402a77f9ad5c1e931a931ecd706
+IV: fffffffffffffffffffffff000000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 6f8ba6521152d31f2bada1843e26b973
+IV: fffffffffffffffffffffff800000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e5c3b8e30fd2d8e6239b17b44bd23bbd
+IV: fffffffffffffffffffffffc00000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1ac1f7102c59933e8b2ddc3f14e94baa
+IV: fffffffffffffffffffffffe00000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 21d9ba49f276b45f11af8fc71a088e3d
+IV: ffffffffffffffffffffffff00000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 649f1cddc3792b4638635a392bc9bade
+IV: ffffffffffffffffffffffff80000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: e2775e4b59c1bc2e31a2078c11b5a08c
+IV: ffffffffffffffffffffffffc0000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2be1fae5048a25582a679ca10905eb80
+IV: ffffffffffffffffffffffffe0000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: da86f292c6f41ea34fb2068df75ecc29
+IV: fffffffffffffffffffffffff0000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 220df19f85d69b1b562fa69a3c5beca5
+IV: fffffffffffffffffffffffff8000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 1f11d5d0355e0b556ccdb6c7f5083b4d
+IV: fffffffffffffffffffffffffc000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 62526b78be79cb384633c91f83b4151b
+IV: fffffffffffffffffffffffffe000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 90ddbcb950843592dd47bbef00fdc876
+IV: ffffffffffffffffffffffffff000000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2fd0e41c5b8402277354a7391d2618e2
+IV: ffffffffffffffffffffffffff800000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 3cdf13e72dee4c581bafec70b85f9660
+IV: ffffffffffffffffffffffffffc00000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: afa2ffc137577092e2b654fa199d2c43
+IV: ffffffffffffffffffffffffffe00000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 8d683ee63e60d208e343ce48dbc44cac
+IV: fffffffffffffffffffffffffff00000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 705a4ef8ba2133729c20185c3d3a4763
+IV: fffffffffffffffffffffffffff80000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0861a861c3db4e94194211b77ed761b9
+IV: fffffffffffffffffffffffffffc0000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 4b00c27e8b26da7eab9d3a88dec8b031
+IV: fffffffffffffffffffffffffffe0000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 5f397bf03084820cc8810d52e5b666e9
+IV: ffffffffffffffffffffffffffff0000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 63fafabb72c07bfbd3ddc9b1203104b8
+IV: ffffffffffffffffffffffffffff8000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 683e2140585b18452dd4ffbb93c95df9
+IV: ffffffffffffffffffffffffffffc000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 286894e48e537f8763b56707d7d155c8
+IV: ffffffffffffffffffffffffffffe000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: a423deabc173dcf7e2c4c53e77d37cd1
+IV: fffffffffffffffffffffffffffff000
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: eb8168313e1cfdfdb5e986d5429cf172
+IV: fffffffffffffffffffffffffffff800
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 27127daafc9accd2fb334ec3eba52323
+IV: fffffffffffffffffffffffffffffc00
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: ee0715b96f72e3f7a22a5064fc592f4c
+IV: fffffffffffffffffffffffffffffe00
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 29ee526770f2a11dcfa989d1ce88830f
+IV: ffffffffffffffffffffffffffffff00
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0493370e054b09871130fe49af730a5a
+IV: ffffffffffffffffffffffffffffff80
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 9b7b940f6c509f9e44a4ee140448ee46
+IV: ffffffffffffffffffffffffffffffc0
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 2915be4a1ecfdcbe3e023811a12bb6c7
+IV: ffffffffffffffffffffffffffffffe0
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7240e524bc51d8c4d440b1be55d1062c
+IV: fffffffffffffffffffffffffffffff0
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: da63039d38cb4612b2dc36ba26684b93
+IV: fffffffffffffffffffffffffffffff8
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 0f59cb5a4b522e2ac56c1a64f558ad9a
+IV: fffffffffffffffffffffffffffffffc
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: 7bfe9d876c6d63c1d035da8fe21c409d
+IV: fffffffffffffffffffffffffffffffe
+
+Cipher: AES-256-CTR
+Operation: DECRYPT
+Key: 0000000000000000000000000000000000000000000000000000000000000000
+Plaintext: 00000000000000000000000000000000
+Ciphertext: acdace8078a32b1a182bfa4987ca1347
+IV: ffffffffffffffffffffffffffffffff
+
diff --git a/src/crypto/cpu-ppc64le.c b/src/crypto/cpu-ppc64le.c
index c431c81..54571bd 100644
--- a/src/crypto/cpu-ppc64le.c
+++ b/src/crypto/cpu-ppc64le.c
@@ -27,14 +27,12 @@
 #define PPC_FEATURE2_HAS_VCRYPTO 0x02000000
 #endif
 
-static unsigned long g_ppc64le_hwcap2 = 0;
-
 void OPENSSL_cpuid_setup(void) {
-  g_ppc64le_hwcap2 = getauxval(AT_HWCAP2);
+  OPENSSL_ppc64le_hwcap2 = getauxval(AT_HWCAP2);
 }
 
 int CRYPTO_is_PPC64LE_vcrypto_capable(void) {
-  return (g_ppc64le_hwcap2 & PPC_FEATURE2_HAS_VCRYPTO) != 0;
+  return (OPENSSL_ppc64le_hwcap2 & PPC_FEATURE2_HAS_VCRYPTO) != 0;
 }
 
 #endif  /* OPENSSL_PPC64LE */
diff --git a/src/crypto/crypto.c b/src/crypto/crypto.c
index c32f514..5d35289 100644
--- a/src/crypto/crypto.c
+++ b/src/crypto/crypto.c
@@ -49,6 +49,7 @@
  * far, the init constructor function only sets the capability variables. */
 
 #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
+
 /* This value must be explicitly initialised to zero in order to work around a
  * bug in libtool or the linker on OS X.
  *
@@ -57,6 +58,14 @@
  * initialising it to zero, it becomes a "data symbol", which isn't so
  * affected. */
 uint32_t OPENSSL_ia32cap_P[4] = {0};
+#if !defined(BORINGSSL_FIPS)
+uint32_t *OPENSSL_ia32cap_addr = OPENSSL_ia32cap_P;
+#endif
+
+#elif defined(OPENSSL_PPC64LE)
+
+unsigned long OPENSSL_ppc64le_hwcap2 = 0;
+
 #elif defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)
 
 #include <openssl/arm_arch.h>
@@ -87,6 +96,11 @@
 
 #endif
 
+#if defined(BORINGSSL_FIPS)
+/* In FIPS mode, the power-on self-test function calls |CRYPTO_library_init|
+ * because we have to ensure that CPUID detection occurs first. */
+#define BORINGSSL_NO_STATIC_INITIALIZER
+#endif
 
 #if defined(OPENSSL_WINDOWS) && !defined(BORINGSSL_NO_STATIC_INITIALIZER)
 #define OPENSSL_CDECL __cdecl
@@ -160,5 +174,3 @@
 }
 
 void OPENSSL_load_builtin_modules(void) {}
-
-int FIPS_mode(void) { return 0; }
diff --git a/src/crypto/curve25519/asm/x25519-asm-arm.S b/src/crypto/curve25519/asm/x25519-asm-arm.S
index 3af1dba..38ec03b 100644
--- a/src/crypto/curve25519/asm/x25519-asm-arm.S
+++ b/src/crypto/curve25519/asm/x25519-asm-arm.S
@@ -17,8 +17,7 @@
  * domain licensed but the standard ISC license is included above to keep
  * licensing simple. */
 
-#if !defined(OPENSSL_NO_ASM)
-#if defined(__arm__)
+#if !defined(OPENSSL_NO_ASM) && defined(__arm__) && !defined(__APPLE__)
 
 .fpu neon
 .text
@@ -2120,5 +2119,4 @@
 vpop {q4,q5,q6,q7}
 bx lr
 
-#endif  /* __arm__ */
-#endif  /* !OPENSSL_NO_ASM */
+#endif  /* !OPENSSL_NO_ASM && __arm__ && !__APPLE__ */
diff --git a/src/crypto/curve25519/internal.h b/src/crypto/curve25519/internal.h
index ea206a3..ee865bd 100644
--- a/src/crypto/curve25519/internal.h
+++ b/src/crypto/curve25519/internal.h
@@ -29,7 +29,7 @@
 #endif
 
 
-#if defined(OPENSSL_ARM) && !defined(OPENSSL_NO_ASM)
+#if defined(OPENSSL_ARM) && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_APPLE)
 #define BORINGSSL_X25519_NEON
 
 /* x25519_NEON is defined in asm/x25519-arm.S. */
diff --git a/src/crypto/digest/CMakeLists.txt b/src/crypto/digest_extra/CMakeLists.txt
similarity index 87%
rename from src/crypto/digest/CMakeLists.txt
rename to src/crypto/digest_extra/CMakeLists.txt
index 7a68f6f..f083a16 100644
--- a/src/crypto/digest/CMakeLists.txt
+++ b/src/crypto/digest_extra/CMakeLists.txt
@@ -1,12 +1,11 @@
 include_directories(../../include)
 
 add_library(
-  digest
+  digest_extra
 
   OBJECT
 
-  digest.c
-  digests.c
+  digest_extra.c
 )
 
 add_executable(
diff --git a/src/crypto/digest/digests.c b/src/crypto/digest_extra/digest_extra.c
similarity index 61%
rename from src/crypto/digest/digests.c
rename to src/crypto/digest_extra/digest_extra.c
index 9ad2d49..b18759a 100644
--- a/src/crypto/digest/digests.c
+++ b/src/crypto/digest_extra/digest_extra.c
@@ -56,206 +56,15 @@
 
 #include <openssl/digest.h>
 
-#include <assert.h>
 #include <string.h>
 
 #include <openssl/asn1.h>
 #include <openssl/bytestring.h>
-#include <openssl/md4.h>
-#include <openssl/md5.h>
 #include <openssl/nid.h>
-#include <openssl/sha.h>
 
 #include "internal.h"
 #include "../internal.h"
 
-#if defined(NDEBUG)
-#define CHECK(x) (void) (x)
-#else
-#define CHECK(x) assert(x)
-#endif
-
-
-static void md4_init(EVP_MD_CTX *ctx) {
-  CHECK(MD4_Init(ctx->md_data));
-}
-
-static void md4_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
-  CHECK(MD4_Update(ctx->md_data, data, count));
-}
-
-static void md4_final(EVP_MD_CTX *ctx, uint8_t *out) {
-  CHECK(MD4_Final(out, ctx->md_data));
-}
-
-static const EVP_MD md4_md = {
-    NID_md4,    MD4_DIGEST_LENGTH, 0 /* flags */,       md4_init,
-    md4_update, md4_final,         64 /* block size */, sizeof(MD4_CTX),
-};
-
-const EVP_MD *EVP_md4(void) { return &md4_md; }
-
-
-static void md5_init(EVP_MD_CTX *ctx) {
-  CHECK(MD5_Init(ctx->md_data));
-}
-
-static void md5_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
-  CHECK(MD5_Update(ctx->md_data, data, count));
-}
-
-static void md5_final(EVP_MD_CTX *ctx, uint8_t *out) {
-  CHECK(MD5_Final(out, ctx->md_data));
-}
-
-static const EVP_MD md5_md = {
-    NID_md5,    MD5_DIGEST_LENGTH, 0 /* flags */,       md5_init,
-    md5_update, md5_final,         64 /* block size */, sizeof(MD5_CTX),
-};
-
-const EVP_MD *EVP_md5(void) { return &md5_md; }
-
-
-static void sha1_init(EVP_MD_CTX *ctx) {
-  CHECK(SHA1_Init(ctx->md_data));
-}
-
-static void sha1_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
-  CHECK(SHA1_Update(ctx->md_data, data, count));
-}
-
-static void sha1_final(EVP_MD_CTX *ctx, uint8_t *md) {
-  CHECK(SHA1_Final(md, ctx->md_data));
-}
-
-static const EVP_MD sha1_md = {
-    NID_sha1,    SHA_DIGEST_LENGTH, 0 /* flags */,       sha1_init,
-    sha1_update, sha1_final,        64 /* block size */, sizeof(SHA_CTX),
-};
-
-const EVP_MD *EVP_sha1(void) { return &sha1_md; }
-
-
-static void sha224_init(EVP_MD_CTX *ctx) {
-  CHECK(SHA224_Init(ctx->md_data));
-}
-
-static void sha224_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
-  CHECK(SHA224_Update(ctx->md_data, data, count));
-}
-
-static void sha224_final(EVP_MD_CTX *ctx, uint8_t *md) {
-  CHECK(SHA224_Final(md, ctx->md_data));
-}
-
-static const EVP_MD sha224_md = {
-    NID_sha224,          SHA224_DIGEST_LENGTH, 0 /* flags */,
-    sha224_init,         sha224_update,        sha224_final,
-    64 /* block size */, sizeof(SHA256_CTX),
-};
-
-const EVP_MD *EVP_sha224(void) { return &sha224_md; }
-
-
-static void sha256_init(EVP_MD_CTX *ctx) {
-  CHECK(SHA256_Init(ctx->md_data));
-}
-
-static void sha256_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
-  CHECK(SHA256_Update(ctx->md_data, data, count));
-}
-
-static void sha256_final(EVP_MD_CTX *ctx, uint8_t *md) {
-  CHECK(SHA256_Final(md, ctx->md_data));
-}
-
-static const EVP_MD sha256_md = {
-    NID_sha256,          SHA256_DIGEST_LENGTH, 0 /* flags */,
-    sha256_init,         sha256_update,        sha256_final,
-    64 /* block size */, sizeof(SHA256_CTX),
-};
-
-const EVP_MD *EVP_sha256(void) { return &sha256_md; }
-
-
-static void sha384_init(EVP_MD_CTX *ctx) {
-  CHECK(SHA384_Init(ctx->md_data));
-}
-
-static void sha384_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
-  CHECK(SHA384_Update(ctx->md_data, data, count));
-}
-
-static void sha384_final(EVP_MD_CTX *ctx, uint8_t *md) {
-  CHECK(SHA384_Final(md, ctx->md_data));
-}
-
-static const EVP_MD sha384_md = {
-    NID_sha384,           SHA384_DIGEST_LENGTH, 0 /* flags */,
-    sha384_init,          sha384_update,        sha384_final,
-    128 /* block size */, sizeof(SHA512_CTX),
-};
-
-const EVP_MD *EVP_sha384(void) { return &sha384_md; }
-
-
-static void sha512_init(EVP_MD_CTX *ctx) {
-  CHECK(SHA512_Init(ctx->md_data));
-}
-
-static void sha512_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
-  CHECK(SHA512_Update(ctx->md_data, data, count));
-}
-
-static void sha512_final(EVP_MD_CTX *ctx, uint8_t *md) {
-  CHECK(SHA512_Final(md, ctx->md_data));
-}
-
-static const EVP_MD sha512_md = {
-    NID_sha512,           SHA512_DIGEST_LENGTH, 0 /* flags */,
-    sha512_init,          sha512_update,        sha512_final,
-    128 /* block size */, sizeof(SHA512_CTX),
-};
-
-const EVP_MD *EVP_sha512(void) { return &sha512_md; }
-
-
-typedef struct {
-  MD5_CTX md5;
-  SHA_CTX sha1;
-} MD5_SHA1_CTX;
-
-static void md5_sha1_init(EVP_MD_CTX *md_ctx) {
-  MD5_SHA1_CTX *ctx = md_ctx->md_data;
-  CHECK(MD5_Init(&ctx->md5) && SHA1_Init(&ctx->sha1));
-}
-
-static void md5_sha1_update(EVP_MD_CTX *md_ctx, const void *data,
-                            size_t count) {
-  MD5_SHA1_CTX *ctx = md_ctx->md_data;
-  CHECK(MD5_Update(&ctx->md5, data, count) &&
-        SHA1_Update(&ctx->sha1, data, count));
-}
-
-static void md5_sha1_final(EVP_MD_CTX *md_ctx, uint8_t *out) {
-  MD5_SHA1_CTX *ctx = md_ctx->md_data;
-  CHECK(MD5_Final(out, &ctx->md5) &&
-        SHA1_Final(out + MD5_DIGEST_LENGTH, &ctx->sha1));
-}
-
-static const EVP_MD md5_sha1_md = {
-    NID_md5_sha1,
-    MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH,
-    0 /* flags */,
-    md5_sha1_init,
-    md5_sha1_update,
-    md5_sha1_final,
-    64 /* block size */,
-    sizeof(MD5_SHA1_CTX),
-};
-
-const EVP_MD *EVP_md5_sha1(void) { return &md5_sha1_md; }
-
 
 struct nid_to_digest {
   int nid;
diff --git a/src/crypto/digest/digest_test.cc b/src/crypto/digest_extra/digest_test.cc
similarity index 100%
rename from src/crypto/digest/digest_test.cc
rename to src/crypto/digest_extra/digest_test.cc
diff --git a/src/crypto/digest_extra/internal.h b/src/crypto/digest_extra/internal.h
new file mode 100644
index 0000000..264405f
--- /dev/null
+++ b/src/crypto/digest_extra/internal.h
@@ -0,0 +1,32 @@
+/* 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_DIGEST_EXTRA_INTERNAL_H
+#define OPENSSL_HEADER_DIGEST_EXTRA_INTERNAL_H
+
+#include <openssl/base.h>
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+
+const EVP_MD *EVP_parse_digest_algorithm(CBS *cbs);
+
+
+#if defined(__cplusplus)
+}  /* extern C */
+#endif
+
+#endif  /* OPENSSL_HEADER_DIGEST_EXTRA_INTERNAL */
diff --git a/src/crypto/ec/ec_key.c b/src/crypto/ec/ec_key.c
index 1a93346..1be4d25 100644
--- a/src/crypto/ec/ec_key.c
+++ b/src/crypto/ec/ec_key.c
@@ -70,6 +70,7 @@
 #include <string.h>
 
 #include <openssl/ec.h>
+#include <openssl/ecdsa.h>
 #include <openssl/engine.h>
 #include <openssl/err.h>
 #include <openssl/ex_data.h>
@@ -345,6 +346,40 @@
   return ok;
 }
 
+int EC_KEY_check_fips(const EC_KEY *key) {
+  if (EC_KEY_is_opaque(key)) {
+    /* Opaque keys can't be checked. */
+    OPENSSL_PUT_ERROR(EC, EC_R_PUBLIC_KEY_VALIDATION_FAILED);
+    return 0;
+  }
+
+  if (!EC_KEY_check_key(key)) {
+    return 0;
+  }
+
+  if (!key->priv_key) {
+    return 1;
+  }
+
+  uint8_t data[16] = {0};
+  unsigned sig_len = ECDSA_size(key);
+  uint8_t *sig = OPENSSL_malloc(sig_len);
+  if (sig == NULL) {
+    OPENSSL_PUT_ERROR(EC, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
+
+  int ret = 1;
+  if (!ECDSA_sign(0, data, sizeof(data), sig, &sig_len, key) ||
+      !ECDSA_verify(0, data, sizeof(data), sig, sig_len, key)) {
+    OPENSSL_PUT_ERROR(EC, EC_R_PUBLIC_KEY_VALIDATION_FAILED);
+    ret = 0;
+  }
+
+  OPENSSL_free(sig);
+  return ret;
+}
+
 int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x,
                                              BIGNUM *y) {
   BN_CTX *ctx = NULL;
@@ -425,6 +460,15 @@
   }
 
   const BIGNUM *order = EC_GROUP_get0_order(eckey->group);
+
+  /* Check that the size of the group order is FIPS compliant (FIPS 186-4
+   * B.4.2). */
+  if (BN_num_bits(order) < 160) {
+    OPENSSL_PUT_ERROR(EC, EC_R_INVALID_GROUP_ORDER);
+    goto err;
+  }
+
+  /* Generate the private key by testing candidates (FIPS 186-4 B.4.2). */
   if (!BN_rand_range_ex(priv_key, 1, order)) {
     goto err;
   }
diff --git a/src/crypto/ec/ec_test.cc b/src/crypto/ec/ec_test.cc
index 02b9ef2..2bc87aa 100644
--- a/src/crypto/ec/ec_test.cc
+++ b/src/crypto/ec/ec_test.cc
@@ -314,6 +314,15 @@
                                                    x.get(), y.get(), nullptr));
 }
 
+TEST_P(ECCurveTest, CheckFIPS) {
+  // Generate an EC_KEY.
+  bssl::UniquePtr<EC_KEY> key(EC_KEY_new_by_curve_name(GetParam().nid));
+  ASSERT_TRUE(key);
+  ASSERT_TRUE(EC_KEY_generate_key(key.get()));
+
+  EXPECT_TRUE(EC_KEY_check_fips(key.get()));
+}
+
 TEST_P(ECCurveTest, AddingEqualPoints) {
   bssl::UniquePtr<EC_KEY> key(EC_KEY_new_by_curve_name(GetParam().nid));
   ASSERT_TRUE(key);
diff --git a/src/crypto/ecdsa/ecdsa.c b/src/crypto/ecdsa/ecdsa.c
index e1a0525..5df494e 100644
--- a/src/crypto/ecdsa/ecdsa.c
+++ b/src/crypto/ecdsa/ecdsa.c
@@ -229,7 +229,7 @@
                             BIGNUM **rp, const uint8_t *digest,
                             size_t digest_len) {
   BN_CTX *ctx = NULL;
-  BIGNUM *k = NULL, *r = NULL, *tmp = NULL;
+  BIGNUM *k = NULL, *kinv = NULL, *r = NULL, *tmp = NULL;
   EC_POINT *tmp_point = NULL;
   const EC_GROUP *group;
   int ret = 0;
@@ -248,10 +248,11 @@
     ctx = ctx_in;
   }
 
-  k = BN_new(); /* this value is later returned in *kinvp */
+  k = BN_new();
+  kinv = BN_new(); /* this value is later returned in *kinvp */
   r = BN_new(); /* this value is later returned in *rp    */
   tmp = BN_new();
-  if (k == NULL || r == NULL || tmp == NULL) {
+  if (k == NULL || kinv == NULL || r == NULL || tmp == NULL) {
     OPENSSL_PUT_ERROR(ECDSA, ERR_R_MALLOC_FAILURE);
     goto err;
   }
@@ -263,6 +264,13 @@
 
   const BIGNUM *order = EC_GROUP_get0_order(group);
 
+  /* Check that the size of the group order is FIPS compliant (FIPS 186-4
+   * B.5.2). */
+  if (BN_num_bits(order) < 160) {
+    OPENSSL_PUT_ERROR(ECDSA, EC_R_INVALID_GROUP_ORDER);
+    goto err;
+  }
+
   do {
     /* If possible, we'll include the private key and message digest in the k
      * generation. The |digest| argument is only empty if |ECDSA_sign_setup| is
@@ -280,6 +288,15 @@
       goto err;
     }
 
+    /* Compute the inverse of k. The order is a prime, so use Fermat's Little
+     * Theorem. Note |ec_group_get_mont_data| may return NULL but
+     * |bn_mod_inverse_prime| allows this. */
+    if (!bn_mod_inverse_prime(kinv, k, order, ctx,
+                              ec_group_get_mont_data(group))) {
+      OPENSSL_PUT_ERROR(ECDSA, ERR_R_BN_LIB);
+      goto err;
+    }
+
     /* We do not want timing information to leak the length of k,
      * so we compute G*k using an equivalent scalar of fixed
      * bit-length. */
@@ -310,25 +327,19 @@
     }
   } while (BN_is_zero(r));
 
-  /* Compute the inverse of k. The order is a prime, so use Fermat's Little
-   * Theorem. Note |ec_group_get_mont_data| may return NULL but
-   * |bn_mod_inverse_prime| allows this. */
-  if (!bn_mod_inverse_prime(k, k, order, ctx, ec_group_get_mont_data(group))) {
-    OPENSSL_PUT_ERROR(ECDSA, ERR_R_BN_LIB);
-    goto err;
-  }
   /* clear old values if necessary */
   BN_clear_free(*rp);
   BN_clear_free(*kinvp);
 
   /* save the pre-computed values  */
   *rp = r;
-  *kinvp = k;
+  *kinvp = kinv;
   ret = 1;
 
 err:
+  BN_clear_free(k);
   if (!ret) {
-    BN_clear_free(k);
+    BN_clear_free(kinv);
     BN_clear_free(r);
   }
   if (ctx_in == NULL) {
diff --git a/src/crypto/err/ec.errordata b/src/crypto/err/ec.errordata
index aada76e..fae9480 100644
--- a/src/crypto/err/ec.errordata
+++ b/src/crypto/err/ec.errordata
@@ -24,6 +24,7 @@
 EC,118,PKPARAMETERS2GROUP_FAILURE
 EC,119,POINT_AT_INFINITY
 EC,120,POINT_IS_NOT_ON_CURVE
+EC,132,PUBLIC_KEY_VALIDATION_FAILED
 EC,121,SLOT_FULL
 EC,122,UNDEFINED_GENERATOR
 EC,123,UNKNOWN_GROUP
diff --git a/src/crypto/err/evp.errordata b/src/crypto/err/evp.errordata
index a482f76..7cad638 100644
--- a/src/crypto/err/evp.errordata
+++ b/src/crypto/err/evp.errordata
@@ -15,8 +15,10 @@
 EVP,114,INVALID_OPERATION
 EVP,115,INVALID_PADDING_MODE
 EVP,116,INVALID_PSS_SALTLEN
+EVP,131,INVALID_SIGNATURE
 EVP,117,KEYS_NOT_SET
 EVP,118,MISSING_PARAMETERS
+EVP,130,NOT_A_PRIVATE_KEY
 EVP,119,NO_DEFAULT_DIGEST
 EVP,120,NO_KEY_SET
 EVP,121,NO_MDC2_SUPPORT
diff --git a/src/crypto/err/rsa.errordata b/src/crypto/err/rsa.errordata
index 62d286c..9d18e04 100644
--- a/src/crypto/err/rsa.errordata
+++ b/src/crypto/err/rsa.errordata
@@ -36,6 +36,7 @@
 RSA,135,OUTPUT_BUFFER_TOO_SMALL
 RSA,136,PADDING_CHECK_FAILED
 RSA,137,PKCS_DECODING_ERROR
+RSA,146,PUBLIC_KEY_VALIDATION_FAILED
 RSA,138,SLEN_CHECK_FAILED
 RSA,139,SLEN_RECOVERY_FAILED
 RSA,140,TOO_LONG
diff --git a/src/crypto/err/ssl.errordata b/src/crypto/err/ssl.errordata
index 5e38b30..9ac015c 100644
--- a/src/crypto/err/ssl.errordata
+++ b/src/crypto/err/ssl.errordata
@@ -101,6 +101,7 @@
 SSL,183,NO_REQUIRED_DIGEST
 SSL,184,NO_SHARED_CIPHER
 SSL,266,NO_SHARED_GROUP
+SSL,280,NO_SUPPORTED_VERSIONS_ENABLED
 SSL,185,NULL_SSL_CTX
 SSL,186,NULL_SSL_METHOD_PASSED
 SSL,187,OLD_SESSION_CIPHER_NOT_RETURNED
diff --git a/src/crypto/err/x509.errordata b/src/crypto/err/x509.errordata
index 5687c30..1a8c4f1 100644
--- a/src/crypto/err/x509.errordata
+++ b/src/crypto/err/x509.errordata
@@ -10,6 +10,7 @@
 X509,109,INVALID_BIT_STRING_BITS_LEFT
 X509,110,INVALID_DIRECTORY
 X509,111,INVALID_FIELD_NAME
+X509,136,INVALID_PARAMETER
 X509,112,INVALID_PSS_PARAMETERS
 X509,113,INVALID_TRUST
 X509,114,ISSUER_MISMATCH
diff --git a/src/crypto/evp/CMakeLists.txt b/src/crypto/evp/CMakeLists.txt
index 188c580..6e69a82 100644
--- a/src/crypto/evp/CMakeLists.txt
+++ b/src/crypto/evp/CMakeLists.txt
@@ -12,6 +12,8 @@
   p_dsa_asn1.c
   p_ec.c
   p_ec_asn1.c
+  p_ed25519.c
+  p_ed25519_asn1.c
   p_rsa.c
   p_rsa_asn1.c
   pbkdf.c
diff --git a/src/crypto/evp/digestsign.c b/src/crypto/evp/digestsign.c
index 69c483a..299ca5e 100644
--- a/src/crypto/evp/digestsign.c
+++ b/src/crypto/evp/digestsign.c
@@ -58,7 +58,7 @@
 #include <openssl/err.h>
 
 #include "internal.h"
-#include "../digest/internal.h"
+#include "../fipsmodule/digest/internal.h"
 
 
 static const struct evp_md_pctx_ops md_pctx_ops = {
diff --git a/src/crypto/evp/evp.c b/src/crypto/evp/evp.c
index f8fe6ce..117e774 100644
--- a/src/crypto/evp/evp.c
+++ b/src/crypto/evp/evp.c
@@ -198,6 +198,8 @@
       return &ec_asn1_meth;
     case EVP_PKEY_DSA:
       return &dsa_asn1_meth;
+    case EVP_PKEY_ED25519:
+      return &ed25519_asn1_meth;
     default:
       return NULL;
   }
diff --git a/src/crypto/evp/evp_asn1.c b/src/crypto/evp/evp_asn1.c
index 6c90571..1f8d3eb 100644
--- a/src/crypto/evp/evp_asn1.c
+++ b/src/crypto/evp/evp_asn1.c
@@ -72,6 +72,7 @@
     &rsa_asn1_meth,
     &ec_asn1_meth,
     &dsa_asn1_meth,
+    &ed25519_asn1_meth,
 };
 
 static int parse_key_type(CBS *cbs, int *out_type) {
@@ -80,8 +81,7 @@
     return 0;
   }
 
-  unsigned i;
-  for (i = 0; i < OPENSSL_ARRAY_SIZE(kASN1Methods); i++) {
+  for (unsigned i = 0; i < OPENSSL_ARRAY_SIZE(kASN1Methods); i++) {
     const EVP_PKEY_ASN1_METHOD *method = kASN1Methods[i];
     if (CBS_len(&oid) == method->oid_len &&
         OPENSSL_memcmp(CBS_data(&oid), method->oid, method->oid_len) == 0) {
diff --git a/src/crypto/evp/evp_ctx.c b/src/crypto/evp/evp_ctx.c
index a17a8cc..3108cfb 100644
--- a/src/crypto/evp/evp_ctx.c
+++ b/src/crypto/evp/evp_ctx.c
@@ -58,6 +58,7 @@
 
 #include <string.h>
 
+#include <openssl/digest.h>
 #include <openssl/err.h>
 #include <openssl/mem.h>
 
@@ -68,6 +69,7 @@
 static const EVP_PKEY_METHOD *const evp_methods[] = {
   &rsa_pkey_meth,
   &ec_pkey_meth,
+  &ed25519_pkey_meth,
 };
 
 static const EVP_PKEY_METHOD *evp_pkey_meth_find(int type) {
@@ -211,7 +213,8 @@
 }
 
 int EVP_PKEY_sign_init(EVP_PKEY_CTX *ctx) {
-  if (!ctx || !ctx->pmeth || !ctx->pmeth->sign) {
+  if (ctx == NULL || ctx->pmeth == NULL ||
+      (ctx->pmeth->sign == NULL && ctx->pmeth->sign_message == NULL)) {
     OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
     return 0;
   }
@@ -221,7 +224,7 @@
 }
 
 int EVP_PKEY_sign(EVP_PKEY_CTX *ctx, uint8_t *sig, size_t *sig_len,
-                  const uint8_t *data, size_t data_len) {
+                  const uint8_t *digest, size_t digest_len) {
   if (!ctx || !ctx->pmeth || !ctx->pmeth->sign) {
     OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
     return 0;
@@ -230,11 +233,56 @@
     OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATON_NOT_INITIALIZED);
     return 0;
   }
-  return ctx->pmeth->sign(ctx, sig, sig_len, data, data_len);
+  return ctx->pmeth->sign(ctx, sig, sig_len, digest, digest_len);
+}
+
+static const EVP_MD *get_signature_md(EVP_PKEY_CTX *ctx) {
+  const EVP_MD *md;
+  if (!EVP_PKEY_CTX_get_signature_md(ctx, &md)) {
+    return NULL;
+  }
+
+  if (md == NULL) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_NO_DEFAULT_DIGEST);
+    return NULL;
+  }
+
+  return md;
+}
+
+int EVP_PKEY_sign_message(EVP_PKEY_CTX *ctx, uint8_t *sig, size_t *sig_len,
+                          const uint8_t *data, size_t data_len) {
+  if (ctx == NULL || ctx->pmeth == NULL ||
+      (ctx->pmeth->sign == NULL && ctx->pmeth->sign_message == NULL)) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
+    return 0;
+  }
+  if (ctx->operation != EVP_PKEY_OP_SIGN) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATON_NOT_INITIALIZED);
+    return 0;
+  }
+
+  if (ctx->pmeth->sign_message != NULL) {
+    return ctx->pmeth->sign_message(ctx, sig, sig_len, data, data_len);
+  }
+
+  /* Don't bother digesting if we are only sampling the length. */
+  if (sig == NULL) {
+    *sig_len = EVP_PKEY_size(EVP_PKEY_CTX_get0_pkey(ctx));
+    return 1;
+  }
+
+  uint8_t digest[EVP_MAX_MD_SIZE];
+  unsigned digest_len;
+  const EVP_MD *md = get_signature_md(ctx);
+  return md != NULL &&
+         EVP_Digest(data, data_len, digest, &digest_len, md, NULL) &&
+         EVP_PKEY_sign(ctx, sig, sig_len, digest, digest_len);
 }
 
 int EVP_PKEY_verify_init(EVP_PKEY_CTX *ctx) {
-  if (!ctx || !ctx->pmeth || !ctx->pmeth->verify) {
+  if (ctx == NULL || ctx->pmeth == NULL ||
+      (ctx->pmeth->verify == NULL && ctx->pmeth->verify_message == NULL)) {
     OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
     return 0;
   }
@@ -243,7 +291,7 @@
 }
 
 int EVP_PKEY_verify(EVP_PKEY_CTX *ctx, const uint8_t *sig, size_t sig_len,
-                    const uint8_t *data, size_t data_len) {
+                    const uint8_t *digest, size_t digest_len) {
   if (!ctx || !ctx->pmeth || !ctx->pmeth->verify) {
     OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
     return 0;
@@ -252,7 +300,32 @@
     OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATON_NOT_INITIALIZED);
     return 0;
   }
-  return ctx->pmeth->verify(ctx, sig, sig_len, data, data_len);
+  return ctx->pmeth->verify(ctx, sig, sig_len, digest, digest_len);
+}
+
+int EVP_PKEY_verify_message(EVP_PKEY_CTX *ctx, const uint8_t *sig,
+                            size_t sig_len, const uint8_t *data,
+                            size_t data_len) {
+  if (ctx == NULL || ctx->pmeth == NULL ||
+      (ctx->pmeth->verify == NULL && ctx->pmeth->verify_message == NULL)) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
+    return 0;
+  }
+  if (ctx->operation != EVP_PKEY_OP_VERIFY) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_OPERATON_NOT_INITIALIZED);
+    return 0;
+  }
+
+  if (ctx->pmeth->verify_message != NULL) {
+    return ctx->pmeth->verify_message(ctx, sig, sig_len, data, data_len);
+  }
+
+  uint8_t digest[EVP_MAX_MD_SIZE];
+  unsigned digest_len;
+  const EVP_MD *md = get_signature_md(ctx);
+  return md != NULL &&
+         EVP_Digest(data, data_len, digest, &digest_len, md, NULL) &&
+         EVP_PKEY_verify(ctx, sig, sig_len, digest, digest_len);
 }
 
 int EVP_PKEY_encrypt_init(EVP_PKEY_CTX *ctx) {
diff --git a/src/crypto/evp/evp_extra_test.cc b/src/crypto/evp/evp_extra_test.cc
index 0f8bb3b..73a5c89 100644
--- a/src/crypto/evp/evp_extra_test.cc
+++ b/src/crypto/evp/evp_extra_test.cc
@@ -540,3 +540,85 @@
                                sizeof(kExampleRSAKeyPKCS8)));
   ERR_clear_error();
 }
+
+TEST(EVPExtraTest, Ed25519) {
+  static const uint8_t kPublicKey[32] = {
+      0xd7, 0x5a, 0x98, 0x01, 0x82, 0xb1, 0x0a, 0xb7, 0xd5, 0x4b, 0xfe,
+      0xd3, 0xc9, 0x64, 0x07, 0x3a, 0x0e, 0xe1, 0x72, 0xf3, 0xda, 0xa6,
+      0x23, 0x25, 0xaf, 0x02, 0x1a, 0x68, 0xf7, 0x07, 0x51, 0x1a,
+  };
+
+  static const uint8_t kPublicKeySPKI[] = {
+      0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03, 0x21,
+      0x00, 0xd7, 0x5a, 0x98, 0x01, 0x82, 0xb1, 0x0a, 0xb7, 0xd5, 0x4b,
+      0xfe, 0xd3, 0xc9, 0x64, 0x07, 0x3a, 0x0e, 0xe1, 0x72, 0xf3, 0xda,
+      0xa6, 0x23, 0x25, 0xaf, 0x02, 0x1a, 0x68, 0xf7, 0x07, 0x51, 0x1a,
+  };
+
+  static const uint8_t kPrivateKey[64] = {
+      0x9d, 0x61, 0xb1, 0x9d, 0xef, 0xfd, 0x5a, 0x60, 0xba, 0x84, 0x4a,
+      0xf4, 0x92, 0xec, 0x2c, 0xc4, 0x44, 0x49, 0xc5, 0x69, 0x7b, 0x32,
+      0x69, 0x19, 0x70, 0x3b, 0xac, 0x03, 0x1c, 0xae, 0x7f, 0x60, 0xd7,
+      0x5a, 0x98, 0x01, 0x82, 0xb1, 0x0a, 0xb7, 0xd5, 0x4b, 0xfe, 0xd3,
+      0xc9, 0x64, 0x07, 0x3a, 0x0e, 0xe1, 0x72, 0xf3, 0xda, 0xa6, 0x23,
+      0x25, 0xaf, 0x02, 0x1a, 0x68, 0xf7, 0x07, 0x51, 0x1a,
+  };
+
+  static const uint8_t kPrivateKeyPKCS8[] = {
+      0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70,
+      0x04, 0x22, 0x04, 0x20, 0x9d, 0x61, 0xb1, 0x9d, 0xef, 0xfd, 0x5a, 0x60,
+      0xba, 0x84, 0x4a, 0xf4, 0x92, 0xec, 0x2c, 0xc4, 0x44, 0x49, 0xc5, 0x69,
+      0x7b, 0x32, 0x69, 0x19, 0x70, 0x3b, 0xac, 0x03, 0x1c, 0xae, 0x7f, 0x60,
+  };
+
+  // Create a public key.
+  bssl::UniquePtr<EVP_PKEY> pubkey(EVP_PKEY_new_ed25519_public(kPublicKey));
+  ASSERT_TRUE(pubkey);
+  EXPECT_EQ(EVP_PKEY_ED25519, EVP_PKEY_id(pubkey.get()));
+
+  // The public key must encode properly.
+  bssl::ScopedCBB cbb;
+  uint8_t *der;
+  size_t der_len;
+  ASSERT_TRUE(CBB_init(cbb.get(), 0));
+  ASSERT_TRUE(EVP_marshal_public_key(cbb.get(), pubkey.get()));
+  ASSERT_TRUE(CBB_finish(cbb.get(), &der, &der_len));
+  bssl::UniquePtr<uint8_t> free_der(der);
+  EXPECT_EQ(Bytes(kPublicKeySPKI), Bytes(der, der_len));
+
+  // The public key must gracefully fail to encode as a private key.
+  ASSERT_TRUE(CBB_init(cbb.get(), 0));
+  EXPECT_FALSE(EVP_marshal_private_key(cbb.get(), pubkey.get()));
+  uint32_t err = ERR_get_error();
+  EXPECT_EQ(ERR_LIB_EVP, ERR_GET_LIB(err));
+  EXPECT_EQ(EVP_R_NOT_A_PRIVATE_KEY, ERR_GET_REASON(err));
+  cbb.Reset();
+
+  // Create a private key.
+  bssl::UniquePtr<EVP_PKEY> privkey(EVP_PKEY_new_ed25519_private(kPrivateKey));
+  ASSERT_TRUE(privkey);
+  EXPECT_EQ(EVP_PKEY_ED25519, EVP_PKEY_id(privkey.get()));
+
+  // The public key must encode from the private key.
+  ASSERT_TRUE(CBB_init(cbb.get(), 0));
+  ASSERT_TRUE(EVP_marshal_public_key(cbb.get(), privkey.get()));
+  ASSERT_TRUE(CBB_finish(cbb.get(), &der, &der_len));
+  free_der.reset(der);
+  EXPECT_EQ(Bytes(kPublicKeySPKI), Bytes(der, der_len));
+
+  // The private key must encode properly.
+  ASSERT_TRUE(CBB_init(cbb.get(), 0));
+  ASSERT_TRUE(EVP_marshal_private_key(cbb.get(), privkey.get()));
+  ASSERT_TRUE(CBB_finish(cbb.get(), &der, &der_len));
+  free_der.reset(der);
+  EXPECT_EQ(Bytes(kPrivateKeyPKCS8), Bytes(der, der_len));
+
+  // Test EVP_PKEY_cmp.
+  EXPECT_TRUE(EVP_PKEY_cmp(pubkey.get(), privkey.get()));
+
+  static const uint8_t kZeros[32] = {0};
+  bssl::UniquePtr<EVP_PKEY> pubkey2(EVP_PKEY_new_ed25519_public(kZeros));
+  ASSERT_TRUE(pubkey2);
+  EXPECT_FALSE(EVP_PKEY_cmp(pubkey.get(), pubkey2.get()));
+  EXPECT_FALSE(EVP_PKEY_cmp(privkey.get(), pubkey2.get()));
+}
diff --git a/src/crypto/evp/evp_test.cc b/src/crypto/evp/evp_test.cc
index 6ca250e..baf41fe 100644
--- a/src/crypto/evp/evp_test.cc
+++ b/src/crypto/evp/evp_test.cc
@@ -110,6 +110,9 @@
   if (name == "DSA") {
     return EVP_PKEY_DSA;
   }
+  if (name == "Ed25519") {
+    return EVP_PKEY_ED25519;
+  }
   t->PrintLine("Unknown key type: '%s'", name.c_str());
   return EVP_PKEY_NONE;
 }
@@ -201,16 +204,24 @@
 
   int (*key_op_init)(EVP_PKEY_CTX *ctx);
   int (*key_op)(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *out_len,
-                const uint8_t *in, size_t in_len);
+                const uint8_t *in, size_t in_len) = nullptr;
+  int (*verify_op)(EVP_PKEY_CTX * ctx, const uint8_t *sig, size_t sig_len,
+                   const uint8_t *in, size_t in_len) = nullptr;
   if (t->GetType() == "Decrypt") {
     key_op_init = EVP_PKEY_decrypt_init;
     key_op = EVP_PKEY_decrypt;
   } else if (t->GetType() == "Sign") {
     key_op_init = EVP_PKEY_sign_init;
     key_op = EVP_PKEY_sign;
+  } else if (t->GetType() == "SignMessage") {
+    key_op_init = EVP_PKEY_sign_init;
+    key_op = EVP_PKEY_sign_message;
   } else if (t->GetType() == "Verify") {
     key_op_init = EVP_PKEY_verify_init;
-    key_op = nullptr;  // EVP_PKEY_verify is handled differently.
+    verify_op = EVP_PKEY_verify;
+  } else if (t->GetType() == "VerifyMessage") {
+    key_op_init = EVP_PKEY_verify_init;
+    verify_op = EVP_PKEY_verify_message;
   } else {
     t->PrintLine("Unknown test '%s'", t->GetType().c_str());
     return false;
@@ -261,11 +272,11 @@
     }
   }
 
-  if (t->GetType() == "Verify") {
+  if (verify_op != nullptr) {
     std::vector<uint8_t> output;
     if (!t->GetBytes(&output, "Output") ||
-        !EVP_PKEY_verify(ctx.get(), output.data(), output.size(), input.data(),
-                         input.size())) {
+        !verify_op(ctx.get(), output.data(), output.size(), input.data(),
+                   input.size())) {
       // ECDSA sometimes doesn't push an error code. Push one on the error queue
       // so it's distinguishable from other errors.
       OPENSSL_PUT_ERROR(USER, ERR_R_EVP_LIB);
diff --git a/src/crypto/evp/evp_tests.txt b/src/crypto/evp/evp_tests.txt
index e70ebbc..9f69664 100644
--- a/src/crypto/evp/evp_tests.txt
+++ b/src/crypto/evp/evp_tests.txt
@@ -84,6 +84,36 @@
 Type = DSA
 Input = 308192300906072a8648ce38040103818400028180258c30ebbb7f34fdc873ce679f6cea373c7886d75d4421b90920db034daedd292c64d8edd8cdbdd7f3ad23d74cfa2135247d0cef6ecf2e14f99e19d22a8c1266bd8fb8719c0e5667c716c45c7adbdabe548085bdad2dfee636f8d52fd6adb2193df6c4f0520fbd171b91882e0e4f321f8250ffecf4dbea00e114427d3ef96c1a
 
+# An Ed25519 private key.
+PrivateKey = Ed25519
+Type = Ed25519
+Input = 302e020100300506032b6570042204209d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60
+
+# The same as the above, but with an invalid NULL parameter.
+PrivateKey = Ed25519-NULL
+Input = 3030020100300706032b65700500042204209d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60
+Error = DECODE_ERROR
+
+# The above key as an SPKI.
+PublicKey = Ed25519-SPKI
+Type = Ed25519
+Input = 302a300506032b6570032100d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a
+
+# The same as the above, but with an invalid NULL parameter.
+PublicKey = Ed25519-SPKI-NULL
+Input = 302c300706032b65700500032100d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a
+Error = DECODE_ERROR
+
+# Sample public key from draft-ietf-curdle-pkix-04.
+PublicKey = Ed25519-SPKI-Spec
+Type = Ed25519
+Input = 302a300506032b657003210019bf44096984cdfe8541bac167dc3b96c85086aa30b6b6cb0c5c38ad703166e1
+
+# Sample private key from draft-ietf-curdle-pkix-04.
+PrivateKey = Ed25519-Spec
+Type = Ed25519
+Input = 302e020100300506032b657004220420d4ee72dbf913584ad5b6d8f1f769f8ad3afe7c28cbf1d4fbe097a88f44755842
+
 
 # RSA tests
 
@@ -114,6 +144,12 @@
 Input = "0123456789ABCDEF12345"
 Error = INVALID_DIGEST_LENGTH
 
+# Digest too large for key.
+Sign = RSA-512
+Digest = SHA512
+Input = "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF"
+Error = DIGEST_TOO_BIG_FOR_RSA_KEY
+
 # Mismatched digest
 Verify = RSA-2048
 Digest = SHA1
@@ -1272,3 +1308,80 @@
 MGF1Digest = SHA1
 Input = 2d207a73432a8fb4c03051b3f73b28a61764098dfa34c47a20995f8115aa6816679b557e82dbee584908c6e69782d7deb34dbd65af063d57fca76a5fd069492fd6068d9984d209350565a62e5c77f23038c12cb10c6634709b547c46f6b4a709bd85ca122d74465ef97762c29763e06dbc7a9e738c78bfca0102dc5e79d65b973f28240caab2e161a78b57d262457ed8195d53e3c7ae9da021883c6db7c24afdd2322eac972ad3c354c5fcef1e146c3a0290fb67adf007066e00428d2cec18ce58f9328698defef4b2eb5ec76918fde1c198cbb38b7afc67626a9aefec4322bfd90d2563481c9a221f78c8272c82d1b62ab914e1c69f6af6ef30ca5260db4a46
 Output = eaf1a73a1b0c4609537de69cd9228bbcfb9a8ca8c6c3efaf056fe4a7f4634ed00b7c39ec6922d7b8ea2c04ebac
+
+
+# Single-shot signing tests.
+
+SignMessage = RSA-2048
+Digest = SHA256
+Input = "Hello world"
+Output = 301894798b49d6ec55d32dcc74314f04230591a515781f3eb4492f5324b56046836c4bc3e25942af341e88558cb4c3814a849207575d343189147989b16e296b5138dbbc717116dc416f201dfa35943d15060493953cda1f04a13ff89845cf7fd69e1a78d5d38522a77bb234e5d0ba2ae17ada6e22fdae27a4052fdb8ac267507dfe06ed7a865e61a52b530bbbf65c7caa89739613df10ae3b0e62ff6831ee0770086aad39c329462aede9f1b29a501bc3d09e0fe4034aa5d6831d44491d508111d88a1d7ba50cee5ef7e701b3a589adc09a752a974a6805956f4a1a0582f66309a1e02e9fb6b10d2c820fe98bb2eb04f435bc8a649cc9ab6c5a4c03e83800d1
+
+VerifyMessage = RSA-2048
+Digest = SHA256
+Input = "Hello world"
+Output = 301894798b49d6ec55d32dcc74314f04230591a515781f3eb4492f5324b56046836c4bc3e25942af341e88558cb4c3814a849207575d343189147989b16e296b5138dbbc717116dc416f201dfa35943d15060493953cda1f04a13ff89845cf7fd69e1a78d5d38522a77bb234e5d0ba2ae17ada6e22fdae27a4052fdb8ac267507dfe06ed7a865e61a52b530bbbf65c7caa89739613df10ae3b0e62ff6831ee0770086aad39c329462aede9f1b29a501bc3d09e0fe4034aa5d6831d44491d508111d88a1d7ba50cee5ef7e701b3a589adc09a752a974a6805956f4a1a0582f66309a1e02e9fb6b10d2c820fe98bb2eb04f435bc8a649cc9ab6c5a4c03e83800d1
+
+VerifyMessage = RSA-2048-SPKI
+Digest = SHA256
+Input = "Hello world"
+Output = 301894798b49d6ec55d32dcc74314f04230591a515781f3eb4492f5324b56046836c4bc3e25942af341e88558cb4c3814a849207575d343189147989b16e296b5138dbbc717116dc416f201dfa35943d15060493953cda1f04a13ff89845cf7fd69e1a78d5d38522a77bb234e5d0ba2ae17ada6e22fdae27a4052fdb8ac267507dfe06ed7a865e61a52b530bbbf65c7caa89739613df10ae3b0e62ff6831ee0770086aad39c329462aede9f1b29a501bc3d09e0fe4034aa5d6831d44491d508111d88a1d7ba50cee5ef7e701b3a589adc09a752a974a6805956f4a1a0582f66309a1e02e9fb6b10d2c820fe98bb2eb04f435bc8a649cc9ab6c5a4c03e83800d1
+
+VerifyMessage = P-256
+Digest = SHA256
+Input = "Hello world"
+Output = 304502204c66004635c267394bd6857c1e0b53b22a2bab1ca7dff9d5c1b42143858b3ea7022100ae81228510e03cd49a8863d2ebd1c05fe0c87eacd1150433132b909994cd0dbd
+
+# Digest can't be omitted in many algorithms.
+SignMessage = RSA-2048
+Input = "Hello world"
+Error = NO_DEFAULT_DIGEST
+
+VerifyMessage = RSA-2048
+Input = "Hello world"
+Output = 301894798b49d6ec55d32dcc74314f04230591a515781f3eb4492f5324b56046836c4bc3e25942af341e88558cb4c3814a849207575d343189147989b16e296b5138dbbc717116dc416f201dfa35943d15060493953cda1f04a13ff89845cf7fd69e1a78d5d38522a77bb234e5d0ba2ae17ada6e22fdae27a4052fdb8ac267507dfe06ed7a865e61a52b530bbbf65c7caa89739613df10ae3b0e62ff6831ee0770086aad39c329462aede9f1b29a501bc3d09e0fe4034aa5d6831d44491d508111d88a1d7ba50cee5ef7e701b3a589adc09a752a974a6805956f4a1a0582f66309a1e02e9fb6b10d2c820fe98bb2eb04f435bc8a649cc9ab6c5a4c03e83800d1
+Error = NO_DEFAULT_DIGEST
+
+SignMessage = Ed25519
+Input = ""
+Output = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b
+
+SignMessage = Ed25519-SPKI
+Input = ""
+Error = NOT_A_PRIVATE_KEY
+
+VerifyMessage = Ed25519
+Input = ""
+Output = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b
+
+VerifyMessage = Ed25519-SPKI
+Input = ""
+Output = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b
+
+# Length is wrong.
+VerifyMessage = Ed25519-SPKI
+Input = ""
+Output = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a10
+Error = INVALID_SIGNATURE
+
+# Message is wrong.
+VerifyMessage = Ed25519-SPKI
+Input = "Hello world"
+Output = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b
+Error = INVALID_SIGNATURE
+
+# Ed25519 does not support configuring a digest.
+SignMessage = Ed25519
+Input = ""
+Digest = SHA256
+Error = COMMAND_NOT_SUPPORTED
+
+# Ed25519 does not support signing a pre-hashed value.
+Sign = Ed25519
+Input = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+Error = OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE
+
+Verify = Ed25519
+Input = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
+Output = e5564300c360ac729086e2cc806e828a84877f1eb8e5d974d873e065224901555fb8821590a33bacc61e39701cf9b46bd25bf5f0595bbe24655141438e7a100b
+Error = OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE
diff --git a/src/crypto/evp/internal.h b/src/crypto/evp/internal.h
index cdbd56a..5e9aab0 100644
--- a/src/crypto/evp/internal.h
+++ b/src/crypto/evp/internal.h
@@ -164,7 +164,7 @@
 #define EVP_PKEY_CTRL_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 3)
 #define EVP_PKEY_CTRL_GET_RSA_PSS_SALTLEN (EVP_PKEY_ALG_CTRL + 4)
 #define EVP_PKEY_CTRL_RSA_KEYGEN_BITS (EVP_PKEY_ALG_CTRL + 5)
-#define EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP	(EVP_PKEY_ALG_CTRL + 6)
+#define EVP_PKEY_CTRL_RSA_KEYGEN_PUBEXP (EVP_PKEY_ALG_CTRL + 6)
 #define EVP_PKEY_CTRL_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 7)
 #define EVP_PKEY_CTRL_GET_RSA_OAEP_MD (EVP_PKEY_ALG_CTRL + 8)
 #define EVP_PKEY_CTRL_RSA_MGF1_MD (EVP_PKEY_ALG_CTRL + 9)
@@ -199,9 +199,15 @@
   int (*sign)(EVP_PKEY_CTX *ctx, uint8_t *sig, size_t *siglen,
               const uint8_t *tbs, size_t tbslen);
 
+  int (*sign_message)(EVP_PKEY_CTX *ctx, uint8_t *sig, size_t *siglen,
+                      const uint8_t *tbs, size_t tbslen);
+
   int (*verify)(EVP_PKEY_CTX *ctx, const uint8_t *sig, size_t siglen,
                 const uint8_t *tbs, size_t tbslen);
 
+  int (*verify_message)(EVP_PKEY_CTX *ctx, const uint8_t *sig, size_t siglen,
+                        const uint8_t *tbs, size_t tbslen);
+
   int (*verify_recover)(EVP_PKEY_CTX *ctx, uint8_t *out, size_t *out_len,
                         const uint8_t *sig, size_t sig_len);
 
@@ -216,12 +222,27 @@
   int (*ctrl)(EVP_PKEY_CTX *ctx, int type, int p1, void *p2);
 } /* EVP_PKEY_METHOD */;
 
+typedef struct {
+  union {
+    uint8_t priv[64];
+    struct {
+      /* Shift the location of the public key to align with where it is in the
+       * private key representation. */
+      uint8_t pad[32];
+      uint8_t value[32];
+    } pub;
+  } key;
+  char has_private;
+} ED25519_KEY;
+
 extern const EVP_PKEY_ASN1_METHOD dsa_asn1_meth;
 extern const EVP_PKEY_ASN1_METHOD ec_asn1_meth;
 extern const EVP_PKEY_ASN1_METHOD rsa_asn1_meth;
+extern const EVP_PKEY_ASN1_METHOD ed25519_asn1_meth;
 
 extern const EVP_PKEY_METHOD rsa_pkey_meth;
 extern const EVP_PKEY_METHOD ec_pkey_meth;
+extern const EVP_PKEY_METHOD ed25519_pkey_meth;
 
 
 #if defined(__cplusplus)
diff --git a/src/crypto/evp/p_ec.c b/src/crypto/evp/p_ec.c
index dc1ea6f..c5692e5 100644
--- a/src/crypto/evp/p_ec.c
+++ b/src/crypto/evp/p_ec.c
@@ -228,10 +228,12 @@
     pkey_ec_cleanup,
     pkey_ec_keygen,
     pkey_ec_sign,
+    NULL /* sign_message */,
     pkey_ec_verify,
-    0 /* verify_recover */,
-    0 /* encrypt */,
-    0 /* decrypt */,
+    NULL /* verify_message */,
+    NULL /* verify_recover */,
+    NULL /* encrypt */,
+    NULL /* decrypt */,
     pkey_ec_derive,
     pkey_ec_ctrl,
 };
diff --git a/src/crypto/evp/p_ed25519.c b/src/crypto/evp/p_ed25519.c
new file mode 100644
index 0000000..0722624
--- /dev/null
+++ b/src/crypto/evp/p_ed25519.c
@@ -0,0 +1,71 @@
+/* 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. */
+
+#include <openssl/evp.h>
+
+#include <openssl/curve25519.h>
+#include <openssl/err.h>
+
+#include "internal.h"
+
+
+/* Ed25519 has no parameters to copy. */
+static int pkey_ed25519_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) { return 1; }
+
+static int pkey_ed25519_sign_message(EVP_PKEY_CTX *ctx, uint8_t *sig,
+                                     size_t *siglen, const uint8_t *tbs,
+                                     size_t tbslen) {
+  ED25519_KEY *key = ctx->pkey->pkey.ptr;
+  if (!key->has_private) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY);
+    return 0;
+  }
+
+  *siglen = 64;
+  if (sig == NULL) {
+    return 1;
+  }
+
+  return ED25519_sign(sig, tbs, tbslen, key->key.priv);
+}
+
+static int pkey_ed25519_verify_message(EVP_PKEY_CTX *ctx, const uint8_t *sig,
+                                       size_t siglen, const uint8_t *tbs,
+                                       size_t tbslen) {
+  ED25519_KEY *key = ctx->pkey->pkey.ptr;
+  if (siglen != 64 ||
+      !ED25519_verify(tbs, tbslen, sig, key->key.pub.value)) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_INVALID_SIGNATURE);
+    return 0;
+  }
+
+  return 1;
+}
+
+const EVP_PKEY_METHOD ed25519_pkey_meth = {
+    EVP_PKEY_ED25519,
+    NULL /* init */,
+    pkey_ed25519_copy,
+    NULL /* cleanup */,
+    NULL /* keygen */,
+    NULL /* sign */,
+    pkey_ed25519_sign_message,
+    NULL /* verify */,
+    pkey_ed25519_verify_message,
+    NULL /* verify_recover */,
+    NULL /* encrypt */,
+    NULL /* decrypt */,
+    NULL /* derive */,
+    NULL /* ctrl */,
+};
diff --git a/src/crypto/evp/p_ed25519_asn1.c b/src/crypto/evp/p_ed25519_asn1.c
new file mode 100644
index 0000000..8cb359e
--- /dev/null
+++ b/src/crypto/evp/p_ed25519_asn1.c
@@ -0,0 +1,194 @@
+/* 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. */
+
+#include <openssl/evp.h>
+
+#include <openssl/bytestring.h>
+#include <openssl/curve25519.h>
+#include <openssl/err.h>
+#include <openssl/mem.h>
+
+#include "internal.h"
+#include "../internal.h"
+
+
+static void ed25519_free(EVP_PKEY *pkey) {
+  if (pkey->pkey.ptr != NULL) {
+    ED25519_KEY *key = pkey->pkey.ptr;
+    OPENSSL_cleanse(key, sizeof(ED25519_KEY));
+    OPENSSL_free(key);
+    pkey->pkey.ptr = NULL;
+  }
+}
+
+static int set_pubkey(EVP_PKEY *pkey, const uint8_t pubkey[32]) {
+  ED25519_KEY *key = OPENSSL_malloc(sizeof(ED25519_KEY));
+  if (key == NULL) {
+    OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
+  key->has_private = 0;
+  OPENSSL_memcpy(key->key.pub.value, pubkey, 32);
+
+  ed25519_free(pkey);
+  pkey->pkey.ptr = key;
+  return 1;
+}
+
+static int set_privkey(EVP_PKEY *pkey, const uint8_t privkey[64]) {
+  ED25519_KEY *key = OPENSSL_malloc(sizeof(ED25519_KEY));
+  if (key == NULL) {
+    OPENSSL_PUT_ERROR(EVP, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
+  key->has_private = 1;
+  OPENSSL_memcpy(key->key.priv, privkey, 64);
+
+  ed25519_free(pkey);
+  pkey->pkey.ptr = key;
+  return 1;
+}
+
+static int ed25519_pub_decode(EVP_PKEY *out, CBS *params, CBS *key) {
+  /* See draft-ietf-curdle-pkix-04, section 4. */
+
+  /* The parameters must be omitted. Public keys have length 32. */
+  if (CBS_len(params) != 0 ||
+      CBS_len(key) != 32) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR);
+    return 0;
+  }
+
+  return set_pubkey(out, CBS_data(key));
+}
+
+static int ed25519_pub_encode(CBB *out, const EVP_PKEY *pkey) {
+  const ED25519_KEY *key = pkey->pkey.ptr;
+
+  /* See draft-ietf-curdle-pkix-04, section 4. */
+  CBB spki, algorithm, oid, key_bitstring;
+  if (!CBB_add_asn1(out, &spki, CBS_ASN1_SEQUENCE) ||
+      !CBB_add_asn1(&spki, &algorithm, CBS_ASN1_SEQUENCE) ||
+      !CBB_add_asn1(&algorithm, &oid, CBS_ASN1_OBJECT) ||
+      !CBB_add_bytes(&oid, ed25519_asn1_meth.oid, ed25519_asn1_meth.oid_len) ||
+      !CBB_add_asn1(&spki, &key_bitstring, CBS_ASN1_BITSTRING) ||
+      !CBB_add_u8(&key_bitstring, 0 /* padding */) ||
+      !CBB_add_bytes(&key_bitstring, key->key.pub.value, 32) ||
+      !CBB_flush(out)) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR);
+    return 0;
+  }
+
+  return 1;
+}
+
+static int ed25519_pub_cmp(const EVP_PKEY *a, const EVP_PKEY *b) {
+  const ED25519_KEY *a_key = a->pkey.ptr;
+  const ED25519_KEY *b_key = b->pkey.ptr;
+  return OPENSSL_memcmp(a_key->key.pub.value, b_key->key.pub.value, 32) == 0;
+}
+
+static int ed25519_priv_decode(EVP_PKEY *out, CBS *params, CBS *key) {
+  /* See draft-ietf-curdle-pkix-04, section 7. */
+
+  /* Parameters must be empty. The key is a 32-byte value wrapped in an extra
+   * OCTET STRING layer. */
+  CBS inner;
+  if (CBS_len(params) != 0 ||
+      !CBS_get_asn1(key, &inner, CBS_ASN1_OCTETSTRING) ||
+      CBS_len(key) != 0 ||
+      CBS_len(&inner) != 32) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_DECODE_ERROR);
+    return 0;
+  }
+
+  /* The PKCS#8 encoding stores only the 32-byte seed, so we must recover the
+   * full representation which we use from it. */
+  uint8_t pubkey[32], privkey[64];
+  ED25519_keypair_from_seed(pubkey, privkey, CBS_data(&inner));
+  return set_privkey(out, privkey);
+}
+
+static int ed25519_priv_encode(CBB *out, const EVP_PKEY *pkey) {
+  ED25519_KEY *key = pkey->pkey.ptr;
+  if (!key->has_private) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_NOT_A_PRIVATE_KEY);
+    return 0;
+  }
+
+  /* See draft-ietf-curdle-pkix-04, section 7. */
+  CBB pkcs8, algorithm, oid, private_key, inner;
+  if (!CBB_add_asn1(out, &pkcs8, CBS_ASN1_SEQUENCE) ||
+      !CBB_add_asn1_uint64(&pkcs8, 0 /* version */) ||
+      !CBB_add_asn1(&pkcs8, &algorithm, CBS_ASN1_SEQUENCE) ||
+      !CBB_add_asn1(&algorithm, &oid, CBS_ASN1_OBJECT) ||
+      !CBB_add_bytes(&oid, ed25519_asn1_meth.oid, ed25519_asn1_meth.oid_len) ||
+      !CBB_add_asn1(&pkcs8, &private_key, CBS_ASN1_OCTETSTRING) ||
+      !CBB_add_asn1(&private_key, &inner, CBS_ASN1_OCTETSTRING) ||
+      /* The PKCS#8 encoding stores only the 32-byte seed which is the first 32
+       * bytes of the private key. */
+      !CBB_add_bytes(&inner, key->key.priv, 32) ||
+      !CBB_flush(out)) {
+    OPENSSL_PUT_ERROR(EVP, EVP_R_ENCODE_ERROR);
+    return 0;
+  }
+
+  return 1;
+}
+
+static int ed25519_size(const EVP_PKEY *pkey) { return 64; }
+
+static int ed25519_bits(const EVP_PKEY *pkey) { return 256; }
+
+const EVP_PKEY_ASN1_METHOD ed25519_asn1_meth = {
+    EVP_PKEY_ED25519,
+    {0x2b, 0x65, 0x70},
+    3,
+    ed25519_pub_decode,
+    ed25519_pub_encode,
+    ed25519_pub_cmp,
+    ed25519_priv_decode,
+    ed25519_priv_encode,
+    NULL /* pkey_opaque */,
+    ed25519_size,
+    ed25519_bits,
+    NULL /* param_missing */,
+    NULL /* param_copy */,
+    NULL /* param_cmp */,
+    ed25519_free,
+};
+
+EVP_PKEY *EVP_PKEY_new_ed25519_public(const uint8_t public_key[32]) {
+  EVP_PKEY *ret = EVP_PKEY_new();
+  if (ret == NULL ||
+      !EVP_PKEY_set_type(ret, EVP_PKEY_ED25519) ||
+      !set_pubkey(ret, public_key)) {
+    EVP_PKEY_free(ret);
+    return NULL;
+  }
+
+  return ret;
+}
+
+EVP_PKEY *EVP_PKEY_new_ed25519_private(const uint8_t private_key[64]) {
+  EVP_PKEY *ret = EVP_PKEY_new();
+  if (ret == NULL ||
+      !EVP_PKEY_set_type(ret, EVP_PKEY_ED25519) ||
+      !set_privkey(ret, private_key)) {
+    EVP_PKEY_free(ret);
+    return NULL;
+  }
+
+  return ret;
+}
diff --git a/src/crypto/evp/p_rsa.c b/src/crypto/evp/p_rsa.c
index 6b25fa2..3b674cd 100644
--- a/src/crypto/evp/p_rsa.c
+++ b/src/crypto/evp/p_rsa.c
@@ -583,7 +583,9 @@
     pkey_rsa_cleanup,
     pkey_rsa_keygen,
     pkey_rsa_sign,
+    NULL /* sign_message */,
     pkey_rsa_verify,
+    NULL /* verify_message */,
     pkey_rsa_verify_recover,
     pkey_rsa_encrypt,
     pkey_rsa_decrypt,
diff --git a/src/crypto/evp/pbkdf.c b/src/crypto/evp/pbkdf.c
index 1792cdc..daebb2d 100644
--- a/src/crypto/evp/pbkdf.c
+++ b/src/crypto/evp/pbkdf.c
@@ -65,83 +65,76 @@
 int PKCS5_PBKDF2_HMAC(const char *password, size_t password_len,
                       const uint8_t *salt, size_t salt_len, unsigned iterations,
                       const EVP_MD *digest, size_t key_len, uint8_t *out_key) {
-  uint8_t digest_tmp[EVP_MAX_MD_SIZE], *p, itmp[4];
-  size_t cplen, mdlen, tkeylen, k;
-  unsigned j;
+  /* See RFC 8018, section 5.2. */
+  int ret = 0;
+  size_t md_len = EVP_MD_size(digest);
   uint32_t i = 1;
-  HMAC_CTX hctx_tpl, hctx;
+  HMAC_CTX hctx;
+  HMAC_CTX_init(&hctx);
 
-  mdlen = EVP_MD_size(digest);
-  HMAC_CTX_init(&hctx_tpl);
-  p = out_key;
-  tkeylen = key_len;
-  if (!HMAC_Init_ex(&hctx_tpl, password, password_len, digest, NULL)) {
-    HMAC_CTX_cleanup(&hctx_tpl);
-    return 0;
+  if (!HMAC_Init_ex(&hctx, password, password_len, digest, NULL)) {
+    goto err;
   }
-  while (tkeylen) {
-    if (tkeylen > mdlen) {
-      cplen = mdlen;
-    } else {
-      cplen = tkeylen;
+
+  while (key_len > 0) {
+    size_t todo = md_len;
+    if (todo > key_len) {
+      todo = key_len;
     }
-    /* We are unlikely to ever use more than 256 blocks (5120 bits!)
-     * but just in case... */
-    itmp[0] = (uint8_t)((i >> 24) & 0xff);
-    itmp[1] = (uint8_t)((i >> 16) & 0xff);
-    itmp[2] = (uint8_t)((i >> 8) & 0xff);
-    itmp[3] = (uint8_t)(i & 0xff);
-    if (!HMAC_CTX_copy(&hctx, &hctx_tpl)) {
-      HMAC_CTX_cleanup(&hctx_tpl);
-      return 0;
-    }
-    if (!HMAC_Update(&hctx, salt, salt_len) ||
-        !HMAC_Update(&hctx, itmp, 4) ||
+
+    uint8_t i_buf[4];
+    i_buf[0] = (uint8_t)((i >> 24) & 0xff);
+    i_buf[1] = (uint8_t)((i >> 16) & 0xff);
+    i_buf[2] = (uint8_t)((i >> 8) & 0xff);
+    i_buf[3] = (uint8_t)(i & 0xff);
+
+    /* Compute U_1. */
+    uint8_t digest_tmp[EVP_MAX_MD_SIZE];
+    if (!HMAC_Init_ex(&hctx, NULL, 0, NULL, NULL) ||
+        !HMAC_Update(&hctx, salt, salt_len) ||
+        !HMAC_Update(&hctx, i_buf, 4) ||
         !HMAC_Final(&hctx, digest_tmp, NULL)) {
-      HMAC_CTX_cleanup(&hctx_tpl);
-      HMAC_CTX_cleanup(&hctx);
-      return 0;
+      goto err;
     }
-    HMAC_CTX_cleanup(&hctx);
-    OPENSSL_memcpy(p, digest_tmp, cplen);
-    for (j = 1; j < iterations; j++) {
-      if (!HMAC_CTX_copy(&hctx, &hctx_tpl)) {
-        HMAC_CTX_cleanup(&hctx_tpl);
-        return 0;
-      }
-      if (!HMAC_Update(&hctx, digest_tmp, mdlen) ||
+
+    OPENSSL_memcpy(out_key, digest_tmp, todo);
+    for (unsigned j = 1; j < iterations; j++) {
+      /* Compute the remaining U_* values and XOR. */
+      if (!HMAC_Init_ex(&hctx, NULL, 0, NULL, NULL) ||
+          !HMAC_Update(&hctx, digest_tmp, md_len) ||
           !HMAC_Final(&hctx, digest_tmp, NULL)) {
-        HMAC_CTX_cleanup(&hctx_tpl);
-        HMAC_CTX_cleanup(&hctx);
-        return 0;
+        goto err;
       }
-      HMAC_CTX_cleanup(&hctx);
-      for (k = 0; k < cplen; k++) {
-        p[k] ^= digest_tmp[k];
+      for (size_t k = 0; k < todo; k++) {
+        out_key[k] ^= digest_tmp[k];
       }
     }
-    tkeylen -= cplen;
+
+    key_len -= todo;
+    out_key += todo;
     i++;
-    p += cplen;
   }
-  HMAC_CTX_cleanup(&hctx_tpl);
 
-  // RFC 2898 describes iterations (c) as being a "positive integer", so a
-  // value of 0 is an error.
-  //
-  // Unfortunatley not all consumers of PKCS5_PBKDF2_HMAC() check their return
-  // value, expecting it to succeed and unconditonally using |out_key|.
-  // As a precaution for such callsites in external code, the old behavior
-  // of iterations < 1 being treated as iterations == 1 is preserved, but
-  // additionally an error result is returned.
-  //
-  // TODO(eroman): Figure out how to remove this compatibility hack, or change
-  // the default to something more sensible like 2048.
+  /* RFC 8018 describes iterations (c) as being a "positive integer", so a
+   * value of 0 is an error.
+   *
+   * Unfortunately not all consumers of PKCS5_PBKDF2_HMAC() check their return
+   * value, expecting it to succeed and unconditionally using |out_key|.  As a
+   * precaution for such callsites in external code, the old behavior of
+   * iterations < 1 being treated as iterations == 1 is preserved, but
+   * additionally an error result is returned.
+   *
+   * TODO(eroman): Figure out how to remove this compatibility hack, or change
+   * the default to something more sensible like 2048. */
   if (iterations == 0) {
-    return 0;
+    goto err;
   }
 
-  return 1;
+  ret = 1;
+
+err:
+  HMAC_CTX_cleanup(&hctx);
+  return ret;
 }
 
 int PKCS5_PBKDF2_HMAC_SHA1(const char *password, size_t password_len,
diff --git a/src/crypto/evp/print.c b/src/crypto/evp/print.c
index b2e3509..214ada2 100644
--- a/src/crypto/evp/print.c
+++ b/src/crypto/evp/print.c
@@ -150,17 +150,6 @@
     update_buflen(rsa->dmp1, &buf_len);
     update_buflen(rsa->dmq1, &buf_len);
     update_buflen(rsa->iqmp, &buf_len);
-
-    if (rsa->additional_primes != NULL) {
-      for (size_t i = 0;
-           i < sk_RSA_additional_prime_num(rsa->additional_primes); i++) {
-        const RSA_additional_prime *ap =
-            sk_RSA_additional_prime_value(rsa->additional_primes, i);
-        update_buflen(ap->prime, &buf_len);
-        update_buflen(ap->exp, &buf_len);
-        update_buflen(ap->coeff, &buf_len);
-      }
-    }
   }
 
   m = (uint8_t *)OPENSSL_malloc(buf_len + 10);
@@ -204,26 +193,6 @@
         !bn_print(out, "coefficient:", rsa->iqmp, m, off)) {
       goto err;
     }
-
-    if (rsa->additional_primes != NULL &&
-        sk_RSA_additional_prime_num(rsa->additional_primes) > 0) {
-      if (BIO_printf(out, "otherPrimeInfos:\n") <= 0) {
-        goto err;
-      }
-      for (size_t i = 0;
-           i < sk_RSA_additional_prime_num(rsa->additional_primes); i++) {
-        const RSA_additional_prime *ap =
-            sk_RSA_additional_prime_value(rsa->additional_primes, i);
-
-        if (BIO_printf(out, "otherPrimeInfo (prime %u):\n",
-                       (unsigned)(i + 3)) <= 0 ||
-            !bn_print(out, "prime:", ap->prime, m, off) ||
-            !bn_print(out, "exponent:", ap->exp, m, off) ||
-            !bn_print(out, "coeff:", ap->coeff, m, off)) {
-          goto err;
-        }
-      }
-    }
   }
   ret = 1;
 
diff --git a/src/crypto/ex_data.c b/src/crypto/ex_data.c
index 5286513..20b762e 100644
--- a/src/crypto/ex_data.c
+++ b/src/crypto/ex_data.c
@@ -239,6 +239,13 @@
     return 1;
   }
 
+  for (size_t i = 0; i < ex_data_class->num_reserved; i++) {
+    void *ptr = CRYPTO_get_ex_data(from, i);
+    if (!CRYPTO_set_ex_data(to, i, ptr)) {
+      return 0;
+    }
+  }
+
   STACK_OF(CRYPTO_EX_DATA_FUNCS) *func_pointers;
   if (!get_func_pointers(&func_pointers, ex_data_class)) {
     return 0;
@@ -252,7 +259,10 @@
       func_pointer->dup_func(to, from, &ptr, i + ex_data_class->num_reserved,
                              func_pointer->argl, func_pointer->argp);
     }
-    CRYPTO_set_ex_data(to, i + ex_data_class->num_reserved, ptr);
+    if (!CRYPTO_set_ex_data(to, i + ex_data_class->num_reserved, ptr)) {
+      sk_CRYPTO_EX_DATA_FUNCS_free(func_pointers);
+      return 0;
+    }
   }
 
   sk_CRYPTO_EX_DATA_FUNCS_free(func_pointers);
diff --git a/src/crypto/fipsmodule/CMakeLists.txt b/src/crypto/fipsmodule/CMakeLists.txt
new file mode 100644
index 0000000..4db44a9
--- /dev/null
+++ b/src/crypto/fipsmodule/CMakeLists.txt
@@ -0,0 +1,176 @@
+include_directories(../../include)
+
+if (${ARCH} STREQUAL "x86_64")
+  set(
+    BCM_ASM_SOURCES
+
+    md5-x86_64.${ASM_EXT}
+    sha1-x86_64.${ASM_EXT}
+    sha256-x86_64.${ASM_EXT}
+    sha512-x86_64.${ASM_EXT}
+    aes-x86_64.${ASM_EXT}
+    aesni-x86_64.${ASM_EXT}
+    bsaes-x86_64.${ASM_EXT}
+    vpaes-x86_64.${ASM_EXT}
+  )
+endif()
+
+if (${ARCH} STREQUAL "x86")
+  set(
+    BCM_ASM_SOURCES
+
+    md5-586.${ASM_EXT}
+    sha1-586.${ASM_EXT}
+    sha256-586.${ASM_EXT}
+    sha512-586.${ASM_EXT}
+    aes-586.${ASM_EXT}
+    vpaes-x86.${ASM_EXT}
+    aesni-x86.${ASM_EXT}
+  )
+endif()
+
+if (${ARCH} STREQUAL "arm")
+  set(
+    BCM_ASM_SOURCES
+
+    sha1-armv4-large.${ASM_EXT}
+    sha256-armv4.${ASM_EXT}
+    sha512-armv4.${ASM_EXT}
+    aes-armv4.${ASM_EXT}
+    bsaes-armv7.${ASM_EXT}
+    aesv8-armx.${ASM_EXT}
+  )
+endif()
+
+if (${ARCH} STREQUAL "aarch64")
+  set(
+    BCM_ASM_SOURCES
+
+    sha1-armv8.${ASM_EXT}
+    sha256-armv8.${ASM_EXT}
+    sha512-armv8.${ASM_EXT}
+    aesv8-armx.${ASM_EXT}
+  )
+endif()
+
+if (${ARCH} STREQUAL "ppc64le")
+  set(
+    AES_ARCH_SOURCES
+
+    aesp8-ppc.${ASM_EXT}
+  )
+endif()
+
+perlasm(aes-586.${ASM_EXT} aes/asm/aes-586.pl)
+perlasm(aes-armv4.${ASM_EXT} aes/asm/aes-armv4.pl)
+perlasm(aesni-x86_64.${ASM_EXT} aes/asm/aesni-x86_64.pl)
+perlasm(aesni-x86.${ASM_EXT} aes/asm/aesni-x86.pl)
+perlasm(aesp8-ppc.${ASM_EXT} aes/asm/aesp8-ppc.pl)
+perlasm(aesv8-armx.${ASM_EXT} aes/asm/aesv8-armx.pl)
+perlasm(aes-x86_64.${ASM_EXT} aes/asm/aes-x86_64.pl)
+perlasm(bsaes-armv7.${ASM_EXT} aes/asm/bsaes-armv7.pl)
+perlasm(bsaes-x86_64.${ASM_EXT} aes/asm/bsaes-x86_64.pl)
+perlasm(md5-586.${ASM_EXT} md5/asm/md5-586.pl)
+perlasm(md5-x86_64.${ASM_EXT} md5/asm/md5-x86_64.pl)
+perlasm(sha1-586.${ASM_EXT} sha/asm/sha1-586.pl)
+perlasm(sha1-armv4-large.${ASM_EXT} sha/asm/sha1-armv4-large.pl)
+perlasm(sha1-armv8.${ASM_EXT} sha/asm/sha1-armv8.pl)
+perlasm(sha1-x86_64.${ASM_EXT} sha/asm/sha1-x86_64.pl)
+perlasm(sha256-586.${ASM_EXT} sha/asm/sha256-586.pl)
+perlasm(sha256-armv4.${ASM_EXT} sha/asm/sha256-armv4.pl)
+perlasm(sha256-armv8.${ASM_EXT} sha/asm/sha512-armv8.pl)
+perlasm(sha256-x86_64.${ASM_EXT} sha/asm/sha512-x86_64.pl)
+perlasm(sha512-586.${ASM_EXT} sha/asm/sha512-586.pl)
+perlasm(sha512-armv4.${ASM_EXT} sha/asm/sha512-armv4.pl)
+perlasm(sha512-armv8.${ASM_EXT} sha/asm/sha512-armv8.pl)
+perlasm(sha512-x86_64.${ASM_EXT} sha/asm/sha512-x86_64.pl)
+perlasm(vpaes-x86_64.${ASM_EXT} aes/asm/vpaes-x86_64.pl)
+perlasm(vpaes-x86.${ASM_EXT} aes/asm/vpaes-x86.pl)
+
+if(FIPS)
+  add_library(
+    bcm_c_generated_asm
+
+    STATIC
+
+    bcm.c
+  )
+
+  SET_TARGET_PROPERTIES(bcm_c_generated_asm PROPERTIES COMPILE_OPTIONS "-S")
+  SET_TARGET_PROPERTIES(bcm_c_generated_asm PROPERTIES POSITION_INDEPENDENT_CODE ON)
+
+  function(JOIN VALUES GLUE OUTPUT)
+    string (REPLACE ";" "${GLUE}" _TMP_STR "${VALUES}")
+    set (${OUTPUT} "${_TMP_STR}" PARENT_SCOPE)
+  endfunction()
+
+  set(DELOCATE_AS_FLAG)
+  set(DELOCATE_AS_ARG)
+
+  if(NOT "${BCM_ASM_SOURCES}" STREQUAL "")
+    set(DELOCATE_AS_FLAG "-as")
+    JOIN("${BCM_ASM_SOURCES}" ",${CMAKE_CURRENT_BINARY_DIR}/" BCM_ASM_SOURCES_COMMA_SEP)
+    SET(DELOCATE_AS_ARG "${CMAKE_CURRENT_BINARY_DIR}/${BCM_ASM_SOURCES_COMMA_SEP}")
+  endif()
+
+  add_custom_command(
+    OUTPUT bcm-delocated.S
+    COMMAND ${GO_EXECUTABLE} run crypto/fipsmodule/delocate.go crypto/fipsmodule/ar.go crypto/fipsmodule/const.go -a $<TARGET_FILE:bcm_c_generated_asm> ${DELOCATE_AS_FLAG} ${DELOCATE_AS_ARG} -o ${CMAKE_CURRENT_BINARY_DIR}/bcm-delocated.S
+    DEPENDS bcm_c_generated_asm ${BCM_ASM_SOURCES} delocate.go ar.go const.go
+    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+  )
+
+  add_library(
+    bcm_hashunset
+
+    STATIC
+
+    bcm-delocated.S
+  )
+
+  set_target_properties(bcm_hashunset PROPERTIES POSITION_INDEPENDENT_CODE ON)
+  set_target_properties(bcm_hashunset PROPERTIES LINKER_LANGUAGE C)
+
+  add_custom_command(
+    OUTPUT bcm.o
+    COMMAND ${GO_EXECUTABLE} run crypto/fipsmodule/inject-hash.go crypto/fipsmodule/ar.go crypto/fipsmodule/const.go -o ${CMAKE_CURRENT_BINARY_DIR}/bcm.o -in $<TARGET_FILE:bcm_hashunset>
+    DEPENDS bcm_hashunset inject-hash.go ar.go const.go
+    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+  )
+
+  # The outputs of add_custom_command cannot be referenced outside of the
+  # CMakeLists.txt that defines it. Thus we have to wrap bcm.o in a custom target
+  # so that crypto can depend on it.
+  add_custom_target(bcm_o_target DEPENDS bcm.o)
+
+  add_library(
+    fipsmodule
+
+    OBJECT
+
+    is_fips.c
+  )
+
+  set_target_properties(fipsmodule PROPERTIES LINKER_LANGUAGE C)
+else()
+  add_library(
+    fipsmodule
+
+    OBJECT
+
+    bcm.c
+    is_fips.c
+
+    ${BCM_ASM_SOURCES}
+  )
+endif()
+
+add_executable(
+  aes_test
+
+  aes/aes_test.cc
+  $<TARGET_OBJECTS:test_support>
+)
+
+target_link_libraries(aes_test crypto)
+add_dependencies(all_tests aes_test)
diff --git a/src/crypto/fipsmodule/FIPS.md b/src/crypto/fipsmodule/FIPS.md
new file mode 100644
index 0000000..06ef9fb
--- /dev/null
+++ b/src/crypto/fipsmodule/FIPS.md
@@ -0,0 +1,75 @@
+## Integrity Test
+
+FIPS-140 mandates that a module calculate an HMAC of its own code in a constructor function and compare the result to a known-good value. Typical code produced by a C compiler includes large numbers of relocations: places in the machine code where the linker needs to resolve and inject the final value of a symbolic expression. These relocations mean that the bytes that make up any specific bit of code generally aren't known until the final link has completed.
+
+Additionally, because of shared libraries and ASLR, some relocations can only be resolved at run-time, and thus targets of those relocations vary even after the final link.
+
+BoringSSL is linked (often statically) into a large number of binaries. It would be a significant cost if each of these binaries had to be post-processed in order to calculate the known-good HMAC value. We would much prefer if the value could be calculated, once, when BoringSSL itself is compiled.
+
+In order for the value to be calculated before the final link, there can be no relocations in the hashed code and data. This document describes how we build C and assembly code in order to produce an object file containing all the code and data for the FIPS module without that code having any relocations.
+
+First, all the C source files for the module are compiled as a single unit by compiling a single source file that `#include`s them all (this is `bcm.c`). The `-fPIC` flag is used to cause the compiler to use IP-relative addressing in many (but not all) cases. Also the `-S` flag is used to instruct the compiler to produce a textual assembly file rather than a binary object file.
+
+The textual assembly file is then processed by a script to merge in assembly implementations of some primitives and to eliminate the remaining sources of relocations.
+
+##### Redirector functions
+
+The most obvious cause of relocations are out-calls from the module to non-cryptographic functions outside of the module. Most obviously these include `malloc`, `memcpy` and other libc functions, but also include calls to support code in BoringSSL such as functions for managing the error queue.
+
+Offsets to these functions cannot be known until the final link because only the linker sees the object files containing them. Thus calls to these functions are rewritten into an IP-relative jump to a redirector function. The redirector functions contain a single jump instruction to the real function and are placed outside of the module and are thus not hashed (see diagram).
+
+![module structure](/crypto/fipsmodule/intcheck1.png)
+
+In this diagram, the integrity check hashes from `module_start` to `module_end`. Since this does not cover the jump to `memcpy`, it's fine that the linker will poke the final offset into that instruction.
+
+##### Read-only data
+
+Normally read-only data is placed in a `.data` segment that doesn't get mapped into memory with execute permissions. However, the offset of the data segment from the text segment is another thing that isn't determined until the final link. In order to fix data offsets before the link, read-only data is simply placed in the module's `.text` segment. This might make building ROP chains easier for an attacker, but so it goes.
+
+One special case is `rel.ro` data, which is data that contains function pointers. Since these function pointers are absolute, they are written by the dynamic linker at run-time and so we must eliminate them. The pattern that causes them is when we have a static `EVP_MD` or `EVP_CIPHER` object thus, inside the module, we'll change this pattern to instead to reserve space in the BSS for the object, and add a `CRYPTO_once_t` to protect its initialisation. The script will generate functions outside of the module that return pointers to these areas of memory—they effectively act like a special-purpose malloc calls that cannot fail.
+
+##### Read-write data
+
+Mutable data is a problem. It cannot be in the text segment because the text segment is mapped read-only. If it's in a different segment then the code cannot reference it with a known, IP-relative offset because the segment layout is only fixed during the final link.
+
+Thankfully, mutable data is very rare in our cryptographic code and I hope that we can get it down to just a few variables. In order to allow this we use a similar design to the redirector functions: the code references a symbol that's in the text segment, but out of the module and thus not hashed. A relocation record is emitted to instruct the linker to poke the final offset to the variable in that location. Thus the only change needed is an extra indirection when loading the value.
+
+##### Other transforms
+
+The script performs a number of other transformations which are worth noting but do not warrant their own sections:
+
+1.  It duplicates each global symbol with a local symbol that has `_local_target` appended to the name. References to the global symbols are rewritten to use these duplicates instead. Otherwise, although the generated code uses IP-relative references, relocations are emitted for global symbols in case they are overridden by a different object file during the link.
+1.  Various sections, notably `.rodata`, are moved to the `.text` section, inside the module, so module code may reference it without relocations.
+1.  For each BSS symbol, it generates a function named after that symbol but with `_bss_get` appended, which returns its address.
+1.  It inserts the labels that delimit the module's code and data (called `module_start` and `module_end` in the diagram above).
+1.  It adds a 32-byte, read-only array outside of the module to contain the known-good HMAC value.
+1.  It rewrites some "dummy" references to point to those labels and that array. In order to get the C compiler to emit the correct code it's necessary to make it think that it's referencing static functions. This compensates for that trick.
+
+##### Integrity testing
+
+In order to actually implement the integrity test, a constructor function within the module calculates an HMAC from `module_start` to `module_end` using a fixed, all-zero key. It compares the result with the known-good value added (by the script) to the unhashed portion of the text segment. If they don't match, it calls `exit` in an infinite loop.
+
+Initially the known-good value will be incorrect. Another script (`inject-hash.go`) calculates the correct value from the assembled object and injects it back into the object.
+
+![build process](/crypto/fipsmodule/intcheck2.png)
+
+### Comparison with OpenSSL's method
+
+(This is based on reading OpenSSL's [user guide](https://www.openssl.org/docs/fips/UserGuide-2.0.pdf) and inspecting the code of OpenSSL FIPS 2.0.12.)
+
+OpenSSL's solution to this problem is broadly similar but has a number of differences:
+
+1.  OpenSSL deals with run-time relocations by not hashing parts of the module's data. BoringSSL will eliminate run-time relocations instead and hash everything.
+1.  OpenSSL uses `ld -r` (the partial linking mode) to merge a number of object files into their `fipscanister.o`. For BoringSSL, we propose to merge all the C source files by building a single C file that #includes all the others, then we propose to merge the assembly sources by concatenating them to the assembly output from the C compiler.
+1.  OpenSSL depends on the link order and inserts two object files, `fips_start.o` and `fips_end.o`, in order to establish the `module_start` and `module_end` values. BoringSSL proposes to simply add labels at the correct places in the assembly.
+1.  OpenSSL calculates the hash after the final link and either injects it into the binary or recompiles with the value of the hash passed in as a #define. BoringSSL calculates it prior to the final link and injects it into the object file.
+1.  OpenSSL references read-write data directly, since it can know the offsets to it. BoringSSL indirects these loads and stores.
+1.  OpenSSL doesn't run the power-on test until `FIPS_module_mode_set` is called, BoringSSL plans to do it in a constructor function. Failure of the test is non-fatal in OpenSSL, BoringSSL plans to crash.
+1.  Since the contents of OpenSSL's module change between compilation and use, OpenSSL generates `fipscanister.o.sha1` to check that the compiled object doesn't change before linking. Since BoringSSL's module is fixed after compilation, the final integrity check is unbroken through the linking process.
+
+Some of the similarities are worth noting:
+
+1.  OpenSSL has all out-calls from the module indirecting via the PLT, which is equivalent to the redirector functions described above.
+
+
+![OpenSSL build process](/crypto/fipsmodule/intcheck3.png)
diff --git a/src/crypto/aes/aes.c b/src/crypto/fipsmodule/aes/aes.c
similarity index 99%
rename from src/crypto/aes/aes.c
rename to src/crypto/fipsmodule/aes/aes.c
index 1aed63e..cd53a46 100644
--- a/src/crypto/aes/aes.c
+++ b/src/crypto/fipsmodule/aes/aes.c
@@ -53,7 +53,7 @@
 
 #include <openssl/cpu.h>
 
-#include "internal.h"
+#include "../../modes/internal.h"
 
 
 #if defined(OPENSSL_NO_ASM) || \
diff --git a/src/crypto/aes/aes_test.cc b/src/crypto/fipsmodule/aes/aes_test.cc
similarity index 98%
rename from src/crypto/aes/aes_test.cc
rename to src/crypto/fipsmodule/aes/aes_test.cc
index cdf03d3..e1e9ca6 100644
--- a/src/crypto/aes/aes_test.cc
+++ b/src/crypto/fipsmodule/aes/aes_test.cc
@@ -21,8 +21,8 @@
 #include <openssl/aes.h>
 #include <openssl/crypto.h>
 
-#include "../internal.h"
-#include "../test/file_test.h"
+#include "../../internal.h"
+#include "../../test/file_test.h"
 
 
 static bool TestRaw(FileTest *t) {
diff --git a/src/crypto/aes/aes_tests.txt b/src/crypto/fipsmodule/aes/aes_tests.txt
similarity index 100%
rename from src/crypto/aes/aes_tests.txt
rename to src/crypto/fipsmodule/aes/aes_tests.txt
diff --git a/src/crypto/aes/asm/aes-586.pl b/src/crypto/fipsmodule/aes/asm/aes-586.pl
similarity index 99%
rename from src/crypto/aes/asm/aes-586.pl
rename to src/crypto/fipsmodule/aes/asm/aes-586.pl
index 45c19fb..a2c6eb5 100755
--- a/src/crypto/aes/asm/aes-586.pl
+++ b/src/crypto/fipsmodule/aes/asm/aes-586.pl
@@ -188,7 +188,7 @@
 # window, which is actually *less* than RDTSC latency on Intel P4!
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
-push(@INC,"${dir}","${dir}../../perlasm");
+push(@INC,"${dir}","${dir}../../../perlasm");
 require "x86asm.pl";
 
 $output = pop;
diff --git a/src/crypto/aes/asm/aes-armv4.pl b/src/crypto/fipsmodule/aes/asm/aes-armv4.pl
similarity index 99%
rename from src/crypto/aes/asm/aes-armv4.pl
rename to src/crypto/fipsmodule/aes/asm/aes-armv4.pl
index 5e1e117..562faab 100644
--- a/src/crypto/aes/asm/aes-armv4.pl
+++ b/src/crypto/fipsmodule/aes/asm/aes-armv4.pl
@@ -39,7 +39,7 @@
 if ($flavour && $flavour ne "void") {
     $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
     ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
-    ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
+    ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or
     die "can't locate arm-xlate.pl";
 
     open STDOUT,"| \"$^X\" $xlate $flavour $output";
diff --git a/src/crypto/aes/asm/aes-x86_64.pl b/src/crypto/fipsmodule/aes/asm/aes-x86_64.pl
similarity index 99%
rename from src/crypto/aes/asm/aes-x86_64.pl
rename to src/crypto/fipsmodule/aes/asm/aes-x86_64.pl
index abf957c..362c1c9 100755
--- a/src/crypto/aes/asm/aes-x86_64.pl
+++ b/src/crypto/fipsmodule/aes/asm/aes-x86_64.pl
@@ -34,7 +34,7 @@
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
-( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
+( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 die "can't locate x86_64-xlate.pl";
 
 open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\"";
@@ -1642,7 +1642,7 @@
 .align	16
 .globl	asm_AES_cbc_encrypt
 .type	asm_AES_cbc_encrypt,\@function,6
-.extern	OPENSSL_ia32cap_P
+.extern	OPENSSL_ia32cap_addr
 .hidden	asm_AES_cbc_encrypt
 asm_AES_cbc_encrypt:
 	cmp	\$0,%rdx	# check length
@@ -1664,7 +1664,8 @@
 	cmp	\$0,%r9
 	cmoveq	%r10,$sbox
 
-	mov	OPENSSL_ia32cap_P(%rip),%r10d
+	mov	OPENSSL_ia32cap_addr(%rip),%r10
+	mov	(%r10), %r10d
 	cmp	\$$speed_limit,%rdx
 	jb	.Lcbc_slow_prologue
 	test	\$15,%rdx
diff --git a/src/crypto/aes/asm/aesni-x86.pl b/src/crypto/fipsmodule/aes/asm/aesni-x86.pl
similarity index 99%
rename from src/crypto/aes/asm/aesni-x86.pl
rename to src/crypto/fipsmodule/aes/asm/aesni-x86.pl
index e494dd1..66af51b 100644
--- a/src/crypto/aes/asm/aesni-x86.pl
+++ b/src/crypto/fipsmodule/aes/asm/aesni-x86.pl
@@ -62,7 +62,7 @@
 $inline=1;		# inline _aesni_[en|de]crypt
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
-push(@INC,"${dir}","${dir}../../perlasm");
+push(@INC,"${dir}","${dir}../../../perlasm");
 require "x86asm.pl";
 
 $output = pop;
diff --git a/src/crypto/aes/asm/aesni-x86_64.pl b/src/crypto/fipsmodule/aes/asm/aesni-x86_64.pl
similarity index 99%
rename from src/crypto/aes/asm/aesni-x86_64.pl
rename to src/crypto/fipsmodule/aes/asm/aesni-x86_64.pl
index 8ae6dbf..5810980 100644
--- a/src/crypto/aes/asm/aesni-x86_64.pl
+++ b/src/crypto/fipsmodule/aes/asm/aesni-x86_64.pl
@@ -198,7 +198,7 @@
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
-( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
+( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 die "can't locate x86_64-xlate.pl";
 
 open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\"";
@@ -209,7 +209,7 @@
 		("%rdi","%rsi","%rdx","%rcx");	# Unix order
 
 $code=".text\n";
-$code.=".extern	OPENSSL_ia32cap_P\n";
+$code.=".extern	OPENSSL_ia32cap_addr\n";
 
 $rounds="%eax";	# input to and changed by aesni_[en|de]cryptN !!!
 # this is natural Unix argument order for public $PREFIX_[ecb|cbc]_encrypt ...
@@ -1271,7 +1271,8 @@
 	lea	7($ctr),%r9
 	 mov	%r10d,0x60+12(%rsp)
 	bswap	%r9d
-	 mov	OPENSSL_ia32cap_P+4(%rip),%r10d
+	movq	OPENSSL_ia32cap_addr(%rip),%r10
+	 mov	4(%r10),%r10d
 	xor	$key0,%r9d
 	 and	\$`1<<26|1<<22`,%r10d		# isolate XSAVE+MOVBE
 	mov	%r9d,0x70+12(%rsp)
@@ -3771,7 +3772,8 @@
 	movdqa	$inout3,$in3
 	movdqu	0x50($inp),$inout5
 	movdqa	$inout4,$in4
-	mov	OPENSSL_ia32cap_P+4(%rip),%r9d
+	movq	OPENSSL_ia32cap_addr(%rip),%r9
+	mov	4(%r9),%r9d
 	cmp	\$0x70,$len
 	jbe	.Lcbc_dec_six_or_seven
 
@@ -4274,10 +4276,11 @@
 	test	$key,$key
 	jz	.Lenc_key_ret
 
-	mov	\$`1<<28|1<<11`,%r10d	# AVX and XOP bits
 	movups	($inp),%xmm0		# pull first 128 bits of *userKey
 	xorps	%xmm4,%xmm4		# low dword of xmm4 is assumed 0
-	and	OPENSSL_ia32cap_P+4(%rip),%r10d
+	movq	OPENSSL_ia32cap_addr(%rip),%r10
+	movl	4(%r10),%r10d
+	and	\$`1<<28|1<<11`,%r10d	# AVX and XOP bits
 	lea	16($key),%rax		# %rax is used as modifiable copy of $key
 	cmp	\$256,$bits
 	je	.L14rounds
diff --git a/src/crypto/aes/asm/aesp8-ppc.pl b/src/crypto/fipsmodule/aes/asm/aesp8-ppc.pl
similarity index 99%
rename from src/crypto/aes/asm/aesp8-ppc.pl
rename to src/crypto/fipsmodule/aes/asm/aesp8-ppc.pl
index ca3a150..fb76d28 100644
--- a/src/crypto/aes/asm/aesp8-ppc.pl
+++ b/src/crypto/fipsmodule/aes/asm/aesp8-ppc.pl
@@ -65,7 +65,7 @@
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 ( $xlate="${dir}ppc-xlate.pl" and -f $xlate ) or
-( $xlate="${dir}../../perlasm/ppc-xlate.pl" and -f $xlate) or
+( $xlate="${dir}../../../perlasm/ppc-xlate.pl" and -f $xlate) or
 die "can't locate ppc-xlate.pl";
 
 open STDOUT,"| $^X $xlate $flavour ".shift || die "can't call $xlate: $!";
diff --git a/src/crypto/aes/asm/aesv8-armx.pl b/src/crypto/fipsmodule/aes/asm/aesv8-armx.pl
similarity index 99%
rename from src/crypto/aes/asm/aesv8-armx.pl
rename to src/crypto/fipsmodule/aes/asm/aesv8-armx.pl
index 23ed77c..325bdeb 100644
--- a/src/crypto/aes/asm/aesv8-armx.pl
+++ b/src/crypto/fipsmodule/aes/asm/aesv8-armx.pl
@@ -36,7 +36,7 @@
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
-( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
+( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or
 die "can't locate arm-xlate.pl";
 
 open OUT,"| \"$^X\" $xlate $flavour $output";
diff --git a/src/crypto/aes/asm/bsaes-armv7.pl b/src/crypto/fipsmodule/aes/asm/bsaes-armv7.pl
similarity index 99%
rename from src/crypto/aes/asm/bsaes-armv7.pl
rename to src/crypto/fipsmodule/aes/asm/bsaes-armv7.pl
index 92f5ece..895a269 100644
--- a/src/crypto/aes/asm/bsaes-armv7.pl
+++ b/src/crypto/fipsmodule/aes/asm/bsaes-armv7.pl
@@ -61,7 +61,7 @@
 if ($flavour && $flavour ne "void") {
     $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
     ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
-    ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
+    ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or
     die "can't locate arm-xlate.pl";
 
     open STDOUT,"| \"$^X\" $xlate $flavour $output";
diff --git a/src/crypto/aes/asm/bsaes-x86_64.pl b/src/crypto/fipsmodule/aes/asm/bsaes-x86_64.pl
similarity index 99%
rename from src/crypto/aes/asm/bsaes-x86_64.pl
rename to src/crypto/fipsmodule/aes/asm/bsaes-x86_64.pl
index 9a8055e..8d9ee6b 100644
--- a/src/crypto/aes/asm/bsaes-x86_64.pl
+++ b/src/crypto/fipsmodule/aes/asm/bsaes-x86_64.pl
@@ -98,7 +98,7 @@
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
-( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
+( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 die "can't locate x86_64-xlate.pl";
 
 open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\"";
diff --git a/src/crypto/aes/asm/vpaes-x86.pl b/src/crypto/fipsmodule/aes/asm/vpaes-x86.pl
similarity index 99%
rename from src/crypto/aes/asm/vpaes-x86.pl
rename to src/crypto/fipsmodule/aes/asm/vpaes-x86.pl
index ebf90e7..58b90a3 100644
--- a/src/crypto/aes/asm/vpaes-x86.pl
+++ b/src/crypto/fipsmodule/aes/asm/vpaes-x86.pl
@@ -48,7 +48,7 @@
 #						<appro@openssl.org>
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
-push(@INC,"${dir}","${dir}../../perlasm");
+push(@INC,"${dir}","${dir}../../../perlasm");
 require "x86asm.pl";
 
 $output = pop;
diff --git a/src/crypto/aes/asm/vpaes-x86_64.pl b/src/crypto/fipsmodule/aes/asm/vpaes-x86_64.pl
similarity index 99%
rename from src/crypto/aes/asm/vpaes-x86_64.pl
rename to src/crypto/fipsmodule/aes/asm/vpaes-x86_64.pl
index 7a24e0d..eb4c724 100644
--- a/src/crypto/aes/asm/vpaes-x86_64.pl
+++ b/src/crypto/fipsmodule/aes/asm/vpaes-x86_64.pl
@@ -55,7 +55,7 @@
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
-( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
+( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 die "can't locate x86_64-xlate.pl";
 
 open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\"";
diff --git a/src/crypto/aes/key_wrap.c b/src/crypto/fipsmodule/aes/key_wrap.c
similarity index 99%
rename from src/crypto/aes/key_wrap.c
rename to src/crypto/fipsmodule/aes/key_wrap.c
index 23553b7..73de17f 100644
--- a/src/crypto/aes/key_wrap.c
+++ b/src/crypto/fipsmodule/aes/key_wrap.c
@@ -53,7 +53,7 @@
 
 #include <openssl/mem.h>
 
-#include "../internal.h"
+#include "../../internal.h"
 
 
 /* kDefaultIV is the default IV value given in RFC 3394, 2.2.3.1. */
diff --git a/src/crypto/aes/mode_wrappers.c b/src/crypto/fipsmodule/aes/mode_wrappers.c
similarity index 98%
rename from src/crypto/aes/mode_wrappers.c
rename to src/crypto/fipsmodule/aes/mode_wrappers.c
index 4929920..81e77a4 100644
--- a/src/crypto/aes/mode_wrappers.c
+++ b/src/crypto/fipsmodule/aes/mode_wrappers.c
@@ -50,7 +50,7 @@
 
 #include <assert.h>
 
-#include "../modes/internal.h"
+#include "../../modes/internal.h"
 
 
 void AES_ctr128_encrypt(const uint8_t *in, uint8_t *out, size_t len,
diff --git a/src/crypto/fipsmodule/ar.go b/src/crypto/fipsmodule/ar.go
new file mode 100644
index 0000000..51e7aa5
--- /dev/null
+++ b/src/crypto/fipsmodule/ar.go
@@ -0,0 +1,120 @@
+// 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. */
+
+// ar.go contains functions for parsing .a archive files.
+
+package main
+
+import (
+	"bytes"
+	"errors"
+	"io"
+	"strconv"
+	"strings"
+)
+
+// ParseAR parses an archive file from r and returns a map from filename to
+// contents, or else an error.
+func ParseAR(r io.Reader) (map[string][]byte, error) {
+	// See https://en.wikipedia.org/wiki/Ar_(Unix)#File_format_details
+	const expectedMagic = "!<arch>\n"
+	var magic [len(expectedMagic)]byte
+	if _, err := io.ReadFull(r, magic[:]); err != nil {
+		return nil, err
+	}
+	if string(magic[:]) != expectedMagic {
+		return nil, errors.New("ar: not an archive file")
+	}
+
+	const filenameTableName = "//"
+	const symbolTableName = "/"
+	var longFilenameTable []byte
+	ret := make(map[string][]byte)
+
+	for {
+		var header [60]byte
+		if _, err := io.ReadFull(r, header[:]); err != nil {
+			if err == io.EOF {
+				break
+			}
+			return nil, errors.New("ar: error reading file header: " + err.Error())
+		}
+
+		name := strings.TrimRight(string(header[:16]), " ")
+		sizeStr := strings.TrimRight(string(header[48:58]), "\x00 ")
+		size, err := strconv.ParseUint(sizeStr, 10, 64)
+		if err != nil {
+			return nil, errors.New("ar: failed to parse file size: " + err.Error())
+		}
+
+		// File contents are padded to a multiple of two bytes
+		storedSize := size
+		if storedSize%2 == 1 {
+			storedSize++
+		}
+
+		contents := make([]byte, storedSize)
+		if _, err := io.ReadFull(r, contents); err != nil {
+			return nil, errors.New("ar: error reading file contents: " + err.Error())
+		}
+		contents = contents[:size]
+
+		switch {
+		case name == filenameTableName:
+			if longFilenameTable != nil {
+				return nil, errors.New("ar: two filename tables found")
+			}
+			longFilenameTable = contents
+			continue
+
+		case name == symbolTableName:
+			continue
+
+		case len(name) > 1 && name[0] == '/':
+			if longFilenameTable == nil {
+				return nil, errors.New("ar: long filename reference found before filename table")
+			}
+
+			// A long filename is stored as "/" followed by a
+			// base-10 offset in the filename table.
+			offset, err := strconv.ParseUint(name[1:], 10, 64)
+			if err != nil {
+				return nil, errors.New("ar: failed to parse filename offset: " + err.Error())
+			}
+			if offset > uint64((^uint(0))>>1) {
+				return nil, errors.New("ar: filename offset overflow")
+			}
+
+			if int(offset) > len(longFilenameTable) {
+				return nil, errors.New("ar: filename offset out of bounds")
+			}
+
+			filename := longFilenameTable[offset:]
+			if i := bytes.IndexByte(filename, '/'); i < 0 {
+				return nil, errors.New("ar: unterminated filename in table")
+			} else {
+				filename = filename[:i]
+			}
+
+			name = string(filename)
+
+		default:
+			name = strings.TrimRight(name, "/")
+		}
+
+		ret[name] = contents
+	}
+
+	return ret, nil
+}
diff --git a/src/crypto/fipsmodule/bcm.c b/src/crypto/fipsmodule/bcm.c
new file mode 100644
index 0000000..8a05ea2
--- /dev/null
+++ b/src/crypto/fipsmodule/bcm.c
@@ -0,0 +1,97 @@
+/* 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. */
+
+#include <openssl/base.h>
+#include <openssl/crypto.h>
+#include <openssl/hmac.h>
+
+#include "../internal.h"
+
+#include "aes/aes.c"
+#include "aes/key_wrap.c"
+#include "aes/mode_wrappers.c"
+#include "digest/digest.c"
+#include "digest/digests.c"
+#include "hmac/hmac.c"
+#include "md4/md4.c"
+#include "md5/md5.c"
+#include "sha/sha1-altivec.c"
+#include "sha/sha1.c"
+#include "sha/sha256.c"
+#include "sha/sha512.c"
+
+
+#if defined(BORINGSSL_FIPS)
+static void hexdump(const uint8_t *in, size_t len) {
+  for (size_t i = 0; i < len; i++) {
+    printf("%02x", in[i]);
+  }
+}
+
+/* These functions are removed by delocate.go and references to them are
+ * rewritten to point to the start and end of the module, and the location of
+ * the integrity hash. */
+static void BORINGSSL_bcm_text_dummy_start(void) {}
+static void BORINGSSL_bcm_text_dummy_end(void) {}
+static void BORINGSSL_bcm_text_dummy_hash(void) {}
+
+static void BORINGSSL_bcm_power_on_self_test(void) __attribute__((constructor));
+
+static void BORINGSSL_bcm_power_on_self_test(void) {
+  CRYPTO_library_init();
+
+#if defined(__has_feature)
+#if __has_feature(address_sanitizer)
+  /* Power-on tests cannot run under ASAN because it involves reading the full
+   * .text section, which triggers the global-buffer overflow detection. */
+  return;
+#endif
+#endif
+
+  const uint8_t *const start = (const uint8_t *)BORINGSSL_bcm_text_dummy_start;
+  const uint8_t *const end = (const uint8_t *)BORINGSSL_bcm_text_dummy_end;
+
+  static const uint8_t kHMACKey[32] = {0};
+  uint8_t result[SHA256_DIGEST_LENGTH];
+
+  unsigned result_len;
+  if (!HMAC(EVP_sha256(), kHMACKey, sizeof(kHMACKey), start, end - start,
+            result, &result_len) ||
+      result_len != sizeof(result)) {
+    goto err;
+  }
+
+  const uint8_t *const expected =
+      (const uint8_t *)BORINGSSL_bcm_text_dummy_hash;
+
+  if (OPENSSL_memcmp(expected, result, sizeof(result)) != 0) {
+    printf("FIPS integrity test failed.\nExpected: ");
+    hexdump(expected, sizeof(result));
+    printf("\nCalculated: ");
+    hexdump(result, sizeof(result));
+    printf("\n");
+    goto err;
+  }
+
+  // TODO(fips): KAT tests go here.
+
+  return;
+
+err:
+  for (;;) {
+    exit(1);
+    abort();
+  }
+}
+#endif  /* BORINGSSL_FIPS */
diff --git a/src/crypto/fipsmodule/const.go b/src/crypto/fipsmodule/const.go
new file mode 100644
index 0000000..aec10c7
--- /dev/null
+++ b/src/crypto/fipsmodule/const.go
@@ -0,0 +1,22 @@
+// 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. */
+
+package main
+
+// uninitHashValue is the default hash value that we inject into the module.
+// This value need only be distinct, i.e. so that we can safely
+// search-and-replace it in an object file.
+var uninitHashValue = [32]byte{
+	0x5f, 0x30, 0xd1, 0x80, 0xe7, 0x9e, 0x8f, 0x8f, 0xdf, 0x8b, 0x93, 0xd4, 0x96, 0x36, 0x30, 0xcc, 0x30, 0xea, 0x38, 0x0f, 0x75, 0x56, 0x9a, 0x1b, 0x23, 0x2f, 0x7c, 0x79, 0xff, 0x1b, 0x2b, 0xca,
+}
diff --git a/src/crypto/fipsmodule/delocate.go b/src/crypto/fipsmodule/delocate.go
new file mode 100644
index 0000000..d8b5fb3
--- /dev/null
+++ b/src/crypto/fipsmodule/delocate.go
@@ -0,0 +1,473 @@
+// 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. */
+
+// delocate performs several transformations of textual assembly code. See
+// FIPS.md in this directory for an overview.
+package main
+
+import (
+	"bufio"
+	"bytes"
+	"flag"
+	"fmt"
+	"os"
+	"path/filepath"
+	"sort"
+	"strconv"
+	"strings"
+	"unicode/utf8"
+)
+
+func main() {
+	// The .a file, if given, is expected to be an archive of textual
+	// assembly sources. That's odd, but CMake really wants to create
+	// archive files so it's the only way that we can make it work.
+	arInput := flag.String("a", "", "Path to a .a file containing assembly sources")
+
+	outFile := flag.String("o", "", "Path to output assembly")
+	asmFiles := flag.String("as", "", "Comma separated list of assembly inputs")
+
+	flag.Parse()
+
+	var lines []string
+	var err error
+	if len(*arInput) > 0 {
+		if lines, err = arLines(lines, *arInput); err != nil {
+			panic(err)
+		}
+	}
+
+	asPaths := strings.Split(*asmFiles, ",")
+	for i, path := range asPaths {
+		if len(path) == 0 {
+			continue
+		}
+
+		if lines, err = asLines(lines, path, i); err != nil {
+			panic(err)
+		}
+	}
+
+	symbols := definedSymbols(lines)
+	lines = transform(lines, symbols)
+
+	out, err := os.OpenFile(*outFile, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644)
+	if err != nil {
+		panic(err)
+	}
+	defer out.Close()
+
+	for _, line := range lines {
+		out.WriteString(line)
+		out.WriteString("\n")
+	}
+}
+
+// isSymbolDef returns detects whether line contains a (non-local) symbol
+// definition. If so, it returns the symbol and true. Otherwise it returns ""
+// and false.
+func isSymbolDef(line string) (string, bool) {
+	line = strings.TrimSpace(line)
+
+	if len(line) > 0 && line[len(line)-1] == ':' && line[0] != '.' {
+		symbol := line[:len(line)-1]
+		if validSymbolName(symbol) {
+			return symbol, true
+		}
+	}
+
+	return "", false
+}
+
+// definedSymbols finds all (non-local) symbols from lines and returns a map
+// from symbol name to whether or not that symbol is global.
+func definedSymbols(lines []string) map[string]bool {
+	globalSymbols := make(map[string]struct{})
+	symbols := make(map[string]bool)
+
+	for _, line := range lines {
+		if len(line) == 0 {
+			continue
+		}
+
+		if symbol, ok := isSymbolDef(line); ok {
+			_, isGlobal := globalSymbols[symbol]
+			symbols[symbol] = isGlobal
+		}
+
+		parts := strings.Fields(strings.TrimSpace(line))
+		if parts[0] == ".globl" {
+			globalSymbols[parts[1]] = struct{}{}
+		}
+	}
+
+	return symbols
+}
+
+func referencesIA32CapDirectly(line string) bool {
+	const symbol = "OPENSSL_ia32cap_P"
+	i := strings.Index(line, symbol)
+	if i < 0 {
+		return false
+	}
+	i += len(symbol)
+	return i == len(line) || line[i] == '+' || line[i] == '('
+}
+
+// transform performs a number of transformations on the given assembly code.
+// See FIPS.md in the current directory for an overview.
+func transform(lines []string, symbols map[string]bool) (ret []string) {
+	ret = append(ret, ".text", "BORINGSSL_bcm_text_start:")
+
+	// redirectors maps from out-call symbol name to the name of a
+	// redirector function for that symbol.
+	redirectors := make(map[string]string)
+
+	// ia32capAddrNeeded is true iff OPENSSL_ia32cap_addr has been
+	// referenced and thus needs to be emitted outside the module.
+	ia32capAddrNeeded := false
+
+	// extractedText contains lines that have been extracted from the
+	// assembly and need to be moved outside of the module. (This is used
+	// for the .init_array section that specifies constructors.)
+	var extractedText []string
+	extractingText := false
+
+	// bssAccessorsNeeded contains the names of BSS symbols for which
+	// accessor functions need to be emitted outside of the module.
+	var bssAccessorsNeeded []string
+
+	for lineNo, line := range lines {
+		if referencesIA32CapDirectly(line) {
+			panic("reference to OPENSSL_ia32cap_P needs to be changed to indirect via OPENSSL_ia32cap_addr")
+		}
+
+		if strings.Contains(line, "OPENSSL_ia32cap_addr(%rip)") {
+			ia32capAddrNeeded = true
+		}
+
+		parts := strings.Fields(strings.TrimSpace(line))
+
+		if len(parts) == 0 {
+			ret = append(ret, line)
+			continue
+		}
+
+		switch parts[0] {
+		case "call", "callq", "jmp", "jne", "jb", "jz", "jnz", "ja":
+			target := parts[1]
+			// indirect via register or local label
+			if strings.HasPrefix(target, "*") || strings.HasPrefix(target, ".L") {
+				ret = append(ret, line)
+				continue
+			}
+
+			if isGlobal, ok := symbols[target]; ok {
+				newTarget := target
+				if isGlobal {
+					newTarget = localTargetName(target)
+				}
+				ret = append(ret, fmt.Sprintf("\t%s %s", parts[0], newTarget))
+				continue
+			}
+
+			redirectorName := "bcm_redirector_" + target
+
+			if strings.HasSuffix(target, "@PLT") {
+				withoutPLT := target[:len(target)-4]
+				if isGlobal, ok := symbols[withoutPLT]; ok {
+					newTarget := withoutPLT
+					if isGlobal {
+						newTarget = localTargetName(withoutPLT)
+					}
+					ret = append(ret, fmt.Sprintf("\t%s %s", parts[0], newTarget))
+					continue
+				}
+
+				redirectorName = redirectorName[:len(redirectorName)-4]
+			}
+
+			ret = append(ret, fmt.Sprintf("\t%s %s", parts[0], redirectorName))
+			redirectors[redirectorName] = target
+			continue
+
+		case "leaq":
+			if strings.Contains(line, "BORINGSSL_bcm_text_dummy_") {
+				line = strings.Replace(line, "BORINGSSL_bcm_text_dummy_", "BORINGSSL_bcm_text_", -1)
+			}
+
+			target := strings.SplitN(parts[1], ",", 2)[0]
+			if strings.HasSuffix(target, "(%rip)") {
+				target = target[:len(target)-6]
+				if isGlobal := symbols[target]; isGlobal {
+					line = strings.Replace(line, target, localTargetName(target), 1)
+				}
+			}
+
+			ret = append(ret, line)
+			continue
+
+		case ".file":
+			// Do not reorder .file directives. These define
+			// numbered files which are referenced by other debug
+			// directives which may not be reordered.
+			ret = append(ret, line)
+			continue
+
+		case ".comm":
+			p := strings.Split(parts[1], ",")
+			name := p[0]
+			bssAccessorsNeeded = append(bssAccessorsNeeded, name)
+			symbols[accessorName(name)] = false
+			ret = append(ret, line)
+
+		case ".section":
+			extractingText = false
+
+			p := strings.Split(parts[1], ",")
+			section := p[0]
+
+			if section == ".rodata" || section == ".text.startup" || strings.HasPrefix(section, ".rodata.") {
+				// Move .rodata to .text so it may be accessed
+				// without a relocation. GCC with
+				// -fmerge-constants will place strings into
+				// separate sections, so we move all sections
+				// named like .rodata. Also move .text.startup
+				// so the self-test function is also in the
+				// module.
+				ret = append(ret, ".text  # "+section)
+				break
+			}
+
+			switch section {
+			case ".data", ".data.rel.ro.local":
+				panic(fmt.Sprintf("bad section %q on line %d", parts[1], lineNo+1))
+
+			case ".init_array":
+				// init_array contains function pointers to
+				// constructor functions. Since these must be
+				// relocated, this section is moved to the end
+				// of the file.
+				extractedText = append(extractedText, line)
+				extractingText = true
+
+			default:
+				ret = append(ret, line)
+			}
+
+		case ".text":
+			extractingText = false
+			fallthrough
+
+		default:
+			if extractingText {
+				extractedText = append(extractedText, line)
+				continue
+			}
+
+			if symbol, ok := isSymbolDef(line); ok {
+				if isGlobal := symbols[symbol]; isGlobal {
+					ret = append(ret, localTargetName(symbol)+":")
+				}
+			}
+
+			ret = append(ret, line)
+		}
+	}
+
+	ret = append(ret, ".text")
+	ret = append(ret, "BORINGSSL_bcm_text_end:")
+
+	// Emit redirector functions. Each is a single JMP instruction.
+	var redirectorNames []string
+	for name := range redirectors {
+		redirectorNames = append(redirectorNames, name)
+	}
+	sort.Strings(redirectorNames)
+
+	for _, name := range redirectorNames {
+		ret = append(ret, ".type "+name+", @function")
+		ret = append(ret, name+":")
+		ret = append(ret, "\tjmp "+redirectors[name])
+	}
+
+	// Emit BSS accessor functions. Each is a single LEA followed by RET.
+	for _, name := range bssAccessorsNeeded {
+		funcName := accessorName(name)
+		ret = append(ret, ".type "+funcName+", @function")
+		ret = append(ret, funcName+":")
+		ret = append(ret, "\tleaq "+name+"(%rip), %rax")
+		ret = append(ret, "\tret")
+	}
+
+	// Emit an indirect reference to OPENSSL_ia32cap_P.
+	if ia32capAddrNeeded {
+		ret = append(ret, ".extern OPENSSL_ia32cap_P")
+		ret = append(ret, ".type OPENSSL_ia32cap_addr,@object")
+		ret = append(ret, ".size OPENSSL_ia32cap_addr,8")
+		ret = append(ret, "OPENSSL_ia32cap_addr:")
+		ret = append(ret, "\t.quad OPENSSL_ia32cap_P")
+	}
+
+	// Emit an array for storing the module hash.
+	ret = append(ret, ".type BORINGSSL_bcm_text_hash,@object")
+	ret = append(ret, ".size OPENSSL_ia32cap_addr,32")
+	ret = append(ret, "BORINGSSL_bcm_text_hash:")
+	for _, b := range uninitHashValue {
+		ret = append(ret, ".byte 0x"+strconv.FormatUint(uint64(b), 16))
+	}
+
+	ret = append(ret, extractedText...)
+
+	return ret
+}
+
+// accessorName returns the name of the accessor function for a BSS symbol
+// named name.
+func accessorName(name string) string {
+	return name + "_bss_get"
+}
+
+// localTargetName returns the name of the local target label for a global
+// symbol named name.
+func localTargetName(name string) string {
+	return ".L" + name + "_local_target"
+}
+
+// asLines appends the contents of path to lines. Local symbols are renamed
+// using uniqueId to avoid collisions.
+func asLines(lines []string, path string, uniqueId int) ([]string, error) {
+	basename := symbolRuneOrUnderscore(filepath.Base(path))
+
+	asFile, err := os.Open(path)
+	if err != nil {
+		return nil, err
+	}
+	defer asFile.Close()
+
+	var contents []string
+
+	// localSymbols maps from the symbol name used in the input, to a
+	// unique symbol name.
+	localSymbols := make(map[string]string)
+
+	scanner := bufio.NewScanner(asFile)
+	for scanner.Scan() {
+		line := scanner.Text()
+		trimmed := strings.TrimSpace(line)
+		if strings.HasPrefix(trimmed, ".L") && strings.HasSuffix(trimmed, ":") {
+			symbol := trimmed[:len(trimmed)-1]
+			mappedSymbol := fmt.Sprintf(".L%s_%d_%s", basename, uniqueId, symbol[2:])
+			localSymbols[symbol] = mappedSymbol
+			contents = append(contents, mappedSymbol+":")
+			continue
+		}
+
+		contents = append(contents, scanner.Text())
+	}
+	if err := scanner.Err(); err != nil {
+		return nil, err
+	}
+
+	for _, line := range contents {
+		for symbol, mappedSymbol := range localSymbols {
+			for i := strings.Index(line, symbol); i >= 0; i = strings.Index(line[i:], symbol) {
+				before := ' '
+				if i > 0 {
+					before, _ = utf8.DecodeLastRuneInString(line[:i])
+				}
+
+				after, _ := utf8.DecodeRuneInString(line[i+len(symbol):])
+
+				if !symbolRune(before) && !symbolRune(after) {
+					line = strings.Replace(line, symbol, mappedSymbol, 1)
+					i += len(mappedSymbol)
+				} else {
+					i += len(symbol)
+				}
+			}
+		}
+
+		lines = append(lines, line)
+	}
+
+	return lines, nil
+}
+
+func arLines(lines []string, arPath string) ([]string, error) {
+	arFile, err := os.Open(arPath)
+	if err != nil {
+		return nil, err
+	}
+	defer arFile.Close()
+
+	ar, err := ParseAR(arFile)
+	if err != nil {
+		return nil, err
+	}
+
+	if len(ar) != 1 {
+		return nil, fmt.Errorf("expected one file in archive, but found %d", len(ar))
+	}
+
+	for _, contents := range ar {
+		scanner := bufio.NewScanner(bytes.NewBuffer(contents))
+		for scanner.Scan() {
+			lines = append(lines, scanner.Text())
+		}
+		if err := scanner.Err(); err != nil {
+			return nil, err
+		}
+	}
+
+	return lines, nil
+}
+
+// validSymbolName returns true if s is a valid (non-local) name for a symbol.
+func validSymbolName(s string) bool {
+	if len(s) == 0 {
+		return false
+	}
+
+	r, n := utf8.DecodeRuneInString(s)
+	// symbols don't start with a digit.
+	if r == utf8.RuneError || !symbolRune(r) || ('0' <= s[0] && s[0] <= '9') {
+		return false
+	}
+
+	return strings.IndexFunc(s[n:], func(r rune) bool {
+		return !symbolRune(r)
+	}) == -1
+}
+
+// symbolRune returns true if r is valid in a symbol name.
+func symbolRune(r rune) bool {
+	return (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') || (r >= '0' && r <= '9') || r == '$' || r == '_'
+}
+
+// symbolRuneOrUnderscore maps s where runes valid in a symbol name map to
+// themselves and all other runs map to underscore.
+func symbolRuneOrUnderscore(s string) string {
+	runes := make([]rune, 0, len(s))
+
+	for _, r := range s {
+		if symbolRune(r) {
+			runes = append(runes, r)
+		} else {
+			runes = append(runes, '_')
+		}
+	}
+
+	return string(runes)
+}
diff --git a/src/crypto/fipsmodule/delocate.h b/src/crypto/fipsmodule/delocate.h
new file mode 100644
index 0000000..676073c
--- /dev/null
+++ b/src/crypto/fipsmodule/delocate.h
@@ -0,0 +1,66 @@
+/* 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_FIPSMODULE_DELOCATE_H
+#define OPENSSL_HEADER_FIPSMODULE_DELOCATE_H
+
+#include <openssl/base.h>
+
+#include "../internal.h"
+
+
+#if defined(BORINGSSL_FIPS)
+#define DEFINE_BSS_GET(type, name)            \
+  static type name __attribute__((used)); \
+  type *name##_bss_get(void);
+#else
+#define DEFINE_BSS_GET(type, name) \
+  static type name;            \
+  static type *name##_bss_get(void) { return &name; }
+#endif
+
+/* DEFINE_METHOD_FUNCTION defines a function named |name| which returns a
+ * method table of type const |type|*. In FIPS mode, to avoid rel.ro data, it
+ * is split into a CRYPTO_once_t-guarded initializer in the module and
+ * unhashed, non-module accessor functions to space reserved in the BSS. The
+ * method table is initialized by a caller-supplied function which takes a
+ * parameter named |out| of type |type|*. The caller should follow the macro
+ * invocation with the body of this function:
+ *
+ *     DEFINE_METHOD_FUNCTION(EVP_MD, EVP_md4) {
+ *       out->type = NID_md4;
+ *       out->md_size = MD4_DIGEST_LENGTH;
+ *       out->flags = 0;
+ *       out->init = md4_init;
+ *       out->update = md4_update;
+ *       out->final = md4_final;
+ *       out->block_size = 64;
+ *       out->ctx_size = sizeof(MD4_CTX);
+ *     }
+ *
+ * This mechanism does not use a static initializer because their execution
+ * order is undefined. See FIPS.md for more details. */
+#define DEFINE_METHOD_FUNCTION(type, name)                                    \
+  DEFINE_BSS_GET(type, name##_storage)                                        \
+  DEFINE_BSS_GET(CRYPTO_once_t, name##_once)                                  \
+  static void name##_do_init(type *out);                                      \
+  static void name##_init(void) { name##_do_init(name##_storage_bss_get()); } \
+  const type *name(void) {                                                    \
+    CRYPTO_once(name##_once_bss_get(), name##_init);                          \
+    return name##_storage_bss_get();                                          \
+  }                                                                           \
+  static void name##_do_init(type *out)
+
+
+#endif /* OPENSSL_HEADER_FIPSMODULE_DELOCATE_H */
diff --git a/src/crypto/digest/digest.c b/src/crypto/fipsmodule/digest/digest.c
similarity index 99%
rename from src/crypto/digest/digest.c
rename to src/crypto/fipsmodule/digest/digest.c
index 9c9962b..00e6d4b 100644
--- a/src/crypto/digest/digest.c
+++ b/src/crypto/fipsmodule/digest/digest.c
@@ -63,7 +63,7 @@
 #include <openssl/mem.h>
 
 #include "internal.h"
-#include "../internal.h"
+#include "../../internal.h"
 
 
 int EVP_MD_type(const EVP_MD *md) { return md->type; }
diff --git a/src/crypto/fipsmodule/digest/digests.c b/src/crypto/fipsmodule/digest/digests.c
new file mode 100644
index 0000000..f2fa349
--- /dev/null
+++ b/src/crypto/fipsmodule/digest/digests.c
@@ -0,0 +1,280 @@
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to.  The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * 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 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 acknowledgement:
+ *    "This product includes cryptographic software written by
+ *     Eric Young (eay@cryptsoft.com)"
+ *    The word 'cryptographic' can be left out if the rouines from the library
+ *    being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ *    the apps directory (application code) you must include an acknowledgement:
+ *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS 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 AUTHOR OR 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.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed.  i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.] */
+
+#include <openssl/digest.h>
+
+#include <assert.h>
+#include <string.h>
+
+#include <openssl/md4.h>
+#include <openssl/md5.h>
+#include <openssl/nid.h>
+#include <openssl/sha.h>
+
+#include "internal.h"
+#include "../delocate.h"
+#include "../../internal.h"
+
+#if defined(NDEBUG)
+#define CHECK(x) (void) (x)
+#else
+#define CHECK(x) assert(x)
+#endif
+
+
+static void md4_init(EVP_MD_CTX *ctx) {
+  CHECK(MD4_Init(ctx->md_data));
+}
+
+static void md4_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
+  CHECK(MD4_Update(ctx->md_data, data, count));
+}
+
+static void md4_final(EVP_MD_CTX *ctx, uint8_t *out) {
+  CHECK(MD4_Final(out, ctx->md_data));
+}
+
+DEFINE_METHOD_FUNCTION(EVP_MD, EVP_md4) {
+  out->type = NID_md4;
+  out->md_size = MD4_DIGEST_LENGTH;
+  out->flags = 0;
+  out->init = md4_init;
+  out->update = md4_update;
+  out->final = md4_final;
+  out->block_size = 64;
+  out->ctx_size = sizeof(MD4_CTX);
+}
+
+
+static void md5_init(EVP_MD_CTX *ctx) {
+  CHECK(MD5_Init(ctx->md_data));
+}
+
+static void md5_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
+  CHECK(MD5_Update(ctx->md_data, data, count));
+}
+
+static void md5_final(EVP_MD_CTX *ctx, uint8_t *out) {
+  CHECK(MD5_Final(out, ctx->md_data));
+}
+
+DEFINE_METHOD_FUNCTION(EVP_MD, EVP_md5) {
+  out->type = NID_md5;
+  out->md_size = MD5_DIGEST_LENGTH;
+  out->flags = 0;
+  out->init = md5_init;
+  out->update = md5_update;
+  out->final = md5_final;
+  out->block_size = 64;
+  out->ctx_size = sizeof(MD5_CTX);
+}
+
+
+static void sha1_init(EVP_MD_CTX *ctx) {
+  CHECK(SHA1_Init(ctx->md_data));
+}
+
+static void sha1_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
+  CHECK(SHA1_Update(ctx->md_data, data, count));
+}
+
+static void sha1_final(EVP_MD_CTX *ctx, uint8_t *md) {
+  CHECK(SHA1_Final(md, ctx->md_data));
+}
+
+DEFINE_METHOD_FUNCTION(EVP_MD, EVP_sha1) {
+  out->type = NID_sha1;
+  out->md_size = SHA_DIGEST_LENGTH;
+  out->flags = 0;
+  out->init = sha1_init;
+  out->update = sha1_update;
+  out->final = sha1_final;
+  out->block_size = 64;
+  out->ctx_size = sizeof(SHA_CTX);
+}
+
+
+static void sha224_init(EVP_MD_CTX *ctx) {
+  CHECK(SHA224_Init(ctx->md_data));
+}
+
+static void sha224_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
+  CHECK(SHA224_Update(ctx->md_data, data, count));
+}
+
+static void sha224_final(EVP_MD_CTX *ctx, uint8_t *md) {
+  CHECK(SHA224_Final(md, ctx->md_data));
+}
+
+DEFINE_METHOD_FUNCTION(EVP_MD, EVP_sha224) {
+  out->type = NID_sha224;
+  out->md_size = SHA224_DIGEST_LENGTH;
+  out->flags = 0;
+  out->init = sha224_init;
+  out->update = sha224_update;
+  out->final = sha224_final;
+  out->block_size = 64;
+  out->ctx_size = sizeof(SHA256_CTX);
+}
+
+
+static void sha256_init(EVP_MD_CTX *ctx) {
+  CHECK(SHA256_Init(ctx->md_data));
+}
+
+static void sha256_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
+  CHECK(SHA256_Update(ctx->md_data, data, count));
+}
+
+static void sha256_final(EVP_MD_CTX *ctx, uint8_t *md) {
+  CHECK(SHA256_Final(md, ctx->md_data));
+}
+
+DEFINE_METHOD_FUNCTION(EVP_MD, EVP_sha256) {
+  out->type = NID_sha256;
+  out->md_size = SHA256_DIGEST_LENGTH;
+  out->flags = 0;
+  out->init = sha256_init;
+  out->update = sha256_update;
+  out->final = sha256_final;
+  out->block_size = 64;
+  out->ctx_size = sizeof(SHA256_CTX);
+}
+
+
+static void sha384_init(EVP_MD_CTX *ctx) {
+  CHECK(SHA384_Init(ctx->md_data));
+}
+
+static void sha384_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
+  CHECK(SHA384_Update(ctx->md_data, data, count));
+}
+
+static void sha384_final(EVP_MD_CTX *ctx, uint8_t *md) {
+  CHECK(SHA384_Final(md, ctx->md_data));
+}
+
+DEFINE_METHOD_FUNCTION(EVP_MD, EVP_sha384) {
+  out->type = NID_sha384;
+  out->md_size = SHA384_DIGEST_LENGTH;
+  out->flags = 0;
+  out->init = sha384_init;
+  out->update = sha384_update;
+  out->final = sha384_final;
+  out->block_size = 128;
+  out->ctx_size = sizeof(SHA512_CTX);
+}
+
+
+static void sha512_init(EVP_MD_CTX *ctx) {
+  CHECK(SHA512_Init(ctx->md_data));
+}
+
+static void sha512_update(EVP_MD_CTX *ctx, const void *data, size_t count) {
+  CHECK(SHA512_Update(ctx->md_data, data, count));
+}
+
+static void sha512_final(EVP_MD_CTX *ctx, uint8_t *md) {
+  CHECK(SHA512_Final(md, ctx->md_data));
+}
+
+DEFINE_METHOD_FUNCTION(EVP_MD, EVP_sha512) {
+  out->type = NID_sha512;
+  out->md_size = SHA512_DIGEST_LENGTH;
+  out->flags = 0;
+  out->init = sha512_init;
+  out->update = sha512_update;
+  out->final = sha512_final;
+  out->block_size = 128;
+  out->ctx_size = sizeof(SHA512_CTX);
+}
+
+
+typedef struct {
+  MD5_CTX md5;
+  SHA_CTX sha1;
+} MD5_SHA1_CTX;
+
+static void md5_sha1_init(EVP_MD_CTX *md_ctx) {
+  MD5_SHA1_CTX *ctx = md_ctx->md_data;
+  CHECK(MD5_Init(&ctx->md5) && SHA1_Init(&ctx->sha1));
+}
+
+static void md5_sha1_update(EVP_MD_CTX *md_ctx, const void *data,
+                            size_t count) {
+  MD5_SHA1_CTX *ctx = md_ctx->md_data;
+  CHECK(MD5_Update(&ctx->md5, data, count) &&
+        SHA1_Update(&ctx->sha1, data, count));
+}
+
+static void md5_sha1_final(EVP_MD_CTX *md_ctx, uint8_t *out) {
+  MD5_SHA1_CTX *ctx = md_ctx->md_data;
+  CHECK(MD5_Final(out, &ctx->md5) &&
+        SHA1_Final(out + MD5_DIGEST_LENGTH, &ctx->sha1));
+}
+
+DEFINE_METHOD_FUNCTION(EVP_MD, EVP_md5_sha1) {
+  out->type = NID_md5_sha1;
+  out->md_size = MD5_DIGEST_LENGTH + SHA_DIGEST_LENGTH;
+  out->flags = 0;
+  out->init = md5_sha1_init;
+  out->update = md5_sha1_update;
+  out->final = md5_sha1_final;
+  out->block_size = 64;
+  out->ctx_size = sizeof(MD5_SHA1_CTX);
+}
+
+#undef CHECK
diff --git a/src/crypto/digest/internal.h b/src/crypto/fipsmodule/digest/internal.h
similarity index 98%
rename from src/crypto/digest/internal.h
rename to src/crypto/fipsmodule/digest/internal.h
index 9f83bcb..e3d812a 100644
--- a/src/crypto/digest/internal.h
+++ b/src/crypto/fipsmodule/digest/internal.h
@@ -104,8 +104,6 @@
   EVP_PKEY_CTX* (*dup) (EVP_PKEY_CTX *pctx);
 };
 
-const EVP_MD *EVP_parse_digest_algorithm(CBS *cbs);
-
 
 #if defined(__cplusplus)
 }  /* extern C */
diff --git a/src/crypto/digest/md32_common.h b/src/crypto/fipsmodule/digest/md32_common.h
similarity index 98%
rename from src/crypto/digest/md32_common.h
rename to src/crypto/fipsmodule/digest/md32_common.h
index 45fe939..7371629 100644
--- a/src/crypto/digest/md32_common.h
+++ b/src/crypto/fipsmodule/digest/md32_common.h
@@ -46,14 +46,11 @@
  * OF THE POSSIBILITY OF SUCH DAMAGE.
  * ==================================================================== */
 
-#ifndef OPENSSL_HEADER_MD32_COMMON_H
-#define OPENSSL_HEADER_MD32_COMMON_H
-
 #include <openssl/base.h>
 
 #include <assert.h>
 
-#include "../internal.h"
+#include "../../internal.h"
 
 #if defined(__cplusplus)
 extern "C" {
@@ -270,5 +267,3 @@
 #if defined(__cplusplus)
 } /* extern C */
 #endif
-
-#endif /* OPENSSL_HEADER_MD32_COMMON_H */
diff --git a/src/crypto/hmac/hmac.c b/src/crypto/fipsmodule/hmac/hmac.c
similarity index 99%
rename from src/crypto/hmac/hmac.c
rename to src/crypto/fipsmodule/hmac/hmac.c
index 931f7a1..3292350 100644
--- a/src/crypto/hmac/hmac.c
+++ b/src/crypto/fipsmodule/hmac/hmac.c
@@ -62,7 +62,7 @@
 #include <openssl/digest.h>
 #include <openssl/mem.h>
 
-#include "../internal.h"
+#include "../../internal.h"
 
 
 uint8_t *HMAC(const EVP_MD *evp_md, const void *key, size_t key_len,
diff --git a/src/crypto/fipsmodule/inject-hash.go b/src/crypto/fipsmodule/inject-hash.go
new file mode 100644
index 0000000..7f2c9c9
--- /dev/null
+++ b/src/crypto/fipsmodule/inject-hash.go
@@ -0,0 +1,159 @@
+// 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. */
+
+// inject-hash parses an archive containing a file object file. It finds a FIPS
+// module inside that object, calculates its hash and replaces the default hash
+// value in the object with the calculated value.
+package main
+
+import (
+	"bytes"
+	"crypto/hmac"
+	"crypto/sha256"
+	"debug/elf"
+	"errors"
+	"flag"
+	"fmt"
+	"io"
+	"io/ioutil"
+	"os"
+)
+
+func do(outPath, arInput string) error {
+	arFile, err := os.Open(arInput)
+	if err != nil {
+		return err
+	}
+	defer arFile.Close()
+
+	ar, err := ParseAR(arFile)
+	if err != nil {
+		return err
+	}
+
+	if len(ar) != 1 {
+		return fmt.Errorf("expected one file in archive, but found %d", len(ar))
+	}
+
+	var objectBytes []byte
+	for _, contents := range ar {
+		objectBytes = contents
+	}
+
+	object, err := elf.NewFile(bytes.NewReader(objectBytes))
+	if err != nil {
+		return errors.New("failed to parse object: " + err.Error())
+	}
+
+	// Find the .text section.
+
+	var textSection *elf.Section
+	var textSectionIndex elf.SectionIndex
+	for i, section := range object.Sections {
+		if section.Name == ".text" {
+			textSectionIndex = elf.SectionIndex(i)
+			textSection = section
+			break
+		}
+	}
+
+	if textSection == nil {
+		return errors.New("failed to find .text section in object")
+	}
+
+	// Find the starting and ending symbols for the module.
+
+	var startSeen, endSeen bool
+	var start, end uint64
+
+	symbols, err := object.Symbols()
+	if err != nil {
+		return errors.New("failed to parse symbols: " + err.Error())
+	}
+
+	for _, symbol := range symbols {
+		if symbol.Section != textSectionIndex {
+			continue
+		}
+
+		switch symbol.Name {
+		case "BORINGSSL_bcm_text_start":
+			if startSeen {
+				return errors.New("duplicate start symbol found")
+			}
+			startSeen = true
+			start = symbol.Value
+		case "BORINGSSL_bcm_text_end":
+			if endSeen {
+				return errors.New("duplicate end symbol found")
+			}
+			endSeen = true
+			end = symbol.Value
+		default:
+			continue
+		}
+	}
+
+	if !startSeen || !endSeen {
+		return errors.New("could not find module boundaries in object")
+	}
+
+	if max := textSection.Size; start > max || start > end || end > max {
+		return fmt.Errorf("invalid module boundaries: start: %x, end: %x, max: %x", start, end, max)
+	}
+
+	// Extract the module from the .text section and hash it.
+
+	text := textSection.Open()
+	if _, err := text.Seek(int64(start), 0); err != nil {
+		return errors.New("failed to seek to module start in .text: " + err.Error())
+	}
+	moduleText := make([]byte, end-start)
+	if _, err := io.ReadFull(text, moduleText); err != nil {
+		return errors.New("failed to read .text: " + err.Error())
+	}
+
+	var zeroKey [32]byte
+	mac := hmac.New(sha256.New, zeroKey[:])
+	mac.Write(moduleText)
+	calculated := mac.Sum(nil)
+
+	// Replace the default hash value in the object with the calculated
+	// value and write it out.
+
+	offset := bytes.Index(objectBytes, uninitHashValue[:])
+	if offset < 0 {
+		return errors.New("did not find uninitialised hash value in object file")
+	}
+
+	if bytes.Index(objectBytes[offset+1:], uninitHashValue[:]) >= 0 {
+		return errors.New("found two occurrences of uninitialised hash value in object file")
+	}
+
+	copy(objectBytes[offset:], calculated)
+
+	return ioutil.WriteFile(outPath, objectBytes, 0644)
+}
+
+func main() {
+	arInput := flag.String("in", "", "Path to a .a file")
+	outPath := flag.String("o", "", "Path to output object")
+
+	flag.Parse()
+
+	if err := do(*outPath, *arInput); err != nil {
+		fmt.Fprintf(os.Stderr, "%s\n", err)
+		os.Exit(1)
+	}
+}
diff --git a/src/crypto/fipsmodule/intcheck1.png b/src/crypto/fipsmodule/intcheck1.png
new file mode 100644
index 0000000..2fec4ea
--- /dev/null
+++ b/src/crypto/fipsmodule/intcheck1.png
Binary files differ
diff --git a/src/crypto/fipsmodule/intcheck2.png b/src/crypto/fipsmodule/intcheck2.png
new file mode 100644
index 0000000..3e66267
--- /dev/null
+++ b/src/crypto/fipsmodule/intcheck2.png
Binary files differ
diff --git a/src/crypto/fipsmodule/intcheck3.png b/src/crypto/fipsmodule/intcheck3.png
new file mode 100644
index 0000000..9a22d33
--- /dev/null
+++ b/src/crypto/fipsmodule/intcheck3.png
Binary files differ
diff --git a/src/crypto/fipsmodule/is_fips.c b/src/crypto/fipsmodule/is_fips.c
new file mode 100644
index 0000000..c23e621
--- /dev/null
+++ b/src/crypto/fipsmodule/is_fips.c
@@ -0,0 +1,27 @@
+/* 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. */
+
+#include <openssl/crypto.h>
+
+
+/* This file exists in order to give the fipsmodule target, in non-FIPS mode,
+ * something to compile. */
+
+int FIPS_mode(void) {
+#if defined(BORINGSSL_FIPS)
+  return 1;
+#else
+  return 0;
+#endif
+}
diff --git a/src/crypto/md4/md4.c b/src/crypto/fipsmodule/md4/md4.c
similarity index 95%
rename from src/crypto/md4/md4.c
rename to src/crypto/fipsmodule/md4/md4.c
index 0046c21..3028c8b 100644
--- a/src/crypto/md4/md4.c
+++ b/src/crypto/fipsmodule/md4/md4.c
@@ -59,7 +59,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include "../internal.h"
+#include "../../internal.h"
 
 
 uint8_t *MD4(const uint8_t *data, size_t len, uint8_t *out) {
@@ -234,3 +234,21 @@
     D = state[3] += D;
   }
 }
+
+#undef DATA_ORDER_IS_LITTLE_ENDIAN
+#undef HASH_CTX
+#undef HASH_CBLOCK
+#undef HASH_UPDATE
+#undef HASH_TRANSFORM
+#undef HASH_FINAL
+#undef HASH_MAKE_STRING
+#undef HASH_BLOCK_DATA_ORDER
+#undef F
+#undef G
+#undef H
+#undef ROTATE
+#undef R0
+#undef R1
+#undef R2
+#undef HOST_c2l
+#undef HOST_l2c
diff --git a/src/crypto/md5/asm/md5-586.pl b/src/crypto/fipsmodule/md5/asm/md5-586.pl
similarity index 99%
rename from src/crypto/md5/asm/md5-586.pl
rename to src/crypto/fipsmodule/md5/asm/md5-586.pl
index a032d9b..4ba08ec 100644
--- a/src/crypto/md5/asm/md5-586.pl
+++ b/src/crypto/fipsmodule/md5/asm/md5-586.pl
@@ -8,7 +8,7 @@
 $normal=0;
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
-push(@INC,"${dir}","${dir}../../perlasm");
+push(@INC,"${dir}","${dir}../../../perlasm");
 require "x86asm.pl";
 
 $output=pop;
diff --git a/src/crypto/md5/asm/md5-x86_64.pl b/src/crypto/fipsmodule/md5/asm/md5-x86_64.pl
similarity index 99%
rename from src/crypto/md5/asm/md5-x86_64.pl
rename to src/crypto/fipsmodule/md5/asm/md5-x86_64.pl
index 5ba0c62..568f4f5 100644
--- a/src/crypto/md5/asm/md5-x86_64.pl
+++ b/src/crypto/fipsmodule/md5/asm/md5-x86_64.pl
@@ -117,7 +117,7 @@
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; my $dir=$1; my $xlate;
 ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
-( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
+( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 die "can't locate x86_64-xlate.pl";
 
 open OUT,"| \"$^X\" \"$xlate\" $flavour \"$output\"";
diff --git a/src/crypto/md5/md5.c b/src/crypto/fipsmodule/md5/md5.c
similarity index 96%
rename from src/crypto/md5/md5.c
rename to src/crypto/fipsmodule/md5/md5.c
index adc5957..15a0f53 100644
--- a/src/crypto/md5/md5.c
+++ b/src/crypto/fipsmodule/md5/md5.c
@@ -60,7 +60,7 @@
 
 #include <openssl/mem.h>
 
-#include "../internal.h"
+#include "../../internal.h"
 
 
 uint8_t *MD5(const uint8_t *data, size_t len, uint8_t *out) {
@@ -275,4 +275,25 @@
     D = state[3] += D;
   }
 }
+#undef X
 #endif
+
+#undef DATA_ORDER_IS_LITTLE_ENDIAN
+#undef HASH_CTX
+#undef HASH_CBLOCK
+#undef HASH_UPDATE
+#undef HASH_TRANSFORM
+#undef HASH_FINAL
+#undef HASH_MAKE_STRING
+#undef HASH_BLOCK_DATA_ORDER
+#undef F
+#undef G
+#undef H
+#undef I
+#undef ROTATE
+#undef R0
+#undef R1
+#undef R2
+#undef R3
+#undef HOST_c2l
+#undef HOST_l2c
diff --git a/src/crypto/sha/asm/sha1-586.pl b/src/crypto/fipsmodule/sha/asm/sha1-586.pl
similarity index 99%
rename from src/crypto/sha/asm/sha1-586.pl
rename to src/crypto/fipsmodule/sha/asm/sha1-586.pl
index acf383d..4221e27 100644
--- a/src/crypto/sha/asm/sha1-586.pl
+++ b/src/crypto/fipsmodule/sha/asm/sha1-586.pl
@@ -114,7 +114,7 @@
 # (***)	SHAEXT result
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
-push(@INC,"${dir}","${dir}../../perlasm");
+push(@INC,"${dir}","${dir}../../../perlasm");
 require "x86asm.pl";
 
 $output=pop;
diff --git a/src/crypto/sha/asm/sha1-armv4-large.pl b/src/crypto/fipsmodule/sha/asm/sha1-armv4-large.pl
similarity index 99%
rename from src/crypto/sha/asm/sha1-armv4-large.pl
rename to src/crypto/fipsmodule/sha/asm/sha1-armv4-large.pl
index 4fef524..944248f 100644
--- a/src/crypto/sha/asm/sha1-armv4-large.pl
+++ b/src/crypto/fipsmodule/sha/asm/sha1-armv4-large.pl
@@ -75,7 +75,7 @@
 if ($flavour && $flavour ne "void") {
     $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
     ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
-    ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
+    ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or
     die "can't locate arm-xlate.pl";
 
     open STDOUT,"| \"$^X\" $xlate $flavour $output";
diff --git a/src/crypto/sha/asm/sha1-armv8.pl b/src/crypto/fipsmodule/sha/asm/sha1-armv8.pl
similarity index 98%
rename from src/crypto/sha/asm/sha1-armv8.pl
rename to src/crypto/fipsmodule/sha/asm/sha1-armv8.pl
index 1c4fe4a..dbbb54b 100644
--- a/src/crypto/sha/asm/sha1-armv8.pl
+++ b/src/crypto/fipsmodule/sha/asm/sha1-armv8.pl
@@ -28,7 +28,7 @@
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
-( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
+( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or
 die "can't locate arm-xlate.pl";
 
 open OUT,"| \"$^X\" $xlate $flavour $output";
diff --git a/src/crypto/sha/asm/sha1-x86_64.pl b/src/crypto/fipsmodule/sha/asm/sha1-x86_64.pl
similarity index 99%
rename from src/crypto/sha/asm/sha1-x86_64.pl
rename to src/crypto/fipsmodule/sha/asm/sha1-x86_64.pl
index 9a13f6c..25a1cad 100755
--- a/src/crypto/sha/asm/sha1-x86_64.pl
+++ b/src/crypto/fipsmodule/sha/asm/sha1-x86_64.pl
@@ -92,7 +92,7 @@
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
-( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
+( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 die "can't locate x86_64-xlate.pl";
 
 # In upstream, this is controlled by shelling out to the compiler to check
@@ -236,15 +236,17 @@
 
 $code.=<<___;
 .text
-.extern	OPENSSL_ia32cap_P
+.extern	OPENSSL_ia32cap_addr
 
 .globl	sha1_block_data_order
 .type	sha1_block_data_order,\@function,3
 .align	16
 sha1_block_data_order:
-	mov	OPENSSL_ia32cap_P+0(%rip),%r9d
-	mov	OPENSSL_ia32cap_P+4(%rip),%r8d
-	mov	OPENSSL_ia32cap_P+8(%rip),%r10d
+	lea	OPENSSL_ia32cap_addr(%rip),%r10
+	mov	(%r10),%r10
+	mov	0(%r10),%r9d
+	mov	4(%r10),%r8d
+	mov	8(%r10),%r10d
 	test	\$`1<<9`,%r8d		# check SSSE3 bit
 	jz	.Lialu
 ___
diff --git a/src/crypto/sha/asm/sha256-586.pl b/src/crypto/fipsmodule/sha/asm/sha256-586.pl
similarity index 99%
rename from src/crypto/sha/asm/sha256-586.pl
rename to src/crypto/fipsmodule/sha/asm/sha256-586.pl
index d85004c..834d00f 100644
--- a/src/crypto/sha/asm/sha256-586.pl
+++ b/src/crypto/fipsmodule/sha/asm/sha256-586.pl
@@ -63,7 +63,7 @@
 # (***)	SHAEXT result is 4.1, strangely enough better than 64-bit one;
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
-push(@INC,"${dir}","${dir}../../perlasm");
+push(@INC,"${dir}","${dir}../../../perlasm");
 require "x86asm.pl";
 
 $output=pop;
diff --git a/src/crypto/sha/asm/sha256-armv4.pl b/src/crypto/fipsmodule/sha/asm/sha256-armv4.pl
similarity index 99%
rename from src/crypto/sha/asm/sha256-armv4.pl
rename to src/crypto/fipsmodule/sha/asm/sha256-armv4.pl
index bac7ce8..3eea080 100644
--- a/src/crypto/sha/asm/sha256-armv4.pl
+++ b/src/crypto/fipsmodule/sha/asm/sha256-armv4.pl
@@ -51,7 +51,7 @@
 if ($flavour && $flavour ne "void") {
     $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
     ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
-    ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
+    ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or
     die "can't locate arm-xlate.pl";
 
     open STDOUT,"| \"$^X\" $xlate $flavour $output";
diff --git a/src/crypto/sha/asm/sha512-586.pl b/src/crypto/fipsmodule/sha/asm/sha512-586.pl
similarity index 99%
rename from src/crypto/sha/asm/sha512-586.pl
rename to src/crypto/fipsmodule/sha/asm/sha512-586.pl
index 6d909ed..a757ee7 100644
--- a/src/crypto/sha/asm/sha512-586.pl
+++ b/src/crypto/fipsmodule/sha/asm/sha512-586.pl
@@ -49,7 +49,7 @@
 # cost of increased data cache "footprint" by 1/2KB.
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
-push(@INC,"${dir}","${dir}../../perlasm");
+push(@INC,"${dir}","${dir}../../../perlasm");
 require "x86asm.pl";
 
 $output=pop;
diff --git a/src/crypto/sha/asm/sha512-armv4.pl b/src/crypto/fipsmodule/sha/asm/sha512-armv4.pl
similarity index 99%
rename from src/crypto/sha/asm/sha512-armv4.pl
rename to src/crypto/fipsmodule/sha/asm/sha512-armv4.pl
index 0320c16..fd92f7a 100644
--- a/src/crypto/sha/asm/sha512-armv4.pl
+++ b/src/crypto/fipsmodule/sha/asm/sha512-armv4.pl
@@ -57,7 +57,7 @@
 if ($flavour && $flavour ne "void") {
     $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
     ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
-    ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
+    ( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or
     die "can't locate arm-xlate.pl";
 
     open STDOUT,"| \"$^X\" $xlate $flavour $output";
diff --git a/src/crypto/sha/asm/sha512-armv8.pl b/src/crypto/fipsmodule/sha/asm/sha512-armv8.pl
similarity index 99%
rename from src/crypto/sha/asm/sha512-armv8.pl
rename to src/crypto/fipsmodule/sha/asm/sha512-armv8.pl
index 494e633..b4e558a 100644
--- a/src/crypto/sha/asm/sha512-armv8.pl
+++ b/src/crypto/fipsmodule/sha/asm/sha512-armv8.pl
@@ -34,7 +34,7 @@
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
-( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
+( $xlate="${dir}../../../perlasm/arm-xlate.pl" and -f $xlate) or
 die "can't locate arm-xlate.pl";
 
 open OUT,"| \"$^X\" $xlate $flavour $output";
diff --git a/src/crypto/sha/asm/sha512-x86_64.pl b/src/crypto/fipsmodule/sha/asm/sha512-x86_64.pl
similarity index 99%
rename from src/crypto/sha/asm/sha512-x86_64.pl
rename to src/crypto/fipsmodule/sha/asm/sha512-x86_64.pl
index 5716791..c638595 100755
--- a/src/crypto/sha/asm/sha512-x86_64.pl
+++ b/src/crypto/fipsmodule/sha/asm/sha512-x86_64.pl
@@ -108,7 +108,7 @@
 
 $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
 ( $xlate="${dir}x86_64-xlate.pl" and -f $xlate ) or
-( $xlate="${dir}../../perlasm/x86_64-xlate.pl" and -f $xlate) or
+( $xlate="${dir}../../../perlasm/x86_64-xlate.pl" and -f $xlate) or
 die "can't locate x86_64-xlate.pl";
 
 # In upstream, this is controlled by shelling out to the compiler to check
@@ -249,14 +249,15 @@
 $code=<<___;
 .text
 
-.extern	OPENSSL_ia32cap_P
+.extern	OPENSSL_ia32cap_addr
 .globl	$func
 .type	$func,\@function,3
 .align	16
 $func:
 ___
 $code.=<<___ if ($SZ==4 || $avx);
-	lea	OPENSSL_ia32cap_P(%rip),%r11
+	lea	OPENSSL_ia32cap_addr(%rip),%r11
+	mov	(%r11),%r11
 	mov	0(%r11),%r9d
 	mov	4(%r11),%r10d
 	mov	8(%r11),%r11d
@@ -311,6 +312,7 @@
 	mov	$SZ*5($ctx),$F
 	mov	$SZ*6($ctx),$G
 	mov	$SZ*7($ctx),$H
+
 	jmp	.Lloop
 
 .align	16
diff --git a/src/crypto/sha/sha1-altivec.c b/src/crypto/fipsmodule/sha/sha1-altivec.c
similarity index 98%
rename from src/crypto/sha/sha1-altivec.c
rename to src/crypto/fipsmodule/sha/sha1-altivec.c
index 0b64315..14e2bae 100644
--- a/src/crypto/sha/sha1-altivec.c
+++ b/src/crypto/fipsmodule/sha/sha1-altivec.c
@@ -346,3 +346,16 @@
 }
 
 #endif  /* OPENSSL_PPC64LE */
+
+#undef K_00_19
+#undef K_20_39
+#undef K_40_59
+#undef K_60_79
+#undef F_00_19
+#undef F_20_39
+#undef F_40_59
+#undef F_60_79
+#undef BODY_00_19
+#undef BODY_20_39
+#undef BODY_40_59
+#undef BODY_60_79
diff --git a/src/crypto/sha/sha1.c b/src/crypto/fipsmodule/sha/sha1.c
similarity index 96%
rename from src/crypto/sha/sha1.c
rename to src/crypto/fipsmodule/sha/sha1.c
index 4eb8189..7b44563 100644
--- a/src/crypto/sha/sha1.c
+++ b/src/crypto/fipsmodule/sha/sha1.c
@@ -60,7 +60,7 @@
 
 #include <openssl/mem.h>
 
-#include "../internal.h"
+#include "../../internal.h"
 
 
 #if !defined(OPENSSL_NO_ASM) &&                         \
@@ -82,9 +82,7 @@
 
 uint8_t *SHA1(const uint8_t *data, size_t len, uint8_t *out) {
   SHA_CTX ctx;
-  if (!SHA1_Init(&ctx)) {
-    return NULL;
-  }
+  SHA1_Init(&ctx);
   SHA1_Update(&ctx, data, len);
   SHA1_Final(out, &ctx);
   OPENSSL_cleanse(&ctx, sizeof(ctx));
@@ -347,3 +345,31 @@
   }
 }
 #endif
+
+#undef DATA_ORDER_IS_BIG_ENDIAN
+#undef HASH_CTX
+#undef HASH_CBLOCK
+#undef HASH_MAKE_STRING
+#undef HASH_UPDATE
+#undef HASH_TRANSFORM
+#undef HASH_FINAL
+#undef HASH_BLOCK_DATA_ORDER
+#undef ROTATE
+#undef Xupdate
+#undef K_00_19
+#undef K_20_39
+#undef K_40_59
+#undef K_60_79
+#undef F_00_19
+#undef F_20_39
+#undef F_40_59
+#undef F_60_79
+#undef BODY_00_15
+#undef BODY_16_19
+#undef BODY_20_31
+#undef BODY_32_39
+#undef BODY_40_59
+#undef BODY_60_79
+#undef X
+#undef HOST_c2l
+#undef HOST_l2c
diff --git a/src/crypto/sha/sha256.c b/src/crypto/fipsmodule/sha/sha256.c
similarity index 96%
rename from src/crypto/sha/sha256.c
rename to src/crypto/fipsmodule/sha/sha256.c
index c3bd5ad..cd6becb 100644
--- a/src/crypto/sha/sha256.c
+++ b/src/crypto/fipsmodule/sha/sha256.c
@@ -60,7 +60,7 @@
 
 #include <openssl/mem.h>
 
-#include "../internal.h"
+#include "../../internal.h"
 
 
 #if !defined(OPENSSL_NO_ASM) &&                         \
@@ -314,4 +314,24 @@
   }
 }
 
-#endif /* SHA256_ASM */
+#endif /* !SHA256_ASM */
+
+#undef DATA_ORDER_IS_BIG_ENDIAN
+#undef HASH_CTX
+#undef HASH_CBLOCK
+#undef HASH_MAKE_STRING
+#undef HASH_UPDATE
+#undef HASH_TRANSFORM
+#undef HASH_FINAL
+#undef HASH_BLOCK_DATA_ORDER
+#undef ROTATE
+#undef Sigma0
+#undef Sigma1
+#undef sigma0
+#undef sigma1
+#undef Ch
+#undef Maj
+#undef ROUND_00_15
+#undef ROUND_16_63
+#undef HOST_c2l
+#undef HOST_l2c
diff --git a/src/crypto/sha/sha512.c b/src/crypto/fipsmodule/sha/sha512.c
similarity index 98%
rename from src/crypto/sha/sha512.c
rename to src/crypto/fipsmodule/sha/sha512.c
index e8284f1..6e1f79b 100644
--- a/src/crypto/sha/sha512.c
+++ b/src/crypto/fipsmodule/sha/sha512.c
@@ -60,7 +60,7 @@
 
 #include <openssl/mem.h>
 
-#include "../internal.h"
+#include "../../internal.h"
 
 
 /* IMPLEMENTATION NOTES.
@@ -593,4 +593,18 @@
 
 #endif
 
-#endif /* SHA512_ASM */
+#endif /* !SHA512_ASM */
+
+#undef ROTR
+#undef PULL64
+#undef B
+#undef Sigma0
+#undef Sigma1
+#undef sigma0
+#undef sigma1
+#undef Ch
+#undef Maj
+#undef ROUND_00_15
+#undef ROUND_16_80
+#undef HOST_c2l
+#undef HOST_l2c
diff --git a/src/crypto/hmac/CMakeLists.txt b/src/crypto/hmac_extra/CMakeLists.txt
similarity index 81%
rename from src/crypto/hmac/CMakeLists.txt
rename to src/crypto/hmac_extra/CMakeLists.txt
index 179a53b..045213a 100644
--- a/src/crypto/hmac/CMakeLists.txt
+++ b/src/crypto/hmac_extra/CMakeLists.txt
@@ -1,14 +1,5 @@
 include_directories(../../include)
 
-add_library(
-  hmac
-
-  OBJECT
-
-  hmac.c
-)
-
-
 add_executable(
   hmac_test
 
diff --git a/src/crypto/hmac/hmac_test.cc b/src/crypto/hmac_extra/hmac_test.cc
similarity index 100%
rename from src/crypto/hmac/hmac_test.cc
rename to src/crypto/hmac_extra/hmac_test.cc
diff --git a/src/crypto/hmac/hmac_tests.txt b/src/crypto/hmac_extra/hmac_tests.txt
similarity index 100%
rename from src/crypto/hmac/hmac_tests.txt
rename to src/crypto/hmac_extra/hmac_tests.txt
diff --git a/src/crypto/internal.h b/src/crypto/internal.h
index 7ce99a4..162041f 100644
--- a/src/crypto/internal.h
+++ b/src/crypto/internal.h
@@ -445,7 +445,6 @@
 typedef enum {
   OPENSSL_THREAD_LOCAL_ERR = 0,
   OPENSSL_THREAD_LOCAL_RAND,
-  OPENSSL_THREAD_LOCAL_URANDOM_BUF,
   OPENSSL_THREAD_LOCAL_TEST,
   NUM_OPENSSL_THREAD_LOCALS,
 } thread_local_data_t;
diff --git a/src/crypto/md4/CMakeLists.txt b/src/crypto/md4/CMakeLists.txt
deleted file mode 100644
index 59140a7..0000000
--- a/src/crypto/md4/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-include_directories(../../include)
-
-add_library(
-  md4
-
-  OBJECT
-
-  md4.c
-)
diff --git a/src/crypto/md5/CMakeLists.txt b/src/crypto/md5/CMakeLists.txt
deleted file mode 100644
index a37c47e..0000000
--- a/src/crypto/md5/CMakeLists.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-include_directories(../../include)
-
-if (${ARCH} STREQUAL "x86_64")
-  set(
-    MD5_ARCH_SOURCES
-
-    md5-x86_64.${ASM_EXT}
-  )
-endif()
-
-if (${ARCH} STREQUAL "x86")
-  set(
-    MD5_ARCH_SOURCES
-
-    md5-586.${ASM_EXT}
-  )
-endif()
-
-add_library(
-  md5
-
-  OBJECT
-
-  md5.c
-
-  ${MD5_ARCH_SOURCES}
-)
-
-perlasm(md5-x86_64.${ASM_EXT} asm/md5-x86_64.pl)
-perlasm(md5-586.${ASM_EXT} asm/md5-586.pl)
diff --git a/src/crypto/obj/obj_dat.h b/src/crypto/obj/obj_dat.h
index 4905f0d..5f36d40 100644
--- a/src/crypto/obj/obj_dat.h
+++ b/src/crypto/obj/obj_dat.h
@@ -56,7 +56,7 @@
 
 /* This file is generated by crypto/obj/objects.go. */
 
-#define NUM_NID 949
+#define NUM_NID 950
 
 static const uint8_t kObjectData[] = {
     /* NID_rsadsi */
@@ -1811,6 +1811,8 @@
     0x2b, 0x81, 0x04, 0x01, 0x0e, 0x02,
     /* NID_dhSinglePass_cofactorDH_sha512kdf_scheme */
     0x2b, 0x81, 0x04, 0x01, 0x0e, 0x03,
+    /* NID_Ed25519 */
+    0x2b, 0x65, 0x70,
 };
 
 static const ASN1_OBJECT kObjects[NUM_NID] = {
@@ -3440,6 +3442,7 @@
     {"dh-std-kdf", "dh-std-kdf", NID_dh_std_kdf, 0, NULL, 0},
     {"dh-cofactor-kdf", "dh-cofactor-kdf", NID_dh_cofactor_kdf, 0, NULL, 0},
     {"X25519", "X25519", NID_X25519, 0, NULL, 0},
+    {"Ed25519", "Ed25519", NID_Ed25519, 3, &kObjectData[6175], 0},
 };
 
 static const unsigned kNIDsInShortNameOrder[] = {
@@ -3528,6 +3531,7 @@
     70 /* DSA-SHA1-old */,
     67 /* DSA-old */,
     297 /* DVCS */,
+    949 /* Ed25519 */,
     99 /* GN */,
     855 /* HMAC */,
     780 /* HMAC-MD5 */,
@@ -4400,6 +4404,7 @@
     382 /* Directory */,
     392 /* Domain */,
     132 /* E-mail Protection */,
+    949 /* Ed25519 */,
     389 /* Enterprises */,
     384 /* Experimental */,
     372 /* Extended OCSP Status */,
@@ -5334,7 +5339,8 @@
     378 /* 2.5.8 (OBJ_X500algorithms) */, 81 /* 2.5.29 (OBJ_id_ce) */,
     512 /* 2.23.42 (OBJ_id_set) */, 678 /* 2.23.43 (OBJ_wap) */,
     435 /* 0.9.2342 (OBJ_pss) */, 183 /* 1.2.840 (OBJ_ISO_US) */,
-    381 /* 1.3.6.1 (OBJ_iana) */, 677 /* 1.3.132 (OBJ_certicom_arc) */,
+    381 /* 1.3.6.1 (OBJ_iana) */, 949 /* 1.3.101.112 (OBJ_Ed25519) */,
+    677 /* 1.3.132 (OBJ_certicom_arc) */,
     394 /* 2.5.1.5 (OBJ_selected_attribute_types) */,
     13 /* 2.5.4.3 (OBJ_commonName) */, 100 /* 2.5.4.4 (OBJ_surname) */,
     105 /* 2.5.4.5 (OBJ_serialNumber) */, 14 /* 2.5.4.6 (OBJ_countryName) */,
diff --git a/src/crypto/obj/obj_mac.num b/src/crypto/obj/obj_mac.num
index ef19a6d..2f2a557 100644
--- a/src/crypto/obj/obj_mac.num
+++ b/src/crypto/obj/obj_mac.num
@@ -937,3 +937,4 @@
 dh_std_kdf		946
 dh_cofactor_kdf		947
 X25519		948
+Ed25519		949
diff --git a/src/crypto/obj/obj_xref.c b/src/crypto/obj/obj_xref.c
index 7b4ff12..1baed0e 100644
--- a/src/crypto/obj/obj_xref.c
+++ b/src/crypto/obj/obj_xref.c
@@ -85,10 +85,10 @@
     {NID_ecdsa_with_SHA256, NID_sha256, NID_X9_62_id_ecPublicKey},
     {NID_ecdsa_with_SHA384, NID_sha384, NID_X9_62_id_ecPublicKey},
     {NID_ecdsa_with_SHA512, NID_sha512, NID_X9_62_id_ecPublicKey},
-    /* For PSS the digest algorithm can vary and depends on the included
-     * AlgorithmIdentifier. The digest "undef" indicates the public key method
-     * should handle this explicitly. */
+    /* The following algorithms use more complex (or simpler) parameters. The
+     * digest "undef" indicates the caller should handle this explicitly. */
     {NID_rsassaPss, NID_undef, NID_rsaEncryption},
+    {NID_Ed25519, NID_undef, NID_Ed25519},
 };
 
 int OBJ_find_sigid_algs(int sign_nid, int *out_digest_nid, int *out_pkey_nid) {
diff --git a/src/crypto/obj/objects.txt b/src/crypto/obj/objects.txt
index f3990d0..c2ddfbe 100644
--- a/src/crypto/obj/objects.txt
+++ b/src/crypto/obj/objects.txt
@@ -1333,3 +1333,6 @@
 
 # NID for X25519 (no corresponding OID).
  : X25519
+
+# See draft-ietf-curdle-pkix-04.
+1 3 101 112 : Ed25519
diff --git a/src/crypto/pkcs8/pkcs8_x509.c b/src/crypto/pkcs8/pkcs8_x509.c
index 242f911..875b4ca 100644
--- a/src/crypto/pkcs8/pkcs8_x509.c
+++ b/src/crypto/pkcs8/pkcs8_x509.c
@@ -71,7 +71,7 @@
 
 #include "internal.h"
 #include "../bytestring/internal.h"
-#include "../digest/internal.h"
+#include "../digest_extra/internal.h"
 #include "../internal.h"
 
 
diff --git a/src/crypto/poly1305/internal.h b/src/crypto/poly1305/internal.h
index df6769e..079f51e 100644
--- a/src/crypto/poly1305/internal.h
+++ b/src/crypto/poly1305/internal.h
@@ -22,8 +22,9 @@
 extern "C" {
 #endif
 
+#if defined(OPENSSL_ARM) && !defined(OPENSSL_NO_ASM) && !defined(OPENSSL_APPLE)
+#define OPENSSL_POLY1305_NEON
 
-#if defined(OPENSSL_ARM) && !defined(OPENSSL_NO_ASM)
 void CRYPTO_poly1305_init_neon(poly1305_state *state, const uint8_t key[32]);
 
 void CRYPTO_poly1305_update_neon(poly1305_state *state, const uint8_t *in,
diff --git a/src/crypto/poly1305/poly1305.c b/src/crypto/poly1305/poly1305.c
index 77e8046..5c310e9 100644
--- a/src/crypto/poly1305/poly1305.c
+++ b/src/crypto/poly1305/poly1305.c
@@ -156,7 +156,7 @@
   struct poly1305_state_st *state = poly1305_aligned_state(statep);
   uint32_t t0, t1, t2, t3;
 
-#if defined(OPENSSL_ARM) && !defined(OPENSSL_NO_ASM)
+#if defined(OPENSSL_POLY1305_NEON)
   if (CRYPTO_is_NEON_capable()) {
     CRYPTO_poly1305_init_neon(statep, key);
     return;
@@ -203,7 +203,7 @@
   unsigned int i;
   struct poly1305_state_st *state = poly1305_aligned_state(statep);
 
-#if defined(OPENSSL_ARM) && !defined(OPENSSL_NO_ASM)
+#if defined(OPENSSL_POLY1305_NEON)
   if (CRYPTO_is_NEON_capable()) {
     CRYPTO_poly1305_update_neon(statep, in, in_len);
     return;
@@ -249,7 +249,7 @@
   uint32_t g0, g1, g2, g3, g4;
   uint32_t b, nb;
 
-#if defined(OPENSSL_ARM) && !defined(OPENSSL_NO_ASM)
+#if defined(OPENSSL_POLY1305_NEON)
   if (CRYPTO_is_NEON_capable()) {
     CRYPTO_poly1305_finish_neon(statep, mac);
     return;
diff --git a/src/crypto/poly1305/poly1305_arm.c b/src/crypto/poly1305/poly1305_arm.c
index 444413b..6280e2c 100644
--- a/src/crypto/poly1305/poly1305_arm.c
+++ b/src/crypto/poly1305/poly1305_arm.c
@@ -17,14 +17,14 @@
 
 #include <openssl/poly1305.h>
 
-#if defined(OPENSSL_ARM) && !defined(OPENSSL_NO_ASM)
-
 #include <string.h>
 
 #include "../internal.h"
 #include "internal.h"
 
 
+#if defined(OPENSSL_POLY1305_NEON)
+
 typedef struct {
   uint32_t v[12]; /* for alignment; only using 10 */
 } fe1305x2;
@@ -301,4 +301,4 @@
   fe1305x2_tobytearray(mac, h);
 }
 
-#endif  /* OPENSSL_ARM && !OPENSSL_NO_ASM */
+#endif  /* OPENSSL_POLY1305_NEON */
diff --git a/src/crypto/poly1305/poly1305_arm_asm.S b/src/crypto/poly1305/poly1305_arm_asm.S
index e16f83b..b75c8c4 100644
--- a/src/crypto/poly1305/poly1305_arm_asm.S
+++ b/src/crypto/poly1305/poly1305_arm_asm.S
@@ -1,4 +1,4 @@
-#if defined(__arm__) && !defined(OPENSSL_NO_ASM)
+#if defined(__arm__) && !defined(OPENSSL_NO_ASM) && !defined(__APPLE__)
 
 # This implementation was taken from the public domain, neon2 version in
 # SUPERCOP by D. J. Bernstein and Peter Schwabe.
@@ -2012,4 +2012,4 @@
 add sp,sp,#0
 bx lr
 
-#endif  /* __arm__ && !OPENSSL_NO_ASM */
+#endif  /* __arm__ && !OPENSSL_NO_ASM && !__APPLE__ */
diff --git a/src/crypto/rand/CMakeLists.txt b/src/crypto/rand/CMakeLists.txt
index f7c11f1..c2b1fda 100644
--- a/src/crypto/rand/CMakeLists.txt
+++ b/src/crypto/rand/CMakeLists.txt
@@ -13,7 +13,9 @@
 
   OBJECT
 
+  ctrdrbg.c
   deterministic.c
+  forkunsafe.c
   fuchsia.c
   rand.c
   urandom.c
@@ -23,3 +25,14 @@
 )
 
 perlasm(rdrand-x86_64.${ASM_EXT} asm/rdrand-x86_64.pl)
+
+add_executable(
+  ctrdrbg_vector_test
+
+  ctrdrbg_vector_test.cc
+
+  $<TARGET_OBJECTS:test_support>
+)
+
+target_link_libraries(ctrdrbg_vector_test crypto)
+add_dependencies(all_tests ctrdrbg_vector_test)
diff --git a/src/crypto/rand/ctrdrbg.c b/src/crypto/rand/ctrdrbg.c
new file mode 100644
index 0000000..2b22f5d
--- /dev/null
+++ b/src/crypto/rand/ctrdrbg.c
@@ -0,0 +1,200 @@
+/* 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. */
+
+#include <openssl/rand.h>
+
+#include <openssl/type_check.h>
+#include <openssl/mem.h>
+
+#include "internal.h"
+#include "../cipher/internal.h"
+
+
+/* Section references in this file refer to SP 800-90Ar1:
+ * http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-90Ar1.pdf */
+
+/* See table 3. */
+static const uint64_t kMaxReseedCount = UINT64_C(1) << 48;
+
+int CTR_DRBG_init(CTR_DRBG_STATE *drbg,
+                  const uint8_t entropy[CTR_DRBG_ENTROPY_LEN],
+                  const uint8_t *personalization, size_t personalization_len) {
+  /* Section 10.2.1.3.1 */
+  if (personalization_len > CTR_DRBG_ENTROPY_LEN) {
+    return 0;
+  }
+
+  uint8_t seed_material[CTR_DRBG_ENTROPY_LEN];
+  OPENSSL_memcpy(seed_material, entropy, CTR_DRBG_ENTROPY_LEN);
+
+  for (size_t i = 0; i < personalization_len; i++) {
+    seed_material[i] ^= personalization[i];
+  }
+
+  /* Section 10.2.1.2 */
+
+  /* kInitMask is the result of encrypting blocks with big-endian value 1, 2
+   * and 3 with the all-zero AES-256 key. */
+  static const uint8_t kInitMask[CTR_DRBG_ENTROPY_LEN] = {
+      0x53, 0x0f, 0x8a, 0xfb, 0xc7, 0x45, 0x36, 0xb9, 0xa9, 0x63, 0xb4, 0xf1,
+      0xc4, 0xcb, 0x73, 0x8b, 0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e,
+      0x07, 0x4e, 0xc5, 0xd3, 0xba, 0xf3, 0x9d, 0x18, 0x72, 0x60, 0x03, 0xca,
+      0x37, 0xa6, 0x2a, 0x74, 0xd1, 0xa2, 0xf5, 0x8e, 0x75, 0x06, 0x35, 0x8e,
+  };
+
+  for (size_t i = 0; i < sizeof(kInitMask); i++) {
+    seed_material[i] ^= kInitMask[i];
+  }
+
+  drbg->ctr = aes_ctr_set_key(&drbg->ks, NULL, &drbg->block, seed_material, 32);
+  OPENSSL_memcpy(drbg->counter.bytes, seed_material + 32, 16);
+  drbg->reseed_counter = 1;
+
+  return 1;
+}
+
+OPENSSL_COMPILE_ASSERT(CTR_DRBG_ENTROPY_LEN % AES_BLOCK_SIZE == 0,
+                       not_a_multiple_of_block_size);
+
+/* ctr_inc adds |n| to the last four bytes of |drbg->counter|, treated as a
+ * big-endian number. */
+static void ctr32_add(CTR_DRBG_STATE *drbg, uint32_t n) {
+  drbg->counter.words[3] =
+      CRYPTO_bswap4(CRYPTO_bswap4(drbg->counter.words[3]) + n);
+}
+
+static int CTR_DRBG_update(CTR_DRBG_STATE *drbg, const uint8_t *data,
+                           size_t data_len) {
+  /* Section 10.2.1.2. A value of |data_len| which less than
+   * |CTR_DRBG_ENTROPY_LEN| is permitted and acts the same as right-padding
+   * with zeros. This can save a copy. */
+  if (data_len > CTR_DRBG_ENTROPY_LEN) {
+    return 0;
+  }
+
+  uint8_t temp[CTR_DRBG_ENTROPY_LEN];
+  for (size_t i = 0; i < CTR_DRBG_ENTROPY_LEN; i += AES_BLOCK_SIZE) {
+    ctr32_add(drbg, 1);
+    drbg->block(drbg->counter.bytes, temp + i, &drbg->ks);
+  }
+
+  for (size_t i = 0; i < data_len; i++) {
+    temp[i] ^= data[i];
+  }
+
+  drbg->ctr = aes_ctr_set_key(&drbg->ks, NULL, &drbg->block, temp, 32);
+  OPENSSL_memcpy(drbg->counter.bytes, temp + 32, 16);
+
+  return 1;
+}
+
+int CTR_DRBG_reseed(CTR_DRBG_STATE *drbg,
+                    const uint8_t entropy[CTR_DRBG_ENTROPY_LEN],
+                    const uint8_t *additional_data,
+                    size_t additional_data_len) {
+  /* Section 10.2.1.4 */
+  uint8_t entropy_copy[CTR_DRBG_ENTROPY_LEN];
+
+  if (additional_data_len > 0) {
+    if (additional_data_len > CTR_DRBG_ENTROPY_LEN) {
+      return 0;
+    }
+
+    OPENSSL_memcpy(entropy_copy, entropy, CTR_DRBG_ENTROPY_LEN);
+    for (size_t i = 0; i < additional_data_len; i++) {
+      entropy_copy[i] ^= additional_data[i];
+    }
+
+    entropy = entropy_copy;
+  }
+
+  if (!CTR_DRBG_update(drbg, entropy, CTR_DRBG_ENTROPY_LEN)) {
+    return 0;
+  }
+
+  drbg->reseed_counter = 1;
+
+  return 1;
+}
+
+int CTR_DRBG_generate(CTR_DRBG_STATE *drbg, uint8_t *out, size_t out_len,
+                      const uint8_t *additional_data,
+                      size_t additional_data_len) {
+  /* See 9.3.1 */
+  if (out_len > CTR_DRBG_MAX_GENERATE_LENGTH) {
+    return 0;
+  }
+
+  /* See 10.2.1.5.1 */
+  if (drbg->reseed_counter > kMaxReseedCount) {
+    return 0;
+  }
+
+  if (additional_data_len != 0 &&
+      !CTR_DRBG_update(drbg, additional_data, additional_data_len)) {
+    return 0;
+  }
+
+  /* kChunkSize is used to interact better with the cache. Since the AES-CTR
+   * code assumes that it's encrypting rather than just writing keystream, the
+   * buffer has to be zeroed first. Without chunking, large reads would zero
+   * the whole buffer, flushing the L1 cache, and then do another pass (missing
+   * the cache every time) to “encrypt” it. The code can avoid this by
+   * chunking. */
+  static const size_t kChunkSize = 8 * 1024;
+
+  while (out_len >= AES_BLOCK_SIZE) {
+    size_t todo = kChunkSize;
+    if (todo > out_len) {
+      todo = out_len;
+    }
+
+    todo &= ~(AES_BLOCK_SIZE-1);
+    const size_t num_blocks = todo / AES_BLOCK_SIZE;
+
+    if (drbg->ctr) {
+      OPENSSL_memset(out, 0, todo);
+      ctr32_add(drbg, 1);
+      drbg->ctr(out, out, num_blocks, &drbg->ks, drbg->counter.bytes);
+      ctr32_add(drbg, num_blocks - 1);
+    } else {
+      for (size_t i = 0; i < todo; i += AES_BLOCK_SIZE) {
+        ctr32_add(drbg, 1);
+        drbg->block(drbg->counter.bytes, out + i, &drbg->ks);
+      }
+    }
+
+    out += todo;
+    out_len -= todo;
+  }
+
+  if (out_len > 0) {
+    uint8_t block[AES_BLOCK_SIZE];
+    ctr32_add(drbg, 1);
+    drbg->block(drbg->counter.bytes, block, &drbg->ks);
+
+    OPENSSL_memcpy(out, block, out_len);
+  }
+
+  if (!CTR_DRBG_update(drbg, additional_data, additional_data_len)) {
+    return 0;
+  }
+
+  drbg->reseed_counter++;
+  return 1;
+}
+
+void CTR_DRBG_clear(CTR_DRBG_STATE *drbg) {
+  OPENSSL_cleanse(drbg, sizeof(CTR_DRBG_STATE));
+}
diff --git a/src/crypto/rand/ctrdrbg_test.cc b/src/crypto/rand/ctrdrbg_test.cc
new file mode 100644
index 0000000..2ff1027
--- /dev/null
+++ b/src/crypto/rand/ctrdrbg_test.cc
@@ -0,0 +1,83 @@
+/* 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. */
+
+#include <gtest/gtest.h>
+
+#include <openssl/rand.h>
+#include <openssl/sha.h>
+
+#include "internal.h"
+#include "../test/test_util.h"
+
+
+TEST(CTRDRBGTest, Basic) {
+  const uint8_t kSeed[CTR_DRBG_ENTROPY_LEN] = {
+      0xe4, 0xbc, 0x23, 0xc5, 0x08, 0x9a, 0x19, 0xd8, 0x6f, 0x41, 0x19, 0xcb,
+      0x3f, 0xa0, 0x8c, 0x0a, 0x49, 0x91, 0xe0, 0xa1, 0xde, 0xf1, 0x7e, 0x10,
+      0x1e, 0x4c, 0x14, 0xd9, 0xc3, 0x23, 0x46, 0x0a, 0x7c, 0x2f, 0xb5, 0x8e,
+      0x0b, 0x08, 0x6c, 0x6c, 0x57, 0xb5, 0x5f, 0x56, 0xca, 0xe2, 0x5b, 0xad,
+  };
+
+  CTR_DRBG_STATE drbg;
+  ASSERT_TRUE(CTR_DRBG_init(&drbg, kSeed, nullptr, 0));
+
+  const uint8_t kReseed[CTR_DRBG_ENTROPY_LEN] = {
+      0xfd, 0x85, 0xa8, 0x36, 0xbb, 0xa8, 0x50, 0x19, 0x88, 0x1e, 0x8c, 0x6b,
+      0xad, 0x23, 0xc9, 0x06, 0x1a, 0xdc, 0x75, 0x47, 0x76, 0x59, 0xac, 0xae,
+      0xa8, 0xe4, 0xa0, 0x1d, 0xfe, 0x07, 0xa1, 0x83, 0x2d, 0xad, 0x1c, 0x13,
+      0x6f, 0x59, 0xd7, 0x0f, 0x86, 0x53, 0xa5, 0xdc, 0x11, 0x86, 0x63, 0xd6,
+  };
+
+  ASSERT_TRUE(CTR_DRBG_reseed(&drbg, kReseed, nullptr, 0));
+
+  uint8_t out[64];
+  ASSERT_TRUE(CTR_DRBG_generate(&drbg, out, sizeof(out), nullptr, 0));
+  ASSERT_TRUE(CTR_DRBG_generate(&drbg, out, sizeof(out), nullptr, 0));
+
+  const uint8_t kExpected[64] = {
+      0xb2, 0xcb, 0x89, 0x05, 0xc0, 0x5e, 0x59, 0x50, 0xca, 0x31, 0x89,
+      0x50, 0x96, 0xbe, 0x29, 0xea, 0x3d, 0x5a, 0x3b, 0x82, 0xb2, 0x69,
+      0x49, 0x55, 0x54, 0xeb, 0x80, 0xfe, 0x07, 0xde, 0x43, 0xe1, 0x93,
+      0xb9, 0xe7, 0xc3, 0xec, 0xe7, 0x3b, 0x80, 0xe0, 0x62, 0xb1, 0xc1,
+      0xf6, 0x82, 0x02, 0xfb, 0xb1, 0xc5, 0x2a, 0x04, 0x0e, 0xa2, 0x47,
+      0x88, 0x64, 0x29, 0x52, 0x82, 0x23, 0x4a, 0xaa, 0xda,
+  };
+
+  EXPECT_EQ(Bytes(kExpected), Bytes(out));
+
+  CTR_DRBG_clear(&drbg);
+}
+
+TEST(CTRDRBGTest, Large) {
+  const uint8_t kSeed[CTR_DRBG_ENTROPY_LEN] = {0};
+
+  CTR_DRBG_STATE drbg;
+  ASSERT_TRUE(CTR_DRBG_init(&drbg, kSeed, nullptr, 0));
+
+  std::unique_ptr<uint8_t[]> buf(new uint8_t[CTR_DRBG_MAX_GENERATE_LENGTH]);
+  ASSERT_TRUE(CTR_DRBG_generate(&drbg, buf.get(), CTR_DRBG_MAX_GENERATE_LENGTH,
+                                nullptr, 0));
+
+  uint8_t digest[SHA256_DIGEST_LENGTH];
+  SHA256(buf.get(), CTR_DRBG_MAX_GENERATE_LENGTH, digest);
+
+  const uint8_t kExpected[SHA256_DIGEST_LENGTH] = {
+      0x69, 0x78, 0x15, 0x96, 0xca, 0xc0, 0x3f, 0x6a, 0x6d, 0xed, 0x22,
+      0x1e, 0x26, 0xd0, 0x75, 0x49, 0xa0, 0x4b, 0x91, 0x58, 0x3c, 0xf4,
+      0xe3, 0x6d, 0xff, 0x41, 0xbf, 0xb9, 0xf8, 0xa8, 0x1c, 0x2b,
+  };
+  EXPECT_EQ(Bytes(kExpected), Bytes(digest));
+
+  CTR_DRBG_clear(&drbg);
+}
diff --git a/src/crypto/rand/ctrdrbg_vector_test.cc b/src/crypto/rand/ctrdrbg_vector_test.cc
new file mode 100644
index 0000000..7c93861
--- /dev/null
+++ b/src/crypto/rand/ctrdrbg_vector_test.cc
@@ -0,0 +1,73 @@
+/* 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. */
+
+#include <openssl/rand.h>
+
+#include <openssl/crypto.h>
+
+#include "internal.h"
+#include "../test/test_util.h"
+#include "../test/file_test.h"
+
+
+static bool TestCTRDRBG(FileTest *t, void *arg) {
+  std::vector<uint8_t> seed, personalisation, reseed, ai_reseed, ai1, ai2,
+    expected;
+  if (!t->GetBytes(&seed, "EntropyInput") ||
+      !t->GetBytes(&personalisation, "PersonalizationString") ||
+      !t->GetBytes(&reseed, "EntropyInputReseed") ||
+      !t->GetBytes(&ai_reseed, "AdditionalInputReseed") ||
+      !t->GetBytes(&ai1, "AdditionalInput1") ||
+      !t->GetBytes(&ai2, "AdditionalInput2") ||
+      !t->GetBytes(&expected, "ReturnedBits")) {
+    t->PrintLine("missing value");
+    return false;
+  }
+
+  if (seed.size() != CTR_DRBG_ENTROPY_LEN ||
+      reseed.size() != CTR_DRBG_ENTROPY_LEN) {
+    t->PrintLine("bad seed length");
+    return false;
+  }
+
+  CTR_DRBG_STATE drbg;
+  CTR_DRBG_init(&drbg, seed.data(),
+                personalisation.size() > 0 ? personalisation.data() : nullptr,
+                personalisation.size());
+  CTR_DRBG_reseed(&drbg, reseed.data(),
+                  ai_reseed.size() > 0 ? ai_reseed.data() : nullptr,
+                  ai_reseed.size());
+
+  std::vector<uint8_t> out;
+  out.resize(expected.size());
+
+  CTR_DRBG_generate(&drbg, out.data(), out.size(),
+                    ai1.size() > 0 ? ai1.data() : nullptr, ai1.size());
+  CTR_DRBG_generate(&drbg, out.data(), out.size(),
+                    ai2.size() > 0 ? ai2.data() : nullptr, ai2.size());
+
+  return t->ExpectBytesEqual(expected.data(), expected.size(), out.data(),
+                             out.size());
+}
+
+int main(int argc, char **argv) {
+  CRYPTO_library_init();
+
+  if (argc != 2) {
+    fprintf(stderr, "%s <test file>\n", argv[0]);
+    return 1;
+  }
+
+  return FileTestMain(TestCTRDRBG, nullptr, argv[1]);
+}
diff --git a/src/crypto/rand/ctrdrbg_vectors.txt b/src/crypto/rand/ctrdrbg_vectors.txt
new file mode 100644
index 0000000..c866431
--- /dev/null
+++ b/src/crypto/rand/ctrdrbg_vectors.txt
@@ -0,0 +1,1922 @@
+# These test vectors were taken from NIST's CAVP tests for CTR-DRBG.
+# Specifically those for AES-256 with no derivation function.
+
+EntropyInput = e4bc23c5089a19d86f4119cb3fa08c0a4991e0a1def17e101e4c14d9c323460a7c2fb58e0b086c6c57b55f56cae25bad
+PersonalizationString =
+EntropyInputReseed = fd85a836bba85019881e8c6bad23c9061adc75477659acaea8e4a01dfe07a1832dad1c136f59d70f8653a5dc118663d6
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = b2cb8905c05e5950ca31895096be29ea3d5a3b82b269495554eb80fe07de43e193b9e7c3ece73b80e062b1c1f68202fbb1c52a040ea2478864295282234aaada
+
+EntropyInput = edfdb55e77d418a63e4414dfd42225ed257cf74e99325fba26e8f3a4524a71bc80a731af23256908cb4675a9c253ea6f
+PersonalizationString =
+EntropyInputReseed = a9372fea93d607fbbc75a97b7f65f2d4ae8c06bd184981572e888a35c5794d2bb380a4ae04bba27f2efcc9e7914b96dc
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 11b1a0f0bb935ec0c54e089e0cd20832d1f00e7069f30e9ea2e35b7f15ecf0577d0e90035bf0f91ffd9e8a1fa8a507503739afbec19393e02c9b7c230cdea36f
+
+EntropyInput = f253fd442b105434c0f47ba9b6798bc20c8832a142a2a6d965678485a3ac52393528a5e092341d60ad74429f4005f8bb
+PersonalizationString =
+EntropyInputReseed = 600c822b198dbdcd9d13ee25bd4b846e5d8665725eac5347b4cfe7512c1f3fbdc4c51c85d977ca58e9e6485a17c533bb
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 076419bdd354d6a1f1415a0a71bed94db29cad22f0205d983c841874497875a4857404e573545366850fe6eb5286e0deb87ddd63bb3317b4556a82920412aeef
+
+EntropyInput = 8dbf2c37dbbf3862f05af4b32e98edd3d8cd7bd34d8a23daa2d15200daed6e9d238387ba85ddfd35a2986bdf5790e1a7
+PersonalizationString =
+EntropyInputReseed = f67aed05dea08baa16cbb669ae310a0b8e019da0a7fe2762abf684121292186a50bc13d568576ce5d7aeb080e4604a1e
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 69666e65c5623140da35927ec39189fcfda0891674efdcd2a7d6f2628921a37bd49a164590413c04f6090a50336f040b015dd8c45452991bcdd96994c5ecc6bd
+
+EntropyInput = 2fac25dcea5274a7dbd6af112d757b59a4447f5dcbda972666af071c5d8f71583ec6914a1e685f610b8a43ffada0b411
+PersonalizationString =
+EntropyInputReseed = 52f5b1f927c0873ae375d6a6e140fe594fd474a63bcdcd6a98109e32ad980ce534714ec626dad7acd43101415e5817d2
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 3096cf20137eb6f94d9d26a4871eddf10285c6984776847105ca9294aafc68925ad8bd7f36bb68fe371476114649ead11b926f9f0fc1d21c744342ff5c44c8e3
+
+EntropyInput = 4133a0e6ce837125f46f2a44e05c4f64d76879156ea16a1d16db1d3ec460cc53609fa9e4b3081f9dde0b79f00c93ac5a
+PersonalizationString =
+EntropyInputReseed = 4613b2327dc9054f34faf933d62bf7b12ec8b34626c07ef7512cecd8aedcbd4023f26b859a941c5af77ec1e2e02a1d9c
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = be02e94fd18c488741fd90b6980118dffba1cda5bd25aa23d44414392201c5a78c3ea68252f92afaaf540b298d3f80a94818f1d1ca84c2be5f66a46191a7548b
+
+EntropyInput = e312fd67b5009ab1c896ba8f85d53fb29517ed2a26d20a4b9d09505ec004bef5739cc94e7f368989c675eee1f40501a2
+PersonalizationString =
+EntropyInputReseed = 176ec11c0d4462ea26b1bdee41208e3ff3b430de11f12567ebe982c16d709f681fcd9f5bd5309f3f2a9d80b3a426929a
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 07cb9f51e34be38fe1d1c18858ee44db227c1e6a6c2f7d09e9143e87e9e09df0af9a5cb7a183e5d26359509fe619e52e59e3333d3620373d3ae5a008b51ef786
+
+EntropyInput = 3eaf30117135d9167c829e35bd8da227a6302471b649381858085e67c65496058ded0ab176a38b3888f4e3c2e65269dd
+PersonalizationString =
+EntropyInputReseed = df60a1b9fb2f8501756edd09e489fc98a60ed08646f5a2e018f55b71c76b9b7718ac4ae61b41241593829108ddeb0ef0
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 29c4d540354e97f50f3fb1de84eef471192cd76a670de34176c6465523ff249ed5eafe2c09f091f5ed101cf8a971d782f150a2642ed291e850906e29328d6b8a
+
+EntropyInput = 99d5543c192c6a1069bf548d80d678bc42c1f020f0b29a0ceeba424c03f8a8aa38df1c0fe100ee4c1b0bc870b4afa3d2
+PersonalizationString =
+EntropyInputReseed = a0fddd29c792f6f411b5d532fff2564d492ca15ac8b7fe1b4575e9b59806823665ad7ac4e2adcd2803ccaabe87ab75ed
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 3d58e98a1f4beda50f84f773c405d106b28f4be6da2a2942098403843bffa3323c53661a7f072a020c68f55ea2b3a9cf9157b7c4cdff5e642ee9be1f436f9c18
+
+EntropyInput = 2151ba6cf2ed6a7366991e516443162b6ed4e7f8ef2d6c81ec5e5feb0061e20ced65da27847956194dc6177b5e0befa9
+PersonalizationString =
+EntropyInputReseed = 73418efab1c6039145dc6ce09b84abde4ef4f8eaccbac250213bdd75e2a5e8b42ffb1367bd8d1281e3b0051651f78a05
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 5b219cb285c820f3bce52b9eff15afa042de3036f1a52896eab34e4476c28c60127cf8daddce0809efafab03c9269cd220a49f79220e14db9d208311d2a22a1b
+
+EntropyInput = 7c7321b69fdefdece32c45e47cce07a0d599e83ea8ee5781e2f2ff341f292c0bdb848e5ab379771639e811fed45f63d7
+PersonalizationString =
+EntropyInputReseed = 4b04652d3d0515b305f4da346754c0d398c8cfefe8e5c1edacb79cb8396018bda12ad7d42bf86e801159bb62c34fff68
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 379c12dc2c8a884c6f40df5353047d74efbd9c626795b86256abec4a6f42ba26529f19e4b043f53776180c7ab16a3817b4a50c09bb3355234786e714edb9e2b4
+
+EntropyInput = 3a56329b07dffb8bc7761c0c2b4ec4ec3b7ed2513f0cc3d9be3eb9a153e8e1605d9392dbb951e4b0989ef473301f6f57
+PersonalizationString =
+EntropyInputReseed = ff6efb9b946748af0992bdc38eeb15d4991bb610692e1fe53ff828405924a544ee0e4da70aa1d0ae55e7925a58cf5597
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 9f32e40391217833176ca768beedd2839892c6fc17dec5c250f0820c576e4ed615729653515ae13292a2e4aedaa2df74c6535d8c625dd1cab479d3c5ae7bf955
+
+EntropyInput = d550f48af436ae42ea48a8cb0cd615be8db51691b365ef20ed826b28561fbacc9deb28cd3d83655033068948c55683da
+PersonalizationString =
+EntropyInputReseed = 76ea2e732f77b337ddd402e367c158dacc3433feb40d7b4376fb8dc449891336b00841580ea189583ada95cef783d540
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 8433b2ac45da6fdcbeaf3e6f76e66beb5b90a89a9cb197cfbe405ed53b1dd51a42cfc9aec5fe7cf778f88031fb7b15b0874d4d1ea87ef3895848721b34fb1a35
+
+EntropyInput = ce6137f720affd106396d9b66540580ae216d5d7dab48ed2729cdb3e587c7d8da13ce39ea8d9d8c22220a96b74e7ee9d
+PersonalizationString =
+EntropyInputReseed = af9f12fddeef001b08a5993f62da5e7c3aff23f882ae874b9f66f28eca1106e6386dd82f07ae1fb6868f186e2ec4f449
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 219fc160dbc136cdc9a7c3407eafde4639602cc58101c512dfbd85cc26b61fc9a94cdf76f15a1de7a46e36ab64aca3eeae36acd6e3d0b3fe59b75958b3eddd24
+
+EntropyInput = 1accff5a19861164c5d2cf542cf41a789f143c7956518ae158d4449ff0c257a00966faa862ccbb363bcf4aeb31089134
+PersonalizationString =
+EntropyInputReseed = f2fa58209759d84bf38a1656bae655669767a902ade22a830df56b32ef9e1c992335eb4cb27eeb142bfd21b5d31451de
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = f214b4055d182cb258d9e9b61251bebc9bf090db662c4e36023cc156964fbbe1cedf691cd0c3d7db4262fb65a5d34b942f909b0f31fc18009766413523dcaf40
+
+EntropyInput = 99903165903fea49c2db26ed675e44cc14cb2c1f28b836b203240b02771e831146ffc4335373bb344688c5c950670291
+PersonalizationString =
+EntropyInputReseed = b4ee99fa9e0eddaf4a3612013cd636c4af69177b43eebb3c58a305b9979b68b5cc820504f6c029aad78a5d29c66e84a0
+AdditionalInputReseed = 2d8c5c28b05696e74774eb69a10f01c5fabc62691ddf7848a8004bb5eeb4d2c5febe1aa01f4d557b23d7e9a0e4e90655
+AdditionalInput1 = 0dc9cde42ac6e856f01a55f219c614de90c659260948db5053d414bab0ec2e13e995120c3eb5aafc25dc4bdcef8ace24
+AdditionalInput2 = 711be6c035013189f362211889248ca8a3268e63a7eb26836d915810a680ac4a33cd1180811a31a0f44f08db3dd64f91
+ReturnedBits = 11c7a0326ea737baa7a993d510fafee5374e7bbe17ef0e3e29f50fa68aac2124b017d449768491cac06d136d691a4e80785739f9aaedf311bba752a3268cc531
+
+EntropyInput = f963096540d0023d6703e18248755ad16aea91852a2db0dd0f6a414d2a5822f3224ac8b1d47b01aaecc93ae299081d7d
+PersonalizationString =
+EntropyInputReseed = 399ed54bd846de00d42fb1f92d1ade93e81e32cd6ce73825f0bf86179dd46fd79bc8cbbd3b8834e58cc86619e19b08b4
+AdditionalInputReseed = ee073f9f6145d0a7c09a5e4a12d65baeba360bc9b5d7cadf93e7d2454dfde507af37e49782cf8550dd3a548e8cf98563
+AdditionalInput1 = 6a42ffe56dac0b4dc5d84b49698859b3645c920151565bf29f56b6322244bcaa7cd1ebb8ee9936d8ee1d280f547ae245
+AdditionalInput2 = d057c418a758d99a8ee855093da9bc1734a5168a6df9d9c9924e8bb472b5945563d86350dcf3e11aebcbd06a22b9ef78
+ReturnedBits = a0cd72e63f49ce4c1d64e21e92546afced2af268549ef48d3ca88afe4d4097f91a52ecd0e7ad12ec0a1f67dd8c5325b78ee507c0a63cf90d64e9c47862acedf3
+
+EntropyInput = 333a0269eb0fb1d9d1e92f55de9e13cd7e24de64f5f276382d3eb2ff356a66679a9a75d2da31d39a940a09cc85d9d531
+PersonalizationString =
+EntropyInputReseed = cbf504cc473c9a6e66493b71b9684e8df458e65d2cc676e4e6ad43eb59172932c0956d0623134a6a3bba23906ec9da0a
+AdditionalInputReseed = abc86c71ae0585827ffe0d19a9fe97f23cdc4afd67978e553e0669d4635ca1df30250843fefd4d1288f6fbc3bfe04a72
+AdditionalInput1 = 15d15fbe7c060e6811bf47c21e93639c00cdcc562f4e02c88f7e347ec14a2c8410fdb2ddc3dfa62ba9ed1758f12017df
+AdditionalInput2 = fff311ea4c5cbd8ce53c45fe8d8106c28eb06d01ec9d8245c29f95b50b13085a0ec28803d733bd0d8a75193e63e21d5d
+ReturnedBits = fcdb52bb6e2ba8d896973b9284b32af6364a34a2b80b3e3c7684c200c9e0a02f7bc6c3cd32b159df9b98da07a17baab9b0b07eab214544d5c562e454ec643de1
+
+EntropyInput = 86e4c30c5a7dfcca86eda7723930ab3272635f0ad9e2fd70a2d7a69b6a07dc0cddeabffa9c411198e3cb7589cb29d3f2
+PersonalizationString =
+EntropyInputReseed = e1af1c42cd29dd002e10e5839e8b679d3c5192da5e1b655123132ff1ade22b35651ac6df66fa14f36e1832be7a176895
+AdditionalInputReseed = 5f619073fa2e98b9f06bb4676bb972379ceb727e1e8768ef09e532cf3d8fed5ce92a7528eb55ae552959d74f75dd0324
+AdditionalInput1 = 330e316bec4955d907d7d7bf2b7149f0aaf4285ed1a2b7e387376ea1a4e0858c114ec3ddddf7a1edd7c8a29b1f12b998
+AdditionalInput2 = 405911cf7c6779e02e4740fa9737f189370292494c80621cfaa9f7d16d68219e72d474f8d5a54aa8ea8020dff9c36650
+ReturnedBits = e359c3e23315c9c1d69ab2ec96ec3c6c5aad868e58709e101b0fa08c4041248e4d538d038993250d395d9651513514fca5760dcb9970dce53d2d1c2712bc56d0
+
+EntropyInput = d8cc5d13badedbdc2fd41852247a9f2879b0103b4a8186f0a08da7d55453b7484f642a9e5a5182340584d2ca7cd5ed10
+PersonalizationString =
+EntropyInputReseed = 35788b8369fdc3dfd206efb873b5c5215f5b8ecb0541fc0a0e027e868a91053b5d58cc8ca0751e0c0893c868e2322471
+AdditionalInputReseed = 6afcdc760fe62b080f141886b516623971f8014ede86e50d62d307a90cf3512da5fefd37b3932d3d9d86ad0c03447be4
+AdditionalInput1 = 72105702fbf1da4c10ff087b02db764804963fd986de933b757b8fe5a6016e0f2700573925aced85c09e2ad9f9f7b2c2
+AdditionalInput2 = 65f9a3fe4e1953b7d538f6d6ca3c0a73bda2276fe8f80860c07b7ed139d748c3c45db5d96598f77ff863a43977ba390c
+ReturnedBits = 7c2b600c3f550671215b03ad7aebf71086ec59aa4f45cf6b3bac9bba2e108f801f6478b098fcc4e063454cd3f64a951ed70f619866c1a4e70b5c47458c09e083
+
+EntropyInput = 07d14a0d9fbc76a155047a93bc0bb2b578fa7dd75cfe9a44bb8709fe3cc2302fdcc06a9c6751f4602a3a4955c0f38c7e
+PersonalizationString =
+EntropyInputReseed = 8babab6b9f8429f554156da3905122cb48c0b901fb6eaad8df771e8d583ba885dfbad02e47524b1981768593bde88260
+AdditionalInputReseed = c185c45cb07e8c8ba8eb31d3bd48a7c864137c689214c2fb3b1d6d6abcda84f2922a862a0955e67695391d60d6f2d1bf
+AdditionalInput1 = 326a5c9c4a1a2b6fdc369fe2a171bf625dc26e23d1a34faacf59bd33be98ff7ac7f16e485b6da3145ea4db37ee4ffefa
+AdditionalInput2 = de096ad13dcc1ee1449c3a0661edee028603590f087474161a7ab8fcfac896a924e14b0a57aeac17fed676f4b9c7168c
+ReturnedBits = 60911e6e6455bf4d85a4f76378390f6cd537d7cce88228cf34e4a4889adf62a9cc1070dfc39c254e81a8557bb2c350fe3f462199e377d3796ed139117b6b0f45
+
+EntropyInput = b3458c6b38ca70c44fc6c601e088863fafc953c6b5d3ee57fb1a07f3f65dd5e6dc19aed17aa5530913aca598b26a40c0
+PersonalizationString =
+EntropyInputReseed = faa8d3feabf972e482e5a0b3821c23ba067c45267e3715a4c10f65716a348030d7fa5637e9f000b3e47d786c013fc035
+AdditionalInputReseed = 901ef89ea38203b83249a34a1a8cbd0da4773ccd503d60a395be3a3db113613e6c571a49960a4e99d302b6f237f64d54
+AdditionalInput1 = f2f87693d1f28f95b0a6459c538e82be99a8cefe8a2c7ca037822072e63670dd141873f3dc9e309c6ead40783f46794e
+AdditionalInput2 = 93cfefbb7624a137cbd7b177918823893e77251fc5660a76ab0cfaa3b340ae822a8a75365056f06b0a7e76afc39f6819
+ReturnedBits = 5bbcdeb5d7d1ae19e4ef7878abd1ca4f2641d42c765b94a7689172a4e90baae46ebcfa5427a882c1614cab36f186a98dd3a15febc4b23add955f69dbfd5e5d2e
+
+EntropyInput = 6dbcf6f2f3997ed55471f779039982bc84a1c052fbf5883d6f62c0a61db108386e74759d7237bb0efca030aac76bc7e6
+PersonalizationString =
+EntropyInputReseed = 1a16753c195fed27a1abbe067b2b22aff4c49ae7832d18d01cef5ea5c7d5833008036f71e9c77c1629b6f61370b57f7b
+AdditionalInputReseed = ec54395931ac0aea2a8739d4c51e33c8425906005c341db373247e73b968c2c79257cf7ac74353c00fd81a80f4c95b8c
+AdditionalInput1 = dbd6bb5579a10e395b534431f3ab7c8025527bf99e4f7c162d681f8d35a56f6a03729f07ab43897ad0e80146044b1614
+AdditionalInput2 = 5d35742c25620bb795eae41178d7fc86d9cbe050ea702573ae6adb61e16c411b7445548dc535d57371bb11e2cdd59597
+ReturnedBits = ba3905bfddcabf6dae311d1fc19fff1f6fc1ce779e38f864b7ccd2aeb1b3d6ec1845305c29d39b8736b3977277ecaf5735d0e4acefccf7778ac3542af815fd41
+
+EntropyInput = 3a9e8099007c67f6e5f98525cc4295a68c5d5135d01f5f66305c7048ca02525caa3f790b2d12a8520e9963a9cdd597a8
+PersonalizationString =
+EntropyInputReseed = 15993dba9775db8a5bf79778a316f2910d4dc0be59c3b21c650e3aa89c8c89b33fc69e9e5d642e7fee16d61b691de2bf
+AdditionalInputReseed = 946121bae27e5804daeba0d7dc7ae0c1c397bfab106e13b8b7c5462b540d147119af5b7c4f9c198161e5aa9be34e2d28
+AdditionalInput1 = e9799421e75bae7086731a21242dc101c93b768fc747734a357454fc0f7c082cfdb79b8bbcea2d1122d89316a7bfbd3d
+AdditionalInput2 = caa04f94b4b9d694e2c4bfa1e8e708b9c00d9c3d645243acfcb879d2e2ba723d9e48908738114eab7d15f8cf36b043ae
+ReturnedBits = 9bd50f3c5384eb28d931f03a64eb97ef140e1e81f4c1d9c910cd7d79a40494e1fcc53d82cd32df35d53b05a450e54b7ec71e28359c1273848e5ab117d5ded88f
+
+EntropyInput = 7f2a0213de6738ec62bedab769a5f01732dad2d35dd4cad7a765dbbb6f9101f57b65ec8fc4e23fb3479ce6211ca3d84e
+PersonalizationString =
+EntropyInputReseed = aeb097e9ddc4dfe87874ddb1a856ec3d00fff1b38c8f954681c11e61bac8b6b2e2d8d010e6820f9c4d807b295acb8ab0
+AdditionalInputReseed = b33ad3dec7d529b71e39d59147f79b4884039d1112804fe8c70e174fdd9828c06a4d44d20aa5fc1918c3ee8082a2bf93
+AdditionalInput1 = 8632d221757132bb7b883b7dc26755f62ec2ffab0876168d11ea7b92774c15c553b11320393d64a2262133608ca92a18
+AdditionalInput2 = ccaf3bc3ae9cdbfa885aa8414c1f823c6a3ecc020b619201a52ce0b7516ba1f49755c450c532bfe11c06b9d0e049ccae
+ReturnedBits = 4b1c065a288e5eec56b67fb341e25fc7521b794b52b94f9570bdb16583bb6f7a780aea5297496355ffb4bf5a444c277c96394619cc33cbb5a3b2a9f49b00f9df
+
+EntropyInput = 80773d0272ff48ba84b98c817365b097f21258624d0de8529381977950a5e49ff2b79d0f2522269970ea6d484198922c
+PersonalizationString =
+EntropyInputReseed = 9b101ac018be88da3611a236dfb1300c0049947e9f6ebef7a3ad6e1499efeca0b142826fa06f427e271865232a18dd29
+AdditionalInputReseed = a67ee22453dcaa5e4726e3084872145ab60489bcb6e83346c108f3efcce5b3d988b84d58786658d87c2dc3b9035e9d88
+AdditionalInput1 = 546515bf86e48dfb2b4dd21c2b46f10c1e797ab799b51822e8e7cd99ccebcca00b8899ef6af5cb395168aada9056a6c9
+AdditionalInput2 = 57bedda63fc5f792a608be111141a12e522496c086194515909bddcd868be997e718e7c5899e28dd6b123cbcc3f2a8f2
+ReturnedBits = 4075461e459f15cd32030551be47528223693c2f44e32443cbe9271eefe74fa0a6e1ec04f4b8f41d7ed6c5f455281a3cba56d952b08b7753f6a3d7da3517317a
+
+EntropyInput = dc132c15af0e214d1b56eb88849e96b81dc17f238eb3d1bb9a659219dbd77eba38ca2796a8011e29cfad76f8cbbf099d
+PersonalizationString =
+EntropyInputReseed = cba23d4fdbb6c11e38012b71ca264bff9d1264bb20a39bb27d86dcdf7d72ce7a4f5c124cdf2aca6aaee20832495181e6
+AdditionalInputReseed = 07e043add7cc14612a82926c09934dea092f4618cce25674972b1f50b2907c7e3d40a25722ea49b0c7ceb6b57ff2d870
+AdditionalInput1 = 0017ff834967cff8827598ff6c00a9c97f0347c34f2523a85dd7d18ff5575756c1f5383de50338d0ab0505841d70a193
+AdditionalInput2 = c404dbc3cb0851b08530f96500f5a2c10d8985c82dec2ba31d4199fd07687ccf124382fbee3fa119938f0c72ac586102
+ReturnedBits = 1935cce86bde7087fcab30b5dce0e072ad741c2f281902e1801e56c08ae8b256d27514de92dd48a838ca426820002c1206f86cad37cfd99d3a935e05f56a7507
+
+EntropyInput = e48495930a7fc86ecbfad807d40ca84ba35e346c812090def8f44d9e48b0a40704ac67ec80ae15b12e858ae85a7ed9cf
+PersonalizationString =
+EntropyInputReseed = f4735954d17e99077061c9604e8f1734d61dd662e54e37256c0f8bf276e025d59d21cacc0869ededb44a2aac9fcf2ccc
+AdditionalInputReseed = e796322fc0ef503251f6d4bd72dc5ea8100c5a59f1a4fe4837fa8eb2623bc650a0cd48c306f139e0ecd169a51deb2cd0
+AdditionalInput1 = 1c844d24b7cd9512e5035bc457612ebf6d3df6867aa909038bcbc1f474f7d0783ed474e34525a817bea1fbc883961e31
+AdditionalInput2 = 5c5671ba79bd0b83f74d0ed98e9c8b369a2de34188d8b7cada20b3363738d1252ece1e6a26d007acdfc5b6108412766a
+ReturnedBits = 40f17e2bf6084a6447f2c40d601e16a43098dadd9f9614d518874623e8e684438c02e127e582b000dfd46df03dd5435edc4f0f47098320fd311afdbb8542c4db
+
+EntropyInput = df4a888ec7363fadd99ce2223ed39577a41bc220d20b253f98dbfc617aff8fe4ac66e5da1b5097228422cf8242baaf53
+PersonalizationString =
+EntropyInputReseed = e16dca80b2061706e8180dce8f59e888f150836a0bbceac179a4b8d882eead78709ed9951102728abbbbf9226a2d913e
+AdditionalInputReseed = febc9f6b9f2b90b4320d5d41e5c5506fa32b164d86d5e7f91d4a360fe179c127bd2bdeb78fe760174e856a5e04ed898b
+AdditionalInput1 = 0aba74cd299e75886c9e7e5293e5915d720da2c8c1cca7f0e1d6f2b672b4014eb4582e97a877121c87956185736ba0e9
+AdditionalInput2 = e451eac802660ac843fc72b66d59f1e1ca831f22d6a361929043f7626f1d82133f512fb1f2d8ca51004f80ed600609e4
+ReturnedBits = 968b708ed6b54d2e5a66d46f22998748dfb5cf47e817732a40938bf3593fb251ccf8f2076837715d14b316bfb52560135602ff98338593696bf80a462b214c4b
+
+EntropyInput = 43bc561c4dd1b904a5333a092a670d0d1b61128a13be2e538a329094574819284e414b938dc8b1860b385c293c03010d
+PersonalizationString =
+EntropyInputReseed = eb362136f4ccc9e302505d525befbfa99d8c3336187d5902b03ed75641913ce973743757f97dae9366874ba62bd87013
+AdditionalInputReseed = a901f4daaa638804177a0b263e8cbc81688df3beb218b02316da83b729230a9e5112fb3896b727298755bb9ac6b6250a
+AdditionalInput1 = e33d181f3159fb0874eff5ef8ddd2b51a60b13ccf046f7e637ed27bed81bb604277f7345e6b8f0e09f925793ce417fff
+AdditionalInput2 = 3ecf6233820e6cceddac7b024c490c5ee14c73d5b598c92cda30940471b6ed450019120689aaf157fd87b71b13afea25
+ReturnedBits = 9d793dd96b870dfa0267623bd1c2d8bd3e2c63e9f211340f630fea01358011394154145a10659c4d98274a525c48a90da0126a99b85ed5b4b903195f0dddc762
+
+EntropyInput = ffad10100025a879672ff50374b286712f457dd01441d76ac1a1cd15c7390dd93179a2f5920d198bf34a1b76fbc21289
+PersonalizationString = 1d2be6f25e88fa30c4ef42e4d54efd957dec231fa00143ca47580be666a8c143a916c90b3819a0a7ea914e3c9a2e7a3f
+EntropyInputReseed = 6c1a089cae313363bc76a780139eb4f2f2048b1f6b07896c5c412bff0385440fc43b73facbb79e3a252fa01fe17ab391
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = e053c7d4bd9099ef6a99f190a5fd80219437d642006672338da6e0fe73ca4d24ffa51151bfbdac78d8a2f6255046edf57a04626e9977139c6933274299f3bdff
+
+EntropyInput = f1e0d7b1ac7e4e155bb588500f57d0c59969267ea5427e2d7fde1f9c54e67b7f6562bfc1019b8b5799d2a833fdccac79
+PersonalizationString = 86da37245d9bd1fb59a4bc7abd289ea2999258042c5fa696f2da7344bb6ebc5b770ca284bfe642570b52ef47b780d5c9
+EntropyInputReseed = 9c2c9c07cab12cf50f8846148034a416c83366c1e20776073751553cae69da8d1f6bce6bde27087659d69a62e2ba7c3c
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = e0ac06d7eae89469b6c14a31e7f0464ee21f7b30d2264c2de3e435cb40d0e5043ee13dfbc0342156750880b2d5dddb3bebb43b162a8478235c8b87f96d0284fd
+
+EntropyInput = 1dbee767e9916ab322ba461fbf9f7515cfbcb45944a7b471577da087690d94d967018b631e0c1f64da3c805d049f449a
+PersonalizationString = 966b5cd94019d4d90b48ea7f540a698cfe30d7eb25f5f7e5fe42d9f53ebed6e94e733b0794fc6bf30627911e20cc18e8
+EntropyInputReseed = 96e828128f183c76c90ec8341a43561368b77114048ccb05db66128d54c9539d1adc1d72f7fb0950e41b1343a9e4df76
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = c4d3f5c55d3979b174020650ad7a46b423ec446dff2a9e9fe0a782bf65a72d5fcb1896bc1092a8c73f41295e2e7044434f88aa0aca78f7eac40e322cb7c25563
+
+EntropyInput = df588bff3a1fc97a908067da6a7fef08c889ac29ad7d639bd047157bacab4dbdee3dffe575f37d071af94cbd7628d398
+PersonalizationString = 548715cfb28c1bc56453b8c39e24cfd64077c0f6e9d959d51b9f0667b97d3c4e1a179d1a554df845b24c26daec85845a
+EntropyInputReseed = f8c165b5ebd8347a2ffef2218f993877027e977598b4fdac2f65d8d994c7432900f8407ab5aed1885dee5aa2458f5998
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = deed18220bd8f72a34559924f3cad925ee717690f76bc223d5ffeebbb554b61b9d9eb6ac5697b06331e236672677e2e01d6e3fd581a4fa1ebad289797b68955f
+
+EntropyInput = 98555093e443fe8e2bc8d2eb4d3a7abb8eba00b25683a6b31191fff7c043665ec2cad3e99e55bbc241b8edc699dbc9ed
+PersonalizationString = 5627a0a55457db05e3903d4b69ce15f55f933168d6eb374c044e8f1040f61ed7eb24f87f91c68cde050f504b8965dd81
+EntropyInputReseed = 18d17e1b68378801f83e7aa9a6d4b84d3960022c740e6c845869a5db553d2e02479cd92f3c0d8abd3e92fc9c9fbc6a3f
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 7a7f0ab07a540b4e9a3eda3f8bd1262015d8ea6d512dbea05942421f5a73242ac236009ef083bf2e51b19c40d1a019367a6b96fb52d254e4d881550aef0549ed
+
+EntropyInput = 07793bac6461f23e5eb0d1bc60b5f735515458d1530540df1c8e6fc5c3ebfb06b9db60a8947eb629ff7a375fe680d696
+PersonalizationString = c1e2132b77b6c15742e06e856c1549c4ccebd1b2eda93e2c43391b52cad51490fe34157f57be9eb4eff463b059986680
+EntropyInputReseed = 23e47e0c41462f7c619bbcd5b73f9ab1c68c7cdf1ec92c4c37126402958e110e329107742e70db611b93974c393936a6
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = e6dab4a887f48ec33cb293ffdab5fc69595f94c72c5a9bb43f468f75490190b7e0f14f5c04550cb62a6d0ee0c3d834be3434c8229c124087bb985a06b9a37267
+
+EntropyInput = 25cefa0512921fd4a3a4e5e7c48c6201185a6968419ae5bcc6667bb74c35de4f91988a33f25ea88a8443c65643cc73dd
+PersonalizationString = 07ddf125960c346680b4b361c0a9c6dc1008a85ce1861b45ff18907e6e7db41b046e5f016617e6c5b0ceb5575ac278a8
+EntropyInputReseed = 8cf41e5413b0c8ffacbc4dfc119f10b47569359b911448f45c7ad63dd58e872410c25176b986fee8b83966d0098d996a
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = ab58ec5c35600566dd2ee187a5b67dfa65bebe13333670d2a198fa5af0c20294c6cb69d37564d2b2587ea5587e12341e77f47f173d6cc9f9b9e5dedf0ee1a8d0
+
+EntropyInput = 929f1dec0a6d14de483a2fe114a430796d0b449fca56a4ddbbe661bdc26a8df85cafad7b677ccbf1fe4cb0d5e8cb57a9
+PersonalizationString = 0bf8c590a66653c0494750d10274b583d86e540b517bfc23bb3b0c9fde373e456558468603c2115c97d3662e6825f4f2
+EntropyInputReseed = 84030628534b7525dbd4023aed1ab08c4f2b86a7c2fa3bc9559b425cce07c34fac14e963256aea03f74f1122a7a30483
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 199f2dce5bbe32c693151a216fb36ccea7996c313f6b78fa30ad812a0e603965023fc29706a71b753d79244cb9e8fdaff467e0f963426b10ad89a98e987af316
+
+EntropyInput = 7bc5d970186b9e1b0052b7564dbabf61c89cb3d64ff42f9a62d625112aca0486cdf0336c3612254b40cbfba83ab65b42
+PersonalizationString = a25326fef30f9c94423d99759a1ee575536a9715df9526de9a0b8dbcc3a2234cd835615f5dfe7823927355f569ec6f02
+EntropyInputReseed = ef8a0137013be212402e42b28c03ed6420881aa38b3a3e6e90a861116516df1ef732a19e8935ffcd9be7a2fc236783b7
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 29f81ecf3f41d278c01bba9af9bc0fe6009539682f46723ce5b0ff75fed217ad71580b5dac46289e324d824094c332c3955c528257701a14ec2bfecce4f62a6c
+
+EntropyInput = 0c841a245a19295281163b07541590376d31d86a9be99e66cc22352dabb29f95e113ee233d74d3f2b7f2f608830525f0
+PersonalizationString = 28d3581054d87f153aee12edca47bad80bfc9b066ad1e8b9d96c851dc7b8ed768cad007b891d1c9447d43065b483d085
+EntropyInputReseed = 587a1dae75c2a1f2dea7fb42ef7bf38646b76a964ecd7043d8b62fdd9e6a5c007882f02f78fd040561d15a337e59f257
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = ba7bce080963fe2b4e8f0e1aa700e92b3908e18dc78728666904b0220e4077fef2cd18bbea29a2755a3499798cca445bb75269a5adca2f291dd3875457c69a89
+
+EntropyInput = f4afddabe515ca3e776730e7d44461b27e8f72407ca398d3fb578365e09ea8c24d6c4b09724907a610d755407d38667f
+PersonalizationString = 846bcbc7014ca8c6fb042a80d4a8c3aa50b6c5eff15e4b12f966ab17e6514cbb22fb2eed628ee5c2a8acde821a956078
+EntropyInputReseed = b2aeab1165b150908c9bb52c2b7167c149ea4fb4710edc8acfbc63f7652bb552d636a7e6fc3d1e74d3f65461baaac087
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 2a0335c3caeeec7c797f99fbc145654d3985c3c71025c8e4bd4b098801f15d21c272420417d805b0ad1ce68f904502a46130246315957bc07a5db4f3447a84e7
+
+EntropyInput = 6942413e05ac487cf539bc61aa6866ef8cbd9d0f15e1385f37bba5a951a29fc956d46f8740603af7c71800048c8312ad
+PersonalizationString = 47ebb16c24bc17ad179e6730407526187cf9332c172ae56037aee471a0dcfa766fe51808c0a47fd06b9e34bded006c8b
+EntropyInputReseed = d8275ad1545bc24e77213ce1dfa480d3b7a56a2d5f26c1ab345f9f0ac712ad004b0f6f033b6014c0f78069f92840f62b
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 1b74cfa6344d294ec3ac8002c510b86c0b459cf7823aeb05336a20c1355a3193966fdc8ba8f7cc1371c9c70a9f7ff553c4c6dadf23f2cb08e4040af51f172ac0
+
+EntropyInput = 9c14646d104785546c4cf47396ff1ccdd26cc0cde8c20b5aa64aa0baeae87b58f348914081a1b31d9ae083a0b3588aa2
+PersonalizationString = 2476edda7543edfdd3970ae9b27924424955b9588011bf7eabd96456ffffc4c9a08e6b814b7da32d680c2575f9b89e66
+EntropyInputReseed = 04154128284836621bbe445148f71e60dd8421327a0fbf7fce07d6f40a88cf098d4f775fb78155e7e9095a1f635d265f
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = df70ff84c416964cec9231c308657f918124b75ac93eec8083e76aca89f92a1c6b54df3977003175484bcd6fd5ab5b4a902d775c32ddd8bcf2359b660df1691f
+
+EntropyInput = d20464faf411c7d84e673cdb7058d0451be60a4c54b419ec60cceca757fb97dfc4f0b91e66b35295d68e867463496944
+PersonalizationString = bdd2842555cb7a3ff2ce2743b6c7e3cb465ccbbc044fc5c2faf35ee99413fd1f87915704cb82fcd62c500cf4fd5a430c
+EntropyInputReseed = ce02ee2c647dc9a455322a142b9226f96eb53c2a99513a7ab349db702cdc55c88125f4ee5aa82a214796b2dae6209138
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = acc5fd672fa83b2daae703bacf218c98ac29d0751d9d5c9b7bc68582fbd593b1a691acb125bef3c2edc125f9b73ca3391958b3bdd8007fc50422cbf89b00ca05
+
+EntropyInput = 44927d98e9c275ad4d07bda6b4c62b29fe562927fb1ee718473b3c74b9b2189a133c11aec3607d39d623ef35096a055f
+PersonalizationString = 8c40c5317f29b64da7f4025cda90ae3e99ba1ed350482048f8411af8b694a99272625031716c090f68c0fddc7a701e0d
+EntropyInputReseed = cb7933c3c803644d4ab7c35b941319bebf6784f98c04754c69359e10c9693b57ae12e38b08ca8a9f0f15142c4476f0bc
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = e95d375c7b3354190721d598e8fde7aef16fb2a9dc963ed76eef6a12abe2001622725a8e1545c73c9a85995e6b07806e2ac39b179b595bcfd96b2189b5d10497
+
+EntropyInput = ae7ebe062971f5eb32e5b21444750785de816595ad2cbe80a209c8f8ab04b5468166de8c6ae522d8f10b56386a3b424f
+PersonalizationString = 55860dae57fcac297087c137efb796878a75868f6e7681114e9b73ed0c67e3c62bfc9f5d77e8caa59bcdb223f4ffd247
+EntropyInputReseed = a42407931bfeca70e6ee5dd197021a129525051c07468e8b25587c5ad50abe9204e882fe847b8fd47cf7b4360e5aa034
+AdditionalInputReseed = ee4c88d1eb05f4853663eada501d2fc4b4984b283a88db579af2113031e03d9bc570de943dd168918f3ba8065581fea7
+AdditionalInput1 = 4b4b03ef19b0f259dca2b3ee3ae4cd86c3895a784b3d8eee043a2003c08289f8fffdad141e6b1ab2174d8d5d79c1e581
+AdditionalInput2 = 3062b33f116b46e20fe3c354726ae9b2a3a4c51922c8107863cb86f1f0bdad7554075659d91c371e2b11b1e8106a1ed5
+ReturnedBits = 0d270518baeafac160ff1cb28c11ef68712c764c0c01674e6c9ca2cc9c7e0e8accfd3c753635ee070081eee7628af6187fbc2854b3c204461a796cf3f3fcb092
+
+EntropyInput = cc1f1e4f22c7d78bc7a459834522e85a09bbf6cddcd3737ef98ff0de950bf2899f6c27b55a050baab0302c0144c432f4
+PersonalizationString = 49d895ca0db6837af2faa650884475e800e72005365dd8c97ac55bbb824c4209903ba440b0129c9efc420b4dd74e56cb
+EntropyInputReseed = 001cdf1483bf3fa17dcab30e40fa900a4ddd78012a62c69d847c51090e0898f15f9a3e7efd5f5fbf380c95791db9fcce
+AdditionalInputReseed = f87d37599cc79460554affb532dfad3393a3f925cc119ec3c7fef178b49adc838a38f395091add5e78a9733b38347168
+AdditionalInput1 = 9f0db48e5a148570d15232f568216216eba4fccc1c52a1e73f197a5e1625e45da8369bb29afcdbb6cb3188a9004bb47b
+AdditionalInput2 = e7bb505a8196428faa5c40c6dd9b8740c2469ea5eba1b507227833a16e96fb2e8d2eb227368c817ccf3ce785ed3275f0
+ReturnedBits = a3eca2adeb14d306df139f280604980207229f7d72806e9e2f7b916078de0e09f1a7b2cac41bf01812bf80c1b13cd22744adce23e1e2000146c6236fb67a923c
+
+EntropyInput = e43943df12f899fe7fbe1e657d1b3d22f6371b96e07ac89a82c156c1e28bf33922f8d1316d524cdcb9af349c14fa2308
+PersonalizationString = 0e2c55b023d45361c4e7c50aad6b0b97a19fe703661cbce3a74d29f1319f048ddf00e01b6617a3ab643c1c6e39d7420e
+EntropyInputReseed = 35b7f479071271b61d075b0c0be3e0d10cff77d975492a93a53cac28c5dd6e9ffd390a1e651f0bb3ee688b77b8203553
+AdditionalInputReseed = 45045c97d7118f75429c1426a4e16a435988e334e4e066bd8e2fdb8bfcfc783e32f7ce81972926b3e1b42e5b7dfe8eb9
+AdditionalInput1 = 56bfee26285152a11483f7ae951cae3b80eb11a13a1370fd10d6a5e259d84bac37aa2cbb3c7577f392d31876c3ea1051
+AdditionalInput2 = 8ff69acb968b1bc3bebb71fac820b0ed44513022a30af46465dbd0285aabf1c51f9d80acebd3467989dddc9ba3c1c491
+ReturnedBits = 1e77b4ccd61c11732f2c6f0f060e0fd03c9e1734c1ea1ec980490a1d9f5b003629aaaf05405207394765ba420994ea694ffb3fb1e5d1194f5e2ceafa3fc4e3bd
+
+EntropyInput = 0d94c5624352e44f8426c77a96aae94094ad1498c43a501121f7788a356b1b02a16abc9248375a9974eb7b3caf3cb309
+PersonalizationString = b665eb6b67f213968a35b2c006ec99a4fd935c79bcf5a7e0286793c113ed18d475e2904672ff709a4226f2ab451f20d6
+EntropyInputReseed = 3847e83734d3ba20b9036ced968267c91965e3b4bf6a95298aeafc771cd72040ba5fa8de47e170374eedeac3619e3970
+AdditionalInputReseed = 8aab0554d39c30ddbe8421c0cbbd2924e5c5841e9194dcb41297ea54abbc49153f10a7aeeb878c01659f4073124bae25
+AdditionalInput1 = 4a6b0e63f6cbebf0636145c9424af07d1b36276d214592f825965ce80521966a8a6a7d1a58074772131d6b528a7454d0
+AdditionalInput2 = 25cff55c776047583586901c1f730de3d86fb912c40694b0926cfb6ece1996578af6f15c35f6b2cf82adbd4bf6e0b3ab
+ReturnedBits = ec7d74074d8183a0df885c28c1001f80fe00977584c8667ded0bd3630f554489990a94ab40ee2f01d9fdb4e2d0f7bb0e00d41c6b6c568ade2c2394a2b32a1f14
+
+EntropyInput = 86b4437092cd13f427431ff7b55d3b9fd87326415fbacbd66eeb6c43a490c0fe3398837776788f67727d632a603bdf2a
+PersonalizationString = e236ba93937034ae24f18f4ebd134179a35d2569cf2baf0af430547bc5e2ec4f6db336bfa88d181970675875e5fbe1ab
+EntropyInputReseed = 164084c70f3bbb159b82f13ed3d813fa7a07756a96037be06b55611d98fce609872e65507b99b503b0959cad84372aa9
+AdditionalInputReseed = aa7ee7fec74223dda7304e43aefa8ceb5144db04d98b7392ab097005a3a12387ee1bbe3662a0bd277878855ac892dc94
+AdditionalInput1 = ec19a5d7d66a6034ef83ffdb24ac54e9d3d38f0517ed7edbb9a3acb648e4c4b02f974875cd3149b37432ae5d3b0d90ee
+AdditionalInput2 = 98ea0624bfc95d0c0f7b810c464ef22e94c12392df5414cf6e6201c2d7db2e8570f09541334db0f1358b5c0fa2cf6d77
+ReturnedBits = a27facdbdbf49e64b55390beb35260a0713ab913d7e5a08aaf01e83cc94503e32d6a44a770f7a9ef6d3a9f96d3a33859d568dbf3e856fd91177a05fbf99dc4fb
+
+EntropyInput = 1a77f33bfceeadf68b79dd40ee856e9e0668059179783fa73d91f588eff242bce11dc66ccb90310b291f4a963f2a96b4
+PersonalizationString = 98435fc821606772894e46c55356fa883f0afb1b1f4ee40fa56cac09ccbdc38b7d3a3fb2571d2fcb9eb5918b60c0ba3e
+EntropyInputReseed = 6b0a37515249ab5e26605bd08cbc7f5523f4e552f006faa7c2433132c0a45feb875c8801ec35454a1eb13604efdb3325
+AdditionalInputReseed = c6ba05b7197e06f11b35a7824f6b8f51afe1d6cd80640697567b934daa62acbe731ad8ba2fc78217decec4cebd46d522
+AdditionalInput1 = 2eba463e52ff2a180aad3493e9476a4b972bf32c9ccb13efabf0624f1c44df8048c8c6472f73fdaa60127e669a432294
+AdditionalInput2 = 25110798e06af473013a2a04f359e15fdfdd0306b8b928985f67872bbaa44cef5793ac14d6a99d05d2c2692d08d5e396
+ReturnedBits = 927902f75f10c5880f0d930ca6c36a20c7e4f2535672714f96bef72d77b0f8718e4546e4e3fa2e7b245e4dedb7425ea678a18edadc90ade86bc261992b02bd9a
+
+EntropyInput = 4fada58a9fca48a9572cb9fd1de380a2d9e039971487ad53a5f8c8641350d05432dcfb683131380d35cf1c6d474e4f3d
+PersonalizationString = a0b453b3f86b455c02d27df347775366ae01466c9aba27d51c75928ad1f31b278bc0e4052ef702d995f302c31394f943
+EntropyInputReseed = 6cd3b9ec6e0dfcfc3caa90ad2812d09513310ebd9506064d05a59d68a94405388afa313518a7055e29b2e2fc52a9a988
+AdditionalInputReseed = 39aa041c27cd50f6d4356d7bf90243ba4f6964348a882ca50330c6f398f0b8992bc3c6da90e0cd57077aa0a9da48016b
+AdditionalInput1 = c6e342a2365afaf61da40a91fe6ba950b0a10a05cc68f5ffde7cb12ca4650ffab8178b1fd6eb07c6e369b2ea41dc2adb
+AdditionalInput2 = 755c6210636079ab966fa29568975de980b0e5dbe4ea1fc1d3a86e217ff6b57dc04d7a713779e929d4227757161e1dfd
+ReturnedBits = 02a600e072873e396ae4df5d7119dcf00c256bdba76808419a50d41036bee15fcd3d6fbe03f225a4870386d44e735af51ce414f5c703ee9db516b562b412bbc9
+
+EntropyInput = 8598996f8b6adcb8ac644d7384eb95bf6f9529ac0f3dabd238855e6d4545c43b85bff29976d67cf1c97b4b33301767b1
+PersonalizationString = ff207a4f36eb9daedce0acd99e63913c16c368b467562a92ea2c47cc4dd6b5c9b637691d6d07f61c05f4b86954a2bd26
+EntropyInputReseed = 5a748c44bee475862db1e0d1d49679e934b03a5a4b199dddcb5e6a91acc01263fdc8eaabdf7ae0fb7b752b20731b03d1
+AdditionalInputReseed = 9498d3a665f78745d65a04141420cb5ca1389c154782fa10174e484cf7bf27f8292bad48956e2a16dc80ad135379c2a8
+AdditionalInput1 = a1f1b6815799ed98f3056247c71c17485ec61583922116cdf4ceb8fba24b80f087cf919f3aae6962ae2a353305469151
+AdditionalInput2 = b6f256ef1c62d4d7b06057cc93968eeb18c5474d0bb8c218d36d89097a89d75991ad80c9e39537515c5aec3e55b32051
+ReturnedBits = 2b69dfb0eb743eaf892689117a3017a62de63f653ea7440fb29c473d0b729e649a416fee202b2de94e19e0915c38fcbb8139da4076caca865f0124ae8b6bacd2
+
+EntropyInput = 77a9549d33e350a7183956bb94746d32d3649ccde8a58f7b8e78d54dc20cb18a6758f454b8727cb347ebfb543056f951
+PersonalizationString = f449339c1eaef6e656325039baaf4bec9e12541777e99b2bf3b3c8077d8f9570f959cc18e50bcc01dafa91f80a8f9d6e
+EntropyInputReseed = 0812e9b471136b0b11dabe902e76f6ef0782faf065506f2d21ef7d4bba85c9536a10dfbfbf0d4fb05c6747e9a632aeba
+AdditionalInputReseed = 56f2783773f8ebcb0428d1252b6a467249cf9a2fabc5ef084a3562ac57665c05f8214eb6a1af29a2ab673fc1a70de177
+AdditionalInput1 = 368c3091d70d55cfb09a97a6c79cae156a45fb1d53a12615f0f1f463be075273a311ad9e414291cd51cf82aa81a2db42
+AdditionalInput2 = 31a6b734e6f9b12eafb2ea23d0d8dfcf74677fd37f83c9e949f4b46df56f5c1e15de91308c43848fb0e12bda36be13fd
+ReturnedBits = c468579291e3906a13ad7475a056eebe940adc2f06d195cc686bc425206eba21717cdfc79fb63f6b0f1b78205d99429b5574630670f9abdac1527ede9efeb0ed
+
+EntropyInput = 614d942269485164739eb19b28ef1630c69d0ef4e9a432bd82240c0760f2fd0812a66eac75f0bd71f185ad06d06cab4e
+PersonalizationString = c25d67676e2938fb261406bd65f1fbe7f992979a655bdaba40fdd8fe788717328cf4fdaa22f386e5341677313baced1f
+EntropyInputReseed = 534dba01adbf78e67cbc5082ab0c0895d22a7c9634483afbb949c09a4638fa28e33b4ad78b024bc639f38f7710ff004f
+AdditionalInputReseed = aa83ad17b8ca4c9826aeba8b34e25e988c3335d653f12749b2195e7343fd66831343203a7f45be2b54c4b2e6d94f6f09
+AdditionalInput1 = 6b8e07fe59f911ce5e342bcec2ea7e3fa89b21b83ff75514a8bf178b3628a883b8282bc4e1fccb63d6db0b0a2d462d5a
+AdditionalInput2 = 56c25835927f85a36a9ad5ce311999976d649b2542426f103b9c4396284d0fb85c62a25206d20bc485f76a63962d2a98
+ReturnedBits = 67c675cd166d68ba4a9ed07ac6ecde44d98f80ca9b6d58dcb2e8cf4a6c92d948b705c448c8240599245ac87674b6beee01f20b93b721eaf01794c59d6630ddab
+
+EntropyInput = 73a0a9e3a187cf980af3970b404c8585d78c4e1c06f88b9110d4b1f27fedfeab5c9458bb5d227de58e703a8d40aecdfa
+PersonalizationString = bef4beac0a3b085c626014d368fa531b42d781873656ec384fb19674f88a9ea4ab349a5a8c0685ab23ec89b4ab35718b
+EntropyInputReseed = 416ef85f8f201b2b00b95f2ed8477c1b61e6043bfc4a075a479da6381413ccb248c667af2e2bbc776af38a61c9e4ef56
+AdditionalInputReseed = 43326592d4d674dec7d7c18f76e1006af18e461000c495c56d25f40b180a6cc512b991cb7a5b8e81ad53a1a3307a2f32
+AdditionalInput1 = f8776c1d1a2600ee34386c293da3831cd0fa37df3ef37ab8d8f84bbdc15595b5e733adb6a86326e8a4dc77cf03c3be97
+AdditionalInput2 = 2b369b921653e1aaf66af65b066f710d6c5da4abd19184ef84956260db343615846edd856f7fa5a1726643203b8a8cd3
+ReturnedBits = be598f181cc3ef73f9dca41bae4e9ab776d84473c16ced605d4e1aaebc58ca1b868bbcd139a1d4e65ca1628e413b7f1d061e569028f1ebbcfebaf279820f0900
+
+EntropyInput = 7cafced429930e197f8e092eb71908986bfafd7f07c5298e6f4f88ed94085ed92f6af768437ff8bdc8f44e17ccbb83e9
+PersonalizationString = c0b435a51c08532beb1264dc51c3271a5120e005ca1ff209031905d370c9509213b90c7e620cf0ad55fdbf15b2ff341f
+EntropyInputReseed = f59efd8d253142a0346310b1467eea0f49f9e039cb0c6954516a5228896cb0edb5e46c863575842cdccf556ac1ba3ede
+AdditionalInputReseed = b64c2dc0573f0d8740a5f934e3ccc2e3bb1dd01a9a50efb516dbbe581566cfade2b521b885295b535aadb05a76b7ccec
+AdditionalInput1 = 418a232934120f0fd34fb4a84e820fb62408921677e971d7f339497362e3eaa1dead14d2cdf1e2f0e3fccbcec3e740b2
+AdditionalInput2 = c4ce8b89a8d99614fc9442bc647f5398ea20c02d5b7eaea6ce26bda4a957b289d8ee4a771ac2ede61aea9a9be5b685cf
+ReturnedBits = 1bed88ce25c4bd7ccc2ac9813c32ee7f128f560971944ce9a0d028c4706875482d3f648e5bc58edfc4e490ff754575501f605d5efc716fcc44bc5c6905a83d93
+
+EntropyInput = 16fa7055914debfde643da6938a927004b2d773f99507c6de1bc661d914bc2d633d3c274fc6239b3e48440c03d808521
+PersonalizationString = e295e16af5d41f8ff3ac89cf3b8bb5bb542f6b3473642cc93448fa3ab78e20677f88dde226955852f07e3f32e0812cbc
+EntropyInputReseed = 0071bcc9e440b177aa6ddcef178e728f49239e58c762a1448168fec7156bedf106f79790cc69616484a48f93ac086882
+AdditionalInputReseed = 0b508ccf331f0dc69e63b548a90970d6a1d5d0e4941a70571ac13dc904ed19e6e0a3a582bd6d979d45934de92987eb53
+AdditionalInput1 = b496749710efa71e6ab4e3ed2f3755fdec00ec51e85bbdb9f62fa5c67fe3882ee91f404ff003e0e162280deb6bf648af
+AdditionalInput2 = 755341c4628a60b7af20e4842b2912d083b5db8bb0b14ddf3cde54f6fa10f1381b0d07e69a87a6f015616bed966edd49
+ReturnedBits = 5fda954f37f7f02e37805c7888f9cf46ae8f3aca9843d0e8fdc7614bc889a20659b3eb2884286ce0e4b7edff9114ee4bd8cfa173b31b2dff3daeddf19fbf88e4
+
+EntropyInput = 4499770617476fe6b1c48a31431a3049f42af931c28b4860fe0dae138e70b5d2f643ff9271934fb1c9d6ccde839fd55f
+PersonalizationString = 164aab76bf813313936e2a022c07fd74908e5790f0bdb92addf029de6e5f7d09b01080a4abc9542ea49fc88545d15334
+EntropyInputReseed = 0d6ec2b81fa56f5b0d0bab648a8b7b686e0b6fefb4a517f8726638a1c9dac7d333ebdd7d71c06db5136b930e5c776ef9
+AdditionalInputReseed = 78088587926aecfa25081cd811f91795c60fc18862eec5a90b0b38e8197684623450cec1b444dd2afbbb1e52ee184f4e
+AdditionalInput1 = 3c32bb43f80bdeceafdbc46a6fd43300bf99f26e8775ff31281e0ab0b3592eabe7eb2ebfe75cc461b2d804edb409b2f6
+AdditionalInput2 = 2ae54d1e993bbcadeef2e8349fb7e64f19e042ba3ab4e9582bfd87c9e188469ff3a9cce3ab914a59dc466962f0fd9a52
+ReturnedBits = b2393143e2f7c86a6bb82b5c40945f949e6eccc05f8ae53cd5c6d8321c01df715a294f2f7871c0e418f047579327db151d3cb0b0d3868ac962012c2b06f594a3
+
+EntropyInput = 7083275a4e52de2a4a96b2bff5e9abd976810ed6bc0ecdaeedaceb90e07eefddfa52ef326e22b508806044199b274027
+PersonalizationString = 3b9fb593266fc548421752a705dfe11de5cf1e1a3f6d17c2a9a879bc9dbe2e254f79e73ddea446994f68b318bfaab979
+EntropyInputReseed = bcbf9b7af08ce504aa7c087d6f22b9e47b40cf7bdc81f332beb9446c33d26bf47460cf70ff1625128ca92f5b0af73a9a
+AdditionalInputReseed = f9c016d2a00c572f8c0c9deaa23db135e738ed704cc637bf4991c125afe7328a6a74e67c0bf365446b583b3a6451c2bc
+AdditionalInput1 = 588eb722d4066ce1e9148d2e7a6d43d1d8b4886bd97f36f24599dcdedb638d2e7cfc4b5ea46a45e1474bc18b21b07f14
+AdditionalInput2 = 1b4e904a6b861201028506075d7d7fecb81158ea3749421d4d4710ba0fcb157b5019dbca199c8302d34745cb0c2330b1
+ReturnedBits = d155941b54ab48dc1866641c034b117d6dd8a7d068d29201105d845315dbc747afd8fb1f9ba5c976c75ff8c7052aff7b342c1489bc0c9f8a7d898b88ed0d5746
+
+EntropyInput = fca0b6e557f51430dd787ab4d33f18d9aec219629d1b839a35caafc825ab55be6a880321be58c16eacb945b7bb7cadb7
+PersonalizationString =
+EntropyInputReseed = 7b684923ae50866f710d3b5b2edf2445593fe66d15f2dc735e2b0c278f1cc9735075dd268b91408ef73d550423545adc
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 29375671407b1a45b9fd8b4f507dda234822d557e48b9a52997b13757e0c2f796c8741f94bc2bd0d8c98e5e25e4cee65e4dd634c98bc3b66fb6279f9468ac841
+
+EntropyInput = f60f7773f21a719e98c10d1963f40690af58c38c815ba6507f768346f8957e4c2e9c94932cb8aec544c1dc7765912f7a
+PersonalizationString =
+EntropyInputReseed = 3a4f75ac9b19c45fba3ead79165ade8ca56d33d0bfb2d9e0bc2e4a9faa2d86a774c737d23a33a860bd4bc42c1571c160
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 10f386267bdb885ddb55fcb506851ef14f598dacf15bc81195e37f3facde8b65291d0355818a75d96d4a6505789729cc2c5d199a232cb9d1173e90da71ccb8ac
+
+EntropyInput = f375d3d9f856f3313fbbb2ecda7972e7cfe2476618005395a365165a2d755a26d04452d4f9ab1b6fb4d4e31356057036
+PersonalizationString =
+EntropyInputReseed = ffb9bb892f95fe3c95cc78990e8d9caba04d613fa5f34899a592bdf5de197098ca4b6efdcbbc237a344c66520c11112e
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = f8f6921d96dfb65f038ca993c017b228a2283b3b8fcb5b22a3d6c0f82d7cf2a68bc721f113bf376b256bf7389f31a1975b3040cdea9e11b83b23cc26ed15a781
+
+EntropyInput = 401dd50c9596e92db41165ba0edd6389773d8096cca1fc596e4a58b78f0ccf721696f2baf2ad874687b5d6b1d960bf15
+PersonalizationString =
+EntropyInputReseed = 8c4df6fc9b35815d9d5a2ddd8a62434c8992ce1c21add1b96fe1e17486b77ae338fc655b327686bba011991b85b2fa0d
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 29b9b2127d14165bbfbd0755a96506b8cbdf9416f37616beeca44d94d52f132118dc5a93a9494b058275788ed20835374181128af62e0d862051115f0399636e
+
+EntropyInput = d3ff8f5590ecc63f1dad8a15a5d245db5138a49d2af8ef8901dfaa3a6aede3b3c8b805dfdae73f622ef608de433c417c
+PersonalizationString =
+EntropyInputReseed = d7908ac9d3b4b7c46600c47f1647ddcc621b71b75530fd9bcfe05e26f82dbfa65a60a9614f0a09d0366419023ed9f4db
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = b83d06fc0e5bd3399d716c7e3cd8029f79da4e03a177ddf4250c400aa4f4f9408333813c9cee371a4d9f4246aa7fe4b20fa936a916b3e1fa73901ce28df567cc
+
+EntropyInput = 114bb346cf39f2b19a0c003e978095b6a5448b739b6bedba1d41053f792d0a34c62eb9ff08c0d161d369e8aea9f68182
+PersonalizationString =
+EntropyInputReseed = 7359d23ff081a776c2c9c3bced8e01b2c2c6dcb412a337066f4cf5c6c34994fc0f6da97012c982b15440ea0d6ac321ff
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 84840c712ba01824f85c23524024c2277ee69fe97eeb4429947ccedb3d29cc20417757625410f4f30a689badab5037668736f8be50f13adb7b8cd2e2b9761f39
+
+EntropyInput = 1d7ae2fedc12d7e746d259fd1786592220d5293d974bd8f0c39529c8417e04de1e44f8074fcb90734a5c648f5fbab787
+PersonalizationString =
+EntropyInputReseed = 8273c6ee3a82131464ee67591319f460ef13303a363167fb7b6c2b5489c7cd3436bb117bfd92a9e451cc3019adbe8fe4
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 05ada0ce82206c9d97f660f33e6b0c22bd263dab58c438f3a900f9b3062915ed2f272ce5110d85a7e554be3595e0ad0c05846fc3f07f35aafd32427f1b96b466
+
+EntropyInput = 10e75fc16aa860cc85b44e1d62bf05dd1954165944f5afcee8b714778f0e2c46e6709cb9ee7dca65d27c58db322d8556
+PersonalizationString =
+EntropyInputReseed = 677c9181aa6c596117255f46b69fbc2d644557bb8cf7275ecf15d258e0559b6a55e316f77c88d4470ef55d9b4d015f9e
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 6dabd2c41d073e32bdc26af05964619450482d74c6a53b5f29e5669b0379de221f31727d530365db2716066bde883e07aa679e8011be1d5013140a7f97d73ffc
+
+EntropyInput = 00e48717e8ea0f203dcc3a60aca98f1af8bbde961311dda24bb8c414512c2698fe085954979d7615bf20a7bcb73ea7a5
+PersonalizationString =
+EntropyInputReseed = 41b3bd282dc0d96abc61dbdd1e3d614b664c9363fd0a5444084f46eb10d8f76c02a0c60cb821706b65335f04c55f24d7
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 216b0bb73fa63040c44b451f8b8dd79d2e6e9b27aa51be43a6319641e55301956dd7feb145a8e5058e83a55445cdb48e50a709d0d2f7f1f34ea1646b66218481
+
+EntropyInput = 52740d9061b0960f627fc8c698b7bbdb80d599bc32b6b8c50745c9bf19415e8ff7ec792d416589322e50ea0142601fd7
+PersonalizationString =
+EntropyInputReseed = bb232ba5a35848d324dfe295697421250469185508cc79fcbc79535d0a43dd4f1640c43251a2b2c290f0ae82e5f4e7bc
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 1c93d4dbd97254eeda5bc25a362db4b8b678afb01700e37df532fd394d9b7955368a286bd2832873bb01ec1cc3093a10c1c223fb0bf20472342707247ca4e3c8
+
+EntropyInput = 00a9489b6eaaa9d781e5b3a6aa7a877980cdcd43f9989da4ded7edca9a7055dbdeb453668e9b2aff3df6279abf2f41d1
+PersonalizationString =
+EntropyInputReseed = 491ad63bbdaf1a3cecc20a94a02354d3f9e05dbab9be9b9fab21b74b44c1d7490331c36bb85325117c9fa98802a58f77
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = ec0e9bf5c3d20cabfeff7948851f5d51ffaee6345d90480e5601ea1cf7dc4d04bda3ea0cee4387cf922c07df820fc82b8d0385a7df530c977797831f6bc36583
+
+EntropyInput = 1694aba5887e90e8621394229c3d58ec20b6fe24896d84397282845041a5519b32a8cba40510d97db6ea33eb934f11c2
+PersonalizationString =
+EntropyInputReseed = 6b01bbcfc83229948ef247817410beca2de237cedd569e47edd0e30d57fb2ab1b7b4e0ebace0916f72660e9d458f1db6
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 8dd46400dae35daa5f894df7a72d6f545abd1b6a56418719c9ef87692decc20e2c7bd92f2ce5acf5a62cd0dbed861a884cc2d30dd2b5227393ce1476a2c4224b
+
+EntropyInput = 43f4708876ba0294d22bd1bfc9a5e5c25069bcc0f46479b041ce1af49bce5cdc2455849bc34e6412c1036921ab430a05
+PersonalizationString =
+EntropyInputReseed = 53f20c82d1c0334845190d28f9f7caea7683ef4c6f76028bd68d1eefa17459a6f241c8f181907c1223c81d5f829751ca
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = dbaed592b10853da9fe816d2c70107ef55b678dbf145b2b37499740d56f188e1d0b7c8613503539a622cc06674bcd10c18f40969273bd3397db8689b7fafcad6
+
+EntropyInput = d3870857b486c2844051e9e5d937b1ff7c8c90a378a9ed766ec5e0a83e4311b83b92a8e8bd591d5b9af537158e34b3d7
+PersonalizationString =
+EntropyInputReseed = f48c355124c34e020fde83532c626766c71b85e3214d37aa63b4f30015969524281873a6ec9e47c2b0a61e23d7823ac1
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 62fe61cc6be713293231979df124258066dd3bc56f44333889783da7fd8075d8be6239bed1becdfbe6bd71352bc77c38d9511be5df7a7dbdc40d7f236d0e8d20
+
+EntropyInput = 68e91e73623fa6a3ce22f424e9db971459dfbe06601ccff96f1726fa18e61d5cdc1df97519c8e7190ab6aabf95bd1ee8
+PersonalizationString =
+EntropyInputReseed = 249b56dcdc4c5c8eaf796c8685a740fd4ea2455c135e0d7b8e50532fd87c95b781c8f3775c213c2714eecef140125b78
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = a15d3d61408ddea3b9753c854c693ca1a91cf49d172160bf15f512f345bb1bda9aa7bc4fcce177fdfebb3fea4cc6404c6024527ea662669a5eb78753822bfdd3
+
+EntropyInput = 791fa5e81f80e8b141e228a0d623436f3bb523d8a03e98b0234705cd8b9d94be9794a2f6ffe029a853a627f9260fbc7e
+PersonalizationString =
+EntropyInputReseed = fe04245537637cef4c8c5cd33ba941d5aa03ca9f1deb586979123521aa811598f81c0c443469b029bad0bb7fb0c99f82
+AdditionalInputReseed = efc127b013c34b70a9f284fd1df3be0f2885d3cabe0667762f0ea807340e29d65cc2c0f962f54357706ca0b6fc1f2e22
+AdditionalInput1 = 6c68a2f1e5955dc83829a7e5acbb9e110287524032f0ee914a783c561a1f444aeae68a35567d443c0c918e38c565067a
+AdditionalInput2 = 8a6825420531f924935cf338d68df99f0f7cfa32eb9d002468e6b2621f0955a82b2c4ac754ba0c8eed24c5d8e90363c6
+ReturnedBits = 658dd97b30a6432690c62322ee933b44dbe54d64644a59d9b944bff47c3dbc1c9f123a53b899d9b86dcfa1ed1d5fbfeeb9033dfdf291f9e843568309464d23d1
+
+EntropyInput = 67938e50e2d690cbd3b6e157f7d5ee7f0d540095c558e0560bef484abd67d7b0985adca78389aa467c63066f5f83053d
+PersonalizationString =
+EntropyInputReseed = 3dbf9aaadd0dc4db5d5e36fa770317c4ec2e573ab90f09dc1027a7ea241a9b23b70848e692ff3117d6519c258d58ea73
+AdditionalInputReseed = 046adc954297659c952885ffe568c0ad2b7b16041658841651b808167d99639f4ea32441848d03e148c4affc4beced13
+AdditionalInput1 = c3622ca849dc7093dcea24a146ae231d8a03f904a50c2187085bb76557b5e5babbb78f502e240c0379f4e6c72eaf3382
+AdditionalInput2 = f43785361012a3b7c6f0864a3cd382800c450be0e2f09c7737f5a4c3a198aaacc7879f9242e18334c94366051aa5f74f
+ReturnedBits = 2e958abbee0a85579b35b08a07e60bea67a472340b78dc3c3f5a2731828c3f4d8aef3fbb6fe622133c1504849dfa8f04621b5b3fe5d9ea64db70931dfdd622e3
+
+EntropyInput = 39c4026c129911586004fb5b48cb3d0eab465d1aed16a47199d7405137ff142829c507a66e7023f938d5cf03646f55c0
+PersonalizationString =
+EntropyInputReseed = 847630083543d0b331ffbddf0599530db94e378fdc172de2781a28f74d9437be2cb45232d9c68923922742dcf2acefd5
+AdditionalInputReseed = fc5a55d828af7ec6e6ce68d660c8fa2b85210167e012316b7c41588052b6d324414db3c477c07ddfb7e0b7fc76c59354
+AdditionalInput1 = 019db190c9b35fb0d35e2a921f2bf3576f1a1ff2c58957dd2ac4c745283ba917eddb5dea4079ef9a43ad0c5ea9fbddc2
+AdditionalInput2 = 51f1493eaf5647c3da74314dffa1f0af279b3b931aa040353331d90ec79d1c01ebd2f201457b7bb096ef80c7c94ef97a
+ReturnedBits = e8e221edb441470c5f0020f916b95b9ea818c828e3d36e67d463ddd135bef91387f569f2f2d7d0d91e4928696ec2fa9f5555bf9dbd022d1797a62f3e0b12926d
+
+EntropyInput = d44d6e6bc742c99460033a1028f51da38284a3a42244903db383cb2ce754df468ed07cfa4096d29532d13414de8101b3
+PersonalizationString =
+EntropyInputReseed = 90c63b624e22be43a599f5c5b066525b3dbcf16ae74baa9c84d0e56a6ba04b713f9d1b345292526fc8e8f6d82f4934d1
+AdditionalInputReseed = 91b21dc23b63992ee46dd09e35adf417bc3692aaa605ae0db0001f9e8b3ca3353da38308de5ad328f1363a334e880e09
+AdditionalInput1 = 969d8070e5a53551cbaa6c86924ff58c720fa4ee5a81f0224b64b0a0a1e4a64a3cdc695222c6f384e0bc5e3df1d76122
+AdditionalInput2 = 1e888983b398d0a5ff8f25b8dc692a8a6215a490b042c26ec1d6cbd0be24e7dbfb3fd910bf22a9fb78156dfa942d0ad8
+ReturnedBits = 0eed7d0b13b08694559d7438a7771c3127bfc0a351cffc1f5b328bdf7f6ffbdec66bfaa3d3f060399099126d4bf588b8c67b9f2ec509cf111befeda7ebfc5ad8
+
+EntropyInput = a526f4714b368303b46f213ca03f431c6d3f7ae0b0c6bae40ace63f27023fd6a8963b740deb4d12e924f8bde93191e1f
+PersonalizationString =
+EntropyInputReseed = b8f1454e8353e23ff3614fd855cbcc178b3c953455e70a981685e47bcee9b1b6d4462a4b1c490703273ee1a733e9a344
+AdditionalInputReseed = 4b51f0af1442cdab2497f35b581796dd5bf76997c3282f842fe288407ec983818e52d18ddc27d5a0ef16141c289b8f44
+AdditionalInput1 = 6c37cd5aa6db94a17ba3980067f25e03f65473b8f2dbe56a0f12452ac27099909e20332b394ab2364d5e803c9b05ceea
+AdditionalInput2 = 162a95c2b77ee5bb3012cf0c1831a7ee2ed3e07a350f3b065577791cef78c1afd49ba11780aaa1c44943d62d0fcd5bc9
+ReturnedBits = df894835e07073ba4f0f75c480f86878d1fbca27f7b4f9a826839d76ef172991df4fcc868b75408eca2a6eafb62f9ca6ad9a9335e363c627dfc8f232cf254a1e
+
+EntropyInput = e7cf1741478a81e4090ce208c5b8300ceb5487e06c83dee08605109cb00cb52d1c3a72187122c965f68c5e7e54a8ea10
+PersonalizationString =
+EntropyInputReseed = 0809aa013110fcd6e703cd5f474036f7ee4cd191c5227cee6c509e86324e7b2f9668bdb40629e51704ed166426be483e
+AdditionalInputReseed = d653eaed493ff4c2791d5f186c442dd48b7ee4666c90426b8293f82130b246f59085fa2b82c2597d907b35cd3f2900e5
+AdditionalInput1 = 4390649973c34e1a368b554d912397f425adb3d96ae79829eb64f3c3fb2756692e6612dbcced4b3cd334bb7880c34cb9
+AdditionalInput2 = b09e0dfd270672ea553790163750d0073fe156799d23be5dcf78d784c7ecb4d4ec054f309c704ba4e153ae3fcc60d3b5
+ReturnedBits = 9e2fb5e669c49f12ab989aae822e129134bf5b1119c69c92dafcf53a7dd1f7055c6b2e57bb59259d2c486e33a2ec41be3fd967997be9b0c7b11cd790f3b30c7c
+
+EntropyInput = 809f1f12374609f0111c347fb88935ac53d473f5f7e093898001e9c4a81ed078cdf5eefa0b166826c632d13b1a0d937c
+PersonalizationString =
+EntropyInputReseed = f2d01828e4ae757d90c36fe5ad183378ac442c07b4741c85cc340c8626f56472f0eac7bf4848fa18efba8d37d1998c4a
+AdditionalInputReseed = 80a346bd1c05f00c08d9e6c10ac0fc386806cc22d62ec9dbc2eb30131ae7d89aa91a67a848d01bb8d9eb8a9326c4cc81
+AdditionalInput1 = 0fc7cb589cbc141111f557d852c5cf47633f4430bafde14725420610f6c22777ca9394d44dc1701aaae0a6f2362789b9
+AdditionalInput2 = ed60a2a96cef442ecb1b0b8311d5470f425fb60cd1ca81d4846be2d45ebbf857cdd58cb22a72578703759fcfe697a3cc
+ReturnedBits = a0a7d16bd83e64afaf0ad5c1378f341a6acefddb15a10566bd231ed7437961c50a47ef8b032389fd8a5273cf926c70b1cebfcfb93176fec64da8810e93eec53c
+
+EntropyInput = b89c724262f8ebe3c29e8c8bf992959e3b7f42a5abf0d336b827f6b68482bf9a75b5f11574affe929bae0cfdf213bd3d
+PersonalizationString =
+EntropyInputReseed = 7a131fe412b25a66d40ecb9ed7c5cd5d0e85c33c72ec7796fd6320f3fdfe9c710996973d7af3af539aebb4e687d16af6
+AdditionalInputReseed = 3a3b2a07c58770ef94cd0fa6348acd060df2fde26e67473d43de7a929b0df7ae359ee3b36a3707d27d2936a56e53f7e0
+AdditionalInput1 = 5f9be21ee124776b931c1884f4760396cd041604803ac8631479e0b0dd900d1866d8b0b441db82bc66d5c0da79b4f8a7
+AdditionalInput2 = 6820aba25b1af7fd7a0879dfdd6ed132ee5d0ba892f75e31ffb0ad0eea6f3ea37a421e06bb7465c3259e59c4a7e07833
+ReturnedBits = 2a44d6854ebe709e264b253ff1e0a7e45e6c996f5ee5c371ece0acc7bcfd5593fc2a0dcd4fad29820ddb9d610557b4e3619009a15c853a5e46f0661b727d41e8
+
+EntropyInput = 2b1fe5b6d42a712ae659aa1b622333920e3b08255ad408803301f8cb9f82b95a691f66922173affbeb9da35d40cf2d1c
+PersonalizationString =
+EntropyInputReseed = 2ff29776ef48c0d20308d07fa0269513866a59db42a1daf8ee75d8f563388cb57cc663ff2570c2fe4a40752531e0c779
+AdditionalInputReseed = a2c6d344decbbefab1764c424001442455c9e87c06d62bee63d6d18b87ced4ece28d6c0fec4140409922915f0744d3ae
+AdditionalInput1 = 01cc142d20a20187c3c72cdfc3002e4da99a09964af9a00d0001f348383373c43fbece5946a9da9e5083321db905e0ef
+AdditionalInput2 = 38a60806c08f0d0affcf1d3045a209cde97c89af7dc7c0bb1e160e4783ce5defd651767406faf65f15b0c5f6ea191a6e
+ReturnedBits = 335dada20ad687460882b64061994b860e74d053f5397e0b700c9db610f9b4650141f25dc24e69ff1eb63612cb2b3b905d2922ac88b091ccce523b1c62cd14f3
+
+EntropyInput = 5453008743d1d5da6acf27e8c36164b2fc13fca4e283bd8734f0f5b27fcbbc4d622a8fa21add0403fb70e15f8d7ad228
+PersonalizationString =
+EntropyInputReseed = d6f8ce10dd87f31b35d2a080cb1ad3482d1b3bf594d5fa7050dccdfe786797508a83b2aee185120f9a4c8393af87c97e
+AdditionalInputReseed = 4113be0717591bec73cbfd3c4c3c5742d20c5e9b48b6ec7000f112cec4693dcfc193bb949dca2fd1ac9d67f08ba71407
+AdditionalInput1 = 87c949f59d225b253ec616a2827c28197fff5105a123d96e8bacdd2883b8cd570f20f6d5d64b3fdd6bc88ee227e28bab
+AdditionalInput2 = 5e8a1aab2cf9724466d298943cbbbcc0f2763929ff7cbfb4215ff67cb54c0581d93c952c82012bd704bf66e76a9b78e6
+ReturnedBits = de38c173137520044713377ce2b4e672ab7f1aae1a88c4a3b78a2adf76d958b5aa6c9345cdeb00c35f099cf05ae85f7affb32aa4e5be43ecc406f71c779e0207
+
+EntropyInput = 1db147affb57d3ee431f1799ecd2a18bc45ad735d1409c9b709e1f2a2b20752d04167d7939d91536769b61c2299b4aeb
+PersonalizationString =
+EntropyInputReseed = 449a7536197b2356380bb442fe26fb846fddea8be76ec6dee463837d2e2b5511830907158d4f84de5bbac1374d1320c8
+AdditionalInputReseed = ce2177555560a5439381e087f5abef9a1bcef28d62d1b5bb801761d9db9a81c6270b9eed793fe5b88365f935419ce485
+AdditionalInput1 = 4d3c0b970f3f337456400731e8ac667ab517343f0bd03260066a73afde92c9d5676a595dd943837e12e9cb5c9ba19bf8
+AdditionalInput2 = e0690ee6a3dab9a0064b9f662465f3bd64ef5817e1576d1a0314cd5310050e9eecce9af2ab25d0bc75d52a7fe5c8b83d
+ReturnedBits = e2b0d8a44e3f8ba7fa4dfebd5345a90996cea8df80cec9a728910d7fc5c094f53268fcee40251f6f47ba66192e3b8f3a627010ea35f111607c44758203c8395f
+
+EntropyInput = a4f060385b0850d47d0c0b0ac0ecda014b1fc6f937c29a07131a069a8e92c2cb6ccf7ec4020e66ffd5437c9e5d4cafce
+PersonalizationString =
+EntropyInputReseed = ef464980f1ce99630cdcbdcc21e8117e592fd7404d8232f6cfbb2c851b93c77a0c594b22b8cdc5b0ae94d448e8218c4f
+AdditionalInputReseed = 4f2f1b1589f613c23cbc066b1cbc89146c4709580a76dace352e9056b911063137d420f20818d10f2c4af5ffe3fbf013
+AdditionalInput1 = a98ed1989a0226f8a2ae30d03bb8270d486800fb7a3f9245d8fa5ee3ef7b7321cc1a7a4bdffb076f67e3cccaaf55af53
+AdditionalInput2 = 2ce165d56b2706b84b8d3d85baf9eb003199bcf8d9b162312182bc94e96fbb236e7a6cd25a1d676898085aad9eab5363
+ReturnedBits = a344fd1c8b3b8b315cc71f7ea08d7f7b672851856cce863f468e22c70f46ff1e6054cbbddbb9111c436df3dff2100b8379cad9bd4495067ab48a0f3a1b7b8013
+
+EntropyInput = 87c9a62efa5b0210148f2129958eb8486e444ab799d86c045262a07ca05f644003b5ce88fa05170f3b653c9b3fc2fbfd
+PersonalizationString =
+EntropyInputReseed = e89f2827fe7b200ca176043527b2ad8b31743495bb61f5fcd59fdd54a529803bd31ed38f51849ea42202d840f5a5d869
+AdditionalInputReseed = 21254ec3b1ad3abfc3c237bc6eac8fb173bbd996d9abcbce9c78dae649ce1c2acd9eae88a2e117aaa7337648377b2db7
+AdditionalInput1 = d813192893266cfdad9b9cd59aba0cc0d07d2ac884877cf9033b08e4e9877e708d2533cdeb604073ca1c921b696355c0
+AdditionalInput2 = fe1e3c460d8802743af6d88b1b2f0aacec8468037835af56e25a8a1cb48f6c3517a9e4d404d30c34186395da1729a67d
+ReturnedBits = 8e6d98a2f864ca795f5750e1404ec22414f8cbf270fd655450422c979597b6ea5df979d213da7e038cab9e2500d4cc8c4dec89bf7783aba6bc3b2bb280f4e194
+
+EntropyInput = d94860047179b75b27bff1657164f49e6da67d265aeb4826feaad524ea87acc5b8895eeee008d067234c46da14726544
+PersonalizationString =
+EntropyInputReseed = c4a34713f67c2f973bdd8f6ed58257aaa1ca049f413937660cc1a90deef075c7253a084d334423d5e8b8199cfebac2dd
+AdditionalInputReseed = cba120eabde18332c47d025be35520e8af7dfd95159910be86cafb747f17a92a5e66774c4cdbd905a2984c40e88fd7a5
+AdditionalInput1 = efa2f6eab2bfcf0527b2056716fb0a45c7c5df00f20caf0ab7c851511445cd78400dfa031856978f4323a377cff0b485
+AdditionalInput2 = 8ae9ecdecf2243b826bfb952c55c2eae59a449420e7bb8c046a5b03f76fda90ce5b13d5a21c74b0d961b2d1cb50df90b
+ReturnedBits = eba9165bc19b8316d6154756f9a8d7aede3aa424df4d425b4b9a1dd9d632f83b9488163b73e0e06a1fbcf9ffef3b5c8f6ba991ec94c57efc06b948f1e0724120
+
+EntropyInput = 2cb0d6e27de04e6a6e95af5c5e4cbf3f99788515a4e086baeaf09416eef5efcf04bd72e66f3b9b0f8cc0875865950e9d
+PersonalizationString =
+EntropyInputReseed = 700d72c6787eee748cf356e052954439bdc41e2c4e51f1ef3b7bf37c219f111e7c21f7072eede617c212cbcf541a33ba
+AdditionalInputReseed = 4594326335f47b935b2b669667cde02449f72b4dfd86d5a7d1aae3cc44b08e9411827066029dfe7d9c9e154ce21467d5
+AdditionalInput1 = ed3f47e59a12b36a42616b338c7a77a18e333d38abb9da4e36914b69f3c3476880705525170a320da26dc402c6afdf49
+AdditionalInput2 = 6e39b249f1b8111ff12fa24f9f2320df2dc8752e1541f556b5cedfff409b6a858490c27e052a63504c7131b438f44356
+ReturnedBits = 650bee69393d5d7793c8a5a40cae79bd470d15fdacab7b51b251f51dc5d3e383d28d808c7f9e018c71eccc80371a9e0267ba4053ec0e4c071d110942c43149c0
+
+EntropyInput = 91e15b57886156d0eae2eda3687cc4b617725647fc3423fb548f180338064ab66898005009c2c9c5f7c420d99e4f351a
+PersonalizationString = 7100bee1f8ca38f4f07b9910b12baece715222663a1d5c1699b5d4022c0e0b1a49c94b898e5318f6861b43a8f1a4a882
+EntropyInputReseed = 25da9700e7988a46b2fb44358fc3b140af96b9f85cfc747978e85afcca0bcc02e807af830b3c0e6960a60bbc2ded891b
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = eaa80c6f590f28cc7b5edbd3d8643a68f7e6de873b0b9d839b0ab96ca248bb4b9234b1c065857d936ce6dd0fc92d6b3cf98f3a29c16bb549f6dea4221226e550
+
+EntropyInput = 6e3b472fea5f25a79c5de859c0ff7e637f4cfac575878bf2016da2db6aff49de4589a59b266d50f5434f3ec4a3f218d3
+PersonalizationString = 7497e76bdd5df3dfecdff61a139bcde7da45d8e88f7bf120ca78ebd1f642b09d6eac78ce16ca05275bfadaa2e13ceaec
+EntropyInputReseed = 2be8a657b7f5dfd99e4c9378c4192e450a48e9152b5a6ed1219428a05a698f4229f549b50f06bdc1085006ec698826f7
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = f8a11ffdc1d3e06780071040f613bbbb40eb3dd47a2e6278779d25ed3356438a44aa4510bd2cd386c745996e156949bc5d7a1f2d8ab79892a605ff2c8a8019cc
+
+EntropyInput = 82f5ddd3a5422d536695190ab21473ff7c14a7f1f1a0cea9025b37bedb056ae9abd71e559e6c5cf0af69e6ed4af39876
+PersonalizationString = 5604279f9d3062f2c66f31148b2c14622469b595d02da1f1ad49a573bbb7a3cd5d50dc4af9d0e0f1bdd7079041b00d46
+EntropyInputReseed = c2ab5c98a6770bedff18baeaaff9c4656e9afa23caf9bfcadd9871c99ab4f933d4ce81d05fd1e58a903add27c3b9930f
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 698db7100c3df535c75587ca2342c70518f3a5ecb67a742f7c835d5913e0ca728ee94923e87fc9d5cc2160f70e699a3287da4265db0edefff8b19ae20e527de2
+
+EntropyInput = 9f71ab8537b7c4793dde60c6fee3d454f0e7065fe6c2c0844ff6cd838ba5ae9e77e87240f470f7251165a3316083083d
+PersonalizationString = 2977d0fdf366ffc139187bf74312451dc0ba0106efbcf23db1468da379edff5d2b06ca017fdb7b1c1d3edc0aa3cde848
+EntropyInputReseed = 122cbf6bc8e2b5dd7ed375e0d54f5f8d9391734fc34808af7367cb486d025822b8aae74de376b47586cdad374f0599e6
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 03de463685037aa94a5b83521a369e8cf7af62ec228e7c9615def0824a8e4711686695e03e339018cf70cea9c9590ac4e95694f09ee7d7d1b70eab65e1a034c1
+
+EntropyInput = ec2cb7fd1687eeb768e0aa90e50237f6f6b69460bb907a26b032f2e72bc20d9ae31c39440fee4637b3b9c609b0793b8a
+PersonalizationString = e36b7f06004829a89b97f840e41a1903ea858cce5d4b5b5c20f72d613b8bf319bf4745343e2c51b4ec0701938ad7ebdb
+EntropyInputReseed = 1ced71aa0db6a7dd04ab977ab33a9ec97de3934b1994516b48b1937777a917ae793d83b3dd50305dd236f277bcab922e
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = b9c83e1ff779bd79d296a5fa5ccad53c87df26ed364bc8b5c9f9a3eea548faa34149b68ca65f6f3947246c93f0bb4e4307e53f8626f176360896608135738f75
+
+EntropyInput = 3762819eb555277d06ed9323ab989cf5101887f594e83e4e6acb79c6e98f414a99a76e6de244e3e60ce0a2d7e8a99aef
+PersonalizationString = dc31a85491585c0e1c6a7fa4094540f77deedd92456e5e58a35f3066206d7ebbd6b9351d4f7e0ae23867c4d6e89e3c50
+EntropyInputReseed = aa86ce8363cec655cf3e617b5c1ff683478b15534c43f2967e64b25f97220d0a550102b9c81a243469d7f6ec3691586f
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 47f678be2f2306902cc4d1c3e612af029ba735105f2d631aa55e774d7127b8d86376724eb67f3f19867d6c57a61a2bc72fd2171df2c3b9e05e62faa8bcf6f5e2
+
+EntropyInput = ae978afd237a85e4de2cd31a18b9b38817d7f91882285c94dfc0905f46e484063e7aab1fde07eb63424d079a92b3c6d8
+PersonalizationString = 48f6c75b8b2dc01864b2ca28833a64a5462a4a3b5162bbf6d9bb48d46e96529b67f8651cd782ba7bbe2b5ff3fd8b204a
+EntropyInputReseed = 5e3d63b519f1ed0ddf0f16df034060e6c653436c79dff1a6e7832007287db394fbca527b57048f0086f8aeeb5c016f70
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = c3a5f9a7f2219e8ede06f2e601b2923e7c6b71c56f029e47d00d1dc1076753f0a725511f57d0f72c8c1c716f4eabcb8f978b23d3be572d8672a3eb58e4db4e54
+
+EntropyInput = 0a57f09c0623673fc5ca4db9816ccb021ffe39e7d83b4448c894ce8f4814903a3d9211819384374a2efb7b2e53f4eb0a
+PersonalizationString = f1ab27d8d7f7a4a4802c0dbae516454e385d5efbb84b652fae49caebc1f28e5cd3de4f7e9ab859d71e9df532ce3ff5d9
+EntropyInputReseed = 1ecfb8019fdfb96ff476337c1ed5b53c58d5101c0bd381a915c3553ee00c52f122b594bb2c6082fbc8b474e0ad870233
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = e3d7d1057450f9d8c67aed69fd4d5a22c5e7a3fd0e67679dcbed90d6c443517fdae20aa013cb9bff3f2806d4731430c427f3d2b2f5f46450af8b045940a459dc
+
+EntropyInput = 425955fdfa0f37f1ef8ff36ca9013520daee7fea30d7810b3fedcec31ba37f38fe510c91aa3a29795e474a851d3a515d
+PersonalizationString = 723d973aeeeb21bdb1450a39903348bf222e86d323dae0435f5eb82df9a0cec56c1ad483f9ebe9d19764ffe25579c6e5
+EntropyInputReseed = 1aa49cc9b8fc0cae63ac667a5fccc77757eec01ba2b6a96547dfbae1f0a78b9accf0d54495475476cba472d50638e718
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 7672606ba0e94b3333432a5b6a3ae1601848c151456be3c98617f5c7377aba1cfabe239573fbbccbf0a63af5b1f67b152e7e84bfd76e5483fd0799d879f1e3bb
+
+EntropyInput = 8bce33cd4324fa53e5ba9779049ec68a58f6ec840d4e23617602a6ca1125aa184f6d6cc3461fd4b73f53213fff2a6dab
+PersonalizationString = 4eec7db6d498ef2d80c0fdabe286b4a7d251748b740a458784c834e3311c8944149db6ae7c4b3ce00982a9058281216b
+EntropyInputReseed = 055aee6640882c700facaa894ee61a487f824ec68c1fc0d8fb10584810f44a5d8266550d9393c9145553c367ca568185
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = a7088e0b15c12b188718855550d04af73278002d632d1a341ab6b3a5700f04f84d3c4ca64972ced43e9f76143ea2074644ceef7f5c8aa5795e8f692074ac95c1
+
+EntropyInput = 09741de47f5377fb94f99a0de876127aad00f88e5989e5eabcec2e75f3cf9e8c7265da02c80261db4dbeea466a80a6f4
+PersonalizationString = b65bc8fd77e2e3e3443d73a30c09dd085c0bd6564ac0ececb4fdab5accb722286ad840286c48221af5abd5551b58e83a
+EntropyInputReseed = 65900106567be790babae0b81f2877a9c1642af3c58282e134cdd3b0920099f936cbbf141502ccb5860ea10bce394c0b
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 1ace19b725a9deb13bcfcc1e4d39b604b26556927f60c367936cbe0e76127d3ddecb73f52ef39883a9def235566d01dd4f734028ce82bc5fb9ca300f3f5dd080
+
+EntropyInput = 5ed4b6e453a31c0b04f960b739f4ac061cb719a70919709bd5dbfea910eb4e4dc34031e0298a12c7d68e65a38e6eaae9
+PersonalizationString = 458d214a18fe1fd2c762c77cb98a5619d7e48aafa83110c8578d1072d577b93e53a13ac700612101b7862ca94eb87ca4
+EntropyInputReseed = aa829f4ea15bec4a9ddd933cf6c47de60f7e2cd172287eb502b9c7beda32661e1ca27be26c1fb2e7a667ca1e0466aad4
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = ef4026144d7dba42bca258a0b0cfe881e621f65e19c267179c0088b7829d9ddfee39fc8f9cdfecf0d451dc7df173d679bc503190795d4be67909acc17bb20470
+
+EntropyInput = 938602d75ea11e8b1eb037381b8e7643b12967aae4982a4b4eed054babc78fe4dbfa832a0b3dde8d2d1ed423d807c13a
+PersonalizationString = c09424e77901b1f021c96124c8b2e8708e3dea339d15d7554dbe19760a99a8c60b2e8f208804eb6f6bef43d5b7db623f
+EntropyInputReseed = ef6364ff1c3d9b0c240ebf62fc52768b748f16581007649ad9ef4b6c72176255508f6e2015aab2f95421ac7a582c6205
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = faa48f2fdbf31ea257e010cc74ef2d50d336b2aafd4fe8b3ce8fcf803a435e57eafa18938e35fe9c3a01d92f2b7b1bbe7e055dc630c701e288c1fded75e5b0e0
+
+EntropyInput = b8f2028ca74f8a0592c99d0ae497438562ce1b7a491fb6db73c4f8cda285a934777b17e472707f2217079b9d8d65562b
+PersonalizationString = 21def8c9fc10cee6fce22401c4ef13b17d33a604aaa70f924136f6635b2e59e0099c778e4cb27b093baef94d5ac10770
+EntropyInputReseed = 80e96e6b971d1436861f85f1b23cd7f47974a06b17570c337d6f5e98ac42d0c30e23f74d78978501cd990c930af4f8e8
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 7720212b0189ce42e969a9bc598a179491d393483fd7456047f81a708076f88d34a71546eafdc3556e312138a33108c91fd8e81a963dd37e03c895b630448698
+
+EntropyInput = d1757e3687b57ab3b16ef6f43ab456e7d2c6cc182c0b8376cf847798a0217707e57bce5cb326cc7d1b5bb36f213cc621
+PersonalizationString = 531b64be5d25937f30bed886f2021855db1b63777febe6695eb4f2a5e3bbfe6ce80fafeb8e7f811e06cb87e520a7036f
+EntropyInputReseed = 350112071b8315afa26fa3d9be6b6dec59ba7fed2387556cdec43ab8def92050d2f0fd34ef0c837c022c337f227b2169
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 47ad3d7ef4e7bc4696d039b6e424669200b5f6c687f813c270483793518adf6698aa40a781208878017bf77afeb2f98794d21578623888eb98135ef0e5121c57
+
+EntropyInput = eed2cf41ef920a298aa71c28c46377392b95cf75182cb47ff2539ac9df5db7b2b14c3c99900cc7389effb719bacb581f
+PersonalizationString = 88cb735f569879f24d958b54d4a5544bd728971ec531f82e02c113b783446afbec857b505e00a1b5c8b2749e1eb19b03
+EntropyInputReseed = f03301f27e7f9519ad947d8b16862b47008bc03e55d2f0ce9bf83232d3b0c816580fa58b5bc3fe6301f2cc8d03c9f85e
+AdditionalInputReseed = ffc23a43f85aef5d29cff5cdf327517777f68c0174220fbc825c70eba3525f579b10dd367d163c740c57db0b6d88b37c
+AdditionalInput1 = c5f108eb450dd628429a321af43a9dfaaec6bef2d1caad89bcd86cc35ca95ed85f796bb3bafb071ad2d708230bf1be84
+AdditionalInput2 = da2a98b2298e3f4f691e91fb6c719d67d3c37a916e50bd2aec09263c8e7616b75619472f4dcfd97be135c09f0b825f0a
+ReturnedBits = 4eb6caaccc317dadc89037642e6216fa3a4832915133e736d6a5c1006139076b4d8bb44b605e1d6bf414e200529d5fd9d95c76a9714fd91d4e56fc7d90d660a3
+
+EntropyInput = 7eee671f998ae5a3a3e1a471eefa109b3b1acca33071ec2071c6b0b79edd100c4ec66db88e0fabcd630d3b1129f5652a
+PersonalizationString = 243297161268c4dd27012e77e9e80ee8aa3cd72e0242e5c0c3d21668344908613a1e4e3b658585eda4de66390580c5fc
+EntropyInputReseed = e7ba06cb5dad2ce73dd07c7939581b1362727ecde7567efbb1483fba1f8cc702d425544ad952f3442de70c8b5cce53fd
+AdditionalInputReseed = 4a2cbea021aee0dbae40d7577783b8a75cfd9d5f31c0463ebe9817c11c6de0dda15424a10455b3f4dc7f2bb1e2b7d928
+AdditionalInput1 = 2df757dc576c6263e70c3c693a0f963ce61472f82f7f4d9c9051e5c443bd63e1870d832d41bb091fe8f01bde07088c93
+AdditionalInput2 = 28eb9a03b4e91d2feb960366e7d8d571e0232573378615325185c0eaa609f5526b06377eac6b4094973d01404adaa42c
+ReturnedBits = d677c5a72c23b589fd15a65516b4a5c3bfe4b003e424c6a9104f4a2337eb36111ed6d15174f497d06b12985429ab01294f508f6987959f784e4fefd73d5a37f5
+
+EntropyInput = 14579ce1a2b1096ff932dc3c6e382965f612cedaeff27e90c96e32f87a26a861565a1d4d16fc8bc351b50bf11886efa4
+PersonalizationString = c359dc157407a57a3eab7b6e9c96b1f0f632d533b2fca8415f43421dd17ffb25370f6d5b647f460d78761d54a510038e
+EntropyInputReseed = 27d3d9450109d02d52f090b509501f2a6d5cca3fecec1b8f2017494dc61480a5b9faae6a3c662290ce80bccb4b3c3a62
+AdditionalInputReseed = 469a5da3a1443d03f92b37d0693ab72f7857c5b83b47cb57c3ab88011a56266e2513c386df7f604fba73c54c2dcb8a9b
+AdditionalInput1 = ff257f91eddde25101b29f4f7753707eee7bfd33c9cc3d7c2ac4f2fa442e9ed87da43e1642d1601cef6f629acdf18f54
+AdditionalInput2 = 84db1fcd484c63e4915bd5680d96b8313cdf82eb1d04c12b1c40d8bbceeb23cbc4d05c638912c7c70b5143fc1eb79970
+ReturnedBits = 2604c2ef6914a33e0ff7f4d4e81da8b5acb74601a59da17d646a77935f15bd3406144c6b987bd8d446969791128bf720342e5a489bf1f5495b92c1df275f77ba
+
+EntropyInput = 83831370dbdbce5f2f08805ecee48a56fef7b85737512258aef97896574e3bded7a876bb70d29d88aadf15f940ff4241
+PersonalizationString = ea51227d7760fff9d860a002f0de373dc9b8ab862272c71d0a6556ab6db99e900b113a792457b8905760e377dd158346
+EntropyInputReseed = 868b21adaaf58a8391794fd259985742169db47c2730eb786ca28f80e3f16a2ebba6bfd00f37814f938000c6fa82af1d
+AdditionalInputReseed = a1a38cf26e0c3f85a042856c7ce9ec2c113b094e5ad5e662254692d2724357c92b177229b8fe25944515dccd469278b1
+AdditionalInput1 = 021af36650e7acc3c5f526abe7243258c5182001d64ce80d4bf0a633725c1dcc38f3f2b706771122bba5026c3dac6040
+AdditionalInput2 = 6bb52da34c8a4528a2585b9f42c04fc4487ff355e3b7a42c37c833ffac636de545aba156f516efa0bba52b9116986f8e
+ReturnedBits = 770cfbdae652c3bcf5096f4a6004a260cf61e84606cfd60ac6719d72eaf463da135dea671c00258e77d49d72c30cb2a5b66f79f33172581d95ade3f7d695cb61
+
+EntropyInput = 3a56e4585b56af93b4a205c30186c58fe9ed185810d9267f734f3990b91e366184e0b46f5f8bc7c364cf8ac5df643cd7
+PersonalizationString = c8725d49ec89b76b9c292cee1bfc22f7a6593c7fd37a9633f0341b68905f16ca25dd096aafd39884a2301cfe178c63b3
+EntropyInputReseed = 3e5a814ee09aaad366c20212d49f186e7e30d7bf7eb470958b1b356b6fdb1114c6ecaa8b18f39e78caa9c29726394241
+AdditionalInputReseed = c17a4fd0371f5050c3ff3579d2e6809a8e5dbe62f2be359f91faff5731031c6c2ad9ea8fdab10561f1fb9cb85dcb9c91
+AdditionalInput1 = b3428ef301e891022eabb4af0592d918ac6ee15de29c12a05097e9f5c0ec7f936ef5331c633a399c3f90aa47f24fd9ad
+AdditionalInput2 = bf0b17e658cb49d2eab681ca348ffc7663570a5596c884d96d1d91d5cb856cc9a72a7cf8c35913525b5e0194c5f83d8d
+ReturnedBits = 9321a8460ad453d346606d0fa88e44e4c0a3a32d43d84d4cbfa7adfe411ed4da44e458c168439279c9acd7287ef4201e7dcb60087aa80d0574cbadec2feb2e41
+
+EntropyInput = 4fe67bec0f343200570be31e93bb93ff5d1a2954d6ee3954fad31f2219e181645d95991eaad95cc203c2974b4f8f9299
+PersonalizationString = 84ebb999114cd10e2f3f9e8b231635cd9a5b1f894e5ae72e886367d1bc65303fa092f8aab9023077fb60e98f1a77beb1
+EntropyInputReseed = dc5ed24212fcf417b2646e2a23ad21363e78f7ea286417830b853f4f69298a260fcd54feec558d3847f16a7139151d42
+AdditionalInputReseed = a48cbba2165242a824b8817c712315f6cc63642549cb86f37ad5121007c5719b558554352d51ba444dea5a58ccdf5f7f
+AdditionalInput1 = 2d0188ea685a72b15555bfdda26107dae14665b2fbd9694eca5aee9f4c0b2122af518115c385b166ee21d63d20d8f280
+AdditionalInput2 = 31056e76fab196d34b794e2890536fd2227a49661b59ac240ccde597e41b1d038cb1be271e18dcfe4a58586532f6c7d0
+ReturnedBits = 512a2c24c7b1709cba34a7ef97cb16032a99282ffd3e80c3072821bbc88d0d4e236c17b99aff7bf590e4dbaaba3cef0bc4796f20117615c97356f4a745d12fa0
+
+EntropyInput = e1f2a326f4f59d685272c47f1a18b76c1e831da6aef5432e363fdc7e1cced7dafacf44b7763e24661bc92a7dce8ef513
+PersonalizationString = d1d0f298539eebc0a45432e40d3f82c0a42da5a9f71986d1e46c0d8f02d0518db5f7d4c9d4b7637c08283737f3d3de53
+EntropyInputReseed = dcdc9836abc8cd434989f337fc1ed1fc88e4b5c67eeae33c1591b956de15710ddaed7d5edb2686637970131dbd8f7ebf
+AdditionalInputReseed = a5b9655d688be8ff55616461b6dc7c8a63fffbe8509269a3bcdcf3d9625b8a1efd7f7e7e196c2df094cc27b6f43d4ce4
+AdditionalInput1 = 87ebddbad4cdc4c73b061e047ac0cfa77b9c01996a16caaef1ea9cd957953777afa781ac005eb5859d88cc878056f1ec
+AdditionalInput2 = 4f3d5b856e154fcc18ba7989f362c5f15c5fcc3d933f3de7e0a76a57561bad2337e7ba2235c4e44c5b8354323f560b02
+ReturnedBits = f5db634b5906f3aa68ef1ab78bdba4ddfbd53cc6043fd3ecc6df2e9c7a47bdf54080a46b689e9e5f96c85fff5b78d12702d0a2053bdf6839ffbb1c92075dd189
+
+EntropyInput = e201faec2d5f4530f1affa1889f1eae9809a8ae7d32a0414dcfddfa373ebf242b8c108cd6ceb555ad312188fb16511b5
+PersonalizationString = 3c33d15c59a59b0b3c39b008c17dbaa2e4137ab473caac6b00fdfbafa73f68f2e244a3151fe129ea47345d1bcbba4407
+EntropyInputReseed = aa3bec504ed8837779903a625dab0f6b6e2508df5c7ae5375a54259a3d7f35a41571668fe27a368d201106519ff401bb
+AdditionalInputReseed = d75bc721d3b2ef788f2ee4cadb7756e061c6ec786f7c8e37888795663098176fc74affa49ffdcb22d03e0bc597dacaef
+AdditionalInput1 = a624db91dc18349aef339678d75640cb5f9868b1bc77f9c40bcffdc7119f512fc9a9a4f53f88c1f2da76777bab87f073
+AdditionalInput2 = 4d947ecc8f47be6ee6fcab952bf3ad0f8fccd87e840ba931cd5a3b4cab650a5d86f84abd83e8866587c66ff93f37ecbc
+ReturnedBits = 7831e953ddccc19d5d31cae32bb63766b3123f3dc7bfd27f0fa49f9a615601a871b57109c2692306663905481f9df46b81a7adbec5ef14cc12fa68bdeff56a12
+
+EntropyInput = aa55939554523129c2ce9fc43182cbcf2ad88bb510a0e64960a4998187cd71e6b35917dea2fd1b1d77ed211b0bf49280
+PersonalizationString = 3f751fcc460760c60a52e2093ab0a8a6502e2f3e63b6ac4f0cf8c4bcf11c054c878c500c7da640333c36705b33e847e9
+EntropyInputReseed = ed4110727a643851e226b7bb0d07d35e54565d726beb6138b538227d94f32145f32aefb7a0a75d2139ccae41c4813dca
+AdditionalInputReseed = bde5690588c7f3a343f741f2b835edbead444859f46c5504feaca048ebff1b3786027760da9c21e5c1cb54369efa4500
+AdditionalInput1 = 2d448f2d9cbe1533e4fd50facce3a199f91d888824a0fecda74b16900da7b125507fca2eb7b39bdfd5a2ed680823278f
+AdditionalInput2 = ad4d127db0e78b80ee18adef40aa78aebe09f202b5e71496d2e0ac8d214c01fa6e98612c03a0741ae0d7b18bb90ba3ef
+ReturnedBits = cfba8daab4c996c125102c46fd1de2afb75d89a3caa83e965215d23291925873d7d53a8181a92fea3347c282da5fb1c0f0018aafbe672b9cd7c7a81ce0ae4956
+
+EntropyInput = 83ffd36b1d8c06a989e98cbe9048d8068550a51a903be288ef26b60641343160abf6adac16e89ab252647ff9e7e9fb00
+PersonalizationString = 49b3780beaddd3d25667c8e3825d49a4211bc9a05c18f8d4ed061be8bf529dbea68193bdbc7adf924e2796805b970f2c
+EntropyInputReseed = 7abcd3b3644fd4040eae481968da7e719533334d43f046e92f40ceaeb47f782bec6fb93ea8b821235a24c07f4e4d2395
+AdditionalInputReseed = 325b2ea7cdf22f969b0eaac570f9f391365a0cf6cf467d5f1eacc5c4f2f42e11753893ef92d906e359554351dbc87055
+AdditionalInput1 = cbf5246702df6d97e2d8e76bad1c928903abec591c3393defe1846bba02a0d7f56c4aa0bed78850f944322ae1de03913
+AdditionalInput2 = 8096f52962cb85ca4d59774634b0ec4dc91656e14c0c6f39f1cf003c04ff4f1d960a0c1e75a2d4dee7acd3938567c76f
+ReturnedBits = 18ba0571ab637e0d0bdb7d8c2e4e4a7b357a82649a1016aa0a1066c891ef54bdcfe39d72d0c4b9c1a8430302a66df9aa88c2d291c5390513478780044537dccf
+
+EntropyInput = c677fd96fef5cd092e02f0653ec726bf9c0e6b079a007e78ab7ce0cf76fef5fda2e96edf7dbeeea7614fc3e5976e3a6d
+PersonalizationString = 5952a661c3802d16e3e2446acc89324b3eab96a632bf72c1d15be71bd1269f0394cf107c28118fb6078227d640414e9d
+EntropyInputReseed = bb24e6a57996f75f02100c4fc88d2f635948d4322a778f05b91af465a9d7f65fe0470f187f6192a63032438da8f344b2
+AdditionalInputReseed = d69535eb84bef4ebc54bebe837512ca736d14851b03aa95a5243ff370ca82256d1a1bb4050fda61e2159769a0eac65ef
+AdditionalInput1 = 3a1b3dfc0cf19ca5f19f0aedbe443b7748a12a104df6659a4612006daaf1a3f567772249596487cc66550cc9a5a7e421
+AdditionalInput2 = cc764000320f3371709e92442badbee12beb7caff2efc730780b3eca22afe43ee70d5ec4c76c091af0896f471651dded
+ReturnedBits = 094d5299cf69ee54624b1808645379667da9d2ccf517644f9be021379b0bbff85f0e661cc4649bfbafe67e20b927b4346e5fa4ab86bf9f1dd5ef75971df8dfba
+
+EntropyInput = 4a07947252aab1a141f93601509b6a5f442f5e0fd455e6d69cf5d582a3961597c1f101a2bd25b3dcbb471ddd7099f843
+PersonalizationString = af96f1ec13d05d57409e9c06fc7c1d3000ed44b354932297629f288de229424ac3b01ec8af7bcab44a5450d7125ba47a
+EntropyInputReseed = 45a2833a536cecc4bb1f36a2efa369c46f471c7080c0d8230da21f61908bb403e11a38efcd7792bb81e1ec64c61a6973
+AdditionalInputReseed = 86a6db8b6f89c92f33c20d9c7f1f35e6eea25f3e62c7a7cefaab071b58e4dc72a996609040233cebc071210136064114
+AdditionalInput1 = 9195352ccf0fa004c3ea45cc3f3635519dc8f5a76f2a600863d8864518cfc7e4adc700af90504e5ceb8ec2f9795ca845
+AdditionalInput2 = 9e3c6656442c70979362b9cbc9760c59587449443f53bf4e8e7a52038f3cd4baa2715749fa9f21469c52761f1bed4fe9
+ReturnedBits = 35d26bf94f67fca762a4f4e7da4cd87d1239d2454b01ddc8f7c5db9449f55c5687c48c6483deccd29110e62421212197659015d7a7f2f48d6ddbff09916b641d
+
+EntropyInput = cd03d0a593cb6003e6009a75689ea7c71d28b7bea6b74b68e93092bc140b37b352ca8b1c396694405f94b0f6fe39a46a
+PersonalizationString = 263d10ef973fc877a3cebf512dc1abe5fd189f1c42b74f071843b6cde7b025bef4266f8f312b42f9258aa74fe0ede089
+EntropyInputReseed = 9a01b25f8d8bf3fdf0673c3d0b5a299b185ff42e80d223166908e4fa09c063a3fe7d335f526d2d7f7aa5fac44dac6d84
+AdditionalInputReseed = e712afbdac4fbd71de6f4ff5ab044baed9c7a04f7bd4bb142dd1d341cfd9c411fa19da5c19bff27d1b6ec283db0de9d1
+AdditionalInput1 = a4f3b9d8b86fa46d8c26f3ead6f8eb47cfa6ca448f1659d6d22542c3dd983ce2f270701c0651b6c0a10779cc6247a81e
+AdditionalInput2 = 1aa96f73fb1a8546dcbc309d3224986e0a4ae3520d2fe84b5495162b1e9d23eb08507206db3669162886ba48f7bf1f29
+ReturnedBits = 09d1eb9bac2b9ed71f6096ebc8d658b26f4a7f52edd49c2ad3bd9d00e57b05bd96496c0d63f53268a8f34cd3c3fd7543846a9bb2d85c377981f6e9b4c1e4406d
+
+EntropyInput = e7108a71402032f8be94fd182887768b5234b867e72dbcb582a2bcd3e480974d9c87809220c9cbf11867e974a7c75fdd
+PersonalizationString = 6924145a851ad22ab73e662117e867cb6a9f0915f22ce83213a7b6cea6d1ade79d67eae31352dcc1874e1e3fb928f0fb
+EntropyInputReseed = 44381fbe2a5f253ab0b37cb7982401e2b6174452ea66673c1262d5984605e5db4fc278e86110fdddabeb6a3916862674
+AdditionalInputReseed = e5d94f809a805d0418c44a84be93d904f24d0a57ebb4924adc7359761ab6d73d5b1702dea17f8c01877ee5f44fb5c5fb
+AdditionalInput1 = 1d971bf8b364379323d6972bf0dc8641a229875921b39738ea8dadbdfa0ad35118169b4a14b0cab605bb18c50265db06
+AdditionalInput2 = ed85705969091f43e323dbccacadf7a3ec7d06d69b2b500e334295a6874e415dcf115b99e22abac78b4adfa10c780695
+ReturnedBits = 663d9ca9850d48dc4d950505b3cb2cc06866d933a8b87bc58914f9b8e959d434064bc60008b57f7f1929637a6ff778bb8828e55631b4ac28522296d65496934c
+
+EntropyInput = 1fc39d0e57522b52d0506817c82422cc7c15dec0d275f8f94a4156c8ec3b698dbede1e15804b822df6433d0afadf1a50
+PersonalizationString = eebd8b078b8004f1617bff5934179f81463f43fee8d043762345bc084da2b7e97011cac6f488e31da5dc00a7af5b97d7
+EntropyInputReseed = 60bfd2529b391204ee817055c8baf5d4a470f43377394640140ec122657787344a9d5d2d65d112ae203fc78e7109872c
+AdditionalInputReseed = 86ff4f5942d3411751ef6375f8c65016d43c132007cc95835b104b44f9733dc5caae17d3da663369bf4ff82adb830443
+AdditionalInput1 = 02a4bfd4a825e4d811770127c6f5a568deff4d7989300a0bd23220a58631e03e138c55b565032b8a7c6f3abdd34a0c30
+AdditionalInput2 = f9775f8fb1b767c4639e2c3fe9f0820e03e28780641ecbf832451baea5e1ef83cf9e078cc325b1fc7a8a14bf07cc4ff5
+ReturnedBits = ba473979f23358b95ff49610a7b91936b7d1da44bf8891cc19ac6ceb9f0241a8c3771a2efb403275bf599aad30b9e4604e90729241763801387ab239ae543625
+
+EntropyInput = 3fa904747034cc3093deaac497e3c143fa4400accfc55885717fa943f43cbad1a89168aa76961e150e2649ec1ed67361
+PersonalizationString =
+EntropyInputReseed = c60c5b415bad715493486b7a123ba6c046089e9549ea8bb22a7ad4108bec98117f751a2e4cc20b02510d2a3d02605b4d
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = ab2d709de881164b6c2149b21eae1517f87561649e0dd9ca5ce551c5bd12fdf7091e081d307123aec5ae7c30afd2a64c8d136ea07f7ec5edb4400b9a64456642
+
+EntropyInput = 0912b0bdba55ffab83d8e932b2c1438003324ecc2e59933d6e20bcca9b5c342c077e75f47e1d3359dc3cb69bece4a1c8
+PersonalizationString =
+EntropyInputReseed = 02e503bd3f3485988d5e0e6af4589fffda797093e6fa77a4a84021269fb8e2b58ef70ee9b60f79455bc9c361b7e43029
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = b16a7e86b1436f13aae41576df303abd131fd45886f02f48ef8e9f570685ffcd0dcc1f5f1d3bedc2de3782290f36bcfd4684d76e3e56a32b7509f67f50dfb14c
+
+EntropyInput = fd5efcfa986060504db921095638cbf70c78b7fdb1b33d77d4a557ef47a365308539844be41603e97a78fa9f5504a498
+PersonalizationString =
+EntropyInputReseed = c99489738767ca8b22022e8ff1aa5aa6289f2a822e4a8c9337ed393db4ff5870b9952af53e88bdaedbbc0026256f9f6d
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 607b455eb30193400251612d1f967afb7a7d0f4eeefd690411b32b560bed69ad745690f98fa58fb0998c063e526d124c4035f565ee9133a86184d6c01350a5d9
+
+EntropyInput = fddf8a151266a550ee2c728fa25dc592c6d55c644ab0d3cd7047248b31e2dfade4acaa8c40fa2cc5b714bed1777b3d3d
+PersonalizationString =
+EntropyInputReseed = 50818e85d856059a8ce29ec9c8c0b854ce04199d128165355dc99c258047ce733a324ead4d334f07aa4cd33e2fb5f277
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 3a4fe07962ac269b4f40cf5ec02150c15b076e8dff3478dfbec9bcc7049eb846b86b2e0dbd2c1e4c387b77c2196ae1df7921ef6655700d9cffcd93df24eee4d0
+
+EntropyInput = 9f9a5202a542525b107bbbf2ad34ed1f9a3d6a27f206695f8def3c2190b037bf332ce3e2dfd65ccf74efaebd518fd345
+PersonalizationString =
+EntropyInputReseed = 7e962cc7cab231cf76c27022c01a796b76cd97748173553314fdb5bb67cf56346e35bbbe47f36f989aa16074975b6b5e
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 4162fb10e25b3754bdfb913a9edd01567e897b2a1b37aea8cb7af069f333a52ae15bd2c897160db034bfb54d53481eac1151064daa3ce88579838efb1d36e077
+
+EntropyInput = 8f5ffa820103b8545c4812ae70cd77f53917daf97e79c1961492ee1f6a72d67f4f9c4bf848a3a0b094182afdaeb83e78
+PersonalizationString =
+EntropyInputReseed = fbb08a78bab992fc76a5702c20ac2765a090d2d4b8be5a312912bb66576bd152e706bf8080d4f239680df91ac2201608
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 811ec725c9a7b3abff962bf7c28b8fb83bbf394e100a56a1e40281e37221e8b03661567cdb2ec57b95bdd5f4ce89adae3d43e3ba4acc46faab26a3d5c7a973a8
+
+EntropyInput = 981d97c7750e5b758d490a768dc449dd6e1221903a7065acb29dd24d63f56442e89dee90a6f476cad8e82a129b5e894a
+PersonalizationString =
+EntropyInputReseed = 62397c5d203afe8d29a2044f21dd8c102bb87d36fd67d5c3c22ad6116fb3f3f862d3cacfe18b851e81b5bb3eb074f970
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 0a58da0e42ac1186ef8e1ce6f851e230edfb91ae3ec09fc374955445afc8fc59713d055180bcd56c3ca51b71eb6edaf43eead80930360d09300e16b551c3015d
+
+EntropyInput = 31d50ce8e925a6838f0834d75ad61c21d29db48a8339f11adb2a29deb460d2a3f6ad86a27bb008c85925c540fc9e3398
+PersonalizationString =
+EntropyInputReseed = 520da253daaf681409a82aaa2fe16d6b10dac5649daf4f1de673d1ed7c6a6b8e45d07752f81775c9d0034545d6535a8e
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 7212da3707f4dea6828a1e7e84ee7bba2b8816c111a7f6643d492bcff5f4ba5b10af6b25edc567a8280dad557c429085f5bce76ecb8f7def376e85ea999e815b
+
+EntropyInput = 1052e52bcffa8d9bcf241662af4b281c81db5baa8a499c1a113255ebedaa2953888d39c80e50cfb477e8a2aeb1b7e432
+PersonalizationString =
+EntropyInputReseed = 23e2d6cc4ea030e334e1a1de4fe71e10ed0affe7aca2b42e97b9149936910b93d950706083ad261d51a17bdfcc7aac23
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = ec6f01e39f26fa63d438f1aa82564d7e0bfcd0c3c4671ef107704cfb6ec32af5259ce14f36049388891dd2d236b2073deace8e55c3cf4b98490a6fa4342e004e
+
+EntropyInput = fc5bdb0953cb88e240bca583eb79a39d61e765683449e15e7e6c3fe4f2e46f023d7c27f35ca9c4288d2f1af9a11699cc
+PersonalizationString =
+EntropyInputReseed = 48f5d652158aa1b63181654aae4fa35e107866b2748147d666141a60287119ef7edf19c2ee527a9610af885400e3f83c
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 2c03106ba0d39d44ff6a45c312c525e99f1f96680face83e12755ec60c22895575a0980b338967e6ca390abf8bc3d4efe24d2fb7ea83c2919f986ec7ebfce52e
+
+EntropyInput = ae2c5d1a8d8b813f40d3e26563fec0e4062093ddb63df4bee7d102c13c1026f3cd0c818e2af5c7dc3d3e3e1fa6d566c2
+PersonalizationString =
+EntropyInputReseed = 6d8d60ef2f87f941b100f3c1214a751b23cf341b30f7f7ebb183050fd0aa5d222e876241840202a9337aff17d702682e
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = b7b9f0bd7954c0e045bed86c3c2e23ce3af17dcc855ec5aa4f04f0929351ae6698bea4f25ecff4f52c2f6d758eeb9412e583914d33e914744d49dafb2740010a
+
+EntropyInput = 730611580fe7a08da679f864654fde5a8d564d68dd41d2a188d79002f8939543fb7dfac8a656760fa0f66dcc2116176c
+PersonalizationString =
+EntropyInputReseed = dac5d0bb45262153d71cd330dff522446816ad5e28e3866626f6e7fe5b6d3170d9442e7261a5ce0299155cae74ea5e08
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 470212b1900fb4b1f49ceaf8c0333faff0d2a79fd5e913d52d66970ab31f64c297b55ee812826ce7ad358fe55e48b896dc4442877a05c2526da0e5188f6fd5ee
+
+EntropyInput = cdd463977bc88b0e660f3cece4fcf4097fc79f1e20dba96c819644c370043ac39d4997ea9f634969a80e6da6d9dd9e9a
+PersonalizationString =
+EntropyInputReseed = c7dbc97c209064a4a663c865e9d4af0da3f709b6c17fdd66a969054856aadfaaa1b97361d5a6d2ed8e68ccb203aba8c9
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 8262e79752c9e3036e00f36c5b3d06ee49555c599193ac35ae2a3a2a6bd07c1967e7c0fb4ebcb14e422f662fe9cef08be746bf27f3ceabb7ff3d7168eba0471b
+
+EntropyInput = f47ce5663ea72ce3f42b00838b0e8e90adf6746d355b5cdbbfc0bb80e335b049ed28011c7c0be7acbede87b57192b1c3
+PersonalizationString =
+EntropyInputReseed = 61cf9447c7c024e0a8ee046355e3924373e79fea7efe1c3c8b1f7bf3aebae246887939894338e304e53d0141b4c22c87
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = d1ac84903a9bbdcdca45bb7cee7a5f49e14a68f0d8467da68adcc22c9d0bb02118b3bb7f2d4e11c698bcf421edca5338adb0a29b291fea9f65a480d45159da95
+
+EntropyInput = e23a7f95c3cf3fddddec66cb16e1fbc38495ebe98b3e14d8f351e58bc457cd38b7975984998ca99e9c2d14b34068c3a4
+PersonalizationString =
+EntropyInputReseed = 36410abe456d7a51948098897ec205f75f22ee09cfcc94ca88fbaff8d159fc779a8e420d11fc1ac09518237bfdb74462
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 3c14a63a9c74dd02051c0147637401649a68452c28af90e9628f1ac87df1d27671397ba34f493997ef634284b74b3b28b2e7d4171eb025e470f39dfd12636a5f
+
+EntropyInput = 696cbd64f07b112155e7fdf5c6f4f305ff0e82f9d91cc012e225f05afe8bce3114347696b63c46ca0308adecc0d6c908
+PersonalizationString =
+EntropyInputReseed = 23f7a55ae9bd6d13e4999b1dedf4c08897c41e12a51991ba40a4f53f19afdf514a77a5808c65abbdbb22cc70c2e41bd9
+AdditionalInputReseed = beb4213efc8b9f23b7e207061beac40e0095e4d7636d97504b16ea972ecea6fc074145d31847441a310ea3d09d2c2e86
+AdditionalInput1 = afe68249563b6dc7abe5a1f691d92f378678721478bd452003a8f72db0262e40c55e9e56561a50916675903a3110ca6e
+AdditionalInput2 = 5f21d784fa3314bd386fe08286c5c903c3f77005425c6331bf903233839aa2306e34077c91dc5783b8b946410b1785fd
+ReturnedBits = 975c38fb3191d3e15a808442a6da6e2727c373aa64a9b16fa469c23cc4c22ff8c1c33949fa6188e319d6d66b0c3caaab7395b38cd54979aa18d505259d8d2352
+
+EntropyInput = e6dafe8ad4626db2374c09e9863d4e68bc5ace27a78f1adb3de72bf69d29161f6f153637eedba35cbfc678b4c47154f7
+PersonalizationString =
+EntropyInputReseed = 59709d21325a5de09be908d330b7101d1746698717ffcb53c31b44c2bd5e5fd2747ab3d131d9004d402870c779a3e307
+AdditionalInputReseed = 882ea58eb50306a7fa6148c415e4022d0a0778987a35dcf0f670cca8ab528fea2e9791e322397312d7cdb6ebf0390d7a
+AdditionalInput1 = 1800ec4678b31320a592d8a7cf8f4ef4f7aba3f557162524ba6963dfb1632cae34e8d9f6a11e46204a3b912aec2a9e54
+AdditionalInput2 = 0fea4f0f327dc8384d51f3601601277eff9da6dedba17789dcf6a0979351ffbf5764a61e5ad34bcb12a2228644348357
+ReturnedBits = a463eb0cc9a7d24f986eab26ef86a542d82969f6ac993b8df0cb74ae1857e717b8bc36297f3fd4b56dcc305483889ee1140f2543b74f3b152adf1ccc2b3f7dbf
+
+EntropyInput = 24a5f6f936a1f433a727ffff1d15cf440dd0781da36ca7918f0eee0c2699ad820488d96cf27ac0689c258d37c7ff343b
+PersonalizationString =
+EntropyInputReseed = da9cacae8a7c86a1bc5598cd1e7e08f25cfd69aa6f931f7b3207ed004203ff7a6a673dde6624fb3f79057975e0767f50
+AdditionalInputReseed = 6954e7a17056b7be8ad3e2b5060b1bd47c5181bf15c561a62e3917cc739bef24c40068a28abdf0f15770ed6c26f40e40
+AdditionalInput1 = 997a08350845e10b259076adc7b60a94091b0ac76f643c432d9cfa700335ed5a6ebc4069f86dcfa1e8b7348eb6a77382
+AdditionalInput2 = 5522a7e0da07955027d9b4f31c434909879ad363ac17a46daeb0a81e6ba2e3820699944758c43ff16bcd5f9858bef9c9
+ReturnedBits = 7f7d10dba2324d251c5554717139a620f5eb788097c14d929329a0dbf02a1d88579cd070faf796d0b689c9ea7c576cf8276b1b2aadf0e560a7acdb3069ec4bec
+
+EntropyInput = 9cefa1ee090dfbfda933ecaede9d864b8d2f1e4176afd5446e6e3e07b8aebdfbf1dfeb5c30afb02c80f6d844a0721e16
+PersonalizationString =
+EntropyInputReseed = 24be2a8e42f170fd93de159775098618f6511f05b677efd246dce58eee5ee9894d681abe5b718f2def41b52fe3347376
+AdditionalInputReseed = 5ec66739bb2d02902cbe54dce7247adcd9a7139a230c7aaf3ebe83dfe47040849f86350ec1f12efcfe31332140b0fb49
+AdditionalInput1 = 82e905cc9fc61f33bd3b76d33132692bb182dce8ffda7b5f9f13ffec9e9eb170de967c4a3bd66dfbe66c38fe2d63454d
+AdditionalInput2 = d65c7ad438b6b27eddc7b6b7497be3f5f3e888b07cdd86fe3d81ac0aa0a2d53197f3bea5968b41ad58701fc435f34cad
+ReturnedBits = ba66e163d35ce7d2d2878fbc9e7b49328eb70a3b06dfe9aa1e9d789fd67aaa563c4692a98655b7ae77042f4605ce99575dcdfa2c96d93d76eff44cfff79f34e8
+
+EntropyInput = 538deee0c59fe71b6c67ea8b0ff5fdc1f3c94abdb1237dafd6e9c986a445429aa098a6bc55519025c36f253ae1cedcce
+PersonalizationString =
+EntropyInputReseed = 9d1639bb40ebf02a270f49205a4f5da3c14583b45d7064f97f552282833e7338fddcee59e91fa8089ea95eb6da493c31
+AdditionalInputReseed = e702bb3d959cc168796a8e210b805e00167d2f4d3282d47235d029597f8a90772e904e8a581999db0ce010b3005790dd
+AdditionalInput1 = 3193b378390351a8396eed93bf1f41d748bc3db178442d7e76f4aae057612861ae27a3cf71b2a1785d96d59ce02e1c6a
+AdditionalInput2 = 238956e0d206d4e992ab9c45877d9953c1e48e76e0fb46d8717a0a6412cc9e9c161894979506694c63c8eb8c5d106767
+ReturnedBits = 7a54f50af3a59293781ae8438c6fb0ffddde2a3300e605545cf302d97b81fc5e495ce382572dc76fc9874cdfb31722822bff15bfedcdce2f70e5f89de5b41c6c
+
+EntropyInput = c087c716567683bc3880be56e322be85f6dfc236d34cc627f7e3cbc0f1ee1f0bbd2aa75bab3f4a96d85cd3d597c4d20b
+PersonalizationString =
+EntropyInputReseed = 4631d87a5e5e8628fdfa55cffcb58667ef4cf8e4b1f5eaf0d5fdb7e2bffcc805b74aa3c0f1ec95fd1ac0a0be1c1f8669
+AdditionalInputReseed = 6be58d5297f9c187ca97ab5b662a295fce4c279bd66f737c70b760dad0db4cd59c277aba7fded780ed878a871fb8650e
+AdditionalInput1 = 654369dcce049648425567279bf08079a9a55b172b609507799aee7d85997075292f8e988ed0ca596598820495346357
+AdditionalInput2 = 761d17aa9eecfdf873f07fc216ca0f785f334e4fdb874ffea87d6009ef47e233cdcf46d3baf6ec645693f2c9cc4b6d2f
+ReturnedBits = e25a8b5918ec0db4dbf7217abbd22694641a9696a0585acb117791ea04e0aedfaa78a24b086b2f7fcbcea2e4e7d8d1ab06a4a483008e19de51aa1ec007bf4957
+
+EntropyInput = 239f0a583c5ea02cd5edb9571a81dd47bf50e614615464522c1e6a053361e782b548db78aa5b7064dde3c13fc40f6099
+PersonalizationString =
+EntropyInputReseed = a8b9f994e207451b8421ff5559f75a4a4fc227bc865b67faf1a05f2e87dd5e059b76d67a14f68451143f3b6e1dd7a4a4
+AdditionalInputReseed = ecc955996b08c3a27d1dd77c6ad2762a0033ac1d5986d590cc087054e6ad3bc68841f334d3d2051c406c5c7687a32bc1
+AdditionalInput1 = ad2055d4304236818520e1a9d086b341768bd9bedc35d3b816576efdbd13aa2d5f3c34d5bdad99344eedf0481493f528
+AdditionalInput2 = 2ad6950cc9335b6cc37e4fee05a3dc6ccf8c72a7e6fef9e9bc7e5a24ab824e7072ed8f0a7513c51c2ca38d562675e3fd
+ReturnedBits = 26c555adbe8f156f5c9eded8397aa3eeae2b43e303ff5f9226f4f59180cb4d562ba2ed4827fc2bd94df6f5c689280f4c7f3cd6f36e406eeddc386db6c474d9b9
+
+EntropyInput = bae4b76ba2691f2b947489b463ad9d954e38dc48c94b8ad117fb0c10e1a9141b54bb49275e3be6c89c6cade6c44a179b
+PersonalizationString =
+EntropyInputReseed = 09b4280c60a3c1116fe92623b5ecd59b2bf148a298b0daad7c85440df94c20eda126bd52363006ccee2ea22ea3e3691a
+AdditionalInputReseed = a8fd5f95e64dd4811b97123d1708e9450a766cad88c39ee063cfce64bab2a17eeea6640abd701a345a588587047db9d1
+AdditionalInput1 = 9bd0c929014b8f036e2bde9935d6f8f93ce6c511400e72a5e20c21eee7eacd6b8f22bb1c12f5392b475503b03bd0bc30
+AdditionalInput2 = c56f4b4b85854d4ec3a10f3ff3e9008f5bcd6d81f8d79357e65f4c7ef1ece3dd7622cb4bf6761f18888cd79f1f8b7aff
+ReturnedBits = 29579a8fe754eeaafc6b620a2e50ceb18392d757f20bcc679ad0ad61441d5448eb15b3acfc972f99b5d0f856091c52174c5d6b2f3906253d9f1a6865aa06c8ae
+
+EntropyInput = 99eb1b06dd877c3132f4f2a78dbd0cbd74f3653af0cd9e45cbd23c2f8b431a68d95b365977225c351b3bc1e93da8e726
+PersonalizationString =
+EntropyInputReseed = fa48fe933527d763cae6605d04cba02b5b4b0ce85122011a28789bee1f10507044a021ccd92460284fbf14486c3397c3
+AdditionalInputReseed = d96d043c93229dcf3a939ee2484ba9f9cdaa3c8488dfc1d371375320be951cc3336da48ea2f5b2c08f6664579160bc01
+AdditionalInput1 = 68dc3b3ceea6f4703f80030481aa81b9ebe8fa5d003734719a042d755c14554af6de547e6beb3d9e8a6e675ed15181a6
+AdditionalInput2 = 95783ace4b7ea450e042d65b7a4df3fa5058d5c9c2eb94fff88fb30cb1b9132bcd07abca6426aac48047e72baaeb2b77
+ReturnedBits = e47c11f7bc387be3fe4b70ec354870a1d735c45637baa13d2740fb4b265e485a6b5b2debad2e35fb5ce877b7c608a7af0e762a7dfe95ee74dbb3eb67b01fa125
+
+EntropyInput = 3a319150f3a66831790654961a617eaab9e520aa43214e2fb7807993c9057e9f89a1a94b9540c849759889d853ae9915
+PersonalizationString =
+EntropyInputReseed = 926844488d834209ed8336f67027424bd38581c07403542e70049980f081ef055f95a20f5a9688a2fa00b213f41fed1e
+AdditionalInputReseed = 37a730e1d3e6c0ebba1cea9dddacd308d95cee6045cf4bbc8f822013942d22fbfc8fb02bfa90dcd0f659a00cac1f3367
+AdditionalInput1 = 11f33a6b9d0e37fefac04c43f5fe1e053dbbf3ddc657fbe1f4cf95f28c62b10f41888a530b083cbf3ca783c864ee76c7
+AdditionalInput2 = ef8370eed1e26d668f8e136ec1159b11bbbfd771bc5bb76a37beafaee87a077140d8a4e40cc6213e0ead81b51471e60c
+ReturnedBits = 455499d161a9e26c8bb1b70de54758d06a41647858a0a68f3d064de623d70c4ff7c92a5dde2938a9768345fec96b4339b3faff2928e200f889f838576fe9e795
+
+EntropyInput = e1a78f0625158be30cfbc27ce1598f1ee8dffd8e9747e9fd0520a372b0e36106b78f221085f6b69d19148adcdd6bbcd0
+PersonalizationString =
+EntropyInputReseed = 0cffe9c0c062f24e8e67965895960cd6d09d35342df5199bf845ac06479545f63ad62ceae27ad73379cc15d100d6c887
+AdditionalInputReseed = 2b82e687ab86690a56e3ae92cf87aff518c27e7b8cc24e77b57ed40bc432259c0b5f0a7950b028f698ad7384be2e1229
+AdditionalInput1 = 464b2ba2823f1fef3ee8a6958ae1fd1589e55d60891e7be6c36c66d26c090bf3d4ec68f91485eb4c9b86894f1dfed962
+AdditionalInput2 = c9039d29517629427da78938835f63b370cd3502fa4f7251e9ca38d0af246285c4abd5e3ae18a3e77efe446475b75e0b
+ReturnedBits = ae710c09cb0f567751ff11e6520603bebc1ffb6c0a1f8515f2bbee1aa9e1cc7f7467256151e1d89a305e0fd582f2df0994710df1341eee987bfbeba19efcb0fc
+
+EntropyInput = 6ee41ac596ed7b3373b541149910ea49a4d3a96cac508ecbfff7468e601d15dc524cd1d736c7fa67e6cd8bf673c4acc4
+PersonalizationString =
+EntropyInputReseed = f5106b8e7eae15729fe79dbcdfc7c9a70bd50193e5eb96234d91e5eff4d339083f1e6a29da9f8e497cf22b8bd66ce608
+AdditionalInputReseed = 22b8e2d1f65b7bf2eecec1e9286949a26e51ff12bb5a4086e0218f41427ef3609c479f2f20717d010b431adb53e1c603
+AdditionalInput1 = af62071a469fc914125bdf0131ed548dd183745deb5e78ba70f5475c3c63d24216a031b83d53eb2d62c947fab1d519dc
+AdditionalInput2 = 8c5db258adb34eebf8d21af1aa63081651b3b4f76c079b075cc56d785505d4c6bb2b75646030902c88085214e5af2e65
+ReturnedBits = 21ddfa8077fefa535453b7aafeb73ca1adf340913afad50512b81568863fac6333fb777a21180976a69c42c389709c0a98dbeea33b74dd22593bdec1cba8696a
+
+EntropyInput = 2eb1b2c3dbb0a601b9701db0f3f634d3455c81528c5569653df92f77434d478561ce8860a1cca685a95c82154c05774a
+PersonalizationString =
+EntropyInputReseed = c3c6411cb7cac3cfaa3ac687d192fb7edfdffc615119e0b3d1076693e72faee5dbb248afcdd7d8e509920e6957fefc55
+AdditionalInputReseed = d83e03b9148d445eca62181692a36622f1d1972a5c988181d03a93f76554e9e7fedaeeb02683d00ac539189bcd0650b5
+AdditionalInput1 = 9e98f715326be4bfec64da9c7d6c584440976dca41c3f2aaa3c59ce3be9c3c958d167b41516fc4c2dbdd0ce7f70154da
+AdditionalInput2 = 24b6d487a69f1fd551f3eee4fcfff0d52fe963b918aad7a66c146f922b851ad4640bac3588b46a7e55c41bcc27f7f112
+ReturnedBits = aa5f42043d1e39c039b6ba8fae240efb2aad26c50dc766b000e64a083cf474051db2ed497f3db68f9ea6a2961a3ee17be58129de443c0878678a021de0d23e18
+
+EntropyInput = 48a77352e7024eda47bf94ebff6cb61c787e1e4afa223c254f1fdc8b710b27b44c2e8dbd321d12a6f5459ed49566761b
+PersonalizationString =
+EntropyInputReseed = 4cec0ab21a20c8192c1297cf6488094e779323cd78e17f05fcf0db637293fb81c8f23525e67baefec952c34ea23a7a6f
+AdditionalInputReseed = f7ef5f553bd34d53159b8a438b9ae41947ab4f452f8ecfa61bc09c7d974b53936a14b500bb90e8e9d3d5cf7341a60da0
+AdditionalInput1 = 5ec1773485779c3d6229f89dc6c16099e7561ad6b9823659c1bfe39576a46fe3be9127cbc4e78782fb09db281b76bd1c
+AdditionalInput2 = 53991f7e6ee6e71b0450ae2e9ae7c2130c890a167bd8b35e1f5f8bcaf99bf1d6cb1b359bf6ebe93a32fbbab581139fb8
+ReturnedBits = 697b34f542778621d1621137571571610ac54c2e325267c1224388dba9952bcf0984f6228002b8e1fead000a69767b953c7622620355066f788a796f0aded662
+
+EntropyInput = a28d23155b97250a9ba13c23f2e91cbd3994ee8997d305b1b57b2d911755c62584dbe238348d75fd9abe4a06ae78b59a
+PersonalizationString =
+EntropyInputReseed = 4b64fce21664dd54d0532ce92958d276d4cadfe534940a4cafcff711c3758d23ce1c141663083b6f2a477b9f25b70f22
+AdditionalInputReseed = aeea3d5569b13ec42c1f624673665ded1f7d5dce6e7157954f7c513e179a92d4e4bc72278ab8616206fb5b7fa1d35a8c
+AdditionalInput1 = aff406d3d514ec118c9a8f470db34922b8bb262f78c1ee6ecbc647eaa2c0e4d7fd33d81b3c9067ee4c57dd36d4023860
+AdditionalInput2 = 50d8e7887df0785c331a381b6f11057ed720abaece80b7f8358386fabf5da24a912b8f1563301fbcd7ad240c03a5e444
+ReturnedBits = be0045c0bee70daf5a57e5b449fde2e9320a0e0d429950ec3b8ec14ca2acdd7ca2a365bebf11f45f356c34f7e52a8c39ac2e141815134bab3b79ce3dc1d2a44f
+
+EntropyInput = a3687375129c9886ea48a2f49be328dd2bcf46689a59de69a929dcb01e6b79ac96f98dded9e13811c25c55597bbd3f8b
+PersonalizationString = da7c742b408deb1b026ec5dfeb00dd075f48069c185e5d355b09eff88fccf289ef045226c2e2991e20b0976433994c0d
+EntropyInputReseed = 40ca114f31a545b929c4225d0d2199743a5df36a8361892d5cdf35218eed6354a65caf04d861f61475625b215ac6383c
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 47a4521dd45c7b72e39b7bb6be14bfb4029f33ea87bf11f1841e01d3372d7a0c6d1289e0ec60599c28c40f382f7dce33cf81575520bff5580087f3010880bdbc
+
+EntropyInput = dce0fd6c4acff8f509f0deab6906ecd92216d26e24f80750613f19a0571683a6808165e334b9128f8b0caa365dd9254c
+PersonalizationString = 550d79ef8033168cfeed3158c828b88a09e99b62ed10ac65b3353454774137bbbb3d05da17628238b7200b6b5765f9d8
+EntropyInputReseed = 738c00378b798a8ae8202febd23b0349fdb1b27d0dac458a017a56b394033818f9aa5067cff49af5e03e266c65fcfb5d
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 6f06b1f8736a25639033526a84b1215cfef49b1da048f403fa7b34a147c65469ac396f20dd6892980451daeba1b87c3d471f32f2d09b4f340c3e35fbfc1b9969
+
+EntropyInput = 181c55914e457253d466a562211632eb164c832b6177f6141e46fa9f2c883159fe2331f9f3367f30cd2d8ba1e8935055
+PersonalizationString = 154b2afe462af65b12dbe287265fa5a6c256c00d9b7e4c3e2208cb696a7361e9bfb67c8ad4e8a062f9d1d4bc4a083b47
+EntropyInputReseed = 03f7fbb8fa8e99d735dfd0641265db188962a6d7238cc87ac6250f1a53897d0741b1b017340cba4267c510a812b22a94
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 0e8d007497033901b3be460d6c545b820f51035ba33a4726deed2dcd2405e3106a8c79de929f79ee92a55e2e65c0dd63b82bcd19a0859921531e063a07dd0f8c
+
+EntropyInput = 1fa741e73b3b75e9977eec90205c34dc57b8cfc170840792e0daf70f3a1189b17b689923c8487c26846595148775a8a9
+PersonalizationString = d59732b5a15dcf62c865b52fabce9306b2c156888f8430f816d07a2c15f215e7e96089945c71a60d11260cf2999a9bf7
+EntropyInputReseed = e2aa12842d2d5dadcbbc1501172447e00862630414cdb22117dce2cd3deefc0da218ae267496664e3b7601b4d6e7ffa0
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 9d63f1584b41c0a3393b88f144f25e74496f38a62dc4c870b8a285fa08196c2d65f9d92efcdedb4a4151897d7998d498a062c4533dffa5701c78dd5746864f42
+
+EntropyInput = 1cd1a07393d6fb0e28d120a579d49c6278ce5f08a952cba86c58ce712c94488ea80585b8049109caf79179c8ee307ba7
+PersonalizationString = cf7dc609b10ca13dd9ff5eebf46c7b877730ba200126d466847a79e85e0985ce86ec4d102fe514d3256950d069b40a43
+EntropyInputReseed = a2a5fe3407510eb82dc9cbc3a4811f9c92832b6995b678411baede9deab68c5d7b1213c139f2e01439d76853d0496477
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 14382bdc4e430b2c896c2c597d2fe85f524e908ab23539158cfdef481a69409181f0594fe6c54db7a052b001c4cb03d6a707b59239e7d5f1c6e08aa625740c2d
+
+EntropyInput = 14f5c77d7fc64b04d3c73268bf936e6c075b3269462dc6185884421331b7a840fbc7c3c31e269b2bfc8cbca53f854c98
+PersonalizationString = e4b396ca9ff4e407900284084aef7aa479ead22aa672565d81010f1d4a70283676bdc20cba71f8f0ab8d1e024a0d2e66
+EntropyInputReseed = b632afd8481f67352d534e240cfa4f5e7405707df5ba17a41cfa17c574b7097558b08c361c6f0465c7351bc2cb96d7d3
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = ddbf4c5dc322202718d0b48a16f18c14fceeb9d178e0fb038b0ae6b01d6b0d6dd06649e8189726f12b50f7ec53f250ec18078da67b56fd7ba8cdb3cad1a602ec
+
+EntropyInput = 45329bc74685c7b29a1e9bb9e6c19eacf9a1ecd168be3b5a2e2ff437b5e6cdd56e89a4b2b8b6abb52713a48a51ccb302
+PersonalizationString = d6b1955d30db953a4009c7664b96aef47cc30d33db74986b171eb199c39225e0ebd25c7abacc06ed6c27921c2f9d7e10
+EntropyInputReseed = 6e5c464cc465801887c57291d47475ac481c98d033a8963053f2f614e995d1435a4b2d5249cbf83f620d74370d48c581
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 96c6583b98f2d75c9b6c87aaa788ca6dd9da10b02732001b55ab1ce7323cb4d60c6059e1ed95c0561302d2ce4381bfae8c2b7c49183ab72b42f80b7ad1587b75
+
+EntropyInput = 633ad6f4cf503c71746c19ba663d33c44b117f5fe182904059f19ea93a8695cf8d919da9e26f5885305294ea251f8118
+PersonalizationString = 2cb14794de9ed71b4c72ab22190a18581c1ce5dc4f29690bd5825faf8f067b11a06590dcd7476fffaf89c97d86b42d96
+EntropyInputReseed = 55c49d46f10d0854a804bbf2cc69914195af227afc5ea2b235f49d7558f74d0269c4fa96e9e1623cc85813eea228eb43
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 471ff70df171535368f196bb266100dbe1bc3f2b1ce1e2d6055f40976762188abdcfacb52b8080bd241b88feff2e1c1674a1b7c44a9f6028c9fd6a412fc44318
+
+EntropyInput = 751e977d7758c7502528bbce7ada64c1ba335a339d9485fa91c65d4e6697eefa46ebd3834d80db42bdf950f6e006a55e
+PersonalizationString = 5b42eb479187fac0972e5828f27a5f73daec306e06aa649f5d5ba53bc1a6484c2ca35bed946fa1a43ed34065579e3fc0
+EntropyInputReseed = d55d4a2fc2964ba03e0a303abab5dd8f38102606f00192923aa314de9fa40f62a4a5d0d162e7174ec5ec6e4d2b24f0ff
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 3bb47edc5be1049228022c593bdd6c84c66796b5ceaaba1d9198a47a4c35cf18e26e33bf4642e9cc2d918a6b6f957d183a561afd595f38b78de054c477632691
+
+EntropyInput = 0b51135d3da2432fcf11dda087f7d16fa5eba2eba0e1648d20d9e9454c20bfe7cf4520564539d6af4c508a3eff21a07d
+PersonalizationString = 1f167def62fd06158b63e46f6270012ca98f5bee3f53465ec75460e6f1461c40a17e06f9a198a589b176c51beb129541
+EntropyInputReseed = edd8a470ef55fe2168ce5559a6b49b70f8c103afbca8abff760cf753dc54b9daddc0109d33f73b5cb41ac35ad17497fe
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 7f3730cd13399922476499cd42a4759ac212d28601a3497b22333ebcc678f6d805f66cd1b982bcbe9f4b3638487189045efe55ba19064c9f075dec9e55320098
+
+EntropyInput = 27d1b659d83006bdb21f96e92b92802a56cb96d80319528b243d1aa5dbb26abf66ba9b6035e0d9f174623ad033df2ba1
+PersonalizationString = e7535703c11048c4fd1931526b2dcc5f6f26aa97247ea8bb1831dcd7c3f5a4d65bddd50f4fa3593afd30586e863b9006
+EntropyInputReseed = 5ca1908ae5277c17f1b2ffc4016e7b1c81bfb23eb0fa9b1fbabac1f58de6969157c069451d88cd41183ae6bf9b092466
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 3d4e16cce16ab16e813afe2020bdfe9f48f251e6934f2db3d3d2d520390d78d2ea84e3de56e38f444fce89baa1c212ae15973ba1e9f5db1aec06ec4e4b56f644
+
+EntropyInput = d57127112c44d1f4e94c0c785f5c66f9234a805910f8845c20865a79031b74edf0c8f110333c398fd32f0ee10a5a7a2a
+PersonalizationString = d1ca7e7e0740391c4a951570ee0560e038bbc2f520753f058ed969e1bd0fd6d5a2a1b24fdee5e3739ea2eeb1240f3e65
+EntropyInputReseed = 2a319061611e70df56516572af290512b3dc1bee0a0faf62dfbae03f2624895e53d89fd0b880c97d82b4aec0883828a3
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 55ac408cea1fe3b1bad3e5127e42fcc8489c19166a86bab212bf067b8b05820999899f422f7b375b595bebbc786a94ec14e3e3149c9df167ecdc635db5bcfbbb
+
+EntropyInput = 672aaf340238381ba8d31beb22bdc263e8018cfb9402aba769e440af29efe27fa79bcc91cccbae53106a64d65c07505b
+PersonalizationString = 654fb58b7cb249610461a41cce27402142603ff38795ec6b1a98666dbf9538ebe1564013037451bd337e8142db56767b
+EntropyInputReseed = 3a4f731de829f0029fa99b2499122ab7b4b15999930ba370417c8753966e40273f3d02a2b16a3ba5f49ba2bfa0c1f600
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = b66496d411c2b2993e6e47f15115e158c937279968c7d7d9efc0a6b12de66600d09308eebb4ca318a38e49f0912361f5f886f7ff21ee54ff112f8302cb1ad63f
+
+EntropyInput = f3be4e377015301079d180ca280454e34f6064040e359bdf0983a09939429d5262e6e5d86664fe929445fe34abd9794d
+PersonalizationString = 2aa1e491952232d335c6737f478871f5bf07f967b86f10a0103cfa2c31ef5f5ad2e4db4824cb0ac3c29ada3ab028cb96
+EntropyInputReseed = 9a6be29c4411d7de2e9321b0d8c1ee06d7998a1934ece5345ed3fb4969a68112c0051ede82a19afd76c419e469603679
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 3c58550151aa02fc5598eff921d2a0636345955bb03e6c8a39e7c9a95655de297c6199c0f9e6c5e2280e9e83e85306958d5d37d70bd80091f0c51f96ed74d420
+
+EntropyInput = ec975b46294711a8ac5b1d19b60a6981bb0675c5e202fae93fb7ca8adfbc2907db923c786c403fc514f0dc46b002fdfd
+PersonalizationString = cfbbe01cda290c89b2841f37952cfc1d9a4222fb425e9453de307ba9f82bc57382684484801ed68b6151fc7dbb7a17ba
+EntropyInputReseed = dc9c22b1006462af08615eca5998ea81a81411be226a241c38d480e7ae0ab5bb34721f0ab9226633d655675ffd953420
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = e544668dbca5b35bb59ab04945649cead8d822a1d8ce125e3ae5db8b23e3bcc05bf6921ce95b85766b92c13c59ae83d908471e03e020fdeb59e5cea817a48802
+
+EntropyInput = ed64cf25e9ca81e5572ebccbf892c8ac9d88c256b7ddd3f7f477579f80ea8fec7c452159b1a6ac9c59767504c0573b29
+PersonalizationString = f19cf2f821440adfa1f7f634a26925dc63e29b7993f7860558afc4d7c61f0d83145cdb13102e513edddfcf48bef17464
+EntropyInputReseed = d91c7a31dc11edf5c778bb1bc92067b6df2b5b5e90c04df5172562bbd38937ad62715c287651ce8ad4bf4c80b14c8c1e
+AdditionalInputReseed = 02bac94171c112c3774769148f137e6b72fd4bf9a74464cd24a7dfc6f75cab82a15e3847afe86999d0f665577bba6c20
+AdditionalInput1 = ffb738e975f48c5a5a7d8a63c418abb0604efe3cecac611bdf292e2ab47a4d33099ebdcb0d6c89c5849c1ed9693c435e
+AdditionalInput2 = 459f3d979eda0f8f8c273768df1f92344abfba4eaedf00356f02461e449da18843a44b08a46413dd3a1eb1ab5bd146ec
+ReturnedBits = 2a6a38fb6575f55cddb774ef51ca9db72e729065d102e866877798651f1850cf3be808f6378f860fcde6fc631b955fa07b5b7f5dd1ad1d1f32837ffa07311383
+
+EntropyInput = c4a815682b8ec783976c7aecfb71201e5c25ab4d2099ff7f0800a91efdbd884659258b1db9a10d518b0e11285efb9866
+PersonalizationString = 6d3b2347a61b373504d8557acd1b86e8c49d3c1c2f9759264a73f964d19bbeb7d5490bd04864733f9fd6c140d0475d9a
+EntropyInputReseed = f76c5bfbedfe08a00a7274ed2a70ccd79df3a62a1c3bbd89ea4ef8505b95410eb677369d2633cf6c964305c3a3e8f62b
+AdditionalInputReseed = c819d5ec126f00df73ef40c4ca1d1de8b6e9388b1bef50835bbe880ae4a0f201f2febfdd4167bb47bf24b782e07bdc1b
+AdditionalInput1 = 89770a03e8ec7a8c39d4a185f5a457a91fdb149fefc9e7daf041fef3e232e8101741d86cabc0af59ab8c3e2cc3f71a9f
+AdditionalInput2 = 6e243b506b470cf3209ec2f44f505cc74ff7a0146d94f1b4b0e6419bb419c4c1634a82fcd622da522b5d27c161846683
+ReturnedBits = 4b6bef575a555218469c8f7934565ee8232cdb511e25e4cfe4bede0de0254ac8005c0615854d5aad5305e0cd06b61d276973907741b4b1e4b44ef975468b2dc9
+
+EntropyInput = 3ecd19f79b77942ef82c120b5d6b3e7a84262298d18d35140b559236e8d465394339e7937b60bf96d75b150b997be706
+PersonalizationString = a2501964f9b233384fa2839ee5950738f0a39d5eb92b9f978c22cf02371444b3118f0d6d2e369708942e63e0e40061cc
+EntropyInputReseed = ab5eac9506384ad8ae49b1112eeb9a2483768ee6b3f0c2231e4565545baa94d5d02bc28a3eb335eea33cc100e2e4a0d6
+AdditionalInputReseed = 425eb96af35fb2fe786993f0b4db3395fe08fd002d8e294bd6d24250917c92fe455686b5a29c44910a85e3a36cd7b07c
+AdditionalInput1 = 18da79904acf7c74b2bb48e2f1730038bac5df654815fac888826cffc8581e963457e26e906c86b6cb862133240f49e4
+AdditionalInput2 = 3eb1ab2af18cadaeab7b8e5ca454adc55e67eed68eb860adec3b9abcafdabb3befe0229a611698873add422e596c8400
+ReturnedBits = e54b610804a2f9412fa154b885faba9bddc1f4e37e714a501992b0b89328926bc50217a7f47b140d41dffad74e343e917291ba5b89dcf00070a159fe222a688b
+
+EntropyInput = ac59f26284b8e802e1afa6bb7a2f979159d2c3ab903b62ec9014c12adb3d1f1262a435fc16bfd3014812eef8a451c4e3
+PersonalizationString = 5d498123556a0526c6aafdc33616cda01eda9d8fd42da7da4be9877f0b404310de76dc48b544438caecf25632978261a
+EntropyInputReseed = d565bff03c617497acb58fbe012497cdbf6ec277b22e1c21e65aea0f684962747075bd2c4a1b184ce423f1a5ee9e762f
+AdditionalInputReseed = b95710000d08552fff162fdff905c3682490be388adaedabade8824b38bb4729127b26f49686c74c3e83d2f37ee670bf
+AdditionalInput1 = d5c301976a5ce6349fa29b30d5ed761d9fb2e5e9f7624b613a198b40cc107ecfb3d7721131ea19b401751d85fb11be90
+AdditionalInput2 = 86a00e4ca6e2c1932df0248c31ccb2ab8d5fdd991a2db7cd27e824b2107ff00bf46e5df93d41d578e61236aa4f7b0274
+ReturnedBits = db29ecefa87169fd87b533ddea1ec00f50d288e7fff4729349a812dd20b192969d1c3f3b8711fdd0d26812dfbca6a919089be283bbfc9466f00e1d1a6394fb72
+
+EntropyInput = beef8f0ed9d77161dcb7b2da5f033e546e7c1d3d4c4ed5a423e9a6e70697edc842235a08f9f68f27907c9736f4efc4c6
+PersonalizationString = 2d5edcd634501c4b1d1236cf9f864193cf2ce7a7457e6b9aebfbc8b6685b79bc81b94304640ec0afa701f6db06854a62
+EntropyInputReseed = e53e04423771fedf9ece3fdf04ee8b66766c979f7ea3aae258eb9472e1aa99b817847fc022f6bb0ca28c0d6e6c6381a5
+AdditionalInputReseed = 387fedd127600d3b9a1e40d47b61aa0725b8829b8177ee6651086d1501878d59793bee23ae217203c2e2565d83b8d625
+AdditionalInput1 = 94c343014fff90b668d7bfd0d72dfde1adffef715957e0aeabfaa9f37cb85f5d0108dff094a064bc6fac052564f2615d
+AdditionalInput2 = 4663ff1f64bbc351b1646fcf1caeeff5a2d5796ce7bdbc393c1df62ca0445fa30dd00f7385569b9e9bf6490260b23432
+ReturnedBits = 06d60487a5317b289e68a171a0097ed4a30d6991c5e8f5af2e882c1109ea3e362a6c115d1ffea069a09f501bd6f03c66e8afd52a1147fecb216336e2382e1805
+
+EntropyInput = a8157b1dd29f1ed95a70922accbb14e683a10d5d22ca2311948d4ef091c37338d6965a08f942e33730e636dc04ade118
+PersonalizationString = 15069fbb16c0d9cac671c9ef238c5e8966f9f262758d9a7cb0c196d937c3c5a79067b9e64e74d306321ad58dda6d2ba8
+EntropyInputReseed = cbd6f2599416702c1815fa8270b54905998330e8b2dba6f9d234b65176dbfc8579fb899aeb4abb7a9d19d3268d7ca1c8
+AdditionalInputReseed = 5c960852e05b9dee8ab4b49481def6036734b39cb9bc99366c5c55a5d2ea1279eadf73d3105784736a30d8d05dd59ae5
+AdditionalInput1 = 7569e6db52e1478e3cbed54171a416ef69b6e6dc9b88fb3f52c95e0b682d44bf5da27f63929d4ec467bb32aa1c1dbf4c
+AdditionalInput2 = b3b9ae19c36ece8623fa47aa820f7c94bf20664fea1e544c45cb55695b21b39c62e851f7a3e9174e662d8e979a16f119
+ReturnedBits = 0e4594b734e7fa15ff6c08032de7ce3ddc47ef3a020b76b3c95fda71499def818af8d625bb81eb89257d28dc68dc4c9550e35c090a49cff16a65948ea2057497
+
+EntropyInput = 2e28e458a1d335f74a1fb2e22ea5be7783f78c721e7e687bba6ab9a5c93e4114b425ba74978c2e68b498fb53a760d4e0
+PersonalizationString = 89cd5a82953f8839b61350a8684e928c7df74493562b5c7c4b2f2f3eef74ce5db88c2bc3f0e5ed03fa1bea84014c3f9a
+EntropyInputReseed = c16a676937240e0523c5664fe37da9243b6e915042007c5ac5af4c334519a5195dd6419d0e1fcc86c9b96a272211accd
+AdditionalInputReseed = c392df2a338e1681a04dd162860ddb3b2d55566ba4e514a371fc31a356b9b5d44f71a3949abbfbc4b3337939e2a91dd6
+AdditionalInput1 = 0342c122b88473b951a27ba4544bc30a1044cfa522aff34ea127c01950a076edd97a4a2e0f1933a743ae7b9a17cc7ebd
+AdditionalInput2 = 21398020e37205c96cc5956eb62f284b15ea5e73c2c65df70fddeecca79b857b298aa21f67fb2042a0b18ab6ca9369b6
+ReturnedBits = 6cd82dacda43cc6638bf6b17a56351c00c580f5ab0f5b652c90f3e77a63753d783751a4c29afe8286e48f3e573d5fa50b5125b4c71892e7f09781e8b9c0f45f7
+
+EntropyInput = cb05e1ee85ac6e9f6e2089d135c7d43a6bb1581b7373366be86019fcbf9278b784e0ed786661430730e6b02041035ee0
+PersonalizationString = 19a4f5ce1e9a9f8a5a1618b235490ff22fc7b3a8116d144359676a4386063b1bd02309130b8d6c8a4ba3b412f36a488b
+EntropyInputReseed = ecc29402fbfb7e8194b1f4452973cf27488619d3ecc9ad6c25ece75bd597e0e866cb53324ba5f9b78fafe5698c560ae9
+AdditionalInputReseed = f754c60d68ce5fcdc7df8cde147af6d3191ba47f6a02926deea2e5fc5588b0c28d580652438e18c7b8d57837e805f439
+AdditionalInput1 = c709cad8785e54f3dea0ddd44a46384a1e594abf9d9db7eba013153cb9c77737011fd139197cf967f515445cc082e5e8
+AdditionalInput2 = 2d95868285ebd3124e8d40d5ba0f53d5311ade0f707f225fc47a0a5f0e7948878eb8ab985dac3d3a378b2cf9155239c6
+ReturnedBits = 34516422c33315f6a52c131965e305e697488f0104ddb71936c27dc6012a6c4181338979c238d99820f4fbbc0bb12f54ed391a31d74a4f1c899caeb5fa25de3e
+
+EntropyInput = 855ab54214dc0a64f6699f4f3fc1bf1ba64cbce42d322b86b427d8864e8f86ef85435578fa2032ce7c6b2da4044c789f
+PersonalizationString = 7b7125859daae96449a3997b4997113017775e6d48767e2c89baf98e77d18917343f722b410c62fb694c2e5d24a25909
+EntropyInputReseed = dacfd66033c75f3d875a23be63198a6724fb1430b2c3b88d7be8a983a318d064b80c6398f1ec351685945557ccad8471
+AdditionalInputReseed = 1a1ca1dd4fa30f5850d7bc7da7d84a8e160eba1bb8d7c71fdc0bf0e04d99953f30bc51c0f4720aad3d359638c13551ac
+AdditionalInput1 = 934b52e86c938f09c00562ac219347cea8b4892776bf1b460b3d07e4af2c13c6458be10807b5a6cba2ce0067d3949948
+AdditionalInput2 = 2d991038c3c86a633d42c17db0ad47ac453719fec3e319888b777eb03d433dd306e3870a32972ef92e0e05b7efe6e554
+ReturnedBits = f622de890ea30789574ef1bdbe47b011e8ca5380c7c86c8fe82ac0831a003b20af8f39339697600ac475ff97f40736339ae34da7fa42180d444afe8ffd486296
+
+EntropyInput = 554a4dbd10bd99ccaf1e950eacc038ef518262c9d3c30eaf421bee22e78356f6c345822adb5889acd960dbc622e1307b
+PersonalizationString = eb10ac136ed6bc9101818bbc1e27f6f4453e9088cf5aa4a89db933ea00c8ce2155fc060938da0aa068ddfb4e44b9ae8e
+EntropyInputReseed = 5dcad80c27492f34f68743bb07691b352f537f022a1b63d96a91da391ddc530809d874ae118876985ad2dca917ad8b6d
+AdditionalInputReseed = 63242c7ef2235812056ed15cbf68be9173dbe11ac733131ec7e392da9d275be2591c95f3d8f671ab21507474a59eca18
+AdditionalInput1 = 2586a1af832376b526679cce9d0dc575108d64cbf540167ea321d14ec672e4e9d981f9f3b37a52b0bd42b66669cce140
+AdditionalInput2 = 6bc0888746c12f945812d5fa382b252c4e5c894a8f65add71e9c9d0ffd5b22f537c440870f0a0b70faa51af771db849e
+ReturnedBits = ce627ee4c9f2096166af58ec0329218469120f7f303f7d12b5d9b0eef35c664865fe85170fbbf51060aad0e6f7f64fba86fd4c71ee57bb07b9613a858611c8e3
+
+EntropyInput = d199bbd51ceba0323ac491ff145208eff3fb45f17bd499d00c79b5cd429286ad9e33d10059223489acbc2796880407ee
+PersonalizationString = 670d1083e6e0a83b8ac6f258a6004aed9b9117b6f9902b4fa8a14fc5580f3e9d40413c72c8ce8d7c53628495ce2924f4
+EntropyInputReseed = d6a33a4fba1e8839bc5fca6c7ba6317177c5c9a2986b03978c9a43a82f6b1f6cee443e762728399376dd866d8a99ba60
+AdditionalInputReseed = 6fada66ccea9e95277ce1de35fcb5d1b42ea35a00eb588abd4062c2316566d0ef6ae9fe3b4e49dd1d86f07c9695505fc
+AdditionalInput1 = 2d78cb131661c55aeed68c225e97107ac666c84ccaa7770c498ea9edaf38e5c3e241a54fa93105effcf864dd0d74e313
+AdditionalInput2 = 06b16d026aca610af5e084f7589f8c2966f8ceceed4d2d560ed6aa5294503587c899b0e2ef0f222df0e7abbe89371282
+ReturnedBits = d4f0441b303a6327c7fb75113ee6746cfff5d2fedf63e8c8de8e2af0f6a5948a12a94ca92e08be8eb9bf5da8fd4b45efadc9327f8e3a458b0a3b74dade4a3359
+
+EntropyInput = ee953ecefab555913aefbff24a588bcc380660759e1891f68e602ef7b090bd33026c2e346f67d34151b6e69a40d6d8d5
+PersonalizationString = e077d42dfe697620f21a9f8ad5eae6c87589d9c1c37d30dddef2ab81cfbae9797500795ce5a00d79b3518feecb1ed8eb
+EntropyInputReseed = 4ee2c46cd99e8b5d8fab2f0d27200e2992f15acbe2f13a8f405877edf4ff7eb2373ccaf402fa8adf97e806f55fde210c
+AdditionalInputReseed = 944a1ee031967bd9d352606f970a3e522f03b9385d7351887e7482c262ee884bdab3c7cfd0259075931033c4bc199f80
+AdditionalInput1 = c8fd4759c1277051b6841ae71efcadc4f0978c42266d1fd4872b0051a48845b8dfc5d2aaba692e08fe5f9181f0cddd85
+AdditionalInput2 = 2de6be848de7a03befd8fab5228f2354b58762fd42438cdb7ce550ef0637ee30d7aa13ed01a790acd42feb84adc8fa09
+ReturnedBits = a8ed5bd83c15ecdb7df0f6ed186fb899c98a154fee0475916fe11089d48f21740f7ceaa83fc53f91c6b03b167b697cf09053509f100f6998c950ecc634f266ee
+
+EntropyInput = 0a34b82b54645f46e74e4161498e75f5fe35531738b9ee002eecb3fd83c217b1e0f958897a3e8800d8c5882189cf2f95
+PersonalizationString = 9a251b28cdfd57fa1f58a00ed423d521d6e0a4036e5a549abd81e53f1793cfa3162ceccf010049a5c9dd5550ff3fdd80
+EntropyInputReseed = 9e4b5d5ec7032c09de00c7faf6515b05e57646092a3df2083ed06b61f9632aa70285a43ab0b569fa429684dfd29bc405
+AdditionalInputReseed = fd44060a04df78e555b9456fbc840a5f4a29d0edb3596b793c39f1a7d7ecd7b755f698672eeeef14f42825540aa4558c
+AdditionalInput1 = dd065094e40c6cece19ba12aee2d37c615a789edbecac70255d2606aba6fffeeae98272285cbb375e7bb4d0b8c8b8cff
+AdditionalInput2 = b45166e7f755571c72d406e73a4ae6b3d37541177410abf2faef93d30b4c679cc9b346f1006b24cfc467e378f176296d
+ReturnedBits = d7ddecf1cf61841e65e650843eb157e2cbfc099fae94365ab950794f911a8f8b227cf73489fd7831bf410fab026d90ed9d031206a759b12c49a958402363ed7d
+
+EntropyInput = b5809957b179e55b2bfe55f48d24f1fe8156a36df7a9ed5feca01c7aea019be774820933b7ec5e56913d96eb672fc065
+PersonalizationString = a15d7ee83b1157b9a5198d201efc466082072430c484375aefc857ec235f988cfb2873aa6d4331f810a0c388358bb52f
+EntropyInputReseed = d989c2e2c35a89ca3142844d8a9bc09df2b1bc525dec29e4538afa6a7cae5aff97f96d970311226069ed8768679d2d1f
+AdditionalInputReseed = 577f1f4818bd6e4fe0afcd8348b9f374c98eecf4ba4af55c3d17ede2a64bbfee6703ffe68bdfd23a78c0cd79a63eccca
+AdditionalInput1 = dd6b7e68e80c0bf351e50e4efc66151e0843df821d11f5c2aecdade8289d7a5175d487a8dd24813c6bf97cf73aa14f33
+AdditionalInput2 = 3a29c7bcd43879034ff04a9b1927d38dcc176fdbb58e9cc23e00a14cf56fb26c32a338344ea97aaf410107801393f077
+ReturnedBits = fe26309dcc58cdb641cda53fe4433c25067919e55525a4a26c742830dae22c1be3e7e96f6fa502a6cabf6c79f3438db80d580c26e675f939a95183272cc816c9
+
+EntropyInput = a19f8cfa223ad1b25d109d901a1061e8fb0237598690654c83f1271ca7db6a0c8a0e093b7e80314fa68014397c12edea
+PersonalizationString = ef6b17ca95a74a72f1035006c0b99406f6e2e7dcc90892d0f31ed0aba7fa3694459cd3de632fef04afdc31fa326e424a
+EntropyInputReseed = 1296227fec4c2bac914416dd33e30dcf3e964d64d2ea6c9dd397e83c1c2dd173bceac904df233098ff7b5319e89b748b
+AdditionalInputReseed = a4fa86d5d2dd1368a93bdf19e4071ecf2d4fc3cbed04f544fdb96183ea5a55b9c293636fe098e2710d952a511a36a66d
+AdditionalInput1 = bd203cdd94307bab1a53734a3a451f0b038614892186b26877b2c1c8492b03986e2ec4aeeb09d2e906e78c1c234fa675
+AdditionalInput2 = 631cf0317b713d07ce74f7b05ff4e7a158c769993d357325f8e9d16b25076bc9b0febbbd66bf23fbc9c27286dc1663e7
+ReturnedBits = 401176185d33ef08d0b65a5b853d57583250dd2efaf44ca0f987b45f89eafeb52d2f4346bf9b9d0b7dd4f7126e7d89dd32f53b737cef79ab5dd0794fb8a4c89d
+
+EntropyInput = f52b9e211605277c7720c9a6e252846e54d9f1ce442ed891c58dba70c58a8a3b59bbac22fa78dc2683be964a7b3349f3
+PersonalizationString =
+EntropyInputReseed = a16ae58c900fd2c89445d6b1775b4ed879b918a577622687e5e76685f05d04265058286a1a42794abe44ca798e32eda1
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 5d2544951b74e09b8601c19c99301784938c595b4db3b2df474b10caad9e4930e1f0107662408ec374ddee05d84521e3e9ea7d2114f03f9a9a92ada6253cc3e5
+
+EntropyInput = cf1de61cffd8ed4e6ebe7246ef185557039792ebcb75081ba3f47fe4ee442b733274f42024d24d2e19940d88abcffe40
+PersonalizationString =
+EntropyInputReseed = a54d64421dab046606e167c862e557a4d4a8d5b4e86f2b269f8336af20d33d5ac531229279049e404c74956b753747b0
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 692165d99365ee683b7148f7050a0abf2c3693b77725d2babea71fb7165bf7498e03ea8200e5c50fbc6bbcdc77499f5421385a09bbc6923827a328ee491431e6
+
+EntropyInput = bdf7429260ef6fc8a3817368fb72ca1bcc0574bd5361d6f30431187bec83c52c667f12fee192c2fd911b6f9deee38f30
+PersonalizationString =
+EntropyInputReseed = b6698f9646312ccab30344f8b5e835aa47abd83bf1c40c3ec48834eba68e50baf52e4177a215dc90f9e8761562befbac
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 7db86c35f0a694aaca6c097b1816424d1833eec200d18a1ef6cfc49ab5ff444e3bb6064ff1cb6b1d63ddab2a2b8c18a11c4ccc3c419e106a03ff57c907f7a769
+
+EntropyInput = f1c71c385ef4c9b155de46a8852ad896223372ef8db06c1a5ac4c87a561331e9232996b548a7e797e34dfc0a0639834a
+PersonalizationString =
+EntropyInputReseed = 4c275fc8ce30104b6b4e4c16e21199d3cbbbf7393c054c89cb9c3b85e5af5ab25a26502309202e8d78c1d30740973d0a
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = c7a92dfd519488b5f4aacc42d704146c7219f33ff3b930d4fed22827ef7df287e71e0c72cadd8fae20ff0e058308f488fc451c3bec0d85488d2b81f2ecd32e2f
+
+EntropyInput = 29a100a29a002c98f3f5e8170d731cc3fd2d8fdb4a3c6879057f88f96ff7f66f085bb2d30957aa0db78a4ed247a939c9
+PersonalizationString =
+EntropyInputReseed = 5e98af56d5066c99f185015eb8e36cc435690e965fea9d2eca10bff147c18a2c06755d7e0ceb9c2203d6d48ee53ec0c4
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 9245cb558f4dd7dd7cb448fc1310cf58cbd18ea6d9c58953e3a82221cb49a9a5afd02dfcc86fc42584fb9cc1e23c2483bbc61a4b146b1c7193705bfa50fd67a0
+
+EntropyInput = a8070ce6e769ff82e90b9ae0ae91420ef1c4618937fe006d179981ffce04afeb7f98820912512ae48d7e3cd2be80da46
+PersonalizationString =
+EntropyInputReseed = 3b14197c3eaf4f3c7fd1d75caccffca207083dab30cf31e014056174083ae2bf3ca83195fde7d2ed47a4bc77e90b4204
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = bdc7462f1bcd82e405022a5ee58345effd90e49a8f15bc1cb1f7f567ab26dc0577cea1a9c7e463a81acdbf62906b2565e8bcb16e195030aef3d2cd60fa987a60
+
+EntropyInput = 4c0d4989e284ffe38f1a0458186e007876daf40c2ee755ecccb09cb0db7f497f9b3a80ba78426b049c0cf7766e1bd129
+PersonalizationString =
+EntropyInputReseed = f4cb5700145e3370011f5d1b0c104ec36f1240ab5871226ce4de0e3862d9432c749e6f04b5708cdf24c0caf4919e1520
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = a936e1179ba75b2f3fab6903ec1161c87b6e1244852fb061324299645105bf5e38b67c5941200ea5e6ef2962ecccfe0516e20314f83ee5815a925d7026965e00
+
+EntropyInput = 621663b9aa2f9f7ff61e8db0d99007ea9819b50ad4876439d66fdfc54bf174fa740fd6e1d2292b1195b37d584a7b4606
+PersonalizationString =
+EntropyInputReseed = f2473fd74186f13d6d599bf232680f4dae2e8ce69dafd2dd2a6b2b2b13dd0b2f6dc8cd436136215efb27bdd530f92810
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 9bbe30868c8d86d008c4f1bf18052c73a5c36c062c0557f6ee4176bcf308b77411421cef0c4c24a740ca31a4921a86944da2b54d9d29c2d3b53ad17bfa9c808c
+
+EntropyInput = 3e9c7aa2bb18213933c7c6f22323bc29bb94aed24fa2faa7caa572c86c109f2247de3173479893fea325dc12c8363244
+PersonalizationString =
+EntropyInputReseed = 4356acee8a2f6d5bae662d5ed8957bae47de31a9061cd95e8e567b74e58680622986142fd299bf15a5076a07365bfe00
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 95a85a176afad06e245c50e596641e15fd5d9dfa02428bf8ddb2a449106ee0f928155343a6ea69dcede14a711c0c74b0ab232db7f4e67114514a2fbe34a1ce38
+
+EntropyInput = fa3ccdae461578a289eddb413cc87a89dc67648cd52445563a7b3b47a87c89337503271511c75035d939bc50098ed1cf
+PersonalizationString =
+EntropyInputReseed = 357a52867450cadedefcc93b2e730034a643b9fdd099b9849e815a7437dbe33e19b6a2826fa7ffb5d7b9e51222484e44
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = d097062ee806dce8b24cdb36a17e7c387d4f781339ce87cbb89164af15eed22089f83ae0a371d3662eab2bddca6ba0595db163326d971a363dffef053b357fcf
+
+EntropyInput = d54e0e096bffa6121eeca0f81532eaa0d3d1d98361883ccd516ab0dccf7b0bfaa1b43839a1484d15d2706296e2ad8036
+PersonalizationString =
+EntropyInputReseed = 43276e93b3fc7cfb4962d7b6465096affd5c1fe1228fbeccb32e93c2704624ab7d4d88f80f04b81d2e4482df6d4f94be
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 54d28fe068be42e880fe2f0d60a52f9f9e6ab1d22f1161ea55892732e19252e48aec600a95af17ceed15aaf1c993726e1ab02d8215184ce8de00c138a79f672c
+
+EntropyInput = 055eda658019be5847baaad87fe290c37c050be4dbef1b07083449c9c84dfd6df4b667ea92883be5e71637a72418c5b9
+PersonalizationString =
+EntropyInputReseed = c8da537fdc88c0202c6d58d3f7fc0f005ef5a5b351758265a529c55067cf0dd3d3308e7a5c43b683eebff01fb91347a7
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = d918e205318696621a8671a8f42236a5230830bb61feb7146d22d8b89d29715a5ac1774537aa9a50e5709914d13342d768fe86a9bcef353c30ac88aa16ae1969
+
+EntropyInput = 09a1d28857224e96d7b22cab8f185438c0e8764788582a79ede70d78b2287a9aea829e25406172a908dc5a15fb8a8e20
+PersonalizationString =
+EntropyInputReseed = 26859027ff5b5097f41e66b52f3689dd829f139bf5ed79a5c4052795d1b8676d0bb7019a551dd59a65ac0298e71c1c1f
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = e4da2f0af600c78665268882ea07ed6322d7369d04148a7cd7847952ed7e6a894e3f1f4c2d4d768f5a7fd40332dabdd88afb2384573afbb6d79e0b3c3e8d4f9a
+
+EntropyInput = a4446788f243691cda9ad6920e4430f9469e58e837b801cebe0f8d5c518fac535051f3ebd3579e1fcb908dc989a790e2
+PersonalizationString =
+EntropyInputReseed = c5bbc33a3abbe355f38dc8f030540bd7e423bc42c526ea766d9f10d1613b0028b55b99efa574d509fde92a1ec3678683
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = a131b551c8f31d4b4a9e33b0e54f7c6f142d126da738d79d31176cf5ae7c040c235f2ca0fd7a69077c096ac300f7445985f2ed39cd22e2cf8d146665f6b81e9e
+
+EntropyInput = 91fa80b727040295b850119e9fb7e4cce4551ae234f29616af15572557d1555de0424ac3928e39ca0ee3978d956f3258
+PersonalizationString =
+EntropyInputReseed = 9937f776ddae1dd4a6ed76cc1795d450e14d1e462c30a9e1a85334b3ca148451b94e00055b3ed227f0a2fc247db4db6d
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = e659a7de7a1b1b15a56170a1d6334dec91b6fffc47fb7ae1f2b3af03cbc25f7bec0cb6afadb76af9d36216825ee0e13aa3915bc515325c27270858654175a81d
+
+EntropyInput = 20a8e7e47108cd4f283e5b169855bda83899516e51825bb52248ba8c405da44964502c9fc74da0e2ad4ca1f493134243
+PersonalizationString =
+EntropyInputReseed = 98ba67c7e057a5a328bc9b223796b36947b1fca1ab6b20c1dd25142e949df27e8122c8a6792d8a1156a60b1170a3b5c4
+AdditionalInputReseed = 648fa229f5ea25ee6c7453ed577c70f755a2cb90f852b72b282d30bedebaf74af461a2a8a3456e653e7de9ef3740bc44
+AdditionalInput1 = daf5b64ba409b524c211a300465c631bd900453221023a41927b3d144da0131d89f74c0f18b029994ce84ec9b3684293
+AdditionalInput2 = 6138156ccc58e759d762fb5db2c0926ade760ff531582f1bd8ef430f7f7ab623f82082ad58c2d629340945546bf94e2d
+ReturnedBits = db51c68e5dc6dc500dafa4d07836749df4fc54d0c8e78a3a01ad3162c2438d8aa1698c4ab6b448c3ebd37d23fae3c9ba6aad0912cd15475e9478d4793617a3ce
+
+EntropyInput = a781015e066eaee18f30135e518b87cebbb79c5f0afaa4ab21bb5ab808f09ffd8ccd2ad02606f8cdab95bf897e2bbb1b
+PersonalizationString =
+EntropyInputReseed = 287e14ff5446a2eefd023f208bc8f583c80ddf84fa88e0a55c5a41414ffd1a7297d41017b3a37ef1290aed629e74376e
+AdditionalInputReseed = a7a3d011fb2d7494e023d5de0c32642e0ebb765e0ce5e79dab2dcb7637480ba6110d7a07a3ad7c130139048f80a1c16b
+AdditionalInput1 = 1786eb125d51cfff9164449ba2bacf9a216f4c45a685c07502bf074ce4a61a6ac640e2c1836f2e204598d51428839269
+AdditionalInput2 = d2fee3f2e3a00ee4bc3dbcd19c313cf74d5d34ab6219407efa16db64f726cdaa68692f8edd2abc871b08a33d2a9c922d
+ReturnedBits = 94b2f16610cb7e300bd1bea6b4c3a8d671f2b87ef419d758dfd0217a3d3e462b5e3f5ec054d0934d701748d70fc891c487f715c881416a87240371e9532848fe
+
+EntropyInput = e744b498e9a6f2f1844fd234e024d4fce34cac87bc7137b207cd29c910c77fb949e2a78a397fb03e665544091385cdc5
+PersonalizationString =
+EntropyInputReseed = 807df385e0b02526303ae24426cf4ca77df319c64a145cdbc86540422cca77edc5727190719b5b22743c44524357e1a5
+AdditionalInputReseed = b0cfa699d908b03f80b5352f5f926013bb54fa95724239f32b9facf94e80d0c636124ce042d7a2af62f55ca7a320fc83
+AdditionalInput1 = a45ef12dc13ed4f86ebb70811346173ca4709d6d229bbb815c6d5538366701aee390e1e72dcc7b064f524a2537e1b420
+AdditionalInput2 = f80f9eedc0c0636477985006b3baee45a0f08c365b1cacfc9d6498417c3d51bfdddfa819b7a896f569b113ac9bfff844
+ReturnedBits = 12f570a2d2a341e5b34bfc98d1c72361b8454fe55727a6a36d7716c8cbab2ca785d310065fcf882de21a7bb5749ee8afd367aabff898a31621e06ec5135f04e8
+
+EntropyInput = 3c2d811b1e8d2f1351d35a4dff670fccb227fa44caccc0d0b71c1654ae09601927f271ab0c9683ad5faf4a3c3b80beb3
+PersonalizationString =
+EntropyInputReseed = bfd0a13b0e2bb9040bafff295d0b08c451715ef0f9e30db50c38a135c56ad9f58724bfaf268006f557969f1433b63426
+AdditionalInputReseed = 9bca5a77a81bf97d699fbee6cb2222c47bbefcd81b6e6c693b72ace0f4668e5ef8d3afa825b21419f501a6f7e39c3fc1
+AdditionalInput1 = 4b9a7eb941dfbef05df206354386a3c3b136a9de21ea307a96d83bdfd1c2cca8bdfd608d3765880f0eb05d6f88136821
+AdditionalInput2 = c211fa5ecadcac40fee7533aba6ef65f93a2276ec1023951c674dfeacad39ac0d3736fb6d916e9d46e6caa7857538f02
+ReturnedBits = 673fded4f9428dd5fcc16e8dd14c69cfbcc1a6ab5a4cd47679ba12d96e4a069d292268c5ad6c431c7e911998b419dd0e9997755940e6aae0768a86b7fbf557da
+
+EntropyInput = 2b3fce2c05533fa1349a7544a080d1eff84d78008c69e41462c659ec3c139313dc3ef23178c57646ce0e4cf6c3465e22
+PersonalizationString =
+EntropyInputReseed = 736c35c46e6c8acfe301ec58070c548c5530fd8494f9c586f451a132c70a9115fa2842f164e5c10a0ae528ee209a4f32
+AdditionalInputReseed = 03c028dfc095eb49b4ae76576ee7fc56b76a1baf14cf30a83d65d4c97140008a06f03c1ca33c4b93d24c366c922cd9bd
+AdditionalInput1 = bf7d34c4cc7bed84559ede042ab39911022a5988350c55c382cc8d78dca657fc163aba716b4feefd2dd3a1eb883bd0ed
+AdditionalInput2 = d3b7aea7fe27a1687662792f8a2a62487500b273fbdfae74214478891d3e061870615d9cc03f0073c72748b448bb7f82
+ReturnedBits = d95e14ec1870b8f6e9eb9ef6ccc0d6be943fed07c4cb960919e82cbadb92b43f114811765be1aad748f7361515a965dc8e4ac233fa02465361212403c80d3f67
+
+EntropyInput = 81b0b1ecfd3c1920022c8a73b77465a798bc4c29b448d88353054434abbd21c285c4269e8621c7fcae1849e3d34f93e2
+PersonalizationString =
+EntropyInputReseed = fb807fd0622a626f2c8f36496715a890944d501c4b4022b48736347a3018b0aa0f6157ee6018da87139555a5cccbe679
+AdditionalInputReseed = 271f482a812e679a2cc875450822b9caf4d6db61f3d20263e19047656348c7b0539ee34287911a0bf6a7a27e637adbbb
+AdditionalInput1 = cda474067d78a394319705a6174823a29b1bcccb93e4f1c03277001f4c52fe7c65e46da14b32a5183b07570db8c91d4a
+AdditionalInput2 = cdb048f3607f31ff5aab419d69f8cd2569886282b259fbd49a7cdd8e7d861fc6624d3f55b4aeafbb8542ebce1cd87618
+ReturnedBits = 4c0e553ada4e6fe6f1d3dd84a991856b551fe72098e3a008a753716afe0628861cd83ce2e0ea645b24b8408360f6d9e11003ee203e01fb26aa4afe21ccfd0391
+
+EntropyInput = b52dcfa7f85a0383266590b58fc2d19525aecd9d226fcad4cf9e15c3751198c4feb93559db7dd8ac67a0c6b8d37170c8
+PersonalizationString =
+EntropyInputReseed = 40d6413ddb8624d98373341a46391351d848c9d8e80668d023e73544ccd3f0bd341145a5d1c1a0c7d409b83d5aa396b9
+AdditionalInputReseed = 04e340bab1e1e18e96b5ef84f9cf3e40b58737d9a9d0f8a448cda6affaf46fcb4c25100e5de0f6d8d4b872e3de77ab77
+AdditionalInput1 = 0a70b0b0d9b3f1b196f92c68e7926297873e98973b2eee4f2a48c34c9a10a47da066d4faf4a3f0a80ea3f34dc29bcf67
+AdditionalInput2 = 179b17e306c29e4600506dedeb941509f76e528d886462c5ee71f7fea9e2bedbb9aa3107cba55a484e3675f775f72863
+ReturnedBits = f390b947e7837c91fcb9774b1dfd4dda305965a8a5bc06d6a1082d97a9050d13ae4333bead8e8907b57c6df0ba658abb35fdfd595b6d68dd4b0693758e186a65
+
+EntropyInput = c337a3e78d7d2e11c849870006f2e76e7fee30ec076d377bdc879f2583241e3b3b7b863dd9c2e1379aed93f2f8dae522
+PersonalizationString =
+EntropyInputReseed = ad410791ad781f70d6bb8b883d1724f6cecb3245141f789c1a8a9a1d45706493baab5b2b3d1cbe5d2ba41e4123e05b95
+AdditionalInputReseed = 13d425b36bcd17801b077e71b00ae3c90e8b6bf9b520c006f68cbc238e5a9592227013276e559a72e1b952f61e8a4c62
+AdditionalInput1 = 9c49419e869018268c9db5fcc0f7a935d17cb9ff04ea4d56a6555cebb89a6f4cd0d1eb832342c42264dbae1d335225b3
+AdditionalInput2 = ee2049b4c36292a451aaaa87e7f7eb918e8e0a492ebe71fc3b24499f921a23d2a01b7bd8e75851c892ccf124cc298876
+ReturnedBits = fa1ac7ad59924d7ab57c0186def694645805f895f6b045dde12933371f9601c6c9133205093445620d2acfeab44b133bf93f27e5daaf7453e98e6e477813d3ca
+
+EntropyInput = 7cd68d979a01244c08eac6bd20c076919918dbc7f09ef502727dbf50bbf25762f6c06e0e6c55455f542891572cc5d75e
+PersonalizationString =
+EntropyInputReseed = a0de6b1d841631d370c35ed229769eeab425e144ce5bbe98505af5381fed45aab711afa059624d05f0f732fce3997e71
+AdditionalInputReseed = 92c27d005fc497886958085ae5a243fe28cc6d3142b3817b201a067e45f6b85b8a7d67d2b57bea167cc7b53153f96456
+AdditionalInput1 = 502ba386881fa8167c9ac144275630e7cb6b83f0b09dbca29b60f434b663af1f3c73dc50e64eeaa86aa66cb7aba365e9
+AdditionalInput2 = 1d737c092bc0867d935c0a869539476358f3cde932d07d949b26cc190d450fa7595f162b29c9c96e9a84239173c93942
+ReturnedBits = 979cb9eb1e30e40085f07c23c20f349381fff833d3868ad98d36c7f8961ce73bb3dc995136eb472e4bff71fa1c2938a78cbbde6427f2110fb6d64c6d3277cadd
+
+EntropyInput = 1387d53ea472d70198698ea597b146b5b4010334d141f745436cd4c1e0f612b20e668a0a7a6c8e7dd6e47c0c0f02d45a
+PersonalizationString =
+EntropyInputReseed = a79e5d181f955a4640f15e7bb5a32788f5415deab98c09524f630ba73459a5f70504626702054b3bcad37739dec33bb1
+AdditionalInputReseed = 1f6abaa424bade0d26198544aed64eff7a372d16ade19c8fdde4d8338ded29bb107660492e0bfbbd0eec7679a69184f9
+AdditionalInput1 = c1ca5cd0fb1b6a3f468f9d9efeab54641836aefaa4f6f2f6d8cfca3ead7f736fb2a04bb17a9d64f2d1e8fb12ef06917b
+AdditionalInput2 = 5dc9499690cb78fbf3df333026ab0477d800eefe9973dc5f33c463474b84465a9556c8abbdde3f7e86be57f7368e6d63
+ReturnedBits = 5cef6ec53c22448b5280ade051dbbe332398a8581c9f41885872a5dc54ea95df6c82fa8c10c2f3e1f0dfd788e4616b97389603a700098029d07dc6ee8c38dd41
+
+EntropyInput = 30ccdea131c468d1c180bd536899f6a550d25c31cee10ce0f82859158b5ffd3ee771e4502d24b5e269b527ba6d2ec587
+PersonalizationString =
+EntropyInputReseed = 4bbe5fe0d0cf2668d1d2c69671e38c3213e59c74ed06c8fe5a534ee83a37f549f1a683d995b60785be7135638082f706
+AdditionalInputReseed = 4471092a771a150bcde99005cb676cdff4d5b478ccdd53b619e19dfd4bec325fe98f72d0320a36a64db40b53558d1379
+AdditionalInput1 = 7d159895ecc245e4912df0a21775347e1c1a16601bc7f0a15a7592a4e57c2d6b9fedae13653906316cca0d15e1a5eb65
+AdditionalInput2 = 5ebae32449546ecce203fcb58feb403e7bf84594a7fdcbe9767bdae6cb090da38b9fd2bda4b1015831479d830423652c
+ReturnedBits = 9bb50d63fafbc26565e1d6d2147d99e5acb0a6237e23a1bda06db8ed35a5de9db1042060cd46e4420d401633c3331a6cfd62dd20d4ae8fc1500f7e28dd2ec406
+
+EntropyInput = 94b635e206c621c41d39e504837af38757b9e04747d157f9515278214ff2499caed155c6cd5cbe333bd7fd3b952168eb
+PersonalizationString =
+EntropyInputReseed = d3c59c86fdf1c0e64c68734b0e79183cb69654e3ea884b9275b16e5134ba88ec683cada5c7e0b844cf5665520d21d495
+AdditionalInputReseed = 3e0b17a83a2e99e3319b5e33d029af66169b83214074f6220784edf665eb3b2282a022ff3ba1727b0be98dc3a4abb7ce
+AdditionalInput1 = f6c288428deb32de2fdf95c85222c5a920d62dee1321c6b3264004917ae76517005beb3ebfbeabceca844fe789e3dc1b
+AdditionalInput2 = c08a896fc0bae05a44ca97071ecc0b71754687b079bb950d7f7b9d3dcf205704268d0fa2f9b0343065c89aa85909a760
+ReturnedBits = 575a0dc1790b09fd562d88afba385a20c127adc4594823eb59cc08282187fcae14c8c783492b8df173fcc61089c08d0e421b6d7d15b0c00a771e9dac8bb6bff9
+
+EntropyInput = 3840a4aec352a641a9fac77bb265031f807c26a54a561d5f8a27533452c357f2b451fb93872f4a03d827fdc179573db9
+PersonalizationString =
+EntropyInputReseed = d55d27768ae2beeb6801a1b1d440c981c603df06fbe9bdee32fe97a4b204417856486b4a340f16c02f67245c2923dbc2
+AdditionalInputReseed = 08aed0dff1e14c4f1190e913549a95370057c79f9ab2005e1d9d01a3ba1f0f4378cabdca0b379322b28696df4a2dd503
+AdditionalInput1 = c962128b63be959410f99867cfce8ef78bedfd4aa3fc6bbe92ace950f66a9dc18235908ccf189e5840f58460348fd5a3
+AdditionalInput2 = 04c115c2871165e9213590c15c03451c728bb6e281918a37cee350d59e06266d65ff8ceea5f9b3c5793b1c6645fb86d4
+ReturnedBits = a8561d30e2fb9eaa7e3081385c82b3ba5afe9918595d55afc4402e886a6c2fe0a004b0d9ad2b7b2ae3ff75af3961e690d7ec94847dc32e2c4a896851e6dd0670
+
+EntropyInput = 07f0e0d4b9cb7d6ddbde41c3f2eb3425682276850dfa1afff6390a58d0471fd756d0ddee3b079e0ddb59b525ca45beae
+PersonalizationString =
+EntropyInputReseed = 055cd020ddd6f53295bc199a637021c01f27e323e65d7bef36ece3fb4e11a917fd41e73aef00ac38bd2b4075236adb7a
+AdditionalInputReseed = 748cbd4b23f1e73bc178b090a88a706ef4237fd70cb6bb2f05ba890686fdb9863ed40a883189719c12df6071bdfd65ed
+AdditionalInput1 = 43171a090219891ac2dedec623b72209be58f6ca367de9e23fe71c439d5c66d2fb5c3c9b6da5fee4e7f5e0737d217f2f
+AdditionalInput2 = d53ac118a6c1b81946eed05ccc6ffaf993464072b86b6895f734b664f68264bb351a824e0752d1b19161f71ccfcf93fc
+ReturnedBits = bdfea38e7ff37ed47d7a450ada63be5fa26eb1fe80325e57a3cd391bdaf074022bee4a0f6c806cf3b3648a4edd68226376a955668281eb3e0eddfba02dfecae8
+
+EntropyInput = 54d6fccc173c92e939bfaaabbf0b67b362e5e28ef19bb22804dc4d0830784c6534376db0fb57953de71da483947f2f86
+PersonalizationString =
+EntropyInputReseed = a97de59624f18f7a94a6d48129e1988de1248b1ba6c81ecd3882daf0313343d5bb74e162e2e463a6c1e5def389e24e10
+AdditionalInputReseed = 86050f8c9a0df812e6c44d83ea9c9ffc479534a6c4087e912a63092e189cc16ec048931eb7af6460d67cc274154ee914
+AdditionalInput1 = 54dd28543c859fd4dc1e4f0a44ec9aa2b758d51379c0a9c758053567939db6a906320d83693a0a591fe99c3e24d1293d
+AdditionalInput2 = 3803a58e41fb766847b9f568ecd7f1993091c4689fcf70f754d345ec7a3f45d1fecbfcc52cd60b47b5a486acb155e213
+ReturnedBits = 3cfb2eda22c4f01893b4760b785d330cb771938ed6f2f929030fe625780fb91fc2f9952409b99f011cb5e7e0b4a7d461be80e94e91111ace0604a7a41719f3b3
+
+EntropyInput = b5e2af38591a9743e5d3e458848a3998536d3b625e1694be847f95c3bfbda267f08624be4bb6aa496e1b596be523e7c4
+PersonalizationString = 0a9a59e7605c0e12fae317bb004aecf1427bda4dca7718801895c38179fd36cd922634c3789a99b9d9c556fe50a41de4
+EntropyInputReseed = 942ee972a599f346be15299d347823028469fc883c5e45479e9243df8710d1dc5c3073031e62f605f297479c5bcff993
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 1f818218f06c9833f084c2b0ecd058d377b2d08c2943f4d24d2b5d7cad2ba49697dc3ad8d6c5c5af6372f02c1868756ca7b39b548cbf0d2bc5da2d11ed5c8f7f
+
+EntropyInput = 60e9823004e29524138c8f8661657d1f04ccc418c5e2c677d26078bee024e7169063b147b7e09946468f4b9e34819748
+PersonalizationString = 13aa6b6ca5e94d0f2a5b3f505f8eb3aac22fc393715cde101963ec87206912607d74a11f3c09a55afa18c5cc8ae11917
+EntropyInputReseed = 4a16f67d280b34628597c6953ab5af3902b91b05c2c0c7c95366b99c7e6a9c30e876d1e3c634bd0377dc969ea119247d
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 1b809bde832e7ab5f37273d7f1ccb4d7bbb1a11053cc72271c44f4d21a3efb9a06a54813911dc99ed01611f75757677ba892719cb6ce9dde262290453e4f00c3
+
+EntropyInput = f4d2dbd7c0f52189e329415d9690c8615663c86f5c097529e68c9a7eca0ad0bc2eaecf911887622204ca9edc1eae410d
+PersonalizationString = 9962caa35f06bc276a2361e4029b1bf02184024c52cbbff2d8fd1eebfaa231ab4913680c2fca1afdd22979241a291db2
+EntropyInputReseed = 4307ea695c2ad7d80b36476a5e3527ca13ff8fdd7c5cc712bb0a4071c008fd5adeff70e5de94390f58e1fe884b4196eb
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = d9d0def9800dde19e12405b920a680602715cc91c74088f4197b2c1d60f0b33d34cd05016fcb699139402cf4fd5b7fa2d3d744ad5675ec061adbfc9379a4cadb
+
+EntropyInput = d442895e5f7b2a33de8cabe30ea2aaca3bd413e62f6514d0e6509aba81aa58f9fc7fa9deb5b10dc275df6383fc549024
+PersonalizationString = e432be1ea04e11e5ef9d39892bbd38ae2ea8991438181a3428348530ec377fb0d8a83fbfe0fb34ec0eb1e694d91a5da2
+EntropyInputReseed = b5c6201ad5059ff661c27367c560029f06cb936c970a744ea1aca464b903c06988b4800046208cf36594d06ca3977735
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 8edbafd551fd28ea37190c6a99b54831894ac54c934d01b6fc3e43484c87cd78195472ab3044ec99cc1974be04e90c233e02c837bc5eaf427a0fc0fd38d35f5e
+
+EntropyInput = e11e6a3f6a33e020cf04965aa42994dd9c6d30cdec758a2e02ca014a6c48d5b65fc03a0c2554a0303fd6085df78d54de
+PersonalizationString = 5a4cad89f2d9b40db9cfe12d45ed7f4c63e765e26c84ae3ce5fac844fe6b03a738890f21fbb7f2d09a56e0252f52c599
+EntropyInputReseed = b8961521b678c4e2737c6c62a319510190fee14b793adb0b4fe113ca9bf8c86d28366df0fe5f36131b7dc1b0637a7046
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 1404fbbe62e03463c435c2b675f76dbd22af1b2fce2b6e949e2df9efb8a3ffe738c3f78f9c852a3cb1f413122d4276d185f1599ee6cb7f218c23b1a9c9e0e80c
+
+EntropyInput = 0430e11d664ad3cf63ee3ebdf55c27e7b3deb7fbe7a974e40e89437b7ffd30c23ae3e0045a53681b828991a6904886fa
+PersonalizationString = ec0ff952dd6926a4e858e813c489c9cd13cdbcc3092ecb30054af78c2974f3e8a19a2d13e822def7fa66dc777b072d2e
+EntropyInputReseed = 3a02e381d379c9de624eb53a8baed2d9fe00a5e0d0bfba5b8d75436ec72c5636b0900b52500cb244088c97754510dd8a
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 851689ef8cd60800e550c69a9f1adec31d75208ff4b3950aa0fd8b49656a54ceeff9250752b564cc8e923975db08eb0479b15d2ad77ec9331f89d7e7621851e9
+
+EntropyInput = 55488d3883e37a2fd116af224ba4fbf5448969ac05e556bb8772306dcaea5184be73df5545c256c177038d9b7248924a
+PersonalizationString = 5f01f66a7e6987f9018197096404e74e29a9285731c3586af4f30ed5f1488e6ca61af49c46b800a64ae0c459b8fff57a
+EntropyInputReseed = 6f412c138b0014b8bc93c28e287a61111beaa8bf0bc187a3401022083ba3d8c01b8798daacbd8dfdb1a6ffc22bf052ff
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 194251ba611a8c567e1a1b1ee5f94984e2b1bd4758a68817536b1c21aea3035517ca2b6f61a00186d3ee3c7230fc393a8d4000524b508543125198c9e8464bd4
+
+EntropyInput = 909058c537b86e3480396e1799fa9bdbb4273b7123d6ba3d79c85b9871952368631c85c9b3d17e75e3e6b23bfad66658
+PersonalizationString = d02448c06118ec9a2b0cc686114afdba9b3041e4b92ab97964cb6d30f0bf8c13e2b71d6a043e646d413444056964ff7a
+EntropyInputReseed = 96919c4aef8d3181dc518437969109a50ad6e761c8693061ffa71c45bc12bd9686d78441598ed454183e5de12d9d235a
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 7b97740bebdd216d43603440d0a399f836f580cc8d1329cd653c5a7ac787366d980d7ad5b736b867325680e2f8fa7135308e73e185d47623a3fc4683557bee8e
+
+EntropyInput = 2bdb7d32eb81db9d9cf1e4bdc4e02de277f74efdec241b2f287bc82362be4533e4151758bd737d575a226840fe48d837
+PersonalizationString = ad07fa56a9c365bf4f16aa9033f71b4cf210d7d83ccfa7485d4cca105aa01462450613a7a9e2600a1872b292c0e6f4b3
+EntropyInputReseed = 0729f2a2f84ea902cb6e84a8fa6aa40e24c64a1b67a060dd47a117cc854d5ca006bad5218e64005b1bcb8880a0207d7c
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 58f56e078b05ae565668009ec2715b9a6f14531c2b965b7ceabb4478cce2db9bbc861e70d0f80373ebf3f0fa8a2e90ea6366b025a141d9c7bdfaeda109cabb90
+
+EntropyInput = 5e42e2375fc572e14f86309c7246a17eeaa5b72ce05387b042673e75b5540669627aaa8f4306d3050930f8b0dc727d55
+PersonalizationString = 90b2480969b1bf805a2c8c751bd76229caf5b67bf055f4a519badcb8e88eb0058f672f6cd07eed9d406c1709f93a8a4c
+EntropyInputReseed = 61b4fc67fcce7d68c4ac4c5f54ea8cfa9667f58375fdc474a0d7640ac538d6cbe2517ec0997dec62669c1985b84c4578
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 9605d5380160c754e43ed8caa5b5bd2d9cd954ea0c1c10eb02c649b0aa8463badaf35a9ef4b2341b1a16d413224fe803fe997d8ba4fc58ea5254b4d28d116e3f
+
+EntropyInput = 3a51edf5f690b0824a0ab3b874b38472dc7279af5f54875a4973355c1f37a988e67c26c6daf28ea43e700174fae54d2e
+PersonalizationString = fca8e0f6e2ab70685cc0ca05a6fba7e666870c9863ace0a5d5011a287e9276c072bb810bf3cd8653d2b5c8345df22cfa
+EntropyInputReseed = 7d0803607d7ad2bfdabcd85fa26532a09a15ec34e7a459cd2e39b94526a0909493f2a6b1cb5bdec6c8a8e229ac69d591
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 21b93551a12757b43f384192d24ee64eb599779c2988a00be92e31de79862343ce1aa9cc074de62d4383848bb5261ccb8d73a2f7ba914cbefad8f092a8dbf9db
+
+EntropyInput = dab7a3aa53f85273a90015d32fb3993fabd8244f12357f04f2ac16fcccd353c5e2d1c7028eff322a8b808634dbc683b8
+PersonalizationString = b74d00ce346d1ab729d543d82c3317f4dd3c6f6fee39d474e39b79d6c1e0e15ff2421df20f0267729eed341a8d068d67
+EntropyInputReseed = 4da794ec635dbd72ca897c4a5c3a4b08ee0bdfed89fc6e52b695f32f8ac5b978c1edd4b0432b77a20fb9125032530457
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 2238adc11363a4b033ed403cca9916293de654a20bfa29f63e1458240bba6212ff91c50a3fd027533f45240ce312d75d335faa2eba68778ce987d78e0dbe8cdc
+
+EntropyInput = 56b2a2bc4ccd942f9b7394215dbb642b8d3637bf43fe9d4429f8eee1297689e18a7d65ff1aed2aa5729d0d7b3c255741
+PersonalizationString = 8faee0acde0e51aa62fca5ae4c1e131e928ed1dcc183d0057e34054556e52d2dcc609b3f24304eb8fb6d8a28d1b51fb1
+EntropyInputReseed = 810b746ac71445d29fec21341f868fa83f77b4f26abaf60af457ca7a37b239ca7a71cf287cecbf2cc14654cdf7ae3ed2
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 0bd21c8de7b455c229942c5d64765c2e6d7043359e065324338dc74b21a8bc163110d9a71db871a1aa2ea1f38737d01a398b7c9bd7612a5dd1c0657c21ede8e1
+
+EntropyInput = 8912b0ee4e8dca39701f1066e68fdfaab1bfe5e76638c079121c7a833b4c380e4fb986a3a6051ee0d11c6afe85397eae
+PersonalizationString = b3f96e51882eefcbec184ef9a4297d5d5bb0a00e8735b863305659d52d0e9d69c1c8f2894b3bce84bd994b7a4da1a752
+EntropyInputReseed = 935aa45b8ab830f6db7b41e0ee8145540c594dc4c50efcdfa07fbe9158162d77a5d3dde9282d4a0f63c3cf5cbbb39a4a
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 2e1996d9e332ef870172ea5980e0382014bf016005ed5ab4689663cd019409fde4ee4c8026a0fd19079fcbdbffd12c213561dfcebb66e247a9f3ce1eafa9f4bb
+
+EntropyInput = de1e4da1b1755d0a9d4e8c9d4271d0e21c1e4730ebd431676ef5753e9e4d877937c78936a6f0e0a9e5e84d87f1ac8fea
+PersonalizationString = e7a492e06f2079eb6428f4d39fb18aa0ece5d1edc5f2e1403737bf6a1334ff7f46ccb57690ed5b06e07b1090efde505d
+EntropyInputReseed = 17837fdc7d5600fa487fa07331c4db6e3d65d522537aae0715a5936f5cb81953965fdda82e5f2b0a1f20dc8beb76beca
+AdditionalInputReseed =
+AdditionalInput1 =
+AdditionalInput2 =
+ReturnedBits = 2cf0d9cfb60234b23086dc1649e6fa99c4104de9853d19508105535c960468777a936543f6b31ed0d3c52d135671a23d3ea08fb7f29c9dcb3f151163587c39db
+
+EntropyInput = fa207b20ecb0c64851516ee83ed33caaf871315d781eb04be4abde3bef91a3c1f837cbe5fb9494f4865386fe53e85f5f
+PersonalizationString = 136c23eda52225168b3617107af57467d1661a5e3ff30fd14048202c535dfb681e8eb5ccc4353a919d0149df94abb1d3
+EntropyInputReseed = 3fa812a3f8d90425381117a9360b7a3fc67e3405e5a2b584dc7e8668da098461b3035c0458fed25e293a5a676640cfe3
+AdditionalInputReseed = 814793c9a4d6e27ae4b661017f994a7960bec9b3ef9390ecb266a93acb091445c9368f942d51bdb01b94be1fc3f89cdd
+AdditionalInput1 = 1f764ef9d091e635f9e919746683d2d6e9e02d04756b1c3ba8861531f88ee89c60aa3482f9a1fcf60293cdf5b64328b9
+AdditionalInput2 = 3553e3ca834e2c25caa1f143d5958259a491d83af4ef4170b3bc2fe36d256a355689d84b8114bc993dc3bb3a925f13ae
+ReturnedBits = 507628cba7e3fffaf4935713f32c09c3047e90588302c038add821b24b76047c72d43df031018030cc0a4a53e7c8b08b033f0077b100ae7839543cff96348c99
+
+EntropyInput = 36eb608b1c34c0f1e36a3bfdaea896cf81a2bb49b7c0069eb4fb65129fe6377104ba906a91c76fc7d83d4d233e73b53e
+PersonalizationString = a1594ddca40b36619863ba2b1047fd8edd35703028a93c833b74b49ee7598b6e7f891886cdcf60a678800a478a019c49
+EntropyInputReseed = 914e91af79ff82a0ce0b73fa76b76fde2e4a96e9de164819e5f26b36e54eeb0cfde0ad9288983e6225a7342925ac40ff
+AdditionalInputReseed = c6dbf4d673850dc2c8f3e92c90f57251b4edfae96082ec3a76ff24077af4c1f9964f51a1413f58429e0a70ff0879980d
+AdditionalInput1 = e8d17ebfd26bb473aa508af659546b004f816a3ee1b0d058757d40c5b4c45b85e9b56eda243821cea4fcb6a9eb6afcd7
+AdditionalInput2 = a85f5d8015f01416bbfe83a0dbe37eb37dc8e90be3aa72363aaf1fb6612a7d1d2b835149400cbee62d53313c67abf3f9
+ReturnedBits = 89127b8b99e1e42fd71897698f22833409cb67496c33973c838b57089e9375b1a3f628fe60e6b05a4b97417d68418adb0131fc882b73232a013e04bb040544f0
+
+EntropyInput = aead9c1f4f338493b46332635e812ff97a9c16f7df09f3570b5fb532de883bf4f3eeaa277bc5ec14fb6bea842cdbee88
+PersonalizationString = 426fe9acfc02f8183f0ee8bbedd8cb6460677184a8cc4233d6208c38a7f37bc576473a60ed3e9335b7f9e25f481b15cc
+EntropyInputReseed = 57a258439dd972b6d5770aace377784bf78595cd230e16e4b1055591c29d3a7c32cba6a835346d70d380c84be2db99d0
+AdditionalInputReseed = 508deca25785f11961ad77ce62be806aeaed80b720c7d3a97d3f314724af76aadb3bf1047c2f3a7cafd2dd469626416f
+AdditionalInput1 = 4b93760cfcd27270eebe3cb8891b25142151c43562f09df81aaa60f0cf0728246aec580177fe32aea1e64c3303e1717c
+AdditionalInput2 = 2f58d036173efcf40766bf41735e6d06ffa97e79bec138e05ec0f55fbc44c7922342a10b2295da7ba5b91a3c42936cb0
+ReturnedBits = 89bfd07eb00c324626b4089464f1a2f4175a065abbde950a3b5852f53169c6a64fa42f17412520a5262d64a7ba13e85c52aad707f46bcb81a44efb2234d26d9e
+
+EntropyInput = 272cb79c574fa7941da817bc5b9614c003ec0be30cdd384792291b98c8811d3423e11679647f887f426e025f0960a770
+PersonalizationString = b7989b2532d46dec8a6022b26874437bc8176fd219948cb995cb003064eacf1271ef17269a07d2c2ae99f3f830878a37
+EntropyInputReseed = 78af0b8b0eb3cabd919cafd06b1fabfdcb63fe29f5b68e67530b396200887d92419e3c839b8b1dc43c6507026f1f851e
+AdditionalInputReseed = 857848c62203307b39728acf11ac8462302d3a41d186778b3f112a86270252f058fbe5767496e47662186b8d0817de02
+AdditionalInput1 = 9a08df0de742fd2e2d55121a58b700dfbff250a4881b02fc3b8952b48ecd4d034d6e7c757cdf91bf7c31dfaf70b1da22
+AdditionalInput2 = 3bf0e4f1291a8bc272cc985878335882c75831510f27963c7c01a879c60c5b67a9a14a656a746a80a091adf6ffb1adf6
+ReturnedBits = 69361d61f4cf5ed489888934f320a9acc5383e719f09a1e30b6029bf71d4b4cb54859798ace2d8ee5e681d4acb223b9c119dab2dd07e6db3f7f844c2b46b9c47
+
+EntropyInput = 6f45b55ac62d5ffd452d36b1e4b18cc6abd6ad93e87558b79fbe99b4f4a962b74bad00821019bd126d6f9dd73912acf7
+PersonalizationString = 913a783046baefe428346085fd640caa1874d4aa6974832cacc5b51e78514bcfedd174606bef1721df7a1194a0ccd1e3
+EntropyInputReseed = d9e19ce3197004ab3a4bf995a481149b6d8e59a3970161cb0d3917374c0c86bb5e9bc509bd01b6796fa1e77e5fdddb16
+AdditionalInputReseed = fd31068c90614e04463acdf856b034293a079a816f1c5f3de63b870a9876f7397d2f93bd3f6776b56a78f7178e1fbb87
+AdditionalInput1 = 068e3791b91adb820b27c45a5d8544eed3133486a7d2d0bc503d8abad8b7093f3df214f1e0ac4ff2d347c760b2a605d5
+AdditionalInput2 = 6c55927a349d321d1a2141aeccc3543e9726ffcf3d8fdfe1aed63c61972a213c12ea65d648e476268611e9b08486a648
+ReturnedBits = 552b4c4035d964b5eb26e3036445793df67b7321d36e8d2362fe284503b587c961a33b816b40b93d4b006769177c6593c553b6e669076f25a3e2a7214156c249
+
+EntropyInput = 8d492df46257a62e717302992682e28494f84d0f3237c16439efbbd16a94b3356eb7f7c2a0206892045a0d7d36d69f03
+PersonalizationString = b915f3311feadf6676df2389baacccdafc74cf200ed7b99167b33dafa875ce4aac1a61ce54972ec54f9b0901a3b050ee
+EntropyInputReseed = 2e345fe3a471c5066b20f4aaeaaf73921426ac1bc0509e93671535a8fbc016f5967403d6d13b4760491bf973c47a8ed5
+AdditionalInputReseed = 2e8f1f01a7664890feef93152f7b7f05032b4c70c58b5f261ef0a9c2aef23f2a14ee57c3d3465af24289b1c850e52ef8
+AdditionalInput1 = f8c218c996284f757c491cba025fd84cc701f9f83a16f03c314712c2354fee39214ed5994ab24641826bc15ed1bb5f61
+AdditionalInput2 = 146c53dc4af90f26d8c85822810d9bde2949495c23ca2c7c13ceee8221cbe8105491d560e0044c8d50d7e365da41890b
+ReturnedBits = b19dd18494235abdcb3b4e99c9355d19d543c7fb7e1048d63d9e25abcc12dcb31549cec2818667713ad1dc35142072ca8daa511927aca71303493e500503be8b
+
+EntropyInput = 2a595f08947d0056ed19ecc8a547867834c125cf1740230a1325b93bf29951cbedcaa6a8f5cbe69801fb9a197ad576c6
+PersonalizationString = c0fb9dbea13863dfbfdb2c0dd864887413794a07a4dd228836f0f6afab901496486a2d508a3f4b784d83382629cddbc1
+EntropyInputReseed = a3ddfc3aefc94dcaf656f4d8eef0065a6d233a76e0a4c26e2d8bbb86459c9e4a173ff8cbec85ebc14712640741427668
+AdditionalInputReseed = d4eb9b12fc2a6fc75a69701c8b5ece02e47f813effb705dbdef0294e38907f5aadf40bdbcc067d0ebc0bf3661a2e0990
+AdditionalInput1 = d3c4bf4f8a3f61413fe1953523ba83bc02ae6d7eea1c8ba288f8e06f0d0276e61667a410f90548d283c4f1ae79483961
+AdditionalInput2 = e6fc29680eef141e1372e17729c9f4407b3f7a57057be1081ce46c78693334bf56867791072d9d18a7b4835bf251712d
+ReturnedBits = 08475bfb8e621e12e212f4960e737023f7a3de3b204b6ffeeb929f424ca78c6ae2e0d726237915e5e244616713e88a39df302208e3a324f5444213b70b2e9c09
+
+EntropyInput = 3d5332b91dcaad893df504c7c675b69890b28055dfd3ec7d0ba56990dcda175096ff8f8f9f9ecd6dddeb96b829b98c3e
+PersonalizationString = 34753432b3c6bedc4d2296dffce8a66591b400867f7edf10cee447046f5f767036da9f3f4a02f7b8cba7bdd4365c1fef
+EntropyInputReseed = 1a69af0ff696f9a2fe0fddd26ccf6fae215faf91804461928c884eec13b1dd1501862a738373454e1b449c6026cebceb
+AdditionalInputReseed = dc47e104175f3c9812feed9e143da5cd7e553e3423db5bc8be3b652f577100267ff795804aaf42c3991589e7688a977b
+AdditionalInput1 = e64c0cad3dfc0bf0eba3317cf37b7779b91bf3de3e0ba36d3e16feb0014286596edd364c197847e8732925f971294dfa
+AdditionalInput2 = 1ff3a6bdb7e319a86b35d062cf017ed270c6b5511bc3d63083272e76bf4db9d90e836f18d98f1f79c2e91eeb0bc635e2
+ReturnedBits = fdef7e67c3d19f5f74784bdc64d2c23d0a3f027846da2b2afba940fdc2f066d89b63d27e55d3d0a88bddb97e29676894ec8a18268e4bc27d181a867c5a80fe2c
+
+EntropyInput = 156c8c0f44f4a8f17044957b572ed16d54b73a9510d2b260a036ad6ef223f45e124c4ae9dae0fdf5684792da0ff5ea0a
+PersonalizationString = 1472f56d5498564a5b53d2eae27103f41f565d7873b37c37c30472075f1d84d69a8d68c92636ae06aa61678358cc47d4
+EntropyInputReseed = 6bc2bfd44f72982b23b6d22c85f7d601d5941ebe6e9ee9d06a8efe652539ec00b1136adbc4e43aaab76c3ad6a57a267e
+AdditionalInputReseed = a83b1547fadb97e491ef0bdb8b0d006ab16638fdb211613051f0f57586c146882f1062b7f71a8c15bb27200fa83ffcaf
+AdditionalInput1 = ac188da8a895e0807bab61b1ebd73acbe43f99f375c7d29174f675e1667237cedf1d41fc50da277a0db21ee2891a5abf
+AdditionalInput2 = adf9a30b6cd9dac23f193f66df9d606a5765b96cc42c099530c53c26a6d6bcf0779ae060d188e1cc5bdab6c312892267
+ReturnedBits = fcc79828bf2c9d3d799d7a0e83583c70aeb156e25df0b2fde030c2775c9986c8054e848128ba38ff5e5b0b1e5b72f9e41726b960008408f5152b1a47072fbdf7
+
+EntropyInput = 5e0dd8e37aa23d0fe79efcb8e5538ee90ffb5733decc83f7677488c4f64c2e0d2a918968a5c7351de9360f23fe606a4a
+PersonalizationString = 5161b794e4a13371b320ae4b2b6b698e4df507402a7582555598089dd9484358d37f891294948512e4198a79de8ca3d9
+EntropyInputReseed = 850ffb89bc23562f3ea03947c1afa7309a0ccdc0b714bc94ff45d66884b74fba0bffce97887f2efc178388f36f0ea95e
+AdditionalInputReseed = 50f605cb940f573c4ef3ddff8caa9a3f544f40fdf583b82cd79338523d896f72f86be1f9bb37d9aca02a2856f713c812
+AdditionalInput1 = da7bcf6810a6b3820548065edbec0fa2fd4bc03e5d50666f98a8bea6b744e04aafa0714582f11b6608852c45ee51df6b
+AdditionalInput2 = 4e9c0c770699656217a0b2dbb466a0fcb0cdb5d4a4a05da40fa2eb546f2f0f28aea575a0bdf6e89352d519db44f47dc5
+ReturnedBits = 40ec0e8e3e54cd4fd78f5e006bf3134c378ba619ccf9e7530c79217da631458b5f9135bc8b0d6f2e742c53b58d0ebc18263f9d2ef37a2fa0fb086d2193857863
+
+EntropyInput = 219a364ad362fd8a1d69c1284fd64cc9ec05e6bfbdd133ac9170594b5d95946d3dda2ebcc58deeace86f9dca5ad99c18
+PersonalizationString = b0b27b03fc65effe4610e61916f2e9bd252d47efcc08b84aa505b1befd3a7e9295ca764ac88f099bbecc28301f0f298e
+EntropyInputReseed = 1bccdb4b2ce863fbee104d7a56f2cd88a44a088392883a6db30e6fc7bf5611759c71d53a61fe62b6314d7426e510a722
+AdditionalInputReseed = a06eab3b05eb3649a01be82a356030effdbf45fd71f49b1862ecf33fdb28a7191a34f104b9eda1da4ba48daf9da381b6
+AdditionalInput1 = 88b17e13e02a7e9a3f8263946fae0b6a9052692c3c5cbe858369c4d0b198b9c6a8f4c87ff5e6b2835a7944b911266aa9
+AdditionalInput2 = 828222c8a275427a5f8a963d0d65e92f6170d5089c9a162429c093a28dd69f71135342f16b3baea9a4764e2cc3762267
+ReturnedBits = a739f9fee9a40049e42b00b381a1f663877abb776ec655e3a7870bd94bea1a25d3c6d380eced435e498044daf78b349bc1868e4bff6257cf2711ed08e2357201
+
+EntropyInput = f8513c2f6e46f75fce3671ccb3c69158583a873b0dda83d8b1cd548f4e5efd75642f2c23cf8792d51023f31d795f6f5b
+PersonalizationString = e94f7212257885511b15a873d0158fa5ea648846afbcf9d62a7abc4e6909dd43c671fa18bc289f47e2301e9aa69c3e88
+EntropyInputReseed = 487b9c1866ffdaaf6760cdee3df5a930196d30b0ac8db780656577ddfc1ff3508c451ef2b0b478a2cf0c73027597b2ae
+AdditionalInputReseed = 7387b59f8c78e79d36edacbb428fd515ef9e58086059bf7fd642053b0f5706cfe86eb3c35ca0b6f02e5d1304e476e3cf
+AdditionalInput1 = bafc59ef40e59d8c28851212e1c357cce0d06f02c69d14585170ca8eb18396a331d635cf0651319842cee2f7c87285c2
+AdditionalInput2 = 82d905ba69b6c45ca28107beb6698a152631ab48614235f6a9f12e019f66bf326151d9ee84e0cd42b6566dbffb46ec35
+ReturnedBits = 163f48d09f3e9ebf9f8647766a0b2e189a2f3a21a5a4e31c8a4f3bd138cc50030ac8bea1c4d9e9aa0b67f34926239fbcedfd1992da165b941cf03b56737737b2
+
+EntropyInput = 0a8f092764d473d48215e947ea8a32b5da8ea86d8ed0d83bce31b1b5a21e7c5f1af2186a39caf9afa61644caef02ef9b
+PersonalizationString = 84637faba756917b0f44ba2e0e26546f5239782e4d9f952ee251367081629e71c20a7459995a7563810daeab74220664
+EntropyInputReseed = eacaded3d89a63b94a5c14c3087306e670fc4ee7d56cafef4c5aa7d553ca89ed34418056a44f5447e2b07dd541ac4645
+AdditionalInputReseed = 104a1541313fc4be9d34bced288c1c1b6fa793e9096f8be5673a2c6825dabef91fd88e45a061b2d897f9b5e8a8ae0ad3
+AdditionalInput1 = e30c9d8aba0bd5dc63d911897e4dcadbeacc3ed9392d8e361b356e02a81d65bdab91f7e9f8dd2b2bf9af0da5100e77d4
+AdditionalInput2 = 2bed42b8c05461ba2756a5f38393d5538d20eb9cf1c06775e7fef7284341f61ccd34b0148d1e870c1992dfd065560ed6
+ReturnedBits = 855a6af3e6dddf194ceaafcef6f7ee91f489a61a73b759d41be4d5298510b9902f5b78b1162cba417684519634b578afda9802bd782f04b3a25106f3586ad8a4
+
+EntropyInput = ed63e3b88a2f0d6a40b7b36a06cd8d40ec10158ab6c4f8dabdb879e45d22db573320d2641bfd7db31eb6bbf4c6330b9f
+PersonalizationString = f82a5ee81f349a69dfa6a6e53b406bb560cb0339f61b3886237023ae4582b9725b8774a8044ec5134ebd4d7606f18188
+EntropyInputReseed = 7104522c2a69bec7e010d9670d7ab92dd817ac7ff05d63ab0e12d431d4c9aef4d715421c1fb5d05d3aecba36859a6038
+AdditionalInputReseed = 3b83034ea440604d0b7d04857623e9adc0eb9aad4a45b2079863eed3d72e65abf67d255673e769a2e2584eea59f1ebaa
+AdditionalInput1 = 8678e4f831887e96a27c3a8ce0963f4b34bbca25791b06526cb6c55624c33d98a0356be624238cecacba3535e872c4c7
+AdditionalInput2 = ec3452ea2722984bbe6a5b7c22ad58df37a854abc8630b9e21bcd0469eb207e5f44e044f5f666920dd55e81a393500de
+ReturnedBits = c340765fe7a3479bef2d7d59e321066f8ad0db53aed4c517bf8339566bf877d53921e6de2650d0080529004a5fd32124ce8e58a040e2d55656b37d9ea827cb91
+
+EntropyInput = 882ed05487dce4b4f9e58ec4f2da1fa5d8ebb4ef9fcbf7b0a0e15c4dccb8e19788f86dcf2885e71a20cbd9ac10a6648e
+PersonalizationString = 05f5bc41687ea1e4c34a69944fbae283cfee4c42b1bbd78fddb0973d0fca948539b6843658b67c30b73191b9a0bf2921
+EntropyInputReseed = ca1603d4c8711404c7bdc12c7c75b2943a4b042ea1d2eb54506a6876952157caf3b152dc75f27f2213645a141577e8ba
+AdditionalInputReseed = 83cda53380888d53515e58154f89d5528ab69f31fbcfca34988cf03c4cae5f60aa6291f32d99ab2a726b6e08d2502cf5
+AdditionalInput1 = 5bf5ca9f964edd91e8ef491fd3cd32faf9cb9d1993d8221914d1751fb0d4252a5ca950e213f088050900b2bd74f5e336
+AdditionalInput2 = dba28dc1d8d615651547867d4ef42519045ee16378143685101da47a27b55498078e8a8f4854052f7cc6f5b02e571ae8
+ReturnedBits = 01f11971835819c1148aa079eea09fd5b1aa3ac6ba557ae3317b1a33f4505174cf9d7e940821c9b0e5527a1d3e186a7a83f187c62d3223cf5964ff9526d8484c
diff --git a/src/crypto/rand/forkunsafe.c b/src/crypto/rand/forkunsafe.c
new file mode 100644
index 0000000..e9badc9
--- /dev/null
+++ b/src/crypto/rand/forkunsafe.c
@@ -0,0 +1,44 @@
+/* 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. */
+
+#include <openssl/rand.h>
+
+#include <stdlib.h>
+
+#include "internal.h"
+
+
+/* g_buffering_enabled is true if fork-unsafe buffering has been enabled. */
+static int g_buffering_enabled = 0;
+
+/* g_lock protects |g_buffering_enabled|. */
+static struct CRYPTO_STATIC_MUTEX g_lock = CRYPTO_STATIC_MUTEX_INIT;
+
+void RAND_enable_fork_unsafe_buffering(int fd) {
+  /* We no longer support setting the file-descriptor with this function. */
+  if (fd != -1) {
+    abort();
+  }
+
+  CRYPTO_STATIC_MUTEX_lock_write(&g_lock);
+  g_buffering_enabled = 1;
+  CRYPTO_STATIC_MUTEX_unlock_write(&g_lock);
+}
+
+int rand_fork_unsafe_buffering_enabled(void) {
+  CRYPTO_STATIC_MUTEX_lock_read(&g_lock);
+  const int ret = g_buffering_enabled;
+  CRYPTO_STATIC_MUTEX_unlock_read(&g_lock);
+  return ret;
+}
diff --git a/src/crypto/rand/internal.h b/src/crypto/rand/internal.h
index dcff3aa..58ffaaa 100644
--- a/src/crypto/rand/internal.h
+++ b/src/crypto/rand/internal.h
@@ -15,15 +15,75 @@
 #ifndef OPENSSL_HEADER_CRYPTO_RAND_INTERNAL_H
 #define OPENSSL_HEADER_CRYPTO_RAND_INTERNAL_H
 
+#include <openssl/aes.h>
+
+#include "../internal.h"
+#include "../modes/internal.h"
+
 #if defined(__cplusplus)
 extern "C" {
 #endif
 
 
+/* RAND_bytes_with_additional_data samples from the RNG after mixing 32 bytes
+ * from |user_additional_data| in. */
+void RAND_bytes_with_additional_data(uint8_t *out, size_t out_len,
+                                     const uint8_t user_additional_data[32]);
+
 /* CRYPTO_sysrand fills |len| bytes at |buf| with entropy from the operating
  * system. */
 void CRYPTO_sysrand(uint8_t *buf, size_t len);
 
+/* rand_fork_unsafe_buffering_enabled returns whether fork-unsafe buffering has
+ * been enabled via |RAND_enable_fork_unsafe_buffering|. */
+int rand_fork_unsafe_buffering_enabled(void);
+
+/* CTR_DRBG_STATE contains the state of a CTR_DRBG based on AES-256. See SP
+ * 800-90Ar1. */
+typedef struct {
+  alignas(16) AES_KEY ks;
+  block128_f block;
+  ctr128_f ctr;
+  union {
+    uint8_t bytes[16];
+    uint32_t words[4];
+  } counter;
+  uint64_t reseed_counter;
+} CTR_DRBG_STATE;
+
+/* See SP 800-90Ar1, table 3. */
+#define CTR_DRBG_ENTROPY_LEN 48
+#define CTR_DRBG_MAX_GENERATE_LENGTH 65536
+
+/* CTR_DRBG_init initialises |*drbg| given |CTR_DRBG_ENTROPY_LEN| bytes of
+ * entropy in |entropy| and, optionally, a personalization string up to
+ * |CTR_DRBG_ENTROPY_LEN| bytes in length. It returns one on success and zero
+ * on error. */
+OPENSSL_EXPORT int CTR_DRBG_init(CTR_DRBG_STATE *drbg,
+                                 const uint8_t entropy[CTR_DRBG_ENTROPY_LEN],
+                                 const uint8_t *personalization,
+                                 size_t personalization_len);
+
+/* CTR_DRBG_reseed reseeds |drbg| given |CTR_DRBG_ENTROPY_LEN| bytes of entropy
+ * in |entropy| and, optionally, up to |CTR_DRBG_ENTROPY_LEN| bytes of
+ * additional data. It returns one on success or zero on error. */
+OPENSSL_EXPORT int CTR_DRBG_reseed(CTR_DRBG_STATE *drbg,
+                                   const uint8_t entropy[CTR_DRBG_ENTROPY_LEN],
+                                   const uint8_t *additional_data,
+                                   size_t additional_data_len);
+
+/* CTR_DRBG_generate processes to up |CTR_DRBG_ENTROPY_LEN| bytes of additional
+ * data (if any) and then writes |out_len| random bytes to |out|, where
+ * |out_len| <= |CTR_DRBG_MAX_GENERATE_LENGTH|. It returns one on success or
+ * zero on error. */
+OPENSSL_EXPORT int CTR_DRBG_generate(CTR_DRBG_STATE *drbg, uint8_t *out,
+                                     size_t out_len,
+                                     const uint8_t *additional_data,
+                                     size_t additional_data_len);
+
+/* CTR_DRBG_clear zeroises the state of |drbg|. */
+OPENSSL_EXPORT void CTR_DRBG_clear(CTR_DRBG_STATE *drbg);
+
 
 #if defined(__cplusplus)
 }  /* extern C */
diff --git a/src/crypto/rand/rand.c b/src/crypto/rand/rand.c
index 51da6ba..028979a 100644
--- a/src/crypto/rand/rand.c
+++ b/src/crypto/rand/rand.c
@@ -34,41 +34,43 @@
  * In addition, the hardware may provide a low-latency RNG. Intel's rdrand
  * instruction is the canonical example of this. When a hardware RNG is
  * available we don't need to worry about an RNG failure arising from fork()ing
- * the process or moving a VM, so we can keep thread-local RNG state and XOR
- * the hardware entropy in.
+ * the process or moving a VM, so we can keep thread-local RNG state and use it
+ * as an additional-data input to CTR-DRBG.
  *
  * (We assume that the OS entropy is safe from fork()ing and VM duplication.
  * This might be a bit of a leap of faith, esp on Windows, but there's nothing
  * that we can do about it.) */
 
-/* rand_thread_state contains the per-thread state for the RNG. This is only
- * used if the system has support for a hardware RNG. */
+/* kReseedInterval is the number of generate calls made to CTR-DRBG before
+ * reseeding. */
+static const unsigned kReseedInterval = 4096;
+
+/* CRNGT_BLOCK_SIZE is the number of bytes in a “block” for the purposes of the
+ * continuous random number generator test in FIPS 140-2, section 4.9.2. */
+#define CRNGT_BLOCK_SIZE 16
+
+/* rand_thread_state contains the per-thread state for the RNG. */
 struct rand_thread_state {
-  uint8_t key[32];
-  uint64_t calls_used;
-  size_t bytes_used;
-  uint8_t partial_block[64];
-  unsigned partial_block_used;
+  CTR_DRBG_STATE drbg;
+  /* calls is the number of generate calls made on |drbg| since it was last
+   * (re)seeded. This is bound by |kReseedInterval|. */
+  unsigned calls;
+  /* last_block contains the previous block from |CRYPTO_sysrand|. */
+  uint8_t last_block[CRNGT_BLOCK_SIZE];
+  /* last_block_valid is non-zero iff |last_block| contains data from
+   * |CRYPTO_sysrand|. */
+  int last_block_valid;
 };
 
-/* kMaxCallsPerRefresh is the maximum number of |RAND_bytes| calls that we'll
- * serve before reading a new key from the operating system. This only applies
- * if we have a hardware RNG. */
-static const unsigned kMaxCallsPerRefresh = 1024;
-
-/* kMaxBytesPerRefresh is the maximum number of bytes that we'll return from
- * |RAND_bytes| before reading a new key from the operating system. This only
- * applies if we have a hardware RNG. */
-static const uint64_t kMaxBytesPerRefresh = 1024 * 1024;
-
 /* rand_thread_state_free frees a |rand_thread_state|. This is called when a
  * thread exits. */
-static void rand_thread_state_free(void *state) {
-  if (state == NULL) {
+static void rand_thread_state_free(void *state_in) {
+  if (state_in == NULL) {
     return;
   }
 
-  OPENSSL_cleanse(state, sizeof(struct rand_thread_state));
+  struct rand_thread_state *state = state_in;
+  CTR_DRBG_clear(&state->drbg);
   OPENSSL_free(state);
 }
 
@@ -115,77 +117,144 @@
 
 #endif
 
-int RAND_bytes(uint8_t *buf, size_t len) {
-  if (len == 0) {
-    return 1;
+#if defined(BORINGSSL_FIPS)
+
+static void rand_get_seed(struct rand_thread_state *state,
+                          uint8_t seed[CTR_DRBG_ENTROPY_LEN]) {
+  if (!state->last_block_valid) {
+    CRYPTO_sysrand(state->last_block, sizeof(state->last_block));
+    state->last_block_valid = 1;
   }
 
-  if (!hwrand(buf, len)) {
-    /* Without a hardware RNG to save us from address-space duplication, the OS
-     * entropy is used directly. */
-    CRYPTO_sysrand(buf, len);
-    return 1;
+  /* We overread from /dev/urandom by a factor of 10 and XOR to whiten. */
+#define FIPS_OVERREAD 10
+  uint8_t entropy[CTR_DRBG_ENTROPY_LEN * FIPS_OVERREAD];
+  CRYPTO_sysrand(entropy, sizeof(entropy));
+
+  /* See FIPS 140-2, section 4.9.2. This is the “continuous random number
+   * generator test” which causes the program to randomly abort. Hopefully the
+   * rate of failure is small enough not to be a problem in practice. */
+  if (CRYPTO_memcmp(state->last_block, entropy, CRNGT_BLOCK_SIZE) == 0) {
+    abort();
   }
 
+  for (size_t i = CRNGT_BLOCK_SIZE; i < sizeof(entropy);
+       i += CRNGT_BLOCK_SIZE) {
+    if (CRYPTO_memcmp(entropy + i - CRNGT_BLOCK_SIZE, entropy + i,
+                      CRNGT_BLOCK_SIZE) == 0) {
+      abort();
+    }
+  }
+  OPENSSL_memcpy(state->last_block,
+                 entropy + sizeof(entropy) - CRNGT_BLOCK_SIZE,
+                 CRNGT_BLOCK_SIZE);
+
+  OPENSSL_memcpy(seed, entropy, CTR_DRBG_ENTROPY_LEN);
+
+  for (size_t i = 1; i < FIPS_OVERREAD; i++) {
+    for (size_t j = 0; j < CTR_DRBG_ENTROPY_LEN; j++) {
+      seed[j] ^= entropy[CTR_DRBG_ENTROPY_LEN * i + j];
+    }
+  }
+}
+
+#else
+
+static void rand_get_seed(struct rand_thread_state *state,
+                          uint8_t seed[CTR_DRBG_ENTROPY_LEN]) {
+  /* If not in FIPS mode, we don't overread from the system entropy source. */
+  CRYPTO_sysrand(seed, CTR_DRBG_ENTROPY_LEN);
+}
+
+#endif
+
+void RAND_bytes_with_additional_data(uint8_t *out, size_t out_len,
+                                     const uint8_t user_additional_data[32]) {
+  if (out_len == 0) {
+    return;
+  }
+
+  struct rand_thread_state stack_state;
   struct rand_thread_state *state =
       CRYPTO_get_thread_local(OPENSSL_THREAD_LOCAL_RAND);
+
   if (state == NULL) {
     state = OPENSSL_malloc(sizeof(struct rand_thread_state));
     if (state == NULL ||
         !CRYPTO_set_thread_local(OPENSSL_THREAD_LOCAL_RAND, state,
                                  rand_thread_state_free)) {
-      CRYPTO_sysrand(buf, len);
-      return 1;
+      /* If the system is out of memory, use an ephemeral state on the
+       * stack. */
+      state = &stack_state;
     }
 
-    OPENSSL_memset(state->partial_block, 0, sizeof(state->partial_block));
-    state->calls_used = kMaxCallsPerRefresh;
+    state->last_block_valid = 0;
+    uint8_t seed[CTR_DRBG_ENTROPY_LEN];
+    rand_get_seed(state, seed);
+    if (!CTR_DRBG_init(&state->drbg, seed, NULL, 0)) {
+      abort();
+    }
+    state->calls = 0;
   }
 
-  if (state->calls_used >= kMaxCallsPerRefresh ||
-      state->bytes_used >= kMaxBytesPerRefresh) {
-    CRYPTO_sysrand(state->key, sizeof(state->key));
-    state->calls_used = 0;
-    state->bytes_used = 0;
-    state->partial_block_used = sizeof(state->partial_block);
+  if (state->calls >= kReseedInterval) {
+    uint8_t seed[CTR_DRBG_ENTROPY_LEN];
+    rand_get_seed(state, seed);
+    if (!CTR_DRBG_reseed(&state->drbg, seed, NULL, 0)) {
+      abort();
+    }
+    state->calls = 0;
   }
 
-  if (len >= sizeof(state->partial_block)) {
-    size_t remaining = len;
-    while (remaining > 0) {
-      /* kMaxBytesPerCall is only 2GB, while ChaCha can handle 256GB. But this
-       * is sufficient and easier on 32-bit. */
-      static const size_t kMaxBytesPerCall = 0x80000000;
-      size_t todo = remaining;
-      if (todo > kMaxBytesPerCall) {
-        todo = kMaxBytesPerCall;
-      }
-      uint8_t nonce[12];
-      OPENSSL_memset(nonce, 0, 4);
-      OPENSSL_memcpy(nonce + 4, &state->calls_used, sizeof(state->calls_used));
-      CRYPTO_chacha_20(buf, buf, todo, state->key, nonce, 0);
-      buf += todo;
-      remaining -= todo;
-      state->calls_used++;
+  /* Additional data is mixed into every CTR-DRBG call to protect, as best we
+   * can, against forks & VM clones. We do not over-read this information and
+   * don't reseed with it so, from the point of view of FIPS, this doesn't
+   * provide “prediction resistance”. But, in practice, it does. */
+  uint8_t additional_data[32];
+  if (!hwrand(additional_data, sizeof(additional_data))) {
+    /* Without a hardware RNG to save us from address-space duplication, the OS
+     * entropy is used. This can be expensive (one read per |RAND_bytes| call)
+     * and so can be disabled by applications that we have ensured don't fork
+     * and aren't at risk of VM cloning. */
+    if (!rand_fork_unsafe_buffering_enabled()) {
+      CRYPTO_sysrand(additional_data, sizeof(additional_data));
+    } else {
+      OPENSSL_memset(additional_data, 0, sizeof(additional_data));
     }
-  } else {
-    if (sizeof(state->partial_block) - state->partial_block_used < len) {
-      uint8_t nonce[12];
-      OPENSSL_memset(nonce, 0, 4);
-      OPENSSL_memcpy(nonce + 4, &state->calls_used, sizeof(state->calls_used));
-      CRYPTO_chacha_20(state->partial_block, state->partial_block,
-                       sizeof(state->partial_block), state->key, nonce, 0);
-      state->partial_block_used = 0;
-    }
-
-    unsigned i;
-    for (i = 0; i < len; i++) {
-      buf[i] ^= state->partial_block[state->partial_block_used++];
-    }
-    state->calls_used++;
   }
-  state->bytes_used += len;
 
+  for (size_t i = 0; i < sizeof(additional_data); i++) {
+    additional_data[i] ^= user_additional_data[i];
+  }
+
+  int first_call = 1;
+  while (out_len > 0) {
+    size_t todo = out_len;
+    if (todo > CTR_DRBG_MAX_GENERATE_LENGTH) {
+      todo = CTR_DRBG_MAX_GENERATE_LENGTH;
+    }
+
+    if (!CTR_DRBG_generate(&state->drbg, out, todo, additional_data,
+                           first_call ? sizeof(additional_data) : 0)) {
+      abort();
+    }
+
+    out += todo;
+    out_len -= todo;
+    state->calls++;
+    first_call = 0;
+  }
+
+  if (state == &stack_state) {
+    CTR_DRBG_clear(&state->drbg);
+  }
+
+  return;
+}
+
+int RAND_bytes(uint8_t *out, size_t out_len) {
+  static const uint8_t kZeroAdditionalData[32] = {0};
+  RAND_bytes_with_additional_data(out, out_len, kZeroAdditionalData);
   return 1;
 }
 
diff --git a/src/crypto/rand/urandom.c b/src/crypto/rand/urandom.c
index 23bdcf4..f3aab44 100644
--- a/src/crypto/rand/urandom.c
+++ b/src/crypto/rand/urandom.c
@@ -29,6 +29,8 @@
 #include <unistd.h>
 
 #if defined(OPENSSL_LINUX)
+#include <linux/random.h>
+#include <sys/ioctl.h>
 #include <sys/syscall.h>
 #endif
 
@@ -76,18 +78,6 @@
 
 #endif  /* OPENSSL_LINUX */
 
-/* This file implements a PRNG by reading from /dev/urandom, optionally with a
- * buffer, which is unsafe across |fork|. */
-
-#define BUF_SIZE 4096
-
-/* rand_buffer contains unused, random bytes, some of which may have been
- * consumed already. */
-struct rand_buffer {
-  size_t used;
-  uint8_t rand[BUF_SIZE];
-};
-
 /* requested_lock is used to protect the |*_requested| variables. */
 static struct CRYPTO_STATIC_MUTEX requested_lock = CRYPTO_STATIC_MUTEX_INIT;
 
@@ -102,14 +92,6 @@
 /* urandom_fd is a file descriptor to /dev/urandom. It's protected by |once|. */
 static int urandom_fd = -2 /* kUnset */;
 
-/* urandom_buffering_requested is set by |RAND_enable_fork_unsafe_buffering|.
- * It's protected by |requested_lock|. */
-static int urandom_buffering_requested = 0;
-
-/* urandom_buffering controls whether buffering is enabled (1) or not (0). This
- * is protected by |once|. */
-static int urandom_buffering = 0;
-
 static CRYPTO_once_t once = CRYPTO_ONCE_INIT;
 
 /* init_once initializes the state of this module to values previously
@@ -118,7 +100,6 @@
  * once. */
 static void init_once(void) {
   CRYPTO_STATIC_MUTEX_lock_read(&requested_lock);
-  urandom_buffering = urandom_buffering_requested;
   int fd = urandom_fd_requested;
   CRYPTO_STATIC_MUTEX_unlock_read(&requested_lock);
 
@@ -157,6 +138,38 @@
     abort();
   }
 
+#if defined(BORINGSSL_FIPS)
+  /* In FIPS mode we ensure that the kernel has sufficient entropy before
+   * continuing. This is automatically handled by getrandom, which requires
+   * that the entropy pool has been initialised, but for urandom we have to
+   * poll. */
+  int first_iteration = 1;
+  for (;;) {
+    int entropy_bits;
+    if (ioctl(fd, RNDGETENTCNT, &entropy_bits)) {
+      fprintf(stderr,
+              "RNDGETENTCNT on /dev/urandom failed. We cannot continue in this "
+              "case when in FIPS mode.\n");
+      abort();
+    }
+
+    static const int kBitsNeeded = 256;
+    if (entropy_bits >= kBitsNeeded) {
+      break;
+    }
+
+    if (first_iteration) {
+      fprintf(stderr,
+              "The kernel entropy pool contains too few bits: have %d, want "
+              "%d. This process is built in FIPS mode and will block until "
+              "sufficient entropy is available.\n", entropy_bits, kBitsNeeded);
+    }
+    first_iteration = 0;
+
+    usleep(250000);
+  }
+#endif
+
   int flags = fcntl(fd, F_GETFD);
   if (flags == -1) {
     /* Native Client doesn't implement |fcntl|. */
@@ -190,56 +203,6 @@
   }
 }
 
-void RAND_enable_fork_unsafe_buffering(int fd) {
-  if (fd >= 0) {
-    fd = dup(fd);
-    if (fd < 0) {
-      abort();
-    }
-  } else {
-    fd = kUnset;
-  }
-
-  CRYPTO_STATIC_MUTEX_lock_write(&requested_lock);
-  urandom_buffering_requested = 1;
-  urandom_fd_requested = fd;
-  CRYPTO_STATIC_MUTEX_unlock_write(&requested_lock);
-
-  CRYPTO_once(&once, init_once);
-  if (urandom_buffering != 1) {
-    abort();  // Already initialized
-  }
-
-  if (fd >= 0) {
-    if (urandom_fd == kHaveGetrandom) {
-      close(fd);
-    } else if (urandom_fd != fd) {
-      abort();  // Already initialized.
-    }
-  }
-}
-
-static struct rand_buffer *get_thread_local_buffer(void) {
-  struct rand_buffer *buf =
-      CRYPTO_get_thread_local(OPENSSL_THREAD_LOCAL_URANDOM_BUF);
-  if (buf != NULL) {
-    return buf;
-  }
-
-  buf = OPENSSL_malloc(sizeof(struct rand_buffer));
-  if (buf == NULL) {
-    return NULL;
-  }
-  buf->used = BUF_SIZE;  /* To trigger a |fill_with_entropy| on first use. */
-  if (!CRYPTO_set_thread_local(OPENSSL_THREAD_LOCAL_URANDOM_BUF, buf,
-                               OPENSSL_free)) {
-    OPENSSL_free(buf);
-    return NULL;
-  }
-
-  return buf;
-}
-
 #if defined(USE_SYS_getrandom) && defined(__has_feature)
 #if __has_feature(memory_sanitizer)
 void __msan_unpoison(void *, size_t);
@@ -287,30 +250,6 @@
   return 1;
 }
 
-/* read_from_buffer reads |requested| random bytes from the buffer into |out|,
- * refilling it if necessary to satisfy the request. */
-static void read_from_buffer(struct rand_buffer *buf,
-                             uint8_t *out, size_t requested) {
-  size_t remaining = BUF_SIZE - buf->used;
-
-  while (requested > remaining) {
-    OPENSSL_memcpy(out, &buf->rand[buf->used], remaining);
-    buf->used += remaining;
-    out += remaining;
-    requested -= remaining;
-
-    if (!fill_with_entropy(buf->rand, BUF_SIZE)) {
-      abort();
-      return;
-    }
-    buf->used = 0;
-    remaining = BUF_SIZE;
-  }
-
-  OPENSSL_memcpy(out, &buf->rand[buf->used], requested);
-  buf->used += requested;
-}
-
 /* CRYPTO_sysrand puts |requested| random bytes into |out|. */
 void CRYPTO_sysrand(uint8_t *out, size_t requested) {
   if (requested == 0) {
@@ -318,13 +257,6 @@
   }
 
   CRYPTO_once(&once, init_once);
-  if (urandom_buffering && requested < BUF_SIZE) {
-    struct rand_buffer *buf = get_thread_local_buffer();
-    if (buf != NULL) {
-      read_from_buffer(buf, out, requested);
-      return;
-    }
-  }
 
   if (!fill_with_entropy(out, requested)) {
     abort();
diff --git a/src/crypto/rsa/internal.h b/src/crypto/rsa/internal.h
index b865a0a..29202b6 100644
--- a/src/crypto/rsa/internal.h
+++ b/src/crypto/rsa/internal.h
@@ -59,6 +59,8 @@
 
 #include <openssl/base.h>
 
+#include <openssl/bn.h>
+
 
 #if defined(__cplusplus)
 extern "C" {
@@ -79,14 +81,9 @@
                         const uint8_t *in, size_t in_len, int padding);
 int rsa_default_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in,
                                   size_t len);
-int rsa_default_multi_prime_keygen(RSA *rsa, int bits, int num_primes,
-                                   BIGNUM *e_value, BN_GENCB *cb);
 int rsa_default_keygen(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb);
 
 
-#define RSA_PKCS1_PADDING_SIZE 11
-
-
 BN_BLINDING *BN_BLINDING_new(void);
 void BN_BLINDING_free(BN_BLINDING *b);
 int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *b, const BIGNUM *e,
@@ -120,24 +117,18 @@
                           size_t len);
 
 
-/* RSA_additional_prime contains information about the third, forth etc prime
- * in a multi-prime RSA key. */
-typedef struct RSA_additional_prime_st {
-  BIGNUM *prime;
-  /* exp is d^{prime-1} mod prime */
-  BIGNUM *exp;
-  /* coeff is such that r×coeff ≡ 1 mod prime. */
-  BIGNUM *coeff;
+/* The following utility functions are exported for test purposes. */
 
-  /* Values below here are not in the ASN.1 serialisation. */
+extern const BN_ULONG kBoringSSLRSASqrtTwo[];
+extern const size_t kBoringSSLRSASqrtTwoLen;
 
-  /* r is the product of all primes (including p and q) prior to this one. */
-  BIGNUM *r;
-  /* mont is a |BN_MONT_CTX| modulo |prime|. */
-  BN_MONT_CTX *mont;
-} RSA_additional_prime;
+/* rsa_less_than_words returns one if |a| < |b| and zero otherwise, where |a|
+ * and |b| both are |len| words long. It runs in constant time. */
+int rsa_less_than_words(const BN_ULONG *a, const BN_ULONG *b, size_t len);
 
-void RSA_additional_prime_free(RSA_additional_prime *ap);
+/* rsa_greater_than_pow2 returns one if |b| is greater than 2^|n| and zero
+ * otherwise. */
+int rsa_greater_than_pow2(const BIGNUM *b, int n);
 
 
 #if defined(__cplusplus)
diff --git a/src/crypto/rsa/padding.c b/src/crypto/rsa/padding.c
index dee44dd..787f248 100644
--- a/src/crypto/rsa/padding.c
+++ b/src/crypto/rsa/padding.c
@@ -69,7 +69,8 @@
 #include "internal.h"
 #include "../internal.h"
 
-/* TODO(fork): don't the check functions have to be constant time? */
+
+#define RSA_PKCS1_PADDING_SIZE 11
 
 int RSA_padding_add_PKCS1_type_1(uint8_t *to, size_t to_len,
                                  const uint8_t *from, size_t from_len) {
@@ -80,7 +81,7 @@
   }
 
   if (from_len > to_len - RSA_PKCS1_PADDING_SIZE) {
-    OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE);
+    OPENSSL_PUT_ERROR(RSA, RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY);
     return 0;
   }
 
diff --git a/src/crypto/rsa/rsa.c b/src/crypto/rsa/rsa.c
index 6d56238..1b62d03 100644
--- a/src/crypto/rsa/rsa.c
+++ b/src/crypto/rsa/rsa.c
@@ -69,6 +69,7 @@
 
 #include "internal.h"
 #include "../internal.h"
+#include "../bn/internal.h"
 
 
 static CRYPTO_EX_DATA_CLASS g_ex_data_class = CRYPTO_EX_DATA_CLASS_INIT;
@@ -109,19 +110,6 @@
   return rsa;
 }
 
-void RSA_additional_prime_free(RSA_additional_prime *ap) {
-  if (ap == NULL) {
-    return;
-  }
-
-  BN_clear_free(ap->prime);
-  BN_clear_free(ap->exp);
-  BN_clear_free(ap->coeff);
-  BN_clear_free(ap->r);
-  BN_MONT_CTX_free(ap->mont);
-  OPENSSL_free(ap);
-}
-
 void RSA_free(RSA *rsa) {
   unsigned u;
 
@@ -156,10 +144,6 @@
   }
   OPENSSL_free(rsa->blindings);
   OPENSSL_free(rsa->blindings_inuse);
-  if (rsa->additional_primes != NULL) {
-    sk_RSA_additional_prime_pop_free(rsa->additional_primes,
-                                     RSA_additional_prime_free);
-  }
   CRYPTO_MUTEX_cleanup(&rsa->lock);
   OPENSSL_free(rsa);
 }
@@ -213,15 +197,6 @@
   return rsa_default_keygen(rsa, bits, e_value, cb);
 }
 
-int RSA_generate_multi_prime_key(RSA *rsa, int bits, int num_primes,
-                                 BIGNUM *e_value, BN_GENCB *cb) {
-  if (rsa->meth->multi_prime_keygen) {
-    return rsa->meth->multi_prime_keygen(rsa, bits, num_primes, e_value, cb);
-  }
-
-  return rsa_default_multi_prime_keygen(rsa, bits, num_primes, e_value, cb);
-}
-
 int RSA_encrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
                 const uint8_t *in, size_t in_len, int padding) {
   if (rsa->meth->encrypt) {
@@ -467,23 +442,16 @@
   }
 
   if (!RSA_add_pkcs1_prefix(&signed_msg, &signed_msg_len,
-                            &signed_msg_is_alloced, hash_nid, in, in_len)) {
-    return 0;
+                            &signed_msg_is_alloced, hash_nid, in, in_len) ||
+      !RSA_sign_raw(rsa, &size_t_out_len, out, rsa_size, signed_msg,
+                    signed_msg_len, RSA_PKCS1_PADDING)) {
+    goto err;
   }
 
-  if (rsa_size < RSA_PKCS1_PADDING_SIZE ||
-      signed_msg_len > rsa_size - RSA_PKCS1_PADDING_SIZE) {
-    OPENSSL_PUT_ERROR(RSA, RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY);
-    goto finish;
-  }
+  *out_len = size_t_out_len;
+  ret = 1;
 
-  if (RSA_sign_raw(rsa, &size_t_out_len, out, rsa_size, signed_msg,
-                   signed_msg_len, RSA_PKCS1_PADDING)) {
-    *out_len = size_t_out_len;
-    ret = 1;
-  }
-
-finish:
+err:
   if (signed_msg_is_alloced) {
     OPENSSL_free(signed_msg);
   }
@@ -525,6 +493,8 @@
     goto out;
   }
 
+  /* Check that no other information follows the hash value (FIPS 186-4 Section
+   * 5.5) and it matches the expected hash. */
   if (len != signed_msg_len || OPENSSL_memcmp(buf, signed_msg, len) != 0) {
     OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_SIGNATURE);
     goto out;
@@ -597,23 +567,6 @@
     goto out;
   }
 
-  size_t num_additional_primes = 0;
-  if (key->additional_primes != NULL) {
-    num_additional_primes = sk_RSA_additional_prime_num(key->additional_primes);
-  }
-
-  for (size_t i = 0; i < num_additional_primes; i++) {
-    const RSA_additional_prime *ap =
-        sk_RSA_additional_prime_value(key->additional_primes, i);
-    if (!BN_mul(&n, &n, ap->prime, ctx) ||
-        !BN_sub(&pm1, ap->prime, BN_value_one()) ||
-        !BN_mul(&lcm, &lcm, &pm1, ctx) ||
-        !BN_gcd(&gcd, &gcd, &pm1, ctx)) {
-      OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
-      goto out;
-    }
-  }
-
   if (!BN_div(&lcm, NULL, &lcm, &gcd, ctx) ||
       !BN_gcd(&gcd, &pm1, &qm1, ctx) ||
       /* de = d*e mod lcm(prime-1, for all primes). */
@@ -639,7 +592,7 @@
     goto out;
   }
 
-  if (has_crt_values && num_additional_primes == 0) {
+  if (has_crt_values) {
     if (/* dmp1 = d mod (p-1) */
         !BN_mod(&dmp1, key->d, &pm1, ctx) ||
         /* dmq1 = d mod (q-1) */
@@ -676,6 +629,88 @@
   return ok;
 }
 
+
+/* This is the product of the 132 smallest odd primes, from 3 to 751. */
+static const BN_ULONG kSmallFactorsLimbs[] = {
+    TOBN(0xc4309333, 0x3ef4e3e1), TOBN(0x71161eb6, 0xcd2d655f),
+    TOBN(0x95e2238c, 0x0bf94862), TOBN(0x3eb233d3, 0x24f7912b),
+    TOBN(0x6b55514b, 0xbf26c483), TOBN(0x0a84d817, 0x5a144871),
+    TOBN(0x77d12fee, 0x9b82210a), TOBN(0xdb5b93c2, 0x97f050b3),
+    TOBN(0x4acad6b9, 0x4d6c026b), TOBN(0xeb7751f3, 0x54aec893),
+    TOBN(0xdba53368, 0x36bc85c4), TOBN(0xd85a1b28, 0x7f5ec78e),
+    TOBN(0x2eb072d8, 0x6b322244), TOBN(0xbba51112, 0x5e2b3aea),
+    TOBN(0x36ed1a6c, 0x0e2486bf), TOBN(0x5f270460, 0xec0c5727),
+    0x000017b1
+};
+static const BIGNUM kSmallFactors = STATIC_BIGNUM(kSmallFactorsLimbs);
+
+int RSA_check_fips(RSA *key) {
+  if (RSA_is_opaque(key)) {
+    /* Opaque keys can't be checked. */
+    OPENSSL_PUT_ERROR(RSA, RSA_R_PUBLIC_KEY_VALIDATION_FAILED);
+    return 0;
+  }
+
+  if (!RSA_check_key(key)) {
+    return 0;
+  }
+
+  BN_CTX *ctx = BN_CTX_new();
+  if (ctx == NULL) {
+    OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
+
+  BIGNUM small_gcd;
+  BN_init(&small_gcd);
+
+  int ret = 1;
+
+  /* Perform partial public key validation of RSA keys (SP 800-89 5.3.3). */
+  /* TODO(svaldez): Check that n is composite and not a power of a prime using
+   * extended Miller-Rabin. */
+  if (BN_num_bits(key->e) < 16 ||
+      BN_num_bits(key->e) > 256 ||
+      !BN_is_odd(key->n) ||
+      !BN_is_odd(key->e) ||
+      !BN_gcd(&small_gcd, key->n, &kSmallFactors, ctx) ||
+      !BN_is_one(&small_gcd)) {
+    OPENSSL_PUT_ERROR(RSA, RSA_R_PUBLIC_KEY_VALIDATION_FAILED);
+    ret = 0;
+  }
+
+  BN_free(&small_gcd);
+  BN_CTX_free(ctx);
+
+  if (!ret || key->d == NULL || key->p == NULL) {
+    /* On a failure or on only a public key, there's nothing else can be
+     * checked. */
+    return ret;
+  }
+
+  /* FIPS pairwise consistency test (FIPS 140-2 4.9.2). Per FIPS 140-2 IG,
+   * section 9.9, it is not known whether |rsa| will be used for signing or
+   * encryption, so either pair-wise consistency self-test is acceptable. We
+   * perform a signing test. */
+  uint8_t data[32] = {0};
+  unsigned sig_len = RSA_size(key);
+  uint8_t *sig = OPENSSL_malloc(sig_len);
+  if (sig == NULL) {
+    OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
+
+  if (!RSA_sign(NID_sha256, data, sizeof(data), sig, &sig_len, key) ||
+      !RSA_verify(NID_sha256, data, sizeof(data), sig, sig_len, key)) {
+    OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
+    ret = 0;
+  }
+
+  OPENSSL_free(sig);
+
+  return ret;
+}
+
 int RSA_recover_crt_params(RSA *rsa) {
   BN_CTX *ctx;
   BIGNUM *totient, *rem, *multiple, *p_plus_q, *p_minus_q;
@@ -691,11 +726,6 @@
     return 0;
   }
 
-  if (rsa->additional_primes != NULL) {
-    OPENSSL_PUT_ERROR(RSA, RSA_R_CANNOT_RECOVER_MULTI_PRIME_KEY);
-    return 0;
-  }
-
   /* This uses the algorithm from section 9B of the RSA paper:
    * http://people.csail.mit.edu/rivest/Rsapaper.pdf */
 
diff --git a/src/crypto/rsa/rsa_asn1.c b/src/crypto/rsa/rsa_asn1.c
index 88b1dfb..d6e28ad 100644
--- a/src/crypto/rsa/rsa_asn1.c
+++ b/src/crypto/rsa/rsa_asn1.c
@@ -169,36 +169,9 @@
   return 1;
 }
 
-/* kVersionTwoPrime and kVersionMulti are the supported values of the version
- * field of an RSAPrivateKey structure (RFC 3447). */
+/* kVersionTwoPrime is the value of the version field for a two-prime
+ * RSAPrivateKey structure (RFC 3447). */
 static const uint64_t kVersionTwoPrime = 0;
-static const uint64_t kVersionMulti = 1;
-
-/* rsa_parse_additional_prime parses a DER-encoded OtherPrimeInfo from |cbs| and
- * advances |cbs|. It returns a newly-allocated |RSA_additional_prime| on
- * success or NULL on error. The |r| and |mont| fields of the result are set to
- * NULL. */
-static RSA_additional_prime *rsa_parse_additional_prime(CBS *cbs) {
-  RSA_additional_prime *ret = OPENSSL_malloc(sizeof(RSA_additional_prime));
-  if (ret == NULL) {
-    OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
-    return 0;
-  }
-  OPENSSL_memset(ret, 0, sizeof(RSA_additional_prime));
-
-  CBS child;
-  if (!CBS_get_asn1(cbs, &child, CBS_ASN1_SEQUENCE) ||
-      !parse_integer(&child, &ret->prime) ||
-      !parse_integer(&child, &ret->exp) ||
-      !parse_integer(&child, &ret->coeff) ||
-      CBS_len(&child) != 0) {
-    OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_ENCODING);
-    RSA_additional_prime_free(ret);
-    return NULL;
-  }
-
-  return ret;
-}
 
 RSA *RSA_parse_private_key(CBS *cbs) {
   BN_CTX *ctx = NULL;
@@ -216,7 +189,7 @@
     goto err;
   }
 
-  if (version != kVersionTwoPrime && version != kVersionMulti) {
+  if (version != kVersionTwoPrime) {
     OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_VERSION);
     goto err;
   }
@@ -232,50 +205,6 @@
     goto err;
   }
 
-  if (version == kVersionMulti) {
-    /* Although otherPrimeInfos is written as OPTIONAL in RFC 3447, it later
-     * says "[otherPrimeInfos] shall be omitted if version is 0 and shall
-     * contain at least one instance of OtherPrimeInfo if version is 1." The
-     * OPTIONAL is just so both versions share a single definition. */
-    CBS other_prime_infos;
-    if (!CBS_get_asn1(&child, &other_prime_infos, CBS_ASN1_SEQUENCE) ||
-        CBS_len(&other_prime_infos) == 0) {
-      OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_ENCODING);
-      goto err;
-    }
-    ret->additional_primes = sk_RSA_additional_prime_new_null();
-    if (ret->additional_primes == NULL) {
-      OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
-      goto err;
-    }
-
-    ctx = BN_CTX_new();
-    product_of_primes_so_far = BN_new();
-    if (ctx == NULL ||
-        product_of_primes_so_far == NULL ||
-        !BN_mul(product_of_primes_so_far, ret->p, ret->q, ctx)) {
-      goto err;
-    }
-
-    while (CBS_len(&other_prime_infos) > 0) {
-      RSA_additional_prime *ap = rsa_parse_additional_prime(&other_prime_infos);
-      if (ap == NULL) {
-        goto err;
-      }
-      if (!sk_RSA_additional_prime_push(ret->additional_primes, ap)) {
-        OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
-        RSA_additional_prime_free(ap);
-        goto err;
-      }
-      ap->r = BN_dup(product_of_primes_so_far);
-      if (ap->r == NULL ||
-          !BN_mul(product_of_primes_so_far, product_of_primes_so_far,
-                  ap->prime, ctx)) {
-        goto err;
-      }
-    }
-  }
-
   if (CBS_len(&child) != 0) {
     OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_ENCODING);
     goto err;
@@ -310,13 +239,9 @@
 }
 
 int RSA_marshal_private_key(CBB *cbb, const RSA *rsa) {
-  const int is_multiprime =
-      sk_RSA_additional_prime_num(rsa->additional_primes) > 0;
-
   CBB child;
   if (!CBB_add_asn1(cbb, &child, CBS_ASN1_SEQUENCE) ||
-      !CBB_add_asn1_uint64(&child,
-                           is_multiprime ? kVersionMulti : kVersionTwoPrime) ||
+      !CBB_add_asn1_uint64(&child, kVersionTwoPrime) ||
       !marshal_integer(&child, rsa->n) ||
       !marshal_integer(&child, rsa->e) ||
       !marshal_integer(&child, rsa->d) ||
@@ -324,35 +249,8 @@
       !marshal_integer(&child, rsa->q) ||
       !marshal_integer(&child, rsa->dmp1) ||
       !marshal_integer(&child, rsa->dmq1) ||
-      !marshal_integer(&child, rsa->iqmp)) {
-    OPENSSL_PUT_ERROR(RSA, RSA_R_ENCODE_ERROR);
-    return 0;
-  }
-
-  CBB other_prime_infos;
-  if (is_multiprime) {
-    if (!CBB_add_asn1(&child, &other_prime_infos, CBS_ASN1_SEQUENCE)) {
-      OPENSSL_PUT_ERROR(RSA, RSA_R_ENCODE_ERROR);
-      return 0;
-    }
-    for (size_t i = 0; i < sk_RSA_additional_prime_num(rsa->additional_primes);
-         i++) {
-      RSA_additional_prime *ap =
-          sk_RSA_additional_prime_value(rsa->additional_primes, i);
-      CBB other_prime_info;
-      if (!CBB_add_asn1(&other_prime_infos, &other_prime_info,
-                        CBS_ASN1_SEQUENCE) ||
-          !marshal_integer(&other_prime_info, ap->prime) ||
-          !marshal_integer(&other_prime_info, ap->exp) ||
-          !marshal_integer(&other_prime_info, ap->coeff) ||
-          !CBB_flush(&other_prime_infos)) {
-        OPENSSL_PUT_ERROR(RSA, RSA_R_ENCODE_ERROR);
-        return 0;
-      }
-    }
-  }
-
-  if (!CBB_flush(cbb)) {
+      !marshal_integer(&child, rsa->iqmp) ||
+      !CBB_flush(cbb)) {
     OPENSSL_PUT_ERROR(RSA, RSA_R_ENCODE_ERROR);
     return 0;
   }
diff --git a/src/crypto/rsa/rsa_impl.c b/src/crypto/rsa/rsa_impl.c
index e385e60..eb0a13e 100644
--- a/src/crypto/rsa/rsa_impl.c
+++ b/src/crypto/rsa/rsa_impl.c
@@ -57,12 +57,14 @@
 #include <openssl/rsa.h>
 
 #include <assert.h>
+#include <limits.h>
 #include <string.h>
 
 #include <openssl/bn.h>
 #include <openssl/err.h>
 #include <openssl/mem.h>
 #include <openssl/thread.h>
+#include <openssl/type_check.h>
 
 #include "internal.h"
 #include "../bn/internal.h"
@@ -649,11 +651,6 @@
 
   BIGNUM *r1, *m1, *vrfy;
   int ret = 0;
-  size_t i, num_additional_primes = 0;
-
-  if (rsa->additional_primes != NULL) {
-    num_additional_primes = sk_RSA_additional_prime_num(rsa->additional_primes);
-  }
 
   BN_CTX_start(ctx);
   r1 = BN_CTX_get(ctx);
@@ -731,31 +728,6 @@
     goto err;
   }
 
-  for (i = 0; i < num_additional_primes; i++) {
-    /* multi-prime RSA. */
-    RSA_additional_prime *ap =
-        sk_RSA_additional_prime_value(rsa->additional_primes, i);
-
-    /* c will already point to a BIGNUM with the correct flags. */
-    if (!BN_mod(r1, I, ap->prime, ctx)) {
-      goto err;
-    }
-
-    if (!BN_MONT_CTX_set_locked(&ap->mont, &rsa->lock, ap->prime, ctx) ||
-        !BN_mod_exp_mont_consttime(m1, r1, ap->exp, ap->prime, ctx, ap->mont)) {
-      goto err;
-    }
-
-    if (!BN_sub(m1, m1, r0) ||
-        !BN_mul(m1, m1, ap->coeff, ctx) ||
-        !BN_mod(m1, m1, ap->prime, ctx) ||
-        (BN_is_negative(m1) && !BN_add(m1, m1, ap->prime)) ||
-        !BN_mul(m1, m1, ap->r, ctx) ||
-        !BN_add(r0, r0, m1)) {
-      goto err;
-    }
-  }
-
   ret = 1;
 
 err:
@@ -763,248 +735,260 @@
   return ret;
 }
 
-int rsa_default_multi_prime_keygen(RSA *rsa, int bits, int num_primes,
-                                   BIGNUM *e_value, BN_GENCB *cb) {
-  BIGNUM *r0 = NULL, *r1 = NULL, *r2 = NULL, *r3 = NULL, *tmp;
-  int prime_bits, ok = -1, n = 0, i, j;
-  BN_CTX *ctx = NULL;
-  STACK_OF(RSA_additional_prime) *additional_primes = NULL;
+static int ensure_bignum(BIGNUM **out) {
+  if (*out == NULL) {
+    *out = BN_new();
+  }
+  return *out != NULL;
+}
 
-  if (num_primes < 2) {
-    ok = 0; /* we set our own err */
-    OPENSSL_PUT_ERROR(RSA, RSA_R_MUST_HAVE_AT_LEAST_TWO_PRIMES);
+/* kBoringSSLRSASqrtTwo is the BIGNUM representation of ⌊2¹⁵³⁵×√2⌋. This is
+ * chosen to give enough precision for 3072-bit RSA, the largest key size FIPS
+ * specifies. Key sizes beyond this will round up.
+ *
+ * To verify this number, check that n² < 2³⁰⁷¹ < (n+1)², where n is value
+ * represented here. Note the components are listed in little-endian order. Here
+ * is some sample Python code to check:
+ *
+ *   >>> TOBN = lambda a, b: a << 32 | b
+ *   >>> l = [ <paste the contents of kSqrtTwo> ]
+ *   >>> n = sum(a * 2**(64*i) for i, a in enumerate(l))
+ *   >>> n**2 < 2**3071 < (n+1)**2
+ *   True
+ */
+const BN_ULONG kBoringSSLRSASqrtTwo[] = {
+    TOBN(0xdea06241, 0xf7aa81c2), TOBN(0xf6a1be3f, 0xca221307),
+    TOBN(0x332a5e9f, 0x7bda1ebf), TOBN(0x0104dc01, 0xfe32352f),
+    TOBN(0xb8cf341b, 0x6f8236c7), TOBN(0x4264dabc, 0xd528b651),
+    TOBN(0xf4d3a02c, 0xebc93e0c), TOBN(0x81394ab6, 0xd8fd0efd),
+    TOBN(0xeaa4a089, 0x9040ca4a), TOBN(0xf52f120f, 0x836e582e),
+    TOBN(0xcb2a6343, 0x31f3c84d), TOBN(0xc6d5a8a3, 0x8bb7e9dc),
+    TOBN(0x460abc72, 0x2f7c4e33), TOBN(0xcab1bc91, 0x1688458a),
+    TOBN(0x53059c60, 0x11bc337b), TOBN(0xd2202e87, 0x42af1f4e),
+    TOBN(0x78048736, 0x3dfa2768), TOBN(0x0f74a85e, 0x439c7b4a),
+    TOBN(0xa8b1fe6f, 0xdc83db39), TOBN(0x4afc8304, 0x3ab8a2c3),
+    TOBN(0xed17ac85, 0x83339915), TOBN(0x1d6f60ba, 0x893ba84c),
+    TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484),
+};
+const size_t kBoringSSLRSASqrtTwoLen = OPENSSL_ARRAY_SIZE(kBoringSSLRSASqrtTwo);
+
+int rsa_less_than_words(const BN_ULONG *a, const BN_ULONG *b, size_t len) {
+  OPENSSL_COMPILE_ASSERT(sizeof(BN_ULONG) <= sizeof(size_t),
+                         size_t_constant_time_functions_too_small);
+  int ret = 0;
+  /* Process the words in little-endian order. */
+  for (size_t i = 0; i < len; i++) {
+    size_t eq = constant_time_eq_s(a[i], b[i]);
+    size_t lt = constant_time_lt_s(a[i], b[i]);
+    ret = constant_time_select_int(eq, ret, constant_time_select_int(lt, 1, 0));
+  }
+  return ret;
+}
+
+int rsa_greater_than_pow2(const BIGNUM *b, int n) {
+  if (BN_is_negative(b) || n == INT_MAX) {
+    return 0;
+  }
+
+  int b_bits = BN_num_bits(b);
+  return b_bits > n + 1 || (b_bits == n + 1 && !BN_is_pow2(b));
+}
+
+/* generate_prime sets |out| to a prime with length |bits| such that |out|-1 is
+ * relatively prime to |e|. If |p| is non-NULL, |out| will also not be close to
+ * |p|. */
+static int generate_prime(BIGNUM *out, int bits, const BIGNUM *e,
+                          const BIGNUM *p, BN_CTX *ctx, BN_GENCB *cb) {
+  if (bits < 128 || (bits % BN_BITS2) != 0) {
+    OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
+    return 0;
+  }
+
+  /* Ensure the bound on |tries| does not overflow. */
+  if (bits >= INT_MAX/5) {
+    OPENSSL_PUT_ERROR(RSA, RSA_R_MODULUS_TOO_LARGE);
+    return 0;
+  }
+
+  int ret = 0, tries = 0, rand_tries = 0;
+  BN_CTX_start(ctx);
+  BIGNUM *tmp = BN_CTX_get(ctx);
+  if (tmp == NULL) {
     goto err;
   }
 
-  ctx = BN_CTX_new();
+  /* See FIPS 186-4 appendix B.3.3, steps 4 and 5. Note |bits| here is
+   * nlen/2. */
+  for (;;) {
+    /* Generate a random number of length |bits| where the bottom bit is set
+     * (steps 4.2, 4.3, 5.2 and 5.3) and the top bit is set (implied by the
+     * bound checked below in steps 4.4 and 5.5). */
+    if (!BN_rand(out, bits, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ODD) ||
+        !BN_GENCB_call(cb, BN_GENCB_GENERATED, rand_tries++)) {
+      goto err;
+    }
+
+    if (p != NULL) {
+      /* If |p| and |out| are too close, try again (step 5.4). */
+      if (!BN_sub(tmp, out, p)) {
+        goto err;
+      }
+      BN_set_negative(tmp, 0);
+      if (!rsa_greater_than_pow2(tmp, bits - 100)) {
+        continue;
+      }
+    }
+
+    /* If out < 2^(bits-1)×√2, try again (steps 4.4 and 5.5).
+     *
+     * We check the most significant words, so we retry if ⌊out/2^k⌋ <= ⌊b/2^k⌋,
+     * where b = 2^(bits-1)×√2 and k = max(0, bits - 1536). For key sizes up to
+     * 3072 (bits = 1536), k = 0, so we are testing that ⌊out⌋ <= ⌊b⌋. out is an
+     * integer and b is not, so this is equivalent to out < b. That is, the
+     * comparison is exact for FIPS key sizes.
+     *
+     * For larger keys, the comparison is approximate, leaning towards
+     * retrying. That is, we reject a negligible fraction of primes that are
+     * within the FIPS bound, but we will never accept a prime outside the
+     * bound, ensuring the resulting RSA key is the right size. Specifically, if
+     * the FIPS bound holds, we have ⌊out/2^k⌋ < out/2^k < b/2^k. This implies
+     * ⌊out/2^k⌋ <= ⌊b/2^k⌋. That is, the FIPS bound implies our bound and so we
+     * are slightly tighter. */
+    size_t out_len = (size_t)out->top;
+    assert(out_len == (size_t)bits / BN_BITS2);
+    size_t to_check = kBoringSSLRSASqrtTwoLen;
+    if (to_check > out_len) {
+      to_check = out_len;
+    }
+    if (!rsa_less_than_words(
+            kBoringSSLRSASqrtTwo + kBoringSSLRSASqrtTwoLen - to_check,
+            out->d + out_len - to_check, to_check)) {
+      continue;
+    }
+
+    /* Check gcd(out-1, e) is one (steps 4.5 and 5.6). */
+    if (!BN_sub(tmp, out, BN_value_one()) ||
+        !BN_gcd(tmp, tmp, e, ctx)) {
+      goto err;
+    }
+    if (BN_is_one(tmp)) {
+      /* Test |out| for primality (steps 4.5.1 and 5.6.1).
+       * TODO(davidben): Align the primality test with FIPS 186-4. */
+      int is_probable_prime;
+      if (!BN_primality_test(&is_probable_prime, out, BN_prime_checks, ctx, 1,
+                             cb)) {
+        goto err;
+      }
+      if (is_probable_prime) {
+        ret = 1;
+        goto err;
+      }
+    }
+
+    /* If we've tried too many times to find a prime, abort (steps 4.7 and
+     * 5.8). */
+    tries++;
+    if (tries >= bits * 5) {
+      OPENSSL_PUT_ERROR(RSA, RSA_R_TOO_MANY_ITERATIONS);
+      goto err;
+    }
+    if (!BN_GENCB_call(cb, 2, tries)) {
+      goto err;
+    }
+  }
+
+err:
+  BN_CTX_end(ctx);
+  return ret;
+}
+
+int rsa_default_keygen(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb) {
+  /* See FIPS 186-4 appendix B.3. This function implements a generalized version
+   * of the FIPS algorithm. For FIPS compliance, the caller is responsible for
+   * passing in 2048 or 3072 to |bits| and 65537 for |e_value|. */
+
+  /* Always generate RSA keys which are a multiple of 128 bits. Round |bits|
+   * down as needed. */
+  bits &= ~127;
+
+  /* Reject excessively small keys. */
+  if (bits < 256) {
+    OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL);
+    return 0;
+  }
+
+  int ret = 0;
+  BN_CTX *ctx = BN_CTX_new();
   if (ctx == NULL) {
-    goto err;
+    goto bn_err;
   }
   BN_CTX_start(ctx);
-  r0 = BN_CTX_get(ctx);
-  r1 = BN_CTX_get(ctx);
-  r2 = BN_CTX_get(ctx);
-  r3 = BN_CTX_get(ctx);
+  BIGNUM *r0 = BN_CTX_get(ctx);
+  BIGNUM *r1 = BN_CTX_get(ctx);
+  BIGNUM *r2 = BN_CTX_get(ctx);
+  BIGNUM *r3 = BN_CTX_get(ctx);
   if (r0 == NULL || r1 == NULL || r2 == NULL || r3 == NULL) {
-    goto err;
+    goto bn_err;
   }
 
-  if (num_primes > 2) {
-    additional_primes = sk_RSA_additional_prime_new_null();
-    if (additional_primes == NULL) {
-      goto err;
-    }
-  }
-
-  for (i = 2; i < num_primes; i++) {
-    RSA_additional_prime *ap = OPENSSL_malloc(sizeof(RSA_additional_prime));
-    if (ap == NULL) {
-      goto err;
-    }
-    OPENSSL_memset(ap, 0, sizeof(RSA_additional_prime));
-    ap->prime = BN_new();
-    ap->exp = BN_new();
-    ap->coeff = BN_new();
-    ap->r = BN_new();
-    if (ap->prime == NULL ||
-        ap->exp == NULL ||
-        ap->coeff == NULL ||
-        ap->r == NULL ||
-        !sk_RSA_additional_prime_push(additional_primes, ap)) {
-      RSA_additional_prime_free(ap);
-      goto err;
-    }
-  }
-
-  /* We need the RSA components non-NULL */
-  if (!rsa->n && ((rsa->n = BN_new()) == NULL)) {
-    goto err;
-  }
-  if (!rsa->d && ((rsa->d = BN_new()) == NULL)) {
-    goto err;
-  }
-  if (!rsa->e && ((rsa->e = BN_new()) == NULL)) {
-    goto err;
-  }
-  if (!rsa->p && ((rsa->p = BN_new()) == NULL)) {
-    goto err;
-  }
-  if (!rsa->q && ((rsa->q = BN_new()) == NULL)) {
-    goto err;
-  }
-  if (!rsa->dmp1 && ((rsa->dmp1 = BN_new()) == NULL)) {
-    goto err;
-  }
-  if (!rsa->dmq1 && ((rsa->dmq1 = BN_new()) == NULL)) {
-    goto err;
-  }
-  if (!rsa->iqmp && ((rsa->iqmp = BN_new()) == NULL)) {
-    goto err;
+  /* We need the RSA components non-NULL. */
+  if (!ensure_bignum(&rsa->n) ||
+      !ensure_bignum(&rsa->d) ||
+      !ensure_bignum(&rsa->e) ||
+      !ensure_bignum(&rsa->p) ||
+      !ensure_bignum(&rsa->q) ||
+      !ensure_bignum(&rsa->dmp1) ||
+      !ensure_bignum(&rsa->dmq1) ||
+      !ensure_bignum(&rsa->iqmp)) {
+    goto bn_err;
   }
 
   if (!BN_copy(rsa->e, e_value)) {
-    goto err;
+    goto bn_err;
   }
 
-  /* generate p and q */
-  prime_bits = (bits + (num_primes - 1)) / num_primes;
-  for (;;) {
-    if (!BN_generate_prime_ex(rsa->p, prime_bits, 0, NULL, NULL, cb) ||
-        !BN_sub(r2, rsa->p, BN_value_one()) ||
-        !BN_gcd(r1, r2, rsa->e, ctx)) {
-      goto err;
-    }
-    if (BN_is_one(r1)) {
-      break;
-    }
-    if (!BN_GENCB_call(cb, 2, n++)) {
-      goto err;
-    }
-  }
-  if (!BN_GENCB_call(cb, 3, 0)) {
-    goto err;
-  }
-  prime_bits = ((bits - prime_bits) + (num_primes - 2)) / (num_primes - 1);
-  for (;;) {
-    /* When generating ridiculously small keys, we can get stuck
-     * continually regenerating the same prime values. Check for
-     * this and bail if it happens 3 times. */
-    unsigned int degenerate = 0;
-    do {
-      if (!BN_generate_prime_ex(rsa->q, prime_bits, 0, NULL, NULL, cb)) {
-        goto err;
-      }
-    } while ((BN_cmp(rsa->p, rsa->q) == 0) && (++degenerate < 3));
-    if (degenerate == 3) {
-      ok = 0; /* we set our own err */
-      OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL);
-      goto err;
-    }
-    if (!BN_sub(r2, rsa->q, BN_value_one()) ||
-        !BN_gcd(r1, r2, rsa->e, ctx)) {
-      goto err;
-    }
-    if (BN_is_one(r1)) {
-      break;
-    }
-    if (!BN_GENCB_call(cb, 2, n++)) {
-      goto err;
-    }
-  }
-
-  if (!BN_GENCB_call(cb, 3, 1) ||
-      !BN_mul(rsa->n, rsa->p, rsa->q, ctx)) {
-    goto err;
-  }
-
-  for (i = 2; i < num_primes; i++) {
-    RSA_additional_prime *ap =
-        sk_RSA_additional_prime_value(additional_primes, i - 2);
-    prime_bits = ((bits - BN_num_bits(rsa->n)) + (num_primes - (i + 1))) /
-                 (num_primes - i);
-
-    for (;;) {
-      if (!BN_generate_prime_ex(ap->prime, prime_bits, 0, NULL, NULL, cb)) {
-        goto err;
-      }
-      if (BN_cmp(rsa->p, ap->prime) == 0 ||
-          BN_cmp(rsa->q, ap->prime) == 0) {
-        continue;
-      }
-
-      for (j = 0; j < i - 2; j++) {
-        if (BN_cmp(sk_RSA_additional_prime_value(additional_primes, j)->prime,
-                   ap->prime) == 0) {
-          break;
-        }
-      }
-      if (j != i - 2) {
-        continue;
-      }
-
-      if (!BN_sub(r2, ap->prime, BN_value_one()) ||
-          !BN_gcd(r1, r2, rsa->e, ctx)) {
-        goto err;
-      }
-
-      if (!BN_is_one(r1)) {
-        continue;
-      }
-      if (i != num_primes - 1) {
-        break;
-      }
-
-      /* For the last prime we'll check that it makes n large enough. In the
-       * two prime case this isn't a problem because we generate primes with
-       * the top two bits set and so the product is always of the expected
-       * size. In the multi prime case, this doesn't follow. */
-      if (!BN_mul(r1, rsa->n, ap->prime, ctx)) {
-        goto err;
-      }
-      if (BN_num_bits(r1) == (unsigned) bits) {
-        break;
-      }
-
-      if (!BN_GENCB_call(cb, 2, n++)) {
-        goto err;
-      }
+  int prime_bits = bits / 2;
+  do {
+    /* Generate p and q, each of size |prime_bits|, using the steps outlined in
+     * appendix FIPS 186-4 appendix B.3.3. */
+    if (!generate_prime(rsa->p, prime_bits, rsa->e, NULL, ctx, cb) ||
+        !BN_GENCB_call(cb, 3, 0) ||
+        !generate_prime(rsa->q, prime_bits, rsa->e, rsa->p, ctx, cb) ||
+        !BN_GENCB_call(cb, 3, 1)) {
+      goto bn_err;
     }
 
-    /* ap->r is is the product of all the primes prior to the current one
-     * (including p and q). */
-    if (!BN_copy(ap->r, rsa->n)) {
-      goto err;
-    }
-    if (i == num_primes - 1) {
-      /* In the case of the last prime, we calculated n as |r1| in the loop
-       * above. */
-      if (!BN_copy(rsa->n, r1)) {
-        goto err;
-      }
-    } else if (!BN_mul(rsa->n, rsa->n, ap->prime, ctx)) {
-      goto err;
+    if (BN_cmp(rsa->p, rsa->q) < 0) {
+      BIGNUM *tmp = rsa->p;
+      rsa->p = rsa->q;
+      rsa->q = tmp;
     }
 
-    if (!BN_GENCB_call(cb, 3, 1)) {
-      goto err;
+    /* Calculate d. */
+    if (!BN_sub(r1 /* p-1 */, rsa->p, BN_value_one()) ||
+        !BN_sub(r2 /* q-1 */, rsa->q, BN_value_one()) ||
+        !BN_mul(r0 /* (p-1)(q-1) */, r1, r2, ctx) ||
+        !BN_mod_inverse(rsa->d, rsa->e, r0, ctx)) {
+      goto bn_err;
     }
+
+    /* Check that |rsa->d| > 2^|prime_bits| and try again if it fails. See
+     * appendix B.3.1's guidance on values for d. */
+  } while (!rsa_greater_than_pow2(rsa->d, prime_bits));
+
+  if (/* Calculate n. */
+      !BN_mul(rsa->n, rsa->p, rsa->q, ctx) ||
+      /* Calculate d mod (p-1). */
+      !BN_mod(rsa->dmp1, rsa->d, r1, ctx) ||
+      /* Calculate d mod (q-1) */
+      !BN_mod(rsa->dmq1, rsa->d, r2, ctx)) {
+    goto bn_err;
   }
 
-  if (BN_cmp(rsa->p, rsa->q) < 0) {
-    tmp = rsa->p;
-    rsa->p = rsa->q;
-    rsa->q = tmp;
-  }
-
-  /* calculate d */
-  if (!BN_sub(r1, rsa->p, BN_value_one())) {
-    goto err; /* p-1 */
-  }
-  if (!BN_sub(r2, rsa->q, BN_value_one())) {
-    goto err; /* q-1 */
-  }
-  if (!BN_mul(r0, r1, r2, ctx)) {
-    goto err; /* (p-1)(q-1) */
-  }
-  for (i = 2; i < num_primes; i++) {
-    RSA_additional_prime *ap =
-        sk_RSA_additional_prime_value(additional_primes, i - 2);
-    if (!BN_sub(r3, ap->prime, BN_value_one()) ||
-        !BN_mul(r0, r0, r3, ctx)) {
-      goto err;
-    }
-  }
-  if (!BN_mod_inverse(rsa->d, rsa->e, r0, ctx)) {
-    goto err; /* d */
-  }
-
-  /* calculate d mod (p-1) */
-  if (!BN_mod(rsa->dmp1, rsa->d, r1, ctx)) {
-    goto err;
-  }
-
-  /* calculate d mod (q-1) */
-  if (!BN_mod(rsa->dmq1, rsa->d, r2, ctx)) {
+  /* Sanity-check that |rsa->n| has the specified size. This is implied by
+   * |generate_prime|'s bounds. */
+  if (BN_num_bits(rsa->n) != (unsigned)bits) {
+    OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
     goto err;
   }
 
@@ -1015,49 +999,29 @@
   if (!BN_MONT_CTX_set_locked(&rsa->mont_p, &rsa->lock, rsa->p, ctx) ||
       !bn_mod_inverse_secret_prime(rsa->iqmp, rsa->q, rsa->p, ctx,
                                    rsa->mont_p)) {
-    goto err;
+    goto bn_err;
   }
 
-  for (i = 2; i < num_primes; i++) {
-    RSA_additional_prime *ap =
-        sk_RSA_additional_prime_value(additional_primes, i - 2);
-    if (!BN_sub(ap->exp, ap->prime, BN_value_one()) ||
-        !BN_mod(ap->exp, rsa->d, ap->exp, ctx) ||
-        !BN_MONT_CTX_set_locked(&ap->mont, &rsa->lock, ap->prime, ctx) ||
-        !bn_mod_inverse_secret_prime(ap->coeff, ap->r, ap->prime, ctx,
-                                     ap->mont)) {
-      goto err;
-    }
-  }
-
-  rsa->additional_primes = additional_primes;
-  additional_primes = NULL;
-
   /* The key generation process is complex and thus error-prone. It could be
    * disastrous to generate and then use a bad key so double-check that the key
    * makes sense. */
-  ok = RSA_check_key(rsa);
-  if (!ok) {
+  if (!RSA_check_key(rsa)) {
     OPENSSL_PUT_ERROR(RSA, RSA_R_INTERNAL_ERROR);
+    goto err;
   }
 
-err:
-  if (ok == -1) {
+  ret = 1;
+
+bn_err:
+  if (!ret) {
     OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
-    ok = 0;
   }
+err:
   if (ctx != NULL) {
     BN_CTX_end(ctx);
     BN_CTX_free(ctx);
   }
-  sk_RSA_additional_prime_pop_free(additional_primes,
-                                   RSA_additional_prime_free);
-  return ok;
-}
-
-int rsa_default_keygen(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb) {
-  return rsa_default_multi_prime_keygen(rsa, bits, 2 /* num primes */, e_value,
-                                        cb);
+  return ret;
 }
 
 /* All of the methods are NULL to make it easier for the compiler/linker to drop
@@ -1091,7 +1055,7 @@
   RSA_FLAG_CACHE_PUBLIC | RSA_FLAG_CACHE_PRIVATE,
 
   NULL /* keygen (defaults to rsa_default_keygen) */,
-  NULL /* multi_prime_keygen (defaults to rsa_default_multi_prime_keygen) */,
+  NULL /* multi_prime_keygen (ignored) */,
 
   NULL /* supports_digest */,
 };
diff --git a/src/crypto/rsa/rsa_test.cc b/src/crypto/rsa/rsa_test.cc
index 401efdf..217f455 100644
--- a/src/crypto/rsa/rsa_test.cc
+++ b/src/crypto/rsa/rsa_test.cc
@@ -67,8 +67,10 @@
 #include <openssl/err.h>
 #include <openssl/nid.h>
 
+#include "../bn/internal.h"
 #include "../internal.h"
 #include "../test/test_util.h"
+#include "internal.h"
 
 
 // kPlaintext is a sample plaintext.
@@ -96,6 +98,53 @@
     "\x9d\xa8\xe9\x0b\x1d\x34\x1f\x71\xd0\x9b\x76\xa8\xa9\x43\xe1\x1d\x10\xb2"
     "\x4d\x24\x9f\x2d\xea\xfe\xf8\x0c\x18\x26";
 
+// kFIPSKey is a DER-encoded RSAPrivateKey that is FIPS-compliant.
+static const uint8_t kFIPSKey[] =
+    "\x30\x82\x02\x5c\x02\x01\x00\x02\x81\x81\x00\xa1\x71\x90\x77\x86\x8a\xc7"
+    "\xb8\xfc\x2a\x45\x82\x6d\xee\xeb\x35\x3a\x18\x3f\xb6\xb0\x1e\xb1\xd3\x09"
+    "\x6b\x05\x4d\xec\x1c\x37\x6f\x09\x31\x32\xda\x21\x8a\x49\x0e\x16\x28\xed"
+    "\x9a\x30\xf3\x14\x53\xfd\x5b\xb0\xf6\x4a\x5d\x52\xe1\xda\xe1\x40\x6e\x65"
+    "\xbf\xca\x45\xd9\x62\x96\x4a\x1e\x11\xc4\x61\x83\x1f\x58\x8d\x5e\xd0\x12"
+    "\xaf\xa5\xec\x9b\x97\x2f\x6c\xb2\x82\x4a\x73\xd0\xd3\x9a\xc9\x69\x6b\x24"
+    "\x3c\x82\x6f\xee\x4d\x0c\x7e\xdf\xd7\xae\xea\x3a\xeb\x04\x27\x8d\x43\x81"
+    "\x59\xa7\x90\x56\xc1\x69\x42\xb3\xaf\x1c\x8d\x4e\xbf\x02\x03\x01\x00\x01"
+    "\x02\x81\x80\x60\x82\xcd\x44\x46\xcf\xeb\xf9\x6f\xf5\xad\x3b\xfd\x90\x18"
+    "\x57\xe7\x74\xdb\x91\xd0\xd3\x68\xa6\xaa\x38\xaa\x21\x1d\x06\xf9\x34\x8d"
+    "\xa0\x35\xb0\x24\xe0\xd0\x2f\x75\x9b\xdd\xfe\x91\x48\x9f\x5c\x5e\x57\x54"
+    "\x00\xc8\x0f\xe6\x1e\x52\x84\xd9\xc9\xa5\x55\xf4\x0a\xbe\x88\x46\x7a\xfb"
+    "\x18\x37\x8e\xe6\x6e\xa2\x5f\x80\x48\x34\x3f\x5c\xbe\x0e\x1e\xe8\x2f\x50"
+    "\xba\x14\x96\x3c\xea\xfb\xd2\x49\x33\xdc\x12\xb8\xa7\x8a\xb5\x27\xf9\x00"
+    "\x4b\xf5\xd2\x2a\xd0\x2c\x1d\x9b\xd5\x6c\x3e\x4b\xb9\x7e\x39\xf7\x3e\x39"
+    "\xc9\x47\x5e\xbe\x91\x02\x41\x00\xcd\x33\xcf\x37\x01\xd7\x59\xcc\xbe\xa0"
+    "\x1c\xb9\xf5\xe7\x44\x9f\x62\x91\xa7\xa7\x7b\x0c\x52\xcd\x7e\xe6\x31\x11"
+    "\x8b\xd8\x2c\x8a\x63\xe1\x07\xc9\xcb\xce\x01\x45\x63\xf5\x5d\x44\xfb\xeb"
+    "\x8d\x74\x16\x20\x7d\x3b\xb4\xa1\x61\xb0\xa8\x29\x51\xc9\xef\xb6\xa1\xd5"
+    "\x02\x41\x00\xc9\x68\xa6\xd3\x88\xd5\x49\x9d\x6b\x44\x96\xfd\xbf\x66\x27"
+    "\xb4\x1f\x90\x76\x86\x2f\xe2\xce\x20\x5d\xee\x9b\xeb\xc4\xb4\x62\x47\x79"
+    "\x99\xb1\x99\xbc\xa2\xa6\xb6\x96\x64\xd5\x77\x9b\x45\xd4\xf0\x99\xb5\x9e"
+    "\x61\x4d\xf5\x12\xdd\x84\x14\xaf\x1e\xdd\x83\x24\x43\x02\x40\x60\x29\x7f"
+    "\x59\xcf\xcb\x13\x92\x17\x63\x01\x13\x44\x61\x74\x8f\x1c\xaa\x15\x5f\x2f"
+    "\x12\xbf\x5a\xfd\xb4\xf2\x19\xbe\xe7\x37\x38\x43\x46\x19\x58\x3f\xe1\xf2"
+    "\x46\x8a\x69\x59\xa4\x12\x4a\x78\xa7\x86\x17\x03\x99\x0f\x34\xf1\x8a\xcf"
+    "\xc3\x4d\x48\xcc\xc5\x51\x61\x02\x41\x00\xc2\x12\xb3\x5d\xf5\xe5\xff\xcf"
+    "\x4e\x43\x83\x72\xf2\xf1\x4e\xa4\xc4\x1d\x81\xf7\xff\x40\x7e\xfa\xb5\x48"
+    "\x6c\xba\x1c\x8a\xec\x80\x8e\xed\xc8\x32\xa9\x8f\xd9\x30\xeb\x6e\x32\x3b"
+    "\xd4\x44\xcf\xd1\x1f\x6b\xe0\x37\x46\xd5\x35\xde\x79\x9d\x2c\xb9\x83\x1d"
+    "\x10\xdd\x02\x40\x0f\x14\x95\x96\xa0\xe2\x6c\xd4\x88\xa7\x0b\x82\x14\x10"
+    "\xad\x26\x0d\xe4\xa1\x5e\x01\x3d\x21\xd2\xfb\x0e\xf9\x58\xa5\xca\x1e\x21"
+    "\xb3\xf5\x9a\x6c\x3d\x5a\x72\xb1\x2d\xfe\xac\x09\x4f\xdd\xe5\x44\xd1\x4e"
+    "\xf8\x59\x85\x3a\x65\xe2\xcd\xbc\x27\x1d\x9b\x48\x9f\xb9";
+
+static const uint8_t kFIPSPublicKey[] =
+    "\x30\x81\x89\x02\x81\x81\x00\xa1\x71\x90\x77\x86\x8a\xc7\xb8\xfc\x2a\x45"
+    "\x82\x6d\xee\xeb\x35\x3a\x18\x3f\xb6\xb0\x1e\xb1\xd3\x09\x6b\x05\x4d\xec"
+    "\x1c\x37\x6f\x09\x31\x32\xda\x21\x8a\x49\x0e\x16\x28\xed\x9a\x30\xf3\x14"
+    "\x53\xfd\x5b\xb0\xf6\x4a\x5d\x52\xe1\xda\xe1\x40\x6e\x65\xbf\xca\x45\xd9"
+    "\x62\x96\x4a\x1e\x11\xc4\x61\x83\x1f\x58\x8d\x5e\xd0\x12\xaf\xa5\xec\x9b"
+    "\x97\x2f\x6c\xb2\x82\x4a\x73\xd0\xd3\x9a\xc9\x69\x6b\x24\x3c\x82\x6f\xee"
+    "\x4d\x0c\x7e\xdf\xd7\xae\xea\x3a\xeb\x04\x27\x8d\x43\x81\x59\xa7\x90\x56"
+    "\xc1\x69\x42\xb3\xaf\x1c\x8d\x4e\xbf\x02\x03\x01\x00\x01";
+
 // kOAEPCiphertext1 is a sample encryption of |kPlaintext| with |kKey1| using
 // RSA OAEP.
 static const uint8_t kOAEPCiphertext1[] =
@@ -272,204 +321,6 @@
     0x6a, 0xce, 0x9f, 0xc8,
 };
 
-static const uint8_t kThreePrimeKey[] =
-    "\x30\x82\x04\xd7\x02\x01\x01\x02\x82\x01\x00\x62\x91\xe9\xea\xb3\x5d\x6c"
-    "\x29\xae\x21\x83\xbb\xb5\x82\xb1\x9e\xea\xe0\x64\x5b\x1e\x2f\x5e\x2c\x0a"
-    "\x80\x3d\x29\xd4\xfa\x9a\xe7\x44\xe6\x21\xbd\x98\xc0\x3d\xe0\x53\x59\xae"
-    "\xd3\x3e\xfe\xc4\xc2\xc4\x5a\x5a\x89\x07\xf4\x4f\xdc\xb0\x6a\xd4\x3e\x99"
-    "\x7d\x7a\x97\x26\x4e\xe1\x93\xca\x6e\xed\x07\xfc\xb4\xfa\x95\x1e\x73\x7b"
-    "\x86\x08\x6a\xb9\xd4\x29\xb0\x7e\x59\xb7\x9d\x7b\xeb\x67\x6e\xf0\xbb\x5e"
-    "\xcf\xb9\xcd\x58\x93\xf0\xe7\x88\x17\x6c\x0d\x76\x1e\xb9\x27\x9a\x4d\x02"
-    "\x16\xb6\x49\x6d\xa7\x83\x23\x4d\x02\x48\x0c\x0c\x1f\x0e\x85\x21\xe3\x06"
-    "\x76\x0a\x73\xe6\xc1\x21\xfa\x30\x18\x78\x29\x5c\x31\xd0\x29\xae\x6f\x7d"
-    "\x87\xd8\x2f\x16\xfa\xbc\x67\x8a\x94\x71\x59\x9b\xec\x22\x40\x55\x9f\xc2"
-    "\x94\xb5\xbd\x78\x01\xc9\xef\x18\xc8\x6d\x0d\xdc\x53\x42\xb2\x5c\xab\x65"
-    "\x05\xbd\x35\x08\x85\x1b\xf8\xe9\x47\xbc\xfe\xc5\xae\x47\x29\x63\x44\x8e"
-    "\x4d\xb7\x47\xab\x0d\xd8\x76\x68\x4f\xc7\x07\x02\xe4\x86\xb0\xcf\xd8\x19"
-    "\xad\xf4\x85\x76\x8b\x3b\x4e\x40\x8d\x29\x7a\x8a\x07\x36\xf3\x78\xae\x17"
-    "\xa6\x8f\x53\x58\x65\x4c\x86\x9e\xd7\x8b\xec\x38\x4f\x99\xc7\x02\x01\x03"
-    "\x02\x82\x01\x00\x41\xb6\x9b\xf1\xcc\xe8\xf2\xc6\x74\x16\x57\xd2\x79\x01"
-    "\xcb\xbf\x47\x40\x42\xe7\x69\x74\xe9\x72\xb1\xaa\xd3\x71\x38\xa7\x11\xef"
-    "\x83\x44\x16\x7e\x65\xd5\x7e\x95\x8c\xe6\x74\x8c\xd4\xa9\xd8\x81\xd8\x3c"
-    "\x3c\x5b\x5a\xa2\xdf\xe8\x75\x9c\x8d\x7f\x10\xfe\x51\xba\x19\x89\xeb\xb7"
-    "\xdc\x49\xf3\x5a\xa8\x78\xa7\x0e\x14\x4c\xfd\x04\x05\x9c\x7b\xe2\xc5\xa3"
-    "\x04\xee\xd9\x4c\xfd\x7d\x47\xb0\x0d\x9b\x3d\x70\x91\x81\x2c\xab\x2b\x87"
-    "\xad\x11\x68\x24\xfc\x2b\xd4\xee\x5e\x28\xeb\x6d\xab\xde\x0f\x77\x15\x58"
-    "\x76\x39\xc9\x59\x3a\x7f\x19\x9d\xc6\x7e\x86\xe4\xd5\x38\x70\x9e\xae\xb9"
-    "\xfb\x33\x33\xd1\x0c\x2d\xab\x01\x20\xe1\x8b\x29\x99\xd3\xeb\x87\x05\x72"
-    "\xaa\x43\x58\x64\x8e\x9e\x31\xdb\x45\x9b\x2b\xac\x58\x80\x5d\x33\xa2\x43"
-    "\x05\x96\xcc\xca\x2d\x04\x5f\xd6\xb7\x3d\x8b\x8f\x2d\xa3\xa5\xf8\x73\xf5"
-    "\xd7\xc0\x19\xff\x10\xe6\xee\x3a\x26\x2f\xe1\x64\x3d\x11\xcd\x2d\xe4\x0a"
-    "\x84\x27\xe3\xcb\x16\x62\x19\xe7\xe3\x0d\x13\xe8\x09\x5a\x53\xd0\x20\x56"
-    "\x15\xf5\xb3\x67\xac\xa1\xb5\x94\x6b\xab\xdc\x71\xc7\xbf\x0a\xde\x76\xf5"
-    "\x03\xa0\x30\xd8\x27\x9d\x00\x2b\x02\x57\x00\xf1\x4f\xc2\x86\x13\x06\x17"
-    "\xf7\x69\x7e\x37\xdf\x67\xc5\x32\xa0\x74\x1c\x32\x69\x0f\x9f\x08\x88\x24"
-    "\xb1\x51\xbc\xbc\x92\xba\x73\x1f\x9c\x75\xc2\x14\x6d\x4f\xc4\x5a\xcf\xda"
-    "\x44\x35\x00\x6b\x42\x3b\x9f\x14\xf1\x05\xb3\x51\x22\xb6\xbe\x9c\xe0\xc1"
-    "\x5c\x48\x61\xdf\x4e\x4c\x72\xb8\x05\x35\x7c\xac\xf1\xbb\xa0\x3b\x2a\xea"
-    "\xf7\x86\xe9\xd2\xff\x1e\x1d\x02\x56\x00\xca\xb1\x39\xf6\xa2\xc6\x3b\x65"
-    "\x45\x2f\x39\x00\xcd\x6e\xd6\x55\xf7\x71\x37\x89\xc2\xe7\x7a\xc0\x1a\xa6"
-    "\x2f\xea\x17\x7c\xaa\x2a\x91\x8f\xd4\xc7\x50\x8b\xab\x8e\x99\x3b\x33\x91"
-    "\xbc\x02\x10\x58\x4b\x58\x40\x9b\xc4\x8f\x48\x2b\xa7\x44\xfd\x07\x04\xf0"
-    "\x98\x67\x56\xea\x25\x92\x8b\x2e\x4b\x4a\xa1\xd3\xc2\xa4\xb4\x9b\x59\x70"
-    "\x32\xa6\xd8\x8b\xd9\x02\x57\x00\xa0\xdf\xd7\x04\x0c\xae\xba\xa4\xf0\xfe"
-    "\xcf\xea\x45\x2e\x21\xc0\x4d\x68\x21\x9b\x5f\xbf\x5b\x05\x6d\xcb\x8b\xd3"
-    "\x28\x61\xd1\xa2\x15\x12\xf9\x2c\x0d\x9e\x35\x2d\x91\xdf\xe6\xd8\x23\x55"
-    "\x9c\xd6\xd2\x6a\x0d\xf6\x03\xcc\xe0\xc1\xcf\x29\xbd\xeb\x2b\x92\xda\xeb"
-    "\xea\x34\x32\xf7\x25\x58\xce\x53\x1d\xf6\x7d\x15\x7c\xc7\x47\x4f\xaf\x46"
-    "\x8c\xaa\x14\x13\x02\x56\x00\x87\x20\xd1\x4f\x17\x2e\xd2\x43\x83\x74\xd0"
-    "\xab\x33\x9f\x39\x8e\xa4\xf6\x25\x06\x81\xef\xa7\x2a\xbc\x6e\xca\x9c\x0f"
-    "\xa8\x71\x71\xb6\x5f\xe3\x2f\x8b\x07\xc7\xb4\x66\x27\x77\xb6\x7d\x56\xb5"
-    "\x90\x32\x3a\xd5\xbd\x2d\xb4\xda\xc7\xc4\xd8\xa8\xaf\x58\xa0\x65\x9a\x39"
-    "\xf1\x6e\x61\xb2\x1e\xdc\xdc\x6b\xe2\x81\xc3\x23\x12\x3b\xa0\x21\xc4\x90"
-    "\x5d\x3b\x02\x57\x00\xe6\x8a\xaa\xb8\x6d\x2c\x81\x43\xb5\xd6\xa0\x2b\x42"
-    "\x49\xa9\x0a\x51\xfa\x18\xc8\x32\xea\x54\x18\xf3\x60\xc2\xb5\x4a\x43\x05"
-    "\x93\x9c\x01\xd9\x28\xed\x73\xfa\x82\xbc\x12\x64\xcb\xc4\x24\xa9\x3e\xae"
-    "\x7c\x4b\x8f\x94\x57\x7b\x14\x10\x41\xdc\x62\x12\x8c\xb2\x4a\x7c\xf6\x53"
-    "\xd4\xc6\xe4\xda\xd1\xa2\x00\x0e\x3d\x30\xf7\x05\x4f\x1d\x82\xbc\x52\xd9"
-    "\xb1\x30\x82\x01\x0a\x30\x82\x01\x06\x02\x56\x00\x84\x12\x4f\xf7\x3b\x65"
-    "\x53\x34\x6c\x6c\x4d\x77\xdf\xfd\x1f\xb6\x16\xe2\x25\x15\xca\xc9\xc1\x41"
-    "\x9a\x50\xda\xeb\x88\x4f\x3d\xb3\x01\x00\x44\xc4\xac\xe7\x14\x62\xa6\x56"
-    "\xde\xc5\xb7\xc3\x1d\x07\xbd\x7d\x64\xc5\x7e\x45\x25\x56\xed\x7a\xd2\x14"
-    "\xdb\x4e\x27\xd4\x1f\xf8\x94\xa7\xef\x07\xce\xdb\x24\xb7\xdd\x71\x5c\x63"
-    "\xc9\x33\xfe\xde\x40\x52\xeb\x02\x55\x58\x0c\x35\x4f\x7c\xee\x37\x78\x48"
-    "\x48\x33\xa5\x3f\xfe\x15\x24\x0f\x41\x6e\x0e\x87\x31\x2b\x81\x11\x8b\x3c"
-    "\x9d\x05\x8a\x29\x22\x00\xaa\xd8\x83\x1d\xef\x62\xec\x6e\xe4\x94\x83\xcf"
-    "\xd7\x68\xaf\xd3\xa8\xed\xd8\xfe\xd8\xc3\x8f\x48\xfc\x8c\x0d\xe7\x89\x6f"
-    "\xe2\xbf\xfb\x0d\xc5\x4a\x05\x34\x92\x18\x7a\x93\xa0\xe8\x42\x86\x22\xa9"
-    "\xe9\x80\x37\x47\x02\x55\x60\x76\xab\xde\x2b\xf5\xa2\x2c\xaa\x0c\x99\x81"
-    "\xee\x72\x2c\x7d\x22\x59\x2a\x35\xea\x50\x4e\x47\x6b\x92\x2d\x30\xa1\x01"
-    "\xa5\x9e\x26\x6e\x27\xca\xf5\xf2\x87\x5d\x31\xaf\xe9\x32\xcd\x10\xfd\x4d"
-    "\xdb\xf9\x86\x05\x12\x1b\x01\x84\x55\x97\x5f\xe2\x78\x27\xd9\xe4\x26\x7d"
-    "\xab\x0e\xe0\x1b\x6f\xcb\x4b\x14\xdd\xdc\xdc\x8b\xe8\x9f\xd0\x62\x96\xca"
-    "\xcf";
-
-static const uint8_t kThreePrimeEncryptedMessage[] = {
-    0x58, 0xd9, 0xea, 0x8a, 0xf6, 0x3d, 0xb4, 0xd9, 0xf7, 0xbb, 0x02, 0xc5,
-    0x58, 0xd2, 0xa9, 0x46, 0x80, 0x70, 0x70, 0x16, 0x07, 0x64, 0x32, 0x4c,
-    0x4e, 0x92, 0x61, 0xb7, 0xff, 0x92, 0xdc, 0xfc, 0xf8, 0xf0, 0x2c, 0x84,
-    0x56, 0xbc, 0xe5, 0x93, 0x76, 0xe5, 0xa3, 0x72, 0x98, 0xf2, 0xdf, 0xef,
-    0x99, 0x53, 0xf6, 0xd8, 0x4b, 0x09, 0xac, 0xa9, 0xa3, 0xdb, 0x63, 0xa1,
-    0xb5, 0x09, 0x8e, 0x40, 0x84, 0x8f, 0x4d, 0xd5, 0x1d, 0xac, 0x6c, 0xaa,
-    0x6b, 0x15, 0xe7, 0xb1, 0x0c, 0x67, 0xd2, 0xb2, 0x81, 0x58, 0x30, 0x0e,
-    0x18, 0x27, 0xa1, 0x9b, 0x96, 0xad, 0xae, 0x76, 0x1a, 0x32, 0xf7, 0x10,
-    0x0b, 0x53, 0x85, 0x31, 0xd6, 0x2a, 0xf6, 0x1c, 0x9f, 0xc2, 0xc7, 0xb1,
-    0x05, 0x63, 0x0b, 0xa5, 0x07, 0x1f, 0x1c, 0x01, 0xf0, 0xe0, 0x06, 0xea,
-    0x20, 0x69, 0x41, 0x19, 0x57, 0x92, 0x17, 0xf7, 0x0c, 0x5c, 0x66, 0x75,
-    0x0e, 0xe5, 0xb3, 0xf1, 0x67, 0x3b, 0x27, 0x47, 0xb2, 0x8e, 0x1c, 0xb6,
-    0x3f, 0xdd, 0x76, 0x42, 0x31, 0x13, 0x68, 0x96, 0xdf, 0x3b, 0xd4, 0x87,
-    0xd9, 0x16, 0x44, 0x71, 0x52, 0x2e, 0x54, 0x3e, 0x09, 0xcd, 0x71, 0xc1,
-    0x1e, 0x5e, 0x96, 0x13, 0xc9, 0x1e, 0xa4, 0xe6, 0xe6, 0x97, 0x2c, 0x6b,
-    0xf2, 0xa9, 0x5c, 0xc6, 0x60, 0x2a, 0xbc, 0x82, 0xf8, 0xcb, 0xd4, 0xd7,
-    0xea, 0x8a, 0xa1, 0x8a, 0xd9, 0xa5, 0x14, 0x8b, 0x9e, 0xf9, 0x25, 0x02,
-    0xd2, 0xab, 0x0c, 0x42, 0xca, 0x2d, 0x45, 0xa3, 0x56, 0x5e, 0xa2, 0x2a,
-    0xc8, 0x60, 0xa5, 0x87, 0x5d, 0x85, 0x5c, 0xde, 0xc7, 0xa2, 0x47, 0xc3,
-    0x99, 0x29, 0x23, 0x79, 0x36, 0x88, 0xad, 0x40, 0x3e, 0x27, 0x7d, 0xf0,
-    0xb6, 0xfa, 0x95, 0x20, 0x3c, 0xec, 0xfc, 0x56, 0x3b, 0x20, 0x91, 0xee,
-    0x98, 0x10, 0x2c, 0x82,
-};
-
-static const uint8_t kSixPrimeKey[] =
-    "\x30\x82\x05\x20\x02\x01\x01\x02\x82\x01\x00\x1c\x04\x39\x44\xb9\xb8\x71"
-    "\x1c\x1c\xf7\xdc\x11\x1b\x85\x3b\x2b\xe8\xa6\xeb\xeb\xe9\xb6\x86\x97\x73"
-    "\x5d\x75\x46\xd1\x35\x25\xf8\x30\x9a\xc3\x57\x44\x89\xa6\x44\x59\xe3\x3a"
-    "\x60\xb5\x33\x84\x72\xa4\x03\xc5\x1a\x20\x98\x70\xbd\xe8\x3b\xc1\x9b\x8a"
-    "\x3a\x24\x45\xb6\x6a\x73\xb4\xd0\x6c\x18\xc6\xa7\x94\xd3\x24\x70\xf0\x2d"
-    "\x0c\xa5\xb2\x3b\xc5\x33\x90\x9d\x56\x8d\x33\xf6\x93\x7d\xa7\x95\x88\x05"
-    "\xdf\xf5\x65\x58\xb9\x5b\xd3\x07\x9c\x16\x8e\x74\xfc\xb8\x76\xaf\x62\x99"
-    "\x6c\xd4\xc5\xb3\x69\xe5\x64\xdf\x38\x00\x25\x24\xe9\xb1\x4a\x85\xa6\xf4"
-    "\xb6\x23\x68\x67\x4a\x2c\xbd\x9d\x01\x3b\x04\x8c\x70\x94\x82\x76\x45\x0c"
-    "\x8b\x95\x8a\x07\x1c\x32\xe7\x09\x97\x3a\xfd\xca\x57\xe9\x57\x0c\xae\x2b"
-    "\xa3\x25\xd1\xf2\x0d\x34\xa1\xe6\x2f\x7b\x1b\x36\x53\x83\x95\xb9\x26\x6e"
-    "\x4f\x36\x26\xf8\x47\xae\xdf\xe8\x4d\xf6\xb2\xff\x03\x23\x74\xfa\xa5\x6d"
-    "\xcb\xcb\x80\x12\xc3\x77\xf0\x19\xb7\xf2\x6b\x19\x5c\xde\x0a\xd7\xee\x8c"
-    "\x48\x2f\x50\x24\xa5\x2e\xcc\x2a\xed\xc2\x35\xe0\x3d\x29\x31\x17\xd6\x8f"
-    "\x44\xaa\x5b\x33\xbd\xb4\x88\x87\xd9\x29\x3f\x94\xe7\x75\xe3\x02\x01\x03"
-    "\x02\x82\x01\x00\x12\xad\x7b\x83\x26\x7a\xf6\x12\xbd\xfa\x92\xb6\x12\x58"
-    "\xd2\x1d\x45\xc4\x9d\x47\xf1\x24\x59\xba\x4c\xe8\xf8\xd9\xe0\xce\x19\x50"
-    "\x20\x67\x2c\xe4\xd8\x5b\xc4\x2d\x91\x41\xeb\x05\x4f\xf4\xb4\x20\xc7\xbc"
-    "\xd6\xe2\x5c\xa0\x27\xcf\xb8\xb3\x3b\x5c\xeb\x5e\x96\xb7\x99\x4b\x8a\xc3"
-    "\x70\xaf\x7f\xd8\x5f\xeb\xcb\x1a\x79\x44\x68\x97\x84\xd8\x29\x87\x64\xba"
-    "\x18\x2e\x95\x66\x1a\x7d\xd9\x35\x3a\x5c\x92\x7a\x81\x1b\x6c\xa9\xf8\xfa"
-    "\x05\x23\x18\x5b\xb2\xf8\x77\x1c\xc5\x1b\x7d\x26\x5f\x48\x69\x1b\xc4\x34"
-    "\xef\x6e\xa1\x15\xd2\xb2\xac\xb8\xa8\xed\x1e\xee\xdc\xb5\xb9\x5c\x79\x25"
-    "\x48\xbb\xe5\x9d\xd8\xe5\xe2\x94\xdf\xd5\x32\x22\x84\xbf\xc2\xaa\xa4\x54"
-    "\xbb\x29\xdb\x13\x4a\x28\x3d\x83\x3a\xff\xa3\xae\x38\x08\xfc\x36\x84\x91"
-    "\x30\xd1\xfd\x82\x64\xf1\x0f\xae\xba\xd7\x9a\x43\x58\x03\x5e\x5f\x01\xcb"
-    "\x8b\x90\x8d\x77\x34\x6f\x37\x40\xb6\x6d\x22\x23\x90\xb2\xfd\x32\xb5\x96"
-    "\x45\xbf\xae\x8c\xc4\x62\x03\x6c\x68\x90\x59\x31\x1a\xcb\xfb\xa4\x0b\x94"
-    "\x15\x13\xda\x1a\x8d\xa7\x0b\x34\x62\x93\xea\xbe\x6e\x71\xc2\x1d\xc8\x9d"
-    "\xac\x66\xcc\x31\x87\xff\x99\xab\x02\x2c\x00\xa5\x57\x41\x66\x87\x68\x02"
-    "\x6a\xdf\x97\xb0\xfe\x6b\x34\xc4\x33\x88\x2b\xce\x82\xaf\x2d\x33\x5a\xad"
-    "\x75\x2d\xac\xa5\xd6\x3a\x2d\x65\x43\x68\xfb\x44\x9e\xb8\x25\x05\xed\x97"
-    "\x02\x2c\x00\xd2\x77\x34\x24\xac\x60\x9a\xc4\x68\x34\xe5\x6a\xa3\xdc\xe2"
-    "\xb0\x58\x5c\x35\x83\x5a\xc7\xa7\xc1\x0b\x7e\x9e\xa5\x85\x32\x47\x93\x22"
-    "\xee\xb6\x59\xe9\xe3\x61\x94\xd0\x0e\xcb\x02\x2b\x6e\x3a\x2b\x99\xaf\x9a"
-    "\xac\x47\x3f\xba\x75\xfe\xf2\x23\x2d\x77\xb0\x1d\x34\x57\x1f\x73\x77\x91"
-    "\xc8\xf8\xc9\x1d\xc3\xe4\x26\xc8\xee\x2c\xf0\xa7\x83\x14\x7a\xc3\x59\x49"
-    "\x0f\x02\x2c\x00\x8c\x4f\x78\x18\x72\xeb\x11\xd8\x45\x78\x98\xf1\xc2\x93"
-    "\x41\xca\xe5\x92\xce\x57\x91\xda\x6f\xd6\x07\xa9\xbf\x19\x03\x76\xda\x62"
-    "\x17\x49\xce\xe6\x9b\xec\xeb\xb8\x8a\xb4\x87\x02\x2c\x00\xa3\xc2\x29\xa6"
-    "\xa7\xe1\x3c\xe9\xcf\x0f\x50\x51\x1c\xcc\xc8\x5b\x08\x9c\x97\x24\x3a\x86"
-    "\x23\xa8\x0b\xbb\x54\xa6\xb9\x70\x3d\x1d\xd0\x1b\xa3\xac\xd9\xb2\x03\x80"
-    "\xd7\x67\xec\x30\x82\x02\x29\x30\x81\x88\x02\x2c\x00\x97\x5d\x3b\xf2\xcc"
-    "\xba\xd9\x77\x67\xaa\xd2\x22\xa7\xa3\x49\x08\xc7\xb8\x27\xa1\x59\x4b\xa7"
-    "\xa5\xd2\x74\x05\xe7\x5a\x35\xd7\x25\x79\x18\x20\x8a\x25\xec\x3b\x52\xaf"
-    "\xcb\xdb\x02\x2b\x64\xe8\xd2\xa1\xdd\xd1\xe6\x4f\x9a\x71\xe1\x6c\x6f\xc2"
-    "\x30\xb0\x85\x25\x6f\xc0\xe6\x32\x6f\xc3\xe1\xa2\xae\x9a\x3c\x23\xe4\xc3"
-    "\xa6\x10\x15\xb1\x6e\x9d\x7c\xe1\xca\x87\xe7\x02\x2b\x5e\xef\x25\x29\xed"
-    "\xf6\x52\x15\xd3\x60\xb6\x88\xcf\x0f\xe2\x24\xa4\x04\x97\x9c\x9d\x58\x13"
-    "\xbb\x00\x6d\x39\xf6\xad\x21\x7e\x56\x2c\x2e\x06\x06\xc4\x6d\x44\xac\x79"
-    "\x1f\xe5\x30\x81\x89\x02\x2c\x00\xdb\xf1\x78\xf9\xa4\x94\xea\x39\x8a\x3f"
-    "\x23\x48\x2a\x23\x8f\xd2\x18\x97\xd2\xdf\x0f\xb8\x2b\x33\xa0\xe8\x8f\xbc"
-    "\x4e\x42\xfd\x54\xc7\x0f\xde\xba\x6d\xba\x96\xa7\xce\x67\x3d\x02\x2c\x00"
-    "\x92\xa0\xfb\x51\x18\x63\x46\xd1\x06\xd4\xc2\x30\x1c\x17\xb5\x36\xbb\x0f"
-    "\xe1\xea\x0a\x7a\xc7\x77\xc0\x9b\x0a\x7d\x89\x81\xfe\x38\x84\xb5\x3f\x26"
-    "\xf3\xd1\xb9\xc5\x34\x44\xd3\x02\x2b\x4c\xbd\x1d\x44\xc8\x19\x23\xd8\xb3"
-    "\x96\x66\x4b\x62\xcb\x3e\xe6\x6c\x11\xdf\xb2\x92\xd3\xc8\x34\xb9\xa6\x5a"
-    "\x2f\x19\xf4\x0b\xb2\xe6\x8e\xa6\xaf\xa3\xae\xa4\xb3\x92\xc4\x79\x30\x81"
-    "\x85\x02\x2b\x00\x89\xab\x30\xfc\x7b\x37\x94\x11\x9f\x4d\x31\x3b\xac\x09"
-    "\x57\xe6\x64\xec\xa0\xc8\xf8\x04\x1a\xf9\x2a\xa4\x4b\x36\x18\xbb\x5f\xdc"
-    "\xcd\xf0\xc8\xcb\x97\xd1\xdf\x13\x12\x3f\x02\x2a\x5b\xc7\x75\xfd\xa7\x7a"
-    "\x62\xb6\x6a\x33\x76\x27\xc8\x06\x3a\x99\x98\x9d\xc0\x85\xfa\xad\x67\x50"
-    "\xc7\x18\x32\x24\x10\x7c\xea\x93\x33\xf5\xdb\x32\x65\x36\x94\xb7\x61\x7f"
-    "\x02\x2a\x16\x6c\x96\xa1\x50\x6f\x3a\x92\xc0\x75\x43\xb5\x6b\x9c\x17\x09"
-    "\xd3\xf0\x67\x69\x45\x92\xfb\x7b\x50\xa8\x42\x9b\x33\x92\xab\xd5\xe6\x49"
-    "\xb3\x26\x99\x55\x16\x3a\x39\x63\x30\x81\x87\x02\x2b\x00\xc1\x25\x19\x1d"
-    "\x6e\x18\xcb\x2d\x64\xe2\xe6\xb6\x1c\xe4\xaa\x9c\xb9\xee\x18\xd4\xf7\x5f"
-    "\x66\x40\xf0\xe1\x31\x38\xf2\x53\x00\x8b\xcc\xe4\x0d\xb7\x81\xb4\xe6\x1c"
-    "\x19\xaf\x02\x2b\x00\x80\xc3\x66\x13\x9e\xbb\x32\x1e\x43\x41\xef\x24\x13"
-    "\x43\x1c\x68\x7b\xf4\x10\x8d\xfa\x3f\x99\x80\xa0\x96\x20\xd0\xa1\x8c\xab"
-    "\x07\xdd\xed\x5e\x7a\x56\x78\x99\x68\x11\x1f\x02\x2b\x00\xb0\x59\xea\x67"
-    "\x93\x42\xbf\x07\x54\x38\x41\xcb\x73\xa4\x0e\xc2\xae\x56\x19\x41\xc9\x8a"
-    "\xb2\x2f\xa8\x0a\xb1\x4e\x12\x39\x2e\xc0\x94\x9a\xc6\xa3\xe4\xaf\x8a\x16"
-    "\x06\xb8";
-
-static const uint8_t kSixPrimeEncryptedMessage[] = {
-    0x0a, 0xcb, 0x6c, 0x02, 0x9d, 0x1a, 0x7c, 0xf3, 0x4e, 0xff, 0x16, 0x88,
-    0xee, 0x22, 0x1d, 0x8d, 0xd2, 0xfd, 0xde, 0x83, 0xb3, 0xd9, 0x35, 0x2c,
-    0x82, 0xe0, 0xff, 0xe6, 0x79, 0x6d, 0x06, 0x21, 0x74, 0xa8, 0x04, 0x0c,
-    0xe2, 0xd3, 0x98, 0x3f, 0xbf, 0xd0, 0xe9, 0x88, 0x24, 0xe2, 0x05, 0xa4,
-    0x45, 0x51, 0x87, 0x6b, 0x1c, 0xef, 0x5f, 0x2d, 0x61, 0xb6, 0xf1, 0x4c,
-    0x1f, 0x3d, 0xbf, 0x4b, 0xf2, 0xda, 0x09, 0x97, 0x81, 0xde, 0x91, 0xb7,
-    0x0d, 0xb4, 0xc2, 0xab, 0x41, 0x64, 0x9d, 0xd9, 0x39, 0x46, 0x79, 0x66,
-    0x43, 0xf1, 0x34, 0x21, 0x56, 0x2f, 0xc6, 0x68, 0x40, 0x4a, 0x2d, 0x73,
-    0x96, 0x50, 0xe1, 0xb0, 0xaf, 0x49, 0x39, 0xb4, 0xf0, 0x3a, 0x78, 0x38,
-    0x70, 0xa9, 0x91, 0x5d, 0x5e, 0x07, 0xf4, 0xec, 0xbb, 0xc4, 0xe5, 0x8a,
-    0xb8, 0x06, 0xba, 0xdf, 0xc6, 0x48, 0x78, 0x4b, 0xca, 0x2a, 0x8a, 0x92,
-    0x64, 0xe3, 0xa6, 0xae, 0x87, 0x97, 0x12, 0x16, 0x46, 0x67, 0x59, 0xdf,
-    0xf2, 0xf3, 0x89, 0x6f, 0xe8, 0xa9, 0x13, 0x57, 0x63, 0x4e, 0x07, 0x98,
-    0xcc, 0x73, 0xa0, 0x84, 0x9d, 0xe8, 0xb3, 0x50, 0x59, 0xb5, 0x51, 0xb3,
-    0x41, 0x7d, 0x55, 0xfe, 0xd9, 0xf0, 0xc6, 0xff, 0x6e, 0x96, 0x4f, 0x22,
-    0xb2, 0x0d, 0x6b, 0xc9, 0x83, 0x2d, 0x98, 0x98, 0xb2, 0xd1, 0xb7, 0xe4,
-    0x50, 0x83, 0x1a, 0xa9, 0x02, 0x9f, 0xaf, 0x54, 0x74, 0x2a, 0x2c, 0x63,
-    0x10, 0x79, 0x45, 0x5c, 0x95, 0x0d, 0xa1, 0x9b, 0x55, 0xf3, 0x1e, 0xb7,
-    0x56, 0x59, 0xf1, 0x59, 0x8d, 0xd6, 0x15, 0x89, 0xf6, 0xfe, 0xc0, 0x00,
-    0xdd, 0x1f, 0x2b, 0xf0, 0xf7, 0x5d, 0x64, 0x84, 0x76, 0xd3, 0xc2, 0x92,
-    0x35, 0xac, 0xb5, 0xf9, 0xf6, 0xa8, 0x05, 0x89, 0x4c, 0x95, 0x41, 0x4e,
-    0x34, 0x25, 0x11, 0x14,
-};
-
 // kEstonianRSAKey is an RSAPublicKey encoded with a negative modulus. See
 // https://crbug.com/532048.
 static const uint8_t kEstonianRSAKey[] = {
@@ -607,65 +458,32 @@
 
 INSTANTIATE_TEST_CASE_P(, RSAEncryptTest, testing::ValuesIn(kRSAEncryptParams));
 
-struct RSAMultiPrimeParam {
-  const uint8_t *der;
-  size_t der_size;
-  const uint8_t *enc;
-  size_t enc_size;
-} kRSAMultiPrimeParams[] = {
-    {kTwoPrimeKey, sizeof(kTwoPrimeKey) - 1, kTwoPrimeEncryptedMessage,
-     sizeof(kTwoPrimeEncryptedMessage)},
-    {kThreePrimeKey, sizeof(kThreePrimeKey) - 1, kThreePrimeEncryptedMessage,
-     sizeof(kThreePrimeEncryptedMessage)},
-    {kSixPrimeKey, sizeof(kSixPrimeKey) - 1, kSixPrimeEncryptedMessage,
-     sizeof(kSixPrimeEncryptedMessage)},
-};
-
-class RSAMultiPrimeTest : public testing::TestWithParam<RSAMultiPrimeParam> {};
-
-TEST_P(RSAMultiPrimeTest, TestDecrypt) {
-  const auto &param = GetParam();
+TEST(RSATest, TestDecrypt) {
   bssl::UniquePtr<RSA> rsa(
-      RSA_private_key_from_bytes(param.der, param.der_size));
+      RSA_private_key_from_bytes(kTwoPrimeKey, sizeof(kTwoPrimeKey) - 1));
   ASSERT_TRUE(rsa);
 
   EXPECT_TRUE(RSA_check_key(rsa.get()));
 
   uint8_t out[256];
   size_t out_len;
-  ASSERT_TRUE(RSA_decrypt(rsa.get(), &out_len, out, sizeof(out), param.enc,
-                          param.enc_size, RSA_PKCS1_PADDING));
+  ASSERT_TRUE(RSA_decrypt(
+      rsa.get(), &out_len, out, sizeof(out), kTwoPrimeEncryptedMessage,
+      sizeof(kTwoPrimeEncryptedMessage), RSA_PKCS1_PADDING));
   EXPECT_EQ(Bytes("hello world"), Bytes(out, out_len));
 }
 
-INSTANTIATE_TEST_CASE_P(, RSAMultiPrimeTest,
-                        testing::ValuesIn(kRSAMultiPrimeParams));
-
-TEST(RSATest, MultiPrimeKeygen) {
-  bssl::UniquePtr<RSA> rsa(RSA_new());
-  bssl::UniquePtr<BIGNUM> e(BN_new());
+TEST(RSATest, CheckFIPS) {
+  bssl::UniquePtr<RSA> rsa(
+      RSA_private_key_from_bytes(kFIPSKey, sizeof(kFIPSKey) - 1));
   ASSERT_TRUE(rsa);
-  ASSERT_TRUE(e);
-  ASSERT_TRUE(BN_set_word(e.get(), RSA_F4));
+  EXPECT_TRUE(RSA_check_fips(rsa.get()));
 
-  // Test key generation.
-  static const size_t kBits = 1024;
-  ASSERT_TRUE(
-      RSA_generate_multi_prime_key(rsa.get(), kBits, 3, e.get(), nullptr));
-  ASSERT_TRUE(RSA_check_key(rsa.get()));
-
-  // Test the key round-trips.
-  static const char kMessage[] = "Hello world.";
-  uint8_t encrypted[kBits / 8], decrypted[kBits / 8];
-  size_t encrypted_len, decrypted_len;
-  ASSERT_TRUE(RSA_encrypt(rsa.get(), &encrypted_len, encrypted,
-                          sizeof(encrypted), (const uint8_t *)kMessage,
-                          sizeof(kMessage), RSA_PKCS1_PADDING));
-  ASSERT_TRUE(RSA_decrypt(rsa.get(), &decrypted_len, decrypted,
-                          sizeof(decrypted), encrypted, encrypted_len,
-                          RSA_PKCS1_PADDING));
-  EXPECT_EQ(Bytes((const uint8_t *)kMessage, sizeof(kMessage)),
-            Bytes(decrypted, decrypted_len));
+  // Check that RSA_check_fips works on a public key.
+  bssl::UniquePtr<RSA> pub(
+      RSA_public_key_from_bytes(kFIPSPublicKey, sizeof(kFIPSPublicKey) - 1));
+  ASSERT_TRUE(pub);
+  EXPECT_TRUE(RSA_check_fips(pub.get()));
 }
 
 TEST(RSATest, BadKey) {
@@ -681,6 +499,7 @@
 
   // Bad keys are detected.
   EXPECT_FALSE(RSA_check_key(key.get()));
+  EXPECT_FALSE(RSA_check_fips(key.get()));
 
   // Bad keys may not be parsed.
   uint8_t *der;
@@ -831,3 +650,176 @@
   EXPECT_FALSE(rsa);
   ERR_clear_error();
 }
+
+// Attempting to generate an excessively small key should fail.
+TEST(RSATest, GenerateSmallKey) {
+  bssl::UniquePtr<RSA> rsa(RSA_new());
+  ASSERT_TRUE(rsa);
+  bssl::UniquePtr<BIGNUM> e(BN_new());
+  ASSERT_TRUE(e);
+  ASSERT_TRUE(BN_set_word(e.get(), RSA_F4));
+
+  EXPECT_FALSE(RSA_generate_key_ex(rsa.get(), 255, e.get(), nullptr));
+  uint32_t err = ERR_get_error();
+  EXPECT_EQ(ERR_LIB_RSA, ERR_GET_LIB(err));
+  EXPECT_EQ(RSA_R_KEY_SIZE_TOO_SMALL, ERR_GET_REASON(err));
+}
+
+// Attempting to generate an funny RSA key length should round down.
+TEST(RSATest, RoundKeyLengths) {
+  bssl::UniquePtr<BIGNUM> e(BN_new());
+  ASSERT_TRUE(e);
+  ASSERT_TRUE(BN_set_word(e.get(), RSA_F4));
+
+  bssl::UniquePtr<RSA> rsa(RSA_new());
+  ASSERT_TRUE(rsa);
+  EXPECT_TRUE(RSA_generate_key_ex(rsa.get(), 1025, e.get(), nullptr));
+  EXPECT_EQ(1024u, BN_num_bits(rsa->n));
+
+  rsa.reset(RSA_new());
+  ASSERT_TRUE(rsa);
+  EXPECT_TRUE(RSA_generate_key_ex(rsa.get(), 1027, e.get(), nullptr));
+  EXPECT_EQ(1024u, BN_num_bits(rsa->n));
+
+  rsa.reset(RSA_new());
+  ASSERT_TRUE(rsa);
+  EXPECT_TRUE(RSA_generate_key_ex(rsa.get(), 1151, e.get(), nullptr));
+  EXPECT_EQ(1024u, BN_num_bits(rsa->n));
+
+  rsa.reset(RSA_new());
+  ASSERT_TRUE(rsa);
+  EXPECT_TRUE(RSA_generate_key_ex(rsa.get(), 1152, e.get(), nullptr));
+  EXPECT_EQ(1152u, BN_num_bits(rsa->n));
+}
+
+#if !defined(BORINGSSL_SHARED_LIBRARY)
+TEST(RSATest, SqrtTwo) {
+  bssl::UniquePtr<BIGNUM> sqrt(BN_new()), pow2(BN_new());
+  bssl::UniquePtr<BN_CTX> ctx(BN_CTX_new());
+  ASSERT_TRUE(sqrt);
+  ASSERT_TRUE(pow2);
+  ASSERT_TRUE(ctx);
+
+  size_t bits = kBoringSSLRSASqrtTwoLen * BN_BITS2;
+  ASSERT_TRUE(BN_one(pow2.get()));
+  ASSERT_TRUE(BN_lshift(pow2.get(), pow2.get(), 2 * bits - 1));
+
+  // Check that sqrt² < pow2.
+  ASSERT_TRUE(
+      bn_set_words(sqrt.get(), kBoringSSLRSASqrtTwo, kBoringSSLRSASqrtTwoLen));
+  ASSERT_TRUE(BN_sqr(sqrt.get(), sqrt.get(), ctx.get()));
+  EXPECT_LT(BN_cmp(sqrt.get(), pow2.get()), 0);
+
+  // Check that pow2 < (sqrt + 1)².
+  ASSERT_TRUE(
+      bn_set_words(sqrt.get(), kBoringSSLRSASqrtTwo, kBoringSSLRSASqrtTwoLen));
+  ASSERT_TRUE(BN_add_word(sqrt.get(), 1));
+  ASSERT_TRUE(BN_sqr(sqrt.get(), sqrt.get(), ctx.get()));
+  EXPECT_LT(BN_cmp(pow2.get(), sqrt.get()), 0);
+
+  // Check the kBoringSSLRSASqrtTwo is sized for a 3072-bit RSA key.
+  EXPECT_EQ(3072u / 2u, bits);
+}
+
+TEST(RSATest, LessThanWords) {
+  // kTestVectors is an array of 256-bit values in sorted order.
+  static const BN_ULONG kTestVectors[][256 / BN_BITS2] = {
+      {TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000),
+       TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000)},
+      {TOBN(0x00000000, 0x00000001), TOBN(0x00000000, 0x00000000),
+       TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000)},
+      {TOBN(0xffffffff, 0xffffffff), TOBN(0x00000000, 0x00000000),
+       TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000)},
+      {TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff),
+       TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000)},
+      {TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff),
+       TOBN(0xffffffff, 0xffffffff), TOBN(0x00000000, 0x00000000)},
+      {TOBN(0x00000000, 0x00000000), TOBN(0x1d6f60ba, 0x893ba84c),
+       TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484)},
+      {TOBN(0x00000000, 0x83339915), TOBN(0x1d6f60ba, 0x893ba84c),
+       TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484)},
+      {TOBN(0xed17ac85, 0x00000000), TOBN(0x1d6f60ba, 0x893ba84c),
+       TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484)},
+      {TOBN(0xed17ac85, 0x83339915), TOBN(0x1d6f60ba, 0x893ba84c),
+       TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484)},
+      {TOBN(0xed17ac85, 0xffffffff), TOBN(0x1d6f60ba, 0x893ba84c),
+       TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484)},
+      {TOBN(0xffffffff, 0x83339915), TOBN(0x1d6f60ba, 0x893ba84c),
+       TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484)},
+      {TOBN(0xffffffff, 0xffffffff), TOBN(0x1d6f60ba, 0x893ba84c),
+       TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484)},
+      {TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000),
+       TOBN(0x00000000, 0x00000000), TOBN(0xffffffff, 0xffffffff)},
+      {TOBN(0x00000000, 0x00000000), TOBN(0x00000000, 0x00000000),
+       TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff)},
+      {TOBN(0x00000000, 0x00000001), TOBN(0x00000000, 0x00000000),
+       TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff)},
+      {TOBN(0x00000000, 0x00000000), TOBN(0xffffffff, 0xffffffff),
+       TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff)},
+      {TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff),
+       TOBN(0xffffffff, 0xffffffff), TOBN(0xffffffff, 0xffffffff)},
+  };
+
+  for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kTestVectors); i++) {
+    SCOPED_TRACE(i);
+    for (size_t j = 0; j < OPENSSL_ARRAY_SIZE(kTestVectors); j++) {
+      SCOPED_TRACE(j);
+      EXPECT_EQ(i < j ? 1 : 0,
+                rsa_less_than_words(kTestVectors[i], kTestVectors[j],
+                                    OPENSSL_ARRAY_SIZE(kTestVectors[i])));
+    }
+  }
+
+  EXPECT_EQ(0, rsa_less_than_words(NULL, NULL, 0));
+}
+
+TEST(RSATest, GreaterThanPow2) {
+  bssl::UniquePtr<BIGNUM> b(BN_new());
+  BN_zero(b.get());
+  EXPECT_FALSE(rsa_greater_than_pow2(b.get(), 0));
+  EXPECT_FALSE(rsa_greater_than_pow2(b.get(), 1));
+  EXPECT_FALSE(rsa_greater_than_pow2(b.get(), 20));
+
+  ASSERT_TRUE(BN_set_word(b.get(), 1));
+  EXPECT_FALSE(rsa_greater_than_pow2(b.get(), 0));
+  EXPECT_FALSE(rsa_greater_than_pow2(b.get(), 1));
+  EXPECT_FALSE(rsa_greater_than_pow2(b.get(), 20));
+
+  ASSERT_TRUE(BN_set_word(b.get(), 2));
+  EXPECT_TRUE(rsa_greater_than_pow2(b.get(), 0));
+  EXPECT_FALSE(rsa_greater_than_pow2(b.get(), 1));
+  EXPECT_FALSE(rsa_greater_than_pow2(b.get(), 20));
+
+  ASSERT_TRUE(BN_set_word(b.get(), 3));
+  EXPECT_TRUE(rsa_greater_than_pow2(b.get(), 0));
+  EXPECT_TRUE(rsa_greater_than_pow2(b.get(), 1));
+  EXPECT_FALSE(rsa_greater_than_pow2(b.get(), 2));
+  EXPECT_FALSE(rsa_greater_than_pow2(b.get(), 20));
+
+  BN_set_negative(b.get(), 1);
+  EXPECT_FALSE(rsa_greater_than_pow2(b.get(), 0));
+  EXPECT_FALSE(rsa_greater_than_pow2(b.get(), 1));
+  EXPECT_FALSE(rsa_greater_than_pow2(b.get(), 2));
+  EXPECT_FALSE(rsa_greater_than_pow2(b.get(), 20));
+
+  // Check all bit lengths mod 64.
+  for (int n = 1024; n < 1024 + 64; n++) {
+    SCOPED_TRACE(n);
+    ASSERT_TRUE(BN_set_word(b.get(), 1));
+    ASSERT_TRUE(BN_lshift(b.get(), b.get(), n));
+    EXPECT_TRUE(rsa_greater_than_pow2(b.get(), n - 1));
+    EXPECT_FALSE(rsa_greater_than_pow2(b.get(), n));
+    EXPECT_FALSE(rsa_greater_than_pow2(b.get(), n + 1));
+
+    ASSERT_TRUE(BN_sub_word(b.get(), 1));
+    EXPECT_TRUE(rsa_greater_than_pow2(b.get(), n - 1));
+    EXPECT_FALSE(rsa_greater_than_pow2(b.get(), n));
+    EXPECT_FALSE(rsa_greater_than_pow2(b.get(), n + 1));
+
+    ASSERT_TRUE(BN_add_word(b.get(), 2));
+    EXPECT_TRUE(rsa_greater_than_pow2(b.get(), n - 1));
+    EXPECT_TRUE(rsa_greater_than_pow2(b.get(), n));
+    EXPECT_FALSE(rsa_greater_than_pow2(b.get(), n + 1));
+  }
+}
+#endif  // !BORINGSSL_SHARED_LIBRARY
diff --git a/src/crypto/sha/CMakeLists.txt b/src/crypto/sha/CMakeLists.txt
deleted file mode 100644
index 64c77db..0000000
--- a/src/crypto/sha/CMakeLists.txt
+++ /dev/null
@@ -1,67 +0,0 @@
-include_directories(../../include)
-
-if (${ARCH} STREQUAL "x86_64")
-  set(
-    SHA_ARCH_SOURCES
-
-    sha1-x86_64.${ASM_EXT}
-    sha256-x86_64.${ASM_EXT}
-    sha512-x86_64.${ASM_EXT}
-  )
-endif()
-
-if (${ARCH} STREQUAL "x86")
-  set(
-    SHA_ARCH_SOURCES
-
-    sha1-586.${ASM_EXT}
-    sha256-586.${ASM_EXT}
-    sha512-586.${ASM_EXT}
-  )
-endif()
-
-if (${ARCH} STREQUAL "arm")
-  set(
-    SHA_ARCH_SOURCES
-
-    sha1-armv4-large.${ASM_EXT}
-    sha256-armv4.${ASM_EXT}
-    sha512-armv4.${ASM_EXT}
-  )
-endif()
-
-if (${ARCH} STREQUAL "aarch64")
-  set(
-    SHA_ARCH_SOURCES
-
-    sha1-armv8.${ASM_EXT}
-    sha256-armv8.${ASM_EXT}
-    sha512-armv8.${ASM_EXT}
-  )
-endif()
-
-add_library(
-  sha
-
-  OBJECT
-
-  sha1-altivec.c
-  sha1.c
-  sha256.c
-  sha512.c
-
-  ${SHA_ARCH_SOURCES}
-)
-
-perlasm(sha1-x86_64.${ASM_EXT} asm/sha1-x86_64.pl)
-perlasm(sha256-x86_64.${ASM_EXT} asm/sha512-x86_64.pl)
-perlasm(sha512-x86_64.${ASM_EXT} asm/sha512-x86_64.pl)
-perlasm(sha1-586.${ASM_EXT} asm/sha1-586.pl)
-perlasm(sha256-586.${ASM_EXT} asm/sha256-586.pl)
-perlasm(sha512-586.${ASM_EXT} asm/sha512-586.pl)
-perlasm(sha1-armv4-large.${ASM_EXT} asm/sha1-armv4-large.pl)
-perlasm(sha256-armv4.${ASM_EXT} asm/sha256-armv4.pl)
-perlasm(sha512-armv4.${ASM_EXT} asm/sha512-armv4.pl)
-perlasm(sha1-armv8.${ASM_EXT} asm/sha1-armv8.pl)
-perlasm(sha256-armv8.${ASM_EXT} asm/sha512-armv8.pl)
-perlasm(sha512-armv8.${ASM_EXT} asm/sha512-armv8.pl)
diff --git a/src/crypto/test/test_util.h b/src/crypto/test/test_util.h
index bce34d4..e03bff4 100644
--- a/src/crypto/test/test_util.h
+++ b/src/crypto/test/test_util.h
@@ -21,6 +21,7 @@
 #include <string.h>
 
 #include <iosfwd>
+#include <string>
 
 #include "../internal.h"
 
@@ -37,11 +38,13 @@
   Bytes(const char *data_arg, size_t len_arg)
       : data(reinterpret_cast<const uint8_t *>(data_arg)), len(len_arg) {}
 
-  Bytes(const char *str)
+  explicit Bytes(const char *str)
       : data(reinterpret_cast<const uint8_t *>(str)), len(strlen(str)) {}
+  explicit Bytes(const std::string &str)
+      : data(reinterpret_cast<const uint8_t *>(str.data())), len(str.size()) {}
 
   template <size_t N>
-  Bytes(const uint8_t (&array)[N]) : data(array), len(N) {}
+  explicit Bytes(const uint8_t (&array)[N]) : data(array), len(N) {}
 
   const uint8_t *data;
   size_t len;
diff --git a/src/crypto/thread_test.c b/src/crypto/thread_test.c
index c702ace..714bef7 100644
--- a/src/crypto/thread_test.c
+++ b/src/crypto/thread_test.c
@@ -14,6 +14,8 @@
 
 #include "internal.h"
 
+#include <openssl/crypto.h>
+
 #include <stdio.h>
 
 
@@ -98,6 +100,9 @@
   CRYPTO_once(&g_test_once, once_init);
 }
 
+static CRYPTO_once_t once_init_value = CRYPTO_ONCE_INIT;
+static CRYPTO_once_t once_bss;
+
 static int test_once(void) {
   if (g_once_init_called != 0) {
     fprintf(stderr, "g_once_init_called was non-zero at start.\n");
@@ -121,6 +126,16 @@
     return 0;
   }
 
+  if (FIPS_mode()) {
+    /* Our FIPS tooling currently requires that |CRYPTO_ONCE_INIT| is all
+     * zeros, so the |CRYPTO_once_t| is placed in the bss. */
+    if (OPENSSL_memcmp((void *)&once_init_value, (void *)&once_bss,
+                       sizeof(CRYPTO_once_t)) != 0) {
+      fprintf(stderr, "CRYPTO_ONCE_INIT did not expand to all zeros.\n");
+      return 0;
+    }
+  }
+
   return 1;
 }
 
diff --git a/src/crypto/x509/a_verify.c b/src/crypto/x509/a_verify.c
index 0af4197..400cdd1 100644
--- a/src/crypto/x509/a_verify.c
+++ b/src/crypto/x509/a_verify.c
@@ -73,9 +73,8 @@
 int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a,
                      ASN1_BIT_STRING *signature, void *asn, EVP_PKEY *pkey)
 {
-    EVP_MD_CTX ctx;
     uint8_t *buf_in = NULL;
-    int ret = 0, inl;
+    int ret = 0, inl = 0;
 
     if (!pkey) {
         OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER);
@@ -87,9 +86,9 @@
         return 0;
     }
 
-    EVP_MD_CTX_init(&ctx);
-
-    if (!x509_digest_verify_init(&ctx, a, pkey)) {
+    EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(pkey, NULL);
+    if (ctx == NULL ||
+        !x509_digest_verify_init(ctx, a)) {
         goto err;
     }
 
@@ -100,28 +99,19 @@
         goto err;
     }
 
-    if (!EVP_DigestVerifyUpdate(&ctx, buf_in, inl)) {
+    if (!EVP_PKEY_verify_message(ctx, signature->data,
+                                 (size_t)signature->length, buf_in, inl)) {
+        OPENSSL_PUT_ERROR(X509, ERR_R_EVP_LIB);
+        goto err;
+    }
+
+    ret = 1;
+
+ err:
+    if (buf_in != NULL) {
         OPENSSL_cleanse(buf_in, (unsigned int)inl);
         OPENSSL_free(buf_in);
-        OPENSSL_PUT_ERROR(X509, ERR_R_EVP_LIB);
-        goto err;
     }
-
-    OPENSSL_cleanse(buf_in, (unsigned int)inl);
-    OPENSSL_free(buf_in);
-
-    if (EVP_DigestVerifyFinal(&ctx, signature->data,
-                              (size_t)signature->length) <= 0) {
-        OPENSSL_PUT_ERROR(X509, ERR_R_EVP_LIB);
-        goto err;
-    }
-    /*
-     * we don't need to zero the 'ctx' because we just checked public
-     * information
-     */
-    /* OPENSSL_memset(&ctx,0,sizeof(ctx)); */
-    ret = 1;
- err:
-    EVP_MD_CTX_cleanup(&ctx);
+    EVP_PKEY_CTX_free(ctx);
     return ret;
 }
diff --git a/src/crypto/x509/algorithm.c b/src/crypto/x509/algorithm.c
index 78ae882..6e0f3f2 100644
--- a/src/crypto/x509/algorithm.c
+++ b/src/crypto/x509/algorithm.c
@@ -101,8 +101,11 @@
   return 1;
 }
 
-int x509_digest_verify_init(EVP_MD_CTX *ctx, X509_ALGOR *sigalg,
-                            EVP_PKEY *pkey) {
+int x509_digest_verify_init(EVP_PKEY_CTX *ctx, X509_ALGOR *sigalg) {
+  if (!EVP_PKEY_verify_init(ctx)) {
+    return 0;
+  }
+
   /* Convert the signature OID into digest and public key OIDs. */
   int sigalg_nid = OBJ_obj2nid(sigalg->algorithm);
   int digest_nid, pkey_nid;
@@ -112,6 +115,7 @@
   }
 
   /* Check the public key OID matches the public key type. */
+  EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx);
   if (pkey_nid != EVP_PKEY_id(pkey)) {
     OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_PUBLIC_KEY_TYPE);
     return 0;
@@ -119,11 +123,18 @@
 
   /* NID_undef signals that there are custom parameters to set. */
   if (digest_nid == NID_undef) {
-    if (sigalg_nid != NID_rsassaPss) {
-      OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM);
-      return 0;
+    if (sigalg_nid == NID_rsassaPss) {
+      return x509_rsa_pss_to_ctx(ctx, sigalg);
     }
-    return x509_rsa_pss_to_ctx(ctx, sigalg, pkey);
+    if (sigalg_nid == NID_Ed25519) {
+      if (sigalg->parameter != NULL) {
+        OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PARAMETER);
+        return 0;
+      }
+      return 1; /* Nothing to configure. */
+    }
+    OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM);
+    return 0;
   }
 
   /* Otherwise, initialize with the digest from the OID. */
@@ -133,5 +144,5 @@
     return 0;
   }
 
-  return EVP_DigestVerifyInit(ctx, NULL, digest, NULL, pkey);
+  return EVP_PKEY_CTX_set_signature_md(ctx, digest);
 }
diff --git a/src/crypto/x509/internal.h b/src/crypto/x509/internal.h
index 4957c1e..f7101af 100644
--- a/src/crypto/x509/internal.h
+++ b/src/crypto/x509/internal.h
@@ -28,9 +28,8 @@
 
 /* x509_rsa_pss_to_ctx configures |ctx| for an RSA-PSS operation based on
  * signature algorithm parameters in |sigalg| (which must have type
- * |NID_rsassaPss|) and key |pkey|. It returns one on success and zero on
- * error. */
-int x509_rsa_pss_to_ctx(EVP_MD_CTX *ctx, X509_ALGOR *sigalg, EVP_PKEY *pkey);
+ * |NID_rsassaPss|). It returns one on success and zero on error. */
+int x509_rsa_pss_to_ctx(EVP_PKEY_CTX *ctx, X509_ALGOR *sigalg);
 
 /* x509_rsa_pss_to_ctx sets |algor| to the signature algorithm parameters for
  * |ctx|, which must have been configured for an RSA-PSS signing operation. It
@@ -52,11 +51,9 @@
 int x509_digest_sign_algorithm(EVP_MD_CTX *ctx, X509_ALGOR *algor);
 
 /* x509_digest_verify_init sets up |ctx| for a signature verification operation
- * with public key |pkey| and parameters from |algor|. The |ctx| argument must
- * have been initialised with |EVP_MD_CTX_init|. It returns one on success, or
- * zero on error. */
-int x509_digest_verify_init(EVP_MD_CTX *ctx, X509_ALGOR *sigalg,
-                            EVP_PKEY *pkey);
+ * with parameters from |algor|. The |ctx| argument must have been constructed
+ * with the public key. It returns one on success, or zero on error. */
+int x509_digest_verify_init(EVP_PKEY_CTX *ctx, X509_ALGOR *sigalg);
 
 
 #if defined(__cplusplus)
diff --git a/src/crypto/x509/rsa_pss.c b/src/crypto/x509/rsa_pss.c
index 4913c3d..9c286c6 100644
--- a/src/crypto/x509/rsa_pss.c
+++ b/src/crypto/x509/rsa_pss.c
@@ -242,7 +242,7 @@
   return ret;
 }
 
-int x509_rsa_pss_to_ctx(EVP_MD_CTX *ctx, X509_ALGOR *sigalg, EVP_PKEY *pkey) {
+int x509_rsa_pss_to_ctx(EVP_PKEY_CTX *ctx, X509_ALGOR *sigalg) {
   assert(OBJ_obj2nid(sigalg->algorithm) == NID_rsassaPss);
 
   /* Decode PSS parameters */
@@ -279,11 +279,10 @@
     goto err;
   }
 
-  EVP_PKEY_CTX *pkctx;
-  if (!EVP_DigestVerifyInit(ctx, &pkctx, md, NULL, pkey) ||
-      !EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_PKCS1_PSS_PADDING) ||
-      !EVP_PKEY_CTX_set_rsa_pss_saltlen(pkctx, saltlen) ||
-      !EVP_PKEY_CTX_set_rsa_mgf1_md(pkctx, mgf1md)) {
+  if (!EVP_PKEY_CTX_set_signature_md(ctx, md) ||
+      !EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PSS_PADDING) ||
+      !EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, saltlen) ||
+      !EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, mgf1md)) {
     goto err;
   }
 
diff --git a/src/crypto/x509/x509_test.cc b/src/crypto/x509/x509_test.cc
index 4b80af8..6e23cb8 100644
--- a/src/crypto/x509/x509_test.cc
+++ b/src/crypto/x509/x509_test.cc
@@ -389,6 +389,35 @@
     "GKljn9weIYiMPV/BzGymwfv2EW0preLwtyJNJPaxbdin6Jc=\n"
     "-----END X509 CRL-----\n";
 
+// kEd25519Cert is a self-signed Ed25519 certificate.
+static const char kEd25519Cert[] =
+    "-----BEGIN CERTIFICATE-----\n"
+    "MIIBkTCCAUOgAwIBAgIJAJwooam0UCDmMAUGAytlcDBFMQswCQYDVQQGEwJBVTET\n"
+    "MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ\n"
+    "dHkgTHRkMB4XDTE0MDQyMzIzMjE1N1oXDTE0MDUyMzIzMjE1N1owRTELMAkGA1UE\n"
+    "BhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdp\n"
+    "ZGdpdHMgUHR5IEx0ZDAqMAUGAytlcAMhANdamAGCsQq31Uv+08lkBzoO4XLz2qYj\n"
+    "Ja8CGmj3B1Eao1AwTjAdBgNVHQ4EFgQUoux7eV+fJK2v3ah6QPU/lj1/+7UwHwYD\n"
+    "VR0jBBgwFoAUoux7eV+fJK2v3ah6QPU/lj1/+7UwDAYDVR0TBAUwAwEB/zAFBgMr\n"
+    "ZXADQQBuCzqji8VP9xU8mHEMjXGChX7YP5J664UyVKHKH9Z1u4wEbB8dJ3ScaWSL\n"
+    "r+VHVKUhsrvcdCelnXRrrSD7xWAL\n"
+    "-----END CERTIFICATE-----\n";
+
+// kEd25519CertNull is an invalid self-signed Ed25519 with an explicit NULL in
+// the signature algorithm.
+static const char kEd25519CertNull[] =
+    "-----BEGIN CERTIFICATE-----\n"
+    "MIIBlTCCAUWgAwIBAgIJAJwooam0UCDmMAcGAytlcAUAMEUxCzAJBgNVBAYTAkFV\n"
+    "MRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRz\n"
+    "IFB0eSBMdGQwHhcNMTQwNDIzMjMyMTU3WhcNMTQwNTIzMjMyMTU3WjBFMQswCQYD\n"
+    "VQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQg\n"
+    "V2lkZ2l0cyBQdHkgTHRkMCowBQYDK2VwAyEA11qYAYKxCrfVS/7TyWQHOg7hcvPa\n"
+    "piMlrwIaaPcHURqjUDBOMB0GA1UdDgQWBBSi7Ht5X58kra/dqHpA9T+WPX/7tTAf\n"
+    "BgNVHSMEGDAWgBSi7Ht5X58kra/dqHpA9T+WPX/7tTAMBgNVHRMEBTADAQH/MAcG\n"
+    "AytlcAUAA0EA70uefNocdJohkKPNROKVyBuBD3LXMyvmdTklsaxSRY3PcZdOohlr\n"
+    "recgVPpVS7B+d9g4EwtZXIh4lodTBDHBBw==\n"
+    "-----END CERTIFICATE-----\n";
+
 // CertFromPEM parses the given, NUL-terminated pem block and returns an
 // |X509*|.
 static bssl::UniquePtr<X509> CertFromPEM(const char *pem) {
@@ -732,6 +761,49 @@
   return true;
 }
 
+static bool TestEd25519() {
+  bssl::UniquePtr<X509> cert(CertFromPEM(kEd25519Cert));
+  if (!cert) {
+    return false;
+  }
+
+  bssl::UniquePtr<EVP_PKEY> pkey(X509_get_pubkey(cert.get()));
+  if (!pkey) {
+    return false;
+  }
+
+  if (!X509_verify(cert.get(), pkey.get())) {
+    fprintf(stderr, "Could not verify certificate.\n");
+    return false;
+  }
+  return true;
+}
+
+static bool TestBadEd25519Parameters() {
+  bssl::UniquePtr<X509> cert(CertFromPEM(kEd25519CertNull));
+  if (!cert) {
+    return false;
+  }
+
+  bssl::UniquePtr<EVP_PKEY> pkey(X509_get_pubkey(cert.get()));
+  if (!pkey) {
+    return false;
+  }
+
+  if (X509_verify(cert.get(), pkey.get())) {
+    fprintf(stderr, "Unexpectedly verified bad certificate.\n");
+    return false;
+  }
+  uint32_t err = ERR_get_error();
+  if (ERR_GET_LIB(err) != ERR_LIB_X509 ||
+      ERR_GET_REASON(err) != X509_R_INVALID_PARAMETER) {
+    fprintf(stderr, "Did not get X509_R_INVALID_PARAMETER as expected.\n");
+    return false;
+  }
+  ERR_clear_error();
+  return true;
+}
+
 static bool SignatureRoundTrips(EVP_MD_CTX *md_ctx, EVP_PKEY *pkey) {
   // Make a certificate like signed with |md_ctx|'s settings.'
   bssl::UniquePtr<X509> cert(CertFromPEM(kLeafPEM));
@@ -1086,6 +1158,8 @@
       !TestCRL() ||
       !TestPSS() ||
       !TestBadPSSParameters() ||
+      !TestEd25519() ||
+      !TestBadEd25519Parameters() ||
       !TestSignCtx() ||
       !TestFromBuffer() ||
       !TestFromBufferTrailingData() ||
diff --git a/src/decrepit/ripemd/internal.h b/src/decrepit/ripemd/internal.h
index cbf7a8d..891d6a7 100644
--- a/src/decrepit/ripemd/internal.h
+++ b/src/decrepit/ripemd/internal.h
@@ -91,7 +91,7 @@
   } while (0)
 #define HASH_BLOCK_DATA_ORDER ripemd160_block_data_order
 
-#include "../../crypto/digest/md32_common.h"
+#include "../../crypto/fipsmodule/digest/md32_common.h"
 
 /* Transformed F2 and F4 are courtesy of Wei Dai <weidai@eskimo.com> */
 #define F1(x, y, z) ((x) ^ (y) ^ (z))
diff --git a/src/include/openssl/base.h b/src/include/openssl/base.h
index a9d1ec5..53512ac 100644
--- a/src/include/openssl/base.h
+++ b/src/include/openssl/base.h
@@ -65,6 +65,10 @@
 #include <stdio.h>
 #endif
 
+/* Include a BoringSSL-only header so consumers including this header without
+ * setting up include paths do not accidentally pick up the system
+ * opensslconf.h. */
+#include <openssl/is_boringssl.h>
 #include <openssl/opensslconf.h>
 
 #if defined(BORINGSSL_PREFIX)
@@ -223,7 +227,6 @@
 typedef struct asn1_string_st ASN1_UTF8STRING;
 typedef struct asn1_string_st ASN1_VISIBLESTRING;
 typedef struct asn1_type_st ASN1_TYPE;
-
 typedef struct AUTHORITY_KEYID_st AUTHORITY_KEYID;
 typedef struct BASIC_CONSTRAINTS_st BASIC_CONSTRAINTS;
 typedef struct DIST_POINT_st DIST_POINT;
diff --git a/src/include/openssl/bytestring.h b/src/include/openssl/bytestring.h
index 4aea6bf..1e74956 100644
--- a/src/include/openssl/bytestring.h
+++ b/src/include/openssl/bytestring.h
@@ -126,33 +126,33 @@
 /* Parsing ASN.1 */
 
 /* The following values are tag numbers for UNIVERSAL elements. */
-#define CBS_ASN1_BOOLEAN 0x1
-#define CBS_ASN1_INTEGER 0x2
-#define CBS_ASN1_BITSTRING 0x3
-#define CBS_ASN1_OCTETSTRING 0x4
-#define CBS_ASN1_NULL 0x5
-#define CBS_ASN1_OBJECT 0x6
-#define CBS_ASN1_ENUMERATED 0xa
-#define CBS_ASN1_UTF8STRING 0xc
-#define CBS_ASN1_SEQUENCE (0x10 | CBS_ASN1_CONSTRUCTED)
-#define CBS_ASN1_SET (0x11 | CBS_ASN1_CONSTRUCTED)
-#define CBS_ASN1_NUMERICSTRING 0x12
-#define CBS_ASN1_PRINTABLESTRING 0x13
-#define CBS_ASN1_T61STRING 0x14
-#define CBS_ASN1_VIDEOTEXSTRING 0x15
-#define CBS_ASN1_IA5STRING 0x16
-#define CBS_ASN1_UTCTIME 0x17
-#define CBS_ASN1_GENERALIZEDTIME 0x18
-#define CBS_ASN1_GRAPHICSTRING 0x19
-#define CBS_ASN1_VISIBLESTRING 0x1a
-#define CBS_ASN1_GENERALSTRING 0x1b
-#define CBS_ASN1_UNIVERSALSTRING 0x1c
-#define CBS_ASN1_BMPSTRING 0x1e
+#define CBS_ASN1_BOOLEAN 0x1u
+#define CBS_ASN1_INTEGER 0x2u
+#define CBS_ASN1_BITSTRING 0x3u
+#define CBS_ASN1_OCTETSTRING 0x4u
+#define CBS_ASN1_NULL 0x5u
+#define CBS_ASN1_OBJECT 0x6u
+#define CBS_ASN1_ENUMERATED 0xau
+#define CBS_ASN1_UTF8STRING 0xcu
+#define CBS_ASN1_SEQUENCE (0x10u | CBS_ASN1_CONSTRUCTED)
+#define CBS_ASN1_SET (0x11u | CBS_ASN1_CONSTRUCTED)
+#define CBS_ASN1_NUMERICSTRING 0x12u
+#define CBS_ASN1_PRINTABLESTRING 0x13u
+#define CBS_ASN1_T61STRING 0x14u
+#define CBS_ASN1_VIDEOTEXSTRING 0x15u
+#define CBS_ASN1_IA5STRING 0x16u
+#define CBS_ASN1_UTCTIME 0x17u
+#define CBS_ASN1_GENERALIZEDTIME 0x18u
+#define CBS_ASN1_GRAPHICSTRING 0x19u
+#define CBS_ASN1_VISIBLESTRING 0x1au
+#define CBS_ASN1_GENERALSTRING 0x1bu
+#define CBS_ASN1_UNIVERSALSTRING 0x1cu
+#define CBS_ASN1_BMPSTRING 0x1eu
 
 /* CBS_ASN1_CONSTRUCTED may be ORed into a tag to toggle the constructed
  * bit. |CBS| and |CBB| APIs consider the constructed bit to be part of the
  * tag. */
-#define CBS_ASN1_CONSTRUCTED 0x20
+#define CBS_ASN1_CONSTRUCTED 0x20u
 
 /* The following values specify the constructed bit or tag class and may be ORed
  * into a tag number to produce the final tag. If none is used, the tag will be
@@ -161,15 +161,15 @@
  * Note that although they currently match the DER serialization, consumers must
  * use these bits rather than make assumptions about the representation. This is
  * to allow for tag numbers beyond 31 in the future. */
-#define CBS_ASN1_APPLICATION 0x40
-#define CBS_ASN1_CONTEXT_SPECIFIC 0x80
-#define CBS_ASN1_PRIVATE 0xc0
+#define CBS_ASN1_APPLICATION 0x40u
+#define CBS_ASN1_CONTEXT_SPECIFIC 0x80u
+#define CBS_ASN1_PRIVATE 0xc0u
 
 /* CBS_ASN1_CLASS_MASK may be ANDed with a tag to query its class. */
-#define CBS_ASN1_CLASS_MASK 0xc0
+#define CBS_ASN1_CLASS_MASK 0xc0u
 
 /* CBS_ASN1_TAG_NUMBER_MASK may be ANDed with a tag to query its number. */
-#define CBS_ASN1_TAG_NUMBER_MASK 0x1f
+#define CBS_ASN1_TAG_NUMBER_MASK 0x1fu
 
 /* CBS_get_asn1 sets |*out| to the contents of DER-encoded, ASN.1 element (not
  * including tag and length bytes) and advances |cbs| over it. The ASN.1
diff --git a/src/include/openssl/cipher.h b/src/include/openssl/cipher.h
index 2ee74ef..f93f4cb 100644
--- a/src/include/openssl/cipher.h
+++ b/src/include/openssl/cipher.h
@@ -77,6 +77,7 @@
 OPENSSL_EXPORT const EVP_CIPHER *EVP_des_cbc(void);
 OPENSSL_EXPORT const EVP_CIPHER *EVP_des_ecb(void);
 OPENSSL_EXPORT const EVP_CIPHER *EVP_des_ede(void);
+OPENSSL_EXPORT const EVP_CIPHER *EVP_des_ede3(void);
 OPENSSL_EXPORT const EVP_CIPHER *EVP_des_ede_cbc(void);
 OPENSSL_EXPORT const EVP_CIPHER *EVP_des_ede3_cbc(void);
 
diff --git a/src/include/openssl/cpu.h b/src/include/openssl/cpu.h
index 457a476..1a4294a 100644
--- a/src/include/openssl/cpu.h
+++ b/src/include/openssl/cpu.h
@@ -171,6 +171,8 @@
  * the Vector.AES category of instructions. */
 int CRYPTO_is_PPC64LE_vcrypto_capable(void);
 
+extern unsigned long OPENSSL_ppc64le_hwcap2;
+
 #endif  /* OPENSSL_PPC64LE */
 
 
diff --git a/src/include/openssl/crypto.h b/src/include/openssl/crypto.h
index 3a7e6b1..e071c70 100644
--- a/src/include/openssl/crypto.h
+++ b/src/include/openssl/crypto.h
@@ -54,6 +54,10 @@
  * in which case it returns zero. */
 OPENSSL_EXPORT int CRYPTO_has_asm(void);
 
+/* FIPS_mode returns zero unless BoringSSL is built with BORINGSSL_FIPS, in
+ * which case it returns one. */
+OPENSSL_EXPORT int FIPS_mode(void);
+
 
 /* Deprecated functions. */
 
@@ -83,9 +87,6 @@
 /* OPENSSL_load_builtin_modules does nothing. */
 OPENSSL_EXPORT void OPENSSL_load_builtin_modules(void);
 
-/* FIPS_mode returns zero. */
-OPENSSL_EXPORT int FIPS_mode(void);
-
 
 #if defined(__cplusplus)
 }  /* extern C */
diff --git a/src/include/openssl/ec.h b/src/include/openssl/ec.h
index a1cd5c7..4f06cfb 100644
--- a/src/include/openssl/ec.h
+++ b/src/include/openssl/ec.h
@@ -402,5 +402,6 @@
 #define EC_R_ENCODE_ERROR 129
 #define EC_R_GROUP_MISMATCH 130
 #define EC_R_INVALID_COFACTOR 131
+#define EC_R_PUBLIC_KEY_VALIDATION_FAILED 132
 
 #endif  /* OPENSSL_HEADER_EC_H */
diff --git a/src/include/openssl/ec_key.h b/src/include/openssl/ec_key.h
index 1dbae62..cb7ef10 100644
--- a/src/include/openssl/ec_key.h
+++ b/src/include/openssl/ec_key.h
@@ -159,6 +159,10 @@
  * about the problem can be found on the error stack. */
 OPENSSL_EXPORT int EC_KEY_check_key(const EC_KEY *key);
 
+/* EC_KEY_check_fips performs a signing pairwise consistency test (FIPS 140-2
+ * 4.9.2). It returns one if it passes and zero otherwise. */
+OPENSSL_EXPORT int EC_KEY_check_fips(const EC_KEY *key);
+
 /* EC_KEY_set_public_key_affine_coordinates sets the public key in |key| to
  * (|x|, |y|). It returns one on success and zero otherwise. */
 OPENSSL_EXPORT int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key,
diff --git a/src/include/openssl/evp.h b/src/include/openssl/evp.h
index 9abce9d..cb2731e 100644
--- a/src/include/openssl/evp.h
+++ b/src/include/openssl/evp.h
@@ -157,10 +157,21 @@
 OPENSSL_EXPORT EC_KEY *EVP_PKEY_get0_EC_KEY(EVP_PKEY *pkey);
 OPENSSL_EXPORT EC_KEY *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey);
 
+/* EVP_PKEY_new_ed25519_public returns a newly allocated |EVP_PKEY| wrapping an
+ * Ed25519 public key, or NULL on allocation error. */
+OPENSSL_EXPORT EVP_PKEY *EVP_PKEY_new_ed25519_public(
+    const uint8_t public_key[32]);
+
+/* EVP_PKEY_new_ed25519_private returns a newly allocated |EVP_PKEY| wrapping an
+ * Ed25519 private key, or NULL on allocation error. */
+OPENSSL_EXPORT EVP_PKEY *EVP_PKEY_new_ed25519_private(
+    const uint8_t private_key[64]);
+
 #define EVP_PKEY_NONE NID_undef
 #define EVP_PKEY_RSA NID_rsaEncryption
 #define EVP_PKEY_DSA NID_dsa
 #define EVP_PKEY_EC NID_X9_62_id_ecPublicKey
+#define EVP_PKEY_ED25519 NID_Ed25519
 
 /* EVP_PKEY_assign sets the underlying key of |pkey| to |key|, which must be of
  * the given type. The |type| argument should be one of the |EVP_PKEY_*|
@@ -223,6 +234,10 @@
  * operation will be written to |*pctx|; this can be used to set alternative
  * signing options.
  *
+ * This function performs a streaming signing operation and will fail for
+ * signature algorithms which do not support this. Use |EVP_PKEY_sign_message|
+ * for a single-shot operation.
+ *
  * It returns one on success, or zero on error. */
 OPENSSL_EXPORT int EVP_DigestSignInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
                                       const EVP_MD *type, ENGINE *e,
@@ -253,6 +268,10 @@
  * operation will be written to |*pctx|; this can be used to set alternative
  * signing options.
  *
+ * This function performs streaming signature verification and will fail for
+ * signature algorithms which do not support this. Use |EVP_PKEY_verify_message|
+ * for a single-shot verification.
+ *
  * It returns one on success, or zero on error. */
 OPENSSL_EXPORT int EVP_DigestVerifyInit(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
                                         const EVP_MD *type, ENGINE *e,
@@ -409,20 +428,39 @@
  * It returns one on success or zero on error. */
 OPENSSL_EXPORT int EVP_PKEY_sign_init(EVP_PKEY_CTX *ctx);
 
-/* EVP_PKEY_sign signs |data_len| bytes from |data| using |ctx|. If |sig| is
+/* EVP_PKEY_sign signs |digest_len| bytes from |digest| using |ctx|. If |sig| is
  * NULL, the maximum size of the signature is written to
  * |out_sig_len|. Otherwise, |*sig_len| must contain the number of bytes of
  * space available at |sig|. If sufficient, the signature will be written to
  * |sig| and |*sig_len| updated with the true length.
  *
+ * This function expects a pre-hashed input and will fail for signature
+ * algorithms which do not support this. Use |EVP_PKEY_sign_message| or
+ * |EVP_DigestSignInit| to sign an unhashed input.
+ *
  * WARNING: Setting |sig| to NULL only gives the maximum size of the
  * signature. The actual signature may be smaller.
  *
  * It returns one on success or zero on error. (Note: this differs from
  * OpenSSL, which can also return negative values to indicate an error. ) */
 OPENSSL_EXPORT int EVP_PKEY_sign(EVP_PKEY_CTX *ctx, uint8_t *sig,
-                                 size_t *sig_len, const uint8_t *data,
-                                 size_t data_len);
+                                 size_t *sig_len, const uint8_t *digest,
+                                 size_t digest_len);
+
+/* EVP_PKEY_sign_message signs |data_len| bytes from |data| using |ctx|. If
+ * |sig| is NULL, the maximum size of the signature is written to |out_sig_len|.
+ * Otherwise, |*sig_len| must contain the number of bytes of space available at
+ * |sig|. If sufficient, the signature will be written to |sig| and |*sig_len|
+ * updated with the true length.
+ *
+ * WARNING: Setting |sig| to NULL only gives the maximum size of the
+ * signature. The actual signature may be smaller.
+ *
+ * It returns one on success or zero on error. (Note: this differs from
+ * OpenSSL, which can also return negative values to indicate an error. ) */
+OPENSSL_EXPORT int EVP_PKEY_sign_message(EVP_PKEY_CTX *ctx, uint8_t *sig,
+                                         size_t *sig_len, const uint8_t *data,
+                                         size_t data_len);
 
 /* EVP_PKEY_verify_init initialises an |EVP_PKEY_CTX| for a signature
  * verification operation. It should be called before |EVP_PKEY_verify|.
@@ -431,12 +469,23 @@
 OPENSSL_EXPORT int EVP_PKEY_verify_init(EVP_PKEY_CTX *ctx);
 
 /* EVP_PKEY_verify verifies that |sig_len| bytes from |sig| are a valid
- * signature for |data|.
+ * signature for |digest|.
+ *
+ * This function expects a pre-hashed input and will fail for signature
+ * algorithms which do not support this. Use |EVP_PKEY_verify_message| or
+ * |EVP_DigestVerifyInit| to verify a signature given the unhashed input.
  *
  * It returns one on success or zero on error. */
 OPENSSL_EXPORT int EVP_PKEY_verify(EVP_PKEY_CTX *ctx, const uint8_t *sig,
-                                   size_t sig_len, const uint8_t *data,
-                                   size_t data_len);
+                                   size_t sig_len, const uint8_t *digest,
+                                   size_t digest_len);
+
+/* EVP_PKEY_verify_message verifies that |sig_len| bytes from |sig| are a valid
+ * signature for |data|. It returns one on success or zero on error. */
+OPENSSL_EXPORT int EVP_PKEY_verify_message(EVP_PKEY_CTX *ctx,
+                                           const uint8_t *sig, size_t sig_len,
+                                           const uint8_t *data,
+                                           size_t data_len);
 
 /* EVP_PKEY_encrypt_init initialises an |EVP_PKEY_CTX| for an encryption
  * operation. It should be called before |EVP_PKEY_encrypt|.
@@ -733,7 +782,7 @@
   int type;
 
   union {
-    char *ptr;
+    void *ptr;
     RSA *rsa;
     DSA *dsa;
     DH *dh;
@@ -791,5 +840,7 @@
 #define EVP_R_UNKNOWN_PUBLIC_KEY_TYPE 127
 #define EVP_R_UNSUPPORTED_ALGORITHM 128
 #define EVP_R_UNSUPPORTED_PUBLIC_KEY_TYPE 129
+#define EVP_R_NOT_A_PRIVATE_KEY 130
+#define EVP_R_INVALID_SIGNATURE 131
 
 #endif  /* OPENSSL_HEADER_EVP_H */
diff --git a/src/include/openssl/is_boringssl.h b/src/include/openssl/is_boringssl.h
new file mode 100644
index 0000000..def6e82
--- /dev/null
+++ b/src/include/openssl/is_boringssl.h
@@ -0,0 +1,16 @@
+/* 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. */
+
+/* This header is provided in order to catch include path errors in consuming
+ * BoringSSL. */
diff --git a/src/include/openssl/nid.h b/src/include/openssl/nid.h
index 4270dc1..f023c1f 100644
--- a/src/include/openssl/nid.h
+++ b/src/include/openssl/nid.h
@@ -4192,6 +4192,11 @@
 #define SN_X25519 "X25519"
 #define NID_X25519 948
 
+#define SN_Ed25519 "Ed25519"
+#define NID_Ed25519 949
+#define OBJ_Ed25519 1L, 3L, 101L, 112L
+
+
 #if defined(__cplusplus)
 } /* extern C */
 #endif
diff --git a/src/include/openssl/opensslconf.h b/src/include/openssl/opensslconf.h
index bf65fc3..deff101 100644
--- a/src/include/openssl/opensslconf.h
+++ b/src/include/openssl/opensslconf.h
@@ -52,6 +52,8 @@
 #define OPENSSL_NO_SEED
 #define OPENSSL_NO_SRP
 #define OPENSSL_NO_SSL2
+#define OPENSSL_NO_SSL3
+#define OPENSSL_NO_SSL3_METHOD
 #define OPENSSL_NO_STATIC_ENGINE
 #define OPENSSL_NO_STORE
 #define OPENSSL_NO_WHIRLPOOL
diff --git a/src/include/openssl/rsa.h b/src/include/openssl/rsa.h
index 2377ca2..ee1bdde 100644
--- a/src/include/openssl/rsa.h
+++ b/src/include/openssl/rsa.h
@@ -96,16 +96,14 @@
                                  const BIGNUM **out_e, const BIGNUM **out_d);
 
 /* RSA_get0_factors sets |*out_p| and |*out_q|, if non-NULL, to |rsa|'s prime
- * factors. If |rsa| is a public key, they will be set to NULL. If |rsa| is a
- * multi-prime key, only the first two prime factors will be reported. */
+ * factors. If |rsa| is a public key, they will be set to NULL. */
 OPENSSL_EXPORT void RSA_get0_factors(const RSA *rsa, const BIGNUM **out_p,
                                      const BIGNUM **out_q);
 
 /* RSA_get0_crt_params sets |*out_dmp1|, |*out_dmq1|, and |*out_iqmp|, if
  * non-NULL, to |rsa|'s CRT parameters. These are d (mod p-1), d (mod q-1) and
  * q^-1 (mod p), respectively. If |rsa| is a public key, each parameter will be
- * set to NULL. If |rsa| is a multi-prime key, only the CRT parameters for the
- * first two primes will be reported. */
+ * set to NULL. */
 OPENSSL_EXPORT void RSA_get0_crt_params(const RSA *rsa, const BIGNUM **out_dmp1,
                                         const BIGNUM **out_dmq1,
                                         const BIGNUM **out_iqmp);
@@ -124,12 +122,6 @@
 OPENSSL_EXPORT int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e,
                                        BN_GENCB *cb);
 
-/* RSA_generate_multi_prime_key acts like |RSA_generate_key_ex| but can
- * generate an RSA private key with more than two primes. */
-OPENSSL_EXPORT int RSA_generate_multi_prime_key(RSA *rsa, int bits,
-                                                int num_primes, BIGNUM *e,
-                                                BN_GENCB *cb);
-
 
 /* Encryption / Decryption */
 
@@ -300,11 +292,15 @@
  * |rsa| into it. It returns the fresh |RSA| object, or NULL on error. */
 OPENSSL_EXPORT RSA *RSAPrivateKey_dup(const RSA *rsa);
 
-/* RSA_check_key performs basic validatity tests on |rsa|. It returns one if
+/* RSA_check_key performs basic validity tests on |rsa|. It returns one if
  * they pass and zero otherwise. Opaque keys and public keys always pass. If it
  * returns zero then a more detailed error is available on the error queue. */
 OPENSSL_EXPORT int RSA_check_key(const RSA *rsa);
 
+/* RSA_check_fips performs public key validity tests on |key|. It returns one
+ * if they pass and zero otherwise. Opaque keys always fail. */
+OPENSSL_EXPORT int RSA_check_fips(RSA *key);
+
 /* RSA_recover_crt_params uses |rsa->n|, |rsa->d| and |rsa->e| in order to
  * calculate the two primes used and thus the precomputed, CRT values. These
  * values are set in the |p|, |q|, |dmp1|, |dmq1| and |iqmp| members of |rsa|,
@@ -580,6 +576,7 @@
 
   int (*keygen)(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);
 
+  /* Ignored. Set this to NULL. */
   int (*multi_prime_keygen)(RSA *rsa, int bits, int num_primes, BIGNUM *e,
                             BN_GENCB *cb);
 
@@ -604,8 +601,6 @@
   BIGNUM *dmq1;
   BIGNUM *iqmp;
 
-  STACK_OF(RSA_additional_prime) *additional_primes;
-
   /* be careful using this if the RSA structure is shared */
   CRYPTO_EX_DATA ex_data;
   CRYPTO_refcount_t references;
@@ -692,5 +687,6 @@
 #define RSA_R_UNKNOWN_PADDING_TYPE 143
 #define RSA_R_VALUE_MISSING 144
 #define RSA_R_WRONG_SIGNATURE_LENGTH 145
+#define RSA_R_PUBLIC_KEY_VALIDATION_FAILED 146
 
 #endif  /* OPENSSL_HEADER_RSA_H */
diff --git a/src/include/openssl/ssl.h b/src/include/openssl/ssl.h
index b476592..b52d80c 100644
--- a/src/include/openssl/ssl.h
+++ b/src/include/openssl/ssl.h
@@ -947,6 +947,7 @@
 #define SSL_SIGN_RSA_PSS_SHA256 0x0804
 #define SSL_SIGN_RSA_PSS_SHA384 0x0805
 #define SSL_SIGN_RSA_PSS_SHA512 0x0806
+#define SSL_SIGN_ED25519 0x0807
 
 /* SSL_SIGN_RSA_PKCS1_MD5_SHA1 is an internal signature algorithm used to
  * specify raw RSASSA-PKCS1-v1_5 with an MD5/SHA-1 concatenation, as used in TLS
@@ -1069,15 +1070,16 @@
 
 /* ssl_private_key_method_st (aka |SSL_PRIVATE_KEY_METHOD|) describes private
  * key hooks. This is used to off-load signing operations to a custom,
- * potentially asynchronous, backend. */
+ * potentially asynchronous, backend. Metadata about the key such as the type
+ * and size are parsed out of the certificate.
+ *
+ * TODO(davidben): This API has a number of legacy hooks. Remove the last
+ * consumer of |sign_digest| and trim it. */
 struct ssl_private_key_method_st {
-  /* type returns the type of the key used by |ssl|. For RSA keys, return
-   * |NID_rsaEncryption|. For ECDSA keys, return |NID_X9_62_prime256v1|,
-   * |NID_secp384r1|, or |NID_secp521r1|, depending on the curve. */
+  /* type is ignored and should be NULL. */
   int (*type)(SSL *ssl);
 
-  /* max_signature_len returns the maximum length of a signature signed by the
-   * key used by |ssl|. This must be a constant value for a given |ssl|. */
+  /* max_signature_len is ignored and should be NULL. */
   size_t (*max_signature_len)(SSL *ssl);
 
   /* sign signs the message |in| in using the specified signature algorithm. On
@@ -1220,9 +1222,6 @@
 /* SSL_CIPHER_is_ECDSA returns one if |cipher| uses ECDSA. */
 OPENSSL_EXPORT int SSL_CIPHER_is_ECDSA(const SSL_CIPHER *cipher);
 
-/* SSL_CIPHER_is_DHE returns one if |cipher| uses DHE. */
-OPENSSL_EXPORT int SSL_CIPHER_is_DHE(const SSL_CIPHER *cipher);
-
 /* SSL_CIPHER_is_ECDHE returns one if |cipher| uses ECDHE. */
 OPENSSL_EXPORT int SSL_CIPHER_is_ECDHE(const SSL_CIPHER *cipher);
 
@@ -2123,44 +2122,6 @@
 OPENSSL_EXPORT const char *SSL_get_curve_name(uint16_t curve_id);
 
 
-/* Multiplicative Diffie-Hellman.
- *
- * Cipher suites using a DHE key exchange perform Diffie-Hellman over a
- * multiplicative group selected by the server. These ciphers are disabled for a
- * server unless a group is chosen with one of these functions. */
-
-/* SSL_CTX_set_tmp_dh configures |ctx| to use the group from |dh| as the group
- * for DHE. Only the group is used, so |dh| needn't have a keypair. It returns
- * one on success and zero on error. */
-OPENSSL_EXPORT int SSL_CTX_set_tmp_dh(SSL_CTX *ctx, const DH *dh);
-
-/* SSL_set_tmp_dh configures |ssl| to use the group from |dh| as the group for
- * DHE. Only the group is used, so |dh| needn't have a keypair. It returns one
- * on success and zero on error. */
-OPENSSL_EXPORT int SSL_set_tmp_dh(SSL *ssl, const DH *dh);
-
-/* SSL_CTX_set_tmp_dh_callback configures |ctx| to use |callback| to determine
- * the group for DHE ciphers. |callback| should ignore |is_export| and
- * |keylength| and return a |DH| of the selected group or NULL on error. Only
- * the parameters are used, so the |DH| needn't have a generated keypair.
- *
- * WARNING: The caller does not take ownership of the resulting |DH|, so
- * |callback| must save and release the object elsewhere. */
-OPENSSL_EXPORT void SSL_CTX_set_tmp_dh_callback(
-    SSL_CTX *ctx, DH *(*callback)(SSL *ssl, int is_export, int keylength));
-
-/* SSL_set_tmp_dh_callback configures |ssl| to use |callback| to determine the
- * group for DHE ciphers. |callback| should ignore |is_export| and |keylength|
- * and return a |DH| of the selected group or NULL on error. Only the
- * parameters are used, so the |DH| needn't have a generated keypair.
- *
- * WARNING: The caller does not take ownership of the resulting |DH|, so
- * |callback| must save and release the object elsewhere. */
-OPENSSL_EXPORT void SSL_set_tmp_dh_callback(SSL *ssl,
-                                            DH *(*dh)(SSL *ssl, int is_export,
-                                                      int keylength));
-
-
 /* Certificate verification.
  *
  * SSL may authenticate either endpoint with an X.509 certificate. Typically
@@ -2404,6 +2365,18 @@
  * reference to |store| will be taken. */
 OPENSSL_EXPORT int SSL_set1_verify_cert_store(SSL *ssl, X509_STORE *store);
 
+/* SSL_CTX_set_ed25519_enabled configures whether |ctx| advertises support for
+ * the Ed25519 signature algorithm when using the default preference list. */
+OPENSSL_EXPORT void SSL_CTX_set_ed25519_enabled(SSL_CTX *ctx, int enabled);
+
+/* SSL_CTX_set_verify_algorithm_prefs confingures |ctx| to use |prefs| as the
+ * preference list when verifying signature's from the peer's long-term key. It
+ * returns one on zero on error. |prefs| should not include the internal-only
+ * value |SSL_SIGN_RSA_PKCS1_MD5_SHA1|. */
+OPENSSL_EXPORT int SSL_CTX_set_verify_algorithm_prefs(SSL_CTX *ctx,
+                                                      const uint16_t *prefs,
+                                                      size_t num_prefs);
+
 
 /* Client certificate CA list.
  *
@@ -2586,6 +2559,13 @@
                                            const uint8_t **out_data,
                                            unsigned *out_len);
 
+/* SSL_CTX_set_allow_unknown_alpn_protos configures client connections on |ctx|
+ * to allow unknown ALPN protocols from the server. Otherwise, by default, the
+ * client will require that the protocol be advertised in
+ * |SSL_CTX_set_alpn_protos|. */
+OPENSSL_EXPORT void SSL_CTX_set_allow_unknown_alpn_protos(SSL_CTX *ctx,
+                                                          int enabled);
+
 
 /* Next protocol negotiation.
  *
@@ -3095,6 +3075,11 @@
  * fully implemented. */
 OPENSSL_EXPORT void SSL_CTX_set_early_data_enabled(SSL_CTX *ctx, int enabled);
 
+/* SSL_set_early_data_enabled sets whether early data is allowed to be used
+ * with resumptions using |ssl|. See |SSL_CTX_set_early_data_enabled| for more
+ * information. */
+OPENSSL_EXPORT void SSL_set_early_data_enabled(SSL *ssl, int enabled);
+
 /* SSL_early_data_accepted returns whether early data was accepted on the
  * handshake performed by |ssl|. */
 OPENSSL_EXPORT int SSL_early_data_accepted(const SSL *ssl);
@@ -3384,13 +3369,15 @@
  * |DTLS_method| except they also call |SSL_CTX_set_min_proto_version| and
  * |SSL_CTX_set_max_proto_version| to lock connections to that protocol
  * version. */
-OPENSSL_EXPORT const SSL_METHOD *SSLv3_method(void);
 OPENSSL_EXPORT const SSL_METHOD *TLSv1_method(void);
 OPENSSL_EXPORT const SSL_METHOD *TLSv1_1_method(void);
 OPENSSL_EXPORT const SSL_METHOD *TLSv1_2_method(void);
 OPENSSL_EXPORT const SSL_METHOD *DTLSv1_method(void);
 OPENSSL_EXPORT const SSL_METHOD *DTLSv1_2_method(void);
 
+/* SSLv3_method returns an |SSL_METHOD| with no versions enabled. */
+OPENSSL_EXPORT const SSL_METHOD *SSLv3_method(void);
+
 /* These client- and server-specific methods call their corresponding generic
  * methods. */
 OPENSSL_EXPORT const SSL_METHOD *TLS_server_method(void);
@@ -3562,6 +3549,22 @@
 /* SSL_get_server_tmp_key returns zero. */
 OPENSSL_EXPORT int *SSL_get_server_tmp_key(SSL *ssl, EVP_PKEY **out_key);
 
+/* SSL_CTX_set_tmp_dh returns 1. */
+OPENSSL_EXPORT int SSL_CTX_set_tmp_dh(SSL_CTX *ctx, const DH *dh);
+
+/* SSL_set_tmp_dh returns 1. */
+OPENSSL_EXPORT int SSL_set_tmp_dh(SSL *ssl, const DH *dh);
+
+/* SSL_CTX_set_tmp_dh_callback does nothing. */
+OPENSSL_EXPORT void SSL_CTX_set_tmp_dh_callback(
+    SSL_CTX *ctx, DH *(*callback)(SSL *ssl, int is_export, int keylength));
+
+/* SSL_set_tmp_dh_callback does nothing. */
+OPENSSL_EXPORT void SSL_set_tmp_dh_callback(SSL *ssl,
+                                            DH *(*dh)(SSL *ssl, int is_export,
+                                                      int keylength));
+
+
 #define SSL_set_app_data(s, arg) (SSL_set_ex_data(s, 0, (char *)(arg)))
 #define SSL_get_app_data(s) (SSL_get_ex_data(s, 0))
 #define SSL_SESSION_set_app_data(s, a) \
@@ -4250,14 +4253,15 @@
    * session tickets. */
   const SSL_TICKET_AEAD_METHOD *ticket_aead_method;
 
+  /* verify_sigalgs, if not empty, is the set of signature algorithms
+   * accepted from the peer in decreasing order of preference. */
+  uint16_t *verify_sigalgs;
+  size_t num_verify_sigalgs;
+
   /* quiet_shutdown is true if the connection should not send a close_notify on
    * shutdown. */
   unsigned quiet_shutdown:1;
 
-  /* If enable_early_data is non-zero, early data can be sent and accepted over
-   * new connections. */
-  unsigned enable_early_data:1;
-
   /* ocsp_stapling_enabled is only used by client connections and indicates
    * whether OCSP stapling will be requested. */
   unsigned ocsp_stapling_enabled:1;
@@ -4279,6 +4283,13 @@
    * that this currently requires post-handshake verification of
    * certificates. */
   unsigned i_promise_to_verify_certs_after_the_handshake:1;
+
+  /* allow_unknown_alpn_protos is one if the client allows unsolicited ALPN
+   * protocols from the peer. */
+  unsigned allow_unknown_alpn_protos:1;
+
+  /* ed25519_enabled is one if Ed25519 is advertised in the handshake. */
+  unsigned ed25519_enabled:1;
 };
 
 
@@ -4620,6 +4631,7 @@
 #define SSL_R_ALPN_MISMATCH_ON_EARLY_DATA 277
 #define SSL_R_WRONG_VERSION_ON_EARLY_DATA 278
 #define SSL_R_CHANNEL_ID_ON_EARLY_DATA 279
+#define SSL_R_NO_SUPPORTED_VERSIONS_ENABLED 280
 #define SSL_R_SSLV3_ALERT_CLOSE_NOTIFY 1000
 #define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE 1010
 #define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC 1020
diff --git a/src/include/openssl/ssl3.h b/src/include/openssl/ssl3.h
index fcaeb2d..b5f5d6a 100644
--- a/src/include/openssl/ssl3.h
+++ b/src/include/openssl/ssl3.h
@@ -294,12 +294,6 @@
 #define SSL3_AD_INAPPROPRIATE_FALLBACK 86 /* fatal */
 
 #define SSL3_CT_RSA_SIGN 1
-#define SSL3_CT_DSS_SIGN 2
-#define SSL3_CT_RSA_FIXED_DH 3
-#define SSL3_CT_DSS_FIXED_DH 4
-#define SSL3_CT_RSA_EPHEMERAL_DH 5
-#define SSL3_CT_DSS_EPHEMERAL_DH 6
-#define SSL3_CT_FORTEZZA_DMS 20
 
 /* SSLv3 */
 /* client */
diff --git a/src/include/openssl/stack.h b/src/include/openssl/stack.h
index c0cd0f6..70e09fb 100644
--- a/src/include/openssl/stack.h
+++ b/src/include/openssl/stack.h
@@ -138,7 +138,6 @@
  * STACK_OF:POLICYINFO
  * STACK_OF:POLICYQUALINFO
  * STACK_OF:POLICY_MAPPING
- * STACK_OF:RSA_additional_prime
  * STACK_OF:SSL_COMP
  * STACK_OF:SSL_CUSTOM_EXTENSION
  * STACK_OF:STACK_OF_X509_NAME_ENTRY
diff --git a/src/include/openssl/stack_macros.h b/src/include/openssl/stack_macros.h
index a5f36fb..5750572 100644
--- a/src/include/openssl/stack_macros.h
+++ b/src/include/openssl/stack_macros.h
@@ -1786,101 +1786,6 @@
                    copy_func),                                               \
       CHECKED_CAST(void (*)(void *), void (*)(POLICY_MAPPING *), free_func)))
 
-/* RSA_additional_prime */
-#define sk_RSA_additional_prime_new(comp)                                      \
-  ((STACK_OF(RSA_additional_prime) *)sk_new(CHECKED_CAST(                      \
-      stack_cmp_func,                                                          \
-      int (*)(const RSA_additional_prime **a, const RSA_additional_prime **b), \
-      comp)))
-
-#define sk_RSA_additional_prime_new_null() \
-  ((STACK_OF(RSA_additional_prime) *)sk_new_null())
-
-#define sk_RSA_additional_prime_num(sk)                                       \
-  sk_num(CHECKED_CAST(const _STACK *, const STACK_OF(RSA_additional_prime) *, \
-                      sk))
-
-#define sk_RSA_additional_prime_zero(sk) \
-  sk_zero(CHECKED_CAST(_STACK *, STACK_OF(RSA_additional_prime) *, sk));
-
-#define sk_RSA_additional_prime_value(sk, i)                               \
-  ((RSA_additional_prime *)sk_value(                                       \
-      CHECKED_CAST(const _STACK *, const STACK_OF(RSA_additional_prime) *, \
-                   sk),                                                    \
-      (i)))
-
-#define sk_RSA_additional_prime_set(sk, i, p)                            \
-  ((RSA_additional_prime *)sk_set(                                       \
-      CHECKED_CAST(_STACK *, STACK_OF(RSA_additional_prime) *, sk), (i), \
-      CHECKED_CAST(void *, RSA_additional_prime *, p)))
-
-#define sk_RSA_additional_prime_free(sk) \
-  sk_free(CHECKED_CAST(_STACK *, STACK_OF(RSA_additional_prime) *, sk))
-
-#define sk_RSA_additional_prime_pop_free(sk, free_func)                        \
-  sk_pop_free(CHECKED_CAST(_STACK *, STACK_OF(RSA_additional_prime) *, sk),    \
-              CHECKED_CAST(void (*)(void *), void (*)(RSA_additional_prime *), \
-                           free_func))
-
-#define sk_RSA_additional_prime_insert(sk, p, where)                      \
-  sk_insert(CHECKED_CAST(_STACK *, STACK_OF(RSA_additional_prime) *, sk), \
-            CHECKED_CAST(void *, RSA_additional_prime *, p), (where))
-
-#define sk_RSA_additional_prime_delete(sk, where) \
-  ((RSA_additional_prime *)sk_delete(             \
-      CHECKED_CAST(_STACK *, STACK_OF(RSA_additional_prime) *, sk), (where)))
-
-#define sk_RSA_additional_prime_delete_ptr(sk, p)                   \
-  ((RSA_additional_prime *)sk_delete_ptr(                           \
-      CHECKED_CAST(_STACK *, STACK_OF(RSA_additional_prime) *, sk), \
-      CHECKED_CAST(void *, RSA_additional_prime *, p)))
-
-#define sk_RSA_additional_prime_find(sk, out_index, p)                  \
-  sk_find(CHECKED_CAST(_STACK *, STACK_OF(RSA_additional_prime) *, sk), \
-          (out_index), CHECKED_CAST(void *, RSA_additional_prime *, p))
-
-#define sk_RSA_additional_prime_shift(sk) \
-  ((RSA_additional_prime *)sk_shift(      \
-      CHECKED_CAST(_STACK *, STACK_OF(RSA_additional_prime) *, sk)))
-
-#define sk_RSA_additional_prime_push(sk, p)                             \
-  sk_push(CHECKED_CAST(_STACK *, STACK_OF(RSA_additional_prime) *, sk), \
-          CHECKED_CAST(void *, RSA_additional_prime *, p))
-
-#define sk_RSA_additional_prime_pop(sk) \
-  ((RSA_additional_prime *)sk_pop(      \
-      CHECKED_CAST(_STACK *, STACK_OF(RSA_additional_prime) *, sk)))
-
-#define sk_RSA_additional_prime_dup(sk)                   \
-  ((STACK_OF(RSA_additional_prime) *)sk_dup(CHECKED_CAST( \
-      const _STACK *, const STACK_OF(RSA_additional_prime) *, sk)))
-
-#define sk_RSA_additional_prime_sort(sk) \
-  sk_sort(CHECKED_CAST(_STACK *, STACK_OF(RSA_additional_prime) *, sk))
-
-#define sk_RSA_additional_prime_is_sorted(sk) \
-  sk_is_sorted(CHECKED_CAST(const _STACK *,   \
-                            const STACK_OF(RSA_additional_prime) *, sk))
-
-#define sk_RSA_additional_prime_set_cmp_func(sk, comp)                       \
-  ((int (*)(const RSA_additional_prime **a, const RSA_additional_prime **b)) \
-       sk_set_cmp_func(                                                      \
-           CHECKED_CAST(_STACK *, STACK_OF(RSA_additional_prime) *, sk),     \
-           CHECKED_CAST(stack_cmp_func,                                      \
-                        int (*)(const RSA_additional_prime **a,              \
-                                const RSA_additional_prime **b),             \
-                        comp)))
-
-#define sk_RSA_additional_prime_deep_copy(sk, copy_func, free_func)        \
-  ((STACK_OF(RSA_additional_prime) *)sk_deep_copy(                         \
-      CHECKED_CAST(const _STACK *, const STACK_OF(RSA_additional_prime) *, \
-                   sk),                                                    \
-      CHECKED_CAST(void *(*)(void *),                                      \
-                   RSA_additional_prime *(*)(RSA_additional_prime *),      \
-                   copy_func),                                             \
-      CHECKED_CAST(void (*)(void *), void (*)(RSA_additional_prime *),     \
-                   free_func)))
-
 /* SSL_COMP */
 #define sk_SSL_COMP_new(comp)                 \
   ((STACK_OF(SSL_COMP) *)sk_new(CHECKED_CAST( \
diff --git a/src/include/openssl/x509.h b/src/include/openssl/x509.h
index 88455dd..44b3b7b 100644
--- a/src/include/openssl/x509.h
+++ b/src/include/openssl/x509.h
@@ -1246,5 +1246,6 @@
 #define X509_R_WRONG_LOOKUP_TYPE 133
 #define X509_R_WRONG_TYPE 134
 #define X509_R_NAME_TOO_LONG 135
+#define X509_R_INVALID_PARAMETER 136
 
 #endif
diff --git a/src/infra/config/cq.cfg b/src/infra/config/cq.cfg
index c202d33..5349874 100644
--- a/src/infra/config/cq.cfg
+++ b/src/infra/config/cq.cfg
@@ -8,6 +8,10 @@
 	cq_verified_label: "CQ-Verified"
 }
 verifiers {
+  gerrit_cq_ability {
+    committer_list: "project-boringssl-committers"
+    dry_run_access_list: "project-boringssl-tryjob-access"
+  }
   try_job {
     buckets {
       name: "client.boringssl"
@@ -50,6 +54,11 @@
 			builders { name: "win64_rel" }
 			builders { name: "win64_small" }
 
+			builders { name: "linux_fips" }
+			builders { name: "linux_fips_rel" }
+			builders { name: "linux_fips_clang" }
+			builders { name: "linux_fips_clang_rel" }
+
 			builders { name: "docs" }
     }
   }
diff --git a/src/ssl/custom_extensions.c b/src/ssl/custom_extensions.c
index ea57c20..ac18517 100644
--- a/src/ssl/custom_extensions.c
+++ b/src/ssl/custom_extensions.c
@@ -69,7 +69,7 @@
     return 1;
   }
 
-  if (ssl->ctx->enable_early_data) {
+  if (ssl->cert->enable_early_data) {
     /* TODO(svaldez): Support Custom Extensions with 0-RTT. For now the caller
      * is expected not to configure both together.
      * https://crbug.com/boringssl/173. */
diff --git a/src/ssl/handshake_client.c b/src/ssl/handshake_client.c
index 7eddd35..0629078 100644
--- a/src/ssl/handshake_client.c
+++ b/src/ssl/handshake_client.c
@@ -156,7 +156,6 @@
 #include <openssl/bn.h>
 #include <openssl/buf.h>
 #include <openssl/bytestring.h>
-#include <openssl/dh.h>
 #include <openssl/ec_key.h>
 #include <openssl/ecdsa.h>
 #include <openssl/err.h>
@@ -545,43 +544,9 @@
  * disabled algorithms. */
 static void ssl_get_client_disabled(SSL *ssl, uint32_t *out_mask_a,
                                     uint32_t *out_mask_k) {
-  int have_rsa = 0, have_ecdsa = 0;
   *out_mask_a = 0;
   *out_mask_k = 0;
 
-  /* Now go through all signature algorithms seeing if we support any for RSA or
-   * ECDSA. Do this for all versions not just TLS 1.2. */
-  const uint16_t *sigalgs;
-  size_t num_sigalgs = tls12_get_verify_sigalgs(ssl, &sigalgs);
-  for (size_t i = 0; i < num_sigalgs; i++) {
-    switch (sigalgs[i]) {
-      case SSL_SIGN_RSA_PSS_SHA512:
-      case SSL_SIGN_RSA_PSS_SHA384:
-      case SSL_SIGN_RSA_PSS_SHA256:
-      case SSL_SIGN_RSA_PKCS1_SHA512:
-      case SSL_SIGN_RSA_PKCS1_SHA384:
-      case SSL_SIGN_RSA_PKCS1_SHA256:
-      case SSL_SIGN_RSA_PKCS1_SHA1:
-        have_rsa = 1;
-        break;
-
-      case SSL_SIGN_ECDSA_SECP521R1_SHA512:
-      case SSL_SIGN_ECDSA_SECP384R1_SHA384:
-      case SSL_SIGN_ECDSA_SECP256R1_SHA256:
-      case SSL_SIGN_ECDSA_SHA1:
-        have_ecdsa = 1;
-        break;
-    }
-  }
-
-  /* Disable auth if we don't include any appropriate signature algorithms. */
-  if (!have_rsa) {
-    *out_mask_a |= SSL_aRSA;
-  }
-  if (!have_ecdsa) {
-    *out_mask_a |= SSL_aECDSA;
-  }
-
   /* PSK requires a client callback. */
   if (ssl->psk_client_callback == NULL) {
     *out_mask_a |= SSL_aPSK;
@@ -833,7 +798,6 @@
 
 static int ssl3_get_server_hello(SSL_HANDSHAKE *hs) {
   SSL *const ssl = hs->ssl;
-  int al = SSL_AD_INTERNAL_ERROR;
   CBS server_hello, server_random, session_id;
   uint16_t server_wire_version, cipher_suite;
   uint8_t compression_method;
@@ -864,9 +828,9 @@
   CBS_init(&server_hello, ssl->init_msg, ssl->init_num);
 
   if (!CBS_get_u16(&server_hello, &server_wire_version)) {
-    al = SSL_AD_DECODE_ERROR;
     OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
-    goto f_err;
+    ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
+    return -1;
   }
 
   uint16_t min_version, max_version, server_version;
@@ -874,8 +838,8 @@
       !ssl->method->version_from_wire(&server_version, server_wire_version) ||
       server_version < min_version || server_version > max_version) {
     OPENSSL_PUT_ERROR(SSL, SSL_R_UNSUPPORTED_PROTOCOL);
-    al = SSL_AD_PROTOCOL_VERSION;
-    goto f_err;
+    ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_PROTOCOL_VERSION);
+    return -1;
   }
 
   assert(ssl->s3->have_version == ssl->s3->initial_handshake_complete);
@@ -886,8 +850,8 @@
     ssl->s3->have_version = 1;
   } else if (server_wire_version != ssl->version) {
     OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_SSL_VERSION);
-    al = SSL_AD_PROTOCOL_VERSION;
-    goto f_err;
+    ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_PROTOCOL_VERSION);
+    return -1;
   }
 
   if (ssl3_protocol_version(ssl) >= TLS1_3_VERSION) {
@@ -898,8 +862,8 @@
 
   if (hs->early_data_offered) {
     OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_VERSION_ON_EARLY_DATA);
-    al = SSL_AD_PROTOCOL_VERSION;
-    goto f_err;
+    ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_PROTOCOL_VERSION);
+    return -1;
   }
 
   ssl_clear_tls13_state(hs);
@@ -913,13 +877,14 @@
       CBS_len(&session_id) > SSL3_SESSION_ID_SIZE ||
       !CBS_get_u16(&server_hello, &cipher_suite) ||
       !CBS_get_u8(&server_hello, &compression_method)) {
-    al = SSL_AD_DECODE_ERROR;
     OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
-    goto f_err;
+    ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
+    return -1;
   }
 
   /* Copy over the server random. */
-  OPENSSL_memcpy(ssl->s3->server_random, CBS_data(&server_random), SSL3_RANDOM_SIZE);
+  OPENSSL_memcpy(ssl->s3->server_random, CBS_data(&server_random),
+                 SSL3_RANDOM_SIZE);
 
   /* TODO(davidben): Implement the TLS 1.1 and 1.2 downgrade sentinels once TLS
    * 1.3 is finalized and we are not implementing a draft version. */
@@ -934,7 +899,8 @@
      * fill out. */
     ssl_set_session(ssl, NULL);
     if (!ssl_get_new_session(hs, 0 /* client */)) {
-      goto f_err;
+      ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
+      return -1;
     }
     /* Note: session_id could be empty. */
     hs->new_session->session_id_length = CBS_len(&session_id);
@@ -945,9 +911,9 @@
   const SSL_CIPHER *c = SSL_get_cipher_by_value(cipher_suite);
   if (c == NULL) {
     /* unknown cipher */
-    al = SSL_AD_ILLEGAL_PARAMETER;
     OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_CIPHER_RETURNED);
-    goto f_err;
+    ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
+    return -1;
   }
 
   /* The cipher must be allowed in the selected version and enabled. */
@@ -957,28 +923,28 @@
       SSL_CIPHER_get_min_version(c) > ssl3_protocol_version(ssl) ||
       SSL_CIPHER_get_max_version(c) < ssl3_protocol_version(ssl) ||
       !sk_SSL_CIPHER_find(SSL_get_ciphers(ssl), NULL, c)) {
-    al = SSL_AD_ILLEGAL_PARAMETER;
     OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CIPHER_RETURNED);
-    goto f_err;
+    ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
+    return -1;
   }
 
   if (ssl->session != NULL) {
     if (ssl->session->ssl_version != ssl->version) {
-      al = SSL_AD_ILLEGAL_PARAMETER;
       OPENSSL_PUT_ERROR(SSL, SSL_R_OLD_SESSION_VERSION_NOT_RETURNED);
-      goto f_err;
+      ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
+      return -1;
     }
     if (ssl->session->cipher != c) {
-      al = SSL_AD_ILLEGAL_PARAMETER;
       OPENSSL_PUT_ERROR(SSL, SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED);
-      goto f_err;
+      ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
+      return -1;
     }
     if (!ssl_session_is_context_valid(ssl, ssl->session)) {
       /* This is actually a client application bug. */
-      al = SSL_AD_ILLEGAL_PARAMETER;
       OPENSSL_PUT_ERROR(SSL,
                         SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);
-      goto f_err;
+      ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
+      return -1;
     }
   } else {
     hs->new_session->cipher = c;
@@ -990,7 +956,8 @@
   if (!SSL_TRANSCRIPT_init_hash(&hs->transcript, ssl3_protocol_version(ssl),
                                 c->algorithm_prf) ||
       !ssl_hash_current_message(hs)) {
-    goto f_err;
+    ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
+    return -1;
   }
 
   /* If doing a full handshake, the server may request a client certificate
@@ -1003,42 +970,37 @@
 
   /* Only the NULL compression algorithm is supported. */
   if (compression_method != 0) {
-    al = SSL_AD_ILLEGAL_PARAMETER;
     OPENSSL_PUT_ERROR(SSL, SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM);
-    goto f_err;
+    ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_ILLEGAL_PARAMETER);
+    return -1;
   }
 
   /* TLS extensions */
   if (!ssl_parse_serverhello_tlsext(hs, &server_hello)) {
     OPENSSL_PUT_ERROR(SSL, SSL_R_PARSE_TLSEXT);
-    goto err;
+    return -1;
   }
 
   /* There should be nothing left over in the record. */
   if (CBS_len(&server_hello) != 0) {
     /* wrong packet length */
-    al = SSL_AD_DECODE_ERROR;
     OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
-    goto f_err;
+    ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
+    return -1;
   }
 
   if (ssl->session != NULL &&
       hs->extended_master_secret != ssl->session->extended_master_secret) {
-    al = SSL_AD_HANDSHAKE_FAILURE;
     if (ssl->session->extended_master_secret) {
       OPENSSL_PUT_ERROR(SSL, SSL_R_RESUMED_EMS_SESSION_WITHOUT_EMS_EXTENSION);
     } else {
       OPENSSL_PUT_ERROR(SSL, SSL_R_RESUMED_NON_EMS_SESSION_WITH_EMS_EXTENSION);
     }
-    goto f_err;
+    ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
+    return -1;
   }
 
   return 1;
-
-f_err:
-  ssl3_send_alert(ssl, SSL3_AL_FATAL, al);
-err:
-  return -1;
 }
 
 static int ssl3_get_server_certificate(SSL_HANDSHAKE *hs) {
@@ -1170,7 +1132,6 @@
 static int ssl3_get_server_key_exchange(SSL_HANDSHAKE *hs) {
   SSL *const ssl = hs->ssl;
   int al;
-  DH *dh = NULL;
   EC_KEY *ecdh = NULL;
   EC_POINT *srvr_ecpoint = NULL;
 
@@ -1241,50 +1202,7 @@
     }
   }
 
-  if (alg_k & SSL_kDHE) {
-    CBS dh_p, dh_g, dh_Ys;
-    if (!CBS_get_u16_length_prefixed(&server_key_exchange, &dh_p) ||
-        CBS_len(&dh_p) == 0 ||
-        !CBS_get_u16_length_prefixed(&server_key_exchange, &dh_g) ||
-        CBS_len(&dh_g) == 0 ||
-        !CBS_get_u16_length_prefixed(&server_key_exchange, &dh_Ys) ||
-        CBS_len(&dh_Ys) == 0) {
-      al = SSL_AD_DECODE_ERROR;
-      OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
-      goto f_err;
-    }
-
-    dh = DH_new();
-    if (dh == NULL) {
-      goto err;
-    }
-
-    dh->p = BN_bin2bn(CBS_data(&dh_p), CBS_len(&dh_p), NULL);
-    dh->g = BN_bin2bn(CBS_data(&dh_g), CBS_len(&dh_g), NULL);
-    if (dh->p == NULL || dh->g == NULL) {
-      goto err;
-    }
-
-    unsigned bits = DH_num_bits(dh);
-    if (bits < 1024) {
-      OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_DH_P_LENGTH);
-      goto err;
-    } else if (bits > 4096) {
-      /* Overly large DHE groups are prohibitively expensive, so enforce a limit
-       * to prevent a server from causing us to perform too expensive of a
-       * computation. */
-      OPENSSL_PUT_ERROR(SSL, SSL_R_DH_P_TOO_LONG);
-      goto err;
-    }
-
-    SSL_ECDH_CTX_init_for_dhe(&hs->ecdh_ctx, dh);
-    dh = NULL;
-
-    /* Save the peer public key for later. */
-    if (!CBS_stow(&dh_Ys, &hs->peer_key, &hs->peer_key_len)) {
-      goto err;
-    }
-  } else if (alg_k & SSL_kECDHE) {
+  if (alg_k & SSL_kECDHE) {
     /* Parse the server parameters. */
     uint8_t group_type;
     uint16_t group_id;
@@ -1400,7 +1318,6 @@
 f_err:
   ssl3_send_alert(ssl, SSL3_AL_FATAL, al);
 err:
-  DH_free(dh);
   EC_POINT_free(srvr_ecpoint);
   EC_KEY_free(ecdh);
   return -1;
@@ -1527,7 +1444,7 @@
     }
   }
 
-  if (!ssl->ctx->x509_method->ssl_auto_chain_if_needed(ssl) ||
+  if (!ssl_on_certificate_selected(hs) ||
       !ssl3_output_cert_chain(ssl)) {
     return -1;
   }
@@ -1627,10 +1544,10 @@
         !CBB_flush(&body)) {
       goto err;
     }
-  } else if (alg_k & (SSL_kECDHE|SSL_kDHE)) {
+  } else if (alg_k & SSL_kECDHE) {
     /* Generate a keypair and serialize the public half. */
     CBB child;
-    if (!SSL_ECDH_CTX_add_key(&hs->ecdh_ctx, &body, &child)) {
+    if (!CBB_add_u8_length_prefixed(&body, &child)) {
       goto err;
     }
 
@@ -1739,7 +1656,7 @@
   }
 
   /* Set aside space for the signature. */
-  const size_t max_sig_len = ssl_private_key_max_signature_len(ssl);
+  const size_t max_sig_len = EVP_PKEY_size(hs->local_pubkey);
   uint8_t *ptr;
   if (!CBB_add_u16_length_prefixed(&body, &child) ||
       !CBB_reserve(&child, &ptr, max_sig_len)) {
diff --git a/src/ssl/handshake_server.c b/src/ssl/handshake_server.c
index cc1897f..63027d6 100644
--- a/src/ssl/handshake_server.c
+++ b/src/ssl/handshake_server.c
@@ -155,7 +155,6 @@
 #include <openssl/buf.h>
 #include <openssl/bytestring.h>
 #include <openssl/cipher.h>
-#include <openssl/dh.h>
 #include <openssl/ec.h>
 #include <openssl/ecdsa.h>
 #include <openssl/err.h>
@@ -695,19 +694,12 @@
   uint32_t mask_a = 0;
 
   if (ssl_has_certificate(ssl)) {
-    int type = ssl_private_key_type(ssl);
-    if (type == NID_rsaEncryption) {
+    mask_a |= ssl_cipher_auth_mask_for_key(hs->local_pubkey);
+    if (EVP_PKEY_id(hs->local_pubkey) == EVP_PKEY_RSA) {
       mask_k |= SSL_kRSA;
-      mask_a |= SSL_aRSA;
-    } else if (ssl_is_ecdsa_key_type(type)) {
-      mask_a |= SSL_aECDSA;
     }
   }
 
-  if (ssl->cert->dh_tmp != NULL || ssl->cert->dh_tmp_cb != NULL) {
-    mask_k |= SSL_kDHE;
-  }
-
   /* Check for a shared group to consider ECDHE ciphers. */
   uint16_t unused;
   if (tls1_get_shared_group(hs, &unused)) {
@@ -879,7 +871,7 @@
     }
   }
 
-  if (!ssl->ctx->x509_method->ssl_auto_chain_if_needed(ssl)) {
+  if (!ssl_on_certificate_selected(hs)) {
     return -1;
   }
 
@@ -1158,34 +1150,7 @@
       }
     }
 
-    if (alg_k & SSL_kDHE) {
-      /* Determine the group to use. */
-      DH *params = ssl->cert->dh_tmp;
-      if (params == NULL && ssl->cert->dh_tmp_cb != NULL) {
-        params = ssl->cert->dh_tmp_cb(ssl, 0, 1024);
-      }
-      if (params == NULL) {
-        OPENSSL_PUT_ERROR(SSL, SSL_R_MISSING_TMP_DH_KEY);
-        ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE);
-        goto err;
-      }
-
-      /* Set up DH, generate a key, and emit the public half. */
-      DH *dh = DHparams_dup(params);
-      if (dh == NULL) {
-        goto err;
-      }
-
-      SSL_ECDH_CTX_init_for_dhe(&hs->ecdh_ctx, dh);
-      if (!CBB_add_u16_length_prefixed(&cbb, &child) ||
-          !BN_bn2cbb_padded(&child, BN_num_bytes(params->p), params->p) ||
-          !CBB_add_u16_length_prefixed(&cbb, &child) ||
-          !BN_bn2cbb_padded(&child, BN_num_bytes(params->g), params->g) ||
-          !CBB_add_u16_length_prefixed(&cbb, &child) ||
-          !SSL_ECDH_CTX_offer(&hs->ecdh_ctx, &child)) {
-        goto err;
-      }
-    } else if (alg_k & SSL_kECDHE) {
+    if (alg_k & SSL_kECDHE) {
       /* Determine the group to use. */
       uint16_t group_id;
       if (!tls1_get_shared_group(hs, &group_id)) {
@@ -1241,7 +1206,7 @@
     }
 
     /* Add space for the signature. */
-    const size_t max_sig_len = ssl_private_key_max_signature_len(ssl);
+    const size_t max_sig_len = EVP_PKEY_size(hs->local_pubkey);
     uint8_t *ptr;
     if (!CBB_add_u16_length_prefixed(&body, &child) ||
         !CBB_reserve(&child, &ptr, max_sig_len)) {
@@ -1308,66 +1273,23 @@
   return -1;
 }
 
-static int add_cert_types(SSL *ssl, CBB *cbb) {
-  /* Get configured signature algorithms. */
-  int have_rsa_sign = 0;
-  int have_ecdsa_sign = 0;
-  const uint16_t *sig_algs;
-  size_t num_sig_algs = tls12_get_verify_sigalgs(ssl, &sig_algs);
-  for (size_t i = 0; i < num_sig_algs; i++) {
-    switch (sig_algs[i]) {
-      case SSL_SIGN_RSA_PKCS1_SHA512:
-      case SSL_SIGN_RSA_PKCS1_SHA384:
-      case SSL_SIGN_RSA_PKCS1_SHA256:
-      case SSL_SIGN_RSA_PKCS1_SHA1:
-        have_rsa_sign = 1;
-        break;
-
-      case SSL_SIGN_ECDSA_SECP521R1_SHA512:
-      case SSL_SIGN_ECDSA_SECP384R1_SHA384:
-      case SSL_SIGN_ECDSA_SECP256R1_SHA256:
-      case SSL_SIGN_ECDSA_SHA1:
-        have_ecdsa_sign = 1;
-        break;
-    }
-  }
-
-  if (have_rsa_sign && !CBB_add_u8(cbb, SSL3_CT_RSA_SIGN)) {
-    return 0;
-  }
-
-  /* ECDSA certs can be used with RSA cipher suites as well so we don't need to
-   * check for SSL_kECDH or SSL_kECDHE. */
-  if (ssl->version >= TLS1_VERSION && have_ecdsa_sign &&
-      !CBB_add_u8(cbb, TLS_CT_ECDSA_SIGN)) {
-    return 0;
-  }
-
-  return 1;
-}
-
 static int ssl3_send_certificate_request(SSL_HANDSHAKE *hs) {
   SSL *const ssl = hs->ssl;
   CBB cbb, body, cert_types, sigalgs_cbb;
   if (!ssl->method->init_message(ssl, &cbb, &body,
                                  SSL3_MT_CERTIFICATE_REQUEST) ||
       !CBB_add_u8_length_prefixed(&body, &cert_types) ||
-      !add_cert_types(ssl, &cert_types)) {
+      !CBB_add_u8(&cert_types, SSL3_CT_RSA_SIGN) ||
+      (ssl->version >= TLS1_VERSION &&
+       !CBB_add_u8(&cert_types, TLS_CT_ECDSA_SIGN))) {
     goto err;
   }
 
   if (ssl3_protocol_version(ssl) >= TLS1_2_VERSION) {
-    const uint16_t *sigalgs;
-    size_t num_sigalgs = tls12_get_verify_sigalgs(ssl, &sigalgs);
-    if (!CBB_add_u16_length_prefixed(&body, &sigalgs_cbb)) {
+    if (!CBB_add_u16_length_prefixed(&body, &sigalgs_cbb) ||
+        !tls12_add_verify_sigalgs(ssl, &sigalgs_cbb)) {
       goto err;
     }
-
-    for (size_t i = 0; i < num_sigalgs; i++) {
-      if (!CBB_add_u16(&sigalgs_cbb, sigalgs[i])) {
-        goto err;
-      }
-    }
   }
 
   if (!ssl_add_client_CA_list(ssl, &body) ||
@@ -1573,7 +1495,7 @@
    * |premaster_secret_len|. */
   if (alg_k & SSL_kRSA) {
     /* Allocate a buffer large enough for an RSA decryption. */
-    const size_t rsa_size = ssl_private_key_max_signature_len(ssl);
+    const size_t rsa_size = EVP_PKEY_size(hs->local_pubkey);
     decrypt_buf = OPENSSL_malloc(rsa_size);
     if (decrypt_buf == NULL) {
       OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
@@ -1584,7 +1506,7 @@
     size_t decrypt_len;
     if (hs->state == SSL3_ST_SR_KEY_EXCH_A) {
       if (!ssl_has_private_key(ssl) ||
-          ssl_private_key_type(ssl) != NID_rsaEncryption) {
+          EVP_PKEY_id(hs->local_pubkey) != EVP_PKEY_RSA) {
         al = SSL_AD_HANDSHAKE_FAILURE;
         OPENSSL_PUT_ERROR(SSL, SSL_R_MISSING_RSA_CERTIFICATE);
         goto f_err;
@@ -1678,10 +1600,10 @@
 
     OPENSSL_free(decrypt_buf);
     decrypt_buf = NULL;
-  } else if (alg_k & (SSL_kECDHE|SSL_kDHE)) {
+  } else if (alg_k & SSL_kECDHE) {
     /* Parse the ClientKeyExchange. */
     CBS peer_key;
-    if (!SSL_ECDH_CTX_get_key(&hs->ecdh_ctx, &client_key_exchange, &peer_key) ||
+    if (!CBS_get_u8_length_prefixed(&client_key_exchange, &peer_key) ||
         CBS_len(&client_key_exchange) != 0) {
       al = SSL_AD_DECODE_ERROR;
       OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
diff --git a/src/ssl/internal.h b/src/ssl/internal.h
index ded5ba8..4d148c6 100644
--- a/src/ssl/internal.h
+++ b/src/ssl/internal.h
@@ -167,11 +167,10 @@
 
 /* Bits for |algorithm_mkey| (key exchange algorithm). */
 #define SSL_kRSA 0x00000001L
-#define SSL_kDHE 0x00000002L
-#define SSL_kECDHE 0x00000004L
+#define SSL_kECDHE 0x00000002L
 /* SSL_kPSK is only set for plain PSK, not ECDHE_PSK. */
-#define SSL_kPSK 0x00000008L
-#define SSL_kGENERIC 0x00000010L
+#define SSL_kPSK 0x00000004L
+#define SSL_kGENERIC 0x00000008L
 
 /* Bits for |algorithm_auth| (server authentication). */
 #define SSL_aRSA 0x00000001L
@@ -238,9 +237,9 @@
 /* ssl_cipher_get_value returns the cipher suite id of |cipher|. */
 uint16_t ssl_cipher_get_value(const SSL_CIPHER *cipher);
 
-/* ssl_cipher_get_key_type returns the |EVP_PKEY_*| value corresponding to the
- * server key used in |cipher| or |EVP_PKEY_NONE| if there is none. */
-int ssl_cipher_get_key_type(const SSL_CIPHER *cipher);
+/* ssl_cipher_auth_mask_for_key returns the mask of cipher |algorithm_auth|
+ * values suitable for use with |key| in TLS 1.2 and below. */
+uint32_t ssl_cipher_auth_mask_for_key(const EVP_PKEY *key);
 
 /* ssl_cipher_uses_certificate_auth returns one if |cipher| authenticates the
  * server and, optionally, the client with a certificate. Otherwise it returns
@@ -542,22 +541,16 @@
 
 /* Private key operations. */
 
+typedef struct ssl_handshake_st SSL_HANDSHAKE;
+
 /* ssl_has_private_key returns one if |ssl| has a private key
  * configured and zero otherwise. */
 int ssl_has_private_key(const SSL *ssl);
 
-/* ssl_is_ecdsa_key_type returns one if |type| is an ECDSA key type and zero
- * otherwise. */
-int ssl_is_ecdsa_key_type(int type);
-
 /* ssl_private_key_* call the corresponding function on the
  * |SSL_PRIVATE_KEY_METHOD| for |ssl|, if configured. Otherwise, they implement
  * the operation with |EVP_PKEY|. */
 
-int ssl_private_key_type(SSL *ssl);
-
-size_t ssl_private_key_max_signature_len(SSL *ssl);
-
 enum ssl_private_key_result_t ssl_private_key_sign(
     SSL *ssl, uint8_t *out, size_t *out_len, size_t max_out,
     uint16_t signature_algorithm, const uint8_t *in, size_t in_len);
@@ -570,10 +563,10 @@
                                                        size_t *out_len,
                                                        size_t max_out);
 
-/* ssl_private_key_supports_signature_algorithm returns one if |ssl|'s private
- * key supports |signature_algorithm| and zero otherwise. */
-int ssl_private_key_supports_signature_algorithm(SSL *ssl,
-                                                 uint16_t signature_algorithm);
+/* ssl_private_key_supports_signature_algorithm returns one if |hs|'s private
+ * key supports |sigalg| and zero otherwise. */
+int ssl_private_key_supports_signature_algorithm(SSL_HANDSHAKE *hs,
+                                                 uint16_t sigalg);
 
 /* ssl_public_key_verify verifies that the |signature| is valid for the public
  * key |pkey| and input |in|, using the |signature_algorithm| specified. */
@@ -585,8 +578,6 @@
 
 /* Custom extensions */
 
-typedef struct ssl_handshake_st SSL_HANDSHAKE;
-
 /* ssl_custom_extension (a.k.a. SSL_CUSTOM_EXTENSION) is a structure that
  * contains information about custom-extension callbacks. */
 struct ssl_custom_extension {
@@ -645,15 +636,6 @@
   int (*finish)(SSL_ECDH_CTX *ctx, uint8_t **out_secret, size_t *out_secret_len,
                 uint8_t *out_alert, const uint8_t *peer_key,
                 size_t peer_key_len);
-
-  /* get_key initializes |out| with a length-prefixed key from |cbs|. It returns
-   * one on success and zero on error. */
-  int (*get_key)(CBS *cbs, CBS *out);
-
-  /* add_key initializes |out_contents| to receive a key. Typically it will then
-   * be passed to |offer| or |accept|. It returns one on success and zero on
-   * error. */
-  int (*add_key)(CBB *cbb, CBB *out_contents);
 } SSL_ECDH_METHOD;
 
 struct ssl_ecdh_ctx_st {
@@ -675,10 +657,6 @@
  * on success and zero on error. */
 int SSL_ECDH_CTX_init(SSL_ECDH_CTX *ctx, uint16_t group_id);
 
-/* SSL_ECDH_CTX_init_for_dhe sets up |ctx| for use with legacy DHE-based ciphers
- * where the server specifies a group. It takes ownership of |params|. */
-void SSL_ECDH_CTX_init_for_dhe(SSL_ECDH_CTX *ctx, DH *params);
-
 /* SSL_ECDH_CTX_cleanup releases memory associated with |ctx|. It is legal to
  * call it in the zero state. */
 void SSL_ECDH_CTX_cleanup(SSL_ECDH_CTX *ctx);
@@ -857,6 +835,11 @@
 int ssl_check_leaf_certificate(SSL_HANDSHAKE *hs, EVP_PKEY *pkey,
                                const CRYPTO_BUFFER *leaf);
 
+/* ssl_on_certificate_selected is called once the certificate has been selected.
+ * It finalizes the certificate and initializes |hs->local_pubkey|. It returns
+ * one on success and zero on error. */
+int ssl_on_certificate_selected(SSL_HANDSHAKE *hs);
+
 
 /* TLS 1.3 key derivation. */
 
@@ -1014,10 +997,10 @@
   uint8_t *key_share_bytes;
   size_t key_share_bytes_len;
 
-  /* public_key, for servers, is the key share to be sent to the client in TLS
-   * 1.3. */
-  uint8_t *public_key;
-  size_t public_key_len;
+  /* ecdh_public_key, for servers, is the key share to be sent to the client in
+   * TLS 1.3. */
+  uint8_t *ecdh_public_key;
+  size_t ecdh_public_key_len;
 
   /* peer_sigalgs are the signature algorithms that the peer supports. These are
    * taken from the contents of the signature algorithms extension for a server
@@ -1061,6 +1044,9 @@
   /* hostname, on the server, is the value of the SNI extension. */
   char *hostname;
 
+  /* local_pubkey is the public key we are authenticating as. */
+  EVP_PKEY *local_pubkey;
+
   /* peer_pubkey is the public key parsed from the peer's leaf certificate. */
   EVP_PKEY *peer_pubkey;
 
@@ -1287,9 +1273,9 @@
  * supported. It returns one on success and zero on error. */
 int tls1_choose_signature_algorithm(SSL_HANDSHAKE *hs, uint16_t *out);
 
-/* tls12_get_verify_sigalgs sets |*out| to the signature algorithms acceptable
- * for the peer signature and returns the length of the list. */
-size_t tls12_get_verify_sigalgs(const SSL *ssl, const uint16_t **out);
+/* tls12_add_verify_sigalgs adds the signature algorithms acceptable for the
+ * peer signature to |out|. It returns one on success and zero on error. */
+int tls12_add_verify_sigalgs(const SSL *ssl, CBB *out);
 
 /* tls12_check_peer_sigalg checks if |sigalg| is acceptable for the peer
  * signature. It returns one on success and zero on error, setting |*out_alert|
@@ -1340,9 +1326,6 @@
    * compatibility, or might be a no-op, depending on the application. */
   const SSL_X509_METHOD *x509_method;
 
-  DH *dh_tmp;
-  DH *(*dh_tmp_cb)(SSL *ssl, int is_export, int keysize);
-
   /* sigalgs, if non-NULL, is the set of signature algorithms supported by
    * |privatekey| in decreasing order of preference. */
   uint16_t *sigalgs;
@@ -1371,6 +1354,9 @@
    * ticket key. Only sessions with a matching value will be accepted. */
   uint8_t sid_ctx_length;
   uint8_t sid_ctx[SSL_MAX_SID_CTX_LENGTH];
+
+  /* If enable_early_data is non-zero, early data can be sent and accepted. */
+  unsigned enable_early_data:1;
 } CERT;
 
 /* SSL_METHOD is a compatibility structure to support the legacy version-locked
@@ -1630,10 +1616,15 @@
    * handshake. */
   unsigned tlsext_channel_id_valid:1;
 
+  /* key_update_pending is one if we have a KeyUpdate acknowledgment
+   * outstanding. */
+  unsigned key_update_pending:1;
+
   uint8_t send_alert[2];
 
   /* pending_flight is the pending outgoing flight. This is used to flush each
-   * handshake flight in a single write. */
+   * handshake flight in a single write. |write_buffer| must be written out
+   * before this data. */
   BUF_MEM *pending_flight;
 
   /* pending_flight_offset is the number of bytes of |pending_flight| which have
diff --git a/src/ssl/s3_both.c b/src/ssl/s3_both.c
index 7ef400a..e05a16e 100644
--- a/src/ssl/s3_both.c
+++ b/src/ssl/s3_both.c
@@ -166,7 +166,7 @@
   SSL_TRANSCRIPT_cleanup(&hs->transcript);
   OPENSSL_free(hs->cookie);
   OPENSSL_free(hs->key_share_bytes);
-  OPENSSL_free(hs->public_key);
+  OPENSSL_free(hs->ecdh_public_key);
   SSL_SESSION_free(hs->new_session);
   OPENSSL_free(hs->peer_sigalgs);
   OPENSSL_free(hs->peer_supported_group_list);
@@ -184,6 +184,7 @@
 
   OPENSSL_free(hs->hostname);
   EVP_PKEY_free(hs->peer_pubkey);
+  EVP_PKEY_free(hs->local_pubkey);
   OPENSSL_free(hs);
 }
 
diff --git a/src/ssl/s3_lib.c b/src/ssl/s3_lib.c
index 57a27c7..ac8bb67 100644
--- a/src/ssl/s3_lib.c
+++ b/src/ssl/s3_lib.c
@@ -152,7 +152,6 @@
 #include <string.h>
 
 #include <openssl/buf.h>
-#include <openssl/dh.h>
 #include <openssl/digest.h>
 #include <openssl/err.h>
 #include <openssl/md5.h>
diff --git a/src/ssl/s3_pkt.c b/src/ssl/s3_pkt.c
index fc21c2c..8e3613a 100644
--- a/src/ssl/s3_pkt.c
+++ b/src/ssl/s3_pkt.c
@@ -260,14 +260,6 @@
     return ssl3_write_pending(ssl, type, buf, len);
   }
 
-  /* The handshake flight buffer is mutually exclusive with application data.
-   *
-   * TODO(davidben): This will not be true when closure alerts use this. */
-  if (ssl->s3->pending_flight != NULL) {
-    OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
-    return -1;
-  }
-
   if (len > SSL3_RT_MAX_PLAIN_LENGTH) {
     OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
     return -1;
@@ -277,18 +269,47 @@
     return 0;
   }
 
+  size_t flight_len = 0;
+  if (ssl->s3->pending_flight != NULL) {
+    flight_len =
+        ssl->s3->pending_flight->length - ssl->s3->pending_flight_offset;
+  }
+
   size_t max_out = len + SSL_max_seal_overhead(ssl);
-  if (max_out < len) {
+  if (max_out < len || max_out + flight_len < max_out) {
     OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
     return -1;
   }
+  max_out += flight_len;
+
   uint8_t *out;
   size_t ciphertext_len;
-  if (!ssl_write_buffer_init(ssl, &out, max_out) ||
-      !tls_seal_record(ssl, out, &ciphertext_len, max_out, type, buf, len)) {
+  if (!ssl_write_buffer_init(ssl, &out, max_out)) {
     return -1;
   }
-  ssl_write_buffer_set_len(ssl, ciphertext_len);
+
+  /* Add any unflushed handshake data as a prefix. This may be a KeyUpdate
+   * acknowledgment or 0-RTT key change messages. |pending_flight| must be clear
+   * when data is added to |write_buffer| or it will be written in the wrong
+   * order. */
+  if (ssl->s3->pending_flight != NULL) {
+    OPENSSL_memcpy(
+        out, ssl->s3->pending_flight->data + ssl->s3->pending_flight_offset,
+        flight_len);
+    BUF_MEM_free(ssl->s3->pending_flight);
+    ssl->s3->pending_flight = NULL;
+    ssl->s3->pending_flight_offset = 0;
+  }
+
+  if (!tls_seal_record(ssl, out + flight_len, &ciphertext_len,
+                       max_out - flight_len, type, buf, len)) {
+    return -1;
+  }
+  ssl_write_buffer_set_len(ssl, flight_len + ciphertext_len);
+
+  /* Now that we've made progress on the connection, uncork KeyUpdate
+   * acknowledgments. */
+  ssl->s3->key_update_pending = 0;
 
   /* memorize arguments so that ssl3_write_pending can detect bad write retries
    * later */
diff --git a/src/ssl/ssl_asn1.c b/src/ssl/ssl_asn1.c
index cfcc12a..f368ff2 100644
--- a/src/ssl/ssl_asn1.c
+++ b/src/ssl/ssl_asn1.c
@@ -121,9 +121,6 @@
  *                                  -- stapled OCSP response from the server
  *     extendedMasterSecret    [17] BOOLEAN OPTIONAL,
  *     groupID                 [18] INTEGER OPTIONAL,
- *                                  -- For historical reasons, for legacy DHE or
- *                                  -- static RSA ciphers, this field contains
- *                                  -- another value to be discarded.
  *     certChain               [19] SEQUENCE OF Certificate OPTIONAL,
  *     ticketAgeAdd            [21] OCTET STRING OPTIONAL,
  *     isServer                [22] BOOLEAN DEFAULT TRUE,
@@ -692,24 +689,11 @@
   }
   ret->extended_master_secret = !!extended_master_secret;
 
-  uint32_t value;
-  if (!SSL_SESSION_parse_u32(&session, &value, kGroupIDTag, 0)) {
+  if (!SSL_SESSION_parse_u16(&session, &ret->group_id, kGroupIDTag, 0)) {
     OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SSL_SESSION);
     goto err;
   }
 
-  /* Historically, the group_id field was used for key-exchange-specific
-   * information. Discard all but the group ID. */
-  if (ret->cipher->algorithm_mkey & (SSL_kRSA | SSL_kDHE)) {
-    value = 0;
-  }
-
-  if (value > 0xffff) {
-    OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SSL_SESSION);
-    goto err;
-  }
-  ret->group_id = (uint16_t)value;
-
   CBS cert_chain;
   CBS_init(&cert_chain, NULL, 0);
   int has_cert_chain;
diff --git a/src/ssl/ssl_cert.c b/src/ssl/ssl_cert.c
index 5013b20..674db10 100644
--- a/src/ssl/ssl_cert.c
+++ b/src/ssl/ssl_cert.c
@@ -121,7 +121,6 @@
 #include <openssl/bn.h>
 #include <openssl/buf.h>
 #include <openssl/bytestring.h>
-#include <openssl/dh.h>
 #include <openssl/ec_key.h>
 #include <openssl/err.h>
 #include <openssl/mem.h>
@@ -168,15 +167,6 @@
   ret->key_method = cert->key_method;
   ret->x509_method = cert->x509_method;
 
-  if (cert->dh_tmp != NULL) {
-    ret->dh_tmp = DHparams_dup(cert->dh_tmp);
-    if (ret->dh_tmp == NULL) {
-      OPENSSL_PUT_ERROR(SSL, ERR_R_DH_LIB);
-      goto err;
-    }
-  }
-  ret->dh_tmp_cb = cert->dh_tmp_cb;
-
   if (cert->sigalgs != NULL) {
     ret->sigalgs =
         BUF_memdup(cert->sigalgs, cert->num_sigalgs * sizeof(cert->sigalgs[0]));
@@ -204,6 +194,8 @@
   ret->sid_ctx_length = cert->sid_ctx_length;
   OPENSSL_memcpy(ret->sid_ctx, cert->sid_ctx, sizeof(ret->sid_ctx));
 
+  ret->enable_early_data = cert->enable_early_data;
+
   return ret;
 
 err:
@@ -231,8 +223,6 @@
     return;
   }
 
-  DH_free(c->dh_tmp);
-
   ssl_cert_clear_certs(c);
   c->x509_method->cert_free(c);
   OPENSSL_free(c->sigalgs);
@@ -823,29 +813,28 @@
   assert(ssl3_protocol_version(ssl) < TLS1_3_VERSION);
 
   /* Check the certificate's type matches the cipher. */
-  int expected_type = ssl_cipher_get_key_type(hs->new_cipher);
-  assert(expected_type != EVP_PKEY_NONE);
-  if (pkey->type != expected_type) {
+  if (!(hs->new_cipher->algorithm_auth & ssl_cipher_auth_mask_for_key(pkey))) {
     OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_CERTIFICATE_TYPE);
     return 0;
   }
 
-  if (hs->new_cipher->algorithm_auth & SSL_aECDSA) {
+  /* Check key usages for all key types but RSA. This is needed to distinguish
+   * ECDH certificates, which we do not support, from ECDSA certificates. In
+   * principle, we should check RSA key usages based on cipher, but this breaks
+   * buggy antivirus deployments. Other key types are always used for signing.
+   *
+   * TODO(davidben): Get more recent data on RSA key usages. */
+  if (EVP_PKEY_id(pkey) != EVP_PKEY_RSA) {
     CBS leaf_cbs;
     CBS_init(&leaf_cbs, CRYPTO_BUFFER_data(leaf), CRYPTO_BUFFER_len(leaf));
-    /* ECDSA and ECDH certificates use the same public key format. Instead,
-     * they are distinguished by the key usage extension in the certificate. */
     if (!ssl_cert_check_digital_signature_key_usage(&leaf_cbs)) {
       return 0;
     }
+  }
 
-    EC_KEY *ec_key = EVP_PKEY_get0_EC_KEY(pkey);
-    if (ec_key == NULL) {
-      OPENSSL_PUT_ERROR(SSL, SSL_R_BAD_ECC_CERT);
-      return 0;
-    }
-
+  if (EVP_PKEY_id(pkey) == EVP_PKEY_EC) {
     /* Check the key's group and point format are acceptable. */
+    EC_KEY *ec_key = EVP_PKEY_get0_EC_KEY(pkey);
     uint16_t group_id;
     if (!ssl_nid_to_group_id(
             &group_id, EC_GROUP_get_curve_name(EC_KEY_get0_group(ec_key))) ||
@@ -859,6 +848,25 @@
   return 1;
 }
 
+int ssl_on_certificate_selected(SSL_HANDSHAKE *hs) {
+  SSL *const ssl = hs->ssl;
+  if (!ssl_has_certificate(ssl)) {
+    /* Nothing to do. */
+    return 1;
+  }
+
+  if (!ssl->ctx->x509_method->ssl_auto_chain_if_needed(ssl)) {
+    return 0;
+  }
+
+  CBS leaf;
+  CRYPTO_BUFFER_init_CBS(sk_CRYPTO_BUFFER_value(ssl->cert->chain, 0), &leaf);
+
+  EVP_PKEY_free(hs->local_pubkey);
+  hs->local_pubkey = ssl_cert_parse_pubkey(&leaf);
+  return hs->local_pubkey != NULL;
+}
+
 static int set_signed_cert_timestamp_list(CERT *cert, const uint8_t *list,
                                            size_t list_len) {
   CBS sct_list;
diff --git a/src/ssl/ssl_cipher.c b/src/ssl/ssl_cipher.c
index a72b541..cb62edd 100644
--- a/src/ssl/ssl_cipher.c
+++ b/src/ssl/ssl_cipher.c
@@ -193,19 +193,6 @@
      SSL_HANDSHAKE_MAC_DEFAULT,
     },
 
-#ifdef BORINGSSL_ENABLE_DHE_TLS
-    /* Cipher 33 */
-    {
-     TLS1_TXT_DHE_RSA_WITH_AES_128_SHA,
-     TLS1_CK_DHE_RSA_WITH_AES_128_SHA,
-     SSL_kDHE,
-     SSL_aRSA,
-     SSL_AES128,
-     SSL_SHA1,
-     SSL_HANDSHAKE_MAC_DEFAULT,
-    },
-#endif
-
     /* Cipher 35 */
     {
      TLS1_TXT_RSA_WITH_AES_256_SHA,
@@ -217,19 +204,6 @@
      SSL_HANDSHAKE_MAC_DEFAULT,
     },
 
-#ifdef BORINGSSL_ENABLE_DHE_TLS
-    /* Cipher 39 */
-    {
-     TLS1_TXT_DHE_RSA_WITH_AES_256_SHA,
-     TLS1_CK_DHE_RSA_WITH_AES_256_SHA,
-     SSL_kDHE,
-     SSL_aRSA,
-     SSL_AES256,
-     SSL_SHA1,
-     SSL_HANDSHAKE_MAC_DEFAULT,
-    },
-#endif
-
 
     /* TLS v1.2 ciphersuites */
 
@@ -255,30 +229,6 @@
      SSL_HANDSHAKE_MAC_SHA256,
     },
 
-#ifdef BORINGSSL_ENABLE_DHE_TLS
-    /* Cipher 67 */
-    {
-     TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256,
-     TLS1_CK_DHE_RSA_WITH_AES_128_SHA256,
-     SSL_kDHE,
-     SSL_aRSA,
-     SSL_AES128,
-     SSL_SHA256,
-     SSL_HANDSHAKE_MAC_SHA256,
-    },
-
-    /* Cipher 6B */
-    {
-     TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256,
-     TLS1_CK_DHE_RSA_WITH_AES_256_SHA256,
-     SSL_kDHE,
-     SSL_aRSA,
-     SSL_AES256,
-     SSL_SHA256,
-     SSL_HANDSHAKE_MAC_SHA256,
-    },
-#endif
-
     /* PSK cipher suites. */
 
     /* Cipher 8C */
@@ -327,30 +277,6 @@
      SSL_HANDSHAKE_MAC_SHA384,
     },
 
-#ifdef BORINGSSL_ENABLE_DHE_TLS
-    /* Cipher 9E */
-    {
-     TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256,
-     TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256,
-     SSL_kDHE,
-     SSL_aRSA,
-     SSL_AES128GCM,
-     SSL_AEAD,
-     SSL_HANDSHAKE_MAC_SHA256,
-    },
-
-    /* Cipher 9F */
-    {
-     TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384,
-     TLS1_CK_DHE_RSA_WITH_AES_256_GCM_SHA384,
-     SSL_kDHE,
-     SSL_aRSA,
-     SSL_AES256GCM,
-     SSL_AEAD,
-     SSL_HANDSHAKE_MAC_SHA384,
-    },
-#endif
-
     /* TLS 1.3 suites. */
 
     /* Cipher 1301 */
@@ -626,16 +552,9 @@
 
     /* key exchange aliases
      * (some of those using only a single bit here combine
-     * multiple key exchange algs according to the RFCs,
-     * e.g. kEDH combines DHE_DSS and DHE_RSA) */
+     * multiple key exchange algs according to the RFCs. */
     {"kRSA", SSL_kRSA, ~0u, ~0u, ~0u, 0},
 
-#ifdef BORINGSSL_ENABLE_DHE_TLS
-    {"kDHE", SSL_kDHE, ~0u, ~0u, ~0u, 0},
-    {"kEDH", SSL_kDHE, ~0u, ~0u, ~0u, 0},
-    {"DH", SSL_kDHE, ~0u, ~0u, ~0u, 0},
-#endif
-
     {"kECDHE", SSL_kECDHE, ~0u, ~0u, ~0u, 0},
     {"kEECDH", SSL_kECDHE, ~0u, ~0u, ~0u, 0},
     {"ECDH", SSL_kECDHE, ~0u, ~0u, ~0u, 0},
@@ -649,10 +568,6 @@
     {"aPSK", ~0u, SSL_aPSK, ~0u, ~0u, 0},
 
     /* aliases combining key exchange and server authentication */
-#ifdef BORINGSSL_ENABLE_DHE_TLS
-    {"DHE", SSL_kDHE, ~0u, ~0u, ~0u, 0},
-    {"EDH", SSL_kDHE, ~0u, ~0u, ~0u, 0},
-#endif
     {"ECDHE", SSL_kECDHE, ~0u, ~0u, ~0u, 0},
     {"EECDH", SSL_kECDHE, ~0u, ~0u, ~0u, 0},
     {"RSA", SSL_kRSA, SSL_aRSA, ~SSL_eNULL, ~0u, 0},
@@ -1485,10 +1400,6 @@
   return (cipher->algorithm_auth & SSL_aECDSA) != 0;
 }
 
-int SSL_CIPHER_is_DHE(const SSL_CIPHER *cipher) {
-  return (cipher->algorithm_mkey & SSL_kDHE) != 0;
-}
-
 int SSL_CIPHER_is_ECDHE(const SSL_CIPHER *cipher) {
   return (cipher->algorithm_mkey & SSL_kECDHE) != 0;
 }
@@ -1537,15 +1448,6 @@
     case SSL_kRSA:
       return "RSA";
 
-    case SSL_kDHE:
-      switch (cipher->algorithm_auth) {
-        case SSL_aRSA:
-          return "DHE_RSA";
-        default:
-          assert(0);
-          return "UNKNOWN";
-      }
-
     case SSL_kECDHE:
       switch (cipher->algorithm_auth) {
         case SSL_aECDSA:
@@ -1705,10 +1607,6 @@
       kx = "RSA";
       break;
 
-    case SSL_kDHE:
-      kx = "DH";
-      break;
-
     case SSL_kECDHE:
       kx = "ECDH";
       break;
@@ -1830,16 +1728,17 @@
 
 void SSL_COMP_free_compression_methods(void) {}
 
-int ssl_cipher_get_key_type(const SSL_CIPHER *cipher) {
-  uint32_t alg_a = cipher->algorithm_auth;
-
-  if (alg_a & SSL_aECDSA) {
-    return EVP_PKEY_EC;
-  } else if (alg_a & SSL_aRSA) {
-    return EVP_PKEY_RSA;
+uint32_t ssl_cipher_auth_mask_for_key(const EVP_PKEY *key) {
+  switch (EVP_PKEY_id(key)) {
+    case EVP_PKEY_RSA:
+      return SSL_aRSA;
+    case EVP_PKEY_EC:
+    case EVP_PKEY_ED25519:
+      /* Ed25519 keys in TLS 1.2 repurpose the ECDSA ciphers. */
+      return SSL_aECDSA;
+    default:
+      return 0;
   }
-
-  return EVP_PKEY_NONE;
 }
 
 int ssl_cipher_uses_certificate_auth(const SSL_CIPHER *cipher) {
@@ -1848,8 +1747,7 @@
 
 int ssl_cipher_requires_server_key_exchange(const SSL_CIPHER *cipher) {
   /* Ephemeral Diffie-Hellman key exchanges require a ServerKeyExchange. */
-  if (cipher->algorithm_mkey & SSL_kDHE ||
-      cipher->algorithm_mkey & SSL_kECDHE) {
+  if (cipher->algorithm_mkey & SSL_kECDHE) {
     return 1;
   }
 
diff --git a/src/ssl/ssl_ecdh.c b/src/ssl/ssl_ecdh.c
index 25e3df9..30fe7e4 100644
--- a/src/ssl/ssl_ecdh.c
+++ b/src/ssl/ssl_ecdh.c
@@ -219,85 +219,6 @@
 }
 
 
-/* Legacy DHE-based implementation. */
-
-static void ssl_dhe_cleanup(SSL_ECDH_CTX *ctx) {
-  DH_free((DH *)ctx->data);
-}
-
-static int ssl_dhe_offer(SSL_ECDH_CTX *ctx, CBB *out) {
-  DH *dh = (DH *)ctx->data;
-  /* The group must have been initialized already, but not the key. */
-  assert(dh != NULL);
-  assert(dh->priv_key == NULL);
-
-  /* Due to a bug in yaSSL, the public key must be zero padded to the size of
-   * the prime. */
-  return DH_generate_key(dh) &&
-         BN_bn2cbb_padded(out, BN_num_bytes(dh->p), dh->pub_key);
-}
-
-static int ssl_dhe_finish(SSL_ECDH_CTX *ctx, uint8_t **out_secret,
-                          size_t *out_secret_len, uint8_t *out_alert,
-                          const uint8_t *peer_key, size_t peer_key_len) {
-  DH *dh = (DH *)ctx->data;
-  assert(dh != NULL);
-  assert(dh->priv_key != NULL);
-  *out_alert = SSL_AD_INTERNAL_ERROR;
-
-  int secret_len = 0;
-  uint8_t *secret = NULL;
-  BIGNUM *peer_point = BN_bin2bn(peer_key, peer_key_len, NULL);
-  if (peer_point == NULL) {
-    goto err;
-  }
-
-  secret = OPENSSL_malloc(DH_size(dh));
-  if (secret == NULL) {
-    goto err;
-  }
-  secret_len = DH_compute_key(secret, peer_point, dh);
-  if (secret_len <= 0) {
-    goto err;
-  }
-
-  *out_secret = secret;
-  *out_secret_len = (size_t)secret_len;
-  BN_free(peer_point);
-  return 1;
-
-err:
-  if (secret_len > 0) {
-    OPENSSL_cleanse(secret, (size_t)secret_len);
-  }
-  OPENSSL_free(secret);
-  BN_free(peer_point);
-  return 0;
-}
-
-static int ssl_dhe_accept(SSL_ECDH_CTX *ctx, CBB *out_public_key,
-                          uint8_t **out_secret, size_t *out_secret_len,
-                          uint8_t *out_alert, const uint8_t *peer_key,
-                          size_t peer_key_len) {
-  *out_alert = SSL_AD_INTERNAL_ERROR;
-  if (!ssl_dhe_offer(ctx, out_public_key) ||
-      !ssl_dhe_finish(ctx, out_secret, out_secret_len, out_alert, peer_key,
-                      peer_key_len)) {
-    return 0;
-  }
-  return 1;
-}
-
-static const SSL_ECDH_METHOD kDHEMethod = {
-    NID_undef, 0, "",
-    ssl_dhe_cleanup,
-    ssl_dhe_offer,
-    ssl_dhe_accept,
-    ssl_dhe_finish,
-    CBS_get_u16_length_prefixed,
-    CBB_add_u16_length_prefixed,
-};
-
 static const SSL_ECDH_METHOD kMethods[] = {
     {
         NID_secp224r1,
@@ -307,8 +228,6 @@
         ssl_ec_point_offer,
         ssl_ec_point_accept,
         ssl_ec_point_finish,
-        CBS_get_u8_length_prefixed,
-        CBB_add_u8_length_prefixed,
     },
     {
         NID_X9_62_prime256v1,
@@ -318,8 +237,6 @@
         ssl_ec_point_offer,
         ssl_ec_point_accept,
         ssl_ec_point_finish,
-        CBS_get_u8_length_prefixed,
-        CBB_add_u8_length_prefixed,
     },
     {
         NID_secp384r1,
@@ -329,8 +246,6 @@
         ssl_ec_point_offer,
         ssl_ec_point_accept,
         ssl_ec_point_finish,
-        CBS_get_u8_length_prefixed,
-        CBB_add_u8_length_prefixed,
     },
     {
         NID_secp521r1,
@@ -340,8 +255,6 @@
         ssl_ec_point_offer,
         ssl_ec_point_accept,
         ssl_ec_point_finish,
-        CBS_get_u8_length_prefixed,
-        CBB_add_u8_length_prefixed,
     },
     {
         NID_X25519,
@@ -351,8 +264,6 @@
         ssl_x25519_offer,
         ssl_x25519_accept,
         ssl_x25519_finish,
-        CBS_get_u8_length_prefixed,
-        CBB_add_u8_length_prefixed,
     },
 };
 
@@ -422,13 +333,6 @@
   return 1;
 }
 
-void SSL_ECDH_CTX_init_for_dhe(SSL_ECDH_CTX *ctx, DH *params) {
-  SSL_ECDH_CTX_cleanup(ctx);
-
-  ctx->method = &kDHEMethod;
-  ctx->data = params;
-}
-
 void SSL_ECDH_CTX_cleanup(SSL_ECDH_CTX *ctx) {
   if (ctx->method == NULL) {
     return;
@@ -442,20 +346,6 @@
   return ctx->method->group_id;
 }
 
-int SSL_ECDH_CTX_get_key(SSL_ECDH_CTX *ctx, CBS *cbs, CBS *out) {
-  if (ctx->method == NULL) {
-    return 0;
-  }
-  return ctx->method->get_key(cbs, out);
-}
-
-int SSL_ECDH_CTX_add_key(SSL_ECDH_CTX *ctx, CBB *cbb, CBB *out_contents) {
-  if (ctx->method == NULL) {
-    return 0;
-  }
-  return ctx->method->add_key(cbb, out_contents);
-}
-
 int SSL_ECDH_CTX_offer(SSL_ECDH_CTX *ctx, CBB *out_public_key) {
   return ctx->method->offer(ctx, out_public_key);
 }
diff --git a/src/ssl/ssl_lib.c b/src/ssl/ssl_lib.c
index d01f6a2..0806084 100644
--- a/src/ssl/ssl_lib.c
+++ b/src/ssl/ssl_lib.c
@@ -146,7 +146,6 @@
 
 #include <openssl/bytestring.h>
 #include <openssl/crypto.h>
-#include <openssl/dh.h>
 #include <openssl/err.h>
 #include <openssl/lhash.h>
 #include <openssl/mem.h>
@@ -296,9 +295,12 @@
   ret->mode = SSL_MODE_NO_AUTO_CHAIN;
 
   /* Lock the SSL_CTX to the specified version, for compatibility with legacy
-   * uses of SSL_METHOD. */
+   * uses of SSL_METHOD, but we do not set the minimum version for
+   * |SSLv3_method|. */
   if (!SSL_CTX_set_max_proto_version(ret, method->version) ||
-      !SSL_CTX_set_min_proto_version(ret, method->version)) {
+      !SSL_CTX_set_min_proto_version(ret, method->version == SSL3_VERSION
+                                              ? 0 /* default */
+                                              : method->version)) {
     OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
     goto err2;
   }
@@ -348,6 +350,7 @@
   OPENSSL_free(ctx->supported_group_list);
   OPENSSL_free(ctx->alpn_client_proto_list);
   EVP_PKEY_free(ctx->tlsext_channel_id_private);
+  OPENSSL_free(ctx->verify_sigalgs);
 
   OPENSSL_free(ctx);
 }
@@ -832,7 +835,11 @@
 }
 
 void SSL_CTX_set_early_data_enabled(SSL_CTX *ctx, int enabled) {
-  ctx->enable_early_data = !!enabled;
+  ctx->cert->enable_early_data = !!enabled;
+}
+
+void SSL_set_early_data_enabled(SSL *ssl, int enabled) {
+  ssl->cert->enable_early_data = !!enabled;
 }
 
 int SSL_early_data_accepted(const SSL *ssl) {
@@ -941,6 +948,10 @@
   /* Zero is interpreted as the default minimum version. */
   if (version == 0) {
     *out = method->min_version;
+    /* SSL 3.0 is disabled unless explicitly enabled. */
+    if (*out < TLS1_VERSION) {
+      *out = TLS1_VERSION;
+    }
     return 1;
   }
 
@@ -1455,22 +1466,10 @@
 }
 
 int SSL_CTX_set_tmp_dh(SSL_CTX *ctx, const DH *dh) {
-  DH_free(ctx->cert->dh_tmp);
-  ctx->cert->dh_tmp = DHparams_dup(dh);
-  if (ctx->cert->dh_tmp == NULL) {
-    OPENSSL_PUT_ERROR(SSL, ERR_R_DH_LIB);
-    return 0;
-  }
   return 1;
 }
 
 int SSL_set_tmp_dh(SSL *ssl, const DH *dh) {
-  DH_free(ssl->cert->dh_tmp);
-  ssl->cert->dh_tmp = DHparams_dup(dh);
-  if (ssl->cert->dh_tmp == NULL) {
-    OPENSSL_PUT_ERROR(SSL, ERR_R_DH_LIB);
-    return 0;
-  }
   return 1;
 }
 
@@ -1749,6 +1748,9 @@
   }
 }
 
+void SSL_CTX_set_allow_unknown_alpn_protos(SSL_CTX *ctx, int enabled) {
+  ctx->allow_unknown_alpn_protos = !!enabled;
+}
 
 void SSL_CTX_set_tls_channel_id_enabled(SSL_CTX *ctx, int enabled) {
   ctx->tlsext_channel_id_enabled = !!enabled;
@@ -2096,12 +2098,10 @@
 void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,
                                  DH *(*callback)(SSL *ssl, int is_export,
                                                  int keylength)) {
-  ctx->cert->dh_tmp_cb = callback;
 }
 
 void SSL_set_tmp_dh_callback(SSL *ssl, DH *(*callback)(SSL *ssl, int is_export,
                                                        int keylength)) {
-  ssl->cert->dh_tmp_cb = callback;
 }
 
 int SSL_CTX_use_psk_identity_hint(SSL_CTX *ctx, const char *identity_hint) {
@@ -2391,7 +2391,7 @@
   }
 
   if (!any_enabled) {
-    OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_SSL_VERSION);
+    OPENSSL_PUT_ERROR(SSL, SSL_R_NO_SUPPORTED_VERSIONS_ENABLED);
     return 0;
   }
 
diff --git a/src/ssl/ssl_privkey.c b/src/ssl/ssl_privkey.c
index e988827..f429c1d 100644
--- a/src/ssl/ssl_privkey.c
+++ b/src/ssl/ssl_privkey.c
@@ -66,10 +66,12 @@
 #include <openssl/type_check.h>
 
 #include "internal.h"
+#include "../crypto/internal.h"
 
 
 int ssl_is_key_type_supported(int key_type) {
-  return key_type == EVP_PKEY_RSA || key_type == EVP_PKEY_EC;
+  return key_type == EVP_PKEY_RSA || key_type == EVP_PKEY_EC ||
+         key_type == EVP_PKEY_ED25519;
 }
 
 static int ssl_set_pkey(CERT *cert, EVP_PKEY *pkey) {
@@ -220,30 +222,38 @@
   ctx->cert->key_method = key_method;
 }
 
-static int set_signing_algorithm_prefs(CERT *cert, const uint16_t *prefs,
-                                       size_t num_prefs) {
-  OPENSSL_free(cert->sigalgs);
+static int set_algorithm_prefs(uint16_t **out_prefs, size_t *out_num_prefs,
+                               const uint16_t *prefs, size_t num_prefs) {
+  OPENSSL_free(*out_prefs);
 
-  cert->num_sigalgs = 0;
-  cert->sigalgs = BUF_memdup(prefs, num_prefs * sizeof(prefs[0]));
-  if (cert->sigalgs == NULL) {
+  *out_num_prefs = 0;
+  *out_prefs = BUF_memdup(prefs, num_prefs * sizeof(prefs[0]));
+  if (*out_prefs == NULL) {
     OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE);
     return 0;
   }
-  cert->num_sigalgs = num_prefs;
+  *out_num_prefs = num_prefs;
 
   return 1;
 }
 
 int SSL_CTX_set_signing_algorithm_prefs(SSL_CTX *ctx, const uint16_t *prefs,
                                         size_t num_prefs) {
-  return set_signing_algorithm_prefs(ctx->cert, prefs, num_prefs);
+  return set_algorithm_prefs(&ctx->cert->sigalgs, &ctx->cert->num_sigalgs,
+                             prefs, num_prefs);
 }
 
 
 int SSL_set_signing_algorithm_prefs(SSL *ssl, const uint16_t *prefs,
                                     size_t num_prefs) {
-  return set_signing_algorithm_prefs(ssl->cert, prefs, num_prefs);
+  return set_algorithm_prefs(&ssl->cert->sigalgs, &ssl->cert->num_sigalgs,
+                             prefs, num_prefs);
+}
+
+int SSL_CTX_set_verify_algorithm_prefs(SSL_CTX *ctx, const uint16_t *prefs,
+                                       size_t num_prefs) {
+  return set_algorithm_prefs(&ctx->verify_sigalgs, &ctx->num_verify_sigalgs,
+                             prefs, num_prefs);
 }
 
 int SSL_set_private_key_digest_prefs(SSL *ssl, const int *digest_nids,
@@ -294,250 +304,121 @@
   return 1;
 }
 
+typedef struct {
+  uint16_t sigalg;
+  int pkey_type;
+  int curve;
+  const EVP_MD *(*digest_func)(void);
+  char is_rsa_pss;
+} SSL_SIGNATURE_ALGORITHM;
+
+static const SSL_SIGNATURE_ALGORITHM kSignatureAlgorithms[] = {
+    {SSL_SIGN_RSA_PKCS1_MD5_SHA1, EVP_PKEY_RSA, NID_undef, &EVP_md5_sha1, 0},
+    {SSL_SIGN_RSA_PKCS1_SHA1, EVP_PKEY_RSA, NID_undef, &EVP_sha1, 0},
+    {SSL_SIGN_RSA_PKCS1_SHA256, EVP_PKEY_RSA, NID_undef, &EVP_sha256, 0},
+    {SSL_SIGN_RSA_PKCS1_SHA384, EVP_PKEY_RSA, NID_undef, &EVP_sha384, 0},
+    {SSL_SIGN_RSA_PKCS1_SHA512, EVP_PKEY_RSA, NID_undef, &EVP_sha512, 0},
+
+    {SSL_SIGN_RSA_PSS_SHA256, EVP_PKEY_RSA, NID_undef, &EVP_sha256, 1},
+    {SSL_SIGN_RSA_PSS_SHA384, EVP_PKEY_RSA, NID_undef, &EVP_sha384, 1},
+    {SSL_SIGN_RSA_PSS_SHA512, EVP_PKEY_RSA, NID_undef, &EVP_sha512, 1},
+
+    {SSL_SIGN_ECDSA_SHA1, EVP_PKEY_EC, NID_undef, &EVP_sha1, 0},
+    {SSL_SIGN_ECDSA_SECP256R1_SHA256, EVP_PKEY_EC, NID_X9_62_prime256v1,
+     &EVP_sha256, 0},
+    {SSL_SIGN_ECDSA_SECP384R1_SHA384, EVP_PKEY_EC, NID_secp384r1, &EVP_sha384,
+     0},
+    {SSL_SIGN_ECDSA_SECP521R1_SHA512, EVP_PKEY_EC, NID_secp521r1, &EVP_sha512,
+     0},
+
+    {SSL_SIGN_ED25519, EVP_PKEY_ED25519, NID_undef, NULL, 0},
+};
+
+static const SSL_SIGNATURE_ALGORITHM *get_signature_algorithm(uint16_t sigalg) {
+  for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kSignatureAlgorithms); i++) {
+    if (kSignatureAlgorithms[i].sigalg == sigalg) {
+      return &kSignatureAlgorithms[i];
+    }
+  }
+  return NULL;
+}
+
 int ssl_has_private_key(const SSL *ssl) {
   return ssl->cert->privatekey != NULL || ssl->cert->key_method != NULL;
 }
 
-int ssl_is_ecdsa_key_type(int type) {
-  switch (type) {
-    case NID_secp224r1:
-    case NID_X9_62_prime256v1:
-    case NID_secp384r1:
-    case NID_secp521r1:
-      return 1;
-    default:
+static int pkey_supports_algorithm(const SSL *ssl, EVP_PKEY *pkey,
+                                   uint16_t sigalg) {
+  const SSL_SIGNATURE_ALGORITHM *alg = get_signature_algorithm(sigalg);
+  if (alg == NULL ||
+      EVP_PKEY_id(pkey) != alg->pkey_type) {
+    return 0;
+  }
+
+  if (ssl3_protocol_version(ssl) >= TLS1_3_VERSION) {
+    /* RSA keys may only be used with RSA-PSS. */
+    if (alg->pkey_type == EVP_PKEY_RSA && !alg->is_rsa_pss) {
       return 0;
-  }
-}
+    }
 
-int ssl_private_key_type(SSL *ssl) {
-  if (ssl->cert->key_method != NULL) {
-    return ssl->cert->key_method->type(ssl);
-  }
-  switch (EVP_PKEY_id(ssl->cert->privatekey)) {
-    case EVP_PKEY_RSA:
-      return NID_rsaEncryption;
-    case EVP_PKEY_EC:
-      return EC_GROUP_get_curve_name(
-          EC_KEY_get0_group(EVP_PKEY_get0_EC_KEY(ssl->cert->privatekey)));
-    default:
-      return NID_undef;
-  }
-}
-
-size_t ssl_private_key_max_signature_len(SSL *ssl) {
-  if (ssl->cert->key_method != NULL) {
-    return ssl->cert->key_method->max_signature_len(ssl);
-  }
-  return EVP_PKEY_size(ssl->cert->privatekey);
-}
-
-/* TODO(davidben): Forbid RSA-PKCS1 in TLS 1.3. For now we allow it because NSS
- * has yet to start doing RSA-PSS, so enforcing it would complicate interop
- * testing. */
-static int is_rsa_pkcs1(const EVP_MD **out_md, uint16_t sigalg) {
-  switch (sigalg) {
-    case SSL_SIGN_RSA_PKCS1_MD5_SHA1:
-      *out_md = EVP_md5_sha1();
-      return 1;
-    case SSL_SIGN_RSA_PKCS1_SHA1:
-      *out_md = EVP_sha1();
-      return 1;
-    case SSL_SIGN_RSA_PKCS1_SHA256:
-      *out_md = EVP_sha256();
-      return 1;
-    case SSL_SIGN_RSA_PKCS1_SHA384:
-      *out_md = EVP_sha384();
-      return 1;
-    case SSL_SIGN_RSA_PKCS1_SHA512:
-      *out_md = EVP_sha512();
-      return 1;
-    default:
+    /* EC keys have a curve requirement. */
+    if (alg->pkey_type == EVP_PKEY_EC &&
+        (alg->curve == NID_undef ||
+         EC_GROUP_get_curve_name(
+             EC_KEY_get0_group(EVP_PKEY_get0_EC_KEY(pkey))) != alg->curve)) {
       return 0;
+    }
   }
+
+  return 1;
 }
 
-static int ssl_sign_rsa_pkcs1(SSL *ssl, uint8_t *out, size_t *out_len,
-                              size_t max_out, const EVP_MD *md,
-                              const uint8_t *in, size_t in_len) {
-  EVP_MD_CTX ctx;
-  EVP_MD_CTX_init(&ctx);
-  *out_len = max_out;
-  int ret = EVP_DigestSignInit(&ctx, NULL, md, NULL, ssl->cert->privatekey) &&
-            EVP_DigestSignUpdate(&ctx, in, in_len) &&
-            EVP_DigestSignFinal(&ctx, out, out_len);
-  EVP_MD_CTX_cleanup(&ctx);
-  return ret;
-}
-
-static int ssl_verify_rsa_pkcs1(SSL *ssl, const uint8_t *signature,
-                                size_t signature_len, const EVP_MD *md,
-                                EVP_PKEY *pkey, const uint8_t *in,
-                                size_t in_len) {
-  if (pkey->type != EVP_PKEY_RSA) {
+static int setup_ctx(SSL *ssl, EVP_PKEY_CTX *ctx, uint16_t sigalg) {
+  if (!pkey_supports_algorithm(ssl, EVP_PKEY_CTX_get0_pkey(ctx), sigalg)) {
     OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_SIGNATURE_TYPE);
     return 0;
   }
 
-  EVP_MD_CTX md_ctx;
-  EVP_MD_CTX_init(&md_ctx);
-  int ret = EVP_DigestVerifyInit(&md_ctx, NULL, md, NULL, pkey) &&
-            EVP_DigestVerifyUpdate(&md_ctx, in, in_len) &&
-            EVP_DigestVerifyFinal(&md_ctx, signature, signature_len);
-  EVP_MD_CTX_cleanup(&md_ctx);
-  return ret;
-}
+  const SSL_SIGNATURE_ALGORITHM *alg = get_signature_algorithm(sigalg);
+  if (alg->digest_func != NULL &&
+      !EVP_PKEY_CTX_set_signature_md(ctx, alg->digest_func())) {
+    return 0;
+  }
 
-static int is_ecdsa(int *out_curve, const EVP_MD **out_md, uint16_t sigalg) {
-  switch (sigalg) {
-    case SSL_SIGN_ECDSA_SHA1:
-      *out_curve = NID_undef;
-      *out_md = EVP_sha1();
-      return 1;
-    case SSL_SIGN_ECDSA_SECP256R1_SHA256:
-      *out_curve = NID_X9_62_prime256v1;
-      *out_md = EVP_sha256();
-      return 1;
-    case SSL_SIGN_ECDSA_SECP384R1_SHA384:
-      *out_curve = NID_secp384r1;
-      *out_md = EVP_sha384();
-      return 1;
-    case SSL_SIGN_ECDSA_SECP521R1_SHA512:
-      *out_curve = NID_secp521r1;
-      *out_md = EVP_sha512();
-      return 1;
-    default:
+  if (alg->is_rsa_pss) {
+    if (!EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PSS_PADDING) ||
+        !EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, -1 /* salt len = hash len */)) {
       return 0;
+    }
   }
+
+  return 1;
 }
 
-static int ssl_sign_ecdsa(SSL *ssl, uint8_t *out, size_t *out_len,
-                          size_t max_out, int curve, const EVP_MD *md,
-                          const uint8_t *in, size_t in_len) {
-  EC_KEY *ec_key = EVP_PKEY_get0_EC_KEY(ssl->cert->privatekey);
-  if (ec_key == NULL) {
-    OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_SIGNATURE_TYPE);
-    return 0;
-  }
-
-  /* In TLS 1.3, the curve is also specified by the signature algorithm. */
-  if (ssl3_protocol_version(ssl) >= TLS1_3_VERSION &&
-      (curve == NID_undef ||
-       EC_GROUP_get_curve_name(EC_KEY_get0_group(ec_key)) != curve)) {
-    OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_SIGNATURE_TYPE);
-    return 0;
-  }
-
-  EVP_MD_CTX ctx;
-  EVP_MD_CTX_init(&ctx);
-  *out_len = max_out;
-  int ret = EVP_DigestSignInit(&ctx, NULL, md, NULL, ssl->cert->privatekey) &&
-            EVP_DigestSignUpdate(&ctx, in, in_len) &&
-            EVP_DigestSignFinal(&ctx, out, out_len);
-  EVP_MD_CTX_cleanup(&ctx);
-  return ret;
-}
-
-static int ssl_verify_ecdsa(SSL *ssl, const uint8_t *signature,
-                            size_t signature_len, int curve, const EVP_MD *md,
-                            EVP_PKEY *pkey, const uint8_t *in, size_t in_len) {
-  EC_KEY *ec_key = EVP_PKEY_get0_EC_KEY(pkey);
-  if (ec_key == NULL) {
-    OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_SIGNATURE_TYPE);
-    return 0;
-  }
-
-  /* In TLS 1.3, the curve is also specified by the signature algorithm. */
-  if (ssl3_protocol_version(ssl) >= TLS1_3_VERSION &&
-      (curve == NID_undef ||
-       EC_GROUP_get_curve_name(EC_KEY_get0_group(ec_key)) != curve)) {
-    OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_SIGNATURE_TYPE);
-    return 0;
-  }
-
-  EVP_MD_CTX md_ctx;
-  EVP_MD_CTX_init(&md_ctx);
-  int ret = EVP_DigestVerifyInit(&md_ctx, NULL, md, NULL, pkey) &&
-            EVP_DigestVerifyUpdate(&md_ctx, in, in_len) &&
-            EVP_DigestVerifyFinal(&md_ctx, signature, signature_len);
-  EVP_MD_CTX_cleanup(&md_ctx);
-  return ret;
-}
-
-static int is_rsa_pss(const EVP_MD **out_md, uint16_t sigalg) {
-  switch (sigalg) {
-    case SSL_SIGN_RSA_PSS_SHA256:
-      *out_md = EVP_sha256();
-      return 1;
-    case SSL_SIGN_RSA_PSS_SHA384:
-      *out_md = EVP_sha384();
-      return 1;
-    case SSL_SIGN_RSA_PSS_SHA512:
-      *out_md = EVP_sha512();
-      return 1;
-    default:
-      return 0;
-  }
-}
-
-static int ssl_sign_rsa_pss(SSL *ssl, uint8_t *out, size_t *out_len,
-                              size_t max_out, const EVP_MD *md,
-                              const uint8_t *in, size_t in_len) {
-  EVP_MD_CTX ctx;
-  EVP_MD_CTX_init(&ctx);
-  *out_len = max_out;
-  EVP_PKEY_CTX *pctx;
-  int ret =
-      EVP_DigestSignInit(&ctx, &pctx, md, NULL, ssl->cert->privatekey) &&
-      EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) &&
-      EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1 /* salt len = hash len */) &&
-      EVP_DigestSignUpdate(&ctx, in, in_len) &&
-      EVP_DigestSignFinal(&ctx, out, out_len);
-  EVP_MD_CTX_cleanup(&ctx);
-  return ret;
-}
-
-static int ssl_verify_rsa_pss(SSL *ssl, const uint8_t *signature,
-                                size_t signature_len, const EVP_MD *md,
-                                EVP_PKEY *pkey, const uint8_t *in,
-                                size_t in_len) {
-  if (pkey->type != EVP_PKEY_RSA) {
-    OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_SIGNATURE_TYPE);
-    return 0;
-  }
-
-  EVP_MD_CTX md_ctx;
-  EVP_MD_CTX_init(&md_ctx);
-  EVP_PKEY_CTX *pctx;
-  int ret =
-      EVP_DigestVerifyInit(&md_ctx, &pctx, md, NULL, pkey) &&
-      EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) &&
-      EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1 /* salt len = hash len */) &&
-      EVP_DigestVerifyUpdate(&md_ctx, in, in_len) &&
-      EVP_DigestVerifyFinal(&md_ctx, signature, signature_len);
-  EVP_MD_CTX_cleanup(&md_ctx);
-  return ret;
+static int legacy_sign_digest_supported(const SSL_SIGNATURE_ALGORITHM *alg) {
+  return (alg->pkey_type == EVP_PKEY_EC || alg->pkey_type == EVP_PKEY_RSA) &&
+         !alg->is_rsa_pss;
 }
 
 enum ssl_private_key_result_t ssl_private_key_sign(
     SSL *ssl, uint8_t *out, size_t *out_len, size_t max_out,
-    uint16_t signature_algorithm, const uint8_t *in, size_t in_len) {
+    uint16_t sigalg, const uint8_t *in, size_t in_len) {
   if (ssl->cert->key_method != NULL) {
     if (ssl->cert->key_method->sign != NULL) {
-      return ssl->cert->key_method->sign(ssl, out, out_len, max_out,
-                                         signature_algorithm, in, in_len);
+      return ssl->cert->key_method->sign(ssl, out, out_len, max_out, sigalg, in,
+                                         in_len);
     }
 
     /* TODO(davidben): Remove support for |sign_digest|-only
      * |SSL_PRIVATE_KEY_METHOD|s. */
-    const EVP_MD *md;
-    int curve;
-    if (!is_rsa_pkcs1(&md, signature_algorithm) &&
-        !is_ecdsa(&curve, &md, signature_algorithm)) {
+    const SSL_SIGNATURE_ALGORITHM *alg = get_signature_algorithm(sigalg);
+    if (alg == NULL ||
+        !legacy_sign_digest_supported(alg)) {
       OPENSSL_PUT_ERROR(SSL, SSL_R_UNSUPPORTED_PROTOCOL_FOR_CUSTOM_KEY);
       return ssl_private_key_failure;
     }
 
+    const EVP_MD *md = alg->digest_func();
     uint8_t hash[EVP_MAX_MD_SIZE];
     unsigned hash_len;
     if (!EVP_Digest(in, in_len, hash, &hash_len, md, NULL)) {
@@ -548,54 +429,26 @@
                                               hash, hash_len);
   }
 
-  const EVP_MD *md;
-  if (is_rsa_pkcs1(&md, signature_algorithm) &&
-      ssl3_protocol_version(ssl) < TLS1_3_VERSION) {
-    return ssl_sign_rsa_pkcs1(ssl, out, out_len, max_out, md, in, in_len)
-               ? ssl_private_key_success
-               : ssl_private_key_failure;
-  }
-
-  int curve;
-  if (is_ecdsa(&curve, &md, signature_algorithm)) {
-    return ssl_sign_ecdsa(ssl, out, out_len, max_out, curve, md, in, in_len)
-               ? ssl_private_key_success
-               : ssl_private_key_failure;
-  }
-
-  if (is_rsa_pss(&md, signature_algorithm)) {
-    return ssl_sign_rsa_pss(ssl, out, out_len, max_out, md, in, in_len)
-               ? ssl_private_key_success
-               : ssl_private_key_failure;
-  }
-
-  OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_SIGNATURE_TYPE);
-  return ssl_private_key_failure;
+  *out_len = max_out;
+  EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(ssl->cert->privatekey, NULL);
+  int ret = ctx != NULL &&
+            EVP_PKEY_sign_init(ctx) &&
+            setup_ctx(ssl, ctx, sigalg) &&
+            EVP_PKEY_sign_message(ctx, out, out_len, in, in_len);
+  EVP_PKEY_CTX_free(ctx);
+  return ret ? ssl_private_key_success : ssl_private_key_failure;
 }
 
 int ssl_public_key_verify(SSL *ssl, const uint8_t *signature,
                           size_t signature_len, uint16_t signature_algorithm,
                           EVP_PKEY *pkey, const uint8_t *in, size_t in_len) {
-  const EVP_MD *md;
-  if (is_rsa_pkcs1(&md, signature_algorithm) &&
-      ssl3_protocol_version(ssl) < TLS1_3_VERSION) {
-    return ssl_verify_rsa_pkcs1(ssl, signature, signature_len, md, pkey, in,
-                                in_len);
-  }
-
-  int curve;
-  if (is_ecdsa(&curve, &md, signature_algorithm)) {
-    return ssl_verify_ecdsa(ssl, signature, signature_len, curve, md, pkey, in,
-                            in_len);
-  }
-
-  if (is_rsa_pss(&md, signature_algorithm)) {
-    return ssl_verify_rsa_pss(ssl, signature, signature_len, md, pkey, in,
-                              in_len);
-  }
-
-  OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_SIGNATURE_TYPE);
-  return 0;
+  EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(pkey, NULL);
+  int ret = ctx != NULL &&
+            EVP_PKEY_verify_init(ctx) &&
+            setup_ctx(ssl, ctx, signature_algorithm) &&
+            EVP_PKEY_verify_message(ctx, signature, signature_len, in, in_len);
+  EVP_PKEY_CTX_free(ctx);
+  return ret;
 }
 
 enum ssl_private_key_result_t ssl_private_key_decrypt(
@@ -628,51 +481,33 @@
   return ssl->cert->key_method->complete(ssl, out, out_len, max_out);
 }
 
-int ssl_private_key_supports_signature_algorithm(SSL *ssl,
-                                                 uint16_t signature_algorithm) {
-  const EVP_MD *md;
-  if (is_rsa_pkcs1(&md, signature_algorithm) &&
-      ssl3_protocol_version(ssl) < TLS1_3_VERSION) {
-    return ssl_private_key_type(ssl) == NID_rsaEncryption;
+int ssl_private_key_supports_signature_algorithm(SSL_HANDSHAKE *hs,
+                                                 uint16_t sigalg) {
+  SSL *const ssl = hs->ssl;
+  if (!pkey_supports_algorithm(ssl, hs->local_pubkey, sigalg)) {
+    return 0;
   }
 
-  int curve;
-  if (is_ecdsa(&curve, &md, signature_algorithm)) {
-    int type = ssl_private_key_type(ssl);
-    if (!ssl_is_ecdsa_key_type(type)) {
-      return 0;
-    }
-
-    /* Prior to TLS 1.3, ECDSA curves did not match the signature algorithm. */
-    if (ssl3_protocol_version(ssl) < TLS1_3_VERSION) {
-      return 1;
-    }
-
-    return curve != NID_undef && type == curve;
+  /* Ensure the RSA key is large enough for the hash. RSASSA-PSS requires that
+   * emLen be at least hLen + sLen + 2. Both hLen and sLen are the size of the
+   * hash in TLS. Reasonable RSA key sizes are large enough for the largest
+   * defined RSASSA-PSS algorithm, but 1024-bit RSA is slightly too small for
+   * SHA-512. 1024-bit RSA is sometimes used for test credentials, so check the
+   * size so that we can fall back to another algorithm in that case. */
+  const SSL_SIGNATURE_ALGORITHM *alg = get_signature_algorithm(sigalg);
+  if (alg->is_rsa_pss &&
+      (size_t)EVP_PKEY_size(hs->local_pubkey) <
+          2 * EVP_MD_size(alg->digest_func()) + 2) {
+    return 0;
   }
 
-  if (is_rsa_pss(&md, signature_algorithm)) {
-    if (ssl_private_key_type(ssl) != NID_rsaEncryption) {
-      return 0;
-    }
-
-    /* Ensure the RSA key is large enough for the hash. RSASSA-PSS requires that
-     * emLen be at least hLen + sLen + 2. Both hLen and sLen are the size of the
-     * hash in TLS. Reasonable RSA key sizes are large enough for the largest
-     * defined RSASSA-PSS algorithm, but 1024-bit RSA is slightly too large for
-     * SHA-512. 1024-bit RSA is sometimes used for test credentials, so check
-     * the size to fall back to another algorithm. */
-    if (ssl_private_key_max_signature_len(ssl) < 2 * EVP_MD_size(md) + 2) {
-      return 0;
-    }
-
-    /* RSA-PSS is only supported by message-based private keys. */
-    if (ssl->cert->key_method != NULL && ssl->cert->key_method->sign == NULL) {
-      return 0;
-    }
-
-    return 1;
+  /* Newer algorithms require message-based private keys.
+   * TODO(davidben): Remove this check when sign_digest is gone. */
+  if (ssl->cert->key_method != NULL &&
+      ssl->cert->key_method->sign == NULL &&
+      !legacy_sign_digest_supported(alg)) {
+    return 0;
   }
 
-  return 0;
+  return 1;
 }
diff --git a/src/ssl/ssl_test.cc b/src/ssl/ssl_test.cc
index 6678b57..3296c17 100644
--- a/src/ssl/ssl_test.cc
+++ b/src/ssl/ssl_test.cc
@@ -126,16 +126,10 @@
     // ECDHE_RSA.
     {
         "ALL:-kECDHE:"
-#ifdef BORINGSSL_ENABLE_DHE_TLS
-        "-kDHE:"
-#endif
         "-kRSA:-ALL:"
         "AESGCM+AES128+aRSA",
         {
             {TLS1_CK_RSA_WITH_AES_128_GCM_SHA256, 0},
-#ifdef BORINGSSL_ENABLE_DHE_TLS
-            {TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256, 0},
-#endif
             {TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0},
         },
         false,
@@ -188,9 +182,6 @@
     {
         // To simplify things, banish all but {ECDHE_RSA,RSA} x
         // {CHACHA20,AES_256_CBC,AES_128_CBC} x SHA1.
-#ifdef BORINGSSL_ENABLE_DHE_TLS
-        "!kEDH:"
-#endif
         "!AESGCM:!3DES:!SHA256:!SHA384:"
         // Order some ciphers backwards by strength.
         "ALL:-CHACHA20:-AES256:-AES128:-ALL:"
@@ -800,11 +791,6 @@
 static const CIPHER_RFC_NAME_TEST kCipherRFCNameTests[] = {
     {SSL3_CK_RSA_DES_192_CBC3_SHA, "TLS_RSA_WITH_3DES_EDE_CBC_SHA"},
     {TLS1_CK_RSA_WITH_AES_128_SHA, "TLS_RSA_WITH_AES_128_CBC_SHA"},
-#ifdef BORINGSSL_ENABLE_DHE_TLS
-    {TLS1_CK_DHE_RSA_WITH_AES_256_SHA, "TLS_DHE_RSA_WITH_AES_256_CBC_SHA"},
-    {TLS1_CK_DHE_RSA_WITH_AES_256_SHA256,
-     "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256"},
-#endif
     {TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256,
      "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"},
     {TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384,
@@ -1850,13 +1836,10 @@
   bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
   // Our default cipher list varies by CPU capabilities, so manually place the
   // ChaCha20 ciphers in front.
-  const char* cipher_list =
-#ifdef BORINGSSL_ENABLE_DHE_TLS
-      "!DHE:CHACHA20:ALL";
-#else
-      "CHACHA20:ALL";
-#endif
+  const char* cipher_list = "CHACHA20:ALL";
   if (!ctx ||
+      // SSLv3 is off by default.
+      !SSL_CTX_set_min_proto_version(ctx.get(), SSL3_VERSION) ||
       !SSL_CTX_set_max_proto_version(ctx.get(), version) ||
       !SSL_CTX_set_strict_cipher_list(ctx.get(), cipher_list)) {
     return false;
@@ -2650,7 +2633,13 @@
   EXPECT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), 0));
   EXPECT_EQ(TLS1_2_VERSION, ctx->max_version);
   EXPECT_TRUE(SSL_CTX_set_min_proto_version(ctx.get(), 0));
+  EXPECT_EQ(TLS1_VERSION, ctx->min_version);
+
+  // SSL 3.0 and TLS 1.3 are available, but not by default.
+  EXPECT_TRUE(SSL_CTX_set_min_proto_version(ctx.get(), SSL3_VERSION));
   EXPECT_EQ(SSL3_VERSION, ctx->min_version);
+  EXPECT_TRUE(SSL_CTX_set_max_proto_version(ctx.get(), TLS1_3_VERSION));
+  EXPECT_EQ(TLS1_3_VERSION, ctx->max_version);
 
   ctx.reset(SSL_CTX_new(DTLS_method()));
   ASSERT_TRUE(ctx);
@@ -3517,6 +3506,42 @@
                         ssl_test_ticket_aead_open_soft_fail,
                         ssl_test_ticket_aead_open_hard_fail)));
 
+TEST(SSLTest, SSL3Method) {
+  bssl::UniquePtr<X509> cert = GetTestCertificate();
+  ASSERT_TRUE(cert);
+
+  // For compatibility, SSLv3_method should work up to SSL_CTX_new and SSL_new.
+  bssl::UniquePtr<SSL_CTX> ssl3_ctx(SSL_CTX_new(SSLv3_method()));
+  ASSERT_TRUE(ssl3_ctx);
+  ASSERT_TRUE(SSL_CTX_use_certificate(ssl3_ctx.get(), cert.get()));
+  bssl::UniquePtr<SSL> ssl(SSL_new(ssl3_ctx.get()));
+  EXPECT_TRUE(ssl);
+
+  // Create a normal TLS context to test against.
+  bssl::UniquePtr<SSL_CTX> tls_ctx(SSL_CTX_new(TLS_method()));
+  ASSERT_TRUE(tls_ctx);
+  ASSERT_TRUE(SSL_CTX_use_certificate(tls_ctx.get(), cert.get()));
+
+  // However, handshaking an SSLv3_method server should fail to resolve the
+  // version range. Explicit calls to SSL_CTX_set_min_proto_version are the only
+  // way to enable SSL 3.0.
+  bssl::UniquePtr<SSL> client, server;
+  EXPECT_FALSE(ConnectClientAndServer(&client, &server, tls_ctx.get(),
+                                      ssl3_ctx.get(),
+                                      nullptr /* no session */));
+  uint32_t err = ERR_get_error();
+  EXPECT_EQ(ERR_LIB_SSL, ERR_GET_LIB(err));
+  EXPECT_EQ(SSL_R_NO_SUPPORTED_VERSIONS_ENABLED, ERR_GET_REASON(err));
+
+  // Likewise for SSLv3_method clients.
+  EXPECT_FALSE(ConnectClientAndServer(&client, &server, ssl3_ctx.get(),
+                                      tls_ctx.get(),
+                                      nullptr /* no session */));
+  err = ERR_get_error();
+  EXPECT_EQ(ERR_LIB_SSL, ERR_GET_LIB(err));
+  EXPECT_EQ(SSL_R_NO_SUPPORTED_VERSIONS_ENABLED, ERR_GET_REASON(err));
+}
+
 // TODO(davidben): Convert this file to GTest properly.
 TEST(SSLTest, AllTests) {
   if (!TestCipherRules() ||
@@ -3528,8 +3553,7 @@
       !TestBadSSL_SESSIONEncoding(kBadSessionVersion) ||
       !TestBadSSL_SESSIONEncoding(kBadSessionTrailingData) ||
       // TODO(svaldez): Update this when TLS 1.3 is enabled by default.
-      !TestDefaultVersion(SSL3_VERSION, TLS1_2_VERSION, &TLS_method) ||
-      !TestDefaultVersion(SSL3_VERSION, SSL3_VERSION, &SSLv3_method) ||
+      !TestDefaultVersion(TLS1_VERSION, TLS1_2_VERSION, &TLS_method) ||
       !TestDefaultVersion(TLS1_VERSION, TLS1_VERSION, &TLSv1_method) ||
       !TestDefaultVersion(TLS1_1_VERSION, TLS1_1_VERSION, &TLSv1_1_method) ||
       !TestDefaultVersion(TLS1_2_VERSION, TLS1_2_VERSION, &TLSv1_2_method) ||
diff --git a/src/ssl/t1_lib.c b/src/ssl/t1_lib.c
index 014432e..c2a5dde 100644
--- a/src/ssl/t1_lib.c
+++ b/src/ssl/t1_lib.c
@@ -446,7 +446,8 @@
  * BoringSSL. Once the change in Chrome has stuck and the values are finalized,
  * restore them. */
 static const uint16_t kVerifySignatureAlgorithms[] = {
-    /* Prefer SHA-256 algorithms. */
+    /* List our preferred algorithms first. */
+    SSL_SIGN_ED25519,
     SSL_SIGN_ECDSA_SECP256R1_SHA256,
 #if !defined(BORINGSSL_ANDROID_SYSTEM)
     SSL_SIGN_RSA_PSS_SHA256,
@@ -481,7 +482,8 @@
  * BoringSSL. Once the change in Chrome has stuck and the values are finalized,
  * restore them. */
 static const uint16_t kSignSignatureAlgorithms[] = {
-    /* Prefer SHA-256 algorithms. */
+    /* List our preferred algorithms first. */
+    SSL_SIGN_ED25519,
     SSL_SIGN_ECDSA_SECP256R1_SHA256,
 #if !defined(BORINGSSL_ANDROID_SYSTEM)
     SSL_SIGN_RSA_PSS_SHA256,
@@ -508,16 +510,47 @@
     SSL_SIGN_RSA_PKCS1_SHA1,
 };
 
-size_t tls12_get_verify_sigalgs(const SSL *ssl, const uint16_t **out) {
-  *out = kVerifySignatureAlgorithms;
-  return OPENSSL_ARRAY_SIZE(kVerifySignatureAlgorithms);
+void SSL_CTX_set_ed25519_enabled(SSL_CTX *ctx, int enabled) {
+  ctx->ed25519_enabled = !!enabled;
+}
+
+int tls12_add_verify_sigalgs(const SSL *ssl, CBB *out) {
+  const uint16_t *sigalgs = kVerifySignatureAlgorithms;
+  size_t num_sigalgs = OPENSSL_ARRAY_SIZE(kVerifySignatureAlgorithms);
+  if (ssl->ctx->num_verify_sigalgs != 0) {
+    sigalgs = ssl->ctx->verify_sigalgs;
+    num_sigalgs = ssl->ctx->num_verify_sigalgs;
+  }
+
+  for (size_t i = 0; i < num_sigalgs; i++) {
+    if (sigalgs == kVerifySignatureAlgorithms &&
+        sigalgs[i] == SSL_SIGN_ED25519 &&
+        !ssl->ctx->ed25519_enabled) {
+      continue;
+    }
+    if (!CBB_add_u16(out, sigalgs[i])) {
+      return 0;
+    }
+  }
+
+  return 1;
 }
 
 int tls12_check_peer_sigalg(SSL *ssl, int *out_alert, uint16_t sigalg) {
-  const uint16_t *verify_sigalgs;
-  size_t num_verify_sigalgs = tls12_get_verify_sigalgs(ssl, &verify_sigalgs);
-  for (size_t i = 0; i < num_verify_sigalgs; i++) {
-    if (sigalg == verify_sigalgs[i]) {
+  const uint16_t *sigalgs = kVerifySignatureAlgorithms;
+  size_t num_sigalgs = OPENSSL_ARRAY_SIZE(kVerifySignatureAlgorithms);
+  if (ssl->ctx->num_verify_sigalgs != 0) {
+    sigalgs = ssl->ctx->verify_sigalgs;
+    num_sigalgs = ssl->ctx->num_verify_sigalgs;
+  }
+
+  for (size_t i = 0; i < num_sigalgs; i++) {
+    if (sigalgs == kVerifySignatureAlgorithms &&
+        sigalgs[i] == SSL_SIGN_ED25519 &&
+        !ssl->ctx->ed25519_enabled) {
+      continue;
+    }
+    if (sigalg == sigalgs[i]) {
       return 1;
     }
   }
@@ -1031,23 +1064,12 @@
     return 1;
   }
 
-  const uint16_t *sigalgs;
-  const size_t num_sigalgs = tls12_get_verify_sigalgs(ssl, &sigalgs);
-
   CBB contents, sigalgs_cbb;
   if (!CBB_add_u16(out, TLSEXT_TYPE_signature_algorithms) ||
       !CBB_add_u16_length_prefixed(out, &contents) ||
-      !CBB_add_u16_length_prefixed(&contents, &sigalgs_cbb)) {
-    return 0;
-  }
-
-  for (size_t i = 0; i < num_sigalgs; i++) {
-    if (!CBB_add_u16(&sigalgs_cbb, sigalgs[i])) {
-      return 0;
-    }
-  }
-
-  if (!CBB_flush(out)) {
+      !CBB_add_u16_length_prefixed(&contents, &sigalgs_cbb) ||
+      !tls12_add_verify_sigalgs(ssl, &sigalgs_cbb) ||
+      !CBB_flush(out)) {
     return 0;
   }
 
@@ -1432,31 +1454,33 @@
     return 0;
   }
 
-  /* Check that the protcol name is one of the ones we advertised. */
-  int protocol_ok = 0;
-  CBS client_protocol_name_list, client_protocol_name;
-  CBS_init(&client_protocol_name_list, ssl->alpn_client_proto_list,
-           ssl->alpn_client_proto_list_len);
-  while (CBS_len(&client_protocol_name_list) > 0) {
-    if (!CBS_get_u8_length_prefixed(&client_protocol_name_list,
-                                    &client_protocol_name)) {
-      *out_alert = SSL_AD_INTERNAL_ERROR;
+  if (!ssl->ctx->allow_unknown_alpn_protos) {
+    /* Check that the protocol name is one of the ones we advertised. */
+    int protocol_ok = 0;
+    CBS client_protocol_name_list, client_protocol_name;
+    CBS_init(&client_protocol_name_list, ssl->alpn_client_proto_list,
+             ssl->alpn_client_proto_list_len);
+    while (CBS_len(&client_protocol_name_list) > 0) {
+      if (!CBS_get_u8_length_prefixed(&client_protocol_name_list,
+                                      &client_protocol_name)) {
+        *out_alert = SSL_AD_INTERNAL_ERROR;
+        return 0;
+      }
+
+      if (CBS_len(&client_protocol_name) == CBS_len(&protocol_name) &&
+          OPENSSL_memcmp(CBS_data(&client_protocol_name),
+                         CBS_data(&protocol_name),
+                         CBS_len(&protocol_name)) == 0) {
+        protocol_ok = 1;
+        break;
+      }
+    }
+
+    if (!protocol_ok) {
+      OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_ALPN_PROTOCOL);
+      *out_alert = SSL_AD_ILLEGAL_PARAMETER;
       return 0;
     }
-
-    if (CBS_len(&client_protocol_name) == CBS_len(&protocol_name) &&
-        OPENSSL_memcmp(CBS_data(&client_protocol_name),
-                       CBS_data(&protocol_name),
-                       CBS_len(&protocol_name)) == 0) {
-      protocol_ok = 1;
-      break;
-    }
-  }
-
-  if (!protocol_ok) {
-    OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_ALPN_PROTOCOL);
-    *out_alert = SSL_AD_ILLEGAL_PARAMETER;
-    return 0;
   }
 
   if (!CBS_stow(&protocol_name, &ssl->s3->alpn_selected,
@@ -2095,7 +2119,7 @@
       session_version < TLS1_3_VERSION ||
       ssl->session->ticket_max_early_data == 0 ||
       hs->received_hello_retry_request ||
-      !ssl->ctx->enable_early_data) {
+      !ssl->cert->enable_early_data) {
     return 1;
   }
 
@@ -2334,7 +2358,8 @@
       !SSL_ECDH_CTX_init(&group, group_id) ||
       !SSL_ECDH_CTX_accept(&group, &public_key, &secret, &secret_len, out_alert,
                            CBS_data(&peer_key), CBS_len(&peer_key)) ||
-      !CBB_finish(&public_key, &hs->public_key, &hs->public_key_len)) {
+      !CBB_finish(&public_key, &hs->ecdh_public_key,
+                  &hs->ecdh_public_key_len)) {
     OPENSSL_free(secret);
     SSL_ECDH_CTX_cleanup(&group);
     CBB_cleanup(&public_key);
@@ -2358,14 +2383,15 @@
       !CBB_add_u16_length_prefixed(out, &kse_bytes) ||
       !CBB_add_u16(&kse_bytes, group_id) ||
       !CBB_add_u16_length_prefixed(&kse_bytes, &public_key) ||
-      !CBB_add_bytes(&public_key, hs->public_key, hs->public_key_len) ||
+      !CBB_add_bytes(&public_key, hs->ecdh_public_key,
+                     hs->ecdh_public_key_len) ||
       !CBB_flush(out)) {
     return 0;
   }
 
-  OPENSSL_free(hs->public_key);
-  hs->public_key = NULL;
-  hs->public_key_len = 0;
+  OPENSSL_free(hs->ecdh_public_key);
+  hs->ecdh_public_key = NULL;
+  hs->ecdh_public_key_len = 0;
 
   hs->new_session->group_id = group_id;
   return 1;
@@ -3309,17 +3335,17 @@
   /* Before TLS 1.2, the signature algorithm isn't negotiated as part of the
    * handshake. It is fixed at MD5-SHA1 for RSA and SHA1 for ECDSA. */
   if (ssl3_protocol_version(ssl) < TLS1_2_VERSION) {
-    int type = ssl_private_key_type(ssl);
-    if (type == NID_rsaEncryption) {
-      *out = SSL_SIGN_RSA_PKCS1_MD5_SHA1;
-      return 1;
+    switch (EVP_PKEY_id(hs->local_pubkey)) {
+      case EVP_PKEY_RSA:
+        *out = SSL_SIGN_RSA_PKCS1_MD5_SHA1;
+        return 1;
+      case EVP_PKEY_EC:
+        *out = SSL_SIGN_ECDSA_SHA1;
+        return 1;
+      default:
+        OPENSSL_PUT_ERROR(SSL, SSL_R_NO_COMMON_SIGNATURE_ALGORITHMS);
+        return 0;
     }
-    if (ssl_is_ecdsa_key_type(type)) {
-      *out = SSL_SIGN_ECDSA_SHA1;
-      return 1;
-    }
-    OPENSSL_PUT_ERROR(SSL, SSL_R_NO_COMMON_SIGNATURE_ALGORITHMS);
-    return 0;
   }
 
   const uint16_t *sigalgs = cert->sigalgs;
@@ -3346,7 +3372,7 @@
     /* SSL_SIGN_RSA_PKCS1_MD5_SHA1 is an internal value and should never be
      * negotiated. */
     if (sigalg == SSL_SIGN_RSA_PKCS1_MD5_SHA1 ||
-        !ssl_private_key_supports_signature_algorithm(ssl, sigalgs[i])) {
+        !ssl_private_key_supports_signature_algorithm(hs, sigalgs[i])) {
       continue;
     }
 
diff --git a/src/ssl/test/bssl_shim.cc b/src/ssl/test/bssl_shim.cc
index 70ea664..d57339f 100644
--- a/src/ssl/test/bssl_shim.cc
+++ b/src/ssl/test/bssl_shim.cc
@@ -46,7 +46,6 @@
 #include <openssl/bytestring.h>
 #include <openssl/cipher.h>
 #include <openssl/crypto.h>
-#include <openssl/dh.h>
 #include <openssl/digest.h>
 #include <openssl/err.h>
 #include <openssl/evp.h>
@@ -286,23 +285,6 @@
   return ret;
 }
 
-static int AsyncPrivateKeyType(SSL *ssl) {
-  EVP_PKEY *key = GetTestState(ssl)->private_key.get();
-  switch (EVP_PKEY_id(key)) {
-    case EVP_PKEY_RSA:
-      return NID_rsaEncryption;
-    case EVP_PKEY_EC:
-      return EC_GROUP_get_curve_name(
-          EC_KEY_get0_group(EVP_PKEY_get0_EC_KEY(key)));
-    default:
-      return NID_undef;
-  }
-}
-
-static size_t AsyncPrivateKeyMaxSignatureLen(SSL *ssl) {
-  return EVP_PKEY_size(GetTestState(ssl)->private_key.get());
-}
-
 static ssl_private_key_result_t AsyncPrivateKeySign(
     SSL *ssl, uint8_t *out, size_t *out_len, size_t max_out,
     uint16_t signature_algorithm, const uint8_t *in, size_t in_len) {
@@ -312,6 +294,13 @@
     abort();
   }
 
+  bssl::UniquePtr<EVP_PKEY_CTX> ctx(
+      EVP_PKEY_CTX_new(test_state->private_key.get(), nullptr));
+  if (!ctx ||
+      !EVP_PKEY_sign_init(ctx.get())) {
+    return ssl_private_key_failure;
+  }
+
   // Determine the hash.
   const EVP_MD *md;
   switch (signature_algorithm) {
@@ -337,16 +326,17 @@
     case SSL_SIGN_RSA_PKCS1_MD5_SHA1:
       md = EVP_md5_sha1();
       break;
+    case SSL_SIGN_ED25519:
+      md = nullptr;
+      break;
     default:
       fprintf(stderr, "Unknown signature algorithm %04x.\n",
               signature_algorithm);
       return ssl_private_key_failure;
   }
 
-  bssl::ScopedEVP_MD_CTX ctx;
-  EVP_PKEY_CTX *pctx;
-  if (!EVP_DigestSignInit(ctx.get(), &pctx, md, nullptr,
-                          test_state->private_key.get())) {
+  if (md != nullptr &&
+      !EVP_PKEY_CTX_set_signature_md(ctx.get(), md)) {
     return ssl_private_key_failure;
   }
 
@@ -355,8 +345,8 @@
     case SSL_SIGN_RSA_PSS_SHA256:
     case SSL_SIGN_RSA_PSS_SHA384:
     case SSL_SIGN_RSA_PSS_SHA512:
-      if (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) ||
-          !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx,
+      if (!EVP_PKEY_CTX_set_rsa_padding(ctx.get(), RSA_PKCS1_PSS_PADDING) ||
+          !EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx.get(),
                                             -1 /* salt len = hash len */)) {
         return ssl_private_key_failure;
       }
@@ -364,13 +354,12 @@
 
   // Write the signature into |test_state|.
   size_t len = 0;
-  if (!EVP_DigestSignUpdate(ctx.get(), in, in_len) ||
-      !EVP_DigestSignFinal(ctx.get(), nullptr, &len)) {
+  if (!EVP_PKEY_sign_message(ctx.get(), nullptr, &len, in, in_len)) {
     return ssl_private_key_failure;
   }
   test_state->private_key_result.resize(len);
-  if (!EVP_DigestSignFinal(ctx.get(), test_state->private_key_result.data(),
-                           &len)) {
+  if (!EVP_PKEY_sign_message(ctx.get(), test_state->private_key_result.data(),
+                             &len, in, in_len)) {
     return ssl_private_key_failure;
   }
   test_state->private_key_result.resize(len);
@@ -436,8 +425,8 @@
 }
 
 static const SSL_PRIVATE_KEY_METHOD g_async_private_key_method = {
-    AsyncPrivateKeyType,
-    AsyncPrivateKeyMaxSignatureLen,
+    nullptr /* type */,
+    nullptr /* max_signature_len */,
     AsyncPrivateKeySign,
     nullptr /* sign_digest */,
     AsyncPrivateKeyDecrypt,
@@ -1048,9 +1037,10 @@
 
   SSL_CTX_set0_buffer_pool(ssl_ctx.get(), g_pool);
 
-  // Enable TLS 1.3 for tests.
+  // Enable SSL 3.0 and TLS 1.3 for tests.
   if (!config->is_dtls &&
-      !SSL_CTX_set_max_proto_version(ssl_ctx.get(), TLS1_3_VERSION)) {
+      (!SSL_CTX_set_min_proto_version(ssl_ctx.get(), SSL3_VERSION) ||
+       !SSL_CTX_set_max_proto_version(ssl_ctx.get(), TLS1_3_VERSION))) {
     return nullptr;
   }
 
@@ -1063,34 +1053,6 @@
     return nullptr;
   }
 
-  bssl::UniquePtr<DH> dh(DH_get_2048_256(NULL));
-  if (!dh) {
-    return nullptr;
-  }
-
-  if (config->use_sparse_dh_prime) {
-    // This prime number is 2^1024 + 643 – a value just above a power of two.
-    // Because of its form, values modulo it are essentially certain to be one
-    // byte shorter. This is used to test padding of these values.
-    if (BN_hex2bn(
-            &dh->p,
-            "1000000000000000000000000000000000000000000000000000000000000000"
-            "0000000000000000000000000000000000000000000000000000000000000000"
-            "0000000000000000000000000000000000000000000000000000000000000000"
-            "0000000000000000000000000000000000000000000000000000000000000028"
-            "3") == 0 ||
-        !BN_set_word(dh->g, 2)) {
-      return nullptr;
-    }
-    BN_free(dh->q);
-    dh->q = NULL;
-    dh->priv_length = 0;
-  }
-
-  if (!SSL_CTX_set_tmp_dh(ssl_ctx.get(), dh.get())) {
-    return nullptr;
-  }
-
   if (config->async && config->is_server) {
     // Disable the internal session cache. To test asynchronous session lookup,
     // we use an external session cache.
@@ -1187,6 +1149,23 @@
     SSL_CTX_set_early_data_enabled(ssl_ctx.get(), 1);
   }
 
+  if (config->allow_unknown_alpn_protos) {
+    SSL_CTX_set_allow_unknown_alpn_protos(ssl_ctx.get(), 1);
+  }
+
+  if (config->enable_ed25519) {
+    SSL_CTX_set_ed25519_enabled(ssl_ctx.get(), 1);
+  }
+
+  if (!config->verify_prefs.empty()) {
+    std::vector<uint16_t> u16s(config->verify_prefs.begin(),
+                               config->verify_prefs.end());
+    if (!SSL_CTX_set_verify_algorithm_prefs(ssl_ctx.get(), u16s.data(),
+                                            u16s.size())) {
+      return nullptr;
+    }
+  }
+
   return ssl_ctx;
 }
 
@@ -1307,7 +1286,8 @@
 
 // WriteAll writes |in_len| bytes from |in| to |ssl|, resolving any asynchronous
 // operations. It returns the result of the final |SSL_write| call.
-static int WriteAll(SSL *ssl, const uint8_t *in, size_t in_len) {
+static int WriteAll(SSL *ssl, const void *in_, size_t in_len) {
+  const uint8_t *in = reinterpret_cast<const uint8_t *>(in_);
   const TestConfig *config = GetTestConfig(ssl);
   int ret;
   do {
@@ -1971,22 +1951,23 @@
       }
     }
   } else {
+    static const char kInitialWrite[] = "hello";
+    bool pending_initial_write = false;
     if (config->read_with_unfinished_write) {
       if (!config->async) {
         fprintf(stderr, "-read-with-unfinished-write requires -async.\n");
         return false;
       }
 
-      int write_ret = SSL_write(ssl.get(),
-                          reinterpret_cast<const uint8_t *>("unfinished"), 10);
+      int write_ret =
+          SSL_write(ssl.get(), kInitialWrite, strlen(kInitialWrite));
       if (SSL_get_error(ssl.get(), write_ret) != SSL_ERROR_WANT_WRITE) {
         fprintf(stderr, "Failed to leave unfinished write.\n");
         return false;
       }
-    }
-    if (config->shim_writes_first) {
-      if (WriteAll(ssl.get(), reinterpret_cast<const uint8_t *>("hello"),
-                   5) < 0) {
+      pending_initial_write = true;
+    } else if (config->shim_writes_first) {
+      if (WriteAll(ssl.get(), kInitialWrite, strlen(kInitialWrite)) < 0) {
         return false;
       }
     }
@@ -2031,6 +2012,14 @@
           return false;
         }
 
+        // Clear the initial write, if unfinished.
+        if (pending_initial_write) {
+          if (WriteAll(ssl.get(), kInitialWrite, strlen(kInitialWrite)) < 0) {
+            return false;
+          }
+          pending_initial_write = false;
+        }
+
         for (int i = 0; i < n; i++) {
           buf[i] ^= 0xff;
         }
diff --git a/src/ssl/test/runner/common.go b/src/ssl/test/runner/common.go
index 95dcbd0..0f54800 100644
--- a/src/ssl/test/runner/common.go
+++ b/src/ssl/test/runner/common.go
@@ -184,6 +184,7 @@
 	signatureECDSAWithP256AndSHA256,
 	signatureRSAPKCS1WithSHA1,
 	signatureECDSAWithSHA1,
+	signatureEd25519,
 }
 
 // SRTP protection profiles (See RFC 5764, section 4.1.2)
@@ -1325,6 +1326,19 @@
 	// RenegotiationCertificate, if not nil, is the certificate to use on
 	// renegotiation handshakes.
 	RenegotiationCertificate *Certificate
+
+	// UseLegacySigningAlgorithm, if non-zero, is the signature algorithm
+	// to use when signing in TLS 1.1 and earlier where algorithms are not
+	// negotiated.
+	UseLegacySigningAlgorithm signatureAlgorithm
+
+	// SendServerHelloAsHelloRetryRequest, if true, causes the server to
+	// send ServerHello messages with a HelloRetryRequest type field.
+	SendServerHelloAsHelloRetryRequest bool
+
+	// RejectUnsolicitedKeyUpdate, if true, causes all unsolicited
+	// KeyUpdates from the peer to be rejected.
+	RejectUnsolicitedKeyUpdate bool
 }
 
 func (c *Config) serverInit() {
diff --git a/src/ssl/test/runner/conn.go b/src/ssl/test/runner/conn.go
index 830977d..0eb64e7 100644
--- a/src/ssl/test/runner/conn.go
+++ b/src/ssl/test/runner/conn.go
@@ -852,20 +852,22 @@
 	default:
 		c.sendAlert(alertInternalError)
 		return c.in.setErrorLocked(errors.New("tls: unknown record type requested"))
-	case recordTypeHandshake, recordTypeChangeCipherSpec:
+	case recordTypeChangeCipherSpec:
 		if c.handshakeComplete {
 			c.sendAlert(alertInternalError)
-			return c.in.setErrorLocked(errors.New("tls: handshake or ChangeCipherSpec requested after handshake complete"))
+			return c.in.setErrorLocked(errors.New("tls: ChangeCipherSpec requested after handshake complete"))
 		}
 	case recordTypeApplicationData:
 		if !c.handshakeComplete && !c.config.Bugs.ExpectFalseStart && len(c.config.Bugs.ExpectHalfRTTData) == 0 && len(c.config.Bugs.ExpectEarlyData) == 0 {
 			c.sendAlert(alertInternalError)
 			return c.in.setErrorLocked(errors.New("tls: application data record requested before handshake complete"))
 		}
-	case recordTypeAlert:
-		// Looking for a close_notify. Note: unlike a real
-		// implementation, this is not tolerant of additional records.
-		// See the documentation for ExpectCloseNotify.
+	case recordTypeAlert, recordTypeHandshake:
+		// Looking for a close_notify or handshake message. Note: unlike
+		// a real implementation, this is not tolerant of additional
+		// records. See the documentation for ExpectCloseNotify.
+		// Post-handshake requests for handshake messages are allowed if
+		// the caller used ReadKeyUpdateACK.
 	}
 
 Again:
@@ -1001,11 +1003,17 @@
 // to the connection and updates the record layer state.
 // c.out.Mutex <= L.
 func (c *Conn) writeRecord(typ recordType, data []byte) (n int, err error) {
-	if msgType := c.config.Bugs.SendWrongMessageType; msgType != 0 {
-		if typ == recordTypeHandshake && data[0] == msgType {
+	if typ == recordTypeHandshake {
+		msgType := data[0]
+		if c.config.Bugs.SendWrongMessageType != 0 && msgType == c.config.Bugs.SendWrongMessageType {
+			msgType += 42
+		} else if msgType == typeServerHello && c.config.Bugs.SendServerHelloAsHelloRetryRequest {
+			msgType = typeHelloRetryRequest
+		}
+		if msgType != data[0] {
 			newData := make([]byte, len(data))
 			copy(newData, data)
-			newData[0] += 42
+			newData[0] = msgType
 			data = newData
 		}
 	}
@@ -1491,6 +1499,9 @@
 	}
 
 	if keyUpdate, ok := msg.(*keyUpdateMsg); ok {
+		if c.config.Bugs.RejectUnsolicitedKeyUpdate {
+			return errors.New("tls: unexpected KeyUpdate message")
+		}
 		c.in.doKeyUpdate(c, false)
 		if keyUpdate.keyUpdateRequest == keyUpdateRequested {
 			c.keyUpdateRequested = true
@@ -1498,9 +1509,33 @@
 		return nil
 	}
 
-	// TODO(davidben): Add support for KeyUpdate.
 	c.sendAlert(alertUnexpectedMessage)
-	return alertUnexpectedMessage
+	return errors.New("tls: unexpected post-handshake message")
+}
+
+// Reads a KeyUpdate acknowledgment from the peer. There may not be any
+// application data records before the message.
+func (c *Conn) ReadKeyUpdateACK() error {
+	c.in.Lock()
+	defer c.in.Unlock()
+
+	msg, err := c.readHandshake()
+	if err != nil {
+		return err
+	}
+
+	keyUpdate, ok := msg.(*keyUpdateMsg)
+	if !ok {
+		c.sendAlert(alertUnexpectedMessage)
+		return errors.New("tls: unexpected message when reading KeyUpdate")
+	}
+
+	if keyUpdate.keyUpdateRequest != keyUpdateNotRequested {
+		return errors.New("tls: received invalid KeyUpdate message")
+	}
+
+	c.in.doKeyUpdate(c, false)
+	return nil
 }
 
 func (c *Conn) Renegotiate() error {
diff --git a/src/ssl/test/runner/ed25519/ed25519.go b/src/ssl/test/runner/ed25519/ed25519.go
new file mode 100644
index 0000000..dfef0ff
--- /dev/null
+++ b/src/ssl/test/runner/ed25519/ed25519.go
@@ -0,0 +1,195 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package ed25519 implements the Ed25519 signature algorithm. See
+// http://ed25519.cr.yp.to/.
+//
+// These functions are also compatible with the “Ed25519” function defined in
+// https://tools.ietf.org/html/draft-irtf-cfrg-eddsa-05.
+package ed25519
+
+// This code is a port of the public domain, “ref10” implementation of ed25519
+// from SUPERCOP.
+
+import (
+	"crypto"
+	cryptorand "crypto/rand"
+	"crypto/sha512"
+	"crypto/subtle"
+	"errors"
+	"io"
+	"strconv"
+
+	"./internal/edwards25519"
+)
+
+const (
+	// PublicKeySize is the size, in bytes, of public keys as used in this package.
+	PublicKeySize = 32
+	// PrivateKeySize is the size, in bytes, of private keys as used in this package.
+	PrivateKeySize = 64
+	// SignatureSize is the size, in bytes, of signatures generated and verified by this package.
+	SignatureSize = 64
+)
+
+// PublicKey is the type of Ed25519 public keys.
+type PublicKey []byte
+
+// PrivateKey is the type of Ed25519 private keys. It implements crypto.Signer.
+type PrivateKey []byte
+
+// Public returns the PublicKey corresponding to priv.
+func (priv PrivateKey) Public() crypto.PublicKey {
+	publicKey := make([]byte, PublicKeySize)
+	copy(publicKey, priv[32:])
+	return PublicKey(publicKey)
+}
+
+// Sign signs the given message with priv.
+// Ed25519 performs two passes over messages to be signed and therefore cannot
+// handle pre-hashed messages. Thus opts.HashFunc() must return zero to
+// indicate the message hasn't been hashed. This can be achieved by passing
+// crypto.Hash(0) as the value for opts.
+func (priv PrivateKey) Sign(rand io.Reader, message []byte, opts crypto.SignerOpts) (signature []byte, err error) {
+	if opts.HashFunc() != crypto.Hash(0) {
+		return nil, errors.New("ed25519: cannot sign hashed message")
+	}
+
+	return Sign(priv, message), nil
+}
+
+// GenerateKey generates a public/private key pair using entropy from rand.
+// If rand is nil, crypto/rand.Reader will be used.
+func GenerateKey(rand io.Reader) (publicKey PublicKey, privateKey PrivateKey, err error) {
+	if rand == nil {
+		rand = cryptorand.Reader
+	}
+
+	var seed [32]byte
+	_, err = io.ReadFull(rand, seed[:])
+	if err != nil {
+		return nil, nil, err
+	}
+
+	publicKey, privateKey = NewKeyPairFromSeed(seed[:])
+	return publicKey, privateKey, nil
+}
+
+// NewKeyPairFromSeed calculates a public and private key from a 32-byte
+// Ed25519 seed.
+func NewKeyPairFromSeed(seed []byte) (publicKey PublicKey, privateKey PrivateKey) {
+	if len(seed) != 32 {
+		panic("Invalid seed length.")
+	}
+
+	digest := sha512.Sum512(seed)
+	digest[0] &= 248
+	digest[31] &= 127
+	digest[31] |= 64
+
+	privateKey = make([]byte, PrivateKeySize)
+	publicKey = make([]byte, PublicKeySize)
+
+	var A edwards25519.ExtendedGroupElement
+	var hBytes [32]byte
+	copy(hBytes[:], digest[:])
+	edwards25519.GeScalarMultBase(&A, &hBytes)
+	var publicKeyBytes [32]byte
+	A.ToBytes(&publicKeyBytes)
+
+	copy(privateKey, seed[:])
+	copy(privateKey[32:], publicKeyBytes[:])
+	copy(publicKey, publicKeyBytes[:])
+
+	return publicKey, privateKey
+}
+
+// Sign signs the message with privateKey and returns a signature. It will
+// panic if len(privateKey) is not PrivateKeySize.
+func Sign(privateKey PrivateKey, message []byte) []byte {
+	if l := len(privateKey); l != PrivateKeySize {
+		panic("ed25519: bad private key length: " + strconv.Itoa(l))
+	}
+
+	h := sha512.New()
+	h.Write(privateKey[:32])
+
+	var digest1, messageDigest, hramDigest [64]byte
+	var expandedSecretKey [32]byte
+	h.Sum(digest1[:0])
+	copy(expandedSecretKey[:], digest1[:])
+	expandedSecretKey[0] &= 248
+	expandedSecretKey[31] &= 63
+	expandedSecretKey[31] |= 64
+
+	h.Reset()
+	h.Write(digest1[32:])
+	h.Write(message)
+	h.Sum(messageDigest[:0])
+
+	var messageDigestReduced [32]byte
+	edwards25519.ScReduce(&messageDigestReduced, &messageDigest)
+	var R edwards25519.ExtendedGroupElement
+	edwards25519.GeScalarMultBase(&R, &messageDigestReduced)
+
+	var encodedR [32]byte
+	R.ToBytes(&encodedR)
+
+	h.Reset()
+	h.Write(encodedR[:])
+	h.Write(privateKey[32:])
+	h.Write(message)
+	h.Sum(hramDigest[:0])
+	var hramDigestReduced [32]byte
+	edwards25519.ScReduce(&hramDigestReduced, &hramDigest)
+
+	var s [32]byte
+	edwards25519.ScMulAdd(&s, &hramDigestReduced, &expandedSecretKey, &messageDigestReduced)
+
+	signature := make([]byte, SignatureSize)
+	copy(signature[:], encodedR[:])
+	copy(signature[32:], s[:])
+
+	return signature
+}
+
+// Verify reports whether sig is a valid signature of message by publicKey. It
+// will panic if len(publicKey) is not PublicKeySize.
+func Verify(publicKey PublicKey, message, sig []byte) bool {
+	if l := len(publicKey); l != PublicKeySize {
+		panic("ed25519: bad public key length: " + strconv.Itoa(l))
+	}
+
+	if len(sig) != SignatureSize || sig[63]&224 != 0 {
+		return false
+	}
+
+	var A edwards25519.ExtendedGroupElement
+	var publicKeyBytes [32]byte
+	copy(publicKeyBytes[:], publicKey)
+	if !A.FromBytes(&publicKeyBytes) {
+		return false
+	}
+	edwards25519.FeNeg(&A.X, &A.X)
+	edwards25519.FeNeg(&A.T, &A.T)
+
+	h := sha512.New()
+	h.Write(sig[:32])
+	h.Write(publicKey[:])
+	h.Write(message)
+	var digest [64]byte
+	h.Sum(digest[:0])
+
+	var hReduced [32]byte
+	edwards25519.ScReduce(&hReduced, &digest)
+
+	var R edwards25519.ProjectiveGroupElement
+	var b [32]byte
+	copy(b[:], sig[32:])
+	edwards25519.GeDoubleScalarMultVartime(&R, &hReduced, &A, &b)
+
+	var checkR [32]byte
+	R.ToBytes(&checkR)
+	return subtle.ConstantTimeCompare(sig[:32], checkR[:]) == 1
+}
diff --git a/src/ssl/test/runner/ed25519/ed25519_test.go b/src/ssl/test/runner/ed25519/ed25519_test.go
new file mode 100644
index 0000000..02c9861
--- /dev/null
+++ b/src/ssl/test/runner/ed25519/ed25519_test.go
@@ -0,0 +1,183 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ed25519
+
+import (
+	"bufio"
+	"bytes"
+	"compress/gzip"
+	"crypto"
+	"crypto/rand"
+	"encoding/hex"
+	"os"
+	"strings"
+	"testing"
+
+	"./internal/edwards25519"
+)
+
+type zeroReader struct{}
+
+func (zeroReader) Read(buf []byte) (int, error) {
+	for i := range buf {
+		buf[i] = 0
+	}
+	return len(buf), nil
+}
+
+func TestUnmarshalMarshal(t *testing.T) {
+	pub, _, _ := GenerateKey(rand.Reader)
+
+	var A edwards25519.ExtendedGroupElement
+	var pubBytes [32]byte
+	copy(pubBytes[:], pub)
+	if !A.FromBytes(&pubBytes) {
+		t.Fatalf("ExtendedGroupElement.FromBytes failed")
+	}
+
+	var pub2 [32]byte
+	A.ToBytes(&pub2)
+
+	if pubBytes != pub2 {
+		t.Errorf("FromBytes(%v)->ToBytes does not round-trip, got %x\n", pubBytes, pub2)
+	}
+}
+
+func TestSignVerify(t *testing.T) {
+	var zero zeroReader
+	public, private, _ := GenerateKey(zero)
+
+	message := []byte("test message")
+	sig := Sign(private, message)
+	if !Verify(public, message, sig) {
+		t.Errorf("valid signature rejected")
+	}
+
+	wrongMessage := []byte("wrong message")
+	if Verify(public, wrongMessage, sig) {
+		t.Errorf("signature of different message accepted")
+	}
+}
+
+func TestCryptoSigner(t *testing.T) {
+	var zero zeroReader
+	public, private, _ := GenerateKey(zero)
+
+	signer := crypto.Signer(private)
+
+	publicInterface := signer.Public()
+	public2, ok := publicInterface.(PublicKey)
+	if !ok {
+		t.Fatalf("expected PublicKey from Public() but got %T", publicInterface)
+	}
+
+	if !bytes.Equal(public, public2) {
+		t.Errorf("public keys do not match: original:%x vs Public():%x", public, public2)
+	}
+
+	message := []byte("message")
+	var noHash crypto.Hash
+	signature, err := signer.Sign(zero, message, noHash)
+	if err != nil {
+		t.Fatalf("error from Sign(): %s", err)
+	}
+
+	if !Verify(public, message, signature) {
+		t.Errorf("Verify failed on signature from Sign()")
+	}
+}
+
+func TestGolden(t *testing.T) {
+	// sign.input.gz is a selection of test cases from
+	// http://ed25519.cr.yp.to/python/sign.input
+	testDataZ, err := os.Open("testdata/sign.input.gz")
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer testDataZ.Close()
+	testData, err := gzip.NewReader(testDataZ)
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer testData.Close()
+
+	scanner := bufio.NewScanner(testData)
+	lineNo := 0
+
+	for scanner.Scan() {
+		lineNo++
+
+		line := scanner.Text()
+		parts := strings.Split(line, ":")
+		if len(parts) != 5 {
+			t.Fatalf("bad number of parts on line %d", lineNo)
+		}
+
+		privBytes, _ := hex.DecodeString(parts[0])
+		pubKey, _ := hex.DecodeString(parts[1])
+		msg, _ := hex.DecodeString(parts[2])
+		sig, _ := hex.DecodeString(parts[3])
+		// The signatures in the test vectors also include the message
+		// at the end, but we just want R and S.
+		sig = sig[:SignatureSize]
+
+		if l := len(pubKey); l != PublicKeySize {
+			t.Fatalf("bad public key length on line %d: got %d bytes", lineNo, l)
+		}
+
+		var priv [PrivateKeySize]byte
+		copy(priv[:], privBytes)
+		copy(priv[32:], pubKey)
+
+		sig2 := Sign(priv[:], msg)
+		if !bytes.Equal(sig, sig2[:]) {
+			t.Errorf("different signature result on line %d: %x vs %x", lineNo, sig, sig2)
+		}
+
+		if !Verify(pubKey, msg, sig2) {
+			t.Errorf("signature failed to verify on line %d", lineNo)
+		}
+	}
+
+	if err := scanner.Err(); err != nil {
+		t.Fatalf("error reading test data: %s", err)
+	}
+}
+
+func BenchmarkKeyGeneration(b *testing.B) {
+	var zero zeroReader
+	for i := 0; i < b.N; i++ {
+		if _, _, err := GenerateKey(zero); err != nil {
+			b.Fatal(err)
+		}
+	}
+}
+
+func BenchmarkSigning(b *testing.B) {
+	var zero zeroReader
+	_, priv, err := GenerateKey(zero)
+	if err != nil {
+		b.Fatal(err)
+	}
+	message := []byte("Hello, world!")
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		Sign(priv, message)
+	}
+}
+
+func BenchmarkVerification(b *testing.B) {
+	var zero zeroReader
+	pub, priv, err := GenerateKey(zero)
+	if err != nil {
+		b.Fatal(err)
+	}
+	message := []byte("Hello, world!")
+	signature := Sign(priv, message)
+	b.ResetTimer()
+	for i := 0; i < b.N; i++ {
+		Verify(pub, message, signature)
+	}
+}
diff --git a/src/ssl/test/runner/ed25519/internal/edwards25519/const.go b/src/ssl/test/runner/ed25519/internal/edwards25519/const.go
new file mode 100644
index 0000000..e39f086
--- /dev/null
+++ b/src/ssl/test/runner/ed25519/internal/edwards25519/const.go
@@ -0,0 +1,1422 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package edwards25519
+
+// These values are from the public domain, “ref10” implementation of ed25519
+// from SUPERCOP.
+
+// d is a constant in the Edwards curve equation.
+var d = FieldElement{
+	-10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116,
+}
+
+// d2 is 2*d.
+var d2 = FieldElement{
+	-21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199,
+}
+
+// SqrtM1 is the square-root of -1 in the field.
+var SqrtM1 = FieldElement{
+	-32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482,
+}
+
+// A is a constant in the Montgomery-form of curve25519.
+var A = FieldElement{
+	486662, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+}
+
+// bi contains precomputed multiples of the base-point. See the Ed25519 paper
+// for a discussion about how these values are used.
+var bi = [8]PreComputedGroupElement{
+	{
+		FieldElement{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605},
+		FieldElement{-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378},
+		FieldElement{-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546},
+	},
+	{
+		FieldElement{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024},
+		FieldElement{16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574},
+		FieldElement{30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357},
+	},
+	{
+		FieldElement{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380},
+		FieldElement{4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306},
+		FieldElement{19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942},
+	},
+	{
+		FieldElement{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766},
+		FieldElement{-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701},
+		FieldElement{28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300},
+	},
+	{
+		FieldElement{-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877},
+		FieldElement{-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951},
+		FieldElement{4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784},
+	},
+	{
+		FieldElement{-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436},
+		FieldElement{25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918},
+		FieldElement{23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877},
+	},
+	{
+		FieldElement{-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800},
+		FieldElement{-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305},
+		FieldElement{-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300},
+	},
+	{
+		FieldElement{-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876},
+		FieldElement{-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619},
+		FieldElement{-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683},
+	},
+}
+
+// base contains precomputed multiples of the base-point. See the Ed25519 paper
+// for a discussion about how these values are used.
+var base = [32][8]PreComputedGroupElement{
+	{
+		{
+			FieldElement{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605},
+			FieldElement{-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378},
+			FieldElement{-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546},
+		},
+		{
+			FieldElement{-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303},
+			FieldElement{-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081},
+			FieldElement{26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697},
+		},
+		{
+			FieldElement{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024},
+			FieldElement{16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574},
+			FieldElement{30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357},
+		},
+		{
+			FieldElement{-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540},
+			FieldElement{23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397},
+			FieldElement{7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325},
+		},
+		{
+			FieldElement{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380},
+			FieldElement{4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306},
+			FieldElement{19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942},
+		},
+		{
+			FieldElement{-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777},
+			FieldElement{-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737},
+			FieldElement{-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652},
+		},
+		{
+			FieldElement{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766},
+			FieldElement{-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701},
+			FieldElement{28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300},
+		},
+		{
+			FieldElement{14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726},
+			FieldElement{-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955},
+			FieldElement{27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425},
+		},
+	},
+	{
+		{
+			FieldElement{-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171},
+			FieldElement{27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510},
+			FieldElement{17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660},
+		},
+		{
+			FieldElement{-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639},
+			FieldElement{29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963},
+			FieldElement{5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950},
+		},
+		{
+			FieldElement{-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568},
+			FieldElement{12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335},
+			FieldElement{25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628},
+		},
+		{
+			FieldElement{-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007},
+			FieldElement{-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772},
+			FieldElement{-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653},
+		},
+		{
+			FieldElement{2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567},
+			FieldElement{13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686},
+			FieldElement{21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372},
+		},
+		{
+			FieldElement{-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887},
+			FieldElement{-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954},
+			FieldElement{-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953},
+		},
+		{
+			FieldElement{24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833},
+			FieldElement{-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532},
+			FieldElement{-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876},
+		},
+		{
+			FieldElement{2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268},
+			FieldElement{33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214},
+			FieldElement{1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038},
+		},
+	},
+	{
+		{
+			FieldElement{6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800},
+			FieldElement{4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645},
+			FieldElement{-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664},
+		},
+		{
+			FieldElement{1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933},
+			FieldElement{-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182},
+			FieldElement{-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222},
+		},
+		{
+			FieldElement{-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991},
+			FieldElement{20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880},
+			FieldElement{9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092},
+		},
+		{
+			FieldElement{-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295},
+			FieldElement{19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788},
+			FieldElement{8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553},
+		},
+		{
+			FieldElement{-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026},
+			FieldElement{11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347},
+			FieldElement{-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033},
+		},
+		{
+			FieldElement{-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395},
+			FieldElement{-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278},
+			FieldElement{1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890},
+		},
+		{
+			FieldElement{32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995},
+			FieldElement{-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596},
+			FieldElement{-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891},
+		},
+		{
+			FieldElement{31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060},
+			FieldElement{11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608},
+			FieldElement{-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606},
+		},
+	},
+	{
+		{
+			FieldElement{7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389},
+			FieldElement{-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016},
+			FieldElement{-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341},
+		},
+		{
+			FieldElement{-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505},
+			FieldElement{14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553},
+			FieldElement{-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655},
+		},
+		{
+			FieldElement{15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220},
+			FieldElement{12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631},
+			FieldElement{-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099},
+		},
+		{
+			FieldElement{26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556},
+			FieldElement{14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749},
+			FieldElement{236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930},
+		},
+		{
+			FieldElement{1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391},
+			FieldElement{5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253},
+			FieldElement{20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066},
+		},
+		{
+			FieldElement{24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958},
+			FieldElement{-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082},
+			FieldElement{-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383},
+		},
+		{
+			FieldElement{-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521},
+			FieldElement{-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807},
+			FieldElement{23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948},
+		},
+		{
+			FieldElement{9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134},
+			FieldElement{-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455},
+			FieldElement{27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629},
+		},
+	},
+	{
+		{
+			FieldElement{-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069},
+			FieldElement{-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746},
+			FieldElement{24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919},
+		},
+		{
+			FieldElement{11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837},
+			FieldElement{8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906},
+			FieldElement{-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771},
+		},
+		{
+			FieldElement{-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817},
+			FieldElement{10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098},
+			FieldElement{10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409},
+		},
+		{
+			FieldElement{-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504},
+			FieldElement{-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727},
+			FieldElement{28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420},
+		},
+		{
+			FieldElement{-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003},
+			FieldElement{-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605},
+			FieldElement{-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384},
+		},
+		{
+			FieldElement{-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701},
+			FieldElement{-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683},
+			FieldElement{29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708},
+		},
+		{
+			FieldElement{-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563},
+			FieldElement{-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260},
+			FieldElement{-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387},
+		},
+		{
+			FieldElement{-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672},
+			FieldElement{23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686},
+			FieldElement{-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665},
+		},
+	},
+	{
+		{
+			FieldElement{11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182},
+			FieldElement{-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277},
+			FieldElement{14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628},
+		},
+		{
+			FieldElement{-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474},
+			FieldElement{-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539},
+			FieldElement{-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822},
+		},
+		{
+			FieldElement{-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970},
+			FieldElement{19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756},
+			FieldElement{-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508},
+		},
+		{
+			FieldElement{-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683},
+			FieldElement{-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655},
+			FieldElement{-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158},
+		},
+		{
+			FieldElement{-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125},
+			FieldElement{-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839},
+			FieldElement{-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664},
+		},
+		{
+			FieldElement{27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294},
+			FieldElement{-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899},
+			FieldElement{-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070},
+		},
+		{
+			FieldElement{3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294},
+			FieldElement{-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949},
+			FieldElement{-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083},
+		},
+		{
+			FieldElement{31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420},
+			FieldElement{-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940},
+			FieldElement{29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396},
+		},
+	},
+	{
+		{
+			FieldElement{-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567},
+			FieldElement{20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127},
+			FieldElement{-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294},
+		},
+		{
+			FieldElement{-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887},
+			FieldElement{22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964},
+			FieldElement{16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195},
+		},
+		{
+			FieldElement{9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244},
+			FieldElement{24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999},
+			FieldElement{-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762},
+		},
+		{
+			FieldElement{-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274},
+			FieldElement{-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236},
+			FieldElement{-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605},
+		},
+		{
+			FieldElement{-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761},
+			FieldElement{-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884},
+			FieldElement{-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482},
+		},
+		{
+			FieldElement{-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638},
+			FieldElement{-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490},
+			FieldElement{-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170},
+		},
+		{
+			FieldElement{5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736},
+			FieldElement{10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124},
+			FieldElement{-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392},
+		},
+		{
+			FieldElement{8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029},
+			FieldElement{6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048},
+			FieldElement{28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958},
+		},
+	},
+	{
+		{
+			FieldElement{24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593},
+			FieldElement{26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071},
+			FieldElement{-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692},
+		},
+		{
+			FieldElement{11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687},
+			FieldElement{-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441},
+			FieldElement{-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001},
+		},
+		{
+			FieldElement{-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460},
+			FieldElement{-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007},
+			FieldElement{-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762},
+		},
+		{
+			FieldElement{15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005},
+			FieldElement{-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674},
+			FieldElement{4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035},
+		},
+		{
+			FieldElement{7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590},
+			FieldElement{-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957},
+			FieldElement{-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812},
+		},
+		{
+			FieldElement{33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740},
+			FieldElement{-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122},
+			FieldElement{-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158},
+		},
+		{
+			FieldElement{8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885},
+			FieldElement{26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140},
+			FieldElement{19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857},
+		},
+		{
+			FieldElement{801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155},
+			FieldElement{19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260},
+			FieldElement{19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483},
+		},
+	},
+	{
+		{
+			FieldElement{-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677},
+			FieldElement{32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815},
+			FieldElement{22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751},
+		},
+		{
+			FieldElement{-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203},
+			FieldElement{-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208},
+			FieldElement{1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230},
+		},
+		{
+			FieldElement{16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850},
+			FieldElement{-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389},
+			FieldElement{-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968},
+		},
+		{
+			FieldElement{-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689},
+			FieldElement{14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880},
+			FieldElement{5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304},
+		},
+		{
+			FieldElement{30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632},
+			FieldElement{-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412},
+			FieldElement{20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566},
+		},
+		{
+			FieldElement{-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038},
+			FieldElement{-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232},
+			FieldElement{-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943},
+		},
+		{
+			FieldElement{17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856},
+			FieldElement{23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738},
+			FieldElement{15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971},
+		},
+		{
+			FieldElement{-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718},
+			FieldElement{-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697},
+			FieldElement{-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883},
+		},
+	},
+	{
+		{
+			FieldElement{5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912},
+			FieldElement{-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358},
+			FieldElement{3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849},
+		},
+		{
+			FieldElement{29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307},
+			FieldElement{-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977},
+			FieldElement{-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335},
+		},
+		{
+			FieldElement{-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644},
+			FieldElement{-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616},
+			FieldElement{-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735},
+		},
+		{
+			FieldElement{-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099},
+			FieldElement{29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341},
+			FieldElement{-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336},
+		},
+		{
+			FieldElement{-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646},
+			FieldElement{31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425},
+			FieldElement{-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388},
+		},
+		{
+			FieldElement{-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743},
+			FieldElement{-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822},
+			FieldElement{-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462},
+		},
+		{
+			FieldElement{18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985},
+			FieldElement{9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702},
+			FieldElement{-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797},
+		},
+		{
+			FieldElement{21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293},
+			FieldElement{27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100},
+			FieldElement{19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688},
+		},
+	},
+	{
+		{
+			FieldElement{12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186},
+			FieldElement{2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610},
+			FieldElement{-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707},
+		},
+		{
+			FieldElement{7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220},
+			FieldElement{915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025},
+			FieldElement{32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044},
+		},
+		{
+			FieldElement{32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992},
+			FieldElement{-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027},
+			FieldElement{21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197},
+		},
+		{
+			FieldElement{8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901},
+			FieldElement{31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952},
+			FieldElement{19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878},
+		},
+		{
+			FieldElement{-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390},
+			FieldElement{32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730},
+			FieldElement{2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730},
+		},
+		{
+			FieldElement{-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180},
+			FieldElement{-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272},
+			FieldElement{-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715},
+		},
+		{
+			FieldElement{-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970},
+			FieldElement{-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772},
+			FieldElement{-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865},
+		},
+		{
+			FieldElement{15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750},
+			FieldElement{20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373},
+			FieldElement{32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348},
+		},
+	},
+	{
+		{
+			FieldElement{9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144},
+			FieldElement{-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195},
+			FieldElement{5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086},
+		},
+		{
+			FieldElement{-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684},
+			FieldElement{-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518},
+			FieldElement{-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233},
+		},
+		{
+			FieldElement{-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793},
+			FieldElement{-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794},
+			FieldElement{580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435},
+		},
+		{
+			FieldElement{23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921},
+			FieldElement{13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518},
+			FieldElement{2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563},
+		},
+		{
+			FieldElement{14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278},
+			FieldElement{-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024},
+			FieldElement{4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030},
+		},
+		{
+			FieldElement{10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783},
+			FieldElement{27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717},
+			FieldElement{6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844},
+		},
+		{
+			FieldElement{14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333},
+			FieldElement{16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048},
+			FieldElement{22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760},
+		},
+		{
+			FieldElement{-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760},
+			FieldElement{-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757},
+			FieldElement{-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112},
+		},
+	},
+	{
+		{
+			FieldElement{-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468},
+			FieldElement{3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184},
+			FieldElement{10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289},
+		},
+		{
+			FieldElement{15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066},
+			FieldElement{24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882},
+			FieldElement{13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226},
+		},
+		{
+			FieldElement{16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101},
+			FieldElement{29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279},
+			FieldElement{-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811},
+		},
+		{
+			FieldElement{27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709},
+			FieldElement{20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714},
+			FieldElement{-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121},
+		},
+		{
+			FieldElement{9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464},
+			FieldElement{12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847},
+			FieldElement{13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400},
+		},
+		{
+			FieldElement{4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414},
+			FieldElement{-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158},
+			FieldElement{17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045},
+		},
+		{
+			FieldElement{-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415},
+			FieldElement{-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459},
+			FieldElement{-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079},
+		},
+		{
+			FieldElement{21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412},
+			FieldElement{-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743},
+			FieldElement{-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836},
+		},
+	},
+	{
+		{
+			FieldElement{12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022},
+			FieldElement{18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429},
+			FieldElement{-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065},
+		},
+		{
+			FieldElement{30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861},
+			FieldElement{10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000},
+			FieldElement{-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101},
+		},
+		{
+			FieldElement{32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815},
+			FieldElement{29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642},
+			FieldElement{10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966},
+		},
+		{
+			FieldElement{25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574},
+			FieldElement{-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742},
+			FieldElement{-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689},
+		},
+		{
+			FieldElement{12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020},
+			FieldElement{-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772},
+			FieldElement{3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982},
+		},
+		{
+			FieldElement{-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953},
+			FieldElement{-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218},
+			FieldElement{-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265},
+		},
+		{
+			FieldElement{29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073},
+			FieldElement{-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325},
+			FieldElement{-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798},
+		},
+		{
+			FieldElement{-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870},
+			FieldElement{-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863},
+			FieldElement{-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927},
+		},
+	},
+	{
+		{
+			FieldElement{-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267},
+			FieldElement{-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663},
+			FieldElement{22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862},
+		},
+		{
+			FieldElement{-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673},
+			FieldElement{15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943},
+			FieldElement{15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020},
+		},
+		{
+			FieldElement{-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238},
+			FieldElement{11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064},
+			FieldElement{14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795},
+		},
+		{
+			FieldElement{15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052},
+			FieldElement{-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904},
+			FieldElement{29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531},
+		},
+		{
+			FieldElement{-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979},
+			FieldElement{-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841},
+			FieldElement{10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431},
+		},
+		{
+			FieldElement{10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324},
+			FieldElement{-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940},
+			FieldElement{10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320},
+		},
+		{
+			FieldElement{-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184},
+			FieldElement{14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114},
+			FieldElement{30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878},
+		},
+		{
+			FieldElement{12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784},
+			FieldElement{-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091},
+			FieldElement{-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585},
+		},
+	},
+	{
+		{
+			FieldElement{-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208},
+			FieldElement{10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864},
+			FieldElement{17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661},
+		},
+		{
+			FieldElement{7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233},
+			FieldElement{26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212},
+			FieldElement{-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525},
+		},
+		{
+			FieldElement{-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068},
+			FieldElement{9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397},
+			FieldElement{-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988},
+		},
+		{
+			FieldElement{5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889},
+			FieldElement{32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038},
+			FieldElement{14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697},
+		},
+		{
+			FieldElement{20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875},
+			FieldElement{-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905},
+			FieldElement{-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656},
+		},
+		{
+			FieldElement{11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818},
+			FieldElement{27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714},
+			FieldElement{10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203},
+		},
+		{
+			FieldElement{20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931},
+			FieldElement{-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024},
+			FieldElement{-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084},
+		},
+		{
+			FieldElement{-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204},
+			FieldElement{20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817},
+			FieldElement{27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667},
+		},
+	},
+	{
+		{
+			FieldElement{11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504},
+			FieldElement{-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768},
+			FieldElement{-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255},
+		},
+		{
+			FieldElement{6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790},
+			FieldElement{1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438},
+			FieldElement{-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333},
+		},
+		{
+			FieldElement{17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971},
+			FieldElement{31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905},
+			FieldElement{29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409},
+		},
+		{
+			FieldElement{12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409},
+			FieldElement{6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499},
+			FieldElement{-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363},
+		},
+		{
+			FieldElement{28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664},
+			FieldElement{-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324},
+			FieldElement{-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940},
+		},
+		{
+			FieldElement{13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990},
+			FieldElement{-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914},
+			FieldElement{-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290},
+		},
+		{
+			FieldElement{24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257},
+			FieldElement{-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433},
+			FieldElement{-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236},
+		},
+		{
+			FieldElement{-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045},
+			FieldElement{11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093},
+			FieldElement{-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347},
+		},
+	},
+	{
+		{
+			FieldElement{-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191},
+			FieldElement{-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507},
+			FieldElement{-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906},
+		},
+		{
+			FieldElement{3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018},
+			FieldElement{-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109},
+			FieldElement{-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926},
+		},
+		{
+			FieldElement{-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528},
+			FieldElement{8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625},
+			FieldElement{-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286},
+		},
+		{
+			FieldElement{2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033},
+			FieldElement{27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866},
+			FieldElement{21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896},
+		},
+		{
+			FieldElement{30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075},
+			FieldElement{26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347},
+			FieldElement{-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437},
+		},
+		{
+			FieldElement{-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165},
+			FieldElement{-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588},
+			FieldElement{-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193},
+		},
+		{
+			FieldElement{-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017},
+			FieldElement{-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883},
+			FieldElement{21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961},
+		},
+		{
+			FieldElement{8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043},
+			FieldElement{29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663},
+			FieldElement{-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362},
+		},
+	},
+	{
+		{
+			FieldElement{-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860},
+			FieldElement{2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466},
+			FieldElement{-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063},
+		},
+		{
+			FieldElement{-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997},
+			FieldElement{-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295},
+			FieldElement{-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369},
+		},
+		{
+			FieldElement{9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385},
+			FieldElement{18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109},
+			FieldElement{2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906},
+		},
+		{
+			FieldElement{4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424},
+			FieldElement{-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185},
+			FieldElement{7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962},
+		},
+		{
+			FieldElement{-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325},
+			FieldElement{10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593},
+			FieldElement{696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404},
+		},
+		{
+			FieldElement{-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644},
+			FieldElement{17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801},
+			FieldElement{26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804},
+		},
+		{
+			FieldElement{-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884},
+			FieldElement{-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577},
+			FieldElement{-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849},
+		},
+		{
+			FieldElement{32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473},
+			FieldElement{-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644},
+			FieldElement{-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319},
+		},
+	},
+	{
+		{
+			FieldElement{-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599},
+			FieldElement{-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768},
+			FieldElement{-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084},
+		},
+		{
+			FieldElement{-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328},
+			FieldElement{-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369},
+			FieldElement{20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920},
+		},
+		{
+			FieldElement{12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815},
+			FieldElement{-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025},
+			FieldElement{-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397},
+		},
+		{
+			FieldElement{-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448},
+			FieldElement{6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981},
+			FieldElement{30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165},
+		},
+		{
+			FieldElement{32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501},
+			FieldElement{17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073},
+			FieldElement{-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861},
+		},
+		{
+			FieldElement{14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845},
+			FieldElement{-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211},
+			FieldElement{18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870},
+		},
+		{
+			FieldElement{10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096},
+			FieldElement{33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803},
+			FieldElement{-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168},
+		},
+		{
+			FieldElement{30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965},
+			FieldElement{-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505},
+			FieldElement{18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598},
+		},
+	},
+	{
+		{
+			FieldElement{5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782},
+			FieldElement{5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900},
+			FieldElement{-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479},
+		},
+		{
+			FieldElement{-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208},
+			FieldElement{8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232},
+			FieldElement{17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719},
+		},
+		{
+			FieldElement{16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271},
+			FieldElement{-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326},
+			FieldElement{-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132},
+		},
+		{
+			FieldElement{14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300},
+			FieldElement{8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570},
+			FieldElement{15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670},
+		},
+		{
+			FieldElement{-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994},
+			FieldElement{-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913},
+			FieldElement{31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317},
+		},
+		{
+			FieldElement{-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730},
+			FieldElement{842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096},
+			FieldElement{-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078},
+		},
+		{
+			FieldElement{-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411},
+			FieldElement{-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905},
+			FieldElement{-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654},
+		},
+		{
+			FieldElement{-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870},
+			FieldElement{-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498},
+			FieldElement{12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579},
+		},
+	},
+	{
+		{
+			FieldElement{14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677},
+			FieldElement{10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647},
+			FieldElement{-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743},
+		},
+		{
+			FieldElement{-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468},
+			FieldElement{21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375},
+			FieldElement{-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155},
+		},
+		{
+			FieldElement{6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725},
+			FieldElement{-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612},
+			FieldElement{-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943},
+		},
+		{
+			FieldElement{-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944},
+			FieldElement{30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928},
+			FieldElement{9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406},
+		},
+		{
+			FieldElement{22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139},
+			FieldElement{-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963},
+			FieldElement{-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693},
+		},
+		{
+			FieldElement{1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734},
+			FieldElement{-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680},
+			FieldElement{-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410},
+		},
+		{
+			FieldElement{-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931},
+			FieldElement{-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654},
+			FieldElement{22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710},
+		},
+		{
+			FieldElement{29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180},
+			FieldElement{-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684},
+			FieldElement{-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895},
+		},
+	},
+	{
+		{
+			FieldElement{22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501},
+			FieldElement{-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413},
+			FieldElement{6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880},
+		},
+		{
+			FieldElement{-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874},
+			FieldElement{22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962},
+			FieldElement{-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899},
+		},
+		{
+			FieldElement{21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152},
+			FieldElement{9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063},
+			FieldElement{7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080},
+		},
+		{
+			FieldElement{-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146},
+			FieldElement{-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183},
+			FieldElement{-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133},
+		},
+		{
+			FieldElement{-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421},
+			FieldElement{-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622},
+			FieldElement{-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197},
+		},
+		{
+			FieldElement{2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663},
+			FieldElement{31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753},
+			FieldElement{4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755},
+		},
+		{
+			FieldElement{-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862},
+			FieldElement{-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118},
+			FieldElement{26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171},
+		},
+		{
+			FieldElement{15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380},
+			FieldElement{16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824},
+			FieldElement{28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270},
+		},
+	},
+	{
+		{
+			FieldElement{-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438},
+			FieldElement{-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584},
+			FieldElement{-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562},
+		},
+		{
+			FieldElement{30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471},
+			FieldElement{18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610},
+			FieldElement{19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269},
+		},
+		{
+			FieldElement{-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650},
+			FieldElement{14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369},
+			FieldElement{19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461},
+		},
+		{
+			FieldElement{30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462},
+			FieldElement{-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793},
+			FieldElement{-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218},
+		},
+		{
+			FieldElement{-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226},
+			FieldElement{18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019},
+			FieldElement{-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037},
+		},
+		{
+			FieldElement{31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171},
+			FieldElement{-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132},
+			FieldElement{-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841},
+		},
+		{
+			FieldElement{21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181},
+			FieldElement{-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210},
+			FieldElement{-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040},
+		},
+		{
+			FieldElement{3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935},
+			FieldElement{24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105},
+			FieldElement{-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814},
+		},
+	},
+	{
+		{
+			FieldElement{793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852},
+			FieldElement{5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581},
+			FieldElement{-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646},
+		},
+		{
+			FieldElement{10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844},
+			FieldElement{10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025},
+			FieldElement{27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453},
+		},
+		{
+			FieldElement{-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068},
+			FieldElement{4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192},
+			FieldElement{-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921},
+		},
+		{
+			FieldElement{-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259},
+			FieldElement{-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426},
+			FieldElement{-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072},
+		},
+		{
+			FieldElement{-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305},
+			FieldElement{13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832},
+			FieldElement{28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943},
+		},
+		{
+			FieldElement{-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011},
+			FieldElement{24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447},
+			FieldElement{17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494},
+		},
+		{
+			FieldElement{-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245},
+			FieldElement{-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859},
+			FieldElement{28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915},
+		},
+		{
+			FieldElement{16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707},
+			FieldElement{10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848},
+			FieldElement{-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224},
+		},
+	},
+	{
+		{
+			FieldElement{-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391},
+			FieldElement{15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215},
+			FieldElement{-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101},
+		},
+		{
+			FieldElement{23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713},
+			FieldElement{21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849},
+			FieldElement{-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930},
+		},
+		{
+			FieldElement{-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940},
+			FieldElement{-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031},
+			FieldElement{-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404},
+		},
+		{
+			FieldElement{-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243},
+			FieldElement{-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116},
+			FieldElement{-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525},
+		},
+		{
+			FieldElement{-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509},
+			FieldElement{-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883},
+			FieldElement{15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865},
+		},
+		{
+			FieldElement{-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660},
+			FieldElement{4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273},
+			FieldElement{-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138},
+		},
+		{
+			FieldElement{-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560},
+			FieldElement{-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135},
+			FieldElement{2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941},
+		},
+		{
+			FieldElement{-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739},
+			FieldElement{18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756},
+			FieldElement{-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819},
+		},
+	},
+	{
+		{
+			FieldElement{-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347},
+			FieldElement{-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028},
+			FieldElement{21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075},
+		},
+		{
+			FieldElement{16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799},
+			FieldElement{-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609},
+			FieldElement{-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817},
+		},
+		{
+			FieldElement{-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989},
+			FieldElement{-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523},
+			FieldElement{4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278},
+		},
+		{
+			FieldElement{31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045},
+			FieldElement{19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377},
+			FieldElement{24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480},
+		},
+		{
+			FieldElement{17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016},
+			FieldElement{510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426},
+			FieldElement{18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525},
+		},
+		{
+			FieldElement{13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396},
+			FieldElement{9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080},
+			FieldElement{12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892},
+		},
+		{
+			FieldElement{15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275},
+			FieldElement{11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074},
+			FieldElement{20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140},
+		},
+		{
+			FieldElement{-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717},
+			FieldElement{-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101},
+			FieldElement{24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127},
+		},
+	},
+	{
+		{
+			FieldElement{-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632},
+			FieldElement{-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415},
+			FieldElement{-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160},
+		},
+		{
+			FieldElement{31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876},
+			FieldElement{22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625},
+			FieldElement{-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478},
+		},
+		{
+			FieldElement{27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164},
+			FieldElement{26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595},
+			FieldElement{-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248},
+		},
+		{
+			FieldElement{-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858},
+			FieldElement{15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193},
+			FieldElement{8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184},
+		},
+		{
+			FieldElement{-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942},
+			FieldElement{-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635},
+			FieldElement{21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948},
+		},
+		{
+			FieldElement{11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935},
+			FieldElement{-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415},
+			FieldElement{-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416},
+		},
+		{
+			FieldElement{-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018},
+			FieldElement{4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778},
+			FieldElement{366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659},
+		},
+		{
+			FieldElement{-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385},
+			FieldElement{18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503},
+			FieldElement{476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329},
+		},
+	},
+	{
+		{
+			FieldElement{20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056},
+			FieldElement{-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838},
+			FieldElement{24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948},
+		},
+		{
+			FieldElement{-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691},
+			FieldElement{-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118},
+			FieldElement{-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517},
+		},
+		{
+			FieldElement{-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269},
+			FieldElement{-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904},
+			FieldElement{-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589},
+		},
+		{
+			FieldElement{-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193},
+			FieldElement{-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910},
+			FieldElement{-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930},
+		},
+		{
+			FieldElement{-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667},
+			FieldElement{25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481},
+			FieldElement{-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876},
+		},
+		{
+			FieldElement{22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640},
+			FieldElement{-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278},
+			FieldElement{-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112},
+		},
+		{
+			FieldElement{26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272},
+			FieldElement{17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012},
+			FieldElement{-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221},
+		},
+		{
+			FieldElement{30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046},
+			FieldElement{13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345},
+			FieldElement{-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310},
+		},
+	},
+	{
+		{
+			FieldElement{19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937},
+			FieldElement{31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636},
+			FieldElement{-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008},
+		},
+		{
+			FieldElement{-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429},
+			FieldElement{-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576},
+			FieldElement{31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066},
+		},
+		{
+			FieldElement{-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490},
+			FieldElement{-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104},
+			FieldElement{33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053},
+		},
+		{
+			FieldElement{31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275},
+			FieldElement{-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511},
+			FieldElement{22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095},
+		},
+		{
+			FieldElement{-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439},
+			FieldElement{23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939},
+			FieldElement{-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424},
+		},
+		{
+			FieldElement{2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310},
+			FieldElement{3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608},
+			FieldElement{-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079},
+		},
+		{
+			FieldElement{-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101},
+			FieldElement{21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418},
+			FieldElement{18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576},
+		},
+		{
+			FieldElement{30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356},
+			FieldElement{9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996},
+			FieldElement{-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099},
+		},
+	},
+	{
+		{
+			FieldElement{-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728},
+			FieldElement{-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658},
+			FieldElement{-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242},
+		},
+		{
+			FieldElement{-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001},
+			FieldElement{-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766},
+			FieldElement{18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373},
+		},
+		{
+			FieldElement{26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458},
+			FieldElement{-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628},
+			FieldElement{-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657},
+		},
+		{
+			FieldElement{-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062},
+			FieldElement{25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616},
+			FieldElement{31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014},
+		},
+		{
+			FieldElement{24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383},
+			FieldElement{-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814},
+			FieldElement{-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718},
+		},
+		{
+			FieldElement{30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417},
+			FieldElement{2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222},
+			FieldElement{33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444},
+		},
+		{
+			FieldElement{-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597},
+			FieldElement{23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970},
+			FieldElement{1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799},
+		},
+		{
+			FieldElement{-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647},
+			FieldElement{13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511},
+			FieldElement{-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032},
+		},
+	},
+	{
+		{
+			FieldElement{9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834},
+			FieldElement{-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461},
+			FieldElement{29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062},
+		},
+		{
+			FieldElement{-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516},
+			FieldElement{-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547},
+			FieldElement{-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240},
+		},
+		{
+			FieldElement{-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038},
+			FieldElement{-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741},
+			FieldElement{16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103},
+		},
+		{
+			FieldElement{-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747},
+			FieldElement{-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323},
+			FieldElement{31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016},
+		},
+		{
+			FieldElement{-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373},
+			FieldElement{15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228},
+			FieldElement{-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141},
+		},
+		{
+			FieldElement{16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399},
+			FieldElement{11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831},
+			FieldElement{-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376},
+		},
+		{
+			FieldElement{-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313},
+			FieldElement{-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958},
+			FieldElement{-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577},
+		},
+		{
+			FieldElement{-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743},
+			FieldElement{29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684},
+			FieldElement{-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476},
+		},
+	},
+}
diff --git a/src/ssl/test/runner/ed25519/internal/edwards25519/edwards25519.go b/src/ssl/test/runner/ed25519/internal/edwards25519/edwards25519.go
new file mode 100644
index 0000000..5f8b994
--- /dev/null
+++ b/src/ssl/test/runner/ed25519/internal/edwards25519/edwards25519.go
@@ -0,0 +1,1771 @@
+// Copyright 2016 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package edwards25519
+
+// This code is a port of the public domain, “ref10” implementation of ed25519
+// from SUPERCOP.
+
+// FieldElement represents an element of the field GF(2^255 - 19).  An element
+// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77
+// t[3]+2^102 t[4]+...+2^230 t[9].  Bounds on each t[i] vary depending on
+// context.
+type FieldElement [10]int32
+
+var zero FieldElement
+
+func FeZero(fe *FieldElement) {
+	copy(fe[:], zero[:])
+}
+
+func FeOne(fe *FieldElement) {
+	FeZero(fe)
+	fe[0] = 1
+}
+
+func FeAdd(dst, a, b *FieldElement) {
+	dst[0] = a[0] + b[0]
+	dst[1] = a[1] + b[1]
+	dst[2] = a[2] + b[2]
+	dst[3] = a[3] + b[3]
+	dst[4] = a[4] + b[4]
+	dst[5] = a[5] + b[5]
+	dst[6] = a[6] + b[6]
+	dst[7] = a[7] + b[7]
+	dst[8] = a[8] + b[8]
+	dst[9] = a[9] + b[9]
+}
+
+func FeSub(dst, a, b *FieldElement) {
+	dst[0] = a[0] - b[0]
+	dst[1] = a[1] - b[1]
+	dst[2] = a[2] - b[2]
+	dst[3] = a[3] - b[3]
+	dst[4] = a[4] - b[4]
+	dst[5] = a[5] - b[5]
+	dst[6] = a[6] - b[6]
+	dst[7] = a[7] - b[7]
+	dst[8] = a[8] - b[8]
+	dst[9] = a[9] - b[9]
+}
+
+func FeCopy(dst, src *FieldElement) {
+	copy(dst[:], src[:])
+}
+
+// Replace (f,g) with (g,g) if b == 1;
+// replace (f,g) with (f,g) if b == 0.
+//
+// Preconditions: b in {0,1}.
+func FeCMove(f, g *FieldElement, b int32) {
+	b = -b
+	f[0] ^= b & (f[0] ^ g[0])
+	f[1] ^= b & (f[1] ^ g[1])
+	f[2] ^= b & (f[2] ^ g[2])
+	f[3] ^= b & (f[3] ^ g[3])
+	f[4] ^= b & (f[4] ^ g[4])
+	f[5] ^= b & (f[5] ^ g[5])
+	f[6] ^= b & (f[6] ^ g[6])
+	f[7] ^= b & (f[7] ^ g[7])
+	f[8] ^= b & (f[8] ^ g[8])
+	f[9] ^= b & (f[9] ^ g[9])
+}
+
+func load3(in []byte) int64 {
+	var r int64
+	r = int64(in[0])
+	r |= int64(in[1]) << 8
+	r |= int64(in[2]) << 16
+	return r
+}
+
+func load4(in []byte) int64 {
+	var r int64
+	r = int64(in[0])
+	r |= int64(in[1]) << 8
+	r |= int64(in[2]) << 16
+	r |= int64(in[3]) << 24
+	return r
+}
+
+func FeFromBytes(dst *FieldElement, src *[32]byte) {
+	h0 := load4(src[:])
+	h1 := load3(src[4:]) << 6
+	h2 := load3(src[7:]) << 5
+	h3 := load3(src[10:]) << 3
+	h4 := load3(src[13:]) << 2
+	h5 := load4(src[16:])
+	h6 := load3(src[20:]) << 7
+	h7 := load3(src[23:]) << 5
+	h8 := load3(src[26:]) << 4
+	h9 := (load3(src[29:]) & 8388607) << 2
+
+	FeCombine(dst, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9)
+}
+
+// FeToBytes marshals h to s.
+// Preconditions:
+//   |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
+//
+// Write p=2^255-19; q=floor(h/p).
+// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))).
+//
+// Proof:
+//   Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4.
+//   Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4.
+//
+//   Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9).
+//   Then 0<y<1.
+//
+//   Write r=h-pq.
+//   Have 0<=r<=p-1=2^255-20.
+//   Thus 0<=r+19(2^-255)r<r+19(2^-255)2^255<=2^255-1.
+//
+//   Write x=r+19(2^-255)r+y.
+//   Then 0<x<2^255 so floor(2^(-255)x) = 0 so floor(q+2^(-255)x) = q.
+//
+//   Have q+2^(-255)x = 2^(-255)(h + 19 2^(-25) h9 + 2^(-1))
+//   so floor(2^(-255)(h + 19 2^(-25) h9 + 2^(-1))) = q.
+func FeToBytes(s *[32]byte, h *FieldElement) {
+	var carry [10]int32
+
+	q := (19*h[9] + (1 << 24)) >> 25
+	q = (h[0] + q) >> 26
+	q = (h[1] + q) >> 25
+	q = (h[2] + q) >> 26
+	q = (h[3] + q) >> 25
+	q = (h[4] + q) >> 26
+	q = (h[5] + q) >> 25
+	q = (h[6] + q) >> 26
+	q = (h[7] + q) >> 25
+	q = (h[8] + q) >> 26
+	q = (h[9] + q) >> 25
+
+	// Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20.
+	h[0] += 19 * q
+	// Goal: Output h-2^255 q, which is between 0 and 2^255-20.
+
+	carry[0] = h[0] >> 26
+	h[1] += carry[0]
+	h[0] -= carry[0] << 26
+	carry[1] = h[1] >> 25
+	h[2] += carry[1]
+	h[1] -= carry[1] << 25
+	carry[2] = h[2] >> 26
+	h[3] += carry[2]
+	h[2] -= carry[2] << 26
+	carry[3] = h[3] >> 25
+	h[4] += carry[3]
+	h[3] -= carry[3] << 25
+	carry[4] = h[4] >> 26
+	h[5] += carry[4]
+	h[4] -= carry[4] << 26
+	carry[5] = h[5] >> 25
+	h[6] += carry[5]
+	h[5] -= carry[5] << 25
+	carry[6] = h[6] >> 26
+	h[7] += carry[6]
+	h[6] -= carry[6] << 26
+	carry[7] = h[7] >> 25
+	h[8] += carry[7]
+	h[7] -= carry[7] << 25
+	carry[8] = h[8] >> 26
+	h[9] += carry[8]
+	h[8] -= carry[8] << 26
+	carry[9] = h[9] >> 25
+	h[9] -= carry[9] << 25
+	// h10 = carry9
+
+	// Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20.
+	// Have h[0]+...+2^230 h[9] between 0 and 2^255-1;
+	// evidently 2^255 h10-2^255 q = 0.
+	// Goal: Output h[0]+...+2^230 h[9].
+
+	s[0] = byte(h[0] >> 0)
+	s[1] = byte(h[0] >> 8)
+	s[2] = byte(h[0] >> 16)
+	s[3] = byte((h[0] >> 24) | (h[1] << 2))
+	s[4] = byte(h[1] >> 6)
+	s[5] = byte(h[1] >> 14)
+	s[6] = byte((h[1] >> 22) | (h[2] << 3))
+	s[7] = byte(h[2] >> 5)
+	s[8] = byte(h[2] >> 13)
+	s[9] = byte((h[2] >> 21) | (h[3] << 5))
+	s[10] = byte(h[3] >> 3)
+	s[11] = byte(h[3] >> 11)
+	s[12] = byte((h[3] >> 19) | (h[4] << 6))
+	s[13] = byte(h[4] >> 2)
+	s[14] = byte(h[4] >> 10)
+	s[15] = byte(h[4] >> 18)
+	s[16] = byte(h[5] >> 0)
+	s[17] = byte(h[5] >> 8)
+	s[18] = byte(h[5] >> 16)
+	s[19] = byte((h[5] >> 24) | (h[6] << 1))
+	s[20] = byte(h[6] >> 7)
+	s[21] = byte(h[6] >> 15)
+	s[22] = byte((h[6] >> 23) | (h[7] << 3))
+	s[23] = byte(h[7] >> 5)
+	s[24] = byte(h[7] >> 13)
+	s[25] = byte((h[7] >> 21) | (h[8] << 4))
+	s[26] = byte(h[8] >> 4)
+	s[27] = byte(h[8] >> 12)
+	s[28] = byte((h[8] >> 20) | (h[9] << 6))
+	s[29] = byte(h[9] >> 2)
+	s[30] = byte(h[9] >> 10)
+	s[31] = byte(h[9] >> 18)
+}
+
+func FeIsNegative(f *FieldElement) byte {
+	var s [32]byte
+	FeToBytes(&s, f)
+	return s[0] & 1
+}
+
+func FeIsNonZero(f *FieldElement) int32 {
+	var s [32]byte
+	FeToBytes(&s, f)
+	var x uint8
+	for _, b := range s {
+		x |= b
+	}
+	x |= x >> 4
+	x |= x >> 2
+	x |= x >> 1
+	return int32(x & 1)
+}
+
+// FeNeg sets h = -f
+//
+// Preconditions:
+//    |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
+//
+// Postconditions:
+//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
+func FeNeg(h, f *FieldElement) {
+	h[0] = -f[0]
+	h[1] = -f[1]
+	h[2] = -f[2]
+	h[3] = -f[3]
+	h[4] = -f[4]
+	h[5] = -f[5]
+	h[6] = -f[6]
+	h[7] = -f[7]
+	h[8] = -f[8]
+	h[9] = -f[9]
+}
+
+func FeCombine(h *FieldElement, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 int64) {
+	var c0, c1, c2, c3, c4, c5, c6, c7, c8, c9 int64
+
+	/*
+	  |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38))
+	    i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8
+	  |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19))
+	    i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9
+	*/
+
+	c0 = (h0 + (1 << 25)) >> 26
+	h1 += c0
+	h0 -= c0 << 26
+	c4 = (h4 + (1 << 25)) >> 26
+	h5 += c4
+	h4 -= c4 << 26
+	/* |h0| <= 2^25 */
+	/* |h4| <= 2^25 */
+	/* |h1| <= 1.51*2^58 */
+	/* |h5| <= 1.51*2^58 */
+
+	c1 = (h1 + (1 << 24)) >> 25
+	h2 += c1
+	h1 -= c1 << 25
+	c5 = (h5 + (1 << 24)) >> 25
+	h6 += c5
+	h5 -= c5 << 25
+	/* |h1| <= 2^24; from now on fits into int32 */
+	/* |h5| <= 2^24; from now on fits into int32 */
+	/* |h2| <= 1.21*2^59 */
+	/* |h6| <= 1.21*2^59 */
+
+	c2 = (h2 + (1 << 25)) >> 26
+	h3 += c2
+	h2 -= c2 << 26
+	c6 = (h6 + (1 << 25)) >> 26
+	h7 += c6
+	h6 -= c6 << 26
+	/* |h2| <= 2^25; from now on fits into int32 unchanged */
+	/* |h6| <= 2^25; from now on fits into int32 unchanged */
+	/* |h3| <= 1.51*2^58 */
+	/* |h7| <= 1.51*2^58 */
+
+	c3 = (h3 + (1 << 24)) >> 25
+	h4 += c3
+	h3 -= c3 << 25
+	c7 = (h7 + (1 << 24)) >> 25
+	h8 += c7
+	h7 -= c7 << 25
+	/* |h3| <= 2^24; from now on fits into int32 unchanged */
+	/* |h7| <= 2^24; from now on fits into int32 unchanged */
+	/* |h4| <= 1.52*2^33 */
+	/* |h8| <= 1.52*2^33 */
+
+	c4 = (h4 + (1 << 25)) >> 26
+	h5 += c4
+	h4 -= c4 << 26
+	c8 = (h8 + (1 << 25)) >> 26
+	h9 += c8
+	h8 -= c8 << 26
+	/* |h4| <= 2^25; from now on fits into int32 unchanged */
+	/* |h8| <= 2^25; from now on fits into int32 unchanged */
+	/* |h5| <= 1.01*2^24 */
+	/* |h9| <= 1.51*2^58 */
+
+	c9 = (h9 + (1 << 24)) >> 25
+	h0 += c9 * 19
+	h9 -= c9 << 25
+	/* |h9| <= 2^24; from now on fits into int32 unchanged */
+	/* |h0| <= 1.8*2^37 */
+
+	c0 = (h0 + (1 << 25)) >> 26
+	h1 += c0
+	h0 -= c0 << 26
+	/* |h0| <= 2^25; from now on fits into int32 unchanged */
+	/* |h1| <= 1.01*2^24 */
+
+	h[0] = int32(h0)
+	h[1] = int32(h1)
+	h[2] = int32(h2)
+	h[3] = int32(h3)
+	h[4] = int32(h4)
+	h[5] = int32(h5)
+	h[6] = int32(h6)
+	h[7] = int32(h7)
+	h[8] = int32(h8)
+	h[9] = int32(h9)
+}
+
+// FeMul calculates h = f * g
+// Can overlap h with f or g.
+//
+// Preconditions:
+//    |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
+//    |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
+//
+// Postconditions:
+//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
+//
+// Notes on implementation strategy:
+//
+// Using schoolbook multiplication.
+// Karatsuba would save a little in some cost models.
+//
+// Most multiplications by 2 and 19 are 32-bit precomputations;
+// cheaper than 64-bit postcomputations.
+//
+// There is one remaining multiplication by 19 in the carry chain;
+// one *19 precomputation can be merged into this,
+// but the resulting data flow is considerably less clean.
+//
+// There are 12 carries below.
+// 10 of them are 2-way parallelizable and vectorizable.
+// Can get away with 11 carries, but then data flow is much deeper.
+//
+// With tighter constraints on inputs, can squeeze carries into int32.
+func FeMul(h, f, g *FieldElement) {
+	f0 := int64(f[0])
+	f1 := int64(f[1])
+	f2 := int64(f[2])
+	f3 := int64(f[3])
+	f4 := int64(f[4])
+	f5 := int64(f[5])
+	f6 := int64(f[6])
+	f7 := int64(f[7])
+	f8 := int64(f[8])
+	f9 := int64(f[9])
+
+	f1_2 := int64(2 * f[1])
+	f3_2 := int64(2 * f[3])
+	f5_2 := int64(2 * f[5])
+	f7_2 := int64(2 * f[7])
+	f9_2 := int64(2 * f[9])
+
+	g0 := int64(g[0])
+	g1 := int64(g[1])
+	g2 := int64(g[2])
+	g3 := int64(g[3])
+	g4 := int64(g[4])
+	g5 := int64(g[5])
+	g6 := int64(g[6])
+	g7 := int64(g[7])
+	g8 := int64(g[8])
+	g9 := int64(g[9])
+
+	g1_19 := int64(19 * g[1]) /* 1.4*2^29 */
+	g2_19 := int64(19 * g[2]) /* 1.4*2^30; still ok */
+	g3_19 := int64(19 * g[3])
+	g4_19 := int64(19 * g[4])
+	g5_19 := int64(19 * g[5])
+	g6_19 := int64(19 * g[6])
+	g7_19 := int64(19 * g[7])
+	g8_19 := int64(19 * g[8])
+	g9_19 := int64(19 * g[9])
+
+	h0 := f0*g0 + f1_2*g9_19 + f2*g8_19 + f3_2*g7_19 + f4*g6_19 + f5_2*g5_19 + f6*g4_19 + f7_2*g3_19 + f8*g2_19 + f9_2*g1_19
+	h1 := f0*g1 + f1*g0 + f2*g9_19 + f3*g8_19 + f4*g7_19 + f5*g6_19 + f6*g5_19 + f7*g4_19 + f8*g3_19 + f9*g2_19
+	h2 := f0*g2 + f1_2*g1 + f2*g0 + f3_2*g9_19 + f4*g8_19 + f5_2*g7_19 + f6*g6_19 + f7_2*g5_19 + f8*g4_19 + f9_2*g3_19
+	h3 := f0*g3 + f1*g2 + f2*g1 + f3*g0 + f4*g9_19 + f5*g8_19 + f6*g7_19 + f7*g6_19 + f8*g5_19 + f9*g4_19
+	h4 := f0*g4 + f1_2*g3 + f2*g2 + f3_2*g1 + f4*g0 + f5_2*g9_19 + f6*g8_19 + f7_2*g7_19 + f8*g6_19 + f9_2*g5_19
+	h5 := f0*g5 + f1*g4 + f2*g3 + f3*g2 + f4*g1 + f5*g0 + f6*g9_19 + f7*g8_19 + f8*g7_19 + f9*g6_19
+	h6 := f0*g6 + f1_2*g5 + f2*g4 + f3_2*g3 + f4*g2 + f5_2*g1 + f6*g0 + f7_2*g9_19 + f8*g8_19 + f9_2*g7_19
+	h7 := f0*g7 + f1*g6 + f2*g5 + f3*g4 + f4*g3 + f5*g2 + f6*g1 + f7*g0 + f8*g9_19 + f9*g8_19
+	h8 := f0*g8 + f1_2*g7 + f2*g6 + f3_2*g5 + f4*g4 + f5_2*g3 + f6*g2 + f7_2*g1 + f8*g0 + f9_2*g9_19
+	h9 := f0*g9 + f1*g8 + f2*g7 + f3*g6 + f4*g5 + f5*g4 + f6*g3 + f7*g2 + f8*g1 + f9*g0
+
+	FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9)
+}
+
+func feSquare(f *FieldElement) (h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 int64) {
+	f0 := int64(f[0])
+	f1 := int64(f[1])
+	f2 := int64(f[2])
+	f3 := int64(f[3])
+	f4 := int64(f[4])
+	f5 := int64(f[5])
+	f6 := int64(f[6])
+	f7 := int64(f[7])
+	f8 := int64(f[8])
+	f9 := int64(f[9])
+	f0_2 := int64(2 * f[0])
+	f1_2 := int64(2 * f[1])
+	f2_2 := int64(2 * f[2])
+	f3_2 := int64(2 * f[3])
+	f4_2 := int64(2 * f[4])
+	f5_2 := int64(2 * f[5])
+	f6_2 := int64(2 * f[6])
+	f7_2 := int64(2 * f[7])
+	f5_38 := 38 * f5 // 1.31*2^30
+	f6_19 := 19 * f6 // 1.31*2^30
+	f7_38 := 38 * f7 // 1.31*2^30
+	f8_19 := 19 * f8 // 1.31*2^30
+	f9_38 := 38 * f9 // 1.31*2^30
+
+	h0 = f0*f0 + f1_2*f9_38 + f2_2*f8_19 + f3_2*f7_38 + f4_2*f6_19 + f5*f5_38
+	h1 = f0_2*f1 + f2*f9_38 + f3_2*f8_19 + f4*f7_38 + f5_2*f6_19
+	h2 = f0_2*f2 + f1_2*f1 + f3_2*f9_38 + f4_2*f8_19 + f5_2*f7_38 + f6*f6_19
+	h3 = f0_2*f3 + f1_2*f2 + f4*f9_38 + f5_2*f8_19 + f6*f7_38
+	h4 = f0_2*f4 + f1_2*f3_2 + f2*f2 + f5_2*f9_38 + f6_2*f8_19 + f7*f7_38
+	h5 = f0_2*f5 + f1_2*f4 + f2_2*f3 + f6*f9_38 + f7_2*f8_19
+	h6 = f0_2*f6 + f1_2*f5_2 + f2_2*f4 + f3_2*f3 + f7_2*f9_38 + f8*f8_19
+	h7 = f0_2*f7 + f1_2*f6 + f2_2*f5 + f3_2*f4 + f8*f9_38
+	h8 = f0_2*f8 + f1_2*f7_2 + f2_2*f6 + f3_2*f5_2 + f4*f4 + f9*f9_38
+	h9 = f0_2*f9 + f1_2*f8 + f2_2*f7 + f3_2*f6 + f4_2*f5
+
+	return
+}
+
+// FeSquare calculates h = f*f. Can overlap h with f.
+//
+// Preconditions:
+//    |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.
+//
+// Postconditions:
+//    |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.
+func FeSquare(h, f *FieldElement) {
+	h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 := feSquare(f)
+	FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9)
+}
+
+// FeSquare2 sets h = 2 * f * f
+//
+// Can overlap h with f.
+//
+// Preconditions:
+//    |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.
+//
+// Postconditions:
+//    |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc.
+// See fe_mul.c for discussion of implementation strategy.
+func FeSquare2(h, f *FieldElement) {
+	h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 := feSquare(f)
+
+	h0 += h0
+	h1 += h1
+	h2 += h2
+	h3 += h3
+	h4 += h4
+	h5 += h5
+	h6 += h6
+	h7 += h7
+	h8 += h8
+	h9 += h9
+
+	FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9)
+}
+
+func FeInvert(out, z *FieldElement) {
+	var t0, t1, t2, t3 FieldElement
+	var i int
+
+	FeSquare(&t0, z)        // 2^1
+	FeSquare(&t1, &t0)      // 2^2
+	for i = 1; i < 2; i++ { // 2^3
+		FeSquare(&t1, &t1)
+	}
+	FeMul(&t1, z, &t1)      // 2^3 + 2^0
+	FeMul(&t0, &t0, &t1)    // 2^3 + 2^1 + 2^0
+	FeSquare(&t2, &t0)      // 2^4 + 2^2 + 2^1
+	FeMul(&t1, &t1, &t2)    // 2^4 + 2^3 + 2^2 + 2^1 + 2^0
+	FeSquare(&t2, &t1)      // 5,4,3,2,1
+	for i = 1; i < 5; i++ { // 9,8,7,6,5
+		FeSquare(&t2, &t2)
+	}
+	FeMul(&t1, &t2, &t1)     // 9,8,7,6,5,4,3,2,1,0
+	FeSquare(&t2, &t1)       // 10..1
+	for i = 1; i < 10; i++ { // 19..10
+		FeSquare(&t2, &t2)
+	}
+	FeMul(&t2, &t2, &t1)     // 19..0
+	FeSquare(&t3, &t2)       // 20..1
+	for i = 1; i < 20; i++ { // 39..20
+		FeSquare(&t3, &t3)
+	}
+	FeMul(&t2, &t3, &t2)     // 39..0
+	FeSquare(&t2, &t2)       // 40..1
+	for i = 1; i < 10; i++ { // 49..10
+		FeSquare(&t2, &t2)
+	}
+	FeMul(&t1, &t2, &t1)     // 49..0
+	FeSquare(&t2, &t1)       // 50..1
+	for i = 1; i < 50; i++ { // 99..50
+		FeSquare(&t2, &t2)
+	}
+	FeMul(&t2, &t2, &t1)      // 99..0
+	FeSquare(&t3, &t2)        // 100..1
+	for i = 1; i < 100; i++ { // 199..100
+		FeSquare(&t3, &t3)
+	}
+	FeMul(&t2, &t3, &t2)     // 199..0
+	FeSquare(&t2, &t2)       // 200..1
+	for i = 1; i < 50; i++ { // 249..50
+		FeSquare(&t2, &t2)
+	}
+	FeMul(&t1, &t2, &t1)    // 249..0
+	FeSquare(&t1, &t1)      // 250..1
+	for i = 1; i < 5; i++ { // 254..5
+		FeSquare(&t1, &t1)
+	}
+	FeMul(out, &t1, &t0) // 254..5,3,1,0
+}
+
+func fePow22523(out, z *FieldElement) {
+	var t0, t1, t2 FieldElement
+	var i int
+
+	FeSquare(&t0, z)
+	for i = 1; i < 1; i++ {
+		FeSquare(&t0, &t0)
+	}
+	FeSquare(&t1, &t0)
+	for i = 1; i < 2; i++ {
+		FeSquare(&t1, &t1)
+	}
+	FeMul(&t1, z, &t1)
+	FeMul(&t0, &t0, &t1)
+	FeSquare(&t0, &t0)
+	for i = 1; i < 1; i++ {
+		FeSquare(&t0, &t0)
+	}
+	FeMul(&t0, &t1, &t0)
+	FeSquare(&t1, &t0)
+	for i = 1; i < 5; i++ {
+		FeSquare(&t1, &t1)
+	}
+	FeMul(&t0, &t1, &t0)
+	FeSquare(&t1, &t0)
+	for i = 1; i < 10; i++ {
+		FeSquare(&t1, &t1)
+	}
+	FeMul(&t1, &t1, &t0)
+	FeSquare(&t2, &t1)
+	for i = 1; i < 20; i++ {
+		FeSquare(&t2, &t2)
+	}
+	FeMul(&t1, &t2, &t1)
+	FeSquare(&t1, &t1)
+	for i = 1; i < 10; i++ {
+		FeSquare(&t1, &t1)
+	}
+	FeMul(&t0, &t1, &t0)
+	FeSquare(&t1, &t0)
+	for i = 1; i < 50; i++ {
+		FeSquare(&t1, &t1)
+	}
+	FeMul(&t1, &t1, &t0)
+	FeSquare(&t2, &t1)
+	for i = 1; i < 100; i++ {
+		FeSquare(&t2, &t2)
+	}
+	FeMul(&t1, &t2, &t1)
+	FeSquare(&t1, &t1)
+	for i = 1; i < 50; i++ {
+		FeSquare(&t1, &t1)
+	}
+	FeMul(&t0, &t1, &t0)
+	FeSquare(&t0, &t0)
+	for i = 1; i < 2; i++ {
+		FeSquare(&t0, &t0)
+	}
+	FeMul(out, &t0, z)
+}
+
+// Group elements are members of the elliptic curve -x^2 + y^2 = 1 + d * x^2 *
+// y^2 where d = -121665/121666.
+//
+// Several representations are used:
+//   ProjectiveGroupElement: (X:Y:Z) satisfying x=X/Z, y=Y/Z
+//   ExtendedGroupElement: (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT
+//   CompletedGroupElement: ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T
+//   PreComputedGroupElement: (y+x,y-x,2dxy)
+
+type ProjectiveGroupElement struct {
+	X, Y, Z FieldElement
+}
+
+type ExtendedGroupElement struct {
+	X, Y, Z, T FieldElement
+}
+
+type CompletedGroupElement struct {
+	X, Y, Z, T FieldElement
+}
+
+type PreComputedGroupElement struct {
+	yPlusX, yMinusX, xy2d FieldElement
+}
+
+type CachedGroupElement struct {
+	yPlusX, yMinusX, Z, T2d FieldElement
+}
+
+func (p *ProjectiveGroupElement) Zero() {
+	FeZero(&p.X)
+	FeOne(&p.Y)
+	FeOne(&p.Z)
+}
+
+func (p *ProjectiveGroupElement) Double(r *CompletedGroupElement) {
+	var t0 FieldElement
+
+	FeSquare(&r.X, &p.X)
+	FeSquare(&r.Z, &p.Y)
+	FeSquare2(&r.T, &p.Z)
+	FeAdd(&r.Y, &p.X, &p.Y)
+	FeSquare(&t0, &r.Y)
+	FeAdd(&r.Y, &r.Z, &r.X)
+	FeSub(&r.Z, &r.Z, &r.X)
+	FeSub(&r.X, &t0, &r.Y)
+	FeSub(&r.T, &r.T, &r.Z)
+}
+
+func (p *ProjectiveGroupElement) ToBytes(s *[32]byte) {
+	var recip, x, y FieldElement
+
+	FeInvert(&recip, &p.Z)
+	FeMul(&x, &p.X, &recip)
+	FeMul(&y, &p.Y, &recip)
+	FeToBytes(s, &y)
+	s[31] ^= FeIsNegative(&x) << 7
+}
+
+func (p *ExtendedGroupElement) Zero() {
+	FeZero(&p.X)
+	FeOne(&p.Y)
+	FeOne(&p.Z)
+	FeZero(&p.T)
+}
+
+func (p *ExtendedGroupElement) Double(r *CompletedGroupElement) {
+	var q ProjectiveGroupElement
+	p.ToProjective(&q)
+	q.Double(r)
+}
+
+func (p *ExtendedGroupElement) ToCached(r *CachedGroupElement) {
+	FeAdd(&r.yPlusX, &p.Y, &p.X)
+	FeSub(&r.yMinusX, &p.Y, &p.X)
+	FeCopy(&r.Z, &p.Z)
+	FeMul(&r.T2d, &p.T, &d2)
+}
+
+func (p *ExtendedGroupElement) ToProjective(r *ProjectiveGroupElement) {
+	FeCopy(&r.X, &p.X)
+	FeCopy(&r.Y, &p.Y)
+	FeCopy(&r.Z, &p.Z)
+}
+
+func (p *ExtendedGroupElement) ToBytes(s *[32]byte) {
+	var recip, x, y FieldElement
+
+	FeInvert(&recip, &p.Z)
+	FeMul(&x, &p.X, &recip)
+	FeMul(&y, &p.Y, &recip)
+	FeToBytes(s, &y)
+	s[31] ^= FeIsNegative(&x) << 7
+}
+
+func (p *ExtendedGroupElement) FromBytes(s *[32]byte) bool {
+	var u, v, v3, vxx, check FieldElement
+
+	FeFromBytes(&p.Y, s)
+	FeOne(&p.Z)
+	FeSquare(&u, &p.Y)
+	FeMul(&v, &u, &d)
+	FeSub(&u, &u, &p.Z) // y = y^2-1
+	FeAdd(&v, &v, &p.Z) // v = dy^2+1
+
+	FeSquare(&v3, &v)
+	FeMul(&v3, &v3, &v) // v3 = v^3
+	FeSquare(&p.X, &v3)
+	FeMul(&p.X, &p.X, &v)
+	FeMul(&p.X, &p.X, &u) // x = uv^7
+
+	fePow22523(&p.X, &p.X) // x = (uv^7)^((q-5)/8)
+	FeMul(&p.X, &p.X, &v3)
+	FeMul(&p.X, &p.X, &u) // x = uv^3(uv^7)^((q-5)/8)
+
+	var tmpX, tmp2 [32]byte
+
+	FeSquare(&vxx, &p.X)
+	FeMul(&vxx, &vxx, &v)
+	FeSub(&check, &vxx, &u) // vx^2-u
+	if FeIsNonZero(&check) == 1 {
+		FeAdd(&check, &vxx, &u) // vx^2+u
+		if FeIsNonZero(&check) == 1 {
+			return false
+		}
+		FeMul(&p.X, &p.X, &SqrtM1)
+
+		FeToBytes(&tmpX, &p.X)
+		for i, v := range tmpX {
+			tmp2[31-i] = v
+		}
+	}
+
+	if FeIsNegative(&p.X) != (s[31] >> 7) {
+		FeNeg(&p.X, &p.X)
+	}
+
+	FeMul(&p.T, &p.X, &p.Y)
+	return true
+}
+
+func (p *CompletedGroupElement) ToProjective(r *ProjectiveGroupElement) {
+	FeMul(&r.X, &p.X, &p.T)
+	FeMul(&r.Y, &p.Y, &p.Z)
+	FeMul(&r.Z, &p.Z, &p.T)
+}
+
+func (p *CompletedGroupElement) ToExtended(r *ExtendedGroupElement) {
+	FeMul(&r.X, &p.X, &p.T)
+	FeMul(&r.Y, &p.Y, &p.Z)
+	FeMul(&r.Z, &p.Z, &p.T)
+	FeMul(&r.T, &p.X, &p.Y)
+}
+
+func (p *PreComputedGroupElement) Zero() {
+	FeOne(&p.yPlusX)
+	FeOne(&p.yMinusX)
+	FeZero(&p.xy2d)
+}
+
+func geAdd(r *CompletedGroupElement, p *ExtendedGroupElement, q *CachedGroupElement) {
+	var t0 FieldElement
+
+	FeAdd(&r.X, &p.Y, &p.X)
+	FeSub(&r.Y, &p.Y, &p.X)
+	FeMul(&r.Z, &r.X, &q.yPlusX)
+	FeMul(&r.Y, &r.Y, &q.yMinusX)
+	FeMul(&r.T, &q.T2d, &p.T)
+	FeMul(&r.X, &p.Z, &q.Z)
+	FeAdd(&t0, &r.X, &r.X)
+	FeSub(&r.X, &r.Z, &r.Y)
+	FeAdd(&r.Y, &r.Z, &r.Y)
+	FeAdd(&r.Z, &t0, &r.T)
+	FeSub(&r.T, &t0, &r.T)
+}
+
+func geSub(r *CompletedGroupElement, p *ExtendedGroupElement, q *CachedGroupElement) {
+	var t0 FieldElement
+
+	FeAdd(&r.X, &p.Y, &p.X)
+	FeSub(&r.Y, &p.Y, &p.X)
+	FeMul(&r.Z, &r.X, &q.yMinusX)
+	FeMul(&r.Y, &r.Y, &q.yPlusX)
+	FeMul(&r.T, &q.T2d, &p.T)
+	FeMul(&r.X, &p.Z, &q.Z)
+	FeAdd(&t0, &r.X, &r.X)
+	FeSub(&r.X, &r.Z, &r.Y)
+	FeAdd(&r.Y, &r.Z, &r.Y)
+	FeSub(&r.Z, &t0, &r.T)
+	FeAdd(&r.T, &t0, &r.T)
+}
+
+func geMixedAdd(r *CompletedGroupElement, p *ExtendedGroupElement, q *PreComputedGroupElement) {
+	var t0 FieldElement
+
+	FeAdd(&r.X, &p.Y, &p.X)
+	FeSub(&r.Y, &p.Y, &p.X)
+	FeMul(&r.Z, &r.X, &q.yPlusX)
+	FeMul(&r.Y, &r.Y, &q.yMinusX)
+	FeMul(&r.T, &q.xy2d, &p.T)
+	FeAdd(&t0, &p.Z, &p.Z)
+	FeSub(&r.X, &r.Z, &r.Y)
+	FeAdd(&r.Y, &r.Z, &r.Y)
+	FeAdd(&r.Z, &t0, &r.T)
+	FeSub(&r.T, &t0, &r.T)
+}
+
+func geMixedSub(r *CompletedGroupElement, p *ExtendedGroupElement, q *PreComputedGroupElement) {
+	var t0 FieldElement
+
+	FeAdd(&r.X, &p.Y, &p.X)
+	FeSub(&r.Y, &p.Y, &p.X)
+	FeMul(&r.Z, &r.X, &q.yMinusX)
+	FeMul(&r.Y, &r.Y, &q.yPlusX)
+	FeMul(&r.T, &q.xy2d, &p.T)
+	FeAdd(&t0, &p.Z, &p.Z)
+	FeSub(&r.X, &r.Z, &r.Y)
+	FeAdd(&r.Y, &r.Z, &r.Y)
+	FeSub(&r.Z, &t0, &r.T)
+	FeAdd(&r.T, &t0, &r.T)
+}
+
+func slide(r *[256]int8, a *[32]byte) {
+	for i := range r {
+		r[i] = int8(1 & (a[i>>3] >> uint(i&7)))
+	}
+
+	for i := range r {
+		if r[i] != 0 {
+			for b := 1; b <= 6 && i+b < 256; b++ {
+				if r[i+b] != 0 {
+					if r[i]+(r[i+b]<<uint(b)) <= 15 {
+						r[i] += r[i+b] << uint(b)
+						r[i+b] = 0
+					} else if r[i]-(r[i+b]<<uint(b)) >= -15 {
+						r[i] -= r[i+b] << uint(b)
+						for k := i + b; k < 256; k++ {
+							if r[k] == 0 {
+								r[k] = 1
+								break
+							}
+							r[k] = 0
+						}
+					} else {
+						break
+					}
+				}
+			}
+		}
+	}
+}
+
+// GeDoubleScalarMultVartime sets r = a*A + b*B
+// where a = a[0]+256*a[1]+...+256^31 a[31].
+// and b = b[0]+256*b[1]+...+256^31 b[31].
+// B is the Ed25519 base point (x,4/5) with x positive.
+func GeDoubleScalarMultVartime(r *ProjectiveGroupElement, a *[32]byte, A *ExtendedGroupElement, b *[32]byte) {
+	var aSlide, bSlide [256]int8
+	var Ai [8]CachedGroupElement // A,3A,5A,7A,9A,11A,13A,15A
+	var t CompletedGroupElement
+	var u, A2 ExtendedGroupElement
+	var i int
+
+	slide(&aSlide, a)
+	slide(&bSlide, b)
+
+	A.ToCached(&Ai[0])
+	A.Double(&t)
+	t.ToExtended(&A2)
+
+	for i := 0; i < 7; i++ {
+		geAdd(&t, &A2, &Ai[i])
+		t.ToExtended(&u)
+		u.ToCached(&Ai[i+1])
+	}
+
+	r.Zero()
+
+	for i = 255; i >= 0; i-- {
+		if aSlide[i] != 0 || bSlide[i] != 0 {
+			break
+		}
+	}
+
+	for ; i >= 0; i-- {
+		r.Double(&t)
+
+		if aSlide[i] > 0 {
+			t.ToExtended(&u)
+			geAdd(&t, &u, &Ai[aSlide[i]/2])
+		} else if aSlide[i] < 0 {
+			t.ToExtended(&u)
+			geSub(&t, &u, &Ai[(-aSlide[i])/2])
+		}
+
+		if bSlide[i] > 0 {
+			t.ToExtended(&u)
+			geMixedAdd(&t, &u, &bi[bSlide[i]/2])
+		} else if bSlide[i] < 0 {
+			t.ToExtended(&u)
+			geMixedSub(&t, &u, &bi[(-bSlide[i])/2])
+		}
+
+		t.ToProjective(r)
+	}
+}
+
+// equal returns 1 if b == c and 0 otherwise, assuming that b and c are
+// non-negative.
+func equal(b, c int32) int32 {
+	x := uint32(b ^ c)
+	x--
+	return int32(x >> 31)
+}
+
+// negative returns 1 if b < 0 and 0 otherwise.
+func negative(b int32) int32 {
+	return (b >> 31) & 1
+}
+
+func PreComputedGroupElementCMove(t, u *PreComputedGroupElement, b int32) {
+	FeCMove(&t.yPlusX, &u.yPlusX, b)
+	FeCMove(&t.yMinusX, &u.yMinusX, b)
+	FeCMove(&t.xy2d, &u.xy2d, b)
+}
+
+func selectPoint(t *PreComputedGroupElement, pos int32, b int32) {
+	var minusT PreComputedGroupElement
+	bNegative := negative(b)
+	bAbs := b - (((-bNegative) & b) << 1)
+
+	t.Zero()
+	for i := int32(0); i < 8; i++ {
+		PreComputedGroupElementCMove(t, &base[pos][i], equal(bAbs, i+1))
+	}
+	FeCopy(&minusT.yPlusX, &t.yMinusX)
+	FeCopy(&minusT.yMinusX, &t.yPlusX)
+	FeNeg(&minusT.xy2d, &t.xy2d)
+	PreComputedGroupElementCMove(t, &minusT, bNegative)
+}
+
+// GeScalarMultBase computes h = a*B, where
+//   a = a[0]+256*a[1]+...+256^31 a[31]
+//   B is the Ed25519 base point (x,4/5) with x positive.
+//
+// Preconditions:
+//   a[31] <= 127
+func GeScalarMultBase(h *ExtendedGroupElement, a *[32]byte) {
+	var e [64]int8
+
+	for i, v := range a {
+		e[2*i] = int8(v & 15)
+		e[2*i+1] = int8((v >> 4) & 15)
+	}
+
+	// each e[i] is between 0 and 15 and e[63] is between 0 and 7.
+
+	carry := int8(0)
+	for i := 0; i < 63; i++ {
+		e[i] += carry
+		carry = (e[i] + 8) >> 4
+		e[i] -= carry << 4
+	}
+	e[63] += carry
+	// each e[i] is between -8 and 8.
+
+	h.Zero()
+	var t PreComputedGroupElement
+	var r CompletedGroupElement
+	for i := int32(1); i < 64; i += 2 {
+		selectPoint(&t, i/2, int32(e[i]))
+		geMixedAdd(&r, h, &t)
+		r.ToExtended(h)
+	}
+
+	var s ProjectiveGroupElement
+
+	h.Double(&r)
+	r.ToProjective(&s)
+	s.Double(&r)
+	r.ToProjective(&s)
+	s.Double(&r)
+	r.ToProjective(&s)
+	s.Double(&r)
+	r.ToExtended(h)
+
+	for i := int32(0); i < 64; i += 2 {
+		selectPoint(&t, i/2, int32(e[i]))
+		geMixedAdd(&r, h, &t)
+		r.ToExtended(h)
+	}
+}
+
+// The scalars are GF(2^252 + 27742317777372353535851937790883648493).
+
+// Input:
+//   a[0]+256*a[1]+...+256^31*a[31] = a
+//   b[0]+256*b[1]+...+256^31*b[31] = b
+//   c[0]+256*c[1]+...+256^31*c[31] = c
+//
+// Output:
+//   s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l
+//   where l = 2^252 + 27742317777372353535851937790883648493.
+func ScMulAdd(s, a, b, c *[32]byte) {
+	a0 := 2097151 & load3(a[:])
+	a1 := 2097151 & (load4(a[2:]) >> 5)
+	a2 := 2097151 & (load3(a[5:]) >> 2)
+	a3 := 2097151 & (load4(a[7:]) >> 7)
+	a4 := 2097151 & (load4(a[10:]) >> 4)
+	a5 := 2097151 & (load3(a[13:]) >> 1)
+	a6 := 2097151 & (load4(a[15:]) >> 6)
+	a7 := 2097151 & (load3(a[18:]) >> 3)
+	a8 := 2097151 & load3(a[21:])
+	a9 := 2097151 & (load4(a[23:]) >> 5)
+	a10 := 2097151 & (load3(a[26:]) >> 2)
+	a11 := (load4(a[28:]) >> 7)
+	b0 := 2097151 & load3(b[:])
+	b1 := 2097151 & (load4(b[2:]) >> 5)
+	b2 := 2097151 & (load3(b[5:]) >> 2)
+	b3 := 2097151 & (load4(b[7:]) >> 7)
+	b4 := 2097151 & (load4(b[10:]) >> 4)
+	b5 := 2097151 & (load3(b[13:]) >> 1)
+	b6 := 2097151 & (load4(b[15:]) >> 6)
+	b7 := 2097151 & (load3(b[18:]) >> 3)
+	b8 := 2097151 & load3(b[21:])
+	b9 := 2097151 & (load4(b[23:]) >> 5)
+	b10 := 2097151 & (load3(b[26:]) >> 2)
+	b11 := (load4(b[28:]) >> 7)
+	c0 := 2097151 & load3(c[:])
+	c1 := 2097151 & (load4(c[2:]) >> 5)
+	c2 := 2097151 & (load3(c[5:]) >> 2)
+	c3 := 2097151 & (load4(c[7:]) >> 7)
+	c4 := 2097151 & (load4(c[10:]) >> 4)
+	c5 := 2097151 & (load3(c[13:]) >> 1)
+	c6 := 2097151 & (load4(c[15:]) >> 6)
+	c7 := 2097151 & (load3(c[18:]) >> 3)
+	c8 := 2097151 & load3(c[21:])
+	c9 := 2097151 & (load4(c[23:]) >> 5)
+	c10 := 2097151 & (load3(c[26:]) >> 2)
+	c11 := (load4(c[28:]) >> 7)
+	var carry [23]int64
+
+	s0 := c0 + a0*b0
+	s1 := c1 + a0*b1 + a1*b0
+	s2 := c2 + a0*b2 + a1*b1 + a2*b0
+	s3 := c3 + a0*b3 + a1*b2 + a2*b1 + a3*b0
+	s4 := c4 + a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0
+	s5 := c5 + a0*b5 + a1*b4 + a2*b3 + a3*b2 + a4*b1 + a5*b0
+	s6 := c6 + a0*b6 + a1*b5 + a2*b4 + a3*b3 + a4*b2 + a5*b1 + a6*b0
+	s7 := c7 + a0*b7 + a1*b6 + a2*b5 + a3*b4 + a4*b3 + a5*b2 + a6*b1 + a7*b0
+	s8 := c8 + a0*b8 + a1*b7 + a2*b6 + a3*b5 + a4*b4 + a5*b3 + a6*b2 + a7*b1 + a8*b0
+	s9 := c9 + a0*b9 + a1*b8 + a2*b7 + a3*b6 + a4*b5 + a5*b4 + a6*b3 + a7*b2 + a8*b1 + a9*b0
+	s10 := c10 + a0*b10 + a1*b9 + a2*b8 + a3*b7 + a4*b6 + a5*b5 + a6*b4 + a7*b3 + a8*b2 + a9*b1 + a10*b0
+	s11 := c11 + a0*b11 + a1*b10 + a2*b9 + a3*b8 + a4*b7 + a5*b6 + a6*b5 + a7*b4 + a8*b3 + a9*b2 + a10*b1 + a11*b0
+	s12 := a1*b11 + a2*b10 + a3*b9 + a4*b8 + a5*b7 + a6*b6 + a7*b5 + a8*b4 + a9*b3 + a10*b2 + a11*b1
+	s13 := a2*b11 + a3*b10 + a4*b9 + a5*b8 + a6*b7 + a7*b6 + a8*b5 + a9*b4 + a10*b3 + a11*b2
+	s14 := a3*b11 + a4*b10 + a5*b9 + a6*b8 + a7*b7 + a8*b6 + a9*b5 + a10*b4 + a11*b3
+	s15 := a4*b11 + a5*b10 + a6*b9 + a7*b8 + a8*b7 + a9*b6 + a10*b5 + a11*b4
+	s16 := a5*b11 + a6*b10 + a7*b9 + a8*b8 + a9*b7 + a10*b6 + a11*b5
+	s17 := a6*b11 + a7*b10 + a8*b9 + a9*b8 + a10*b7 + a11*b6
+	s18 := a7*b11 + a8*b10 + a9*b9 + a10*b8 + a11*b7
+	s19 := a8*b11 + a9*b10 + a10*b9 + a11*b8
+	s20 := a9*b11 + a10*b10 + a11*b9
+	s21 := a10*b11 + a11*b10
+	s22 := a11 * b11
+	s23 := int64(0)
+
+	carry[0] = (s0 + (1 << 20)) >> 21
+	s1 += carry[0]
+	s0 -= carry[0] << 21
+	carry[2] = (s2 + (1 << 20)) >> 21
+	s3 += carry[2]
+	s2 -= carry[2] << 21
+	carry[4] = (s4 + (1 << 20)) >> 21
+	s5 += carry[4]
+	s4 -= carry[4] << 21
+	carry[6] = (s6 + (1 << 20)) >> 21
+	s7 += carry[6]
+	s6 -= carry[6] << 21
+	carry[8] = (s8 + (1 << 20)) >> 21
+	s9 += carry[8]
+	s8 -= carry[8] << 21
+	carry[10] = (s10 + (1 << 20)) >> 21
+	s11 += carry[10]
+	s10 -= carry[10] << 21
+	carry[12] = (s12 + (1 << 20)) >> 21
+	s13 += carry[12]
+	s12 -= carry[12] << 21
+	carry[14] = (s14 + (1 << 20)) >> 21
+	s15 += carry[14]
+	s14 -= carry[14] << 21
+	carry[16] = (s16 + (1 << 20)) >> 21
+	s17 += carry[16]
+	s16 -= carry[16] << 21
+	carry[18] = (s18 + (1 << 20)) >> 21
+	s19 += carry[18]
+	s18 -= carry[18] << 21
+	carry[20] = (s20 + (1 << 20)) >> 21
+	s21 += carry[20]
+	s20 -= carry[20] << 21
+	carry[22] = (s22 + (1 << 20)) >> 21
+	s23 += carry[22]
+	s22 -= carry[22] << 21
+
+	carry[1] = (s1 + (1 << 20)) >> 21
+	s2 += carry[1]
+	s1 -= carry[1] << 21
+	carry[3] = (s3 + (1 << 20)) >> 21
+	s4 += carry[3]
+	s3 -= carry[3] << 21
+	carry[5] = (s5 + (1 << 20)) >> 21
+	s6 += carry[5]
+	s5 -= carry[5] << 21
+	carry[7] = (s7 + (1 << 20)) >> 21
+	s8 += carry[7]
+	s7 -= carry[7] << 21
+	carry[9] = (s9 + (1 << 20)) >> 21
+	s10 += carry[9]
+	s9 -= carry[9] << 21
+	carry[11] = (s11 + (1 << 20)) >> 21
+	s12 += carry[11]
+	s11 -= carry[11] << 21
+	carry[13] = (s13 + (1 << 20)) >> 21
+	s14 += carry[13]
+	s13 -= carry[13] << 21
+	carry[15] = (s15 + (1 << 20)) >> 21
+	s16 += carry[15]
+	s15 -= carry[15] << 21
+	carry[17] = (s17 + (1 << 20)) >> 21
+	s18 += carry[17]
+	s17 -= carry[17] << 21
+	carry[19] = (s19 + (1 << 20)) >> 21
+	s20 += carry[19]
+	s19 -= carry[19] << 21
+	carry[21] = (s21 + (1 << 20)) >> 21
+	s22 += carry[21]
+	s21 -= carry[21] << 21
+
+	s11 += s23 * 666643
+	s12 += s23 * 470296
+	s13 += s23 * 654183
+	s14 -= s23 * 997805
+	s15 += s23 * 136657
+	s16 -= s23 * 683901
+	s23 = 0
+
+	s10 += s22 * 666643
+	s11 += s22 * 470296
+	s12 += s22 * 654183
+	s13 -= s22 * 997805
+	s14 += s22 * 136657
+	s15 -= s22 * 683901
+	s22 = 0
+
+	s9 += s21 * 666643
+	s10 += s21 * 470296
+	s11 += s21 * 654183
+	s12 -= s21 * 997805
+	s13 += s21 * 136657
+	s14 -= s21 * 683901
+	s21 = 0
+
+	s8 += s20 * 666643
+	s9 += s20 * 470296
+	s10 += s20 * 654183
+	s11 -= s20 * 997805
+	s12 += s20 * 136657
+	s13 -= s20 * 683901
+	s20 = 0
+
+	s7 += s19 * 666643
+	s8 += s19 * 470296
+	s9 += s19 * 654183
+	s10 -= s19 * 997805
+	s11 += s19 * 136657
+	s12 -= s19 * 683901
+	s19 = 0
+
+	s6 += s18 * 666643
+	s7 += s18 * 470296
+	s8 += s18 * 654183
+	s9 -= s18 * 997805
+	s10 += s18 * 136657
+	s11 -= s18 * 683901
+	s18 = 0
+
+	carry[6] = (s6 + (1 << 20)) >> 21
+	s7 += carry[6]
+	s6 -= carry[6] << 21
+	carry[8] = (s8 + (1 << 20)) >> 21
+	s9 += carry[8]
+	s8 -= carry[8] << 21
+	carry[10] = (s10 + (1 << 20)) >> 21
+	s11 += carry[10]
+	s10 -= carry[10] << 21
+	carry[12] = (s12 + (1 << 20)) >> 21
+	s13 += carry[12]
+	s12 -= carry[12] << 21
+	carry[14] = (s14 + (1 << 20)) >> 21
+	s15 += carry[14]
+	s14 -= carry[14] << 21
+	carry[16] = (s16 + (1 << 20)) >> 21
+	s17 += carry[16]
+	s16 -= carry[16] << 21
+
+	carry[7] = (s7 + (1 << 20)) >> 21
+	s8 += carry[7]
+	s7 -= carry[7] << 21
+	carry[9] = (s9 + (1 << 20)) >> 21
+	s10 += carry[9]
+	s9 -= carry[9] << 21
+	carry[11] = (s11 + (1 << 20)) >> 21
+	s12 += carry[11]
+	s11 -= carry[11] << 21
+	carry[13] = (s13 + (1 << 20)) >> 21
+	s14 += carry[13]
+	s13 -= carry[13] << 21
+	carry[15] = (s15 + (1 << 20)) >> 21
+	s16 += carry[15]
+	s15 -= carry[15] << 21
+
+	s5 += s17 * 666643
+	s6 += s17 * 470296
+	s7 += s17 * 654183
+	s8 -= s17 * 997805
+	s9 += s17 * 136657
+	s10 -= s17 * 683901
+	s17 = 0
+
+	s4 += s16 * 666643
+	s5 += s16 * 470296
+	s6 += s16 * 654183
+	s7 -= s16 * 997805
+	s8 += s16 * 136657
+	s9 -= s16 * 683901
+	s16 = 0
+
+	s3 += s15 * 666643
+	s4 += s15 * 470296
+	s5 += s15 * 654183
+	s6 -= s15 * 997805
+	s7 += s15 * 136657
+	s8 -= s15 * 683901
+	s15 = 0
+
+	s2 += s14 * 666643
+	s3 += s14 * 470296
+	s4 += s14 * 654183
+	s5 -= s14 * 997805
+	s6 += s14 * 136657
+	s7 -= s14 * 683901
+	s14 = 0
+
+	s1 += s13 * 666643
+	s2 += s13 * 470296
+	s3 += s13 * 654183
+	s4 -= s13 * 997805
+	s5 += s13 * 136657
+	s6 -= s13 * 683901
+	s13 = 0
+
+	s0 += s12 * 666643
+	s1 += s12 * 470296
+	s2 += s12 * 654183
+	s3 -= s12 * 997805
+	s4 += s12 * 136657
+	s5 -= s12 * 683901
+	s12 = 0
+
+	carry[0] = (s0 + (1 << 20)) >> 21
+	s1 += carry[0]
+	s0 -= carry[0] << 21
+	carry[2] = (s2 + (1 << 20)) >> 21
+	s3 += carry[2]
+	s2 -= carry[2] << 21
+	carry[4] = (s4 + (1 << 20)) >> 21
+	s5 += carry[4]
+	s4 -= carry[4] << 21
+	carry[6] = (s6 + (1 << 20)) >> 21
+	s7 += carry[6]
+	s6 -= carry[6] << 21
+	carry[8] = (s8 + (1 << 20)) >> 21
+	s9 += carry[8]
+	s8 -= carry[8] << 21
+	carry[10] = (s10 + (1 << 20)) >> 21
+	s11 += carry[10]
+	s10 -= carry[10] << 21
+
+	carry[1] = (s1 + (1 << 20)) >> 21
+	s2 += carry[1]
+	s1 -= carry[1] << 21
+	carry[3] = (s3 + (1 << 20)) >> 21
+	s4 += carry[3]
+	s3 -= carry[3] << 21
+	carry[5] = (s5 + (1 << 20)) >> 21
+	s6 += carry[5]
+	s5 -= carry[5] << 21
+	carry[7] = (s7 + (1 << 20)) >> 21
+	s8 += carry[7]
+	s7 -= carry[7] << 21
+	carry[9] = (s9 + (1 << 20)) >> 21
+	s10 += carry[9]
+	s9 -= carry[9] << 21
+	carry[11] = (s11 + (1 << 20)) >> 21
+	s12 += carry[11]
+	s11 -= carry[11] << 21
+
+	s0 += s12 * 666643
+	s1 += s12 * 470296
+	s2 += s12 * 654183
+	s3 -= s12 * 997805
+	s4 += s12 * 136657
+	s5 -= s12 * 683901
+	s12 = 0
+
+	carry[0] = s0 >> 21
+	s1 += carry[0]
+	s0 -= carry[0] << 21
+	carry[1] = s1 >> 21
+	s2 += carry[1]
+	s1 -= carry[1] << 21
+	carry[2] = s2 >> 21
+	s3 += carry[2]
+	s2 -= carry[2] << 21
+	carry[3] = s3 >> 21
+	s4 += carry[3]
+	s3 -= carry[3] << 21
+	carry[4] = s4 >> 21
+	s5 += carry[4]
+	s4 -= carry[4] << 21
+	carry[5] = s5 >> 21
+	s6 += carry[5]
+	s5 -= carry[5] << 21
+	carry[6] = s6 >> 21
+	s7 += carry[6]
+	s6 -= carry[6] << 21
+	carry[7] = s7 >> 21
+	s8 += carry[7]
+	s7 -= carry[7] << 21
+	carry[8] = s8 >> 21
+	s9 += carry[8]
+	s8 -= carry[8] << 21
+	carry[9] = s9 >> 21
+	s10 += carry[9]
+	s9 -= carry[9] << 21
+	carry[10] = s10 >> 21
+	s11 += carry[10]
+	s10 -= carry[10] << 21
+	carry[11] = s11 >> 21
+	s12 += carry[11]
+	s11 -= carry[11] << 21
+
+	s0 += s12 * 666643
+	s1 += s12 * 470296
+	s2 += s12 * 654183
+	s3 -= s12 * 997805
+	s4 += s12 * 136657
+	s5 -= s12 * 683901
+	s12 = 0
+
+	carry[0] = s0 >> 21
+	s1 += carry[0]
+	s0 -= carry[0] << 21
+	carry[1] = s1 >> 21
+	s2 += carry[1]
+	s1 -= carry[1] << 21
+	carry[2] = s2 >> 21
+	s3 += carry[2]
+	s2 -= carry[2] << 21
+	carry[3] = s3 >> 21
+	s4 += carry[3]
+	s3 -= carry[3] << 21
+	carry[4] = s4 >> 21
+	s5 += carry[4]
+	s4 -= carry[4] << 21
+	carry[5] = s5 >> 21
+	s6 += carry[5]
+	s5 -= carry[5] << 21
+	carry[6] = s6 >> 21
+	s7 += carry[6]
+	s6 -= carry[6] << 21
+	carry[7] = s7 >> 21
+	s8 += carry[7]
+	s7 -= carry[7] << 21
+	carry[8] = s8 >> 21
+	s9 += carry[8]
+	s8 -= carry[8] << 21
+	carry[9] = s9 >> 21
+	s10 += carry[9]
+	s9 -= carry[9] << 21
+	carry[10] = s10 >> 21
+	s11 += carry[10]
+	s10 -= carry[10] << 21
+
+	s[0] = byte(s0 >> 0)
+	s[1] = byte(s0 >> 8)
+	s[2] = byte((s0 >> 16) | (s1 << 5))
+	s[3] = byte(s1 >> 3)
+	s[4] = byte(s1 >> 11)
+	s[5] = byte((s1 >> 19) | (s2 << 2))
+	s[6] = byte(s2 >> 6)
+	s[7] = byte((s2 >> 14) | (s3 << 7))
+	s[8] = byte(s3 >> 1)
+	s[9] = byte(s3 >> 9)
+	s[10] = byte((s3 >> 17) | (s4 << 4))
+	s[11] = byte(s4 >> 4)
+	s[12] = byte(s4 >> 12)
+	s[13] = byte((s4 >> 20) | (s5 << 1))
+	s[14] = byte(s5 >> 7)
+	s[15] = byte((s5 >> 15) | (s6 << 6))
+	s[16] = byte(s6 >> 2)
+	s[17] = byte(s6 >> 10)
+	s[18] = byte((s6 >> 18) | (s7 << 3))
+	s[19] = byte(s7 >> 5)
+	s[20] = byte(s7 >> 13)
+	s[21] = byte(s8 >> 0)
+	s[22] = byte(s8 >> 8)
+	s[23] = byte((s8 >> 16) | (s9 << 5))
+	s[24] = byte(s9 >> 3)
+	s[25] = byte(s9 >> 11)
+	s[26] = byte((s9 >> 19) | (s10 << 2))
+	s[27] = byte(s10 >> 6)
+	s[28] = byte((s10 >> 14) | (s11 << 7))
+	s[29] = byte(s11 >> 1)
+	s[30] = byte(s11 >> 9)
+	s[31] = byte(s11 >> 17)
+}
+
+// Input:
+//   s[0]+256*s[1]+...+256^63*s[63] = s
+//
+// Output:
+//   s[0]+256*s[1]+...+256^31*s[31] = s mod l
+//   where l = 2^252 + 27742317777372353535851937790883648493.
+func ScReduce(out *[32]byte, s *[64]byte) {
+	s0 := 2097151 & load3(s[:])
+	s1 := 2097151 & (load4(s[2:]) >> 5)
+	s2 := 2097151 & (load3(s[5:]) >> 2)
+	s3 := 2097151 & (load4(s[7:]) >> 7)
+	s4 := 2097151 & (load4(s[10:]) >> 4)
+	s5 := 2097151 & (load3(s[13:]) >> 1)
+	s6 := 2097151 & (load4(s[15:]) >> 6)
+	s7 := 2097151 & (load3(s[18:]) >> 3)
+	s8 := 2097151 & load3(s[21:])
+	s9 := 2097151 & (load4(s[23:]) >> 5)
+	s10 := 2097151 & (load3(s[26:]) >> 2)
+	s11 := 2097151 & (load4(s[28:]) >> 7)
+	s12 := 2097151 & (load4(s[31:]) >> 4)
+	s13 := 2097151 & (load3(s[34:]) >> 1)
+	s14 := 2097151 & (load4(s[36:]) >> 6)
+	s15 := 2097151 & (load3(s[39:]) >> 3)
+	s16 := 2097151 & load3(s[42:])
+	s17 := 2097151 & (load4(s[44:]) >> 5)
+	s18 := 2097151 & (load3(s[47:]) >> 2)
+	s19 := 2097151 & (load4(s[49:]) >> 7)
+	s20 := 2097151 & (load4(s[52:]) >> 4)
+	s21 := 2097151 & (load3(s[55:]) >> 1)
+	s22 := 2097151 & (load4(s[57:]) >> 6)
+	s23 := (load4(s[60:]) >> 3)
+
+	s11 += s23 * 666643
+	s12 += s23 * 470296
+	s13 += s23 * 654183
+	s14 -= s23 * 997805
+	s15 += s23 * 136657
+	s16 -= s23 * 683901
+	s23 = 0
+
+	s10 += s22 * 666643
+	s11 += s22 * 470296
+	s12 += s22 * 654183
+	s13 -= s22 * 997805
+	s14 += s22 * 136657
+	s15 -= s22 * 683901
+	s22 = 0
+
+	s9 += s21 * 666643
+	s10 += s21 * 470296
+	s11 += s21 * 654183
+	s12 -= s21 * 997805
+	s13 += s21 * 136657
+	s14 -= s21 * 683901
+	s21 = 0
+
+	s8 += s20 * 666643
+	s9 += s20 * 470296
+	s10 += s20 * 654183
+	s11 -= s20 * 997805
+	s12 += s20 * 136657
+	s13 -= s20 * 683901
+	s20 = 0
+
+	s7 += s19 * 666643
+	s8 += s19 * 470296
+	s9 += s19 * 654183
+	s10 -= s19 * 997805
+	s11 += s19 * 136657
+	s12 -= s19 * 683901
+	s19 = 0
+
+	s6 += s18 * 666643
+	s7 += s18 * 470296
+	s8 += s18 * 654183
+	s9 -= s18 * 997805
+	s10 += s18 * 136657
+	s11 -= s18 * 683901
+	s18 = 0
+
+	var carry [17]int64
+
+	carry[6] = (s6 + (1 << 20)) >> 21
+	s7 += carry[6]
+	s6 -= carry[6] << 21
+	carry[8] = (s8 + (1 << 20)) >> 21
+	s9 += carry[8]
+	s8 -= carry[8] << 21
+	carry[10] = (s10 + (1 << 20)) >> 21
+	s11 += carry[10]
+	s10 -= carry[10] << 21
+	carry[12] = (s12 + (1 << 20)) >> 21
+	s13 += carry[12]
+	s12 -= carry[12] << 21
+	carry[14] = (s14 + (1 << 20)) >> 21
+	s15 += carry[14]
+	s14 -= carry[14] << 21
+	carry[16] = (s16 + (1 << 20)) >> 21
+	s17 += carry[16]
+	s16 -= carry[16] << 21
+
+	carry[7] = (s7 + (1 << 20)) >> 21
+	s8 += carry[7]
+	s7 -= carry[7] << 21
+	carry[9] = (s9 + (1 << 20)) >> 21
+	s10 += carry[9]
+	s9 -= carry[9] << 21
+	carry[11] = (s11 + (1 << 20)) >> 21
+	s12 += carry[11]
+	s11 -= carry[11] << 21
+	carry[13] = (s13 + (1 << 20)) >> 21
+	s14 += carry[13]
+	s13 -= carry[13] << 21
+	carry[15] = (s15 + (1 << 20)) >> 21
+	s16 += carry[15]
+	s15 -= carry[15] << 21
+
+	s5 += s17 * 666643
+	s6 += s17 * 470296
+	s7 += s17 * 654183
+	s8 -= s17 * 997805
+	s9 += s17 * 136657
+	s10 -= s17 * 683901
+	s17 = 0
+
+	s4 += s16 * 666643
+	s5 += s16 * 470296
+	s6 += s16 * 654183
+	s7 -= s16 * 997805
+	s8 += s16 * 136657
+	s9 -= s16 * 683901
+	s16 = 0
+
+	s3 += s15 * 666643
+	s4 += s15 * 470296
+	s5 += s15 * 654183
+	s6 -= s15 * 997805
+	s7 += s15 * 136657
+	s8 -= s15 * 683901
+	s15 = 0
+
+	s2 += s14 * 666643
+	s3 += s14 * 470296
+	s4 += s14 * 654183
+	s5 -= s14 * 997805
+	s6 += s14 * 136657
+	s7 -= s14 * 683901
+	s14 = 0
+
+	s1 += s13 * 666643
+	s2 += s13 * 470296
+	s3 += s13 * 654183
+	s4 -= s13 * 997805
+	s5 += s13 * 136657
+	s6 -= s13 * 683901
+	s13 = 0
+
+	s0 += s12 * 666643
+	s1 += s12 * 470296
+	s2 += s12 * 654183
+	s3 -= s12 * 997805
+	s4 += s12 * 136657
+	s5 -= s12 * 683901
+	s12 = 0
+
+	carry[0] = (s0 + (1 << 20)) >> 21
+	s1 += carry[0]
+	s0 -= carry[0] << 21
+	carry[2] = (s2 + (1 << 20)) >> 21
+	s3 += carry[2]
+	s2 -= carry[2] << 21
+	carry[4] = (s4 + (1 << 20)) >> 21
+	s5 += carry[4]
+	s4 -= carry[4] << 21
+	carry[6] = (s6 + (1 << 20)) >> 21
+	s7 += carry[6]
+	s6 -= carry[6] << 21
+	carry[8] = (s8 + (1 << 20)) >> 21
+	s9 += carry[8]
+	s8 -= carry[8] << 21
+	carry[10] = (s10 + (1 << 20)) >> 21
+	s11 += carry[10]
+	s10 -= carry[10] << 21
+
+	carry[1] = (s1 + (1 << 20)) >> 21
+	s2 += carry[1]
+	s1 -= carry[1] << 21
+	carry[3] = (s3 + (1 << 20)) >> 21
+	s4 += carry[3]
+	s3 -= carry[3] << 21
+	carry[5] = (s5 + (1 << 20)) >> 21
+	s6 += carry[5]
+	s5 -= carry[5] << 21
+	carry[7] = (s7 + (1 << 20)) >> 21
+	s8 += carry[7]
+	s7 -= carry[7] << 21
+	carry[9] = (s9 + (1 << 20)) >> 21
+	s10 += carry[9]
+	s9 -= carry[9] << 21
+	carry[11] = (s11 + (1 << 20)) >> 21
+	s12 += carry[11]
+	s11 -= carry[11] << 21
+
+	s0 += s12 * 666643
+	s1 += s12 * 470296
+	s2 += s12 * 654183
+	s3 -= s12 * 997805
+	s4 += s12 * 136657
+	s5 -= s12 * 683901
+	s12 = 0
+
+	carry[0] = s0 >> 21
+	s1 += carry[0]
+	s0 -= carry[0] << 21
+	carry[1] = s1 >> 21
+	s2 += carry[1]
+	s1 -= carry[1] << 21
+	carry[2] = s2 >> 21
+	s3 += carry[2]
+	s2 -= carry[2] << 21
+	carry[3] = s3 >> 21
+	s4 += carry[3]
+	s3 -= carry[3] << 21
+	carry[4] = s4 >> 21
+	s5 += carry[4]
+	s4 -= carry[4] << 21
+	carry[5] = s5 >> 21
+	s6 += carry[5]
+	s5 -= carry[5] << 21
+	carry[6] = s6 >> 21
+	s7 += carry[6]
+	s6 -= carry[6] << 21
+	carry[7] = s7 >> 21
+	s8 += carry[7]
+	s7 -= carry[7] << 21
+	carry[8] = s8 >> 21
+	s9 += carry[8]
+	s8 -= carry[8] << 21
+	carry[9] = s9 >> 21
+	s10 += carry[9]
+	s9 -= carry[9] << 21
+	carry[10] = s10 >> 21
+	s11 += carry[10]
+	s10 -= carry[10] << 21
+	carry[11] = s11 >> 21
+	s12 += carry[11]
+	s11 -= carry[11] << 21
+
+	s0 += s12 * 666643
+	s1 += s12 * 470296
+	s2 += s12 * 654183
+	s3 -= s12 * 997805
+	s4 += s12 * 136657
+	s5 -= s12 * 683901
+	s12 = 0
+
+	carry[0] = s0 >> 21
+	s1 += carry[0]
+	s0 -= carry[0] << 21
+	carry[1] = s1 >> 21
+	s2 += carry[1]
+	s1 -= carry[1] << 21
+	carry[2] = s2 >> 21
+	s3 += carry[2]
+	s2 -= carry[2] << 21
+	carry[3] = s3 >> 21
+	s4 += carry[3]
+	s3 -= carry[3] << 21
+	carry[4] = s4 >> 21
+	s5 += carry[4]
+	s4 -= carry[4] << 21
+	carry[5] = s5 >> 21
+	s6 += carry[5]
+	s5 -= carry[5] << 21
+	carry[6] = s6 >> 21
+	s7 += carry[6]
+	s6 -= carry[6] << 21
+	carry[7] = s7 >> 21
+	s8 += carry[7]
+	s7 -= carry[7] << 21
+	carry[8] = s8 >> 21
+	s9 += carry[8]
+	s8 -= carry[8] << 21
+	carry[9] = s9 >> 21
+	s10 += carry[9]
+	s9 -= carry[9] << 21
+	carry[10] = s10 >> 21
+	s11 += carry[10]
+	s10 -= carry[10] << 21
+
+	out[0] = byte(s0 >> 0)
+	out[1] = byte(s0 >> 8)
+	out[2] = byte((s0 >> 16) | (s1 << 5))
+	out[3] = byte(s1 >> 3)
+	out[4] = byte(s1 >> 11)
+	out[5] = byte((s1 >> 19) | (s2 << 2))
+	out[6] = byte(s2 >> 6)
+	out[7] = byte((s2 >> 14) | (s3 << 7))
+	out[8] = byte(s3 >> 1)
+	out[9] = byte(s3 >> 9)
+	out[10] = byte((s3 >> 17) | (s4 << 4))
+	out[11] = byte(s4 >> 4)
+	out[12] = byte(s4 >> 12)
+	out[13] = byte((s4 >> 20) | (s5 << 1))
+	out[14] = byte(s5 >> 7)
+	out[15] = byte((s5 >> 15) | (s6 << 6))
+	out[16] = byte(s6 >> 2)
+	out[17] = byte(s6 >> 10)
+	out[18] = byte((s6 >> 18) | (s7 << 3))
+	out[19] = byte(s7 >> 5)
+	out[20] = byte(s7 >> 13)
+	out[21] = byte(s8 >> 0)
+	out[22] = byte(s8 >> 8)
+	out[23] = byte((s8 >> 16) | (s9 << 5))
+	out[24] = byte(s9 >> 3)
+	out[25] = byte(s9 >> 11)
+	out[26] = byte((s9 >> 19) | (s10 << 2))
+	out[27] = byte(s10 >> 6)
+	out[28] = byte((s10 >> 14) | (s11 << 7))
+	out[29] = byte(s11 >> 1)
+	out[30] = byte(s11 >> 9)
+	out[31] = byte(s11 >> 17)
+}
diff --git a/src/ssl/test/runner/ed25519/testdata/sign.input.gz b/src/ssl/test/runner/ed25519/testdata/sign.input.gz
new file mode 100644
index 0000000..4103069
--- /dev/null
+++ b/src/ssl/test/runner/ed25519/testdata/sign.input.gz
Binary files differ
diff --git a/src/ssl/test/runner/ed25519_cert.pem b/src/ssl/test/runner/ed25519_cert.pem
new file mode 100644
index 0000000..308c2c9
--- /dev/null
+++ b/src/ssl/test/runner/ed25519_cert.pem
@@ -0,0 +1,11 @@
+-----BEGIN CERTIFICATE-----
+MIIBkTCCAUOgAwIBAgIJAJwooam0UCDmMAUGAytlcDBFMQswCQYDVQQGEwJBVTET
+MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ
+dHkgTHRkMB4XDTE0MDQyMzIzMjE1N1oXDTE0MDUyMzIzMjE1N1owRTELMAkGA1UE
+BhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdp
+ZGdpdHMgUHR5IEx0ZDAqMAUGAytlcAMhANdamAGCsQq31Uv+08lkBzoO4XLz2qYj
+Ja8CGmj3B1Eao1AwTjAdBgNVHQ4EFgQUoux7eV+fJK2v3ah6QPU/lj1/+7UwHwYD
+VR0jBBgwFoAUoux7eV+fJK2v3ah6QPU/lj1/+7UwDAYDVR0TBAUwAwEB/zAFBgMr
+ZXADQQBuCzqji8VP9xU8mHEMjXGChX7YP5J664UyVKHKH9Z1u4wEbB8dJ3ScaWSL
+r+VHVKUhsrvcdCelnXRrrSD7xWAL
+-----END CERTIFICATE-----
diff --git a/src/ssl/test/runner/ed25519_key.pem b/src/ssl/test/runner/ed25519_key.pem
new file mode 100644
index 0000000..7cf2b72
--- /dev/null
+++ b/src/ssl/test/runner/ed25519_key.pem
@@ -0,0 +1,3 @@
+-----BEGIN PRIVATE KEY-----
+MC4CAQAwBQYDK2VwBCIEIJ1hsZ3v/VpguoRK9JLsLMREScVpezJpGXA7rAMcrn9g
+-----END PRIVATE KEY-----
diff --git a/src/ssl/test/runner/handshake_client.go b/src/ssl/test/runner/handshake_client.go
index d73722c..c531a28 100644
--- a/src/ssl/test/runner/handshake_client.go
+++ b/src/ssl/test/runner/handshake_client.go
@@ -19,6 +19,8 @@
 	"net"
 	"strconv"
 	"time"
+
+	"./ed25519"
 )
 
 type clientHandshakeState struct {
@@ -820,7 +822,7 @@
 
 		c.peerSignatureAlgorithm = certVerifyMsg.signatureAlgorithm
 		input := hs.finishedHash.certificateVerifyInput(serverCertificateVerifyContextTLS13)
-		err = verifyMessage(c.vers, leaf.PublicKey, c.config, certVerifyMsg.signatureAlgorithm, input, certVerifyMsg.signature)
+		err = verifyMessage(c.vers, getCertificatePublicKey(leaf), c.config, certVerifyMsg.signatureAlgorithm, input, certVerifyMsg.signature)
 		if err != nil {
 			return err
 		}
@@ -1216,12 +1218,13 @@
 		}
 	}
 
-	switch certs[0].PublicKey.(type) {
-	case *rsa.PublicKey, *ecdsa.PublicKey:
+	publicKey := getCertificatePublicKey(certs[0])
+	switch publicKey.(type) {
+	case *rsa.PublicKey, *ecdsa.PublicKey, ed25519.PublicKey:
 		break
 	default:
 		c.sendAlert(alertUnsupportedCertificate)
-		return fmt.Errorf("tls: server's certificate contains an unsupported type of public key: %T", certs[0].PublicKey)
+		return fmt.Errorf("tls: server's certificate contains an unsupported type of public key: %T", publicKey)
 	}
 
 	c.peerCertificates = certs
@@ -1695,6 +1698,7 @@
 				switch {
 				case rsaAvail && x509Cert.PublicKeyAlgorithm == x509.RSA:
 				case ecdsaAvail && x509Cert.PublicKeyAlgorithm == x509.ECDSA:
+				case ecdsaAvail && isEd25519Certificate(x509Cert):
 				default:
 					continue findCert
 				}
diff --git a/src/ssl/test/runner/handshake_server.go b/src/ssl/test/runner/handshake_server.go
index ef144c3..8dc0446 100644
--- a/src/ssl/test/runner/handshake_server.go
+++ b/src/ssl/test/runner/handshake_server.go
@@ -17,6 +17,8 @@
 	"io"
 	"math/big"
 	"time"
+
+	"./ed25519"
 )
 
 // serverHandshakeState contains details of a server handshake in progress.
@@ -1095,6 +1097,9 @@
 	hs.ellipticOk = supportedCurve && supportedPointFormat
 
 	_, hs.ecdsaOk = hs.cert.PrivateKey.(*ecdsa.PrivateKey)
+	// Ed25519 also uses ECDSA certificates.
+	_, ed25519Ok := hs.cert.PrivateKey.(ed25519.PrivateKey)
+	hs.ecdsaOk = hs.ecdsaOk || ed25519Ok
 
 	// For test purposes, check that the peer never offers a session when
 	// renegotiating.
@@ -1859,13 +1864,13 @@
 	}
 
 	if len(certs) > 0 {
-		var pub crypto.PublicKey
-		switch key := certs[0].PublicKey.(type) {
-		case *ecdsa.PublicKey, *rsa.PublicKey:
-			pub = key
+		pub := getCertificatePublicKey(certs[0])
+		switch pub.(type) {
+		case *ecdsa.PublicKey, *rsa.PublicKey, ed25519.PublicKey:
+			break
 		default:
 			c.sendAlert(alertUnsupportedCertificate)
-			return nil, fmt.Errorf("tls: client's certificate contains an unsupported public key of type %T", certs[0].PublicKey)
+			return nil, fmt.Errorf("tls: client's certificate contains an unsupported public key of type %T", pub)
 		}
 		c.peerCertificates = certs
 		return pub, nil
diff --git a/src/ssl/test/runner/key_agreement.go b/src/ssl/test/runner/key_agreement.go
index 2a3e924..3936d88 100644
--- a/src/ssl/test/runner/key_agreement.go
+++ b/src/ssl/test/runner/key_agreement.go
@@ -17,6 +17,7 @@
 	"math/big"
 
 	"./curve25519"
+	"./ed25519"
 )
 
 type keyType int
@@ -378,14 +379,16 @@
 
 func (ka *signedKeyAgreement) verifyParameters(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, params []byte, sig []byte) error {
 	// The peer's key must match the cipher type.
+	publicKey := getCertificatePublicKey(cert)
 	switch ka.keyType {
 	case keyTypeECDSA:
-		_, ok := cert.PublicKey.(*ecdsa.PublicKey)
-		if !ok {
-			return errors.New("tls: ECDHE ECDSA requires a ECDSA server public key")
+		_, edsaOk := publicKey.(*ecdsa.PublicKey)
+		_, ed25519Ok := publicKey.(ed25519.PublicKey)
+		if !edsaOk && !ed25519Ok {
+			return errors.New("tls: ECDHE ECDSA requires a ECDSA or Ed25519 server public key")
 		}
 	case keyTypeRSA:
-		_, ok := cert.PublicKey.(*rsa.PublicKey)
+		_, ok := publicKey.(*rsa.PublicKey)
 		if !ok {
 			return errors.New("tls: ECDHE RSA requires a RSA server public key")
 		}
@@ -419,7 +422,7 @@
 	}
 	sig = sig[2:]
 
-	return verifyMessage(ka.version, cert.PublicKey, config, sigAlg, msg, sig)
+	return verifyMessage(ka.version, publicKey, config, sigAlg, msg, sig)
 }
 
 // ecdheKeyAgreement implements a TLS key agreement where the server
diff --git a/src/ssl/test/runner/runner.go b/src/ssl/test/runner/runner.go
index 8444c21..b795d0a 100644
--- a/src/ssl/test/runner/runner.go
+++ b/src/ssl/test/runner/runner.go
@@ -65,7 +65,6 @@
 	looseErrors        = flag.Bool("loose-errors", false, "If true, allow shims to report an untranslated error code.")
 	shimConfigFile     = flag.String("shim-config", "", "A config file to use to configure the tests for this shim.")
 	includeDisabled    = flag.Bool("include-disabled", false, "If true, also runs disabled tests.")
-	includeDHE         = flag.Bool("include-dhe", false, "If true, test DHE ciphersuites.")
 	repeatUntilFailure = flag.Bool("repeat-until-failure", false, "If true, the first selected test will be run repeatedly until failure.")
 )
 
@@ -104,6 +103,7 @@
 	testCertECDSAP256
 	testCertECDSAP384
 	testCertECDSAP521
+	testCertEd25519
 )
 
 const (
@@ -114,6 +114,7 @@
 	ecdsaP256CertificateFile = "ecdsa_p256_cert.pem"
 	ecdsaP384CertificateFile = "ecdsa_p384_cert.pem"
 	ecdsaP521CertificateFile = "ecdsa_p521_cert.pem"
+	ed25519CertificateFile   = "ed25519_cert.pem"
 )
 
 const (
@@ -124,6 +125,7 @@
 	ecdsaP256KeyFile = "ecdsa_p256_key.pem"
 	ecdsaP384KeyFile = "ecdsa_p384_key.pem"
 	ecdsaP521KeyFile = "ecdsa_p521_key.pem"
+	ed25519KeyFile   = "ed25519_key.pem"
 	channelIDKeyFile = "channel_id_key.pem"
 )
 
@@ -135,6 +137,7 @@
 	ecdsaP256Certificate Certificate
 	ecdsaP384Certificate Certificate
 	ecdsaP521Certificate Certificate
+	ed25519Certificate   Certificate
 )
 
 var testCerts = []struct {
@@ -184,6 +187,12 @@
 		keyFile:  ecdsaP521KeyFile,
 		cert:     &ecdsaP521Certificate,
 	},
+	{
+		id:       testCertEd25519,
+		certFile: ed25519CertificateFile,
+		keyFile:  ed25519KeyFile,
+		cert:     &ed25519Certificate,
+	},
 }
 
 var channelIDKey *ecdsa.PrivateKey
@@ -367,6 +376,10 @@
 	// shimWritesFirst controls whether the shim sends an initial "hello"
 	// message before doing a roundtrip with the runner.
 	shimWritesFirst bool
+	// readWithUnfinishedWrite behaves like shimWritesFirst, but the shim
+	// does not complete the write until responding to the first runner
+	// message.
+	readWithUnfinishedWrite bool
 	// shimShutsDown, if true, runs a test where the shim shuts down the
 	// connection immediately after the handshake rather than echoing
 	// messages from the runner.
@@ -668,36 +681,26 @@
 		}
 	}
 
-	if test.shimWritesFirst {
-		var buf [5]byte
-		_, err := io.ReadFull(tlsConn, buf[:])
-		if err != nil {
-			return err
-		}
-		if string(buf[:]) != "hello" {
-			return fmt.Errorf("bad initial message")
-		}
-	}
-
-	for i := 0; i < test.sendKeyUpdates; i++ {
-		if err := tlsConn.SendKeyUpdate(test.keyUpdateRequest); err != nil {
-			return err
-		}
-	}
-
-	for i := 0; i < test.sendEmptyRecords; i++ {
-		tlsConn.Write(nil)
-	}
-
-	for i := 0; i < test.sendWarningAlerts; i++ {
-		tlsConn.SendAlert(alertLevelWarning, alertUnexpectedMessage)
-	}
-
 	if test.sendHalfHelloRequest {
 		tlsConn.SendHalfHelloRequest()
 	}
 
+	shimPrefixPending := test.shimWritesFirst || test.readWithUnfinishedWrite
 	if test.renegotiate > 0 {
+		// If readWithUnfinishedWrite is set, the shim prefix will be
+		// available later.
+		if shimPrefixPending && !test.readWithUnfinishedWrite {
+			var buf [5]byte
+			_, err := io.ReadFull(tlsConn, buf[:])
+			if err != nil {
+				return err
+			}
+			if string(buf[:]) != "hello" {
+				return fmt.Errorf("bad initial message")
+			}
+			shimPrefixPending = false
+		}
+
 		if test.renegotiateCiphers != nil {
 			config.CipherSuites = test.renegotiateCiphers
 		}
@@ -735,12 +738,6 @@
 	}
 
 	for j := 0; j < messageCount; j++ {
-		testMessage := make([]byte, messageLen)
-		for i := range testMessage {
-			testMessage[i] = 0x42 ^ byte(j)
-		}
-		tlsConn.Write(testMessage)
-
 		for i := 0; i < test.sendKeyUpdates; i++ {
 			tlsConn.SendKeyUpdate(test.keyUpdateRequest)
 		}
@@ -753,11 +750,38 @@
 			tlsConn.SendAlert(alertLevelWarning, alertUnexpectedMessage)
 		}
 
+		testMessage := make([]byte, messageLen)
+		for i := range testMessage {
+			testMessage[i] = 0x42 ^ byte(j)
+		}
+		tlsConn.Write(testMessage)
+
+		// Consume the shim prefix if needed.
+		if shimPrefixPending {
+			var buf [5]byte
+			_, err := io.ReadFull(tlsConn, buf[:])
+			if err != nil {
+				return err
+			}
+			if string(buf[:]) != "hello" {
+				return fmt.Errorf("bad initial message")
+			}
+			shimPrefixPending = false
+		}
+
 		if test.shimShutsDown || test.expectMessageDropped {
 			// The shim will not respond.
 			continue
 		}
 
+		// Process the KeyUpdate ACK. However many KeyUpdates the runner
+		// sends, the shim should respond only once.
+		if test.sendKeyUpdates > 0 && test.keyUpdateRequest == keyUpdateRequested {
+			if err := tlsConn.ReadKeyUpdateACK(); err != nil {
+				return err
+			}
+		}
+
 		buf := make([]byte, len(testMessage))
 		if test.protocol == dtls {
 			bufTmp := make([]byte, len(buf)+1)
@@ -930,6 +954,10 @@
 		flags = append(flags, "-shim-writes-first")
 	}
 
+	if test.readWithUnfinishedWrite {
+		flags = append(flags, "-read-with-unfinished-write")
+	}
+
 	if test.shimShutsDown {
 		flags = append(flags, "-shim-shuts-down")
 	}
@@ -1433,14 +1461,14 @@
 			name:          "DisableEverything",
 			flags:         []string{"-no-tls13", "-no-tls12", "-no-tls11", "-no-tls1", "-no-ssl3"},
 			shouldFail:    true,
-			expectedError: ":WRONG_SSL_VERSION:",
+			expectedError: ":NO_SUPPORTED_VERSIONS_ENABLED:",
 		},
 		{
 			protocol:      dtls,
 			name:          "DisableEverything-DTLS",
 			flags:         []string{"-no-tls12", "-no-tls1"},
 			shouldFail:    true,
-			expectedError: ":WRONG_SSL_VERSION:",
+			expectedError: ":NO_SUPPORTED_VERSIONS_ENABLED:",
 		},
 		{
 			protocol: dtls,
@@ -1467,32 +1495,6 @@
 			expectedLocalError: "dtls: exceeded maximum packet length",
 		},
 		{
-			name: "CertMismatchRSA",
-			config: Config{
-				MaxVersion:   VersionTLS12,
-				CipherSuites: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
-				Certificates: []Certificate{ecdsaP256Certificate},
-				Bugs: ProtocolBugs{
-					SendCipherSuite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
-				},
-			},
-			shouldFail:    true,
-			expectedError: ":WRONG_CERTIFICATE_TYPE:",
-		},
-		{
-			name: "CertMismatchECDSA",
-			config: Config{
-				MaxVersion:   VersionTLS12,
-				CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
-				Certificates: []Certificate{rsaCertificate},
-				Bugs: ProtocolBugs{
-					SendCipherSuite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
-				},
-			},
-			shouldFail:    true,
-			expectedError: ":WRONG_CERTIFICATE_TYPE:",
-		},
-		{
 			name: "EmptyCertificateList",
 			config: Config{
 				MaxVersion: VersionTLS12,
@@ -2317,6 +2319,38 @@
 			expectedError:    ":DECODE_ERROR:",
 		},
 		{
+			// Test that KeyUpdates are acknowledged properly.
+			name: "KeyUpdate-RequestACK",
+			config: Config{
+				MaxVersion: VersionTLS13,
+				Bugs: ProtocolBugs{
+					RejectUnsolicitedKeyUpdate: true,
+				},
+			},
+			// Test the shim receiving many KeyUpdates in a row.
+			sendKeyUpdates:   5,
+			messageCount:     5,
+			keyUpdateRequest: keyUpdateRequested,
+		},
+		{
+			// Test that KeyUpdates are acknowledged properly if the
+			// peer's KeyUpdate is discovered while a write is
+			// pending.
+			name: "KeyUpdate-RequestACK-UnfinishedWrite",
+			config: Config{
+				MaxVersion: VersionTLS13,
+				Bugs: ProtocolBugs{
+					RejectUnsolicitedKeyUpdate: true,
+				},
+			},
+			// Test the shim receiving many KeyUpdates in a row.
+			sendKeyUpdates:          5,
+			messageCount:            5,
+			keyUpdateRequest:        keyUpdateRequested,
+			readWithUnfinishedWrite: true,
+			flags: []string{"-async"},
+		},
+		{
 			name: "SendSNIWarningAlert",
 			config: Config{
 				MaxVersion: VersionTLS12,
@@ -2447,29 +2481,6 @@
 	}
 	testCases = append(testCases, basicTests...)
 
-	if *includeDHE {
-		testCases = append(testCases, testCase{
-			name: "NoFalseStart-DHE_RSA",
-			config: Config{
-				MaxVersion:   VersionTLS12,
-				CipherSuites: []uint16{TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
-				NextProtos:   []string{"foo"},
-				Bugs: ProtocolBugs{
-					ExpectFalseStart:          true,
-					AlertBeforeFalseStartTest: alertAccessDenied,
-				},
-			},
-			flags: []string{
-				"-false-start",
-				"-advertise-alpn", "\x03foo",
-			},
-			shimWritesFirst:    true,
-			shouldFail:         true,
-			expectedError:      ":TLSV1_ALERT_ACCESS_DENIED:",
-			expectedLocalError: "tls: peer did not false start: EOF",
-		})
-	}
-
 	// Test that very large messages can be received.
 	cert := rsaCertificate
 	for i := 0; i < 50; i++ {
@@ -2690,17 +2701,6 @@
 func addCipherSuiteTests() {
 	const bogusCipher = 0xfe00
 
-	if *includeDHE {
-		testCipherSuites = append(testCipherSuites, []testCipherSuite{
-			{"DHE-RSA-AES128-GCM", TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
-			{"DHE-RSA-AES128-SHA", TLS_DHE_RSA_WITH_AES_128_CBC_SHA},
-			{"DHE-RSA-AES128-SHA256", TLS_DHE_RSA_WITH_AES_128_CBC_SHA256},
-			{"DHE-RSA-AES256-GCM", TLS_DHE_RSA_WITH_AES_256_GCM_SHA384},
-			{"DHE-RSA-AES256-SHA", TLS_DHE_RSA_WITH_AES_256_CBC_SHA},
-			{"DHE-RSA-AES256-SHA256", TLS_DHE_RSA_WITH_AES_256_CBC_SHA256},
-		}...)
-	}
-
 	for _, suite := range testCipherSuites {
 		for _, ver := range tlsVersions {
 			for _, protocol := range []protocol{tls, dtls} {
@@ -2766,56 +2766,6 @@
 		expectedError: ":UNKNOWN_CIPHER_RETURNED:",
 	})
 
-	if *includeDHE {
-		testCases = append(testCases, testCase{
-			name: "WeakDH",
-			config: Config{
-				MaxVersion:   VersionTLS12,
-				CipherSuites: []uint16{TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
-				Bugs: ProtocolBugs{
-					// This is a 1023-bit prime number, generated
-					// with:
-					// openssl gendh 1023 | openssl asn1parse -i
-					DHGroupPrime: bigFromHex("518E9B7930CE61C6E445C8360584E5FC78D9137C0FFDC880B495D5338ADF7689951A6821C17A76B3ACB8E0156AEA607B7EC406EBEDBB84D8376EB8FE8F8BA1433488BEE0C3EDDFD3A32DBB9481980A7AF6C96BFCF490A094CFFB2B8192C1BB5510B77B658436E27C2D4D023FE3718222AB0CA1273995B51F6D625A4944D0DD4B"),
-				},
-			},
-			shouldFail:    true,
-			expectedError: ":BAD_DH_P_LENGTH:",
-		})
-
-		testCases = append(testCases, testCase{
-			name: "SillyDH",
-			config: Config{
-				MaxVersion:   VersionTLS12,
-				CipherSuites: []uint16{TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
-				Bugs: ProtocolBugs{
-					// This is a 4097-bit prime number, generated
-					// with:
-					// openssl gendh 4097 | openssl asn1parse -i
-					DHGroupPrime: bigFromHex("01D366FA64A47419B0CD4A45918E8D8C8430F674621956A9F52B0CA592BC104C6E38D60C58F2CA66792A2B7EBDC6F8FFE75AB7D6862C261F34E96A2AEEF53AB7C21365C2E8FB0582F71EB57B1C227C0E55AE859E9904A25EFECD7B435C4D4357BD840B03649D4A1F8037D89EA4E1967DBEEF1CC17A6111C48F12E9615FFF336D3F07064CB17C0B765A012C850B9E3AA7A6984B96D8C867DDC6D0F4AB52042572244796B7ECFF681CD3B3E2E29AAECA391A775BEE94E502FB15881B0F4AC60314EA947C0C82541C3D16FD8C0E09BB7F8F786582032859D9C13187CE6C0CB6F2D3EE6C3C9727C15F14B21D3CD2E02BDB9D119959B0E03DC9E5A91E2578762300B1517D2352FC1D0BB934A4C3E1B20CE9327DB102E89A6C64A8C3148EDFC5A94913933853442FA84451B31FD21E492F92DD5488E0D871AEBFE335A4B92431DEC69591548010E76A5B365D346786E9A2D3E589867D796AA5E25211201D757560D318A87DFB27F3E625BC373DB48BF94A63161C674C3D4265CB737418441B7650EABC209CF675A439BEB3E9D1AA1B79F67198A40CEFD1C89144F7D8BAF61D6AD36F466DA546B4174A0E0CAF5BD788C8243C7C2DDDCC3DB6FC89F12F17D19FBD9B0BC76FE92891CD6BA07BEA3B66EF12D0D85E788FD58675C1B0FBD16029DCC4D34E7A1A41471BDEDF78BF591A8B4E96D88BEC8EDC093E616292BFC096E69A916E8D624B"),
-				},
-			},
-			shouldFail:    true,
-			expectedError: ":DH_P_TOO_LONG:",
-		})
-
-		// This test ensures that Diffie-Hellman public values are padded with
-		// zeros so that they're the same length as the prime. This is to avoid
-		// hitting a bug in yaSSL.
-		testCases = append(testCases, testCase{
-			testType: serverTest,
-			name:     "DHPublicValuePadded",
-			config: Config{
-				MaxVersion:   VersionTLS12,
-				CipherSuites: []uint16{TLS_DHE_RSA_WITH_AES_128_GCM_SHA256},
-				Bugs: ProtocolBugs{
-					RequireDHPublicValueLen: (1025 + 7) / 8,
-				},
-			},
-			flags: []string{"-use-sparse-dh-prime"},
-		})
-	}
-
 	// The server must be tolerant to bogus ciphers.
 	testCases = append(testCases, testCase{
 		testType: serverTest,
@@ -2867,6 +2817,93 @@
 		},
 		flags: []string{"-psk", "secret"},
 	})
+
+	// Test that clients enforce that the server-sent certificate and cipher
+	// suite match in TLS 1.2.
+	testCases = append(testCases, testCase{
+		name: "CertificateCipherMismatch-RSA",
+		config: Config{
+			MaxVersion:   VersionTLS12,
+			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
+			Certificates: []Certificate{rsaCertificate},
+			Bugs: ProtocolBugs{
+				SendCipherSuite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
+			},
+		},
+		shouldFail:    true,
+		expectedError: ":WRONG_CERTIFICATE_TYPE:",
+	})
+	testCases = append(testCases, testCase{
+		name: "CertificateCipherMismatch-ECDSA",
+		config: Config{
+			MaxVersion:   VersionTLS12,
+			CipherSuites: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
+			Certificates: []Certificate{ecdsaP256Certificate},
+			Bugs: ProtocolBugs{
+				SendCipherSuite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
+			},
+		},
+		shouldFail:    true,
+		expectedError: ":WRONG_CERTIFICATE_TYPE:",
+	})
+	testCases = append(testCases, testCase{
+		name: "CertificateCipherMismatch-Ed25519",
+		config: Config{
+			MaxVersion:   VersionTLS12,
+			CipherSuites: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
+			Certificates: []Certificate{ed25519Certificate},
+			Bugs: ProtocolBugs{
+				SendCipherSuite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
+			},
+		},
+		shouldFail:    true,
+		expectedError: ":WRONG_CERTIFICATE_TYPE:",
+	})
+
+	// Test that servers decline to select a cipher suite which is
+	// inconsistent with their configured certificate.
+	testCases = append(testCases, testCase{
+		testType: serverTest,
+		name:     "ServerCipherFilter-RSA",
+		config: Config{
+			MaxVersion:   VersionTLS12,
+			CipherSuites: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
+		},
+		flags: []string{
+			"-cert-file", path.Join(*resourceDir, rsaCertificateFile),
+			"-key-file", path.Join(*resourceDir, rsaKeyFile),
+		},
+		shouldFail:    true,
+		expectedError: ":NO_SHARED_CIPHER:",
+	})
+	testCases = append(testCases, testCase{
+		testType: serverTest,
+		name:     "ServerCipherFilter-ECDSA",
+		config: Config{
+			MaxVersion:   VersionTLS12,
+			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
+		},
+		flags: []string{
+			"-cert-file", path.Join(*resourceDir, ecdsaP256CertificateFile),
+			"-key-file", path.Join(*resourceDir, ecdsaP256KeyFile),
+		},
+		shouldFail:    true,
+		expectedError: ":NO_SHARED_CIPHER:",
+	})
+	testCases = append(testCases, testCase{
+		testType: serverTest,
+		name:     "ServerCipherFilter-Ed25519",
+		config: Config{
+			MaxVersion:   VersionTLS12,
+			CipherSuites: []uint16{TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
+		},
+		flags: []string{
+			"-cert-file", path.Join(*resourceDir, ed25519CertificateFile),
+			"-key-file", path.Join(*resourceDir, ed25519KeyFile),
+		},
+		shouldFail:    true,
+		expectedError: ":NO_SHARED_CIPHER:",
+	})
 }
 
 func addBadECDSASignatureTests() {
@@ -3800,6 +3837,19 @@
 			"-key-file", path.Join(*resourceDir, ecdsaP256KeyFile),
 		},
 	})
+	tests = append(tests, testCase{
+		testType: serverTest,
+		name:     "Basic-Server-Ed25519",
+		config: Config{
+			MaxVersion:   VersionTLS12,
+			CipherSuites: []uint16{TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256},
+		},
+		flags: []string{
+			"-cert-file", path.Join(*resourceDir, ed25519CertificateFile),
+			"-key-file", path.Join(*resourceDir, ed25519KeyFile),
+			"-enable-ed25519",
+		},
+	})
 
 	// No session ticket support; server doesn't send NewSessionTicket.
 	tests = append(tests, testCase{
@@ -4889,7 +4939,7 @@
 		})
 		testCases = append(testCases, testCase{
 			testType: clientTest,
-			name:     "ALPNClient-Mismatch-" + ver.name,
+			name:     "ALPNClient-RejectUnknown-" + ver.name,
 			config: Config{
 				MaxVersion: ver.version,
 				Bugs: ProtocolBugs{
@@ -4904,6 +4954,20 @@
 			expectedLocalError: "remote error: illegal parameter",
 		})
 		testCases = append(testCases, testCase{
+			testType: clientTest,
+			name:     "ALPNClient-AllowUnknown-" + ver.name,
+			config: Config{
+				MaxVersion: ver.version,
+				Bugs: ProtocolBugs{
+					SendALPN: "baz",
+				},
+			},
+			flags: []string{
+				"-advertise-alpn", "\x03foo\x03bar",
+				"-allow-unknown-alpn-protos",
+			},
+		})
+		testCases = append(testCases, testCase{
 			testType: serverTest,
 			name:     "ALPNServer-" + ver.name,
 			config: Config{
@@ -6455,11 +6519,11 @@
 		config: Config{
 			MaxVersion: VersionTLS12,
 		},
-		renegotiate: 1,
+		renegotiate:             1,
+		readWithUnfinishedWrite: true,
 		flags: []string{
 			"-async",
 			"-renegotiate-freely",
-			"-read-with-unfinished-write",
 		},
 		shouldFail:    true,
 		expectedError: ":NO_RENEGOTIATION:",
@@ -6672,6 +6736,7 @@
 	{"RSA-PSS-SHA256", signatureRSAPSSWithSHA256, testCertRSA},
 	{"RSA-PSS-SHA384", signatureRSAPSSWithSHA384, testCertRSA},
 	{"RSA-PSS-SHA512", signatureRSAPSSWithSHA512, testCertRSA},
+	{"Ed25519", signatureEd25519, testCertEd25519},
 	// Tests for key types prior to TLS 1.2.
 	{"RSA", 0, testCertRSA},
 	{"ECDSA", 0, testCertECDSAP256},
@@ -6690,9 +6755,6 @@
 		TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
 		TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
 	}
-	if *includeDHE {
-		signingCiphers = append(signingCiphers, TLS_DHE_RSA_WITH_AES_128_CBC_SHA)
-	}
 
 	var allAlgorithms []signatureAlgorithm
 	for _, alg := range testSignatureAlgorithms {
@@ -6763,6 +6825,7 @@
 					"-cert-file", path.Join(*resourceDir, getShimCertificate(alg.cert)),
 					"-key-file", path.Join(*resourceDir, getShimKey(alg.cert)),
 					"-enable-all-curves",
+					"-enable-ed25519",
 				},
 				shouldFail:                     shouldSignFail,
 				expectedError:                  signError,
@@ -6789,6 +6852,7 @@
 					"-require-any-client-certificate",
 					"-expect-peer-signature-algorithm", strconv.Itoa(int(alg.id)),
 					"-enable-all-curves",
+					"-enable-ed25519",
 				},
 				// Resume the session to assert the peer signature
 				// algorithm is reported on both handshakes.
@@ -6798,7 +6862,7 @@
 			})
 
 			// No signing cipher for SSL 3.0.
-			if *includeDHE || ver.version > VersionSSL30 {
+			if ver.version > VersionSSL30 {
 				testCases = append(testCases, testCase{
 					testType: serverTest,
 					name:     "ServerAuth-Sign" + suffix,
@@ -6815,6 +6879,7 @@
 						"-cert-file", path.Join(*resourceDir, getShimCertificate(alg.cert)),
 						"-key-file", path.Join(*resourceDir, getShimKey(alg.cert)),
 						"-enable-all-curves",
+						"-enable-ed25519",
 					},
 					shouldFail:                     shouldSignFail,
 					expectedError:                  signError,
@@ -6841,6 +6906,7 @@
 				flags: []string{
 					"-expect-peer-signature-algorithm", strconv.Itoa(int(alg.id)),
 					"-enable-all-curves",
+					"-enable-ed25519",
 				},
 				// Resume the session to assert the peer signature
 				// algorithm is reported on both handshakes.
@@ -6866,6 +6932,7 @@
 					flags: []string{
 						"-require-any-client-certificate",
 						"-enable-all-curves",
+						"-enable-ed25519",
 					},
 					shouldFail:    true,
 					expectedError: ":BAD_SIGNATURE:",
@@ -6884,7 +6951,10 @@
 							InvalidSignature: true,
 						},
 					},
-					flags:         []string{"-enable-all-curves"},
+					flags: []string{
+						"-enable-all-curves",
+						"-enable-ed25519",
+					},
 					shouldFail:    true,
 					expectedError: ":BAD_SIGNATURE:",
 				})
@@ -6902,6 +6972,7 @@
 						"-cert-file", path.Join(*resourceDir, getShimCertificate(alg.cert)),
 						"-key-file", path.Join(*resourceDir, getShimKey(alg.cert)),
 						"-enable-all-curves",
+						"-enable-ed25519",
 						"-signing-prefs", strconv.Itoa(int(alg.id)),
 					},
 					expectedPeerSignatureAlgorithm: alg.id,
@@ -6919,6 +6990,7 @@
 						"-cert-file", path.Join(*resourceDir, getShimCertificate(alg.cert)),
 						"-key-file", path.Join(*resourceDir, getShimKey(alg.cert)),
 						"-enable-all-curves",
+						"-enable-ed25519",
 						"-signing-prefs", strconv.Itoa(int(alg.id)),
 					},
 					expectedPeerSignatureAlgorithm: alg.id,
@@ -7496,6 +7568,165 @@
 		},
 		flags: []string{"-max-version", strconv.Itoa(VersionTLS12)},
 	})
+
+	// TLS 1.1 and below has no way to advertise support for or negotiate
+	// Ed25519's signature algorithm.
+	testCases = append(testCases, testCase{
+		testType: clientTest,
+		name:     "NoEd25519-TLS11-ServerAuth-Verify",
+		config: Config{
+			MaxVersion:   VersionTLS11,
+			Certificates: []Certificate{ed25519Certificate},
+			Bugs: ProtocolBugs{
+				// Sign with Ed25519 even though it is TLS 1.1.
+				UseLegacySigningAlgorithm: signatureEd25519,
+			},
+		},
+		flags:         []string{"-enable-ed25519"},
+		shouldFail:    true,
+		expectedError: ":PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE:",
+	})
+	testCases = append(testCases, testCase{
+		testType: serverTest,
+		name:     "NoEd25519-TLS11-ServerAuth-Sign",
+		config: Config{
+			MaxVersion: VersionTLS11,
+		},
+		flags: []string{
+			"-cert-file", path.Join(*resourceDir, ed25519CertificateFile),
+			"-key-file", path.Join(*resourceDir, ed25519KeyFile),
+		},
+		shouldFail:    true,
+		expectedError: ":NO_COMMON_SIGNATURE_ALGORITHMS:",
+	})
+	testCases = append(testCases, testCase{
+		testType: serverTest,
+		name:     "NoEd25519-TLS11-ClientAuth-Verify",
+		config: Config{
+			MaxVersion:   VersionTLS11,
+			Certificates: []Certificate{ed25519Certificate},
+			Bugs: ProtocolBugs{
+				// Sign with Ed25519 even though it is TLS 1.1.
+				UseLegacySigningAlgorithm: signatureEd25519,
+			},
+		},
+		flags: []string{
+			"-enable-ed25519",
+			"-require-any-client-certificate",
+		},
+		shouldFail:    true,
+		expectedError: ":PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE:",
+	})
+	testCases = append(testCases, testCase{
+		testType: clientTest,
+		name:     "NoEd25519-TLS11-ClientAuth-Sign",
+		config: Config{
+			MaxVersion: VersionTLS11,
+			ClientAuth: RequireAnyClientCert,
+		},
+		flags: []string{
+			"-cert-file", path.Join(*resourceDir, ed25519CertificateFile),
+			"-key-file", path.Join(*resourceDir, ed25519KeyFile),
+		},
+		shouldFail:    true,
+		expectedError: ":NO_COMMON_SIGNATURE_ALGORITHMS:",
+	})
+
+	// Test Ed25519 is not advertised by default.
+	testCases = append(testCases, testCase{
+		testType: clientTest,
+		name:     "Ed25519DefaultDisable-NoAdvertise",
+		config: Config{
+			Certificates: []Certificate{ed25519Certificate},
+		},
+		shouldFail:         true,
+		expectedLocalError: "tls: no common signature algorithms",
+	})
+
+	// Test Ed25519, when disabled, is not accepted if the peer ignores our
+	// preferences.
+	testCases = append(testCases, testCase{
+		testType: clientTest,
+		name:     "Ed25519DefaultDisable-NoAccept",
+		config: Config{
+			Certificates: []Certificate{ed25519Certificate},
+			Bugs: ProtocolBugs{
+				IgnorePeerSignatureAlgorithmPreferences: true,
+			},
+		},
+		shouldFail:         true,
+		expectedLocalError: "remote error: illegal parameter",
+		expectedError:      ":WRONG_SIGNATURE_TYPE:",
+	})
+
+	// Test that configuring verify preferences changes what the client
+	// advertises.
+	testCases = append(testCases, testCase{
+		name: "VerifyPreferences-Advertised",
+		config: Config{
+			Certificates: []Certificate{rsaCertificate},
+			SignSignatureAlgorithms: []signatureAlgorithm{
+				signatureRSAPSSWithSHA256,
+				signatureRSAPSSWithSHA384,
+				signatureRSAPSSWithSHA512,
+			},
+		},
+		flags: []string{
+			"-verify-prefs", strconv.Itoa(int(signatureRSAPSSWithSHA384)),
+			"-expect-peer-signature-algorithm", strconv.Itoa(int(signatureRSAPSSWithSHA384)),
+		},
+	})
+
+	// Test that the client advertises a set which the runner can find
+	// nothing in common with.
+	testCases = append(testCases, testCase{
+		name: "VerifyPreferences-NoCommonAlgorithms",
+		config: Config{
+			Certificates: []Certificate{rsaCertificate},
+			SignSignatureAlgorithms: []signatureAlgorithm{
+				signatureRSAPSSWithSHA256,
+				signatureRSAPSSWithSHA512,
+			},
+		},
+		flags: []string{
+			"-verify-prefs", strconv.Itoa(int(signatureRSAPSSWithSHA384)),
+		},
+		shouldFail:         true,
+		expectedLocalError: "tls: no common signature algorithms",
+	})
+
+	// Test that the client enforces its preferences when configured.
+	testCases = append(testCases, testCase{
+		name: "VerifyPreferences-Enforced",
+		config: Config{
+			Certificates: []Certificate{rsaCertificate},
+			SignSignatureAlgorithms: []signatureAlgorithm{
+				signatureRSAPSSWithSHA256,
+				signatureRSAPSSWithSHA512,
+			},
+			Bugs: ProtocolBugs{
+				IgnorePeerSignatureAlgorithmPreferences: true,
+			},
+		},
+		flags: []string{
+			"-verify-prefs", strconv.Itoa(int(signatureRSAPSSWithSHA384)),
+		},
+		shouldFail:         true,
+		expectedLocalError: "remote error: illegal parameter",
+		expectedError:      ":WRONG_SIGNATURE_TYPE:",
+	})
+
+	// Test that explicitly configuring Ed25519 is as good as changing the
+	// boolean toggle.
+	testCases = append(testCases, testCase{
+		name: "VerifyPreferences-Ed25519",
+		config: Config{
+			Certificates: []Certificate{ed25519Certificate},
+		},
+		flags: []string{
+			"-verify-prefs", strconv.Itoa(int(signatureEd25519)),
+		},
+	})
 }
 
 // timeouts is the retransmit schedule for BoringSSL. It doubles and
@@ -9401,6 +9632,22 @@
 
 		testCases = append(testCases, t.test)
 	}
+
+	// The processing order for TLS 1.3 version negotiation is such that one
+	// may accidentally accept a HelloRetryRequest in lieu of ServerHello in
+	// TLS 1.2. Test that we do not do this.
+	testCases = append(testCases, testCase{
+		name: "SendServerHelloAsHelloRetryRequest",
+		config: Config{
+			MaxVersion: VersionTLS12,
+			Bugs: ProtocolBugs{
+				SendServerHelloAsHelloRetryRequest: true,
+			},
+		},
+		shouldFail:         true,
+		expectedError:      ":UNEXPECTED_MESSAGE:",
+		expectedLocalError: "remote error: unexpected message",
+	})
 }
 
 func addTrailingMessageDataTests() {
diff --git a/src/ssl/test/runner/sign.go b/src/ssl/test/runner/sign.go
index 5f56ff9..ceae05c 100644
--- a/src/ssl/test/runner/sign.go
+++ b/src/ssl/test/runner/sign.go
@@ -17,6 +17,8 @@
 	"errors"
 	"fmt"
 	"math/big"
+
+	"./ed25519"
 )
 
 type signer interface {
@@ -38,7 +40,7 @@
 			continue
 		}
 
-		signer, err := getSigner(version, key, config, sigAlg)
+		signer, err := getSigner(version, key, config, sigAlg, false)
 		if err != nil {
 			continue
 		}
@@ -58,7 +60,7 @@
 		msg = newMsg
 	}
 
-	signer, err := getSigner(version, key, config, sigAlg)
+	signer, err := getSigner(version, key, config, sigAlg, false)
 	if err != nil {
 		return nil, err
 	}
@@ -71,7 +73,7 @@
 		return errors.New("tls: unsupported signature algorithm")
 	}
 
-	signer, err := getSigner(version, key, config, sigAlg)
+	signer, err := getSigner(version, key, config, sigAlg, true)
 	if err != nil {
 		return err
 	}
@@ -242,20 +244,53 @@
 	return rsa.VerifyPSS(rsaKey, r.hash, h.Sum(nil), sig, &pssOptions)
 }
 
-func getSigner(version uint16, key interface{}, config *Config, sigAlg signatureAlgorithm) (signer, error) {
-	// TLS 1.1 and below use legacy signature algorithms.
-	if version < VersionTLS12 {
-		switch key.(type) {
-		case *rsa.PrivateKey, *rsa.PublicKey:
-			return &rsaPKCS1Signer{crypto.MD5SHA1}, nil
-		case *ecdsa.PrivateKey, *ecdsa.PublicKey:
-			return &ecdsaSigner{version, config, nil, crypto.SHA1}, nil
-		default:
-			return nil, errors.New("unknown key type")
-		}
+type ed25519Signer struct{}
+
+func (e *ed25519Signer) supportsKey(key crypto.PrivateKey) bool {
+	_, ok := key.(ed25519.PrivateKey)
+	return ok
+}
+
+func (e *ed25519Signer) signMessage(key crypto.PrivateKey, config *Config, msg []byte) ([]byte, error) {
+	privKey, ok := key.(ed25519.PrivateKey)
+	if !ok {
+		return nil, errors.New("invalid key type for Ed25519")
 	}
 
-	// TODO(davidben): Forbid RSASSA-PKCS1-v1_5 in TLS 1.3.
+	return ed25519.Sign(privKey, msg), nil
+}
+
+func (e *ed25519Signer) verifyMessage(key crypto.PublicKey, msg, sig []byte) error {
+	pubKey, ok := key.(ed25519.PublicKey)
+	if !ok {
+		return errors.New("invalid key type for Ed25519")
+	}
+
+	if !ed25519.Verify(pubKey, msg, sig) {
+		return errors.New("invalid Ed25519 signature")
+	}
+
+	return nil
+}
+
+func getSigner(version uint16, key interface{}, config *Config, sigAlg signatureAlgorithm, isVerify bool) (signer, error) {
+	// TLS 1.1 and below use legacy signature algorithms.
+	if version < VersionTLS12 {
+		if config.Bugs.UseLegacySigningAlgorithm == 0 || isVerify {
+			switch key.(type) {
+			case *rsa.PrivateKey, *rsa.PublicKey:
+				return &rsaPKCS1Signer{crypto.MD5SHA1}, nil
+			case *ecdsa.PrivateKey, *ecdsa.PublicKey:
+				return &ecdsaSigner{version, config, nil, crypto.SHA1}, nil
+			default:
+				return nil, errors.New("unknown key type")
+			}
+		}
+
+		// Fall through, forcing a particular algorithm.
+		sigAlg = config.Bugs.UseLegacySigningAlgorithm
+	}
+
 	switch sigAlg {
 	case signatureRSAPKCS1WithMD5:
 		if version < VersionTLS13 || config.Bugs.IgnoreSignatureVersionChecks {
@@ -291,6 +326,8 @@
 		return &rsaPSSSigner{crypto.SHA384}, nil
 	case signatureRSAPSSWithSHA512:
 		return &rsaPSSSigner{crypto.SHA512}, nil
+	case signatureEd25519:
+		return &ed25519Signer{}, nil
 	}
 
 	return nil, fmt.Errorf("unsupported signature algorithm %04x", sigAlg)
diff --git a/src/ssl/test/runner/tls.go b/src/ssl/test/runner/tls.go
index 24f9b1e..225794b 100644
--- a/src/ssl/test/runner/tls.go
+++ b/src/ssl/test/runner/tls.go
@@ -6,6 +6,7 @@
 package runner
 
 import (
+	"bytes"
 	"crypto"
 	"crypto/ecdsa"
 	"crypto/rsa"
@@ -16,6 +17,8 @@
 	"net"
 	"strings"
 	"time"
+
+	"./ed25519"
 )
 
 // Server returns a new TLS server side connection
@@ -226,7 +229,7 @@
 		return
 	}
 
-	switch pub := x509Cert.PublicKey.(type) {
+	switch pub := getCertificatePublicKey(x509Cert).(type) {
 	case *rsa.PublicKey:
 		priv, ok := cert.PrivateKey.(*rsa.PrivateKey)
 		if !ok {
@@ -248,6 +251,16 @@
 			err = errors.New("crypto/tls: private key does not match public key")
 			return
 		}
+	case ed25519.PublicKey:
+		priv, ok := cert.PrivateKey.(ed25519.PrivateKey)
+		if !ok {
+			err = errors.New("crypto/tls: private key type does not match public key type")
+			return
+		}
+		if !bytes.Equal(priv[32:], pub) {
+			err = errors.New("crypto/tls: private key does not match public key")
+			return
+		}
 	default:
 		err = errors.New("crypto/tls: unknown public key algorithm")
 		return
@@ -256,6 +269,27 @@
 	return
 }
 
+var ed25519SPKIPrefix = []byte{0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70, 0x03, 0x21, 0x00}
+
+func isEd25519Certificate(cert *x509.Certificate) bool {
+	return bytes.HasPrefix(cert.RawSubjectPublicKeyInfo, ed25519SPKIPrefix) && len(cert.RawSubjectPublicKeyInfo) == len(ed25519SPKIPrefix)+32
+}
+
+func getCertificatePublicKey(cert *x509.Certificate) crypto.PublicKey {
+	if cert.PublicKey != nil {
+		return cert.PublicKey
+	}
+
+	if isEd25519Certificate(cert) {
+		return ed25519.PublicKey(cert.RawSubjectPublicKeyInfo[len(ed25519SPKIPrefix):])
+	}
+
+	return nil
+}
+
+var ed25519PKCS8Prefix = []byte{0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70,
+	0x04, 0x22, 0x04, 0x20}
+
 // Attempt to parse the given private key DER block. OpenSSL 0.9.8 generates
 // PKCS#1 private keys by default, while OpenSSL 1.0.0 generates PKCS#8 keys.
 // OpenSSL ecparam generates SEC1 EC private keys for ECDSA. We try all three.
@@ -275,5 +309,11 @@
 		return key, nil
 	}
 
+	if bytes.HasPrefix(der, ed25519PKCS8Prefix) && len(der) == len(ed25519PKCS8Prefix)+32 {
+		seed := der[len(ed25519PKCS8Prefix):]
+		_, key := ed25519.NewKeyPairFromSeed(seed)
+		return key, nil
+	}
+
 	return nil, errors.New("crypto/tls: failed to parse private key")
 }
diff --git a/src/ssl/test/test_config.cc b/src/ssl/test/test_config.cc
index a8cf755..5c5d346 100644
--- a/src/ssl/test/test_config.cc
+++ b/src/ssl/test/test_config.cc
@@ -102,7 +102,6 @@
   { "-renegotiate-ignore", &TestConfig::renegotiate_ignore },
   { "-p384-only", &TestConfig::p384_only },
   { "-enable-all-curves", &TestConfig::enable_all_curves },
-  { "-use-sparse-dh-prime", &TestConfig::use_sparse_dh_prime },
   { "-use-old-client-cert-callback",
     &TestConfig::use_old_client_cert_callback },
   { "-send-alert", &TestConfig::send_alert },
@@ -130,6 +129,8 @@
   { "-expect-no-resume-alpn", &TestConfig::expect_no_resume_alpn },
   { "-no-op-extra-handshake", &TestConfig::no_op_extra_handshake },
   { "-handshake-twice", &TestConfig::handshake_twice },
+  { "-allow-unknown-alpn-protos", &TestConfig::allow_unknown_alpn_protos },
+  { "-enable-ed25519", &TestConfig::enable_ed25519 },
 };
 
 const Flag<std::string> kStringFlags[] = {
@@ -194,6 +195,7 @@
 
 const Flag<std::vector<int>> kIntVectorFlags[] = {
   { "-signing-prefs", &TestConfig::signing_prefs },
+  { "-verify-prefs", &TestConfig::verify_prefs },
 };
 
 }  // namespace
diff --git a/src/ssl/test/test_config.h b/src/ssl/test/test_config.h
index ef14f15..279b13d 100644
--- a/src/ssl/test/test_config.h
+++ b/src/ssl/test/test_config.h
@@ -27,6 +27,7 @@
   bool fallback_scsv = false;
   std::string digest_prefs;
   std::vector<int> signing_prefs;
+  std::vector<int> verify_prefs;
   std::string key_file;
   std::string cert_file;
   std::string expected_server_name;
@@ -112,7 +113,6 @@
   int expect_peer_signature_algorithm = 0;
   bool p384_only = false;
   bool enable_all_curves = false;
-  bool use_sparse_dh_prime = false;
   int expect_curve_id = 0;
   int expect_resume_curve_id = 0;
   bool use_old_client_cert_callback = false;
@@ -143,6 +143,8 @@
   int expect_ticket_age_skew = 0;
   bool no_op_extra_handshake = false;
   bool handshake_twice = false;
+  bool allow_unknown_alpn_protos = false;
+  bool enable_ed25519 = false;
 };
 
 bool ParseConfig(int argc, char **argv, TestConfig *out_config);
diff --git a/src/ssl/tls13_both.c b/src/ssl/tls13_both.c
index ec67cdc..f44933f 100644
--- a/src/ssl/tls13_both.c
+++ b/src/ssl/tls13_both.c
@@ -549,7 +549,7 @@
 
   /* Sign the digest. */
   CBB child;
-  const size_t max_sig_len = ssl_private_key_max_signature_len(ssl);
+  const size_t max_sig_len = EVP_PKEY_size(hs->local_pubkey);
   uint8_t *sig;
   size_t sig_len;
   if (!CBB_add_u16_length_prefixed(&body, &child) ||
@@ -625,9 +625,30 @@
     return 0;
   }
 
-  /* TODO(svaldez): Send KeyUpdate if |key_update_request| is
-   * |SSL_KEY_UPDATE_REQUESTED|. */
-  return tls13_rotate_traffic_key(ssl, evp_aead_open);
+  if (!tls13_rotate_traffic_key(ssl, evp_aead_open)) {
+    return 0;
+  }
+
+  /* Acknowledge the KeyUpdate */
+  if (key_update_request == SSL_KEY_UPDATE_REQUESTED &&
+      !ssl->s3->key_update_pending) {
+    CBB cbb, body;
+    if (!ssl->method->init_message(ssl, &cbb, &body, SSL3_MT_KEY_UPDATE) ||
+        !CBB_add_u8(&body, SSL_KEY_UPDATE_NOT_REQUESTED) ||
+        !ssl_add_message_cbb(ssl, &cbb) ||
+        !tls13_rotate_traffic_key(ssl, evp_aead_seal)) {
+      CBB_cleanup(&cbb);
+      return 0;
+    }
+
+    /* Suppress KeyUpdate acknowledgments until this change is written to the
+     * wire. This prevents us from accumulating write obligations when read and
+     * write progress at different rates. See draft-ietf-tls-tls13-18, section
+     * 4.5.3. */
+    ssl->s3->key_update_pending = 1;
+  }
+
+  return 1;
 }
 
 int tls13_post_handshake(SSL *ssl) {
@@ -649,8 +670,6 @@
     return tls13_process_new_session_ticket(ssl);
   }
 
-  // TODO(svaldez): Handle post-handshake authentication.
-
   ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE);
   OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_MESSAGE);
   return 0;
diff --git a/src/ssl/tls13_client.c b/src/ssl/tls13_client.c
index 0d60661..6de51e5 100644
--- a/src/ssl/tls13_client.c
+++ b/src/ssl/tls13_client.c
@@ -525,7 +525,7 @@
     }
   }
 
-  if (!ssl->ctx->x509_method->ssl_auto_chain_if_needed(ssl) ||
+  if (!ssl_on_certificate_selected(hs) ||
       !tls13_add_certificate(hs)) {
     return ssl_hs_error;
   }
@@ -704,7 +704,7 @@
     goto err;
   }
 
-  if (have_early_data_info && ssl->ctx->enable_early_data) {
+  if (have_early_data_info && ssl->cert->enable_early_data) {
     if (!CBS_get_u32(&early_data_info, &session->ticket_max_early_data) ||
         CBS_len(&early_data_info) != 0) {
       ssl3_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_DECODE_ERROR);
diff --git a/src/ssl/tls13_server.c b/src/ssl/tls13_server.c
index 35ee4f7..af33458 100644
--- a/src/ssl/tls13_server.c
+++ b/src/ssl/tls13_server.c
@@ -167,7 +167,7 @@
       goto err;
     }
 
-    if (ssl->ctx->enable_early_data) {
+    if (ssl->cert->enable_early_data) {
       session->ticket_max_early_data = kMaxEarlyDataAccepted;
 
       CBB early_data_info;
@@ -355,7 +355,7 @@
       hs->new_session = SSL_SESSION_dup(session, SSL_SESSION_DUP_AUTH_ONLY);
 
       if (/* Early data must be acceptable for this ticket. */
-          ssl->ctx->enable_early_data &&
+          ssl->cert->enable_early_data &&
           session->ticket_max_early_data != 0 &&
           /* The client must have offered early data. */
           hs->early_data_offered &&
@@ -555,23 +555,10 @@
     CBB sigalgs_cbb;
     if (!ssl->method->init_message(ssl, &cbb, &body,
                                    SSL3_MT_CERTIFICATE_REQUEST) ||
-        !CBB_add_u8(&body, 0 /* no certificate_request_context. */)) {
-      goto err;
-    }
-
-    const uint16_t *sigalgs;
-    size_t num_sigalgs = tls12_get_verify_sigalgs(ssl, &sigalgs);
-    if (!CBB_add_u16_length_prefixed(&body, &sigalgs_cbb)) {
-      goto err;
-    }
-
-    for (size_t i = 0; i < num_sigalgs; i++) {
-      if (!CBB_add_u16(&sigalgs_cbb, sigalgs[i])) {
-        goto err;
-      }
-    }
-
-    if (!ssl_add_client_CA_list(ssl, &body) ||
+        !CBB_add_u8(&body, 0 /* no certificate_request_context. */) ||
+        !CBB_add_u16_length_prefixed(&body, &sigalgs_cbb) ||
+        !tls12_add_verify_sigalgs(ssl, &sigalgs_cbb) ||
+        !ssl_add_client_CA_list(ssl, &body) ||
         !CBB_add_u16(&body, 0 /* empty certificate_extensions. */) ||
         !ssl_add_message_cbb(ssl, &cbb)) {
       goto err;
diff --git a/src/tool/CMakeLists.txt b/src/tool/CMakeLists.txt
index f0af283..244f7df 100644
--- a/src/tool/CMakeLists.txt
+++ b/src/tool/CMakeLists.txt
@@ -8,11 +8,13 @@
   client.cc
   const.cc
   digest.cc
+  file.cc
   generate_ed25519.cc
   genrsa.cc
   pkcs12.cc
   rand.cc
   server.cc
+  sign.cc
   speed.cc
   tool.cc
   transport_common.cc
diff --git a/src/tool/client.cc b/src/tool/client.cc
index bc17426..005afa8 100644
--- a/src/tool/client.cc
+++ b/src/tool/client.cc
@@ -35,86 +35,99 @@
 
 static const struct argument kArguments[] = {
     {
-     "-connect", kRequiredArgument,
-     "The hostname and port of the server to connect to, e.g. foo.com:443",
+        "-connect", kRequiredArgument,
+        "The hostname and port of the server to connect to, e.g. foo.com:443",
     },
     {
-     "-cipher", kOptionalArgument,
-     "An OpenSSL-style cipher suite string that configures the offered ciphers",
+        "-cipher", kOptionalArgument,
+        "An OpenSSL-style cipher suite string that configures the offered "
+        "ciphers",
     },
     {
-     "-max-version", kOptionalArgument,
-     "The maximum acceptable protocol version",
+        "-curves", kOptionalArgument,
+        "An OpenSSL-style ECDH curves list that configures the offered curves",
     },
     {
-     "-min-version", kOptionalArgument,
-     "The minimum acceptable protocol version",
+        "-max-version", kOptionalArgument,
+        "The maximum acceptable protocol version",
     },
     {
-     "-server-name", kOptionalArgument,
-     "The server name to advertise",
+        "-min-version", kOptionalArgument,
+        "The minimum acceptable protocol version",
     },
     {
-     "-select-next-proto", kOptionalArgument,
-     "An NPN protocol to select if the server supports NPN",
+        "-server-name", kOptionalArgument, "The server name to advertise",
     },
     {
-     "-alpn-protos", kOptionalArgument,
-     "A comma-separated list of ALPN protocols to advertise",
+        "-select-next-proto", kOptionalArgument,
+        "An NPN protocol to select if the server supports NPN",
     },
     {
-     "-fallback-scsv", kBooleanArgument,
-     "Enable FALLBACK_SCSV",
+        "-alpn-protos", kOptionalArgument,
+        "A comma-separated list of ALPN protocols to advertise",
     },
     {
-     "-ocsp-stapling", kBooleanArgument,
-     "Advertise support for OCSP stabling",
+        "-fallback-scsv", kBooleanArgument, "Enable FALLBACK_SCSV",
     },
     {
-     "-signed-certificate-timestamps", kBooleanArgument,
-     "Advertise support for signed certificate timestamps",
+        "-ocsp-stapling", kBooleanArgument,
+        "Advertise support for OCSP stabling",
     },
     {
-     "-channel-id-key", kOptionalArgument,
-     "The key to use for signing a channel ID",
+        "-signed-certificate-timestamps", kBooleanArgument,
+        "Advertise support for signed certificate timestamps",
     },
     {
-     "-false-start", kBooleanArgument,
-     "Enable False Start",
-    },
-    { "-session-in", kOptionalArgument,
-      "A file containing a session to resume.",
-    },
-    { "-session-out", kOptionalArgument,
-      "A file to write the negotiated session to.",
+        "-channel-id-key", kOptionalArgument,
+        "The key to use for signing a channel ID",
     },
     {
-      "-key", kOptionalArgument,
-      "Private-key file to use (default is no client certificate)",
+        "-false-start", kBooleanArgument, "Enable False Start",
     },
     {
-      "-starttls", kOptionalArgument,
-      "A STARTTLS mini-protocol to run before the TLS handshake. Supported"
-      " values: 'smtp'",
+        "-session-in", kOptionalArgument,
+        "A file containing a session to resume.",
     },
     {
-     "-grease", kBooleanArgument,
-     "Enable GREASE",
+        "-session-out", kOptionalArgument,
+        "A file to write the negotiated session to.",
     },
     {
-      "-resume", kBooleanArgument,
-      "Establish a second connection resuming the original connection.",
+        "-key", kOptionalArgument,
+        "PEM-encoded file containing the private key.",
     },
     {
-      "-root-certs", kOptionalArgument,
-      "A filename containing one of more PEM root certificates. Implies that "
-      "verification is required.",
+        "-cert", kOptionalArgument,
+        "PEM-encoded file containing the leaf certificate and optional "
+        "certificate chain. This is taken from the -key argument if this "
+        "argument is not provided.",
+    },
+    {
+        "-starttls", kOptionalArgument,
+        "A STARTTLS mini-protocol to run before the TLS handshake. Supported"
+        " values: 'smtp'",
+    },
+    {
+        "-grease", kBooleanArgument, "Enable GREASE",
+    },
+    {
+        "-test-resumption", kBooleanArgument,
+        "Connect to the server twice. The first connection is closed once a "
+        "session is established. The second connection offers it.",
+    },
+    {
+        "-root-certs", kOptionalArgument,
+        "A filename containing one of more PEM root certificates. Implies that "
+        "verification is required.",
     },
     {
         "-early-data", kBooleanArgument, "Allow early data",
     },
     {
-     "", kOptionalArgument, "",
+        "-ed25519", kBooleanArgument, "Advertise Ed25519 support",
+    },
+    {
+        "", kOptionalArgument, "",
     },
 };
 
@@ -234,7 +247,9 @@
       return false;
     }
     SSL_set_session(ssl.get(), session.get());
-  } else if (resume_session) {
+  }
+
+  if (resume_session) {
     SSL_set_session(ssl.get(), resume_session.get());
   }
 
@@ -285,6 +300,12 @@
     return false;
   }
 
+  if (args_map.count("-curves") != 0 &&
+      !SSL_CTX_set1_curves_list(ctx.get(), args_map["-curves"].c_str())) {
+    fprintf(stderr, "Failed setting curves list\n");
+    return false;
+  }
+
   uint16_t max_version = TLS1_3_VERSION;
   if (args_map.count("-max-version") != 0 &&
       !VersionFromString(&max_version, args_map["-max-version"])) {
@@ -371,12 +392,15 @@
 
   if (args_map.count("-key") != 0) {
     const std::string &key = args_map["-key"];
-    if (!SSL_CTX_use_PrivateKey_file(ctx.get(), key.c_str(), SSL_FILETYPE_PEM)) {
+    if (!SSL_CTX_use_PrivateKey_file(ctx.get(), key.c_str(),
+                                     SSL_FILETYPE_PEM)) {
       fprintf(stderr, "Failed to load private key: %s\n", key.c_str());
       return false;
     }
-    if (!SSL_CTX_use_certificate_chain_file(ctx.get(), key.c_str())) {
-      fprintf(stderr, "Failed to load cert chain: %s\n", key.c_str());
+    const std::string &cert =
+        args_map.count("-cert") != 0 ? args_map["-cert"] : key;
+    if (!SSL_CTX_use_certificate_chain_file(ctx.get(), cert.c_str())) {
+      fprintf(stderr, "Failed to load cert chain: %s\n", cert.c_str());
       return false;
     }
   }
@@ -412,9 +436,20 @@
     SSL_CTX_set_early_data_enabled(ctx.get(), 1);
   }
 
-  if (args_map.count("-resume") != 0 &&
-      !DoConnection(ctx.get(), args_map, &WaitForSession)) {
-    return false;
+  if (args_map.count("-ed25519") != 0) {
+    SSL_CTX_set_ed25519_enabled(ctx.get(), 1);
+  }
+
+  if (args_map.count("-test-resumption") != 0) {
+    if (args_map.count("-session-in") != 0) {
+      fprintf(stderr,
+              "Flags -session-in and -test-resumption are incompatible.\n");
+      return false;
+    }
+
+    if (!DoConnection(ctx.get(), args_map, &WaitForSession)) {
+      return false;
+    }
   }
 
   return DoConnection(ctx.get(), args_map, &TransferData);
diff --git a/src/tool/const.cc b/src/tool/const.cc
index 7b7001e..0372e4c 100644
--- a/src/tool/const.cc
+++ b/src/tool/const.cc
@@ -323,112 +323,3 @@
 };
 
 const size_t kDERRSAPrivate4096Len = sizeof(kDERRSAPrivate4096);
-
-const uint8_t kDERRSAPrivate3Prime2048[] = {
-    0x30, 0x82, 0x04, 0xd7, 0x02, 0x01, 0x01, 0x02, 0x82, 0x01, 0x00, 0x62,
-    0x91, 0xe9, 0xea, 0xb3, 0x5d, 0x6c, 0x29, 0xae, 0x21, 0x83, 0xbb, 0xb5,
-    0x82, 0xb1, 0x9e, 0xea, 0xe0, 0x64, 0x5b, 0x1e, 0x2f, 0x5e, 0x2c, 0x0a,
-    0x80, 0x3d, 0x29, 0xd4, 0xfa, 0x9a, 0xe7, 0x44, 0xe6, 0x21, 0xbd, 0x98,
-    0xc0, 0x3d, 0xe0, 0x53, 0x59, 0xae, 0xd3, 0x3e, 0xfe, 0xc4, 0xc2, 0xc4,
-    0x5a, 0x5a, 0x89, 0x07, 0xf4, 0x4f, 0xdc, 0xb0, 0x6a, 0xd4, 0x3e, 0x99,
-    0x7d, 0x7a, 0x97, 0x26, 0x4e, 0xe1, 0x93, 0xca, 0x6e, 0xed, 0x07, 0xfc,
-    0xb4, 0xfa, 0x95, 0x1e, 0x73, 0x7b, 0x86, 0x08, 0x6a, 0xb9, 0xd4, 0x29,
-    0xb0, 0x7e, 0x59, 0xb7, 0x9d, 0x7b, 0xeb, 0x67, 0x6e, 0xf0, 0xbb, 0x5e,
-    0xcf, 0xb9, 0xcd, 0x58, 0x93, 0xf0, 0xe7, 0x88, 0x17, 0x6c, 0x0d, 0x76,
-    0x1e, 0xb9, 0x27, 0x9a, 0x4d, 0x02, 0x16, 0xb6, 0x49, 0x6d, 0xa7, 0x83,
-    0x23, 0x4d, 0x02, 0x48, 0x0c, 0x0c, 0x1f, 0x0e, 0x85, 0x21, 0xe3, 0x06,
-    0x76, 0x0a, 0x73, 0xe6, 0xc1, 0x21, 0xfa, 0x30, 0x18, 0x78, 0x29, 0x5c,
-    0x31, 0xd0, 0x29, 0xae, 0x6f, 0x7d, 0x87, 0xd8, 0x2f, 0x16, 0xfa, 0xbc,
-    0x67, 0x8a, 0x94, 0x71, 0x59, 0x9b, 0xec, 0x22, 0x40, 0x55, 0x9f, 0xc2,
-    0x94, 0xb5, 0xbd, 0x78, 0x01, 0xc9, 0xef, 0x18, 0xc8, 0x6d, 0x0d, 0xdc,
-    0x53, 0x42, 0xb2, 0x5c, 0xab, 0x65, 0x05, 0xbd, 0x35, 0x08, 0x85, 0x1b,
-    0xf8, 0xe9, 0x47, 0xbc, 0xfe, 0xc5, 0xae, 0x47, 0x29, 0x63, 0x44, 0x8e,
-    0x4d, 0xb7, 0x47, 0xab, 0x0d, 0xd8, 0x76, 0x68, 0x4f, 0xc7, 0x07, 0x02,
-    0xe4, 0x86, 0xb0, 0xcf, 0xd8, 0x19, 0xad, 0xf4, 0x85, 0x76, 0x8b, 0x3b,
-    0x4e, 0x40, 0x8d, 0x29, 0x7a, 0x8a, 0x07, 0x36, 0xf3, 0x78, 0xae, 0x17,
-    0xa6, 0x8f, 0x53, 0x58, 0x65, 0x4c, 0x86, 0x9e, 0xd7, 0x8b, 0xec, 0x38,
-    0x4f, 0x99, 0xc7, 0x02, 0x01, 0x03, 0x02, 0x82, 0x01, 0x00, 0x41, 0xb6,
-    0x9b, 0xf1, 0xcc, 0xe8, 0xf2, 0xc6, 0x74, 0x16, 0x57, 0xd2, 0x79, 0x01,
-    0xcb, 0xbf, 0x47, 0x40, 0x42, 0xe7, 0x69, 0x74, 0xe9, 0x72, 0xb1, 0xaa,
-    0xd3, 0x71, 0x38, 0xa7, 0x11, 0xef, 0x83, 0x44, 0x16, 0x7e, 0x65, 0xd5,
-    0x7e, 0x95, 0x8c, 0xe6, 0x74, 0x8c, 0xd4, 0xa9, 0xd8, 0x81, 0xd8, 0x3c,
-    0x3c, 0x5b, 0x5a, 0xa2, 0xdf, 0xe8, 0x75, 0x9c, 0x8d, 0x7f, 0x10, 0xfe,
-    0x51, 0xba, 0x19, 0x89, 0xeb, 0xb7, 0xdc, 0x49, 0xf3, 0x5a, 0xa8, 0x78,
-    0xa7, 0x0e, 0x14, 0x4c, 0xfd, 0x04, 0x05, 0x9c, 0x7b, 0xe2, 0xc5, 0xa3,
-    0x04, 0xee, 0xd9, 0x4c, 0xfd, 0x7d, 0x47, 0xb0, 0x0d, 0x9b, 0x3d, 0x70,
-    0x91, 0x81, 0x2c, 0xab, 0x2b, 0x87, 0xad, 0x11, 0x68, 0x24, 0xfc, 0x2b,
-    0xd4, 0xee, 0x5e, 0x28, 0xeb, 0x6d, 0xab, 0xde, 0x0f, 0x77, 0x15, 0x58,
-    0x76, 0x39, 0xc9, 0x59, 0x3a, 0x7f, 0x19, 0x9d, 0xc6, 0x7e, 0x86, 0xe4,
-    0xd5, 0x38, 0x70, 0x9e, 0xae, 0xb9, 0xfb, 0x33, 0x33, 0xd1, 0x0c, 0x2d,
-    0xab, 0x01, 0x20, 0xe1, 0x8b, 0x29, 0x99, 0xd3, 0xeb, 0x87, 0x05, 0x72,
-    0xaa, 0x43, 0x58, 0x64, 0x8e, 0x9e, 0x31, 0xdb, 0x45, 0x9b, 0x2b, 0xac,
-    0x58, 0x80, 0x5d, 0x33, 0xa2, 0x43, 0x05, 0x96, 0xcc, 0xca, 0x2d, 0x04,
-    0x5f, 0xd6, 0xb7, 0x3d, 0x8b, 0x8f, 0x2d, 0xa3, 0xa5, 0xf8, 0x73, 0xf5,
-    0xd7, 0xc0, 0x19, 0xff, 0x10, 0xe6, 0xee, 0x3a, 0x26, 0x2f, 0xe1, 0x64,
-    0x3d, 0x11, 0xcd, 0x2d, 0xe4, 0x0a, 0x84, 0x27, 0xe3, 0xcb, 0x16, 0x62,
-    0x19, 0xe7, 0xe3, 0x0d, 0x13, 0xe8, 0x09, 0x5a, 0x53, 0xd0, 0x20, 0x56,
-    0x15, 0xf5, 0xb3, 0x67, 0xac, 0xa1, 0xb5, 0x94, 0x6b, 0xab, 0xdc, 0x71,
-    0xc7, 0xbf, 0x0a, 0xde, 0x76, 0xf5, 0x03, 0xa0, 0x30, 0xd8, 0x27, 0x9d,
-    0x00, 0x2b, 0x02, 0x57, 0x00, 0xf1, 0x4f, 0xc2, 0x86, 0x13, 0x06, 0x17,
-    0xf7, 0x69, 0x7e, 0x37, 0xdf, 0x67, 0xc5, 0x32, 0xa0, 0x74, 0x1c, 0x32,
-    0x69, 0x0f, 0x9f, 0x08, 0x88, 0x24, 0xb1, 0x51, 0xbc, 0xbc, 0x92, 0xba,
-    0x73, 0x1f, 0x9c, 0x75, 0xc2, 0x14, 0x6d, 0x4f, 0xc4, 0x5a, 0xcf, 0xda,
-    0x44, 0x35, 0x00, 0x6b, 0x42, 0x3b, 0x9f, 0x14, 0xf1, 0x05, 0xb3, 0x51,
-    0x22, 0xb6, 0xbe, 0x9c, 0xe0, 0xc1, 0x5c, 0x48, 0x61, 0xdf, 0x4e, 0x4c,
-    0x72, 0xb8, 0x05, 0x35, 0x7c, 0xac, 0xf1, 0xbb, 0xa0, 0x3b, 0x2a, 0xea,
-    0xf7, 0x86, 0xe9, 0xd2, 0xff, 0x1e, 0x1d, 0x02, 0x56, 0x00, 0xca, 0xb1,
-    0x39, 0xf6, 0xa2, 0xc6, 0x3b, 0x65, 0x45, 0x2f, 0x39, 0x00, 0xcd, 0x6e,
-    0xd6, 0x55, 0xf7, 0x71, 0x37, 0x89, 0xc2, 0xe7, 0x7a, 0xc0, 0x1a, 0xa6,
-    0x2f, 0xea, 0x17, 0x7c, 0xaa, 0x2a, 0x91, 0x8f, 0xd4, 0xc7, 0x50, 0x8b,
-    0xab, 0x8e, 0x99, 0x3b, 0x33, 0x91, 0xbc, 0x02, 0x10, 0x58, 0x4b, 0x58,
-    0x40, 0x9b, 0xc4, 0x8f, 0x48, 0x2b, 0xa7, 0x44, 0xfd, 0x07, 0x04, 0xf0,
-    0x98, 0x67, 0x56, 0xea, 0x25, 0x92, 0x8b, 0x2e, 0x4b, 0x4a, 0xa1, 0xd3,
-    0xc2, 0xa4, 0xb4, 0x9b, 0x59, 0x70, 0x32, 0xa6, 0xd8, 0x8b, 0xd9, 0x02,
-    0x57, 0x00, 0xa0, 0xdf, 0xd7, 0x04, 0x0c, 0xae, 0xba, 0xa4, 0xf0, 0xfe,
-    0xcf, 0xea, 0x45, 0x2e, 0x21, 0xc0, 0x4d, 0x68, 0x21, 0x9b, 0x5f, 0xbf,
-    0x5b, 0x05, 0x6d, 0xcb, 0x8b, 0xd3, 0x28, 0x61, 0xd1, 0xa2, 0x15, 0x12,
-    0xf9, 0x2c, 0x0d, 0x9e, 0x35, 0x2d, 0x91, 0xdf, 0xe6, 0xd8, 0x23, 0x55,
-    0x9c, 0xd6, 0xd2, 0x6a, 0x0d, 0xf6, 0x03, 0xcc, 0xe0, 0xc1, 0xcf, 0x29,
-    0xbd, 0xeb, 0x2b, 0x92, 0xda, 0xeb, 0xea, 0x34, 0x32, 0xf7, 0x25, 0x58,
-    0xce, 0x53, 0x1d, 0xf6, 0x7d, 0x15, 0x7c, 0xc7, 0x47, 0x4f, 0xaf, 0x46,
-    0x8c, 0xaa, 0x14, 0x13, 0x02, 0x56, 0x00, 0x87, 0x20, 0xd1, 0x4f, 0x17,
-    0x2e, 0xd2, 0x43, 0x83, 0x74, 0xd0, 0xab, 0x33, 0x9f, 0x39, 0x8e, 0xa4,
-    0xf6, 0x25, 0x06, 0x81, 0xef, 0xa7, 0x2a, 0xbc, 0x6e, 0xca, 0x9c, 0x0f,
-    0xa8, 0x71, 0x71, 0xb6, 0x5f, 0xe3, 0x2f, 0x8b, 0x07, 0xc7, 0xb4, 0x66,
-    0x27, 0x77, 0xb6, 0x7d, 0x56, 0xb5, 0x90, 0x32, 0x3a, 0xd5, 0xbd, 0x2d,
-    0xb4, 0xda, 0xc7, 0xc4, 0xd8, 0xa8, 0xaf, 0x58, 0xa0, 0x65, 0x9a, 0x39,
-    0xf1, 0x6e, 0x61, 0xb2, 0x1e, 0xdc, 0xdc, 0x6b, 0xe2, 0x81, 0xc3, 0x23,
-    0x12, 0x3b, 0xa0, 0x21, 0xc4, 0x90, 0x5d, 0x3b, 0x02, 0x57, 0x00, 0xe6,
-    0x8a, 0xaa, 0xb8, 0x6d, 0x2c, 0x81, 0x43, 0xb5, 0xd6, 0xa0, 0x2b, 0x42,
-    0x49, 0xa9, 0x0a, 0x51, 0xfa, 0x18, 0xc8, 0x32, 0xea, 0x54, 0x18, 0xf3,
-    0x60, 0xc2, 0xb5, 0x4a, 0x43, 0x05, 0x93, 0x9c, 0x01, 0xd9, 0x28, 0xed,
-    0x73, 0xfa, 0x82, 0xbc, 0x12, 0x64, 0xcb, 0xc4, 0x24, 0xa9, 0x3e, 0xae,
-    0x7c, 0x4b, 0x8f, 0x94, 0x57, 0x7b, 0x14, 0x10, 0x41, 0xdc, 0x62, 0x12,
-    0x8c, 0xb2, 0x4a, 0x7c, 0xf6, 0x53, 0xd4, 0xc6, 0xe4, 0xda, 0xd1, 0xa2,
-    0x00, 0x0e, 0x3d, 0x30, 0xf7, 0x05, 0x4f, 0x1d, 0x82, 0xbc, 0x52, 0xd9,
-    0xb1, 0x30, 0x82, 0x01, 0x0a, 0x30, 0x82, 0x01, 0x06, 0x02, 0x56, 0x00,
-    0x84, 0x12, 0x4f, 0xf7, 0x3b, 0x65, 0x53, 0x34, 0x6c, 0x6c, 0x4d, 0x77,
-    0xdf, 0xfd, 0x1f, 0xb6, 0x16, 0xe2, 0x25, 0x15, 0xca, 0xc9, 0xc1, 0x41,
-    0x9a, 0x50, 0xda, 0xeb, 0x88, 0x4f, 0x3d, 0xb3, 0x01, 0x00, 0x44, 0xc4,
-    0xac, 0xe7, 0x14, 0x62, 0xa6, 0x56, 0xde, 0xc5, 0xb7, 0xc3, 0x1d, 0x07,
-    0xbd, 0x7d, 0x64, 0xc5, 0x7e, 0x45, 0x25, 0x56, 0xed, 0x7a, 0xd2, 0x14,
-    0xdb, 0x4e, 0x27, 0xd4, 0x1f, 0xf8, 0x94, 0xa7, 0xef, 0x07, 0xce, 0xdb,
-    0x24, 0xb7, 0xdd, 0x71, 0x5c, 0x63, 0xc9, 0x33, 0xfe, 0xde, 0x40, 0x52,
-    0xeb, 0x02, 0x55, 0x58, 0x0c, 0x35, 0x4f, 0x7c, 0xee, 0x37, 0x78, 0x48,
-    0x48, 0x33, 0xa5, 0x3f, 0xfe, 0x15, 0x24, 0x0f, 0x41, 0x6e, 0x0e, 0x87,
-    0x31, 0x2b, 0x81, 0x11, 0x8b, 0x3c, 0x9d, 0x05, 0x8a, 0x29, 0x22, 0x00,
-    0xaa, 0xd8, 0x83, 0x1d, 0xef, 0x62, 0xec, 0x6e, 0xe4, 0x94, 0x83, 0xcf,
-    0xd7, 0x68, 0xaf, 0xd3, 0xa8, 0xed, 0xd8, 0xfe, 0xd8, 0xc3, 0x8f, 0x48,
-    0xfc, 0x8c, 0x0d, 0xe7, 0x89, 0x6f, 0xe2, 0xbf, 0xfb, 0x0d, 0xc5, 0x4a,
-    0x05, 0x34, 0x92, 0x18, 0x7a, 0x93, 0xa0, 0xe8, 0x42, 0x86, 0x22, 0xa9,
-    0xe9, 0x80, 0x37, 0x47, 0x02, 0x55, 0x60, 0x76, 0xab, 0xde, 0x2b, 0xf5,
-    0xa2, 0x2c, 0xaa, 0x0c, 0x99, 0x81, 0xee, 0x72, 0x2c, 0x7d, 0x22, 0x59,
-    0x2a, 0x35, 0xea, 0x50, 0x4e, 0x47, 0x6b, 0x92, 0x2d, 0x30, 0xa1, 0x01,
-    0xa5, 0x9e, 0x26, 0x6e, 0x27, 0xca, 0xf5, 0xf2, 0x87, 0x5d, 0x31, 0xaf,
-    0xe9, 0x32, 0xcd, 0x10, 0xfd, 0x4d, 0xdb, 0xf9, 0x86, 0x05, 0x12, 0x1b,
-    0x01, 0x84, 0x55, 0x97, 0x5f, 0xe2, 0x78, 0x27, 0xd9, 0xe4, 0x26, 0x7d,
-    0xab, 0x0e, 0xe0, 0x1b, 0x6f, 0xcb, 0x4b, 0x14, 0xdd, 0xdc, 0xdc, 0x8b,
-    0xe8, 0x9f, 0xd0, 0x62, 0x96, 0xca, 0xcf,
-};
-
-const size_t kDERRSAPrivate3Prime2048Len = sizeof(kDERRSAPrivate3Prime2048);
diff --git a/src/tool/file.cc b/src/tool/file.cc
new file mode 100644
index 0000000..9b5ff1b
--- /dev/null
+++ b/src/tool/file.cc
@@ -0,0 +1,50 @@
+/* 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. */
+
+#include <stdio.h>
+
+#include <algorithm>
+#include <vector>
+
+#include "internal.h"
+
+
+bool ReadAll(std::vector<uint8_t> *out, FILE *file) {
+  out->clear();
+
+  constexpr size_t kMaxSize = 1024 * 1024;
+  size_t len = 0;
+  out->resize(128);
+
+  for (;;) {
+    len += fread(out->data() + len, 1, out->size() - len, file);
+
+    if (feof(file)) {
+      out->resize(len);
+      return true;
+    }
+    if (ferror(file)) {
+      return false;
+    }
+
+    if (len == out->size()) {
+      if (out->size() == kMaxSize) {
+        fprintf(stderr, "Input too large.\n");
+        return false;
+      }
+      size_t cap = std::min(out->size() * 2, kMaxSize);
+      out->resize(cap);
+    }
+  }
+}
diff --git a/src/tool/genrsa.cc b/src/tool/genrsa.cc
index b49ebbc..a82c9cc 100644
--- a/src/tool/genrsa.cc
+++ b/src/tool/genrsa.cc
@@ -23,10 +23,6 @@
 
 static const struct argument kArguments[] = {
     {
-     "-nprimes", kOptionalArgument,
-     "The number of primes to generate (default: 2)",
-    },
-    {
      "-bits", kOptionalArgument,
      "The number of bits in the modulus (default: 2048)",
     },
@@ -43,9 +39,8 @@
     return false;
   }
 
-  unsigned bits, nprimes = 0;
-  if (!GetUnsigned(&bits, "-bits", 2048, args_map) ||
-      !GetUnsigned(&nprimes, "-nprimes", 2, args_map)) {
+  unsigned bits;
+  if (!GetUnsigned(&bits, "-bits", 2048, args_map)) {
     PrintUsage(kArguments);
     return false;
   }
@@ -55,7 +50,7 @@
   bssl::UniquePtr<BIO> bio(BIO_new_fp(stdout, BIO_NOCLOSE));
 
   if (!BN_set_word(e.get(), RSA_F4) ||
-      !RSA_generate_multi_prime_key(rsa.get(), bits, nprimes, e.get(), NULL) ||
+      !RSA_generate_key_ex(rsa.get(), bits, e.get(), NULL) ||
       !PEM_write_bio_RSAPrivateKey(bio.get(), rsa.get(), NULL /* cipher */,
                                    NULL /* key */, 0 /* key len */,
                                    NULL /* password callback */,
diff --git a/src/tool/internal.h b/src/tool/internal.h
index fd66e00..a3d608a 100644
--- a/src/tool/internal.h
+++ b/src/tool/internal.h
@@ -65,6 +65,8 @@
                  unsigned default_value,
                  const std::map<std::string, std::string> &args);
 
+bool ReadAll(std::vector<uint8_t> *out, FILE *in);
+
 bool Ciphers(const std::vector<std::string> &args);
 bool Client(const std::vector<std::string> &args);
 bool DoPKCS12(const std::vector<std::string> &args);
@@ -78,6 +80,7 @@
 bool SHA384Sum(const std::vector<std::string> &args);
 bool SHA512Sum(const std::vector<std::string> &args);
 bool Server(const std::vector<std::string> &args);
+bool Sign(const std::vector<std::string> &args);
 bool Speed(const std::vector<std::string> &args);
 
 // These values are DER encoded, RSA private keys.
@@ -85,8 +88,6 @@
 extern const size_t kDERRSAPrivate2048Len;
 extern const uint8_t kDERRSAPrivate4096[];
 extern const size_t kDERRSAPrivate4096Len;
-extern const uint8_t kDERRSAPrivate3Prime2048[];
-extern const size_t kDERRSAPrivate3Prime2048Len;
 
 
 #endif /* !OPENSSL_HEADER_TOOL_INTERNAL_H */
diff --git a/src/tool/server.cc b/src/tool/server.cc
index 1a97dff..48a11f2 100644
--- a/src/tool/server.cc
+++ b/src/tool/server.cc
@@ -14,6 +14,8 @@
 
 #include <openssl/base.h>
 
+#include <memory>
+
 #include <openssl/err.h>
 #include <openssl/rand.h>
 #include <openssl/ssl.h>
@@ -33,6 +35,10 @@
         "ciphers",
     },
     {
+        "-curves", kOptionalArgument,
+        "An OpenSSL-style ECDH curves list that configures the offered curves",
+    },
+    {
         "-max-version", kOptionalArgument,
         "The maximum acceptable protocol version",
     },
@@ -42,9 +48,14 @@
     },
     {
         "-key", kOptionalArgument,
-        "PEM-encoded file containing the private key, leaf certificate and "
-        "optional certificate chain. A self-signed certificate is generated "
-        "at runtime if this argument is not provided.",
+        "PEM-encoded file containing the private key. A self-signed "
+        "certificate is generated at runtime if this argument is not provided.",
+    },
+    {
+        "-cert", kOptionalArgument,
+        "PEM-encoded file containing the leaf certificate and optional "
+        "certificate chain. This is taken from the -key argument if this "
+        "argument is not provided.",
     },
     {
         "-ocsp-response", kOptionalArgument, "OCSP response file to send",
@@ -61,44 +72,28 @@
     },
 };
 
+struct FileCloser {
+  void operator()(FILE *file) {
+    fclose(file);
+  }
+};
+
+using ScopedFILE = std::unique_ptr<FILE, FileCloser>;
+
 static bool LoadOCSPResponse(SSL_CTX *ctx, const char *filename) {
-  void *data = NULL;
-  bool ret = false;
-  size_t bytes_read;
-  long length;
-
-  FILE *f = fopen(filename, "rb");
-
-  if (f == NULL ||
-      fseek(f, 0, SEEK_END) != 0) {
-    goto out;
+  ScopedFILE f(fopen(filename, "rb"));
+  std::vector<uint8_t> data;
+  if (f == nullptr ||
+      !ReadAll(&data, f.get())) {
+    fprintf(stderr, "Error reading %s.\n", filename);
+    return false;
   }
 
-  length = ftell(f);
-  if (length < 0) {
-    goto out;
+  if (!SSL_CTX_set_ocsp_response(ctx, data.data(), data.size())) {
+    return false;
   }
 
-  data = malloc(length);
-  if (data == NULL) {
-    goto out;
-  }
-  rewind(f);
-
-  bytes_read = fread(data, 1, length, f);
-  if (ferror(f) != 0 ||
-      bytes_read != (size_t)length ||
-      !SSL_CTX_set_ocsp_response(ctx, (uint8_t*)data, bytes_read)) {
-    goto out;
-  }
-
-  ret = true;
-out:
-  if (f != NULL) {
-      fclose(f);
-  }
-  free(data);
-  return ret;
+  return true;
 }
 
 static bssl::UniquePtr<EVP_PKEY> MakeKeyPairForSelfSignedCert() {
@@ -161,13 +156,16 @@
 
   // Server authentication is required.
   if (args_map.count("-key") != 0) {
-    std::string key_file = args_map["-key"];
-    if (!SSL_CTX_use_PrivateKey_file(ctx.get(), key_file.c_str(), SSL_FILETYPE_PEM)) {
-      fprintf(stderr, "Failed to load private key: %s\n", key_file.c_str());
+    std::string key = args_map["-key"];
+    if (!SSL_CTX_use_PrivateKey_file(ctx.get(), key.c_str(),
+                                     SSL_FILETYPE_PEM)) {
+      fprintf(stderr, "Failed to load private key: %s\n", key.c_str());
       return false;
     }
-    if (!SSL_CTX_use_certificate_chain_file(ctx.get(), key_file.c_str())) {
-      fprintf(stderr, "Failed to load cert chain: %s\n", key_file.c_str());
+    const std::string &cert =
+        args_map.count("-cert") != 0 ? args_map["-cert"] : key;
+    if (!SSL_CTX_use_certificate_chain_file(ctx.get(), cert.c_str())) {
+      fprintf(stderr, "Failed to load cert chain: %s\n", cert.c_str());
       return false;
     }
   } else {
@@ -196,6 +194,12 @@
     return false;
   }
 
+  if (args_map.count("-curves") != 0 &&
+      !SSL_CTX_set1_curves_list(ctx.get(), args_map["-curves"].c_str())) {
+    fprintf(stderr, "Failed setting curves list\n");
+    return false;
+  }
+
   uint16_t max_version = TLS1_3_VERSION;
   if (args_map.count("-max-version") != 0 &&
       !VersionFromString(&max_version, args_map["-max-version"])) {
@@ -246,14 +250,15 @@
       int ssl_err = SSL_get_error(ssl.get(), ret);
       fprintf(stderr, "Error while connecting: %d\n", ssl_err);
       ERR_print_errors_cb(PrintErrorCallback, stderr);
-      return false;
+      result = false;
+      continue;
     }
 
     fprintf(stderr, "Connected.\n");
     PrintConnectionInfo(ssl.get());
 
     result = TransferData(ssl.get(), sock);
-  } while (result && args_map.count("-loop") != 0);
+  } while (args_map.count("-loop") != 0);
 
   return result;
 }
diff --git a/src/tool/sign.cc b/src/tool/sign.cc
new file mode 100644
index 0000000..74b84f1
--- /dev/null
+++ b/src/tool/sign.cc
@@ -0,0 +1,88 @@
+/* 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. */
+
+#include <map>
+#include <vector>
+
+#include <openssl/bio.h>
+#include <openssl/evp.h>
+#include <openssl/pem.h>
+
+#include "internal.h"
+
+
+static const struct argument kArguments[] = {
+    {"-key", kRequiredArgument, "The private key, in PEM format, to sign with"},
+    {"-digest", kOptionalArgument, "The digest algorithm to use"},
+    {"", kOptionalArgument, ""},
+};
+
+bool Sign(const std::vector<std::string> &args) {
+  std::map<std::string, std::string> args_map;
+  if (!ParseKeyValueArguments(&args_map, args, kArguments)) {
+    PrintUsage(kArguments);
+    return false;
+  }
+
+  // Load the private key.
+  bssl::UniquePtr<BIO> bio(BIO_new(BIO_s_file()));
+  if (!bio || !BIO_read_filename(bio.get(), args_map["-key"].c_str())) {
+    return false;
+  }
+  bssl::UniquePtr<EVP_PKEY> key(
+      PEM_read_bio_PrivateKey(bio.get(), nullptr, nullptr, nullptr));
+  if (!key) {
+    return false;
+  }
+
+  // Setup the signing operation.
+  bssl::UniquePtr<EVP_PKEY_CTX> ctx(EVP_PKEY_CTX_new(key.get(), nullptr));
+  if (!ctx ||
+      !EVP_PKEY_sign_init(ctx.get())) {
+    return false;
+  }
+
+  if (args_map.count("-digest")) {
+    const EVP_MD *md = EVP_get_digestbyname(args_map["-digest"].c_str());
+    if (md == nullptr) {
+      fprintf(stderr, "Unknown digest algorithm: %s\n",
+              args_map["-digest"].c_str());
+      return false;
+    }
+
+    if (!EVP_PKEY_CTX_set_signature_md(ctx.get(), md)) {
+      return false;
+    }
+  }
+
+  std::vector<uint8_t> data;
+  if (!ReadAll(&data, stdin)) {
+    fprintf(stderr, "Error reading input.\n");
+    return false;
+  }
+
+  size_t sig_len = EVP_PKEY_size(key.get());
+  std::unique_ptr<uint8_t[]> sig(new uint8_t[sig_len]);
+  if (!EVP_PKEY_sign_message(ctx.get(), sig.get(), &sig_len, data.data(),
+                             data.size())) {
+    return false;
+  }
+
+  if (fwrite(sig.get(), 1, sig_len, stdout) != sig_len) {
+    fprintf(stderr, "Error writing signature.\n");
+    return false;
+  }
+
+  return true;
+}
diff --git a/src/tool/speed.cc b/src/tool/speed.cc
index 3e5952f..6d3997e 100644
--- a/src/tool/speed.cc
+++ b/src/tool/speed.cc
@@ -620,18 +620,6 @@
     return false;
   }
 
-  key.reset(RSA_private_key_from_bytes(kDERRSAPrivate3Prime2048,
-                                       kDERRSAPrivate3Prime2048Len));
-  if (key == nullptr) {
-    fprintf(stderr, "Failed to parse RSA key.\n");
-    ERR_print_errors_fp(stderr);
-    return false;
-  }
-
-  if (!SpeedRSA("RSA 2048 (3 prime, e=3)", key.get(), selected)) {
-    return false;
-  }
-
   key.reset(
       RSA_private_key_from_bytes(kDERRSAPrivate4096, kDERRSAPrivate4096Len));
   if (key == nullptr) {
diff --git a/src/tool/tool.cc b/src/tool/tool.cc
index 34851b4..670d4e7 100644
--- a/src/tool/tool.cc
+++ b/src/tool/tool.cc
@@ -29,6 +29,11 @@
 #include "internal.h"
 
 
+static bool IsFIPS(const std::vector<std::string> &args) {
+  printf("%d\n", FIPS_mode());
+  return true;
+}
+
 typedef bool (*tool_func_t)(const std::vector<std::string> &args);
 
 struct Tool {
@@ -39,6 +44,7 @@
 static const Tool kTools[] = {
   { "ciphers", Ciphers },
   { "client", Client },
+  { "isfips", IsFIPS },
   { "generate-ed25519", GenerateEd25519Key },
   { "genrsa", GenerateRSAKey },
   { "md5sum", MD5Sum },
@@ -52,6 +58,7 @@
   { "sha256sum", SHA256Sum },
   { "sha384sum", SHA384Sum },
   { "sha512sum", SHA512Sum },
+  { "sign", Sign },
   { "speed", Speed },
   { "", nullptr },
 };
@@ -122,5 +129,10 @@
     args.push_back(argv[i]);
   }
 
-  return !tool(args);
+  if (!tool(args)) {
+    ERR_print_errors_fp(stderr);
+    return 1;
+  }
+
+  return 0;
 }
diff --git a/src/tool/transport_common.cc b/src/tool/transport_common.cc
index 56bde28..b7ad5ff 100644
--- a/src/tool/transport_common.cc
+++ b/src/tool/transport_common.cc
@@ -238,6 +238,8 @@
       return "rsa_pss_sha384";
     case SSL_SIGN_RSA_PSS_SHA512:
       return "rsa_pss_sha512";
+    case SSL_SIGN_ED25519:
+      return "ed25519";
     default:
       return "(unknown)";
   }
diff --git a/src/util/all_tests.go b/src/util/all_tests.go
index 3cf2320..fbee0ff 100644
--- a/src/util/all_tests.go
+++ b/src/util/all_tests.go
@@ -22,6 +22,7 @@
 	"os"
 	"os/exec"
 	"path"
+	"runtime"
 	"strconv"
 	"strings"
 	"sync"
@@ -37,7 +38,7 @@
 	useGDB          = flag.Bool("gdb", false, "If true, run BoringSSL code under gdb")
 	useSDE          = flag.Bool("sde", false, "If true, run BoringSSL code under Intel's SDE for each supported chip")
 	buildDir        = flag.String("build-dir", "build", "The build directory to run the tests from.")
-	numWorkers      = flag.Int("num-workers", 1, "Runs the given number of workers when testing.")
+	numWorkers      = flag.Int("num-workers", runtime.NumCPU(), "Runs the given number of workers when testing.")
 	jsonOutput      = flag.String("json-output", "", "The file to output JSON results to.")
 	mallocTest      = flag.Int64("malloc-test", -1, "If non-negative, run each test with each malloc in turn failing from the given number onwards.")
 	mallocTestDebug = flag.Bool("malloc-test-debug", false, "If true, ask each test to abort rather than fail a malloc. This can be used with a specific value for --malloc-test to identity the malloc failing that is causing problems.")
@@ -245,13 +246,13 @@
 	}
 }
 
-// shortTestName returns the short name of a test. Except for evp_test, it
-// assumes that any argument which ends in .txt is a path to a data file and not
-// relevant to the test's uniqueness.
+// shortTestName returns the short name of a test. Except for evp_test and
+// cipher_test, it assumes that any argument which ends in .txt is a path to a
+// data file and not relevant to the test's uniqueness.
 func shortTestName(test test) string {
 	var args []string
 	for _, arg := range test.args {
-		if test.args[0] == "crypto/evp/evp_test" || !strings.HasSuffix(arg, ".txt") {
+		if test.args[0] == "crypto/evp/evp_test" || test.args[0] == "crypto/cipher/cipher_test" || !strings.HasSuffix(arg, ".txt") {
 			args = append(args, arg)
 		}
 	}
diff --git a/src/util/all_tests.json b/src/util/all_tests.json
index a1ce5f2..ebc632d 100644
--- a/src/util/all_tests.json
+++ b/src/util/all_tests.json
@@ -1,8 +1,6 @@
 [
-	["crypto/aes/aes_test", "crypto/aes/aes_tests.txt"],
-	["crypto/base64/base64_test"],
+	["crypto/fipsmodule/aes_test", "crypto/fipsmodule/aes/aes_tests.txt"],
 	["crypto/bn/bn_test", "crypto/bn/bn_tests.txt"],
-	["crypto/bytestring/bytestring_test"],
 	["crypto/cipher/aead_test", "aes-128-gcm", "crypto/cipher/test/aes_128_gcm_tests.txt"],
 	["crypto/cipher/aead_test", "aes-256-gcm", "crypto/cipher/test/aes_256_gcm_tests.txt"],
 	["crypto/cipher/aead_test", "aes-128-gcm-siv", "crypto/cipher/test/aes_128_gcm_siv_tests.txt"],
@@ -23,11 +21,35 @@
 	["crypto/cipher/aead_test", "aes-128-ctr-hmac-sha256", "crypto/cipher/test/aes_128_ctr_hmac_sha256.txt"],
 	["crypto/cipher/aead_test", "aes-256-ctr-hmac-sha256", "crypto/cipher/test/aes_256_ctr_hmac_sha256.txt"],
 	["crypto/cipher/cipher_test", "crypto/cipher/test/cipher_tests.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_gf_sbox.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_gf_sbox.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_gf_sbox.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_key_sbox.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_key_sbox.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_key_sbox.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_var_key.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_var_key.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_var_key.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_128_cbc_var_txt.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_192_cbc_var_txt.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_256_cbc_var_txt.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_gf_sbox.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_gf_sbox.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_gf_sbox.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_key_sbox.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_key_sbox.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_key_sbox.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_var_key.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_var_key.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_var_key.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_128_ctr_var_txt.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_192_ctr_var_txt.txt"],
+	["crypto/cipher/cipher_test", "crypto/cipher/test/nist_cavp/aesvs/aes_256_ctr_var_txt.txt"],
 	["crypto/cmac/cmac_test"],
 	["crypto/crypto_test"],
 	["crypto/curve25519/ed25519_test", "crypto/curve25519/ed25519_tests.txt"],
 	["crypto/curve25519/spake25519_test"],
-	["crypto/digest/digest_test"],
+	["crypto/digest_extra/digest_test"],
 	["crypto/ec/example_mul"],
 	["crypto/ec/p256-x86_64_test", "crypto/ec/p256-x86_64_tests.txt"],
 	["crypto/ecdh/ecdh_test", "crypto/ecdh/ecdh_tests.txt"],
@@ -37,7 +59,7 @@
 	["crypto/evp/evp_test", "crypto/evp/evp_tests.txt"],
 	["crypto/evp/pbkdf_test"],
 	["crypto/hkdf/hkdf_test"],
-	["crypto/hmac/hmac_test", "crypto/hmac/hmac_tests.txt"],
+	["crypto/hmac_extra/hmac_test", "crypto/hmac_extra/hmac_tests.txt"],
 	["crypto/lhash/lhash_test"],
 	["crypto/modes/gcm_test"],
 	["crypto/obj/obj_test"],
@@ -45,6 +67,7 @@
 	["crypto/pkcs8/pkcs8_test"],
 	["crypto/poly1305/poly1305_test", "crypto/poly1305/poly1305_tests.txt"],
 	["crypto/pool/pool_test"],
+	["crypto/rand/ctrdrbg_vector_test", "crypto/rand/ctrdrbg_vectors.txt"],
 	["crypto/refcount_test"],
 	["crypto/thread_test"],
 	["crypto/x509/pkcs7_test"],
diff --git a/src/util/diff_asm.go b/src/util/diff_asm.go
index bc9363f..fa255c0 100644
--- a/src/util/diff_asm.go
+++ b/src/util/diff_asm.go
@@ -30,6 +30,7 @@
 )
 
 func mapName(path string) string {
+	path = strings.Replace(path, filepath.FromSlash("/fipsmodule/"), string(filepath.Separator), 1)
 	switch filepath.ToSlash(path) {
 	case "crypto/cipher/asm/chacha20_poly1305_x86_64.pl", "crypto/rand/asm/rdrand-x86_64.pl":
 		return ""
diff --git a/src/util/generate_build_files.py b/src/util/generate_build_files.py
index a3435f2..8e23040 100644
--- a/src/util/generate_build_files.py
+++ b/src/util/generate_build_files.py
@@ -208,6 +208,7 @@
       out.write(self.header)
 
       self.PrintVariableSection(out, 'ssl_headers', files['ssl_headers'])
+      self.PrintVariableSection(out, 'fips_fragments', files['fips_fragments'])
       self.PrintVariableSection(
           out, 'ssl_internal_headers', files['ssl_internal_headers'])
       self.PrintVariableSection(out, 'ssl_sources', files['ssl'])
@@ -436,8 +437,15 @@
 
   return cmakefiles
 
+def OnlyFIPSFragments(path, dent, is_dir):
+  return is_dir or path.startswith(
+      os.path.join('src', 'crypto', 'fipsmodule', ''))
 
-def NoTests(dent, is_dir):
+def NoTestsNorFIPSFragments(path, dent, is_dir):
+  return (NoTests(path, dent, is_dir) and
+      (is_dir or not OnlyFIPSFragments(path, dent, is_dir)))
+
+def NoTests(path, dent, is_dir):
   """Filter function that can be passed to FindCFiles in order to remove test
   sources."""
   if is_dir:
@@ -445,7 +453,7 @@
   return 'test.' not in dent and not dent.startswith('example_')
 
 
-def OnlyTests(dent, is_dir):
+def OnlyTests(path, dent, is_dir):
   """Filter function that can be passed to FindCFiles in order to remove
   non-test sources."""
   if is_dir:
@@ -453,17 +461,25 @@
   return '_test.' in dent or dent.startswith('example_')
 
 
-def AllFiles(dent, is_dir):
+def AllFiles(path, dent, is_dir):
   """Filter function that can be passed to FindCFiles in order to include all
   sources."""
   return True
 
 
-def NotGTestMain(dent, is_dir):
+def NoTestRunnerFiles(path, dent, is_dir):
+  """Filter function that can be passed to FindCFiles or FindHeaderFiles in
+  order to exclude test runner files."""
+  # NOTE(martinkr): This prevents .h/.cc files in src/ssl/test/runner, which
+  # are in their own subpackage, from being included in boringssl/BUILD files.
+  return not is_dir or dent != 'runner'
+
+
+def NotGTestMain(path, dent, is_dir):
   return dent != 'gtest_main.cc'
 
 
-def SSLHeaderFiles(dent, is_dir):
+def SSLHeaderFiles(path, dent, is_dir):
   return dent in ['ssl.h', 'tls1.h', 'ssl23.h', 'ssl3.h', 'dtls1.h']
 
 
@@ -476,12 +492,12 @@
     for filename in filenames:
       if not filename.endswith('.c') and not filename.endswith('.cc'):
         continue
-      if not filter_func(filename, False):
+      if not filter_func(path, filename, False):
         continue
       cfiles.append(os.path.join(path, filename))
 
     for (i, dirname) in enumerate(dirnames):
-      if not filter_func(dirname, True):
+      if not filter_func(path, dirname, True):
         del dirnames[i]
 
   return cfiles
@@ -495,12 +511,12 @@
     for filename in filenames:
       if not filename.endswith('.h'):
         continue
-      if not filter_func(filename, False):
+      if not filter_func(path, filename, False):
         continue
       hfiles.append(os.path.join(path, filename))
 
       for (i, dirname) in enumerate(dirnames):
-        if not filter_func(dirname, True):
+        if not filter_func(path, dirname, True):
           del dirnames[i]
 
   return hfiles
@@ -609,7 +625,8 @@
 
 
 def main(platforms):
-  crypto_c_files = FindCFiles(os.path.join('src', 'crypto'), NoTests)
+  crypto_c_files = FindCFiles(os.path.join('src', 'crypto'), NoTestsNorFIPSFragments)
+  fips_fragments = FindCFiles(os.path.join('src', 'crypto', 'fipsmodule'), OnlyFIPSFragments)
   ssl_source_files = FindCFiles(os.path.join('src', 'ssl'), NoTests)
   tool_c_files = FindCFiles(os.path.join('src', 'tool'), NoTests)
   tool_h_files = FindHeaderFiles(os.path.join('src', 'tool'), AllFiles)
@@ -625,7 +642,7 @@
                                     NotGTestMain)
   test_support_h_files = (
       FindHeaderFiles(os.path.join('src', 'crypto', 'test'), AllFiles) +
-      FindHeaderFiles(os.path.join('src', 'ssl', 'test'), AllFiles))
+      FindHeaderFiles(os.path.join('src', 'ssl', 'test'), NoTestRunnerFiles))
 
   test_c_files = []
   crypto_test_files = ['src/crypto/test/gtest_main.cc']
@@ -646,8 +663,8 @@
           os.path.join('src', 'include', 'openssl'),
           SSLHeaderFiles))
 
-  def NotSSLHeaderFiles(filename, is_dir):
-    return not SSLHeaderFiles(filename, is_dir)
+  def NotSSLHeaderFiles(path, filename, is_dir):
+    return not SSLHeaderFiles(path, filename, is_dir)
   crypto_h_files = (
       FindHeaderFiles(
           os.path.join('src', 'include', 'openssl'),
@@ -669,6 +686,7 @@
           'src/',
           '')
       for test in test_c_files])
+
   if test_binaries != test_sources:
     print 'Test sources and configured tests do not match'
     a = test_binaries.difference(test_sources)
@@ -683,6 +701,7 @@
       'crypto_headers': crypto_h_files,
       'crypto_internal_headers': crypto_internal_h_files,
       'crypto_test': sorted(crypto_test_files),
+      'fips_fragments': fips_fragments,
       'fuzz': fuzz_c_files,
       'ssl': ssl_source_files,
       'ssl_c': [s for s in ssl_source_files if s.endswith('.c')],
diff --git a/src/util/run_android_tests.go b/src/util/run_android_tests.go
index 92deac0..115c3da 100644
--- a/src/util/run_android_tests.go
+++ b/src/util/run_android_tests.go
@@ -251,6 +251,8 @@
 			"ssl/test/runner/ecdsa_p384_key.pem",
 			"ssl/test/runner/ecdsa_p521_cert.pem",
 			"ssl/test/runner/ecdsa_p521_key.pem",
+			"ssl/test/runner/ed25519_cert.pem",
+			"ssl/test/runner/ed25519_key.pem",
 			"ssl/test/runner/key.pem",
 			"ssl/test/runner/rsa_1024_cert.pem",
 			"ssl/test/runner/rsa_1024_key.pem",
diff --git a/win-x86/crypto/aes/aes-586.asm b/win-x86/crypto/fipsmodule/aes-586.asm
similarity index 100%
rename from win-x86/crypto/aes/aes-586.asm
rename to win-x86/crypto/fipsmodule/aes-586.asm
diff --git a/win-x86/crypto/aes/aesni-x86.asm b/win-x86/crypto/fipsmodule/aesni-x86.asm
similarity index 100%
rename from win-x86/crypto/aes/aesni-x86.asm
rename to win-x86/crypto/fipsmodule/aesni-x86.asm
diff --git a/win-x86/crypto/md5/md5-586.asm b/win-x86/crypto/fipsmodule/md5-586.asm
similarity index 100%
rename from win-x86/crypto/md5/md5-586.asm
rename to win-x86/crypto/fipsmodule/md5-586.asm
diff --git a/win-x86/crypto/sha/sha1-586.asm b/win-x86/crypto/fipsmodule/sha1-586.asm
similarity index 100%
rename from win-x86/crypto/sha/sha1-586.asm
rename to win-x86/crypto/fipsmodule/sha1-586.asm
diff --git a/win-x86/crypto/sha/sha256-586.asm b/win-x86/crypto/fipsmodule/sha256-586.asm
similarity index 100%
rename from win-x86/crypto/sha/sha256-586.asm
rename to win-x86/crypto/fipsmodule/sha256-586.asm
diff --git a/win-x86/crypto/sha/sha512-586.asm b/win-x86/crypto/fipsmodule/sha512-586.asm
similarity index 100%
rename from win-x86/crypto/sha/sha512-586.asm
rename to win-x86/crypto/fipsmodule/sha512-586.asm
diff --git a/win-x86/crypto/aes/vpaes-x86.asm b/win-x86/crypto/fipsmodule/vpaes-x86.asm
similarity index 100%
rename from win-x86/crypto/aes/vpaes-x86.asm
rename to win-x86/crypto/fipsmodule/vpaes-x86.asm
diff --git a/win-x86_64/crypto/aes/aes-x86_64.asm b/win-x86_64/crypto/fipsmodule/aes-x86_64.asm
similarity index 99%
rename from win-x86_64/crypto/aes/aes-x86_64.asm
rename to win-x86_64/crypto/fipsmodule/aes-x86_64.asm
index 3db1846..f40c0fe 100644
--- a/win-x86_64/crypto/aes/aes-x86_64.asm
+++ b/win-x86_64/crypto/fipsmodule/aes-x86_64.asm
@@ -1337,7 +1337,7 @@
 ALIGN	16
 global	asm_AES_cbc_encrypt
 
-EXTERN	OPENSSL_ia32cap_P
+EXTERN	OPENSSL_ia32cap_addr
 
 asm_AES_cbc_encrypt:
 	mov	QWORD[8+rsp],rdi	;WIN64 prologue
@@ -1371,7 +1371,8 @@
 	cmp	r9,0
 	cmove	r14,r10
 
-	mov	r10d,DWORD[OPENSSL_ia32cap_P]
+	mov	r10,QWORD[OPENSSL_ia32cap_addr]
+	mov	r10d,DWORD[r10]
 	cmp	rdx,512
 	jb	NEAR $L$cbc_slow_prologue
 	test	rdx,15
diff --git a/win-x86_64/crypto/aes/aesni-x86_64.asm b/win-x86_64/crypto/fipsmodule/aesni-x86_64.asm
similarity index 99%
rename from win-x86_64/crypto/aes/aesni-x86_64.asm
rename to win-x86_64/crypto/fipsmodule/aesni-x86_64.asm
index d5d454d..ef8ef26 100644
--- a/win-x86_64/crypto/aes/aesni-x86_64.asm
+++ b/win-x86_64/crypto/fipsmodule/aesni-x86_64.asm
@@ -4,7 +4,7 @@
 %define ZMMWORD
 section	.text code align=64
 
-EXTERN	OPENSSL_ia32cap_P
+EXTERN	OPENSSL_ia32cap_addr
 global	aesni_encrypt
 
 ALIGN	16
@@ -1195,7 +1195,8 @@
 	lea	r9,[7+r8]
 	mov	DWORD[((96+12))+rsp],r10d
 	bswap	r9d
-	mov	r10d,DWORD[((OPENSSL_ia32cap_P+4))]
+	mov	r10,QWORD[OPENSSL_ia32cap_addr]
+	mov	r10d,DWORD[4+r10]
 	xor	r9d,ebp
 	and	r10d,71303168
 	mov	DWORD[((112+12))+rsp],r9d
@@ -3755,7 +3756,8 @@
 	movdqa	xmm14,xmm5
 	movdqu	xmm7,XMMWORD[80+rdi]
 	movdqa	xmm15,xmm6
-	mov	r9d,DWORD[((OPENSSL_ia32cap_P+4))]
+	mov	r9,QWORD[OPENSSL_ia32cap_addr]
+	mov	r9d,DWORD[4+r9]
 	cmp	rdx,0x70
 	jbe	NEAR $L$cbc_dec_six_or_seven
 
@@ -4292,10 +4294,11 @@
 	test	r8,r8
 	jz	NEAR $L$enc_key_ret
 
-	mov	r10d,268437504
 	movups	xmm0,XMMWORD[rcx]
 	xorps	xmm4,xmm4
-	and	r10d,DWORD[((OPENSSL_ia32cap_P+4))]
+	mov	r10,QWORD[OPENSSL_ia32cap_addr]
+	mov	r10d,DWORD[4+r10]
+	and	r10d,268437504
 	lea	rax,[16+r8]
 	cmp	edx,256
 	je	NEAR $L$14rounds
diff --git a/win-x86_64/crypto/aes/bsaes-x86_64.asm b/win-x86_64/crypto/fipsmodule/bsaes-x86_64.asm
similarity index 100%
rename from win-x86_64/crypto/aes/bsaes-x86_64.asm
rename to win-x86_64/crypto/fipsmodule/bsaes-x86_64.asm
diff --git a/win-x86_64/crypto/md5/md5-x86_64.asm b/win-x86_64/crypto/fipsmodule/md5-x86_64.asm
similarity index 100%
rename from win-x86_64/crypto/md5/md5-x86_64.asm
rename to win-x86_64/crypto/fipsmodule/md5-x86_64.asm
diff --git a/win-x86_64/crypto/sha/sha1-x86_64.asm b/win-x86_64/crypto/fipsmodule/sha1-x86_64.asm
similarity index 99%
rename from win-x86_64/crypto/sha/sha1-x86_64.asm
rename to win-x86_64/crypto/fipsmodule/sha1-x86_64.asm
index 5484574..8324ab6 100644
--- a/win-x86_64/crypto/sha/sha1-x86_64.asm
+++ b/win-x86_64/crypto/fipsmodule/sha1-x86_64.asm
@@ -4,7 +4,7 @@
 %define ZMMWORD
 section	.text code align=64
 
-EXTERN	OPENSSL_ia32cap_P
+EXTERN	OPENSSL_ia32cap_addr
 
 global	sha1_block_data_order
 
@@ -19,9 +19,11 @@
 	mov	rdx,r8
 
 
-	mov	r9d,DWORD[((OPENSSL_ia32cap_P+0))]
-	mov	r8d,DWORD[((OPENSSL_ia32cap_P+4))]
-	mov	r10d,DWORD[((OPENSSL_ia32cap_P+8))]
+	lea	r10,[OPENSSL_ia32cap_addr]
+	mov	r10,QWORD[r10]
+	mov	r9d,DWORD[r10]
+	mov	r8d,DWORD[4+r10]
+	mov	r10d,DWORD[8+r10]
 	test	r8d,512
 	jz	NEAR $L$ialu
 	and	r8d,268435456
diff --git a/win-x86_64/crypto/sha/sha256-x86_64.asm b/win-x86_64/crypto/fipsmodule/sha256-x86_64.asm
similarity index 99%
rename from win-x86_64/crypto/sha/sha256-x86_64.asm
rename to win-x86_64/crypto/fipsmodule/sha256-x86_64.asm
index 6e3d154..68da567 100644
--- a/win-x86_64/crypto/sha/sha256-x86_64.asm
+++ b/win-x86_64/crypto/fipsmodule/sha256-x86_64.asm
@@ -5,7 +5,7 @@
 section	.text code align=64
 
 
-EXTERN	OPENSSL_ia32cap_P
+EXTERN	OPENSSL_ia32cap_addr
 global	sha256_block_data_order
 
 ALIGN	16
@@ -19,7 +19,8 @@
 	mov	rdx,r8
 
 
-	lea	r11,[OPENSSL_ia32cap_P]
+	lea	r11,[OPENSSL_ia32cap_addr]
+	mov	r11,QWORD[r11]
 	mov	r9d,DWORD[r11]
 	mov	r10d,DWORD[4+r11]
 	mov	r11d,DWORD[8+r11]
@@ -55,6 +56,7 @@
 	mov	r9d,DWORD[20+rdi]
 	mov	r10d,DWORD[24+rdi]
 	mov	r11d,DWORD[28+rdi]
+
 	jmp	NEAR $L$loop
 
 ALIGN	16
diff --git a/win-x86_64/crypto/sha/sha512-x86_64.asm b/win-x86_64/crypto/fipsmodule/sha512-x86_64.asm
similarity index 99%
rename from win-x86_64/crypto/sha/sha512-x86_64.asm
rename to win-x86_64/crypto/fipsmodule/sha512-x86_64.asm
index d0d7a43..1ee43c6 100644
--- a/win-x86_64/crypto/sha/sha512-x86_64.asm
+++ b/win-x86_64/crypto/fipsmodule/sha512-x86_64.asm
@@ -5,7 +5,7 @@
 section	.text code align=64
 
 
-EXTERN	OPENSSL_ia32cap_P
+EXTERN	OPENSSL_ia32cap_addr
 global	sha512_block_data_order
 
 ALIGN	16
@@ -19,7 +19,8 @@
 	mov	rdx,r8
 
 
-	lea	r11,[OPENSSL_ia32cap_P]
+	lea	r11,[OPENSSL_ia32cap_addr]
+	mov	r11,QWORD[r11]
 	mov	r9d,DWORD[r11]
 	mov	r10d,DWORD[4+r11]
 	mov	r11d,DWORD[8+r11]
@@ -55,6 +56,7 @@
 	mov	r9,QWORD[40+rdi]
 	mov	r10,QWORD[48+rdi]
 	mov	r11,QWORD[56+rdi]
+
 	jmp	NEAR $L$loop
 
 ALIGN	16
diff --git a/win-x86_64/crypto/aes/vpaes-x86_64.asm b/win-x86_64/crypto/fipsmodule/vpaes-x86_64.asm
similarity index 100%
rename from win-x86_64/crypto/aes/vpaes-x86_64.asm
rename to win-x86_64/crypto/fipsmodule/vpaes-x86_64.asm