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 ¶m = 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