[Cryptech-Commits] [sw/libhal] 32/58: Debug modexp_fp() buffer handling. Add basic timing report. Compensate for PyCrypto's weird inversion of p and q when calculating CRT coefficients, and add key the key components PyCrypto doesn't bother pre-calculating to our test data.

git at cryptech.is git at cryptech.is
Tue Jul 7 18:25:16 UTC 2015


This is an automated email from the git hooks/post-receive script.

sra at hactrn.net pushed a commit to branch master
in repository sw/libhal.

commit 8934e10e139d45e5bc9b6874b3c630461d55607c
Author: Rob Austein <sra at hactrn.net>
Date:   Thu Jun 11 18:21:50 2015 -0400

    Debug modexp_fp() buffer handling.  Add basic timing report.
    Compensate for PyCrypto's weird inversion of p and q when calculating
    CRT coefficients, and add key the key components PyCrypto doesn't
    bother pre-calculating to our test data.
---
 rsa.c             |  18 +-
 tests/test-rsa.c  |  46 ++-
 tests/test-rsa.h  | 974 ++++++++++++++++++++++++++++++------------------------
 tests/test-rsa.py |  29 +-
 4 files changed, 598 insertions(+), 469 deletions(-)

diff --git a/rsa.c b/rsa.c
index b61feb4..31c4f61 100644
--- a/rsa.c
+++ b/rsa.c
@@ -175,18 +175,18 @@ static hal_error_t modexp_fp(fp_int *msg, fp_int *exp, fp_int *mod, fp_int *res)
 
   assert(msg != NULL && exp != NULL && mod != NULL && res != NULL);
 
-  uint8_t msgbuf[(fp_unsigned_bin_size(msg) + 3) & ~3];
-  uint8_t expbuf[(fp_unsigned_bin_size(exp) + 3) & ~3];
-  uint8_t modbuf[(fp_unsigned_bin_size(mod) + 3) & ~3];
+  const size_t msg_len = fp_unsigned_bin_size(msg);
+  const size_t exp_len = fp_unsigned_bin_size(exp);
+  const size_t mod_len = fp_unsigned_bin_size(mod);
 
-  if ((err = unpack_fp(msg, msgbuf, sizeof(msgbuf))) != HAL_OK ||
-      (err = unpack_fp(exp, expbuf, sizeof(expbuf))) != HAL_OK ||
-      (err = unpack_fp(mod, modbuf, sizeof(modbuf))) != HAL_OK)
-    goto fail;
+  const size_t len = (MAX(MAX(msg_len, exp_len), mod_len) + 3) & ~3;
 
-  uint8_t resbuf[FP_MAX_SIZE/8];
+  uint8_t msgbuf[len], expbuf[len], modbuf[len], resbuf[len];
 
-  if ((err = hal_modexp(msgbuf, sizeof(msgbuf),
+  if ((err = unpack_fp(msg, msgbuf, sizeof(msgbuf))) != HAL_OK ||
+      (err = unpack_fp(exp, expbuf, sizeof(expbuf))) != HAL_OK ||
+      (err = unpack_fp(mod, modbuf, sizeof(modbuf))) != HAL_OK ||
+      (err = hal_modexp(msgbuf, sizeof(msgbuf),
                         expbuf, sizeof(expbuf),
                         modbuf, sizeof(modbuf),
                         resbuf, sizeof(resbuf))) != HAL_OK)
diff --git a/tests/test-rsa.c b/tests/test-rsa.c
index 51e1009..6925261 100644
--- a/tests/test-rsa.c
+++ b/tests/test-rsa.c
@@ -74,7 +74,6 @@ static int test_modexp(const char * const kind,
     return 0;
   }
 
-  printf("OK\n");
   return 1;
 }
 
@@ -105,29 +104,36 @@ static int test_crt(const char * const kind, const rsa_tc_t * const tc)
     return 0;
   }
 
-  printf("OK\n");
   return 1;
 }
 
+/*
+ * Time a test.
+ */
+
+static void _time_check(const struct timeval t0, const int ok)
+{
+  struct timeval t;
+  gettimeofday(&t, NULL);
+  t.tv_sec -= t0.tv_sec;
+  t.tv_usec = t0.tv_usec;
+  if (t.tv_usec < 0) {
+    t.tv_usec += 1000000;
+    t.tv_sec  -= 1;
+  }
+  printf("Elapsed time %lu.%06lu seconds, %s\n",
+         (unsigned long) t.tv_sec,
+         (unsigned long) t.tv_usec,
+         ok ? "OK" : "FAILED");
+}
 
 #define time_check(_expr_)                      \
   do {                                          \
-    struct timeval _t1, _t2, _td;               \
-    gettimeofday(&_t1, NULL);                   \
+    struct timeval _t;                          \
+    gettimeofday(&_t, NULL);                    \
     int _ok = (_expr_);                         \
-    gettimeofday(&_t2, NULL);                   \
-    _td.tv_sec = _t2.tv_sec - _t1.tv_sec;       \
-    _td.tv_usec = _t2.tv_usec - _t1.tv_usec;    \
-    if (_td.tv_usec < 0) {                      \
-      _td.tv_usec += 1000000;                   \
-      _td.tv_sec  -= 1;                         \
-    }                                           \
-    printf("%lu.%06lu %s\n",                    \
-           (unsigned long) _td.tv_sec,          \
-           (unsigned long) _td.tv_usec,         \
-           _ok ? "OK" : "FAILED");              \
-    if (!_ok)                                   \
-      return 0;                                 \
+    _time_check(_t, _ok);                       \
+    ok &= _ok;                                  \
   } while (0)
 
 /*
@@ -136,6 +142,8 @@ static int test_crt(const char * const kind, const rsa_tc_t * const tc)
 
 static int test_rsa(const rsa_tc_t * const tc)
 {
+  int ok = 1;
+
   /* RSA encryption */
   time_check(test_modexp("Verification", tc, &tc->s, &tc->e, &tc->m));
 
@@ -145,7 +153,7 @@ static int test_rsa(const rsa_tc_t * const tc)
   /* RSA decyrption using CRT */
   time_check(test_crt("Signature (CRT)", tc));
 
-  return 1;
+  return ok;
 }
 
 int main(int argc, char *argv[])
@@ -172,6 +180,8 @@ int main(int argc, char *argv[])
 
   hal_modexp_set_debug(1);
 
+  /* Normal test */
+
   for (i = 0; i < (sizeof(rsa_tc)/sizeof(*rsa_tc)); i++)
     if (!test_rsa(&rsa_tc[i]))
       return 1;
