Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ pk/ed25519_gen/gen_key_files
pk/ed25519_gen/sign_and_verify
pk/ecdh_generate_secret/ecdh_gen_secret
pk/rsa-kg/rsa-kg-sv
pk/rsa-kg/rsa-kg
pk/dh-pg/dh-pg-ka
pk/test_cert_and_private_keypair/test-cert-privkey-pair
pk/srp/srp_gen
Expand Down
12 changes: 9 additions & 3 deletions pk/rsa-kg/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,21 @@ CC=gcc
CFLAGS=-Wall
LIBS= -lwolfssl -lm

all: rsa-kg-sv
all: rsa-kg-sv rsa-kg

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)
$(CC) -o $@ $^ $(CFLAGS) $(LIBS)

rsa-kg.o: rsa-kg.c
$(CC) -c -o $@ $< $(CFLAGS)

rsa-kg: rsa-kg.o
$(CC) -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
rm -f *.o rsa-kg-sv
rm -f *.o rsa-kg-sv rsa-kg
17 changes: 16 additions & 1 deletion pk/rsa-kg/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,21 @@ How to use rsa-kg-sv.c
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.
3) Running 'make clean' will delete the executable and object files.


How to use rsa-kg.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 <options>

Key sizes supported, in bits: 1024-4096.

Specify the name of the output files with -priv and -pub.

3) Running 'make clean' will delete the executable and object files.

243 changes: 243 additions & 0 deletions pk/rsa-kg/rsa-kg.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,243 @@
/* rsa-kg.c
*
* Copyright (C) 2006-2020 wolfSSL Inc.
*
* This file is part of wolfSSL.
*
* 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-1335, USA
*/

/*
* An implementation of RSA key generation using wolfSSL
* Usage:
./rsa-kg -priv <private key filename> -pub <public key filename>
*/

#include <stdio.h>
#include <string.h>

#include <wolfssl/options.h>
#include <wolfssl/wolfcrypt/settings.h>
#include <wolfssl/ssl.h>
#include <wolfssl/wolfcrypt/rsa.h>
#include <wolfssl/wolfcrypt/error-crypt.h>

#define MAX_DER_SIZE 2500
#define MIN_RSA_KEY_SIZE 1024
#define MAX_RSA_KEY_SIZE 4096
#define DEF_RSA_KEY_SIZE 2048

static const char* kRsaPubKey = "./rsa-public.der";
static const char* kRsaPrivKey = "./rsa-private.der";

/* Shows usage information */
void usage()
{
fprintf(stderr, "rsa_kg <options>:\n");
fprintf(stderr, " -bits <num> Size in bits of RSA keys generated\n");
fprintf(stderr, " Range: 1024-4096\n");
fprintf(stderr, " -priv <filename> Private key filename\n");
fprintf(stderr, " -pub <filename> Public key filename\n");
fprintf(stderr, "\n");
}

int main(int argc, char** argv)
{
/* These examples require RSA and Key Gen */
#if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN)
RsaKey* pRsaKey = NULL;
WC_RNG rng;
int ret = 0;
int bits = DEF_RSA_KEY_SIZE;
int sz;
unsigned char derBuf[MAX_DER_SIZE];
FILE* f;
const char* pubKey = kRsaPubKey;
const char* privKey = kRsaPrivKey;

argc--;
argv++;
while (argc > 0) {
/* Number of bits in RSA key to generate */
if (XSTRNCMP(*argv, "-bits", 6) == 0) {
++argv;
if (--argc == 0) {
fprintf(stderr, "Missing bits value\n");
usage();
return 1;
}
bits = atoi(*argv);
}
else if (XSTRNCMP(*argv, "-priv", 6) == 0) {
++argv;
if (--argc == 0) {
fprintf(stderr, "Missing private key filename\n");
usage();
return 1;
}
privKey = *argv;
}
else if (XSTRNCMP(*argv, "-pub", 6) == 0) {
++argv;
if (--argc == 0) {
fprintf(stderr, "Missing public key filename\n");
usage();
return 1;
}
pubKey = *argv;
}
else if (XSTRNCMP(*argv, "-help", 6) == 0) {
usage();
return 0;
}
else {
fprintf(stderr, "Unrecognized option: %s\n", *argv);
usage();
return 1;
}

argc--;
argv++;
}

/* Check bit count if generating keys */
if ((bits < MIN_RSA_KEY_SIZE || bits > MAX_RSA_KEY_SIZE)) {
fprintf(stderr, "Bits out of range (%d-%d): %d\n", MIN_RSA_KEY_SIZE,
MAX_RSA_KEY_SIZE, 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

wolfSSL_Debugging_ON();

wolfSSL_Init();

/* Allocate space for RSA key object. */
pRsaKey = malloc(sizeof(RsaKey));
if (!pRsaKey) {
printf("RSA_generate_key failed with error\n");
return MEMORY_E;
}

/* Create a random number generator for key generation. */
ret = wc_InitRng(&rng);
if (ret != 0) {
printf("Init RNG failed %d\n", ret);
free(pRsaKey);
return ret;
}

/* Initialize RSA key object. */
ret = wc_InitRsaKey(pRsaKey, NULL);
if (ret != 0) {
printf("Init RSA key failed %d\n", ret);
wc_FreeRng(&rng);
free(pRsaKey);
return ret;
}

printf("Generating RSA key\n");

/* Generate an RSA key pair. */
if (wc_MakeRsaKey(pRsaKey, bits, WC_RSA_EXPONENT, &rng) != 0) {
printf("failed to create rsa key\n");
}
else {
/* Open public key file. */
f = fopen(pubKey, "wb");
printf("writing public key to %s\n", pubKey);
if (f == NULL) {
printf("unable to write out public key\n");
}
else {
/* Encode public key to DER. */
sz = wc_RsaKeyToPublicDer(pRsaKey, derBuf, sizeof(derBuf));
if (sz <= 0) {
printf("error with rsa to public der %d\n", sz);
}
else {
/* Write DER encoded public key to file. */
fwrite(derBuf, 1, sz, f);
}
fclose(f);
}

/* Open private key file. */
f = fopen(privKey, "wb");
printf("writing public key to %s\n", privKey);
if (f == NULL) {
printf("unable to write out public key\n");
}
else {
/* Encode private key to DER. */
sz = wc_RsaKeyToDer(pRsaKey, derBuf, sizeof(derBuf));
if (sz <= 0) {
printf("error with rsa to public der %d\n", sz);
}
else {
/* Write DER encoded private key to file. */
fwrite(derBuf, 1, sz, f);
}
fclose(f);
}
}

/* Dispose of allocated memory. */
wc_FreeRsaKey(pRsaKey);
wc_FreeRng(&rng);
free(pRsaKey);
wolfSSL_Cleanup();

return 0;
#else
(void)kRsaPubKey;
(void)kRsaPrivKey;

printf("wolfSSL missing build features.\n");
printf("Please build using `./configure --enable-keygen`\n");
return 1;
#endif
}