Merge pull request #173 from SparkiDev/sp_rsa4096

Add RSA and DH samples
pull/179/head
David Garske 2019-11-26 08:12:13 -08:00 committed by GitHub
commit e9e7e93286
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 1166 additions and 0 deletions

2
.gitignore vendored
View File

@ -175,6 +175,8 @@ pk/ecc/*.x963
pk/ED25519/gen_key_files
pk/ED25519/sign_and_verify
pk/ecdh_generate_secret/ecdh_gen_secret
pk/rsa-kg/rsa-kg-sv
pk/dh-pg/dh-pg-ka
wolfCLU/tests/somejunk/*somejunk*.txt

16
pk/dh-pg/Makefile 100644
View File

@ -0,0 +1,16 @@
CC=gcc
CFLAGS=-Wall
LIBS= -lwolfssl -lm
all: dh-pg-ka
dh-pg-ka.o: dh-pg-ka.c dh-params.h
$(CC) -c -o $@ $< $(CFLAGS)
dh-pg-ka: dh-pg-ka.o
$(CC) -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f *.o dh-pg-ka

23
pk/dh-pg/README 100644
View File

@ -0,0 +1,23 @@
How to use dh-pg-ka.c
1) a. Compile wolfSSL with ./configure --enable-keygen, run
'make', and then install by typing 'sudo make install'.
NOTE: optionally compile with:
C_EXTRA_FLAGS="-DHAVE_FFDHE_2048 -DHAVE_FFDHE_3072 -DHAVE_FFDHE_4096"
b. In the pk/dh-pg directory run the Makefile by typing 'make'.
2) run the executable, for help run with -help. Basic command is as follows:
./dh-pg-ka <options>
Parameter sizes supported, in bits: 2048, 3072, 4096.
With option -ffdhe, use the pre-defined standardized FFDHE parameters.
NOTE: no parameters will be generated.
With option -load, use the parameters in: dh-param.h
NOTE: on error, the parameters will be displayed so that they can be
copied into dh-params.h replacing the existing values.
Note: 4096-bit parameters cannot be generated - not supported by wolfSSL.
4) Running 'make clean' will delete the executable and object files.

View File

@ -0,0 +1,96 @@
/* dh-params.h
*
* Copyright (C) 2006-2019 wolfSSL Inc.
*
* This file is part of wolfSSL. (formerly known as CyaSSL)
*
* wolfSSL is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* wolfSSL is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
static unsigned char dh_p[256] = {
0xca, 0x6f, 0xef, 0x16, 0xb0, 0x23, 0x49, 0x4a,
0x80, 0x73, 0x3e, 0xea, 0xbe, 0x4a, 0x32, 0x4d,
0x84, 0x89, 0x76, 0xd6, 0xba, 0xaa, 0x9e, 0x14,
0x0a, 0xe2, 0x04, 0xd9, 0xdf, 0x82, 0x71, 0xe3,
0xcb, 0xdf, 0x3d, 0x8e, 0x0f, 0x2f, 0xc7, 0xe4,
0x8f, 0x5f, 0x9b, 0x9d, 0xa8, 0x53, 0x8d, 0x4b,
0x2f, 0x07, 0xe2, 0x74, 0x9e, 0x69, 0xff, 0x76,
0xfb, 0x84, 0x04, 0xa3, 0x7a, 0x08, 0x45, 0x01,
0x66, 0x68, 0xd6, 0x70, 0x41, 0x9b, 0x5d, 0x74,
0xa8, 0x13, 0x17, 0x6b, 0x28, 0x6e, 0x88, 0x04,
0xfe, 0x60, 0xc3, 0xb2, 0xf4, 0x79, 0x6a, 0xba,
0xcf, 0x55, 0xab, 0x36, 0xd6, 0xa7, 0xb6, 0x92,
0x7e, 0x2a, 0x02, 0x60, 0x55, 0xd5, 0xf5, 0xf2,
0x8c, 0x68, 0xd0, 0xf2, 0x0a, 0xe0, 0xa4, 0xfd,
0xca, 0x52, 0xb2, 0xc7, 0x10, 0x51, 0x8e, 0x74,
0x80, 0xea, 0xc1, 0xd5, 0xc5, 0xf8, 0x7c, 0xf9,
0x89, 0x1e, 0xf8, 0x3c, 0xcd, 0xd6, 0xaf, 0x46,
0x56, 0x0c, 0xf7, 0xee, 0x0f, 0x09, 0xa1, 0x01,
0x24, 0x35, 0x39, 0x06, 0x87, 0x90, 0xd3, 0x6c,
0x69, 0x77, 0x1a, 0xe0, 0x35, 0x28, 0xdf, 0x46,
0xc1, 0xda, 0xe6, 0x2c, 0x4b, 0xff, 0xf5, 0x05,
0x1b, 0x58, 0x2a, 0x41, 0x77, 0xd1, 0xa9, 0x8c,
0x4a, 0x37, 0x90, 0x67, 0xbb, 0xeb, 0x0f, 0x3e,
0x4c, 0x42, 0xff, 0xce, 0xf8, 0xad, 0x49, 0x2f,
0x6c, 0x2e, 0xcd, 0x7f, 0xd5, 0x07, 0x29, 0xe9,
0xf3, 0xa3, 0x3c, 0xeb, 0x54, 0x75, 0x71, 0x20,
0xb1, 0xea, 0x8d, 0x61, 0x9b, 0x53, 0x2b, 0xa6,
0xf0, 0x08, 0xab, 0xca, 0x32, 0xa0, 0x8a, 0xd0,
0x24, 0x59, 0xb5, 0x23, 0xd8, 0x42, 0x95, 0xf4,
0xf6, 0xfc, 0x50, 0xb1, 0x55, 0x01, 0xef, 0x5d,
0x0d, 0xa8, 0xfe, 0xcb, 0xee, 0x97, 0xcf, 0xc8,
0x9f, 0x36, 0xa1, 0x6c, 0xbb, 0x17, 0x4f, 0x9d,
};
static unsigned char dh_g[256] = {
0xa0, 0x60, 0xb7, 0x80, 0x4a, 0x40, 0x0f, 0x64,
0x4a, 0xd3, 0xf7, 0xb4, 0x14, 0xd3, 0x04, 0x1f,
0x6c, 0x45, 0x9a, 0xd6, 0x17, 0x57, 0x35, 0xce,
0x13, 0xfe, 0x02, 0x9c, 0xd2, 0x8f, 0xb6, 0x5f,
0x72, 0x97, 0xf5, 0x5f, 0x31, 0x1c, 0x63, 0x90,
0x06, 0x85, 0xa1, 0x74, 0x51, 0xeb, 0x7e, 0xd5,
0x43, 0xa2, 0x86, 0x91, 0x4d, 0x3b, 0x02, 0x12,
0x2d, 0x37, 0xc2, 0x36, 0x49, 0x60, 0xc3, 0xe6,
0x6e, 0x0d, 0xe2, 0xa7, 0x2f, 0x96, 0x21, 0x37,
0x23, 0xa0, 0x1c, 0x6a, 0x87, 0xda, 0x07, 0x1b,
0xaa, 0xd2, 0xfe, 0x38, 0xbf, 0xde, 0x09, 0x9e,
0x79, 0x80, 0xfc, 0x21, 0x79, 0x39, 0x31, 0xf1,
0xf5, 0x34, 0xda, 0x09, 0x1a, 0xac, 0xdb, 0xc4,
0x28, 0xd8, 0x8e, 0xf1, 0xbf, 0x7e, 0xbf, 0xfc,
0xbe, 0x4b, 0x52, 0xd4, 0xc0, 0x6b, 0xaf, 0x73,
0xaa, 0xa3, 0xce, 0x16, 0xc3, 0xe0, 0xf3, 0xa7,
0xc2, 0xeb, 0x6e, 0x7a, 0x41, 0x97, 0x25, 0x76,
0x6b, 0xcc, 0x19, 0x35, 0xbd, 0xfc, 0x51, 0x2b,
0xec, 0x1d, 0x28, 0x69, 0x7e, 0x97, 0x40, 0xe2,
0x78, 0xbd, 0x22, 0xb9, 0x64, 0x1b, 0x01, 0xec,
0xd6, 0xf2, 0x89, 0x86, 0x63, 0x70, 0xb5, 0x31,
0xa1, 0x9d, 0xa1, 0xc1, 0xa6, 0x15, 0xdf, 0x8a,
0xf4, 0xc9, 0xbe, 0xc9, 0xbe, 0x93, 0x83, 0x5b,
0x86, 0x7f, 0xe0, 0x1b, 0xf8, 0xf6, 0x6f, 0x37,
0xe0, 0x1b, 0x8d, 0x49, 0x97, 0x82, 0xe2, 0x90,
0xf6, 0x50, 0x11, 0x86, 0x05, 0xe7, 0x46, 0x83,
0xa6, 0xa2, 0xd7, 0xfe, 0xbe, 0xef, 0x04, 0xc7,
0x48, 0x9f, 0xa2, 0xa5, 0xf8, 0xaa, 0xc1, 0x13,
0x8f, 0xab, 0x10, 0x72, 0x43, 0x2f, 0x58, 0x45,
0xbf, 0x43, 0xef, 0xb4, 0x85, 0x77, 0x62, 0x4f,
0x28, 0xc8, 0x2d, 0xfd, 0x47, 0x9e, 0x9a, 0x33,
0x84, 0xe0, 0x36, 0x95, 0xf1, 0x56, 0x59, 0x12,
};
static unsigned char dh_q[32] = {
0xde, 0x31, 0xf0, 0xd0, 0x3e, 0x4a, 0x2e, 0xea,
0xe4, 0x92, 0x2b, 0x7b, 0xf9, 0x9f, 0x02, 0xbd,
0xde, 0x06, 0x1f, 0xe6, 0xab, 0x0c, 0xee, 0x34,
0x00, 0x0c, 0x82, 0x81, 0x0b, 0xde, 0x03, 0x27,
};

441
pk/dh-pg/dh-pg-ka.c 100644
View File

@ -0,0 +1,441 @@
/* dh-pg-ka.c
*
* Copyright (C) 2006-2019 wolfSSL Inc.
*
* This file is part of wolfSSL. (formerly known as CyaSSL)
*
* wolfSSL is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* wolfSSL is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdio.h>
#include <wolfssl/options.h>
#include <wolfssl/wolfcrypt/dh.h>
#include "dh-params.h"
#define MAX_DH_BITS 4096
#define MAX_DH_Q_SIZE 256
#define DEF_DH_SIZE 2048
#define DEF_KA_CHECKS 512
#define DEF_PARAMS_GEN 8
int load_dh_params(DhKey* key1, DhKey* key2, WC_RNG* rng)
{
int ret;
ret = wc_DhSetCheckKey(key1, dh_p, sizeof(dh_p), dh_g, sizeof(dh_g),
dh_q, sizeof(dh_q), 0, rng);
if (ret == 0) {
ret = wc_DhSetCheckKey(key2, dh_p, sizeof(dh_p), dh_g, sizeof(dh_g),
NULL, 0, 0, rng);
}
return ret;
}
/* Print the buffer as bytes */
void print_data(char *name, unsigned char *data, int len)
{
int i;
printf("static unsigned char %s[%d] = {\n", name, len);
for (i = 0; i < len; i++) {
if ((i & 7) == 0) {
printf(" ");
}
printf("0x%02x, ", data[i]);
if ((i & 7) == 7) {
printf("\n");
}
}
if ((i & 7) != 0) {
printf("\n");
}
printf("};\n");
}
/* Print the DH parameters */
void print_dh(DhKey *key)
{
int ret;
static unsigned char p[MAX_DH_BITS/8];
static unsigned char g[MAX_DH_BITS/8];
static unsigned char q[MAX_DH_Q_SIZE/8];
word32 p_len, g_len, q_len;
/* Export the DH parameters */
p_len = sizeof(p);
g_len = sizeof(g);
q_len = sizeof(q);
ret = wc_DhExportParamsRaw(key, p, &p_len, q, &q_len, g, &g_len);
if (ret != 0) {
fprintf(stderr, "Failed to export parameters\n");
return;
}
/* Print out parameters. */
printf("\n");
print_data("dh_p", p, p_len);
print_data("dh_g", g, g_len);
print_data("dh_q", q, q_len);
}
/* Show usage information */
void usage()
{
fprintf(stderr, "dh-pg-ka <options>:\n");
fprintf(stderr, " -load Load the parameters\n");
fprintf(stderr, " -bits <num> Size in bits of RSA keys\n");
fprintf(stderr, " -num-gen <num> Number of params to generate\n");
fprintf(stderr, " -checks <num> Number of key exchanges to do\n");
fprintf(stderr, " -ffdhe Used pre-defined FFDHE params\n");
fprintf(stderr, "\n");
}
int main(int argc, char *argv[])
{
int ec = 0;
int ret;
static DhKey key1, key2;
const DhParams *dhparams;
WC_RNG rng;
static unsigned char p[MAX_DH_BITS/8];
static unsigned char g[MAX_DH_BITS/8];
static unsigned char q[MAX_DH_Q_SIZE/8];
word32 p_len, g_len, q_len;
static unsigned char priv1[MAX_DH_BITS/8];
static unsigned char priv2[MAX_DH_BITS/8];
word32 priv1_len, priv2_len;
static unsigned char pub1[MAX_DH_BITS/8];
static unsigned char pub2[MAX_DH_BITS/8];
word32 pub1_len, pub2_len;
static unsigned char secret1[MAX_DH_BITS/8];
static unsigned char secret2[MAX_DH_BITS/8];
word32 secret1_len, secret2_len;
int i, cnt;
int bits = DEF_DH_SIZE;
int numParams = DEF_PARAMS_GEN;
int checks = DEF_KA_CHECKS;
int gen_params = 1;
int load_params = 0;
/* Skip the program name */
--argc;
++argv;
/* Process the command line arguments */
while (argc > 0) {
/* Load the parameters from dh-params.h */
if (XSTRNCMP(*argv, "-load", 7) == 0) {
load_params = 1;
gen_params = 0;
}
/* Number of bits in DH parameters to generate */
else if (XSTRNCMP(*argv, "-bits", 6) == 0) {
++argv;
if (--argc == 0) {
fprintf(stderr, "Missing bits value\n");
usage();
return 1;
}
bits = atoi(*argv);
}
/* Number of DH parameters to generate */
else if (XSTRNCMP(*argv, "-num-gen", 9) == 0) {
++argv;
if (--argc == 0) {
fprintf(stderr, "Missing loops value\n");
usage();
return 1;
}
numParams = atoi(*argv);
}
/* Number of key agreement checks to perform */
else if (XSTRNCMP(*argv, "-checks", 7) == 0) {
++argv;
if (--argc == 0) {
fprintf(stderr, "Missing check count value\n");
usage();
return 1;
}
checks = atoi(*argv);
}
/* Use the pre-defined FFDHE parameters */
else if (XSTRNCMP(*argv, "-ffdhe", 7) == 0) {
gen_params = 0;
}
/* Display usage information */
else if (XSTRNCMP(*argv, "-help", 6) == 0) {
usage();
return 0;
}
else {
fprintf(stderr, "Unrecognized option: %s\n", *argv);
usage();
return 1;
}
--argc;
++argv;
}
/* Check bits are valid */
if (bits != 1024 && bits != 2048 && bits != 3072 && bits != 4096) {
fprintf(stderr, "Bits out of range (1024, 2048, 3072 or 4086): %d\n",
bits);
usage();
return 1;
}
#ifdef WOLFSSL_SP_MATH
if (0) {
}
#ifndef WOLFSSL_SP_NO_2048
else if (bits == 2048) {
}
#endif
#ifndef WOLFSSL_SP_NO_3072
else if (bits == 3072) {
}
#endif
#ifdef WOLFSSL_SP_4096
else if (bits == 4096) {
}
#endif
else {
fprintf(stderr, "Bit size not supported with SP_MATH: %d\n", bits);
fprintf(stderr, " wolfSSL compiled to support, in bits:");
#ifndef WOLFSSL_SP_NO_2048
fprintf(stderr, " 2048");
#endif
#ifndef WOLFSSL_SP_NO_3072
fprintf(stderr, " 3072");
#endif
#ifdef WOLFSSL_SP_4096
fprintf(stderr, " 4096");
#endif
fprintf(stderr, "\n");
return 1;
}
#endif
if (bits > MAX_DH_BITS) {
fprintf(stderr, "Program isn't supporting bit sizes greater than %d\n",
MAX_DH_BITS);
return 1;
}
/* Only dping one set of parameters unless generating */
if (!gen_params) {
numParams = 1;
}
if (gen_params) {
/* Check valid bits for DH parameter generation */
if (bits == 4096) {
fprintf(stderr, "4096-bit parameter generation not supported\n");
return 1;
}
}
else if (load_params) {
/* Nothing to do */
}
#ifdef HAVE_FFDHE_2048
else if (bits == 2048) {
/* Set FFDHE-2048 */
dhparams = wc_Dh_ffdhe2048_Get();
}
#endif
#ifdef HAVE_FFDHE_3072
else if (bits == 3072) {
/* Set FFDHE-3072 */
dhparams = wc_Dh_ffdhe3072_Get();
}
#endif
#ifdef HAVE_FFDHE_4096
else if (bits == 4096) {
/* Set FFDHE-4096 */
dhparams = wc_Dh_ffdhe4096_Get();
}
#endif
else {
/* Set FFDHE size not supported */
fprintf(stderr, "Unsupported FFDHE parameters: %d\n", bits);
return 1;
}
/* Display the options to use */
if (gen_params) {
printf("Bits: %d\n", bits);
printf("#Params: %d\n", numParams);
}
else if (!load_params) {
printf("FFHDE: %d\n", bits);
}
else {
printf("Load parameters\n");
}
printf("Checks: %d\n", checks);
/* Initialise a random number generator for generation */
ret = wc_InitRng(&rng);
if (ret != 0) {
fprintf(stderr, "Failed to initialize random\n");
return 1;
}
/* Initialise DH key */
ret = wc_InitDhKey(&key1);
if (ret != 0) {
wc_FreeRng(&rng);
fprintf(stderr, "Failed to initialize DH key\n");
return 1;
}
/* Initialise DH key for key agreement */
ret = wc_InitDhKey(&key2);
if (ret != 0) {
wc_FreeDhKey(&key1);
wc_FreeRng(&rng);
fprintf(stderr, "Failed to initialize DH key\n");
return 1;
}
/* Perform operations for specified number of parameters */
for (cnt = 0; cnt < numParams; cnt++) {
if (gen_params) {
fprintf(stderr, "%d: ", cnt + 1);
/* Generate a set of DH parameters */
ret = wc_DhGenerateParams(&rng, bits, &key1);
if (ret != 0) {
fprintf(stderr, "Failed to generate DH params\n");
fprintf(stderr, "%d\n", ret);
ec = 1;
break;
}
/* Export DH parameters */
p_len = sizeof(p);
q_len = sizeof(q);
g_len = sizeof(g);
ret = wc_DhExportParamsRaw(&key1, p, &p_len, q, &q_len, g, &g_len);
if (ret != 0) {
fprintf(stderr, "Failed to export DH params\n");
ec = 1;
break;
}
/* Set only p and g and check key */
ret = wc_DhSetCheckKey(&key2, p, p_len, g, g_len, NULL, 0, 0, &rng);
if (ret != 0) {
fprintf(stderr, "Failed to set/check DH params\n");
ec = 1;
break;
}
}
else if (!load_params) {
/* Set p and g - trust key */
ret = wc_DhSetCheckKey(&key2, dhparams->p, dhparams->p_len,
dhparams->g, dhparams->g_len, NULL, 0, 1,
&rng);
if (ret != 0) {
fprintf(stderr, "Failed to set/check DH params\n");
ec = 1;
break;
}
}
else {
/* Set p and g - trust key */
ret = load_dh_params(&key1, &key2, &rng);
if (ret != 0) {
fprintf(stderr, "Failed to load DH params\n");
ec = 1;
break;
}
}
/* Perform a number of key agreements with parameters */
for (i = 0; i < checks; i++) {
/* Generate first peer's key */
priv1_len = sizeof(priv1);
pub1_len = sizeof(pub1);
ret = wc_DhGenerateKeyPair(&key2, &rng, priv1, &priv1_len, pub1,
&pub1_len);
if (ret != 0) {
fprintf(stderr, "Failed to generate key pair\n");
print_dh(&key1);
ec = 1;
break;
}
/* Generate second peer's key */
priv2_len = sizeof(priv2);
pub2_len = sizeof(pub2);
ret = wc_DhGenerateKeyPair(&key2, &rng, priv2, &priv2_len, pub2,
&pub2_len);
if (ret != 0) {
fprintf(stderr, "Failed to generate key pair\n");
print_dh(&key1);
ec = 1;
break;
}
/* Calculate first peer's secret */
secret1_len = sizeof(secret1);
ret = wc_DhAgree(&key2, secret1, &secret1_len, priv1, priv1_len,
pub2, pub2_len);
if (ret != 0) {
fprintf(stderr, "Failed to calculate secret\n");
print_dh(&key1);
ec = 1;
break;
}
/* Calculate second peer's secret */
secret2_len = sizeof(secret2);
ret = wc_DhAgree(&key2, secret2, &secret2_len, priv2, priv2_len,
pub1, pub1_len);
if (ret != 0) {
fprintf(stderr, "Failed to calculate secret\n");
print_dh(&key1);
ec = 1;
break;
}
/* Secret's should be the same */
if ((secret1_len != secret2_len) || (XMEMCMP(secret1, secret2,
secret1_len) != 0)) {
fprintf(stderr, "Secrets different\n");
print_dh(&key1);
ec = 1;
break;
}
fprintf(stderr, ".");
}
/* Error during key generation or key agreement */
if (ec) {
break;
}
fprintf(stderr, "\n");
}
/* Free allocated items */
wc_FreeDhKey(&key1);
wc_FreeDhKey(&key1);
wc_FreeRng(&rng);
return 0;
}