diff --git a/tests/test-rsa.h b/tests/test-rsa.h
index 393d01e..400ffd0 100644
--- a/tests/test-rsa.h
+++ b/tests/test-rsa.h
@@ -8,35 +8,35 @@
 
 /* 1024-bit RSA private key (PKCS #8)
 -----BEGIN PRIVATE KEY-----
-MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAM9bbEIr5Siz6UEE
-H84ukARYDIcssB4nxuiKQ8vbfb8Ikt1o5MWQ3mZ7EgPg6KaUnq5n5hx8QtPHuAOi
-HdC+YbXqr1ei61jkCUNmv9sTG61pMXnVGSm2IbOo6qLPNV/wB9jYycDMCodTBlMb
-1sUvHr+60zikQygBqP7l66KSOAjFAgMBAAECgYBTemrK+QD4sfVlx1NGnlg8Z3Yj
-tUnx2fGqDH/ewi6NidYWbPQs1XWzrDhEd3cyGQMJE6sALMZ6nBzo2YtHTl3nNOfU
-UggVUfrXoDLaD9B2gQSWsdASo9INdeWhMvuvqpstdzUoOLCuwQw1+vNqEtYts56n
-GsoygdPp+JQSb/howQJBANaCMc2e3sDvg9Vrx4CbYwKzpkeHXGaprjVEYPRo5ElE
-NoJkpOSuBPBcDFN7MlZqeRe6yoADnjnD447Wld/1xMsCQQD3dxxEfU7hldoB72C0
-FloQ1/MBeOtj6mzEqFyg7CCdz1q/AUqnUFPzP2Y6X0Ax981zUK4qmcMa45hYzxUK
-VUavAkEAhqiChTcnVOzG0NJxEf35wLdwOdTyn4wDTXMYfjXeoVPN+Dsf/GJ1vUG7
-hyh+aBs82zWqa4RZ7p9XGdMBkO9i0wJAPgr35FgCYd5/JQMOHLiJ5jUuMM1PPuK0
-WG3Zo2LwHoCxQLgjLmWeVpsrlzDwWFbHhMTSlc2tM92iAYoRvWB58wJBAMoMTfsE
-byoZgUGzccsq1qeNm0qMPfozT79WeCQBAn6Cd8SQ/jJlxBxm9Tf8qZ4ZQ0LteghV
-SEDvFWBAZretHN0=
+MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIwSaEpCTVJvbd4Z
+B1P8H9EgFlZqats7PeBIOlC2Q1zla7wBmNJkX5Jkez8tF3l22Sn99c6c6PuhyhzB
+dZtifQbZniKCJEzyby5MXZeSr20rPdrqiB9FX13mmtLN7ii4nLyAYFAQ4R8ZvdH2
+dRIWtxwhS7d4AyrWYhJkemIvSApfAgMBAAECgYAmL1Zy+AQwNuRSqawPvynFTuQI
+Bta+kTXbEJWlLyrKBlkKVb0djfNn6zCWFmrR2A53nh4Gh0wUXRTGJg8znvPKJPcp
+45znc7aGQFmDivvl5m/UkbqET6SB6JyCOCKzYa1Rtn3YFMkf/3MgzrWIhFv+UNH/
+I5lSjzJcCrN4mgI+AQJBALcTNa0mOWRXX+6jssbf65Cx6wmHsrrptXiP9gKfwdkx
+697EzyvPDL8xwL20O+xBFehj866O/f8nOPP47imOPoECQQDD3gU8wD8MeWLqYcXI
+AdERIuuk1VnL36QOzn9NoPF01DLJcrcbN24i5/9tcza3Kdec8fexJTh/PMBvR8Zr
+w5jfAkAnFgrXtNl7+suYf4qjuxroAZRUrIwUK+F6pAG5/bG9VVMudIZmrAXkrBKi
+beB9SEgNHYnhMtY3q4AVVohChwQBAkAR1I5Jf3691fcJOylUEcZEdxdYhAuOoac/
+qdCw8mvIpOCSshy1H5CpINGB1zEt72MvaF+SAr9n5dHmz3Pir4WlAkB/ZccJ5QBH
+uBP0/flXdmhG5lC3MTMiiE7Rls/3L2t6S4xVDnQ81RYf7Car53WN7qSVSZnhDGsn
+BJpghq2nYUH1
 -----END PRIVATE KEY-----
 */
 
 static const uint8_t n_1024[] = { /* key component n, 128 bytes */
-  0xcf, 0x5b, 0x6c, 0x42, 0x2b, 0xe5, 0x28, 0xb3, 0xe9, 0x41, 0x04, 0x1f,
-  0xce, 0x2e, 0x90, 0x04, 0x58, 0x0c, 0x87, 0x2c, 0xb0, 0x1e, 0x27, 0xc6,
-  0xe8, 0x8a, 0x43, 0xcb, 0xdb, 0x7d, 0xbf, 0x08, 0x92, 0xdd, 0x68, 0xe4,
-  0xc5, 0x90, 0xde, 0x66, 0x7b, 0x12, 0x03, 0xe0, 0xe8, 0xa6, 0x94, 0x9e,
-  0xae, 0x67, 0xe6, 0x1c, 0x7c, 0x42, 0xd3, 0xc7, 0xb8, 0x03, 0xa2, 0x1d,
-  0xd0, 0xbe, 0x61, 0xb5, 0xea, 0xaf, 0x57, 0xa2, 0xeb, 0x58, 0xe4, 0x09,
-  0x43, 0x66, 0xbf, 0xdb, 0x13, 0x1b, 0xad, 0x69, 0x31, 0x79, 0xd5, 0x19,
-  0x29, 0xb6, 0x21, 0xb3, 0xa8, 0xea, 0xa2, 0xcf, 0x35, 0x5f, 0xf0, 0x07,
-  0xd8, 0xd8, 0xc9, 0xc0, 0xcc, 0x0a, 0x87, 0x53, 0x06, 0x53, 0x1b, 0xd6,
-  0xc5, 0x2f, 0x1e, 0xbf, 0xba, 0xd3, 0x38, 0xa4, 0x43, 0x28, 0x01, 0xa8,
-  0xfe, 0xe5, 0xeb, 0xa2, 0x92, 0x38, 0x08, 0xc5
+  0x8c, 0x12, 0x68, 0x4a, 0x42, 0x4d, 0x52, 0x6f, 0x6d, 0xde, 0x19, 0x07,
+  0x53, 0xfc, 0x1f, 0xd1, 0x20, 0x16, 0x56, 0x6a, 0x6a, 0xdb, 0x3b, 0x3d,
+  0xe0, 0x48, 0x3a, 0x50, 0xb6, 0x43, 0x5c, 0xe5, 0x6b, 0xbc, 0x01, 0x98,
+  0xd2, 0x64, 0x5f, 0x92, 0x64, 0x7b, 0x3f, 0x2d, 0x17, 0x79, 0x76, 0xd9,
+  0x29, 0xfd, 0xf5, 0xce, 0x9c, 0xe8, 0xfb, 0xa1, 0xca, 0x1c, 0xc1, 0x75,
+  0x9b, 0x62, 0x7d, 0x06, 0xd9, 0x9e, 0x22, 0x82, 0x24, 0x4c, 0xf2, 0x6f,
+  0x2e, 0x4c, 0x5d, 0x97, 0x92, 0xaf, 0x6d, 0x2b, 0x3d, 0xda, 0xea, 0x88,
+  0x1f, 0x45, 0x5f, 0x5d, 0xe6, 0x9a, 0xd2, 0xcd, 0xee, 0x28, 0xb8, 0x9c,
+  0xbc, 0x80, 0x60, 0x50, 0x10, 0xe1, 0x1f, 0x19, 0xbd, 0xd1, 0xf6, 0x75,
+  0x12, 0x16, 0xb7, 0x1c, 0x21, 0x4b, 0xb7, 0x78, 0x03, 0x2a, 0xd6, 0x62,
+  0x12, 0x64, 0x7a, 0x62, 0x2f, 0x48, 0x0a, 0x5f
 };
 
 static const uint8_t e_1024[] = { /* key component e, 4 bytes */
@@ -44,44 +44,62 @@ static const uint8_t e_1024[] = { /* key component e, 4 bytes */
 };
 
 static const uint8_t d_1024[] = { /* key component d, 128 bytes */
-  0x53, 0x7a, 0x6a, 0xca, 0xf9, 0x00, 0xf8, 0xb1, 0xf5, 0x65, 0xc7, 0x53,
-  0x46, 0x9e, 0x58, 0x3c, 0x67, 0x76, 0x23, 0xb5, 0x49, 0xf1, 0xd9, 0xf1,
-  0xaa, 0x0c, 0x7f, 0xde, 0xc2, 0x2e, 0x8d, 0x89, 0xd6, 0x16, 0x6c, 0xf4,
-  0x2c, 0xd5, 0x75, 0xb3, 0xac, 0x38, 0x44, 0x77, 0x77, 0x32, 0x19, 0x03,
-  0x09, 0x13, 0xab, 0x00, 0x2c, 0xc6, 0x7a, 0x9c, 0x1c, 0xe8, 0xd9, 0x8b,
-  0x47, 0x4e, 0x5d, 0xe7, 0x34, 0xe7, 0xd4, 0x52, 0x08, 0x15, 0x51, 0xfa,
-  0xd7, 0xa0, 0x32, 0xda, 0x0f, 0xd0, 0x76, 0x81, 0x04, 0x96, 0xb1, 0xd0,
-  0x12, 0xa3, 0xd2, 0x0d, 0x75, 0xe5, 0xa1, 0x32, 0xfb, 0xaf, 0xaa, 0x9b,
-  0x2d, 0x77, 0x35, 0x28, 0x38, 0xb0, 0xae, 0xc1, 0x0c, 0x35, 0xfa, 0xf3,
-  0x6a, 0x12, 0xd6, 0x2d, 0xb3, 0x9e, 0xa7, 0x1a, 0xca, 0x32, 0x81, 0xd3,
-  0xe9, 0xf8, 0x94, 0x12, 0x6f, 0xf8, 0x68, 0xc1
+  0x26, 0x2f, 0x56, 0x72, 0xf8, 0x04, 0x30, 0x36, 0xe4, 0x52, 0xa9, 0xac,
+  0x0f, 0xbf, 0x29, 0xc5, 0x4e, 0xe4, 0x08, 0x06, 0xd6, 0xbe, 0x91, 0x35,
+  0xdb, 0x10, 0x95, 0xa5, 0x2f, 0x2a, 0xca, 0x06, 0x59, 0x0a, 0x55, 0xbd,
+  0x1d, 0x8d, 0xf3, 0x67, 0xeb, 0x30, 0x96, 0x16, 0x6a, 0xd1, 0xd8, 0x0e,
+  0x77, 0x9e, 0x1e, 0x06, 0x87, 0x4c, 0x14, 0x5d, 0x14, 0xc6, 0x26, 0x0f,
+  0x33, 0x9e, 0xf3, 0xca, 0x24, 0xf7, 0x29, 0xe3, 0x9c, 0xe7, 0x73, 0xb6,
+  0x86, 0x40, 0x59, 0x83, 0x8a, 0xfb, 0xe5, 0xe6, 0x6f, 0xd4, 0x91, 0xba,
+  0x84, 0x4f, 0xa4, 0x81, 0xe8, 0x9c, 0x82, 0x38, 0x22, 0xb3, 0x61, 0xad,
+  0x51, 0xb6, 0x7d, 0xd8, 0x14, 0xc9, 0x1f, 0xff, 0x73, 0x20, 0xce, 0xb5,
+  0x88, 0x84, 0x5b, 0xfe, 0x50, 0xd1, 0xff, 0x23, 0x99, 0x52, 0x8f, 0x32,
+  0x5c, 0x0a, 0xb3, 0x78, 0x9a, 0x02, 0x3e, 0x01
 };
 
 static const uint8_t p_1024[] = { /* key component p, 64 bytes */
-  0xd6, 0x82, 0x31, 0xcd, 0x9e, 0xde, 0xc0, 0xef, 0x83, 0xd5, 0x6b, 0xc7,
-  0x80, 0x9b, 0x63, 0x02, 0xb3, 0xa6, 0x47, 0x87, 0x5c, 0x66, 0xa9, 0xae,
-  0x35, 0x44, 0x60, 0xf4, 0x68, 0xe4, 0x49, 0x44, 0x36, 0x82, 0x64, 0xa4,
-  0xe4, 0xae, 0x04, 0xf0, 0x5c, 0x0c, 0x53, 0x7b, 0x32, 0x56, 0x6a, 0x79,
-  0x17, 0xba, 0xca, 0x80, 0x03, 0x9e, 0x39, 0xc3, 0xe3, 0x8e, 0xd6, 0x95,
-  0xdf, 0xf5, 0xc4, 0xcb
+  0xb7, 0x13, 0x35, 0xad, 0x26, 0x39, 0x64, 0x57, 0x5f, 0xee, 0xa3, 0xb2,
+  0xc6, 0xdf, 0xeb, 0x90, 0xb1, 0xeb, 0x09, 0x87, 0xb2, 0xba, 0xe9, 0xb5,
+  0x78, 0x8f, 0xf6, 0x02, 0x9f, 0xc1, 0xd9, 0x31, 0xeb, 0xde, 0xc4, 0xcf,
+  0x2b, 0xcf, 0x0c, 0xbf, 0x31, 0xc0, 0xbd, 0xb4, 0x3b, 0xec, 0x41, 0x15,
+  0xe8, 0x63, 0xf3, 0xae, 0x8e, 0xfd, 0xff, 0x27, 0x38, 0xf3, 0xf8, 0xee,
+  0x29, 0x8e, 0x3e, 0x81
 };
 
 static const uint8_t q_1024[] = { /* key component q, 64 bytes */
-  0xf7, 0x77, 0x1c, 0x44, 0x7d, 0x4e, 0xe1, 0x95, 0xda, 0x01, 0xef, 0x60,
-  0xb4, 0x16, 0x5a, 0x10, 0xd7, 0xf3, 0x01, 0x78, 0xeb, 0x63, 0xea, 0x6c,
-  0xc4, 0xa8, 0x5c, 0xa0, 0xec, 0x20, 0x9d, 0xcf, 0x5a, 0xbf, 0x01, 0x4a,
-  0xa7, 0x50, 0x53, 0xf3, 0x3f, 0x66, 0x3a, 0x5f, 0x40, 0x31, 0xf7, 0xcd,
-  0x73, 0x50, 0xae, 0x2a, 0x99, 0xc3, 0x1a, 0xe3, 0x98, 0x58, 0xcf, 0x15,
-  0x0a, 0x55, 0x46, 0xaf
+  0xc3, 0xde, 0x05, 0x3c, 0xc0, 0x3f, 0x0c, 0x79, 0x62, 0xea, 0x61, 0xc5,
+  0xc8, 0x01, 0xd1, 0x11, 0x22, 0xeb, 0xa4, 0xd5, 0x59, 0xcb, 0xdf, 0xa4,
+  0x0e, 0xce, 0x7f, 0x4d, 0xa0, 0xf1, 0x74, 0xd4, 0x32, 0xc9, 0x72, 0xb7,
+  0x1b, 0x37, 0x6e, 0x22, 0xe7, 0xff, 0x6d, 0x73, 0x36, 0xb7, 0x29, 0xd7,
+  0x9c, 0xf1, 0xf7, 0xb1, 0x25, 0x38, 0x7f, 0x3c, 0xc0, 0x6f, 0x47, 0xc6,
+  0x6b, 0xc3, 0x98, 0xdf
+};
+
+static const uint8_t dP_1024[] = { /* key component dP, 64 bytes */
+  0x27, 0x16, 0x0a, 0xd7, 0xb4, 0xd9, 0x7b, 0xfa, 0xcb, 0x98, 0x7f, 0x8a,
+  0xa3, 0xbb, 0x1a, 0xe8, 0x01, 0x94, 0x54, 0xac, 0x8c, 0x14, 0x2b, 0xe1,
+  0x7a, 0xa4, 0x01, 0xb9, 0xfd, 0xb1, 0xbd, 0x55, 0x53, 0x2e, 0x74, 0x86,
+  0x66, 0xac, 0x05, 0xe4, 0xac, 0x12, 0xa2, 0x6d, 0xe0, 0x7d, 0x48, 0x48,
+  0x0d, 0x1d, 0x89, 0xe1, 0x32, 0xd6, 0x37, 0xab, 0x80, 0x15, 0x56, 0x88,
+  0x42, 0x87, 0x04, 0x01
+};
+
+static const uint8_t dQ_1024[] = { /* key component dQ, 64 bytes */
+  0x11, 0xd4, 0x8e, 0x49, 0x7f, 0x7e, 0xbd, 0xd5, 0xf7, 0x09, 0x3b, 0x29,
+  0x54, 0x11, 0xc6, 0x44, 0x77, 0x17, 0x58, 0x84, 0x0b, 0x8e, 0xa1, 0xa7,
+  0x3f, 0xa9, 0xd0, 0xb0, 0xf2, 0x6b, 0xc8, 0xa4, 0xe0, 0x92, 0xb2, 0x1c,
+  0xb5, 0x1f, 0x90, 0xa9, 0x20, 0xd1, 0x81, 0xd7, 0x31, 0x2d, 0xef, 0x63,
+  0x2f, 0x68, 0x5f, 0x92, 0x02, 0xbf, 0x67, 0xe5, 0xd1, 0xe6, 0xcf, 0x73,
+  0xe2, 0xaf, 0x85, 0xa5
 };
 
 static const uint8_t u_1024[] = { /* key component u, 64 bytes */
-  0x0e, 0x5f, 0xfa, 0x8f, 0xc2, 0x63, 0x09, 0xa1, 0x88, 0xd8, 0xd7, 0x75,
-  0x34, 0xa9, 0x21, 0xee, 0xab, 0xd9, 0xe2, 0x59, 0x17, 0xe4, 0x47, 0xd8,
-  0xa0, 0x7e, 0x71, 0x6e, 0x8a, 0x47, 0x4e, 0x49, 0xe8, 0x16, 0x3a, 0x0e,
-  0xdb, 0x24, 0xbb, 0x35, 0x6a, 0x69, 0xef, 0xa2, 0x50, 0x84, 0x1e, 0x8f,
-  0xbb, 0xec, 0xdb, 0xec, 0x94, 0x94, 0x58, 0xc0, 0xe4, 0x2a, 0xa8, 0x24,
-  0x8b, 0x15, 0xdb, 0xb9
+  0x7f, 0x65, 0xc7, 0x09, 0xe5, 0x00, 0x47, 0xb8, 0x13, 0xf4, 0xfd, 0xf9,
+  0x57, 0x76, 0x68, 0x46, 0xe6, 0x50, 0xb7, 0x31, 0x33, 0x22, 0x88, 0x4e,
+  0xd1, 0x96, 0xcf, 0xf7, 0x2f, 0x6b, 0x7a, 0x4b, 0x8c, 0x55, 0x0e, 0x74,
+  0x3c, 0xd5, 0x16, 0x1f, 0xec, 0x26, 0xab, 0xe7, 0x75, 0x8d, 0xee, 0xa4,
+  0x95, 0x49, 0x99, 0xe1, 0x0c, 0x6b, 0x27, 0x04, 0x9a, 0x60, 0x86, 0xad,
+  0xa7, 0x61, 0x41, 0xf5
 };
 
 static const uint8_t m_1024[] = { /* message to be signed, 128 bytes */
@@ -99,73 +117,73 @@ static const uint8_t m_1024[] = { /* message to be signed, 128 bytes */
 };
 
 static const uint8_t s_1024[] = { /* signed message, 128 bytes */
-  0xbf, 0x03, 0xe7, 0x1a, 0x8f, 0x16, 0xe5, 0xad, 0xe8, 0x1b, 0xcc, 0xcf,
-  0x9f, 0x3a, 0x4f, 0xc6, 0xd4, 0x14, 0xca, 0xae, 0x37, 0x9b, 0xc4, 0x4b,
-  0x40, 0x13, 0xbf, 0x94, 0x9a, 0xea, 0xc1, 0x6c, 0x6c, 0x1a, 0xad, 0xeb,
-  0xa2, 0x8e, 0xd7, 0xd6, 0xe8, 0x19, 0xfb, 0xf5, 0xd3, 0xe4, 0xdd, 0xd0,
-  0xa5, 0xd4, 0x41, 0x44, 0xb6, 0xda, 0xff, 0x9b, 0x42, 0x19, 0xf7, 0x30,
-  0x0e, 0x2e, 0x0e, 0x31, 0x6a, 0xf0, 0xc2, 0xfc, 0xa0, 0x8f, 0x23, 0x17,
-  0xc2, 0x69, 0xf2, 0xe7, 0x11, 0x33, 0x8f, 0x37, 0x14, 0x5f, 0xdf, 0xb0,
-  0x54, 0xdc, 0x36, 0x77, 0xc3, 0xc9, 0x64, 0x2a, 0x87, 0xd0, 0xa7, 0x78,
-  0xd5, 0x5b, 0xdf, 0xd2, 0x68, 0x96, 0xaa, 0xb2, 0x6b, 0xfb, 0x99, 0x20,
-  0x82, 0xa6, 0xfb, 0xcd, 0x03, 0x1a, 0xf3, 0x60, 0xc1, 0x5b, 0x5e, 0x92,
-  0x57, 0xc6, 0x08, 0x92, 0x74, 0x40, 0x62, 0x6c
+  0x3b, 0x09, 0xcc, 0x3d, 0x2f, 0xa1, 0x68, 0x1c, 0xa9, 0x29, 0x1b, 0xb7,
+  0xcf, 0xc9, 0xe7, 0xb4, 0xfd, 0x3e, 0x5a, 0x22, 0x1c, 0x29, 0xdf, 0x4a,
+  0x32, 0xcf, 0xa5, 0xae, 0x30, 0xd4, 0xee, 0x8f, 0x3a, 0xc8, 0xc1, 0xee,
+  0x79, 0x40, 0xb2, 0xbf, 0xc7, 0x12, 0x82, 0x73, 0x3c, 0x6b, 0x8a, 0xd1,
+  0xa4, 0x4a, 0x6d, 0x60, 0x9f, 0x00, 0xb4, 0x51, 0x8b, 0x6c, 0xcd, 0xae,
+  0xad, 0xf4, 0x0a, 0x48, 0xd5, 0xb9, 0x4b, 0x9e, 0xca, 0x77, 0x10, 0xc2,
+  0x9b, 0x26, 0x8c, 0x65, 0x17, 0x96, 0xd0, 0xc7, 0x5e, 0x55, 0x20, 0x17,
+  0x06, 0x74, 0x2d, 0x94, 0xe0, 0xfc, 0x09, 0xa2, 0xb1, 0x94, 0xe4, 0x83,
+  0x0d, 0x8d, 0x9e, 0x26, 0x0a, 0x25, 0x93, 0xfb, 0xef, 0x4f, 0xb3, 0x0e,
+  0x7a, 0x9b, 0x2f, 0x17, 0x94, 0xd8, 0xca, 0x64, 0x1e, 0xa6, 0x2e, 0xc9,
+  0xf3, 0x54, 0x87, 0x34, 0xed, 0xf7, 0xa5, 0x00
 };
 
 /* 2048-bit RSA private key (PKCS #8)
 -----BEGIN PRIVATE KEY-----
-MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCcvEpsSs0CKPeQ
-fsLHD1D/uPkzHNKNis4K79saXJw5MTqobxWd8gwfD4DtDsDAMneuXbqdUxldo6w7
-b4FQ7BTe0Prw0KKbplArP4hxS+ncG490ftZMVooeyY1aL5pdq5BnqyJiaCCmWlXU
-/swsJIhOgx2zYZszJZSMlggR6tKQunID/uwLnUBOWdJTQDFQUfMCy+u3qfCl3ate
-a5ODOpqOaqPIEC3OcD1cBVteKG1H629i8PyteLaJwx7BD2XV7jpV4+qNf6ywUx/f
-zTeEIwcUZg/X+iR6wLAbITGz7k7pcRx/k2yRR/9+yg3VFEGt4Tr4yGTUGSDK+ZR9
-/woz2nE7AgMBAAECggEAcuXJPQe8r8eubDuwt9Jvk3dbH3ASnfZSQ0w/91xKndaL
-5KvCUg39esuXvLBi9sJIYAeP5QLlBnMUsGF2kAbw6cKTIvQfMDFEdd/WOw/meRev
-GzxcBowuJpGkUKey5tX9PzICO9ePj8OLRmAe9oE1dzDBFh4Icv8qncDiW5gkEjmk
-ydd8N4Sa5PymquHAR8Mzo3CA9fb2aJELOEoB9w2S2RCa37Ak7NK51Nhuh/DleQqE
-j3ORoEbjzTq+GLG8eKFQkwClqQ450pt1+Har8maRDHuoF1gUq0vK+JvFsMHtxn4l
-jJA/PxWj209Ym77+CzPEF4n+v70qNR03D+UN55Vv4QKBgQC3iCUx2RE2AD1ebwkz
-DVRNKNeQvfIJXMPeRCwQ3N2f1sjV9x7xMxPNcx7SVuhoj4HrBzb3SwpgHbX9Qf/8
-4TqSHS8F2bTwanW42axYJ60IJBug0HfRbdcFYz2Hh4tM5KHWon9BWy+4XuWJKtBZ
-9Dkorpies3c5Y7M2cWrtOtLxkQKBgQDan4H8qRplVyU9yE01BUMf87DRrsBTb78V
-Zg5pYaofF4yN0u4Gk1Ea6ouvx+xWJti8oiXwoBBPNOG+dRdizgSAPVi7fikcNuqu
-9xkz2FjiL3p3taU/awM+FpGLcjK/5ldkB7VWYawikMsIO2l6XF7ViubJgHpKrEnC
-v2eHuiEQCwKBgDQGwhR5Zimas8rbSw5Pzv/4ffMoBT6mL1gIlz1IfwLajiApZ3oU
-cp6g7bHOtR8+3yNS7j/3478PbRGX7gsvhbz5zOSprGMiqrB19CchSCmwoqxZrD2Q
-F44NbdnHkLOBdGc1tUE/qi1nqUXS/zEgzDs+E0GZukhofNsIF7mcHUQhAoGBALD3
-0Ubus7k4s6KxUx4KJm3k20rAhFqF6E2wERZowkbszw+2oIqeEVcSaQRfdwW96E+5
-ibCgQNN84QdEzStjzOzpu7v5wdle8tWym6oGBN0CxcXFOgB95WAK8MHKLR59nFwS
-iU1lPuuz/UWqohU0VGfTSkHuSA/OKt8EBRAvMLhFAoGAdMNlyleBbjleJ2tc3C53
-51SquntS88Y/Owfx6uuyxhXaVkE2XdCl/BemooizyF0WdVtMhff2jlVMdsAbDqOd
-rVYdgfOHjEhpMa3Z1afzlAC06RLsl+gN2B76Mv/mnv0izdS4T/AcUfuUvPstyw++
-AeFZS9WhiXZXniFPQpskWic=
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCzvgb90hKxeDJy
+zeWz/F4JGZ3Acl1i3url3VPXHyoldyhuNC+8jf4iM7TGBYGLH+sYkBXWu9GD0erl
+KBMJMTBO8OdXulSAJh8r1Z8qNPSVNguvNgGQlRDGc7tZJ6gWFlzM2g5flED24bN9
+6Ir9O1cZi7xMc0Nzkn9Rms5IwPW8OB4IZZlbFC6Ih9vUSp06Tm3rQ/eQJkhLFbzM
+ejc9OH1LSpYtji44ohmy/jPJsmSlzwK5JSchZqbxl/msVw1t/nZS3loqKUMvzn9F
+iARLiaIrUKNCmSmL8HqEt2qKt0ESHG0vX07h5W5iHIJOuKhqcX3li8nFcwsOV3AB
+RsCRgeppAgMBAAECggEANEeTVQRjN4dUdRv6Me23lEIFJlKdYwKfpBhKKIoCAj+0
+XMmFEPzj7CLJ88bqNQMlqFFQaNLcT9Eg12Jelw/dkzhysYuaxGNSMbfCwc4BTd0Y
+bO/yaJFS/cXvujDUrQf4GgVapOZENwrS4E5hDuLRpLaGIF5uQhFcQuoaEgM99m6H
+TzOIhtu3DjdbfSsmkGVQ7xUVFcvaCrMVoq06dvUH4HpYTKeeqgcVv++XjIe83Nzv
++oN5U2oFOzrYpGGHN6jrekmmbEaxy8UHOySC6Y+UyRrPEy9q1ZgkkC9VCrM7E28/
+4PETw8MI7uNoosuFXofctKjtRvC5Sn9zW3dyv9NkAQKBgQDSkdDy4+xN2kA7gdry
+4eLKUzKRNSbnoPrCu2TENUR8oTjbJ52LQEbGa9HIKaM33701hJsc34C6adJgoY9c
+PoBcJgxOI7N40A/rI3c8krKS5X/ViBY3TzJsP3LaBKDdfioaTDVTjhYD6v2eu7Lt
+4eIqa8sVA4PhLSVGRW53ZSYjwQKBgQDahY6cR8WgPseQJTkCbKyfKCSuz6nioZpC
+stkpKhJepzE6AKZTLLWvNIPNT/khl40aby5seLNkY3Tb9cYBX2iShGv4cguPMiAl
+hb7Uljz19i6YaX74gkTjsYpv44ddLSZp+/FTOl0C0I8WocQpb8B2d4BgvfxgHrHb
+KCHnyihQqQKBgQC7PKPixt7hnzdMcrxhCpDiPbaSPgQZJSC1NXJ1sbPzalynKwPA
+xefpGgiRBs02qsGRLBfNRcQuflhuSlqyuHTk+4Qnm0FEJSZyfLfS6dLWIjJYikjO
+56I7dPPIfyMXsM75UVh9srNKypK4qciCFEBKXk1XoyeKe91QLf77NbsDQQKBgDnY
+CLwNs56Lf8AEWmbt5XPr6GntxoabSH5HYXyoClzL3RgBfAWgXCeYuxrqBISD3XIV
+5DAKc1IrkY94K4XJf6DpNLt7VNv+5MuJ783ORyzEkej+ZAHcWef74y1jCT386aI8
+ctEZLe3Ez1uqToa5cjTpxS3WnKvE9EeTBAabWLihAoGBAKft+PG+j+QhZeHSGxRz
+mY6AQHH4z7IU94fmXiT2kTsG8/svhPNfsmVt7UCSJbCaYsrcuR2NonVV8wn/U793
+LcnLAV+WObeduMTBCasJw8IniFwFhhfkxOtmlevExE1I3ENwkRlJ7NdROky4pnd5
+LGmN2EOOlFijEGxBfw+Wb1rQ
 -----END PRIVATE KEY-----
 */
 
 static const uint8_t n_2048[] = { /* key component n, 256 bytes */
-  0x9c, 0xbc, 0x4a, 0x6c, 0x4a, 0xcd, 0x02, 0x28, 0xf7, 0x90, 0x7e, 0xc2,
-  0xc7, 0x0f, 0x50, 0xff, 0xb8, 0xf9, 0x33, 0x1c, 0xd2, 0x8d, 0x8a, 0xce,
-  0x0a, 0xef, 0xdb, 0x1a, 0x5c, 0x9c, 0x39, 0x31, 0x3a, 0xa8, 0x6f, 0x15,
-  0x9d, 0xf2, 0x0c, 0x1f, 0x0f, 0x80, 0xed, 0x0e, 0xc0, 0xc0, 0x32, 0x77,
-  0xae, 0x5d, 0xba, 0x9d, 0x53, 0x19, 0x5d, 0xa3, 0xac, 0x3b, 0x6f, 0x81,
-  0x50, 0xec, 0x14, 0xde, 0xd0, 0xfa, 0xf0, 0xd0, 0xa2, 0x9b, 0xa6, 0x50,
-  0x2b, 0x3f, 0x88, 0x71, 0x4b, 0xe9, 0xdc, 0x1b, 0x8f, 0x74, 0x7e, 0xd6,
-  0x4c, 0x56, 0x8a, 0x1e, 0xc9, 0x8d, 0x5a, 0x2f, 0x9a, 0x5d, 0xab, 0x90,
-  0x67, 0xab, 0x22, 0x62, 0x68, 0x20, 0xa6, 0x5a, 0x55, 0xd4, 0xfe, 0xcc,
-  0x2c, 0x24, 0x88, 0x4e, 0x83, 0x1d, 0xb3, 0x61, 0x9b, 0x33, 0x25, 0x94,
-  0x8c, 0x96, 0x08, 0x11, 0xea, 0xd2, 0x90, 0xba, 0x72, 0x03, 0xfe, 0xec,
-  0x0b, 0x9d, 0x40, 0x4e, 0x59, 0xd2, 0x53, 0x40, 0x31, 0x50, 0x51, 0xf3,
-  0x02, 0xcb, 0xeb, 0xb7, 0xa9, 0xf0, 0xa5, 0xdd, 0xab, 0x5e, 0x6b, 0x93,
-  0x83, 0x3a, 0x9a, 0x8e, 0x6a, 0xa3, 0xc8, 0x10, 0x2d, 0xce, 0x70, 0x3d,
-  0x5c, 0x05, 0x5b, 0x5e, 0x28, 0x6d, 0x47, 0xeb, 0x6f, 0x62, 0xf0, 0xfc,
-  0xad, 0x78, 0xb6, 0x89, 0xc3, 0x1e, 0xc1, 0x0f, 0x65, 0xd5, 0xee, 0x3a,
-  0x55, 0xe3, 0xea, 0x8d, 0x7f, 0xac, 0xb0, 0x53, 0x1f, 0xdf, 0xcd, 0x37,
-  0x84, 0x23, 0x07, 0x14, 0x66, 0x0f, 0xd7, 0xfa, 0x24, 0x7a, 0xc0, 0xb0,
-  0x1b, 0x21, 0x31, 0xb3, 0xee, 0x4e, 0xe9, 0x71, 0x1c, 0x7f, 0x93, 0x6c,
-  0x91, 0x47, 0xff, 0x7e, 0xca, 0x0d, 0xd5, 0x14, 0x41, 0xad, 0xe1, 0x3a,
-  0xf8, 0xc8, 0x64, 0xd4, 0x19, 0x20, 0xca, 0xf9, 0x94, 0x7d, 0xff, 0x0a,
-  0x33, 0xda, 0x71, 0x3b
+  0xb3, 0xbe, 0x06, 0xfd, 0xd2, 0x12, 0xb1, 0x78, 0x32, 0x72, 0xcd, 0xe5,
+  0xb3, 0xfc, 0x5e, 0x09, 0x19, 0x9d, 0xc0, 0x72, 0x5d, 0x62, 0xde, 0xea,
+  0xe5, 0xdd, 0x53, 0xd7, 0x1f, 0x2a, 0x25, 0x77, 0x28, 0x6e, 0x34, 0x2f,
+  0xbc, 0x8d, 0xfe, 0x22, 0x33, 0xb4, 0xc6, 0x05, 0x81, 0x8b, 0x1f, 0xeb,
+  0x18, 0x90, 0x15, 0xd6, 0xbb, 0xd1, 0x83, 0xd1, 0xea, 0xe5, 0x28, 0x13,
+  0x09, 0x31, 0x30, 0x4e, 0xf0, 0xe7, 0x57, 0xba, 0x54, 0x80, 0x26, 0x1f,
+  0x2b, 0xd5, 0x9f, 0x2a, 0x34, 0xf4, 0x95, 0x36, 0x0b, 0xaf, 0x36, 0x01,
+  0x90, 0x95, 0x10, 0xc6, 0x73, 0xbb, 0x59, 0x27, 0xa8, 0x16, 0x16, 0x5c,
+  0xcc, 0xda, 0x0e, 0x5f, 0x94, 0x40, 0xf6, 0xe1, 0xb3, 0x7d, 0xe8, 0x8a,
+  0xfd, 0x3b, 0x57, 0x19, 0x8b, 0xbc, 0x4c, 0x73, 0x43, 0x73, 0x92, 0x7f,
+  0x51, 0x9a, 0xce, 0x48, 0xc0, 0xf5, 0xbc, 0x38, 0x1e, 0x08, 0x65, 0x99,
+  0x5b, 0x14, 0x2e, 0x88, 0x87, 0xdb, 0xd4, 0x4a, 0x9d, 0x3a, 0x4e, 0x6d,
+  0xeb, 0x43, 0xf7, 0x90, 0x26, 0x48, 0x4b, 0x15, 0xbc, 0xcc, 0x7a, 0x37,
+  0x3d, 0x38, 0x7d, 0x4b, 0x4a, 0x96, 0x2d, 0x8e, 0x2e, 0x38, 0xa2, 0x19,
+  0xb2, 0xfe, 0x33, 0xc9, 0xb2, 0x64, 0xa5, 0xcf, 0x02, 0xb9, 0x25, 0x27,
+  0x21, 0x66, 0xa6, 0xf1, 0x97, 0xf9, 0xac, 0x57, 0x0d, 0x6d, 0xfe, 0x76,
+  0x52, 0xde, 0x5a, 0x2a, 0x29, 0x43, 0x2f, 0xce, 0x7f, 0x45, 0x88, 0x04,
+  0x4b, 0x89, 0xa2, 0x2b, 0x50, 0xa3, 0x42, 0x99, 0x29, 0x8b, 0xf0, 0x7a,
+  0x84, 0xb7, 0x6a, 0x8a, 0xb7, 0x41, 0x12, 0x1c, 0x6d, 0x2f, 0x5f, 0x4e,
+  0xe1, 0xe5, 0x6e, 0x62, 0x1c, 0x82, 0x4e, 0xb8, 0xa8, 0x6a, 0x71, 0x7d,
+  0xe5, 0x8b, 0xc9, 0xc5, 0x73, 0x0b, 0x0e, 0x57, 0x70, 0x01, 0x46, 0xc0,
+  0x91, 0x81, 0xea, 0x69
 };
 
 static const uint8_t e_2048[] = { /* key component e, 4 bytes */
@@ -173,70 +191,98 @@ static const uint8_t e_2048[] = { /* key component e, 4 bytes */
 };
 
 static const uint8_t d_2048[] = { /* key component d, 256 bytes */
-  0x72, 0xe5, 0xc9, 0x3d, 0x07, 0xbc, 0xaf, 0xc7, 0xae, 0x6c, 0x3b, 0xb0,
-  0xb7, 0xd2, 0x6f, 0x93, 0x77, 0x5b, 0x1f, 0x70, 0x12, 0x9d, 0xf6, 0x52,
-  0x43, 0x4c, 0x3f, 0xf7, 0x5c, 0x4a, 0x9d, 0xd6, 0x8b, 0xe4, 0xab, 0xc2,
-  0x52, 0x0d, 0xfd, 0x7a, 0xcb, 0x97, 0xbc, 0xb0, 0x62, 0xf6, 0xc2, 0x48,
-  0x60, 0x07, 0x8f, 0xe5, 0x02, 0xe5, 0x06, 0x73, 0x14, 0xb0, 0x61, 0x76,
-  0x90, 0x06, 0xf0, 0xe9, 0xc2, 0x93, 0x22, 0xf4, 0x1f, 0x30, 0x31, 0x44,
-  0x75, 0xdf, 0xd6, 0x3b, 0x0f, 0xe6, 0x79, 0x17, 0xaf, 0x1b, 0x3c, 0x5c,
-  0x06, 0x8c, 0x2e, 0x26, 0x91, 0xa4, 0x50, 0xa7, 0xb2, 0xe6, 0xd5, 0xfd,
-  0x3f, 0x32, 0x02, 0x3b, 0xd7, 0x8f, 0x8f, 0xc3, 0x8b, 0x46, 0x60, 0x1e,
-  0xf6, 0x81, 0x35, 0x77, 0x30, 0xc1, 0x16, 0x1e, 0x08, 0x72, 0xff, 0x2a,
-  0x9d, 0xc0, 0xe2, 0x5b, 0x98, 0x24, 0x12, 0x39, 0xa4, 0xc9, 0xd7, 0x7c,
-  0x37, 0x84, 0x9a, 0xe4, 0xfc, 0xa6, 0xaa, 0xe1, 0xc0, 0x47, 0xc3, 0x33,
-  0xa3, 0x70, 0x80, 0xf5, 0xf6, 0xf6, 0x68, 0x91, 0x0b, 0x38, 0x4a, 0x01,
-  0xf7, 0x0d, 0x92, 0xd9, 0x10, 0x9a, 0xdf, 0xb0, 0x24, 0xec, 0xd2, 0xb9,
-  0xd4, 0xd8, 0x6e, 0x87, 0xf0, 0xe5, 0x79, 0x0a, 0x84, 0x8f, 0x73, 0x91,
-  0xa0, 0x46, 0xe3, 0xcd, 0x3a, 0xbe, 0x18, 0xb1, 0xbc, 0x78, 0xa1, 0x50,
-  0x93, 0x00, 0xa5, 0xa9, 0x0e, 0x39, 0xd2, 0x9b, 0x75, 0xf8, 0x76, 0xab,
-  0xf2, 0x66, 0x91, 0x0c, 0x7b, 0xa8, 0x17, 0x58, 0x14, 0xab, 0x4b, 0xca,
-  0xf8, 0x9b, 0xc5, 0xb0, 0xc1, 0xed, 0xc6, 0x7e, 0x25, 0x8c, 0x90, 0x3f,
-  0x3f, 0x15, 0xa3, 0xdb, 0x4f, 0x58, 0x9b, 0xbe, 0xfe, 0x0b, 0x33, 0xc4,
-  0x17, 0x89, 0xfe, 0xbf, 0xbd, 0x2a, 0x35, 0x1d, 0x37, 0x0f, 0xe5, 0x0d,
-  0xe7, 0x95, 0x6f, 0xe1
+  0x34, 0x47, 0x93, 0x55, 0x04, 0x63, 0x37, 0x87, 0x54, 0x75, 0x1b, 0xfa,
+  0x31, 0xed, 0xb7, 0x94, 0x42, 0x05, 0x26, 0x52, 0x9d, 0x63, 0x02, 0x9f,
+  0xa4, 0x18, 0x4a, 0x28, 0x8a, 0x02, 0x02, 0x3f, 0xb4, 0x5c, 0xc9, 0x85,
+  0x10, 0xfc, 0xe3, 0xec, 0x22, 0xc9, 0xf3, 0xc6, 0xea, 0x35, 0x03, 0x25,
+  0xa8, 0x51, 0x50, 0x68, 0xd2, 0xdc, 0x4f, 0xd1, 0x20, 0xd7, 0x62, 0x5e,
+  0x97, 0x0f, 0xdd, 0x93, 0x38, 0x72, 0xb1, 0x8b, 0x9a, 0xc4, 0x63, 0x52,
+  0x31, 0xb7, 0xc2, 0xc1, 0xce, 0x01, 0x4d, 0xdd, 0x18, 0x6c, 0xef, 0xf2,
+  0x68, 0x91, 0x52, 0xfd, 0xc5, 0xef, 0xba, 0x30, 0xd4, 0xad, 0x07, 0xf8,
+  0x1a, 0x05, 0x5a, 0xa4, 0xe6, 0x44, 0x37, 0x0a, 0xd2, 0xe0, 0x4e, 0x61,
+  0x0e, 0xe2, 0xd1, 0xa4, 0xb6, 0x86, 0x20, 0x5e, 0x6e, 0x42, 0x11, 0x5c,
+  0x42, 0xea, 0x1a, 0x12, 0x03, 0x3d, 0xf6, 0x6e, 0x87, 0x4f, 0x33, 0x88,
+  0x86, 0xdb, 0xb7, 0x0e, 0x37, 0x5b, 0x7d, 0x2b, 0x26, 0x90, 0x65, 0x50,
+  0xef, 0x15, 0x15, 0x15, 0xcb, 0xda, 0x0a, 0xb3, 0x15, 0xa2, 0xad, 0x3a,
+  0x76, 0xf5, 0x07, 0xe0, 0x7a, 0x58, 0x4c, 0xa7, 0x9e, 0xaa, 0x07, 0x15,
+  0xbf, 0xef, 0x97, 0x8c, 0x87, 0xbc, 0xdc, 0xdc, 0xef, 0xfa, 0x83, 0x79,
+  0x53, 0x6a, 0x05, 0x3b, 0x3a, 0xd8, 0xa4, 0x61, 0x87, 0x37, 0xa8, 0xeb,
+  0x7a, 0x49, 0xa6, 0x6c, 0x46, 0xb1, 0xcb, 0xc5, 0x07, 0x3b, 0x24, 0x82,
+  0xe9, 0x8f, 0x94, 0xc9, 0x1a, 0xcf, 0x13, 0x2f, 0x6a, 0xd5, 0x98, 0x24,
+  0x90, 0x2f, 0x55, 0x0a, 0xb3, 0x3b, 0x13, 0x6f, 0x3f, 0xe0, 0xf1, 0x13,
+  0xc3, 0xc3, 0x08, 0xee, 0xe3, 0x68, 0xa2, 0xcb, 0x85, 0x5e, 0x87, 0xdc,
+  0xb4, 0xa8, 0xed, 0x46, 0xf0, 0xb9, 0x4a, 0x7f, 0x73, 0x5b, 0x77, 0x72,
+  0xbf, 0xd3, 0x64, 0x01
 };
 
 static const uint8_t p_2048[] = { /* key component p, 128 bytes */
-  0xb7, 0x88, 0x25, 0x31, 0xd9, 0x11, 0x36, 0x00, 0x3d, 0x5e, 0x6f, 0x09,
-  0x33, 0x0d, 0x54, 0x4d, 0x28, 0xd7, 0x90, 0xbd, 0xf2, 0x09, 0x5c, 0xc3,
-  0xde, 0x44, 0x2c, 0x10, 0xdc, 0xdd, 0x9f, 0xd6, 0xc8, 0xd5, 0xf7, 0x1e,
-  0xf1, 0x33, 0x13, 0xcd, 0x73, 0x1e, 0xd2, 0x56, 0xe8, 0x68, 0x8f, 0x81,
-  0xeb, 0x07, 0x36, 0xf7, 0x4b, 0x0a, 0x60, 0x1d, 0xb5, 0xfd, 0x41, 0xff,
-  0xfc, 0xe1, 0x3a, 0x92, 0x1d, 0x2f, 0x05, 0xd9, 0xb4, 0xf0, 0x6a, 0x75,
-  0xb8, 0xd9, 0xac, 0x58, 0x27, 0xad, 0x08, 0x24, 0x1b, 0xa0, 0xd0, 0x77,
-  0xd1, 0x6d, 0xd7, 0x05, 0x63, 0x3d, 0x87, 0x87, 0x8b, 0x4c, 0xe4, 0xa1,
-  0xd6, 0xa2, 0x7f, 0x41, 0x5b, 0x2f, 0xb8, 0x5e, 0xe5, 0x89, 0x2a, 0xd0,
-  0x59, 0xf4, 0x39, 0x28, 0xae, 0x98, 0x9e, 0xb3, 0x77, 0x39, 0x63, 0xb3,
-  0x36, 0x71, 0x6a, 0xed, 0x3a, 0xd2, 0xf1, 0x91
+  0xd2, 0x91, 0xd0, 0xf2, 0xe3, 0xec, 0x4d, 0xda, 0x40, 0x3b, 0x81, 0xda,
+  0xf2, 0xe1, 0xe2, 0xca, 0x53, 0x32, 0x91, 0x35, 0x26, 0xe7, 0xa0, 0xfa,
+  0xc2, 0xbb, 0x64, 0xc4, 0x35, 0x44, 0x7c, 0xa1, 0x38, 0xdb, 0x27, 0x9d,
+  0x8b, 0x40, 0x46, 0xc6, 0x6b, 0xd1, 0xc8, 0x29, 0xa3, 0x37, 0xdf, 0xbd,
+  0x35, 0x84, 0x9b, 0x1c, 0xdf, 0x80, 0xba, 0x69, 0xd2, 0x60, 0xa1, 0x8f,
+  0x5c, 0x3e, 0x80, 0x5c, 0x26, 0x0c, 0x4e, 0x23, 0xb3, 0x78, 0xd0, 0x0f,
+  0xeb, 0x23, 0x77, 0x3c, 0x92, 0xb2, 0x92, 0xe5, 0x7f, 0xd5, 0x88, 0x16,
+  0x37, 0x4f, 0x32, 0x6c, 0x3f, 0x72, 0xda, 0x04, 0xa0, 0xdd, 0x7e, 0x2a,
+  0x1a, 0x4c, 0x35, 0x53, 0x8e, 0x16, 0x03, 0xea, 0xfd, 0x9e, 0xbb, 0xb2,
+  0xed, 0xe1, 0xe2, 0x2a, 0x6b, 0xcb, 0x15, 0x03, 0x83, 0xe1, 0x2d, 0x25,
+  0x46, 0x45, 0x6e, 0x77, 0x65, 0x26, 0x23, 0xc1
 };
 
 static const uint8_t q_2048[] = { /* key component q, 128 bytes */
-  0xda, 0x9f, 0x81, 0xfc, 0xa9, 0x1a, 0x65, 0x57, 0x25, 0x3d, 0xc8, 0x4d,
-  0x35, 0x05, 0x43, 0x1f, 0xf3, 0xb0, 0xd1, 0xae, 0xc0, 0x53, 0x6f, 0xbf,
-  0x15, 0x66, 0x0e, 0x69, 0x61, 0xaa, 0x1f, 0x17, 0x8c, 0x8d, 0xd2, 0xee,
-  0x06, 0x93, 0x51, 0x1a, 0xea, 0x8b, 0xaf, 0xc7, 0xec, 0x56, 0x26, 0xd8,
-  0xbc, 0xa2, 0x25, 0xf0, 0xa0, 0x10, 0x4f, 0x34, 0xe1, 0xbe, 0x75, 0x17,
-  0x62, 0xce, 0x04, 0x80, 0x3d, 0x58, 0xbb, 0x7e, 0x29, 0x1c, 0x36, 0xea,
-  0xae, 0xf7, 0x19, 0x33, 0xd8, 0x58, 0xe2, 0x2f, 0x7a, 0x77, 0xb5, 0xa5,
-  0x3f, 0x6b, 0x03, 0x3e, 0x16, 0x91, 0x8b, 0x72, 0x32, 0xbf, 0xe6, 0x57,
-  0x64, 0x07, 0xb5, 0x56, 0x61, 0xac, 0x22, 0x90, 0xcb, 0x08, 0x3b, 0x69,
-  0x7a, 0x5c, 0x5e, 0xd5, 0x8a, 0xe6, 0xc9, 0x80, 0x7a, 0x4a, 0xac, 0x49,
-  0xc2, 0xbf, 0x67, 0x87, 0xba, 0x21, 0x10, 0x0b
+  0xda, 0x85, 0x8e, 0x9c, 0x47, 0xc5, 0xa0, 0x3e, 0xc7, 0x90, 0x25, 0x39,
+  0x02, 0x6c, 0xac, 0x9f, 0x28, 0x24, 0xae, 0xcf, 0xa9, 0xe2, 0xa1, 0x9a,
+  0x42, 0xb2, 0xd9, 0x29, 0x2a, 0x12, 0x5e, 0xa7, 0x31, 0x3a, 0x00, 0xa6,
+  0x53, 0x2c, 0xb5, 0xaf, 0x34, 0x83, 0xcd, 0x4f, 0xf9, 0x21, 0x97, 0x8d,
+  0x1a, 0x6f, 0x2e, 0x6c, 0x78, 0xb3, 0x64, 0x63, 0x74, 0xdb, 0xf5, 0xc6,
+  0x01, 0x5f, 0x68, 0x92, 0x84, 0x6b, 0xf8, 0x72, 0x0b, 0x8f, 0x32, 0x20,
+  0x25, 0x85, 0xbe, 0xd4, 0x96, 0x3c, 0xf5, 0xf6, 0x2e, 0x98, 0x69, 0x7e,
+  0xf8, 0x82, 0x44, 0xe3, 0xb1, 0x8a, 0x6f, 0xe3, 0x87, 0x5d, 0x2d, 0x26,
+  0x69, 0xfb, 0xf1, 0x53, 0x3a, 0x5d, 0x02, 0xd0, 0x8f, 0x16, 0xa1, 0xc4,
+  0x29, 0x6f, 0xc0, 0x76, 0x77, 0x80, 0x60, 0xbd, 0xfc, 0x60, 0x1e, 0xb1,
+  0xdb, 0x28, 0x21, 0xe7, 0xca, 0x28, 0x50, 0xa9
+};
+
+static const uint8_t dP_2048[] = { /* key component dP, 128 bytes */
+  0xbb, 0x3c, 0xa3, 0xe2, 0xc6, 0xde, 0xe1, 0x9f, 0x37, 0x4c, 0x72, 0xbc,
+  0x61, 0x0a, 0x90, 0xe2, 0x3d, 0xb6, 0x92, 0x3e, 0x04, 0x19, 0x25, 0x20,
+  0xb5, 0x35, 0x72, 0x75, 0xb1, 0xb3, 0xf3, 0x6a, 0x5c, 0xa7, 0x2b, 0x03,
+  0xc0, 0xc5, 0xe7, 0xe9, 0x1a, 0x08, 0x91, 0x06, 0xcd, 0x36, 0xaa, 0xc1,
+  0x91, 0x2c, 0x17, 0xcd, 0x45, 0xc4, 0x2e, 0x7e, 0x58, 0x6e, 0x4a, 0x5a,
+  0xb2, 0xb8, 0x74, 0xe4, 0xfb, 0x84, 0x27, 0x9b, 0x41, 0x44, 0x25, 0x26,
+  0x72, 0x7c, 0xb7, 0xd2, 0xe9, 0xd2, 0xd6, 0x22, 0x32, 0x58, 0x8a, 0x48,
+  0xce, 0xe7, 0xa2, 0x3b, 0x74, 0xf3, 0xc8, 0x7f, 0x23, 0x17, 0xb0, 0xce,
+  0xf9, 0x51, 0x58, 0x7d, 0xb2, 0xb3, 0x4a, 0xca, 0x92, 0xb8, 0xa9, 0xc8,
+  0x82, 0x14, 0x40, 0x4a, 0x5e, 0x4d, 0x57, 0xa3, 0x27, 0x8a, 0x7b, 0xdd,
+  0x50, 0x2d, 0xfe, 0xfb, 0x35, 0xbb, 0x03, 0x41
+};
+
+static const uint8_t dQ_2048[] = { /* key component dQ, 128 bytes */
+  0x39, 0xd8, 0x08, 0xbc, 0x0d, 0xb3, 0x9e, 0x8b, 0x7f, 0xc0, 0x04, 0x5a,
+  0x66, 0xed, 0xe5, 0x73, 0xeb, 0xe8, 0x69, 0xed, 0xc6, 0x86, 0x9b, 0x48,
+  0x7e, 0x47, 0x61, 0x7c, 0xa8, 0x0a, 0x5c, 0xcb, 0xdd, 0x18, 0x01, 0x7c,
+  0x05, 0xa0, 0x5c, 0x27, 0x98, 0xbb, 0x1a, 0xea, 0x04, 0x84, 0x83, 0xdd,
+  0x72, 0x15, 0xe4, 0x30, 0x0a, 0x73, 0x52, 0x2b, 0x91, 0x8f, 0x78, 0x2b,
+  0x85, 0xc9, 0x7f, 0xa0, 0xe9, 0x34, 0xbb, 0x7b, 0x54, 0xdb, 0xfe, 0xe4,
+  0xcb, 0x89, 0xef, 0xcd, 0xce, 0x47, 0x2c, 0xc4, 0x91, 0xe8, 0xfe, 0x64,
+  0x01, 0xdc, 0x59, 0xe7, 0xfb, 0xe3, 0x2d, 0x63, 0x09, 0x3d, 0xfc, 0xe9,
+  0xa2, 0x3c, 0x72, 0xd1, 0x19, 0x2d, 0xed, 0xc4, 0xcf, 0x5b, 0xaa, 0x4e,
+  0x86, 0xb9, 0x72, 0x34, 0xe9, 0xc5, 0x2d, 0xd6, 0x9c, 0xab, 0xc4, 0xf4,
+  0x47, 0x93, 0x04, 0x06, 0x9b, 0x58, 0xb8, 0xa1
 };
 
 static const uint8_t u_2048[] = { /* key component u, 128 bytes */
-  0x4f, 0x88, 0xe0, 0xf9, 0x63, 0x9b, 0x12, 0x96, 0xf3, 0x37, 0x79, 0xed,
-  0x77, 0x1f, 0xe1, 0xcd, 0x54, 0x57, 0x20, 0xf4, 0xae, 0xc2, 0x88, 0x35,
-  0x78, 0x97, 0x96, 0xb8, 0xb4, 0xb4, 0xc5, 0xb8, 0x18, 0x38, 0x65, 0x78,
-  0x1e, 0x68, 0xbf, 0xce, 0xf8, 0x28, 0x61, 0x4f, 0xfe, 0x46, 0x84, 0x4e,
-  0xbb, 0x8d, 0x32, 0x4e, 0x1f, 0xf8, 0x34, 0x90, 0x3d, 0x99, 0x81, 0xce,
-  0x7b, 0x60, 0x83, 0x00, 0x42, 0x54, 0x89, 0x3b, 0x3c, 0x7a, 0x72, 0x69,
-  0x10, 0xd2, 0xc9, 0x87, 0x28, 0xb9, 0xce, 0x2e, 0x3f, 0xd0, 0x98, 0xda,
-  0x0a, 0x6b, 0xf9, 0xef, 0x66, 0xc9, 0x51, 0x46, 0x8a, 0xdc, 0xdf, 0x56,
-  0x68, 0xfb, 0x39, 0x3f, 0xa5, 0x36, 0x44, 0x11, 0x57, 0x7b, 0x4e, 0xc3,
-  0x3a, 0x64, 0x30, 0xb8, 0xde, 0xf5, 0x14, 0x7e, 0xab, 0xca, 0xa6, 0x27,
-  0x52, 0x7f, 0x63, 0x8b, 0xa2, 0xb7, 0x51, 0x1f
+  0xa7, 0xed, 0xf8, 0xf1, 0xbe, 0x8f, 0xe4, 0x21, 0x65, 0xe1, 0xd2, 0x1b,
+  0x14, 0x73, 0x99, 0x8e, 0x80, 0x40, 0x71, 0xf8, 0xcf, 0xb2, 0x14, 0xf7,
+  0x87, 0xe6, 0x5e, 0x24, 0xf6, 0x91, 0x3b, 0x06, 0xf3, 0xfb, 0x2f, 0x84,
+  0xf3, 0x5f, 0xb2, 0x65, 0x6d, 0xed, 0x40, 0x92, 0x25, 0xb0, 0x9a, 0x62,
+  0xca, 0xdc, 0xb9, 0x1d, 0x8d, 0xa2, 0x75, 0x55, 0xf3, 0x09, 0xff, 0x53,
+  0xbf, 0x77, 0x2d, 0xc9, 0xcb, 0x01, 0x5f, 0x96, 0x39, 0xb7, 0x9d, 0xb8,
+  0xc4, 0xc1, 0x09, 0xab, 0x09, 0xc3, 0xc2, 0x27, 0x88, 0x5c, 0x05, 0x86,
+  0x17, 0xe4, 0xc4, 0xeb, 0x66, 0x95, 0xeb, 0xc4, 0xc4, 0x4d, 0x48, 0xdc,
+  0x43, 0x70, 0x91, 0x19, 0x49, 0xec, 0xd7, 0x51, 0x3a, 0x4c, 0xb8, 0xa6,
+  0x77, 0x79, 0x2c, 0x69, 0x8d, 0xd8, 0x43, 0x8e, 0x94, 0x58, 0xa3, 0x10,
+  0x6c, 0x41, 0x7f, 0x0f, 0x96, 0x6f, 0x5a, 0xd0
 };
 
 static const uint8_t m_2048[] = { /* message to be signed, 256 bytes */
@@ -265,129 +311,129 @@ static const uint8_t m_2048[] = { /* message to be signed, 256 bytes */
 };
 
 static const uint8_t s_2048[] = { /* signed message, 256 bytes */
-  0x38, 0xcd, 0x57, 0x72, 0x74, 0x5a, 0x7c, 0xa1, 0x1b, 0x1d, 0xf6, 0xda,
-  0x12, 0xbd, 0x9c, 0x9e, 0xd7, 0xfd, 0x84, 0x48, 0xfd, 0x7c, 0x6c, 0xc4,
-  0xd0, 0x96, 0x97, 0x67, 0xef, 0x3a, 0xb2, 0x70, 0x03, 0x97, 0xa8, 0x6b,
-  0x6e, 0x87, 0xd4, 0x85, 0x5c, 0x30, 0x0a, 0xa4, 0x48, 0x19, 0xb1, 0x5c,
-  0xbd, 0xf6, 0x53, 0xaa, 0xa9, 0x2a, 0x95, 0xa9, 0xe2, 0x0d, 0x25, 0x44,
-  0x16, 0x99, 0xb7, 0x9b, 0x6d, 0x14, 0x17, 0x47, 0xf7, 0xf8, 0x66, 0x4f,
-  0x4f, 0xd7, 0x15, 0x89, 0xc8, 0x76, 0xb0, 0x32, 0x5d, 0x8e, 0x28, 0x3c,
-  0x76, 0x1e, 0x64, 0xbb, 0x66, 0xb8, 0x0b, 0x28, 0x06, 0x83, 0xb1, 0x77,
-  0xbf, 0x3d, 0x9e, 0xae, 0xdf, 0xa1, 0xc0, 0x87, 0xef, 0x7c, 0x2f, 0xae,
-  0x3b, 0x14, 0x8d, 0x6d, 0xa1, 0x0b, 0x52, 0xed, 0xd2, 0x40, 0xfa, 0x8c,
-  0x3b, 0x04, 0x00, 0x47, 0xdf, 0x7d, 0x74, 0xba, 0x47, 0x4b, 0x1b, 0x1d,
-  0x55, 0xbd, 0x37, 0x8b, 0x05, 0x2e, 0x58, 0x21, 0x97, 0x96, 0xf3, 0xfc,
-  0xf0, 0x09, 0xbb, 0xe5, 0xc8, 0x32, 0x6e, 0xdc, 0x9c, 0x3b, 0xfa, 0xdc,
-  0x8e, 0x75, 0xc5, 0x19, 0xe7, 0xf8, 0x2f, 0xa6, 0x74, 0x63, 0x1e, 0xf7,
-  0xe5, 0x72, 0x89, 0xe8, 0x3f, 0x3f, 0x19, 0xac, 0x64, 0xf8, 0xc6, 0xa3,
-  0x91, 0xe2, 0x68, 0x44, 0xbe, 0x93, 0x65, 0xa8, 0x92, 0xcb, 0xa1, 0x01,
-  0x8f, 0xad, 0xb9, 0xf8, 0xfc, 0xfd, 0x94, 0xe5, 0xa4, 0x72, 0x4c, 0x52,
-  0x80, 0x5e, 0x00, 0xa0, 0x76, 0x0b, 0x6d, 0xe1, 0x58, 0xb1, 0x39, 0x53,
-  0x1b, 0x1d, 0xa0, 0xe4, 0x1a, 0x15, 0x8e, 0xf8, 0x11, 0xbc, 0xaa, 0xbc,
-  0xdd, 0xc7, 0xe1, 0x86, 0xf8, 0x91, 0x89, 0x58, 0x83, 0x3d, 0xba, 0x56,
-  0xa3, 0x07, 0x21, 0x37, 0xf8, 0xa1, 0x1b, 0x21, 0x41, 0x70, 0x4e, 0xa5,
-  0xa4, 0x52, 0x6d, 0x66
+  0x4a, 0xf7, 0x47, 0xbb, 0xf2, 0x11, 0xd4, 0x4a, 0x03, 0xe5, 0xce, 0xbb,
+  0x07, 0xae, 0xc9, 0x74, 0xf9, 0xc5, 0x05, 0xa2, 0xbc, 0xe8, 0x8f, 0x38,
+  0x8c, 0xde, 0x7e, 0xdf, 0x29, 0xab, 0xd6, 0x0c, 0x9a, 0x3f, 0xdf, 0x4d,
+  0xd1, 0xe4, 0x19, 0x51, 0x46, 0x94, 0xb6, 0x3b, 0xc3, 0xf1, 0x45, 0xba,
+  0x30, 0x34, 0x18, 0x03, 0xf6, 0x86, 0xaf, 0x45, 0xe3, 0x1d, 0x33, 0x4e,
+  0x08, 0x09, 0x95, 0xf5, 0x52, 0xad, 0xbe, 0x56, 0xb9, 0xb4, 0x5a, 0xed,
+  0xd5, 0xd1, 0xff, 0x52, 0x59, 0x75, 0x7b, 0x95, 0xfa, 0x8f, 0x29, 0x87,
+  0x48, 0x50, 0x37, 0xf6, 0x62, 0x7d, 0x4b, 0x4c, 0xdc, 0xe4, 0xee, 0xc2,
+  0xaa, 0x93, 0x2f, 0x94, 0x97, 0x8a, 0xfe, 0xa8, 0x12, 0x31, 0x09, 0x4f,
+  0x8a, 0xe7, 0x49, 0x69, 0xc8, 0xa0, 0xf0, 0xb6, 0xb8, 0x64, 0x53, 0x5b,
+  0xce, 0xe2, 0xc7, 0xac, 0xa1, 0x20, 0x24, 0x90, 0xd3, 0xcd, 0xee, 0x08,
+  0xfb, 0xa0, 0xa0, 0xf7, 0x5f, 0xaa, 0x3b, 0x4f, 0xa2, 0x3b, 0xb6, 0xe9,
+  0x20, 0x79, 0xca, 0x8f, 0xb3, 0x68, 0x07, 0x4b, 0x79, 0x42, 0x60, 0xf3,
+  0x18, 0xd1, 0x6f, 0xff, 0xdd, 0xe2, 0x96, 0x44, 0xea, 0x5c, 0x36, 0x43,
+  0x07, 0xdc, 0xaa, 0xae, 0xba, 0x6b, 0xe9, 0x10, 0x0e, 0xf2, 0x12, 0xf3,
+  0xb4, 0x6c, 0xeb, 0x8a, 0x1e, 0xf7, 0xfd, 0x23, 0x2c, 0x56, 0x30, 0xf4,
+  0x29, 0xf3, 0x75, 0x7b, 0xd8, 0xfb, 0x80, 0xb9, 0x26, 0x01, 0x69, 0xa5,
+  0x92, 0x7c, 0x56, 0x56, 0x2d, 0x0d, 0x91, 0x54, 0x81, 0x76, 0x21, 0xe5,
+  0x70, 0x1f, 0x1e, 0x8f, 0xc3, 0xc8, 0x9f, 0x2a, 0xa5, 0xfa, 0x96, 0xf2,
+  0x62, 0x99, 0xb8, 0x6e, 0xf0, 0x5f, 0x83, 0x15, 0x8f, 0x33, 0xe4, 0xe7,
+  0xaf, 0xe2, 0xac, 0x23, 0x2e, 0x38, 0x5f, 0x45, 0x41, 0x9b, 0xe9, 0xb4,
+  0x79, 0xd0, 0xf8, 0xcf
 };
 
 /* 4096-bit RSA private key (PKCS #8)
 -----BEGIN PRIVATE KEY-----
-MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqAgEAAoICAQDGGmtPXmJH+wYM
-tJNMc8YbWseVhNgOu1NEfCcwwS/1e/xnoqRiPgi4EqMXExBD1z1qGmHjOnouXNdH
-f70y9IIhOeLXD2pjhIFNYtL7+WreUafgAg1HE2Fz7o4NDnACx+np8GoB6edtugfq
-L5/Hnruzu1ppD2k2hsbVvbVppnLGInG1kuXWKOfzN4wFY1yCJ6SLMQ7bHwcr8JRQ
-awtwRIyU1InRONFOrS1wu+FQ1CItVa9qZ8YLCMMapWxefdcymtSPQudTXyVctfBP
-cMXTYpD+ZW43oD/JDDofO6sQE3pJyuCSDW2ewFsEp7aZnJGQ/JNwPqWLHgh8Ohay
-uPxm/8Jbj4Py6BKZf94fmAlrrJGx55tOnWL6paCDbTfBKKgKj28FCYfjRES5umd1
-RFOwGSJVzJD9Pt9Gjx8ZKA7iyR4aKdpmfFbuDdIyZ2Nun6JFnJFR2XB7k1QHOcn7
-O0XUtYjQahwaKbn89LFkaf7zH+rQ23qzyNwEya6w2LNPThRw69Urktx6d10+Dp86
-4Qtuzl6PiRgjYziPmwlXjniMlKsgLqA0lVimO3shD5ddtorkBJNzj7EngY5dLD9n
-OFMdxFVOVCKAxIEuLzxo9fJOv7SQBxUlKYfXlELkV3UaStO7m6bHTbJWv+hBgzUk
-wo19BuSc0MpEZQx3k973e+TPbzWskQIDAQABAoICAQCXsdNKS3Pmuom/YOcKO/0P
-JUx/aeIoJbl1T7yS0NvwlqiIkzpdIDN9AIhyOt7RlBgrD1i1rymwJteSoHY4dpLO
-7oyNMfi9i9GXeH0nBa6X3t814VxZeLW/GIUd6lhLSNoNkVMbdAkLNNCqux0Wtq30
-yxpIKMzgPAQ117b618I7hlScPYhRnbE/xOErnxJPeBu/milOEUxkkSyBB/cSWOtt
-a/K8i017eZC6KqQ2SLqDDIHucNhtyp/b36BEGwiWb4kkyo5ogQsTGx6RNkHFxExT
-AUiMv+EYCozXLdGn1cJmjzu3myC9133a6rIgnou5Ai/EW7RX+v90YObQpGZiWKZy
-K0E6uKsDvxSDtiK+6voH91y7NEgxtPMbrNNh5/kJao2cPD9kpK6e565ciktLiJ2g
-2XU6lqH578ZRdzedMJnSlaQZGtKVbsr0RDvaQeEeuozzc19lHKZkmUXAliOkXPWK
-x4ysZMUJnHMUUAZauC6Tdz0vQBicpT9TbCzbeB8JLhOsxIagLNzN8oyu4MthmT2S
-KRsPoYbZA6rkfoKgrzmGjW4U4m+inAsTUHeO7ZaDq+qaXsR5mlK08JxjtRc2Qguy
-oMntsmmXlM3LsbuJYU4jUexsJjAZYqjXykPx3wO3s32eDbyKxFhNjSOCzGvP/Dvx
-c9BZcmLfcAA9O+hDT/iwAQKCAQEAyWwmEbN+h2VcVai8iFf5sV9u4NFecxHY+3Cr
-IaJp4R3V2gFYHVcoiADPU3yn8O0Pwm1UPKZein/KZ9xPY85NEnue0uJoberWBeIC
-V/ipfJB9CgT/R/FeJJUIOicw5mu7legIZ5qritRBx2jd1pK+YxVyYvgsRDcNphmo
-FpycKfdrubNXA3Xw82e/+x+iFfr5QPxY4ZT0XNoVQ7KCon8G6hR0Rl27b+VmLSlH
-qjQ8AXpvzX9okrQnduaXXN9ZFzFQzgBziDM6BxaGdeCKjv4K5+GI5RhseYbYRkg4
-BCgpEocmaaf2eLZuBRoUJmMIS/Jt2C8pRYVWR2zuHDXhPflt8QKCAQEA+8gG+1Dh
-il2Rs+Ctw/220TSjNeEJS/UN8GpU8GX4+Z2/7bi8L0cBBkI5bJOAsHdWU8+SQgaL
-SgnbEUf6evIqyxp4fxNkrx+0IEp1t/Q1BUt7jrjG38r2yVRSj6WVzuZbUoM4ZdgS
-hJxypbcLId/T64RHVE07va7ZidmlEbTLWE6n2eDCOdi3vuQ4g297E7nCkSwceE0o
-g4AkqDEWTUoQf7zAgopraLbpY73fVjeiaKQvViLESQUlPr8uh0mYOl+W8iyWnr3N
-o/p16GIa4u6RsOTbd+phax5YcnzZm/mbeh6Ey+ifsSl9w6PmiRLtUrKdE8ap/ABT
-cHD9WsITAGgIoQKCAQBMUa4bBufqZX2W91h4UN1LV92rUal38EtG+mndVKzJn4Ro
-FhpNA7lXzva/q3v2zdwqz0IbuO4ZjFIlCFUMfB634h9LyH3JKDHwCLLaol2V1SmL
-olkX6VzCf7WeUzs0E54ALusAVpqo/8Psys9DflalNHsjBOXA8xs41H/cEXsaa6Vl
-t45AwW+KysTzYgkISxAmj3ceAlKU3A0ymXDmITt9dkKYZuueek08z2dYFnKmHL5A
-HwaAj8JkSvsPNZGMOCNl6sXb1Y0nImHQSEQ36go30j0MkTSI148bEkInURA+9PaZ
-EgtRsc3+IOOBqAR8wl7ciwIYVW1bouqVxdSSpvABAoIBAQCmMndJVS5Lo1AWKG0L
-PmJ63gAOBKmaVfwJgmbm+KjMPHEAfjzaCEiI1RYKsaL02RFG6XFl2+P9z1unoJea
-qFfPEX4Qg8CmSIsh9YSXFMAa6qR4pUfBWbxlUR/eajLlC/GkGbIUp/gxSQP0l0rl
-5VWB1SMwZnrUzqIR+HSZp3nCpMjvbQlIHeHMQ+F6ARCBCNGB+lggoO3pP6Dy1NQf
-2I/jgbihcrVLvdF5YVAXHUo7QIVumixu9tKLBK+15cJyZb7BxOT3i9o+L4m9B2Uv
-/sJ0vdyQ30nG55UCnZ8W8kDK73JBFyCyVO0LQxldyfyV5gkBkNWL3rs1MaBLVGgu
-kH2BAoIBAQC2rlx8FX3P8pWMplesWoItdYrfLdsRILmZocSfHkRn93yU11l0m3gd
-zsguPBuO+IA5nXldrQ8cRUuBG1k9YIX2MvveE8SXFpSIp6625F+6JDvvcSh1MMNa
-7aqgoqWMtAr0x1hg7zlzcm+Q+vJw98v4hVESRrnbouLjuAj1cG0BhSHPxAPU5Swq
-Oe7nEWJ6ZCvLmBQY4k+XGz/wf4dsyHf8p9kf8iRsmMObbA5mJFGfnHbxHj2aSWvH
-coP+kcbtI398l7gbE1iYTDJcOPEI15NC52q1/VNk4UAyBvTyqwNHIy0bHgUIrdB+
-sZApBBoMaUXbbssGZtjCRlNX9IUKZYKd
+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
+470vqgm1JXKXNFHU9dkUZd/51e1fzso=
 -----END PRIVATE KEY-----
 */
 
 static const uint8_t n_4096[] = { /* key component n, 512 bytes */
-  0xc6, 0x1a, 0x6b, 0x4f, 0x5e, 0x62, 0x47, 0xfb, 0x06, 0x0c, 0xb4, 0x93,
-  0x4c, 0x73, 0xc6, 0x1b, 0x5a, 0xc7, 0x95, 0x84, 0xd8, 0x0e, 0xbb, 0x53,
-  0x44, 0x7c, 0x27, 0x30, 0xc1, 0x2f, 0xf5, 0x7b, 0xfc, 0x67, 0xa2, 0xa4,
-  0x62, 0x3e, 0x08, 0xb8, 0x12, 0xa3, 0x17, 0x13, 0x10, 0x43, 0xd7, 0x3d,
-  0x6a, 0x1a, 0x61, 0xe3, 0x3a, 0x7a, 0x2e, 0x5c, 0xd7, 0x47, 0x7f, 0xbd,
-  0x32, 0xf4, 0x82, 0x21, 0x39, 0xe2, 0xd7, 0x0f, 0x6a, 0x63, 0x84, 0x81,
-  0x4d, 0x62, 0xd2, 0xfb, 0xf9, 0x6a, 0xde, 0x51, 0xa7, 0xe0, 0x02, 0x0d,
-  0x47, 0x13, 0x61, 0x73, 0xee, 0x8e, 0x0d, 0x0e, 0x70, 0x02, 0xc7, 0xe9,
-  0xe9, 0xf0, 0x6a, 0x01, 0xe9, 0xe7, 0x6d, 0xba, 0x07, 0xea, 0x2f, 0x9f,
-  0xc7, 0x9e, 0xbb, 0xb3, 0xbb, 0x5a, 0x69, 0x0f, 0x69, 0x36, 0x86, 0xc6,
-  0xd5, 0xbd, 0xb5, 0x69, 0xa6, 0x72, 0xc6, 0x22, 0x71, 0xb5, 0x92, 0xe5,
-  0xd6, 0x28, 0xe7, 0xf3, 0x37, 0x8c, 0x05, 0x63, 0x5c, 0x82, 0x27, 0xa4,
-  0x8b, 0x31, 0x0e, 0xdb, 0x1f, 0x07, 0x2b, 0xf0, 0x94, 0x50, 0x6b, 0x0b,
-  0x70, 0x44, 0x8c, 0x94, 0xd4, 0x89, 0xd1, 0x38, 0xd1, 0x4e, 0xad, 0x2d,
-  0x70, 0xbb, 0xe1, 0x50, 0xd4, 0x22, 0x2d, 0x55, 0xaf, 0x6a, 0x67, 0xc6,
-  0x0b, 0x08, 0xc3, 0x1a, 0xa5, 0x6c, 0x5e, 0x7d, 0xd7, 0x32, 0x9a, 0xd4,
-  0x8f, 0x42, 0xe7, 0x53, 0x5f, 0x25, 0x5c, 0xb5, 0xf0, 0x4f, 0x70, 0xc5,
-  0xd3, 0x62, 0x90, 0xfe, 0x65, 0x6e, 0x37, 0xa0, 0x3f, 0xc9, 0x0c, 0x3a,
-  0x1f, 0x3b, 0xab, 0x10, 0x13, 0x7a, 0x49, 0xca, 0xe0, 0x92, 0x0d, 0x6d,
-  0x9e, 0xc0, 0x5b, 0x04, 0xa7, 0xb6, 0x99, 0x9c, 0x91, 0x90, 0xfc, 0x93,
-  0x70, 0x3e, 0xa5, 0x8b, 0x1e, 0x08, 0x7c, 0x3a, 0x16, 0xb2, 0xb8, 0xfc,
-  0x66, 0xff, 0xc2, 0x5b, 0x8f, 0x83, 0xf2, 0xe8, 0x12, 0x99, 0x7f, 0xde,
-  0x1f, 0x98, 0x09, 0x6b, 0xac, 0x91, 0xb1, 0xe7, 0x9b, 0x4e, 0x9d, 0x62,
-  0xfa, 0xa5, 0xa0, 0x83, 0x6d, 0x37, 0xc1, 0x28, 0xa8, 0x0a, 0x8f, 0x6f,
-  0x05, 0x09, 0x87, 0xe3, 0x44, 0x44, 0xb9, 0xba, 0x67, 0x75, 0x44, 0x53,
-  0xb0, 0x19, 0x22, 0x55, 0xcc, 0x90, 0xfd, 0x3e, 0xdf, 0x46, 0x8f, 0x1f,
-  0x19, 0x28, 0x0e, 0xe2, 0xc9, 0x1e, 0x1a, 0x29, 0xda, 0x66, 0x7c, 0x56,
-  0xee, 0x0d, 0xd2, 0x32, 0x67, 0x63, 0x6e, 0x9f, 0xa2, 0x45, 0x9c, 0x91,
-  0x51, 0xd9, 0x70, 0x7b, 0x93, 0x54, 0x07, 0x39, 0xc9, 0xfb, 0x3b, 0x45,
-  0xd4, 0xb5, 0x88, 0xd0, 0x6a, 0x1c, 0x1a, 0x29, 0xb9, 0xfc, 0xf4, 0xb1,
-  0x64, 0x69, 0xfe, 0xf3, 0x1f, 0xea, 0xd0, 0xdb, 0x7a, 0xb3, 0xc8, 0xdc,
-  0x04, 0xc9, 0xae, 0xb0, 0xd8, 0xb3, 0x4f, 0x4e, 0x14, 0x70, 0xeb, 0xd5,
-  0x2b, 0x92, 0xdc, 0x7a, 0x77, 0x5d, 0x3e, 0x0e, 0x9f, 0x3a, 0xe1, 0x0b,
-  0x6e, 0xce, 0x5e, 0x8f, 0x89, 0x18, 0x23, 0x63, 0x38, 0x8f, 0x9b, 0x09,
-  0x57, 0x8e, 0x78, 0x8c, 0x94, 0xab, 0x20, 0x2e, 0xa0, 0x34, 0x95, 0x58,
-  0xa6, 0x3b, 0x7b, 0x21, 0x0f, 0x97, 0x5d, 0xb6, 0x8a, 0xe4, 0x04, 0x93,
-  0x73, 0x8f, 0xb1, 0x27, 0x81, 0x8e, 0x5d, 0x2c, 0x3f, 0x67, 0x38, 0x53,
-  0x1d, 0xc4, 0x55, 0x4e, 0x54, 0x22, 0x80, 0xc4, 0x81, 0x2e, 0x2f, 0x3c,
-  0x68, 0xf5, 0xf2, 0x4e, 0xbf, 0xb4, 0x90, 0x07, 0x15, 0x25, 0x29, 0x87,
-  0xd7, 0x94, 0x42, 0xe4, 0x57, 0x75, 0x1a, 0x4a, 0xd3, 0xbb, 0x9b, 0xa6,
-  0xc7, 0x4d, 0xb2, 0x56, 0xbf, 0xe8, 0x41, 0x83, 0x35, 0x24, 0xc2, 0x8d,
-  0x7d, 0x06, 0xe4, 0x9c, 0xd0, 0xca, 0x44, 0x65, 0x0c, 0x77, 0x93, 0xde,
-  0xf7, 0x7b, 0xe4, 0xcf, 0x6f, 0x35, 0xac, 0x91
+  0xae, 0x5b, 0xe8, 0x48, 0xde, 0xf7, 0xd6, 0x06, 0x59, 0xbf, 0x0a, 0x2c,
+  0x06, 0x95, 0x02, 0xcb, 0x1b, 0xfe, 0x96, 0x08, 0x00, 0x79, 0x78, 0xd5,
+  0x9f, 0x81, 0x6a, 0x63, 0xc4, 0x14, 0xca, 0x70, 0x61, 0xbe, 0x9c, 0xa9,
+  0xe2, 0x01, 0x8a, 0xcb, 0xb6, 0xc9, 0x06, 0xe1, 0xfb, 0xb4, 0xcc, 0x99,
+  0x79, 0xcd, 0xfd, 0x47, 0xbc, 0x68, 0x49, 0x5d, 0x6e, 0xb9, 0xea, 0x27,
+  0x77, 0x95, 0xc1, 0x38, 0x74, 0x29, 0xad, 0x20, 0x37, 0x22, 0x79, 0xb2,
+  0xde, 0xc6, 0xf9, 0x15, 0x70, 0x71, 0xa3, 0xfb, 0x77, 0x6c, 0x87, 0x48,
+  0xbf, 0x45, 0x9d, 0xa1, 0x7c, 0xd2, 0x50, 0x25, 0xaf, 0x41, 0xa7, 0x36,
+  0x77, 0x0e, 0xdb, 0x2e, 0x0c, 0xae, 0x1f, 0xe5, 0x39, 0x23, 0xd4, 0x1e,
+  0x43, 0x49, 0xc0, 0xc4, 0x55, 0xf2, 0x27, 0x48, 0x70, 0xc0, 0x53, 0x6a,
+  0xc3, 0xc6, 0xe0, 0xd7, 0x04, 0xc9, 0xd5, 0x5d, 0xdd, 0x3c, 0x08, 0x34,
+  0xcb, 0x52, 0x23, 0x54, 0xfc, 0x11, 0x50, 0xcf, 0x45, 0xc4, 0x64, 0x96,
+  0x74, 0x63, 0x80, 0x5e, 0x0a, 0x64, 0xe6, 0xd1, 0xc1, 0x84, 0x57, 0x72,
+  0xe1, 0x6a, 0x13, 0x60, 0x16, 0x1f, 0xb5, 0x2e, 0x98, 0xb8, 0x70, 0x1c,
+  0x12, 0xb7, 0xe1, 0x28, 0x15, 0x85, 0xa2, 0xb0, 0xfa, 0xfd, 0x29, 0x78,
+  0xc0, 0x6c, 0x75, 0x42, 0x01, 0x85, 0x07, 0x7e, 0xf5, 0xef, 0x13, 0x5c,
+  0x17, 0xaa, 0x5d, 0x18, 0x7b, 0x13, 0x53, 0x44, 0x71, 0x1f, 0x11, 0x01,
+  0xb6, 0xe0, 0x47, 0x84, 0x76, 0x3d, 0x97, 0x47, 0xbd, 0x8c, 0xb3, 0x7e,
+  0xb1, 0xac, 0x78, 0x72, 0x90, 0x8b, 0x12, 0xc6, 0xe3, 0x23, 0xa1, 0xdb,
+  0x09, 0x96, 0xa1, 0xbf, 0x24, 0xef, 0xd2, 0x01, 0xd7, 0x8b, 0x32, 0x3e,
+  0x23, 0xeb, 0xc4, 0x83, 0xdb, 0xc1, 0x75, 0x7c, 0x89, 0xd6, 0xd9, 0x2c,
+  0xe2, 0xd6, 0xd7, 0x97, 0x18, 0x36, 0x01, 0x68, 0xcc, 0x93, 0xd0, 0x6c,
+  0x39, 0x91, 0x0e, 0x13, 0x16, 0x5a, 0xbc, 0x5c, 0x40, 0xf9, 0x84, 0x1e,
+  0x48, 0xf2, 0x93, 0x82, 0xb7, 0x0b, 0xa8, 0x42, 0x5c, 0x3b, 0xbd, 0x58,
+  0xe9, 0xd6, 0xdf, 0x74, 0x58, 0xbf, 0xdb, 0x6c, 0x0e, 0xd8, 0x73, 0x0b,
+  0xfd, 0x23, 0x85, 0x77, 0xac, 0xe0, 0xa4, 0x3a, 0x49, 0x02, 0x25, 0xef,
+  0xe6, 0x54, 0x1f, 0x59, 0xd1, 0x79, 0x98, 0xec, 0x29, 0xc3, 0x61, 0x45,
+  0xe6, 0xdb, 0x5d, 0x7e, 0xa0, 0x87, 0x09, 0xcb, 0x34, 0xe7, 0x93, 0x48,
+  0x8b, 0x57, 0x57, 0x11, 0x89, 0x30, 0x0c, 0x10, 0x4c, 0x4a, 0x4b, 0xbc,
+  0x06, 0x27, 0x56, 0x40, 0x87, 0x80, 0x8c, 0x4e, 0x99, 0x36, 0x14, 0x1c,
+  0x74, 0xb4, 0x66, 0xfd, 0xe3, 0xc0, 0x67, 0xcb, 0xe8, 0x31, 0x8c, 0x62,
+  0xec, 0x62, 0x03, 0x58, 0x51, 0xba, 0x7d, 0x1a, 0x43, 0x83, 0xf2, 0xd6,
+  0x31, 0xa3, 0xbe, 0xe4, 0xe1, 0x68, 0xe3, 0xed, 0x88, 0x14, 0x4c, 0x0d,
+  0x80, 0xe3, 0x5c, 0xf1, 0x03, 0x42, 0xc7, 0xfd, 0xaa, 0x5f, 0x1d, 0x1a,
+  0x3c, 0x6d, 0x29, 0xc8, 0x90, 0xb6, 0x30, 0xd8, 0xdc, 0xb3, 0x67, 0xe3,
+  0x8e, 0x19, 0xae, 0xed, 0x5b, 0x7a, 0x19, 0xdb, 0xbc, 0x8c, 0x95, 0x69,
+  0xd0, 0x18, 0x41, 0x2b, 0x1f, 0xa1, 0x1c, 0x28, 0xdb, 0xc1, 0xd9, 0xde,
+  0x20, 0x52, 0xc9, 0x56, 0x12, 0x33, 0xa7, 0xf5, 0x7c, 0xea, 0x16, 0x75,
+  0xd1, 0x0f, 0x64, 0x54, 0x3d, 0xf0, 0xcf, 0x7a, 0xc3, 0x09, 0xe1, 0x79,
+  0x65, 0x97, 0x6a, 0xfb, 0xc3, 0x88, 0x4c, 0x07, 0xdf, 0xd5, 0x36, 0x43,
+  0xed, 0x79, 0xb1, 0x3e, 0xae, 0x1e, 0x4d, 0x07, 0xe7, 0x16, 0x92, 0xfc,
+  0x2b, 0x65, 0x6a, 0xa5, 0xc1, 0x73, 0x02, 0x1b, 0xfe, 0xa8, 0xdd, 0xae,
+  0x43, 0x75, 0xe9, 0xff, 0x6f, 0x9d, 0xfc, 0xed
 };
 
 static const uint8_t e_4096[] = { /* key component e, 4 bytes */
@@ -395,124 +441,174 @@ static const uint8_t e_4096[] = { /* key component e, 4 bytes */
 };
 
 static const uint8_t d_4096[] = { /* key component d, 512 bytes */
-  0x97, 0xb1, 0xd3, 0x4a, 0x4b, 0x73, 0xe6, 0xba, 0x89, 0xbf, 0x60, 0xe7,
-  0x0a, 0x3b, 0xfd, 0x0f, 0x25, 0x4c, 0x7f, 0x69, 0xe2, 0x28, 0x25, 0xb9,
-  0x75, 0x4f, 0xbc, 0x92, 0xd0, 0xdb, 0xf0, 0x96, 0xa8, 0x88, 0x93, 0x3a,
-  0x5d, 0x20, 0x33, 0x7d, 0x00, 0x88, 0x72, 0x3a, 0xde, 0xd1, 0x94, 0x18,
-  0x2b, 0x0f, 0x58, 0xb5, 0xaf, 0x29, 0xb0, 0x26, 0xd7, 0x92, 0xa0, 0x76,
-  0x38, 0x76, 0x92, 0xce, 0xee, 0x8c, 0x8d, 0x31, 0xf8, 0xbd, 0x8b, 0xd1,
-  0x97, 0x78, 0x7d, 0x27, 0x05, 0xae, 0x97, 0xde, 0xdf, 0x35, 0xe1, 0x5c,
-  0x59, 0x78, 0xb5, 0xbf, 0x18, 0x85, 0x1d, 0xea, 0x58, 0x4b, 0x48, 0xda,
-  0x0d, 0x91, 0x53, 0x1b, 0x74, 0x09, 0x0b, 0x34, 0xd0, 0xaa, 0xbb, 0x1d,
-  0x16, 0xb6, 0xad, 0xf4, 0xcb, 0x1a, 0x48, 0x28, 0xcc, 0xe0, 0x3c, 0x04,
-  0x35, 0xd7, 0xb6, 0xfa, 0xd7, 0xc2, 0x3b, 0x86, 0x54, 0x9c, 0x3d, 0x88,
-  0x51, 0x9d, 0xb1, 0x3f, 0xc4, 0xe1, 0x2b, 0x9f, 0x12, 0x4f, 0x78, 0x1b,
-  0xbf, 0x9a, 0x29, 0x4e, 0x11, 0x4c, 0x64, 0x91, 0x2c, 0x81, 0x07, 0xf7,
-  0x12, 0x58, 0xeb, 0x6d, 0x6b, 0xf2, 0xbc, 0x8b, 0x4d, 0x7b, 0x79, 0x90,
-  0xba, 0x2a, 0xa4, 0x36, 0x48, 0xba, 0x83, 0x0c, 0x81, 0xee, 0x70, 0xd8,
-  0x6d, 0xca, 0x9f, 0xdb, 0xdf, 0xa0, 0x44, 0x1b, 0x08, 0x96, 0x6f, 0x89,
-  0x24, 0xca, 0x8e, 0x68, 0x81, 0x0b, 0x13, 0x1b, 0x1e, 0x91, 0x36, 0x41,
-  0xc5, 0xc4, 0x4c, 0x53, 0x01, 0x48, 0x8c, 0xbf, 0xe1, 0x18, 0x0a, 0x8c,
-  0xd7, 0x2d, 0xd1, 0xa7, 0xd5, 0xc2, 0x66, 0x8f, 0x3b, 0xb7, 0x9b, 0x20,
-  0xbd, 0xd7, 0x7d, 0xda, 0xea, 0xb2, 0x20, 0x9e, 0x8b, 0xb9, 0x02, 0x2f,
-  0xc4, 0x5b, 0xb4, 0x57, 0xfa, 0xff, 0x74, 0x60, 0xe6, 0xd0, 0xa4, 0x66,
-  0x62, 0x58, 0xa6, 0x72, 0x2b, 0x41, 0x3a, 0xb8, 0xab, 0x03, 0xbf, 0x14,
-  0x83, 0xb6, 0x22, 0xbe, 0xea, 0xfa, 0x07, 0xf7, 0x5c, 0xbb, 0x34, 0x48,
-  0x31, 0xb4, 0xf3, 0x1b, 0xac, 0xd3, 0x61, 0xe7, 0xf9, 0x09, 0x6a, 0x8d,
-  0x9c, 0x3c, 0x3f, 0x64, 0xa4, 0xae, 0x9e, 0xe7, 0xae, 0x5c, 0x8a, 0x4b,
-  0x4b, 0x88, 0x9d, 0xa0, 0xd9, 0x75, 0x3a, 0x96, 0xa1, 0xf9, 0xef, 0xc6,
-  0x51, 0x77, 0x37, 0x9d, 0x30, 0x99, 0xd2, 0x95, 0xa4, 0x19, 0x1a, 0xd2,
-  0x95, 0x6e, 0xca, 0xf4, 0x44, 0x3b, 0xda, 0x41, 0xe1, 0x1e, 0xba, 0x8c,
-  0xf3, 0x73, 0x5f, 0x65, 0x1c, 0xa6, 0x64, 0x99, 0x45, 0xc0, 0x96, 0x23,
-  0xa4, 0x5c, 0xf5, 0x8a, 0xc7, 0x8c, 0xac, 0x64, 0xc5, 0x09, 0x9c, 0x73,
-  0x14, 0x50, 0x06, 0x5a, 0xb8, 0x2e, 0x93, 0x77, 0x3d, 0x2f, 0x40, 0x18,
-  0x9c, 0xa5, 0x3f, 0x53, 0x6c, 0x2c, 0xdb, 0x78, 0x1f, 0x09, 0x2e, 0x13,
-  0xac, 0xc4, 0x86, 0xa0, 0x2c, 0xdc, 0xcd, 0xf2, 0x8c, 0xae, 0xe0, 0xcb,
-  0x61, 0x99, 0x3d, 0x92, 0x29, 0x1b, 0x0f, 0xa1, 0x86, 0xd9, 0x03, 0xaa,
-  0xe4, 0x7e, 0x82, 0xa0, 0xaf, 0x39, 0x86, 0x8d, 0x6e, 0x14, 0xe2, 0x6f,
-  0xa2, 0x9c, 0x0b, 0x13, 0x50, 0x77, 0x8e, 0xed, 0x96, 0x83, 0xab, 0xea,
-  0x9a, 0x5e, 0xc4, 0x79, 0x9a, 0x52, 0xb4, 0xf0, 0x9c, 0x63, 0xb5, 0x17,
-  0x36, 0x42, 0x0b, 0xb2, 0xa0, 0xc9, 0xed, 0xb2, 0x69, 0x97, 0x94, 0xcd,
-  0xcb, 0xb1, 0xbb, 0x89, 0x61, 0x4e, 0x23, 0x51, 0xec, 0x6c, 0x26, 0x30,
-  0x19, 0x62, 0xa8, 0xd7, 0xca, 0x43, 0xf1, 0xdf, 0x03, 0xb7, 0xb3, 0x7d,
-  0x9e, 0x0d, 0xbc, 0x8a, 0xc4, 0x58, 0x4d, 0x8d, 0x23, 0x82, 0xcc, 0x6b,
-  0xcf, 0xfc, 0x3b, 0xf1, 0x73, 0xd0, 0x59, 0x72, 0x62, 0xdf, 0x70, 0x00,
-  0x3d, 0x3b, 0xe8, 0x43, 0x4f, 0xf8, 0xb0, 0x01
+  0x09, 0x4f, 0xc7, 0x3b, 0xfd, 0x0c, 0x67, 0x55, 0xb7, 0x7d, 0x48, 0x61,
+  0xc9, 0x88, 0x33, 0xb9, 0xfd, 0x28, 0xbf, 0x82, 0x75, 0xe4, 0x06, 0xdc,
+  0x01, 0xc4, 0xbb, 0x95, 0xd0, 0x66, 0xfb, 0xd8, 0xbc, 0x9f, 0x9d, 0x66,
+  0x45, 0x37, 0xa7, 0xdd, 0xf1, 0x49, 0x13, 0x21, 0x06, 0x7c, 0x45, 0x60,
+  0xfc, 0xec, 0x4f, 0x56, 0x81, 0x6d, 0x60, 0x5d, 0xa9, 0x08, 0x2c, 0xc5,
+  0x26, 0xd1, 0xcc, 0x9b, 0xe3, 0x38, 0x46, 0x92, 0xad, 0xdf, 0x1d, 0x78,
+  0xbc, 0x05, 0x0c, 0x50, 0x64, 0xcc, 0xec, 0xe1, 0x05, 0x23, 0xba, 0xa5,
+  0xdb, 0xf1, 0x2f, 0xd5, 0xec, 0x00, 0x9f, 0x5f, 0x23, 0xd8, 0xf1, 0xc1,
+  0x2a, 0xe2, 0x94, 0x3a, 0x05, 0x5b, 0x57, 0x40, 0xba, 0xa8, 0x7b, 0x2f,
+  0x92, 0x90, 0x61, 0xc7, 0x1a, 0x7f, 0xf0, 0x31, 0x22, 0x34, 0x63, 0x40,
+  0x14, 0x6c, 0x8e, 0x9d, 0x6d, 0x18, 0x0a, 0x59, 0x14, 0xf3, 0x9b, 0xcc,
+  0x95, 0xff, 0x30, 0xfb, 0xdc, 0xea, 0x5f, 0xd2, 0x71, 0xfb, 0x67, 0x13,
+  0xd1, 0xeb, 0x6e, 0x73, 0x97, 0x42, 0x84, 0x41, 0x37, 0x80, 0x85, 0xdb,
+  0x10, 0xc6, 0xc5, 0x7a, 0x20, 0x34, 0x59, 0x4c, 0xbf, 0xc3, 0x39, 0xd9,
+  0x85, 0xf6, 0x64, 0x03, 0xec, 0x02, 0x53, 0x09, 0xf8, 0x9d, 0x84, 0x95,
+  0x7a, 0x51, 0x50, 0x81, 0xd1, 0xea, 0xf4, 0xd7, 0x86, 0xf2, 0xd9, 0xa9,
+  0xd5, 0x69, 0xb7, 0xc7, 0x12, 0xeb, 0x99, 0x4a, 0xd2, 0x6f, 0xc2, 0x4c,
+  0xc1, 0x23, 0x81, 0x2e, 0x45, 0xd2, 0x4c, 0x3d, 0xfc, 0x95, 0x83, 0x10,
+  0x85, 0x14, 0x9c, 0xea, 0x21, 0x66, 0x0b, 0xfe, 0xab, 0x2a, 0xbf, 0xfe,
+  0x1e, 0xa8, 0xf8, 0xc2, 0x68, 0x8a, 0x96, 0x40, 0x9a, 0xee, 0x48, 0x24,
+  0xa1, 0x6e, 0x79, 0xf4, 0x40, 0xcc, 0x38, 0x26, 0x0a, 0x86, 0x7a, 0xda,
+  0xb6, 0xd2, 0x9a, 0x78, 0xd4, 0x9b, 0x73, 0x76, 0x0d, 0xc7, 0x87, 0x68,
+  0x00, 0x30, 0xef, 0xc6, 0x5f, 0xf5, 0x17, 0x53, 0xd3, 0x0d, 0x3c, 0x7e,
+  0x9f, 0xe1, 0x5d, 0x53, 0xb7, 0xf4, 0x73, 0x27, 0x30, 0x4e, 0x6c, 0x15,
+  0x01, 0xa7, 0x94, 0x9b, 0x1b, 0x36, 0xfe, 0xf8, 0xa9, 0xf0, 0x48, 0x1f,
+  0xaf, 0xbc, 0x7c, 0x35, 0x3b, 0xea, 0xb5, 0x96, 0x0a, 0xae, 0xbb, 0x13,
+  0x48, 0x10, 0x90, 0x09, 0xee, 0x61, 0x77, 0x33, 0x15, 0x23, 0x8f, 0xc1,
+  0x92, 0x67, 0xf0, 0x4e, 0x0d, 0x71, 0xee, 0xbb, 0x51, 0xec, 0x90, 0xab,
+  0xa0, 0x90, 0x12, 0xe0, 0xb5, 0x5d, 0x3a, 0xd6, 0xdf, 0x86, 0x41, 0x50,
+  0x7c, 0xb9, 0xa6, 0xe6, 0xbd, 0x52, 0xe1, 0x72, 0x98, 0x66, 0x12, 0x35,
+  0x10, 0x4e, 0x50, 0x2d, 0xe4, 0xba, 0xb4, 0xd8, 0x66, 0x68, 0x69, 0x70,
+  0x0b, 0x3d, 0x8f, 0xcb, 0x55, 0x61, 0x26, 0xfa, 0xda, 0xf3, 0x43, 0x65,
+  0xbb, 0xe4, 0x61, 0x74, 0x72, 0x3e, 0x3a, 0x6f, 0x45, 0x38, 0x69, 0xb6,
+  0xd0, 0xa8, 0x6b, 0xa0, 0xec, 0xdd, 0xf8, 0x8c, 0x7e, 0xc3, 0x7f, 0x01,
+  0xba, 0x50, 0xaa, 0x24, 0x83, 0xc5, 0x1d, 0x8c, 0x5f, 0x4a, 0x24, 0x84,
+  0x79, 0x6b, 0x6a, 0xbd, 0xae, 0x71, 0xb3, 0x4c, 0x26, 0x8c, 0x47, 0x7f,
+  0x98, 0x94, 0xa3, 0x43, 0xe3, 0xf4, 0xb2, 0x11, 0xb6, 0x6c, 0x88, 0x2b,
+  0xf8, 0x61, 0xd6, 0xe0, 0x08, 0x78, 0xe9, 0x2c, 0xf0, 0xce, 0xb7, 0xc0,
+  0x09, 0xa2, 0xba, 0xe1, 0xde, 0x0e, 0x45, 0xc0, 0x32, 0x3b, 0x93, 0xde,
+  0x3e, 0x7d, 0x69, 0x2d, 0x63, 0x45, 0x2b, 0x89, 0x2d, 0x99, 0xb1, 0x82,
+  0x7a, 0xad, 0xb4, 0xd6, 0xde, 0x60, 0xfa, 0xab, 0xef, 0x87, 0xa9, 0x32,
+  0xc1, 0x63, 0x7b, 0xb8, 0x32, 0xd0, 0x05, 0xe1, 0xe5, 0x04, 0xb7, 0x06,
+  0x29, 0xf1, 0x1f, 0xbb, 0x38, 0x28, 0xe3, 0x51
 };
 
 static const uint8_t p_4096[] = { /* key component p, 256 bytes */
-  0xc9, 0x6c, 0x26, 0x11, 0xb3, 0x7e, 0x87, 0x65, 0x5c, 0x55, 0xa8, 0xbc,
-  0x88, 0x57, 0xf9, 0xb1, 0x5f, 0x6e, 0xe0, 0xd1, 0x5e, 0x73, 0x11, 0xd8,
-  0xfb, 0x70, 0xab, 0x21, 0xa2, 0x69, 0xe1, 0x1d, 0xd5, 0xda, 0x01, 0x58,
-  0x1d, 0x57, 0x28, 0x88, 0x00, 0xcf, 0x53, 0x7c, 0xa7, 0xf0, 0xed, 0x0f,
-  0xc2, 0x6d, 0x54, 0x3c, 0xa6, 0x5e, 0x8a, 0x7f, 0xca, 0x67, 0xdc, 0x4f,
-  0x63, 0xce, 0x4d, 0x12, 0x7b, 0x9e, 0xd2, 0xe2, 0x68, 0x6d, 0xea, 0xd6,
-  0x05, 0xe2, 0x02, 0x57, 0xf8, 0xa9, 0x7c, 0x90, 0x7d, 0x0a, 0x04, 0xff,
-  0x47, 0xf1, 0x5e, 0x24, 0x95, 0x08, 0x3a, 0x27, 0x30, 0xe6, 0x6b, 0xbb,
-  0x95, 0xe8, 0x08, 0x67, 0x9a, 0xab, 0x8a, 0xd4, 0x41, 0xc7, 0x68, 0xdd,
-  0xd6, 0x92, 0xbe, 0x63, 0x15, 0x72, 0x62, 0xf8, 0x2c, 0x44, 0x37, 0x0d,
-  0xa6, 0x19, 0xa8, 0x16, 0x9c, 0x9c, 0x29, 0xf7, 0x6b, 0xb9, 0xb3, 0x57,
-  0x03, 0x75, 0xf0, 0xf3, 0x67, 0xbf, 0xfb, 0x1f, 0xa2, 0x15, 0xfa, 0xf9,
-  0x40, 0xfc, 0x58, 0xe1, 0x94, 0xf4, 0x5c, 0xda, 0x15, 0x43, 0xb2, 0x82,
-  0xa2, 0x7f, 0x06, 0xea, 0x14, 0x74, 0x46, 0x5d, 0xbb, 0x6f, 0xe5, 0x66,
-  0x2d, 0x29, 0x47, 0xaa, 0x34, 0x3c, 0x01, 0x7a, 0x6f, 0xcd, 0x7f, 0x68,
-  0x92, 0xb4, 0x27, 0x76, 0xe6, 0x97, 0x5c, 0xdf, 0x59, 0x17, 0x31, 0x50,
-  0xce, 0x00, 0x73, 0x88, 0x33, 0x3a, 0x07, 0x16, 0x86, 0x75, 0xe0, 0x8a,
-  0x8e, 0xfe, 0x0a, 0xe7, 0xe1, 0x88, 0xe5, 0x18, 0x6c, 0x79, 0x86, 0xd8,
-  0x46, 0x48, 0x38, 0x04, 0x28, 0x29, 0x12, 0x87, 0x26, 0x69, 0xa7, 0xf6,
-  0x78, 0xb6, 0x6e, 0x05, 0x1a, 0x14, 0x26, 0x63, 0x08, 0x4b, 0xf2, 0x6d,
-  0xd8, 0x2f, 0x29, 0x45, 0x85, 0x56, 0x47, 0x6c, 0xee, 0x1c, 0x35, 0xe1,
-  0x3d, 0xf9, 0x6d, 0xf1
+  0xc0, 0x3d, 0xe4, 0x29, 0xfa, 0x44, 0xac, 0x61, 0x54, 0x74, 0x4a, 0xe8,
+  0x9a, 0x48, 0x29, 0xfe, 0x3b, 0xef, 0x72, 0xb4, 0xf5, 0x1e, 0xbd, 0x58,
+  0xed, 0xfd, 0x67, 0x25, 0x9f, 0x1f, 0x57, 0x35, 0x37, 0x9a, 0xa2, 0x3d,
+  0xab, 0x07, 0x09, 0x6a, 0xb9, 0xae, 0x74, 0xc7, 0x50, 0x4f, 0x55, 0x77,
+  0xce, 0x21, 0x7a, 0xd0, 0x2f, 0x60, 0x15, 0xd3, 0x16, 0x3e, 0xed, 0xa2,
+  0xe6, 0x85, 0x50, 0x50, 0x27, 0xe1, 0x5f, 0x03, 0x98, 0x4c, 0x16, 0x8d,
+  0x2c, 0xea, 0x1f, 0x85, 0x11, 0xe2, 0x5d, 0x8c, 0x14, 0xb5, 0xc1, 0xdd,
+  0xee, 0x1f, 0x8d, 0x0e, 0x50, 0xa6, 0xec, 0x21, 0xea, 0x67, 0x77, 0xbc,
+  0xf1, 0x8d, 0xb5, 0xe0, 0x27, 0x39, 0x82, 0x86, 0x66, 0xa2, 0x55, 0x15,
+  0x31, 0xc2, 0xa8, 0xb5, 0x9a, 0xa5, 0xa1, 0x30, 0x68, 0x2b, 0xbe, 0xde,
+  0x36, 0xcf, 0x03, 0x19, 0x50, 0x09, 0x17, 0x5d, 0xbb, 0x32, 0x93, 0x52,
+  0x77, 0x8f, 0xe9, 0xa5, 0xc2, 0xcc, 0x8b, 0x37, 0xcf, 0x3b, 0x7c, 0x78,
+  0xd6, 0xf2, 0xd6, 0x4f, 0x36, 0xbd, 0x9f, 0xd2, 0xe5, 0x6c, 0xf1, 0xcb,
+  0x66, 0xbd, 0x21, 0x08, 0x94, 0x39, 0x8c, 0xb1, 0xa2, 0x2d, 0xbb, 0x70,
+  0xc1, 0x37, 0xf2, 0x73, 0xe9, 0xe3, 0x8b, 0xe9, 0x80, 0x4e, 0xd5, 0x81,
+  0xa2, 0x8a, 0x74, 0x07, 0x66, 0x4d, 0x1a, 0x11, 0xb3, 0x9d, 0xd2, 0xe2,
+  0x76, 0xef, 0x8c, 0x26, 0x43, 0x6e, 0x29, 0x02, 0x6a, 0xe1, 0x1f, 0x66,
+  0xed, 0xbe, 0xe4, 0x34, 0xe7, 0xf7, 0x7e, 0x69, 0x2b, 0x2c, 0x25, 0x00,
+  0x73, 0xa1, 0x2a, 0x99, 0xdc, 0x8f, 0x35, 0x9d, 0x29, 0x59, 0x02, 0x30,
+  0xa2, 0x82, 0x2e, 0xac, 0xca, 0x3f, 0x19, 0xf4, 0xef, 0x74, 0x77, 0x6c,
+  0xdd, 0x2d, 0x0c, 0x78, 0x23, 0xac, 0x38, 0xe9, 0x1a, 0xda, 0xb7, 0xf6,
+  0x37, 0x99, 0x68, 0xab
 };
 
 static const uint8_t q_4096[] = { /* key component q, 256 bytes */
-  0xfb, 0xc8, 0x06, 0xfb, 0x50, 0xe1, 0x8a, 0x5d, 0x91, 0xb3, 0xe0, 0xad,
-  0xc3, 0xfd, 0xb6, 0xd1, 0x34, 0xa3, 0x35, 0xe1, 0x09, 0x4b, 0xf5, 0x0d,
-  0xf0, 0x6a, 0x54, 0xf0, 0x65, 0xf8, 0xf9, 0x9d, 0xbf, 0xed, 0xb8, 0xbc,
-  0x2f, 0x47, 0x01, 0x06, 0x42, 0x39, 0x6c, 0x93, 0x80, 0xb0, 0x77, 0x56,
-  0x53, 0xcf, 0x92, 0x42, 0x06, 0x8b, 0x4a, 0x09, 0xdb, 0x11, 0x47, 0xfa,
-  0x7a, 0xf2, 0x2a, 0xcb, 0x1a, 0x78, 0x7f, 0x13, 0x64, 0xaf, 0x1f, 0xb4,
-  0x20, 0x4a, 0x75, 0xb7, 0xf4, 0x35, 0x05, 0x4b, 0x7b, 0x8e, 0xb8, 0xc6,
-  0xdf, 0xca, 0xf6, 0xc9, 0x54, 0x52, 0x8f, 0xa5, 0x95, 0xce, 0xe6, 0x5b,
-  0x52, 0x83, 0x38, 0x65, 0xd8, 0x12, 0x84, 0x9c, 0x72, 0xa5, 0xb7, 0x0b,
-  0x21, 0xdf, 0xd3, 0xeb, 0x84, 0x47, 0x54, 0x4d, 0x3b, 0xbd, 0xae, 0xd9,
-  0x89, 0xd9, 0xa5, 0x11, 0xb4, 0xcb, 0x58, 0x4e, 0xa7, 0xd9, 0xe0, 0xc2,
-  0x39, 0xd8, 0xb7, 0xbe, 0xe4, 0x38, 0x83, 0x6f, 0x7b, 0x13, 0xb9, 0xc2,
-  0x91, 0x2c, 0x1c, 0x78, 0x4d, 0x28, 0x83, 0x80, 0x24, 0xa8, 0x31, 0x16,
-  0x4d, 0x4a, 0x10, 0x7f, 0xbc, 0xc0, 0x82, 0x8a, 0x6b, 0x68, 0xb6, 0xe9,
-  0x63, 0xbd, 0xdf, 0x56, 0x37, 0xa2, 0x68, 0xa4, 0x2f, 0x56, 0x22, 0xc4,
-  0x49, 0x05, 0x25, 0x3e, 0xbf, 0x2e, 0x87, 0x49, 0x98, 0x3a, 0x5f, 0x96,
-  0xf2, 0x2c, 0x96, 0x9e, 0xbd, 0xcd, 0xa3, 0xfa, 0x75, 0xe8, 0x62, 0x1a,
-  0xe2, 0xee, 0x91, 0xb0, 0xe4, 0xdb, 0x77, 0xea, 0x61, 0x6b, 0x1e, 0x58,
-  0x72, 0x7c, 0xd9, 0x9b, 0xf9, 0x9b, 0x7a, 0x1e, 0x84, 0xcb, 0xe8, 0x9f,
-  0xb1, 0x29, 0x7d, 0xc3, 0xa3, 0xe6, 0x89, 0x12, 0xed, 0x52, 0xb2, 0x9d,
-  0x13, 0xc6, 0xa9, 0xfc, 0x00, 0x53, 0x70, 0x70, 0xfd, 0x5a, 0xc2, 0x13,
-  0x00, 0x68, 0x08, 0xa1
+  0xe8, 0x2f, 0xb2, 0xa3, 0xaa, 0xfd, 0x22, 0x52, 0x4f, 0xd5, 0x15, 0xb8,
+  0xb1, 0xa6, 0xf5, 0x30, 0x7f, 0x41, 0xb0, 0x94, 0x99, 0xc0, 0xbb, 0x2a,
+  0xdc, 0xa5, 0x49, 0x54, 0xa8, 0xce, 0x41, 0x06, 0x4f, 0xe3, 0x6c, 0xb4,
+  0xca, 0x3d, 0x7c, 0xe4, 0x4d, 0x32, 0x08, 0xcd, 0x9b, 0xd8, 0xdf, 0x6a,
+  0xa6, 0x48, 0xda, 0x5d, 0x7f, 0xf9, 0xff, 0x94, 0xd4, 0x7b, 0x96, 0x2d,
+  0x3b, 0x74, 0x9b, 0x5d, 0xf5, 0x1b, 0xdf, 0x5c, 0x30, 0x05, 0x91, 0xfd,
+  0x06, 0xc7, 0x08, 0x51, 0x34, 0xe0, 0x27, 0xf8, 0xa4, 0x96, 0x36, 0xa4,
+  0xd0, 0x2b, 0xb0, 0xbc, 0xc3, 0x61, 0xc6, 0xad, 0xda, 0xa4, 0x65, 0x11,
+  0x77, 0x67, 0x14, 0x0e, 0x58, 0xc6, 0xd6, 0x67, 0x5a, 0x2f, 0x4a, 0xa7,
+  0x17, 0xc3, 0x1d, 0xf2, 0x14, 0x24, 0xa6, 0xfe, 0xae, 0x84, 0x74, 0x64,
+  0xa9, 0x5d, 0xd8, 0x80, 0xf4, 0xc9, 0xae, 0x0c, 0x8e, 0x47, 0x3b, 0xe5,
+  0x3b, 0xb7, 0xde, 0x15, 0x79, 0x3c, 0x20, 0xda, 0xc9, 0x68, 0xf3, 0xf9,
+  0x29, 0x2c, 0xbb, 0x60, 0x17, 0xc3, 0x97, 0x3a, 0x5e, 0xb9, 0xac, 0xee,
+  0x65, 0x3e, 0xe3, 0xd1, 0xaf, 0x46, 0xf6, 0x81, 0x5b, 0xfc, 0x07, 0xe2,
+  0xea, 0x77, 0xdc, 0x14, 0x4e, 0x18, 0x10, 0x88, 0x34, 0x8f, 0x80, 0xb0,
+  0x46, 0x55, 0xb4, 0x3e, 0x18, 0x41, 0x11, 0x18, 0xbe, 0xc9, 0x7f, 0x3c,
+  0xf1, 0x81, 0x6d, 0x98, 0x13, 0x79, 0x8b, 0xd2, 0xad, 0x12, 0xba, 0xca,
+  0x22, 0xd6, 0x10, 0xd5, 0x82, 0x70, 0x70, 0xf9, 0x3c, 0x33, 0x1f, 0xbe,
+  0x21, 0xc8, 0x34, 0x91, 0x54, 0xb0, 0xdb, 0x30, 0x8d, 0xb2, 0x20, 0x87,
+  0xcf, 0xef, 0xb7, 0x98, 0xaf, 0x28, 0x2b, 0x51, 0xf1, 0x76, 0xdd, 0xe3,
+  0x46, 0x8f, 0xa2, 0xfe, 0xa2, 0x09, 0x83, 0x7f, 0xbf, 0xa0, 0x0b, 0xfa,
+  0x03, 0x58, 0xe0, 0xc7
+};
+
+static const uint8_t dP_4096[] = { /* key component dP, 256 bytes */
+  0x1b, 0x7f, 0xff, 0x06, 0x9e, 0x3d, 0x7a, 0xa7, 0x45, 0xac, 0x89, 0x16,
+  0xb3, 0x13, 0x45, 0xa6, 0x8f, 0xae, 0x56, 0x2b, 0x5a, 0xb1, 0x36, 0x06,
+  0xe5, 0xac, 0x8d, 0x37, 0xcd, 0x86, 0x6f, 0x34, 0x36, 0xab, 0x11, 0x30,
+  0x5f, 0x29, 0xd7, 0x88, 0x03, 0xdd, 0xd7, 0xe8, 0xb7, 0x2d, 0x52, 0x1d,
+  0x9c, 0x48, 0x1f, 0xc8, 0x6e, 0x2e, 0x81, 0x90, 0xbb, 0xaa, 0xee, 0xd5,
+  0x91, 0xc2, 0x5a, 0x55, 0xcd, 0x0e, 0xa9, 0x47, 0xdb, 0x5e, 0x6f, 0x0f,
+  0x6c, 0xf0, 0x64, 0xe7, 0xe5, 0x42, 0x0b, 0x7d, 0xc1, 0x6c, 0xaa, 0xb9,
+  0xf3, 0x99, 0x61, 0xd5, 0x3d, 0x66, 0x53, 0x7b, 0x1a, 0x8c, 0x08, 0x8d,
+  0xe7, 0xc4, 0x0c, 0xd3, 0x6e, 0xe9, 0x04, 0x29, 0xf3, 0xbe, 0x9f, 0x0b,
+  0x34, 0x1e, 0x13, 0x82, 0x3f, 0x08, 0x18, 0x81, 0xd3, 0x35, 0x06, 0xcd,
+  0xc4, 0xeb, 0x62, 0x17, 0x19, 0xe2, 0xe3, 0x0b, 0xce, 0x7e, 0x92, 0xa2,
+  0x86, 0x65, 0xf8, 0xd7, 0x74, 0x81, 0x4c, 0x1d, 0x04, 0xb1, 0x0e, 0xc2,
+  0x3e, 0x85, 0x68, 0x70, 0xd6, 0x74, 0xd3, 0xcb, 0x18, 0x74, 0xb8, 0x36,
+  0x0f, 0x91, 0x58, 0x8b, 0x60, 0xa0, 0xc6, 0xe6, 0x96, 0x3b, 0x92, 0x87,
+  0xb3, 0xac, 0x2c, 0x2b, 0xb6, 0xb6, 0x8d, 0x4a, 0x2e, 0xc7, 0x98, 0x35,
+  0x3e, 0x2a, 0x2e, 0x24, 0xec, 0xd6, 0x74, 0xb7, 0x39, 0x89, 0x87, 0x24,
+  0x4c, 0x3d, 0x42, 0x40, 0x2a, 0xff, 0x34, 0x30, 0x9b, 0x57, 0x6e, 0xe5,
+  0x8b, 0x76, 0xf6, 0x30, 0x37, 0x4a, 0xa9, 0x33, 0xa4, 0x30, 0x61, 0x6e,
+  0xaa, 0x1b, 0xd0, 0xfb, 0x47, 0x98, 0xd8, 0xe3, 0x8d, 0x89, 0xa5, 0x0d,
+  0x8e, 0x01, 0xaf, 0x69, 0x9a, 0x58, 0xe2, 0x7e, 0xae, 0x4e, 0x6b, 0xd3,
+  0x0f, 0xe4, 0xa4, 0xd6, 0xfe, 0xcb, 0x61, 0x2c, 0xbf, 0x61, 0xb0, 0x55,
+  0x31, 0x68, 0xe9, 0x97
+};
+
+static const uint8_t dQ_4096[] = { /* key component dQ, 256 bytes */
+  0x88, 0x36, 0xf3, 0x66, 0x71, 0x79, 0xf0, 0x18, 0xba, 0x1d, 0x18, 0x91,
+  0x32, 0x27, 0xf0, 0xd0, 0x72, 0xd7, 0xe6, 0xf0, 0x47, 0x03, 0x7a, 0xca,
+  0xba, 0x87, 0x7d, 0x6d, 0xdd, 0x5a, 0xa3, 0x6b, 0x40, 0x92, 0xfb, 0xc3,
+  0x54, 0xa2, 0x9e, 0x12, 0x91, 0xf7, 0x38, 0x92, 0xe7, 0x4b, 0x64, 0x46,
+  0xfd, 0x26, 0xe0, 0x74, 0xda, 0x0f, 0xa0, 0x91, 0x7f, 0xd6, 0xc1, 0x53,
+  0xe7, 0xfd, 0x90, 0xe8, 0x9e, 0x53, 0xab, 0xc6, 0x39, 0xa6, 0x0a, 0xef,
+  0x96, 0x7a, 0x4d, 0xb6, 0xd6, 0x7e, 0x6a, 0xf4, 0xc4, 0x1a, 0x1c, 0x14,
+  0xb4, 0xcb, 0xec, 0xf3, 0xd0, 0xec, 0x1b, 0xd3, 0x02, 0xe2, 0x4f, 0x28,
+  0xe0, 0x13, 0xe9, 0x00, 0x41, 0xb4, 0xe5, 0x33, 0xdd, 0x04, 0xc1, 0x97,
+  0x25, 0xa9, 0xa2, 0x77, 0xd2, 0xb9, 0x6d, 0xff, 0x1c, 0x03, 0x39, 0x05,
+  0x95, 0x17, 0x29, 0x5c, 0xfe, 0x3f, 0x13, 0x8c, 0xea, 0x2b, 0x80, 0x48,
+  0x0b, 0xb0, 0xe2, 0xe9, 0x56, 0x26, 0xa0, 0x5f, 0xba, 0xa9, 0x87, 0xf8,
+  0x34, 0xdf, 0xb9, 0x4d, 0xb6, 0xa3, 0x58, 0xa5, 0x35, 0xcd, 0x58, 0x56,
+  0xc3, 0xaf, 0x11, 0x98, 0x82, 0x6b, 0xef, 0x52, 0x14, 0xd4, 0xd7, 0x0b,
+  0x98, 0xe2, 0x98, 0x8a, 0x91, 0x06, 0x2d, 0x2c, 0xbb, 0x29, 0x35, 0x26,
+  0x35, 0x1d, 0x32, 0x90, 0xfb, 0x49, 0xb0, 0xee, 0x03, 0x7f, 0xd2, 0xd5,
+  0xbe, 0x19, 0x60, 0x62, 0x47, 0x8a, 0x97, 0x2d, 0x11, 0xbc, 0x5b, 0x39,
+  0x1b, 0x16, 0xda, 0xe9, 0x67, 0x8c, 0xef, 0xba, 0x48, 0x46, 0xf5, 0xe8,
+  0x65, 0x89, 0x3e, 0xcd, 0xc4, 0x11, 0xbd, 0x85, 0xce, 0x9b, 0x21, 0xda,
+  0x8b, 0x72, 0xe7, 0x12, 0xfc, 0x2f, 0x64, 0xba, 0xbe, 0x1e, 0x2e, 0x2e,
+  0x97, 0xc6, 0xcc, 0xa8, 0xf6, 0x06, 0xfe, 0xce, 0x83, 0x6d, 0x31, 0x99,
+  0x8b, 0x3d, 0x29, 0x21
 };
 
 static const uint8_t u_4096[] = { /* key component u, 256 bytes */
-  0x17, 0x6d, 0x50, 0x05, 0xa2, 0x81, 0x24, 0x76, 0xce, 0xe4, 0x5b, 0xad,
-  0xfd, 0x41, 0x05, 0xac, 0x59, 0xe9, 0x03, 0x22, 0x4c, 0x8e, 0x70, 0xe1,
-  0xee, 0xfb, 0x66, 0x29, 0xee, 0x8e, 0x9a, 0x59, 0x84, 0x6c, 0x07, 0x71,
-  0xbb, 0x3c, 0x78, 0xf1, 0xa0, 0x5a, 0x23, 0x18, 0x35, 0xf9, 0xc6, 0x4e,
-  0x58, 0x64, 0xc0, 0xba, 0xa0, 0x35, 0xe7, 0xf6, 0x62, 0x20, 0x35, 0x61,
-  0x4f, 0x2b, 0x20, 0x62, 0x90, 0xfb, 0x77, 0x52, 0x0e, 0xdc, 0x17, 0x02,
-  0x10, 0xc3, 0xe6, 0x0f, 0xdf, 0x71, 0xf2, 0x94, 0xe8, 0x4b, 0xc6, 0x63,
-  0x57, 0x60, 0x9b, 0x78, 0xdb, 0xf9, 0xac, 0x6b, 0xc2, 0x0b, 0xb7, 0x35,
-  0xa7, 0xf3, 0xdd, 0x5e, 0x28, 0xdc, 0xb3, 0xea, 0xd4, 0xe2, 0xf5, 0xc4,
-  0xbe, 0xa1, 0x8e, 0x53, 0x61, 0x74, 0x82, 0x2d, 0x1c, 0xb4, 0x91, 0x28,
-  0x24, 0x97, 0xb0, 0x28, 0xc8, 0x64, 0x12, 0x45, 0xb5, 0xc4, 0x70, 0x31,
-  0xcc, 0x87, 0x65, 0x93, 0x4c, 0x1a, 0x05, 0x6c, 0x99, 0x9d, 0x03, 0xf5,
-  0x3b, 0x8f, 0x80, 0x1a, 0xe4, 0x40, 0x77, 0x82, 0xc1, 0xb7, 0x6e, 0x22,
-  0x5e, 0x7a, 0x6e, 0x27, 0x57, 0xb9, 0x73, 0xd7, 0xc1, 0x4b, 0x41, 0x14,
-  0x8d, 0xbb, 0x29, 0x21, 0xd9, 0xa3, 0x43, 0x4d, 0x44, 0x41, 0xe3, 0x20,
-  0x0f, 0x6f, 0x71, 0x18, 0x64, 0xc5, 0xc9, 0x94, 0x94, 0x28, 0xb3, 0x4e,
-  0x62, 0xe7, 0x69, 0xf9, 0xca, 0xa5, 0xbe, 0x49, 0xd0, 0xf0, 0xef, 0x97,
-  0x4e, 0x6a, 0x93, 0x4b, 0xb5, 0xb1, 0x95, 0x75, 0xa1, 0xc6, 0xed, 0x58,
-  0x46, 0xf0, 0x27, 0x24, 0x24, 0x9b, 0x6d, 0x48, 0xc0, 0x74, 0x6c, 0x0d,
-  0x92, 0xb7, 0x50, 0xe2, 0x7a, 0xce, 0xac, 0x48, 0xcc, 0x6c, 0x3c, 0x2b,
-  0x77, 0x06, 0x67, 0x41, 0x8c, 0xd6, 0xce, 0x41, 0x0c, 0x33, 0x8e, 0x8b,
-  0x32, 0x74, 0x7c, 0x25
+  0xa8, 0xba, 0x71, 0xc4, 0x5d, 0xf5, 0xce, 0x37, 0xf6, 0xec, 0x56, 0xe3,
+  0xe4, 0x11, 0x8a, 0x3a, 0xd1, 0x97, 0xd9, 0xd2, 0x32, 0x61, 0xd6, 0x47,
+  0xae, 0x34, 0x10, 0x4c, 0x02, 0xe8, 0x08, 0x2a, 0x68, 0x58, 0x26, 0x42,
+  0x0c, 0x4a, 0x7f, 0x87, 0xbd, 0xd8, 0x7c, 0xfc, 0xe0, 0xa5, 0x58, 0x14,
+  0x08, 0xa9, 0x3c, 0x36, 0x00, 0x80, 0x53, 0x3a, 0x91, 0x8e, 0xe3, 0xfd,
+  0x2d, 0x2b, 0x99, 0xb3, 0xeb, 0x60, 0x60, 0x13, 0xc9, 0x79, 0x95, 0xfa,
+  0xe8, 0x30, 0x7e, 0x41, 0xfb, 0x79, 0xc7, 0x3d, 0x04, 0x85, 0x82, 0x8d,
+  0xdb, 0xd5, 0x5b, 0x26, 0xf8, 0x7d, 0x8e, 0xbe, 0xa9, 0x24, 0x70, 0xe7,
+  0x0b, 0x6f, 0x71, 0xfd, 0x83, 0xf5, 0x0b, 0x26, 0xb1, 0x2d, 0x79, 0x2f,
+  0x81, 0xd3, 0x32, 0x7f, 0x86, 0x96, 0x76, 0x0d, 0xdf, 0x56, 0x5d, 0x6b,
+  0x91, 0x60, 0xed, 0x32, 0xc8, 0xae, 0xe0, 0x03, 0x26, 0x78, 0x99, 0x78,
+  0x56, 0x1d, 0x23, 0x5d, 0x05, 0x44, 0x20, 0x93, 0x8b, 0x56, 0x1c, 0x43,
+  0x87, 0xec, 0x07, 0xe6, 0xfe, 0x86, 0xc4, 0xbb, 0x86, 0x03, 0xc7, 0x27,
+  0xfa, 0x2f, 0x43, 0xcf, 0xba, 0xfd, 0x3b, 0x7c, 0xf3, 0x67, 0x16, 0xe3,
+  0x30, 0x98, 0x21, 0x14, 0x8d, 0x3e, 0x9c, 0x65, 0x6a, 0x88, 0x47, 0xe3,
+  0xaa, 0xc5, 0x89, 0x29, 0x0b, 0x55, 0x07, 0x6c, 0x95, 0x00, 0x2d, 0xbd,
+  0xbb, 0xb3, 0x08, 0x9f, 0x42, 0x80, 0x71, 0x4f, 0x34, 0xb4, 0xe5, 0xaa,
+  0xe4, 0x89, 0xf8, 0x36, 0xd7, 0x0a, 0xae, 0x80, 0x28, 0x51, 0x22, 0x8a,
+  0x4e, 0xf7, 0x93, 0x0e, 0xf8, 0x54, 0x61, 0xe3, 0xdf, 0x81, 0x3c, 0x65,
+  0x66, 0xb4, 0xd8, 0x6b, 0x83, 0xe3, 0xbd, 0x2f, 0xaa, 0x09, 0xb5, 0x25,
+  0x72, 0x97, 0x34, 0x51, 0xd4, 0xf5, 0xd9, 0x14, 0x65, 0xdf, 0xf9, 0xd5,
+  0xed, 0x5f, 0xce, 0xca
 };
 
 static const uint8_t m_4096[] = { /* message to be signed, 512 bytes */
@@ -562,53 +658,53 @@ static const uint8_t m_4096[] = { /* message to be signed, 512 bytes */
 };
 
 static const uint8_t s_4096[] = { /* signed message, 512 bytes */
-  0x1f, 0xf4, 0x15, 0x31, 0x5b, 0x8c, 0x8f, 0xb4, 0xe1, 0x8c, 0x9e, 0x7b,
-  0x9d, 0x48, 0x3a, 0xa6, 0x3e, 0xd5, 0x86, 0x8e, 0x0e, 0xdc, 0x2f, 0x3c,
-  0xae, 0xfd, 0xda, 0xad, 0x6a, 0x6b, 0x3a, 0x73, 0xc9, 0xca, 0x69, 0x79,
-  0x85, 0x59, 0xbd, 0xd1, 0xca, 0x7b, 0xf5, 0xe2, 0xc4, 0x32, 0x98, 0xcb,
-  0x1e, 0x57, 0x20, 0x3c, 0xe8, 0xd7, 0x8d, 0x3a, 0x73, 0xd9, 0x44, 0xca,
-  0x3b, 0x38, 0x92, 0x7c, 0xb0, 0x7c, 0x38, 0x6a, 0x2d, 0xa9, 0x3e, 0xc3,
-  0x5e, 0x77, 0xf3, 0x5d, 0x43, 0x3b, 0xea, 0xff, 0x23, 0x2a, 0x13, 0x50,
-  0x8c, 0x1a, 0x72, 0xe1, 0xc8, 0x55, 0x53, 0x3d, 0xbb, 0xf9, 0x7f, 0x3f,
-  0xb6, 0xf7, 0xec, 0xd9, 0x64, 0x45, 0x8f, 0xc7, 0xf8, 0x9d, 0xb1, 0xcb,
-  0x84, 0xa1, 0x6d, 0xbf, 0x15, 0xa2, 0x4e, 0x32, 0xcf, 0xdd, 0x98, 0x72,
-  0xe2, 0xfd, 0x43, 0x1d, 0x44, 0xde, 0xed, 0xc5, 0x43, 0x76, 0xdd, 0xf9,
-  0x13, 0xb9, 0x5d, 0x30, 0xd0, 0x69, 0xda, 0x2a, 0xce, 0xd0, 0x79, 0x88,
-  0xcc, 0x94, 0x7f, 0x35, 0xdf, 0x30, 0xb7, 0x05, 0xa9, 0x54, 0x41, 0x0e,
-  0x8a, 0x0d, 0x56, 0xb2, 0xf7, 0x1b, 0xe8, 0xb2, 0xb8, 0xd2, 0xe5, 0x4b,
-  0x3d, 0x2a, 0x57, 0x27, 0x02, 0xe0, 0x69, 0xb7, 0x52, 0x8a, 0xb3, 0x39,
-  0x5e, 0xdb, 0x5f, 0x52, 0x09, 0x62, 0xe8, 0xf2, 0xdb, 0x50, 0x44, 0x00,
-  0x77, 0x8a, 0x49, 0x80, 0xee, 0xf7, 0xad, 0x99, 0xb4, 0x73, 0xd3, 0x01,
-  0xca, 0xae, 0x09, 0x9f, 0xad, 0xb0, 0x23, 0xb1, 0x5b, 0x5b, 0xed, 0x34,
-  0xb6, 0xbf, 0x71, 0x90, 0xeb, 0xa6, 0x31, 0x58, 0xe5, 0xce, 0xa5, 0x5a,
-  0x7c, 0x7c, 0x6a, 0x90, 0x34, 0x3f, 0x84, 0x16, 0x6c, 0x7c, 0xae, 0x1f,
-  0x00, 0xab, 0x6a, 0xe5, 0x09, 0x09, 0x83, 0xe8, 0xf0, 0x78, 0xfa, 0xe8,
-  0xe9, 0x81, 0xd0, 0x7f, 0xc4, 0x20, 0x70, 0x10, 0xcf, 0xd4, 0x0f, 0x0b,
-  0x0f, 0x50, 0x53, 0x15, 0x62, 0xf5, 0x68, 0xcf, 0x7f, 0x3b, 0xdd, 0x1d,
-  0x88, 0x7a, 0x9b, 0xea, 0x38, 0x89, 0x70, 0x69, 0x04, 0x0b, 0x54, 0xb3,
-  0xc7, 0x9c, 0x27, 0xe3, 0x51, 0xb8, 0xaf, 0x9d, 0xf8, 0xbf, 0xdd, 0x8d,
-  0x9f, 0xe2, 0x33, 0xd5, 0x32, 0x44, 0xd1, 0xae, 0xc3, 0x1e, 0x0f, 0xab,
-  0xcd, 0x41, 0x9a, 0x5f, 0x48, 0x51, 0xe9, 0x4e, 0x46, 0x89, 0xee, 0x53,
-  0xa4, 0x48, 0x36, 0xff, 0xfd, 0xfa, 0xd1, 0xd6, 0xa3, 0x5d, 0xc4, 0xb9,
-  0xbd, 0x87, 0x83, 0xcb, 0x6a, 0x00, 0x6d, 0x3c, 0x07, 0x3e, 0xd3, 0xf5,
-  0x87, 0xb2, 0xa1, 0x85, 0x13, 0x80, 0x59, 0xac, 0x58, 0x8e, 0xcf, 0xf3,
-  0x01, 0x42, 0x09, 0x6b, 0xed, 0x54, 0xbb, 0x82, 0xe6, 0xbb, 0xd9, 0xd2,
-  0xfa, 0x02, 0x90, 0x0f, 0x68, 0xff, 0xa8, 0x26, 0x14, 0x02, 0xc3, 0xf3,
-  0x39, 0xc4, 0xde, 0x7e, 0x66, 0x23, 0xfe, 0x2e, 0x9d, 0x13, 0xdb, 0xc8,
-  0x91, 0x4b, 0x54, 0x7b, 0x2b, 0x78, 0x8b, 0x2b, 0x4e, 0xef, 0x3d, 0x47,
-  0x8c, 0xd7, 0x60, 0x9f, 0x45, 0x26, 0xe6, 0x4e, 0x46, 0x9d, 0x35, 0x52,
-  0x81, 0x8f, 0xc6, 0xd7, 0x5a, 0x4e, 0x90, 0xc5, 0x1a, 0x69, 0x52, 0x40,
-  0x4b, 0x79, 0xef, 0xe7, 0x68, 0x26, 0xe2, 0xbb, 0x52, 0xa5, 0x78, 0xec,
-  0xe4, 0xfb, 0x32, 0xcb, 0x81, 0xad, 0xc0, 0x7b, 0xe4, 0x14, 0x12, 0x80,
-  0xa8, 0xb8, 0xea, 0xb3, 0xbb, 0x28, 0x74, 0x39, 0x89, 0xfa, 0x38, 0x3d,
-  0xa5, 0x8d, 0xfd, 0xb1, 0x3f, 0x20, 0xc1, 0x33, 0x33, 0xa9, 0xcf, 0x1c,
-  0xa1, 0xe6, 0x3a, 0x1e, 0x95, 0x46, 0x37, 0xbc, 0xdd, 0x94, 0x34, 0x53,
-  0x33, 0xef, 0x46, 0x72, 0xde, 0xc2, 0x87, 0xac, 0xe1, 0xfa, 0xb0, 0x67,
-  0xb6, 0xbe, 0x5c, 0x45, 0x78, 0xee, 0xa9, 0xa2
+  0xad, 0x46, 0xb3, 0x86, 0xb3, 0x3d, 0x13, 0xb7, 0x56, 0x0c, 0xbf, 0xd8,
+  0xfe, 0xf4, 0xf2, 0x0d, 0x2d, 0x5a, 0x28, 0xad, 0xb5, 0x43, 0x7b, 0x88,
+  0x5f, 0x01, 0xa4, 0x01, 0xd6, 0x28, 0x3b, 0x10, 0x0e, 0x22, 0x89, 0x11,
+  0xc4, 0x3e, 0xcf, 0xbb, 0xaf, 0xd6, 0x82, 0xd9, 0x51, 0xb1, 0x93, 0xd6,
+  0xc8, 0x7b, 0x89, 0xd4, 0x7a, 0xd1, 0xd0, 0x08, 0x39, 0x6b, 0x13, 0xb5,
+  0x55, 0x75, 0x61, 0xf3, 0xce, 0x47, 0x77, 0x01, 0x29, 0xee, 0x07, 0x5e,
+  0x4d, 0xdf, 0x83, 0x80, 0x18, 0x6d, 0xb8, 0x57, 0x14, 0x45, 0x81, 0x27,
+  0x1e, 0xe3, 0x2f, 0xdf, 0x0a, 0xba, 0x3b, 0x0f, 0x12, 0x07, 0xff, 0x7f,
+  0x35, 0x44, 0x75, 0xe3, 0xa8, 0x39, 0x25, 0x88, 0x3c, 0x32, 0x9e, 0x8a,
+  0xd6, 0xfa, 0x3f, 0x89, 0xa4, 0x6d, 0x8a, 0x9d, 0x3d, 0x75, 0x2c, 0x6f,
+  0x2a, 0x85, 0xd8, 0x96, 0x47, 0x4b, 0xde, 0x2a, 0x6b, 0x5e, 0xe1, 0x88,
+  0xcd, 0x37, 0xfb, 0x17, 0xe2, 0x84, 0x81, 0xe7, 0xa8, 0x7c, 0x47, 0x8e,
+  0x69, 0x69, 0x91, 0x37, 0x71, 0x97, 0x3f, 0xd1, 0x1a, 0x3e, 0x34, 0x84,
+  0x52, 0xe0, 0x08, 0x2c, 0x4c, 0xdc, 0x02, 0x11, 0x08, 0x30, 0xc9, 0xf5,
+  0x85, 0xc6, 0x6b, 0xba, 0x59, 0xc1, 0xf2, 0xc6, 0x7f, 0x8c, 0x4a, 0x57,
+  0xe5, 0x29, 0xa5, 0x0d, 0x60, 0x1a, 0x0e, 0xda, 0xd1, 0xac, 0xcc, 0x21,
+  0x20, 0x5c, 0xa0, 0x62, 0xf6, 0xc6, 0x4a, 0x92, 0xb2, 0x35, 0x9f, 0x62,
+  0x51, 0x4d, 0xcb, 0xd0, 0x35, 0x4e, 0xb2, 0xa3, 0x1b, 0xec, 0xd6, 0x18,
+  0xb4, 0x67, 0xb9, 0xf8, 0x5c, 0x80, 0xfc, 0x20, 0x05, 0x85, 0x8a, 0x5a,
+  0x35, 0x9a, 0xde, 0x2c, 0xd9, 0xde, 0x21, 0xfe, 0x9f, 0x92, 0x9f, 0xcb,
+  0xb8, 0xea, 0x56, 0xf9, 0xb7, 0x4f, 0x61, 0xf9, 0x20, 0x09, 0xfe, 0x78,
+  0x4b, 0x92, 0x90, 0x7a, 0xf9, 0xd0, 0x28, 0x95, 0x34, 0xc6, 0x5a, 0x9a,
+  0x2a, 0x2a, 0xb8, 0xab, 0x6a, 0x1a, 0xc1, 0xd7, 0x7d, 0x5c, 0xde, 0xd1,
+  0xaf, 0xe2, 0x20, 0x8d, 0x62, 0x56, 0x2c, 0x71, 0x78, 0x5b, 0x29, 0x20,
+  0x4b, 0xf0, 0xe9, 0xa4, 0xe2, 0x3f, 0xab, 0xa2, 0x77, 0xac, 0xdf, 0x6e,
+  0x2e, 0xc3, 0xa1, 0x4f, 0xe0, 0x30, 0xa7, 0xb7, 0x3a, 0x05, 0x13, 0x43,
+  0xc1, 0x64, 0xdd, 0xff, 0x96, 0x65, 0x4c, 0x40, 0x62, 0x4a, 0xff, 0xa3,
+  0xf0, 0x81, 0x26, 0x5d, 0x5f, 0x55, 0x73, 0xdb, 0x7d, 0xf8, 0x1f, 0x9c,
+  0x0a, 0x64, 0x93, 0x74, 0xf3, 0xeb, 0x3d, 0x6f, 0x68, 0xec, 0x85, 0x5a,
+  0xaa, 0x91, 0xb8, 0x5a, 0x36, 0x64, 0x89, 0x66, 0xb1, 0x53, 0xc5, 0xb8,
+  0x5d, 0x33, 0xf7, 0x60, 0xc2, 0x89, 0x36, 0xef, 0x0d, 0xc5, 0x58, 0x08,
+  0x75, 0x40, 0xae, 0x04, 0x87, 0x74, 0x1f, 0x11, 0x65, 0x1c, 0x84, 0xb6,
+  0x60, 0xa0, 0xae, 0xe2, 0x2e, 0x70, 0xbe, 0x6a, 0x5d, 0x76, 0x60, 0xaa,
+  0x41, 0xc5, 0x35, 0x09, 0xd3, 0x25, 0x5e, 0xd4, 0x7f, 0x22, 0x2b, 0xd7,
+  0x09, 0x38, 0xae, 0x59, 0xde, 0x55, 0x88, 0x52, 0xae, 0x30, 0xfc, 0xb8,
+  0x61, 0xdd, 0x7e, 0xc7, 0x1b, 0x37, 0xd5, 0x83, 0x28, 0x2a, 0x6e, 0x38,
+  0x01, 0xb5, 0xd4, 0x3f, 0x34, 0xb6, 0x37, 0xd5, 0xbf, 0x59, 0x6e, 0xb7,
+  0x16, 0x07, 0x96, 0x76, 0xe7, 0x84, 0x1b, 0x24, 0x59, 0x0b, 0x0a, 0x5c,
+  0x5b, 0xef, 0xae, 0xc7, 0x7d, 0x18, 0x7e, 0x7c, 0x1a, 0xd5, 0x24, 0x2e,
+  0xe9, 0x7f, 0x92, 0x3f, 0x4d, 0xd2, 0x0e, 0x44, 0xd1, 0x60, 0x73, 0xef,
+  0x9b, 0xb6, 0x43, 0x87, 0xdd, 0x43, 0x1c, 0xa2, 0x67, 0x3e, 0x80, 0x5f,
+  0x50, 0x6d, 0x5c, 0xb6, 0x90, 0xd5, 0x14, 0xce, 0xad, 0xbc, 0x2e, 0x39,
+  0x62, 0x96, 0xc3, 0x25, 0xec, 0xa4, 0xd8, 0xf2
 };
 
 typedef struct { const uint8_t *val; size_t len; } rsa_tc_bn_t;
-typedef struct { size_t size; rsa_tc_bn_t n, e, d, p, q, u, m, s; } rsa_tc_t;
+typedef struct { size_t size; rsa_tc_bn_t n, e, d, p, q, dP, dQ, u, m, s; } rsa_tc_t;
 
 static const rsa_tc_t rsa_tc[] = {
   { 1024,
@@ -617,6 +713,8 @@ static const rsa_tc_t rsa_tc[] = {
     { d_1024, sizeof(d_1024) },
     { p_1024, sizeof(p_1024) },
     { q_1024, sizeof(q_1024) },
+    { dP_1024, sizeof(dP_1024) },
+    { dQ_1024, sizeof(dQ_1024) },
     { u_1024, sizeof(u_1024) },
     { m_1024, sizeof(m_1024) },
     { s_1024, sizeof(s_1024) }
@@ -627,6 +725,8 @@ static const rsa_tc_t rsa_tc[] = {
     { d_2048, sizeof(d_2048) },
     { p_2048, sizeof(p_2048) },
     { q_2048, sizeof(q_2048) },
+    { dP_2048, sizeof(dP_2048) },
+    { dQ_2048, sizeof(dQ_2048) },
     { u_2048, sizeof(u_2048) },
     { m_2048, sizeof(m_2048) },
     { s_2048, sizeof(s_2048) }
@@ -637,6 +737,8 @@ static const rsa_tc_t rsa_tc[] = {
     { d_4096, sizeof(d_4096) },
     { p_4096, sizeof(p_4096) },
     { q_4096, sizeof(q_4096) },
+    { dP_4096, sizeof(dP_4096) },
+    { dQ_4096, sizeof(dQ_4096) },
     { u_4096, sizeof(u_4096) },
     { m_4096, sizeof(m_4096) },
     { s_4096, sizeof(s_4096) }
diff --git a/tests/test-rsa.py b/tests/test-rsa.py
index 3824276..8f3f8b5 100644
--- a/tests/test-rsa.py
+++ b/tests/test-rsa.py
@@ -36,7 +36,7 @@ from argparse                           import ArgumentParser, FileType
 from Crypto                             import __version__ as PyCryptoVersion
 from Crypto.PublicKey                   import RSA
 from Crypto.Hash                        import SHA256
-from Crypto.Util.number                 import long_to_bytes
+from Crypto.Util.number                 import long_to_bytes, inverse
 from Crypto.Signature.PKCS1_v1_5        import EMSA_PKCS1_V1_5_ENCODE, PKCS115_SigScheme
 from textwrap                           import TextWrapper
 import sys, os.path
@@ -101,6 +101,8 @@ printlines("/*",
            plaintext  = plaintext,
            digest     = h.hexdigest())
 
+fields = ("n", "e", "d", "p", "q", "dP", "dQ", "u", "m", "s")
+
 for k_len in args.key_lengths:
 
   k = RSA.generate(k_len)       # Cryptlib insists u < p, probably with good reason,
@@ -123,14 +125,29 @@ for k_len in args.key_lengths:
              "*/", "",
              k_len = k_len, pkcs  = args.pkcs_encoding)
 
-  for component in k.keydata:
-    print_hex("%s_%d" % (component, k_len),
-              long_to_bytes(getattr(k, component), blocksize = blocksize),
-              "key component %s" % component)
+  # PyCrypto doesn't precalculate dP or dQ, and for some reason it
+  # does u backwards (uses (1/p % q) and swaps the roles of p and q in
+  # the CRT calculation to compensate), so we just calculate our own.
+
+  for name in fields:
+    if name in "ms":
+      continue
+    elif name == "dP":
+      value = k.d % (k.p - 1)
+    elif name == "dQ":
+      value = k.d % (k.q - 1)
+    elif name == "u":
+      value = inverse(k.q, k.p)
+    else:
+      value = getattr(k, name)
+
+    print_hex("%s_%d" % (name, k_len),
+              long_to_bytes(value, blocksize = blocksize),
+              "key component %s" % name)
+
   print_hex("m_%d" % k_len, pad_to_blocksize(m, blocksize), "message to be signed")
   print_hex("s_%d" % k_len, pad_to_blocksize(s, blocksize), "signed message")
 
-fields = "nedpqums"
 printlines("typedef struct { const uint8_t *val; size_t len; } rsa_tc_bn_t;",
            "typedef struct { size_t size; rsa_tc_bn_t %(fields)s; } rsa_tc_t;",
            "",



More information about the Commits mailing list