16
pk/rsa-kg/Makefile 100644
View File

@ -0,0 +1,16 @@
CC=gcc
CFLAGS=-Wall
LIBS= -lwolfssl -lm
all: rsa-kg-sv
rsa-kg-sv.o: rsa-kg-sv.c rsa-key.h
$(CC) -c -o $@ $< $(CFLAGS)
rsa-kg-sv: rsa-kg-sv.o
$(CC) -o $@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f *.o rsa-kg-sv

18
pk/rsa-kg/README 100644
View File

@ -0,0 +1,18 @@
How to use rsa-kg-sv.c
1) a. Compile wolfSSL with ./configure --enable-keygen, run
'make', and then install by typing 'sudo make install'.
b. In the pk/rsa-kg directory run the Makefile by typing 'make'.
2) run the executable, for help run with -help. Basic command is as follows:
./rsa-kg-sv <options>
Key sizes supported, in bits: 1024-4096.
With option -load-key, use the key in: rsa-key.h
NOTE: on error, the key and digest will be displayed so that they can be
copied into rsa-key.h replacing the existing values.
4) Running 'make clean' will delete the executable and object files.

184
pk/rsa-kg/rsa-key.h 100644
View File

@ -0,0 +1,184 @@
/* rsa-key.h
*
* Copyright (C) 2006-2019 wolfSSL Inc.
*
* This file is part of wolfSSL. (formerly known as CyaSSL)
*
* wolfSSL is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* wolfSSL is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
static unsigned char rsa_priv_key[1191] = {
0x30, 0x82, 0x04, 0xa3, 0x02, 0x01, 0x00, 0x02,
0x82, 0x01, 0x01, 0x00, 0xc8, 0xb0, 0xb8, 0x68,
0x56, 0x15, 0xea, 0x1c, 0x38, 0x55, 0xb1, 0x4f,
0xc4, 0x72, 0x13, 0xc3, 0x75, 0xb8, 0x4e, 0xf4,
0x11, 0x3e, 0xcd, 0x89, 0xbf, 0x79, 0x1b, 0x5d,
0x3c, 0xdd, 0x09, 0x8d, 0x09, 0x3d, 0x63, 0x86,
0x87, 0xc4, 0x06, 0x21, 0x69, 0xe3, 0xf2, 0x8a,
0x57, 0x2a, 0xc3, 0x9d, 0x28, 0x57, 0xc6, 0x31,
0xcd, 0xee, 0xda, 0x6d, 0x02, 0x6e, 0x9a, 0x5b,
0x1e, 0x6c, 0x28, 0x07, 0x62, 0x90, 0x79, 0x91,
0x7a, 0x8d, 0x3a, 0x1e, 0x23, 0x9a, 0x3f, 0xc0,
0x8d, 0xe2, 0x67, 0x85, 0x2c, 0x06, 0xa1, 0xd2,
0xb8, 0x3b, 0xf0, 0x18, 0x39, 0xc2, 0xcf, 0xe7,
0x85, 0x54, 0xc3, 0x5a, 0x81, 0x58, 0xea, 0x7c,
0x17, 0xc9, 0xc1, 0x2b, 0xae, 0xb9, 0xeb, 0xef,
0x88, 0x9e, 0x1d, 0x74, 0xe9, 0x72, 0xd7, 0xe1,
0xcd, 0xc5, 0x27, 0x9d, 0xae, 0x55, 0x1c, 0x92,
0xdb, 0x08, 0x6f, 0xf0, 0x7e, 0x44, 0x74, 0xc0,
0xb6, 0xe5, 0xb0, 0xbf, 0x41, 0x23, 0x09, 0x3d,
0xd7, 0x04, 0x5b, 0x23, 0xef, 0x3e, 0xe1, 0x3a,
0xc8, 0xad, 0xcd, 0x55, 0xa6, 0x3a, 0x13, 0x43,
0x35, 0x25, 0xba, 0x45, 0xc7, 0x27, 0xfc, 0xc2,
0xd9, 0x86, 0x78, 0x06, 0x5e, 0xdf, 0x6d, 0xe1,
0x17, 0x56, 0xe4, 0x0f, 0x39, 0x52, 0x2d, 0x69,
0x7b, 0x8d, 0x7f, 0xbb, 0x57, 0xba, 0xe3, 0xa3,
0xab, 0x0d, 0xdb, 0xd6, 0xaf, 0x02, 0xd9, 0xe4,
0x5c, 0x4f, 0xa1, 0x00, 0x21, 0x47, 0x30, 0x04,
0xc0, 0x9b, 0x57, 0x1f, 0xcf, 0x64, 0x6d, 0xff,
0x14, 0x1a, 0xa2, 0x17, 0x13, 0xd8, 0x99, 0xae,
0x02, 0x3f, 0x30, 0x22, 0x29, 0xb9, 0x01, 0xe7,
0xfd, 0xf8, 0x08, 0x1c, 0x43, 0xd2, 0xc4, 0x74,
0x48, 0xcb, 0x9d, 0x66, 0x4a, 0x04, 0xb9, 0x45,
0xd5, 0x5c, 0x74, 0xc2, 0x34, 0xf3, 0xc6, 0xc6,
0xc3, 0x76, 0xd4, 0x8f, 0x02, 0x03, 0x01, 0x00,
0x01, 0x02, 0x82, 0x01, 0x00, 0x1b, 0x90, 0x10,
0x80, 0xf2, 0x93, 0x1c, 0xed, 0x96, 0x46, 0x72,
0xa2, 0x92, 0xc7, 0x86, 0x1e, 0x59, 0xfc, 0x75,
0x0a, 0x2b, 0xea, 0x2a, 0x5e, 0xc8, 0xf2, 0x25,
0x9c, 0xcc, 0x69, 0xf6, 0x7b, 0x57, 0xc7, 0x06,
0x1f, 0x13, 0xbb, 0x60, 0xdf, 0x80, 0x44, 0x63,
0x15, 0xb6, 0x90, 0xb4, 0x2a, 0xa6, 0x95, 0x48,
0xd8, 0xf8, 0x95, 0xb2, 0xe0, 0x60, 0xd7, 0xf6,
0xe6, 0xc7, 0xca, 0xb1, 0x44, 0x09, 0x0d, 0xf0,
0x47, 0x02, 0x2e, 0xae, 0x4a, 0x35, 0xb7, 0xe4,
0x19, 0xef, 0xd7, 0xfb, 0x41, 0x67, 0x81, 0x5b,
0xad, 0x43, 0x49, 0xfc, 0x18, 0xca, 0x54, 0xb9,
0x55, 0x6c, 0xa8, 0x43, 0xbc, 0xef, 0x8c, 0x84,
0xdb, 0xd9, 0x2f, 0xdc, 0xe7, 0x6b, 0xc9, 0x08,
0xcb, 0x2e, 0x42, 0x0f, 0xa7, 0xf4, 0x68, 0xa6,
0x41, 0xfd, 0x64, 0x49, 0x4e, 0x17, 0x2e, 0x2f,
0xa2, 0x9d, 0xbc, 0x24, 0x14, 0xae, 0xf3, 0x70,
0xd7, 0x34, 0x4b, 0xaa, 0x9a, 0xb9, 0xe8, 0x60,
0x93, 0x77, 0xab, 0x11, 0xfa, 0xaf, 0x22, 0x00,
0x5f, 0xff, 0x2f, 0x18, 0x2f, 0x53, 0xef, 0x51,
0x8c, 0x9e, 0xbb, 0x76, 0x72, 0xae, 0xe7, 0x95,
0x8a, 0x90, 0xfe, 0x56, 0xdc, 0xd8, 0x30, 0xb9,
0xd3, 0x1c, 0x2f, 0x8f, 0xf5, 0x71, 0x93, 0xd5,
0x91, 0xe4, 0x10, 0x8c, 0x8c, 0xcb, 0x9e, 0x51,
0x8a, 0xdb, 0x4e, 0x15, 0xc1, 0xd5, 0x52, 0x73,
0xb3, 0x60, 0x13, 0x47, 0xfb, 0x6d, 0x26, 0x3a,
0xba, 0xa3, 0x55, 0x59, 0xae, 0x27, 0x24, 0x36,
0x47, 0xed, 0x34, 0x48, 0x72, 0x13, 0xa1, 0x66,
0x6b, 0x81, 0x8b, 0x09, 0x8d, 0x56, 0x76, 0xbf,
0x92, 0x62, 0x97, 0xa6, 0x22, 0x9a, 0x09, 0x44,
0xca, 0x04, 0x4d, 0x82, 0x90, 0x07, 0x6b, 0xb0,
0x0d, 0xdb, 0xf1, 0x0f, 0xe4, 0xef, 0x18, 0x15,
0x40, 0x9f, 0x83, 0x7f, 0xf1, 0x02, 0x81, 0x81,
0x00, 0xf3, 0xb4, 0xa5, 0x0a, 0x8d, 0x3f, 0x6b,
0x35, 0x22, 0x88, 0x82, 0xc1, 0x86, 0x0b, 0x26,
0x3b, 0xec, 0x93, 0x36, 0x6c, 0x46, 0x5c, 0x80,
0x49, 0xc7, 0xa4, 0xf3, 0x62, 0xbf, 0xdd, 0x75,
0xbb, 0x00, 0x52, 0x62, 0xa9, 0x20, 0xbb, 0x7a,
0xa5, 0xff, 0x40, 0x84, 0x7e, 0x95, 0x08, 0xb9,
0x13, 0x74, 0x87, 0x76, 0xb6, 0x08, 0x65, 0xbd,
0xb6, 0xcc, 0xa1, 0xe7, 0xb8, 0xec, 0x0a, 0x24,
0xed, 0x9b, 0xac, 0x00, 0xdf, 0x41, 0x83, 0x85,
0x7a, 0x31, 0x40, 0x5e, 0xe6, 0x4d, 0xdc, 0xf8,
0xa5, 0x47, 0x83, 0xe1, 0x9b, 0x43, 0x87, 0x40,
0xe9, 0xd1, 0x77, 0x11, 0x7f, 0xe3, 0x86, 0xc1,
0x75, 0x8a, 0xda, 0x8c, 0x11, 0x32, 0x0a, 0xdf,
0xdb, 0x59, 0xcb, 0xd1, 0x4c, 0x6f, 0xd2, 0x7f,
0x49, 0x37, 0x2e, 0x96, 0x38, 0x67, 0x65, 0x53,
0x12, 0x06, 0x35, 0xbe, 0x41, 0xa7, 0xac, 0x91,
0x71, 0x02, 0x81, 0x81, 0x00, 0xd2, 0xd0, 0x8d,
0x05, 0x58, 0x76, 0xb2, 0x31, 0xee, 0x3d, 0x78,
0x0b, 0xdc, 0x23, 0x5f, 0x48, 0x37, 0x66, 0xb2,
0x12, 0xd7, 0xf4, 0x0a, 0x0c, 0x94, 0xf3, 0xb5,
0x4d, 0x65, 0x7f, 0xdd, 0xc9, 0x83, 0x98, 0x56,
0xff, 0x49, 0xf7, 0xa4, 0x8a, 0xef, 0x68, 0x04,
0xbe, 0xe9, 0x52, 0x48, 0x7a, 0x3a, 0xbd, 0xda,
0x91, 0xb5, 0x92, 0xc9, 0x30, 0x83, 0xab, 0xc9,
0x60, 0x29, 0xbc, 0x0d, 0xb7, 0x99, 0x48, 0x57,
0x7d, 0xca, 0x26, 0x9c, 0xca, 0x41, 0x7e, 0x67,
0x67, 0x8d, 0x26, 0xf5, 0x6c, 0x89, 0xa8, 0x99,
0xcf, 0x7c, 0x83, 0xc3, 0xf9, 0x31, 0xc4, 0x52,
0xb9, 0xf8, 0x2d, 0x02, 0x02, 0xdc, 0x45, 0xbc,
0x7a, 0xdf, 0x6a, 0xe4, 0x5b, 0x18, 0x3f, 0xaf,
0xcd, 0x54, 0x31, 0x17, 0x17, 0x92, 0x10, 0x93,
0x7a, 0x13, 0xcf, 0xd1, 0xf8, 0x7d, 0xd1, 0xce,
0x01, 0x2a, 0x06, 0xc5, 0xff, 0x02, 0x81, 0x80,
0x28, 0x7f, 0xcd, 0xa9, 0x8a, 0x3d, 0x8e, 0xc8,
0x5e, 0xbb, 0xc6, 0xd6, 0xf8, 0x3a, 0xa4, 0x18,
0xf3, 0x40, 0xa7, 0x9b, 0xa8, 0xb9, 0xb8, 0x8c,
0x0a, 0x44, 0x6c, 0x39, 0xed, 0xde, 0x94, 0xb1,
0x05, 0xe5, 0xab, 0x05, 0xa6, 0x2d, 0xe1, 0xbc,
0xf2, 0x45, 0x3b, 0x7f, 0x79, 0xae, 0xe0, 0x6a,
0xce, 0x43, 0xb0, 0xc3, 0xa1, 0x73, 0x9e, 0xea,
0x60, 0xe9, 0x4b, 0x03, 0xdd, 0x1d, 0xf6, 0x73,
0x12, 0x1a, 0xac, 0x6e, 0x6d, 0x89, 0xb8, 0xc5,
0xcc, 0xa7, 0x80, 0xdd, 0xce, 0xf4, 0xb8, 0xd1,
0x66, 0xa8, 0x10, 0xf6, 0xe7, 0x6a, 0xf3, 0xab,
0xa7, 0xa6, 0x9c, 0xde, 0xde, 0xe5, 0xc7, 0x02,
0x8c, 0x97, 0xb3, 0x0d, 0x2c, 0x7e, 0xc8, 0x22,
0xc0, 0xb2, 0x71, 0x4e, 0xbd, 0x8a, 0x82, 0xa2,
0x9d, 0x2b, 0xfd, 0xc4, 0xd3, 0xd1, 0xef, 0xd3,
0x1f, 0xfb, 0x10, 0x6a, 0x02, 0xbe, 0x57, 0xd1,
0x02, 0x81, 0x80, 0x03, 0x1d, 0xf4, 0x47, 0xd4,
0xf4, 0x04, 0x54, 0x7a, 0xaa, 0x4c, 0x01, 0x18,
0xe3, 0x29, 0x00, 0x7f, 0x59, 0x34, 0x5e, 0xd4,
0xf4, 0x95, 0xc5, 0x73, 0xda, 0x5a, 0x9e, 0xe7,
0x56, 0x49, 0xa8, 0x36, 0x1a, 0xe5, 0x86, 0x66,
0xc8, 0x93, 0x95, 0x3e, 0x4e, 0xf2, 0x6b, 0x04,
0x36, 0x24, 0x3e, 0x32, 0x6a, 0x26, 0x36, 0x2b,
0x52, 0x1d, 0x49, 0x6b, 0x58, 0xf9, 0xe4, 0x43,
0x19, 0xb5, 0xb6, 0x36, 0x3c, 0xfc, 0x96, 0x2e,
0x8b, 0xfd, 0x9b, 0x7b, 0xf6, 0x6b, 0x7e, 0xfb,
0x76, 0x4d, 0x00, 0xaa, 0xd4, 0x64, 0x59, 0xce,
0x04, 0x80, 0xbc, 0x49, 0x81, 0x16, 0x9c, 0x0b,
0x50, 0x57, 0x0c, 0x45, 0xc7, 0x7e, 0x2e, 0xee,
0xe8, 0xbc, 0xb1, 0xa0, 0x1d, 0x28, 0xf3, 0x47,
0x40, 0x66, 0x90, 0x01, 0xa7, 0xdf, 0x16, 0x59,
0xfe, 0xa3, 0xa3, 0x21, 0xf1, 0x1d, 0x33, 0xa5,
0x34, 0x6e, 0x6f, 0x02, 0x81, 0x81, 0x00, 0xd6,
0x34, 0x8e, 0xd4, 0xcd, 0xf5, 0x5e, 0x54, 0x15,
0xa4, 0x57, 0x6c, 0xe9, 0x2e, 0x0e, 0x88, 0xda,
0xcc, 0x19, 0xfc, 0x89, 0xb4, 0x36, 0x17, 0x1b,
0xd8, 0x72, 0x17, 0x1e, 0xa2, 0x22, 0xff, 0xfc,
0x56, 0xb9, 0xc6, 0x39, 0x56, 0x52, 0xae, 0xd5,
0xdd, 0x3a, 0x1f, 0x9e, 0xa2, 0xf0, 0x90, 0x67,
0xd1, 0x3f, 0x97, 0x82, 0xb6, 0x7d, 0x33, 0x73,
0xf8, 0xf0, 0x06, 0xc2, 0xe5, 0x98, 0x0c, 0x2a,
0xc9, 0x34, 0x16, 0x13, 0x03, 0x6e, 0x3c, 0xa4,
0x84, 0x52, 0x2a, 0x52, 0x27, 0x63, 0x80, 0x81,
0x8f, 0xaf, 0x57, 0x9e, 0x00, 0xaf, 0xbb, 0x39,
0x56, 0x55, 0xf6, 0xb2, 0x2c, 0x77, 0x5d, 0xd1,
0x0c, 0xe6, 0x4a, 0x5f, 0x8d, 0xfb, 0x01, 0xcb,
0xca, 0x4f, 0xf9, 0x51, 0xbf, 0x76, 0xea, 0xc3,
0xba, 0x3d, 0x0b, 0x40, 0xc2, 0xc6, 0xed, 0x61,
0x13, 0xa2, 0xff, 0x7c, 0x7f, 0xeb, 0x99,
};
static unsigned char digest[64] = {
0x81, 0x9e, 0x38, 0x5a, 0x31, 0xc9, 0xda, 0xfb,
0x69, 0xc4, 0xd3, 0x68, 0xdc, 0x2e, 0x81, 0x66,
0x56, 0x3d, 0x93, 0x18, 0xd3, 0x04, 0xc2, 0x86,
0x54, 0x9b, 0x82, 0x9e, 0x48, 0x7f, 0xe3, 0x74,
0xea, 0xc3, 0x49, 0x40, 0x9c, 0x23, 0x47, 0x3d,
0x12, 0xfb, 0x82, 0x7c, 0x5a, 0x00, 0x99, 0x08,
0x50, 0xce, 0xda, 0xc3, 0x40, 0x18, 0x61, 0x17,
0x31, 0x3f, 0x3d, 0xe8, 0x9c, 0x45, 0x2d, 0x1e,
};
static int digestSz = 64;

View File

@ -0,0 +1,370 @@
/* rsa-kg-sv.c
*
* Copyright (C) 2006-2019 wolfSSL Inc.
*
* This file is part of wolfSSL. (formerly known as CyaSSL)
*
* wolfSSL is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* wolfSSL is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdio.h>
#include <wolfssl/options.h>
#include <wolfssl/wolfcrypt/rsa.h>
#include <wolfssl/wolfcrypt/hash.h>
#include "rsa-key.h"
#define MIN_RSA_BITS 1024
#define MAX_RSA_BITS 4096
#define DEF_RSA_BITS 2048
#define DEF_KEYS_GEN 128
#define DEF_SV_CHECKS 512
/* Load the RSA private key */
int load_rsa_key(RsaKey *key)
{
word32 idx = 0;
return wc_RsaPrivateKeyDecode(rsa_priv_key, &idx, key,
sizeof(rsa_priv_key));
}
/* Print the buffer as bytes */
void print_data(char *name, unsigned char *data, int len)
{
int i;
printf("static unsigned char %s[%d] = {\n", name, len);
for (i = 0; i < len; i++) {
if ((i & 7) == 0) {
printf(" ");
}
printf("0x%02x, ", data[i]);
if ((i & 7) == 7) {
printf("\n");
}
}
if ((i & 7) != 0) {
printf("\n");
}
printf("};\n");
}
/* Print the components of an RSA key */
void print_rsa(RsaKey *key)
{
printf("\n");
unsigned char buf[2400];
int len;
len = wc_RsaKeyToDer(key, buf, sizeof(buf));
if (len < 0) {
fprintf(stderr, "Failed to encode RSA key\n");
}
print_data("rsa_priv_key", buf, len);
}
/* Shows usage information */
void usage()
{
fprintf(stderr, "rsa_kg_sv <options>:\n");
fprintf(stderr, " -load-key Load RSA key from rsa-key.h\n");
fprintf(stderr, " -bits <num> Size in bits of RSA keys generated\n");
fprintf(stderr, " Range: 1024-4096\n");
fprintf(stderr, " -num-keys <num> Number of keys to generate\n");
fprintf(stderr, " -checks <num> Number of signs/verifies to do\n");
fprintf(stderr, " -hash-size <num> Number of bytes in hash\n");
fprintf(stderr, " Range: 1-64. Default: 64\n");
fprintf(stderr, "\n");
}
int main(int argc, char *argv[])
{
int ec = 0;
int ret;
RsaKey key;
WC_RNG rng;
unsigned char hash[SHA512_DIGEST_SIZE];
int hashSz = SHA512_DIGEST_SIZE;
int hashAlg = WC_HASH_TYPE_SHA512;
unsigned char sig[MAX_RSA_BITS/8];
int sig_len;
unsigned char *out = NULL;
int i, cnt;
int bits = DEF_RSA_BITS;
int numKeys = DEF_KEYS_GEN;
int checks = DEF_SV_CHECKS;
int load_key = 0;
/* Skip program name */
--argc;
++argv;
/* Process command line arguments */
while (argc > 0) {
/* Load the key rather than generate */
if (XSTRNCMP(*argv, "-load-key", 10) == 0) {
load_key = 1;
}
/* Number of bits in RSA key to generate */
else if (XSTRNCMP(*argv, "-bits", 6) == 0) {
++argv;
if (--argc == 0) {
fprintf(stderr, "Missing bits value\n");
usage();
return 1;
}
bits = atoi(*argv);
}
/* Number of keys to generate */
else if (XSTRNCMP(*argv, "-num-keys", 10) == 0) {
++argv;
if (--argc == 0) {
fprintf(stderr, "Missing number of keys value\n");
usage();
return 1;
}
numKeys = atoi(*argv);
}
/* Number of sign/verify checks to perform */
else if (XSTRNCMP(*argv, "-checks", 7) == 0) {
++argv;
if (--argc == 0) {
fprintf(stderr, "Missing check count value\n");
usage();
return 1;
}
checks = atoi(*argv);
}
/* Size of hash to use */
else if (XSTRNCMP(*argv, "-hash-size", 11) == 0) {
++argv;
if (--argc == 0) {
fprintf(stderr, "Missing hash size value\n");
usage();
return 1;
}
hashSz = atoi(*argv);
}
else if (XSTRNCMP(*argv, "-help", 6) == 0) {
usage();
return 0;
}
else {
fprintf(stderr, "Unrecognized option: %s\n", *argv);
usage();
return 1;
}
--argc;
++argv;
}
/* Only use one key when loading */
if (load_key) {
numKeys = 1;
}
/* Check bit count if generating keys */
if (!load_key && (bits < MIN_RSA_BITS || bits > MAX_RSA_BITS)) {
fprintf(stderr, "Bits out of range (%d-%d): %d\n", MIN_RSA_BITS,
MAX_RSA_BITS, bits);
usage();
return 1;
}
#ifdef WOLFSSL_SP_MATH
if (0) {
}
#ifndef WOLFSSL_SP_NO_2048
else if (bits == 2048) {
}
#endif
#ifndef WOLFSSL_SP_NO_3072
else if (bits == 3072) {
}
#endif
#ifdef WOLFSSL_SP_4096
else if (bits == 4096) {
}
#endif
else {
fprintf(stderr, "Bit size not supported with SP_MATH: %d\n", bits);
fprintf(stderr, " wolfSSL compiled to support, in bits:");
#ifndef WOLFSSL_SP_NO_2048
fprintf(stderr, " 2048");
#endif
#ifndef WOLFSSL_SP_NO_3072
fprintf(stderr, " 3072");
#endif
#ifdef WOLFSSL_SP_4096
fprintf(stderr, " 4096");
#endif
fprintf(stderr, "\n");
return 1;
}
#endif
/* Check number of keys */
if (numKeys < 1) {
fprintf(stderr, "Number of key out of range (1+): %d\n", numKeys);
usage();
return 1;
}
/* Check count */
if (checks < 0) {
fprintf(stderr, "Number of checks out of range (0+): %d\n", checks);
usage();
return 1;
}
/* Check hash size is valid */
if (hashSz < 1 || hashSz > SHA512_DIGEST_SIZE) {
fprintf(stderr, "Hash size out of range (1-%d): %d\n",
SHA512_DIGEST_SIZE, hashSz);
usage();
return 1;
}
/* Display the options in use */
if (!load_key) {
printf("Bits: %d\n", bits);
printf("#Keys: %d\n", numKeys);
}
else {
printf("Loading key\n");
}
printf("Checks: %d\n", checks);
printf("Hash Size: %d\n", hashSz);
/* Initialize random number generator */
ret = wc_InitRng(&rng);
if (ret != 0) {
fprintf(stderr, "Failed to initialize random\n");
return 1;
}
/* Initialize RSA key structure */
ret = wc_InitRsaKey(&key, NULL);
if (ret != 0) {
wc_FreeRng(&rng);
fprintf(stderr, "Failed to initialize RSA key\n");
return 1;
}
/* Perform operations for specified number of keys */
for (cnt = 0; cnt < numKeys; cnt++) {
if (!load_key) {
fprintf(stderr, "%d: ", cnt + 1);
/* Generate a new RSA key with the default public exponent */
ret = wc_MakeRsaKey(&key, bits, WC_RSA_EXPONENT, &rng);
if (ret != 0) {
fprintf(stderr, "Failed to make RSA key\n");
ec = 1;
break;
}
/* Check the RSA key */
ret = wc_CheckRsaKey(&key);
if (ret != 0) {
fprintf(stderr, "Key failed checks\n");
ec = 1;
break;
}
/* Generate a new hash */
ret = wc_RNG_GenerateBlock(&rng, hash, sizeof(hash));
if (ret != 0) {
fprintf(stderr, "Failed to initialize random\n");
ec = 1;
break;
}
}
else {
/* Load RSA key from rsa-key.h */
ret = load_rsa_key(&key);
if (ret != 0) {
fprintf(stderr, "Failed to load RSA key\n");
ec = 1;
break;
}
/* From rsa-key.h */
XMEMCPY(hash, digest, digestSz);
}
/* Perform a number of sign-verify checks */
for (i = 0; i < checks; i++) {
/* Sign with RSA key */
ret = wc_RsaSSL_Sign(hash, hashSz, sig, sizeof(sig), &key, &rng);
if (ret < 0) {
print_rsa(&key);
print_data("digest", hash, hashSz);
printf("static int digestSz = %d;\n", hashSz);
fprintf(stderr, "Failed to sign with RSA key\n");
ec = 1;
break;
}
sig_len = ret;
if (load_key && i == 0) {
print_data("sig", sig, sig_len);
}
/* Verify with RSA key */
ret = wc_RsaSSL_VerifyInline(sig, sig_len, &out, &key);
if (ret < 0) {
print_rsa(&key);
print_data("digest", hash, hashSz);
printf("static int digestSz = %d;\n", hashSz);
printf("\n");
print_data("sig", sig, sig_len);
fprintf(stderr, "Failed to verify with RSA key\n");
ec = 1;
break;
}
/* Check hash is the same */
if ((ret != hashSz) || (XMEMCMP(out, hash, hashSz) != 0)) {
print_rsa(&key);
print_data("digest", hash, hashSz);
printf("static int digestSz = %d;\n", hashSz);
printf("\n");
print_data("sig", sig, sig_len);
fprintf(stderr, "Failed to verify with RSA key\n");
ec = 1;
break;
}
/* Generate a new hash to sign */
ret = wc_Hash(hashAlg, hash, hashSz, hash, sizeof(hash));
if (ret != 0) {
fprintf(stderr, "Failed to make new hash\n");
ec = 1;
break;
}
fprintf(stderr, ".");
}
/* Error during check - break out. */
if (ec) {
break;
}
fprintf(stderr, "\n");
}
/* Free allocated items */
wc_FreeRsaKey(&key);
wc_FreeRng(&rng);
return ec;
}