Mercurial > hg > quicktun
diff src/keypair.c @ 64:fa53d1c54886
Use default RNG for key generation, added options to generate public key from private key, use bundled tweetnacl as fallback instead of nacl download
author | Ivo Smits <Ivo@UFO-Net.nl> |
---|---|
date | Sat, 07 Jan 2017 18:07:27 +0100 |
parents | dfac56805c77 |
children |
line wrap: on
line diff
--- a/src/keypair.c Sat Jan 07 16:01:01 2017 +0100 +++ b/src/keypair.c Sat Jan 07 18:07:27 2017 +0100 @@ -26,35 +26,71 @@ #include "common.c" #include "crypto_box_curve25519xsalsa20poly1305.h" #include "crypto_scalarmult_curve25519.h" -#include <time.h> #include <fcntl.h> +#include <unistd.h> -int main() { +int main(int argc, char** argv) { print_header(); unsigned char cpublickey[crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES]; unsigned char csecretkey[crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES]; + int input_mode = 0; //0=generate random, 1=read from argument + int output_mode = 0; //0=human readable, 1=space separated, 2=concatenated binary int i; - fprintf(stderr, "Please feed 32 bytes of random data to stdin.\n"); - fprintf(stderr, "Example (slow but secure): quicktun.keypair < /dev/random\n"); - fprintf(stderr, "Example (fast but insecure): quicktun.keypair < /dev/urandom\n"); - - int len = fread(csecretkey, 1, crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES, stdin); - if (len < crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES) return errorexitp("Error or end of file on STDIN"); -/* char* b; - srand(time(NULL)); - for (b = csecretkey; b < csecretkey + crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES; b++) *b = rand() % 255;*/ + for (i = 1; i < argc; i++) { + char* a = argv[i]; + if (!strcmp(a, "-h") || !strcmp(a, "--help")) { + printf("Please read the documentation at http://wiki.ucis.nl/QuickTun\n"); + return 0; + } else if (!strcmp(a, "-v") || !strcmp(a, "--version")) { + printf("UCIS QuickTun "QT_VERSION"\n"); + return 0; + } else if (!strcmp(a, "-i")) { + i++; + if (i >= argc) return errorexit("Missing argument for -i"); + if (!hex2bin(csecretkey, argv[i], crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES)) return errorexit("Invalid secret key argument"); + input_mode = 1; + } else if (!strcmp(a, "-f")) { + int len = fread(csecretkey, 1, crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES, stdin); + if (len < crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES) return errorexitp("Error or end of file on STDIN"); + input_mode = 1; + } else if (!strcmp(a, "-o")) { + i++; + a = argv[i]; + if (i >= argc) return errorexit("Missing argument for -o"); + if (!strcmp(a, "human")) output_mode = 0; + else if (!strcmp(a, "space")) output_mode = 1; + else if (!strcmp(a, "bin")) output_mode = 2; + else return errorexit("Invalid argument specified for -o"); + } else { + return errorexit("Unexpected command line argument"); + } + } - crypto_scalarmult_curve25519_base(cpublickey, csecretkey); + if (input_mode == 0) { + crypto_box_curve25519xsalsa20poly1305_keypair(cpublickey, csecretkey); + } else { + crypto_scalarmult_curve25519_base(cpublickey, csecretkey); + } - printf("SECRET: "); - for (i = 0; i < crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES; i++) printf("%02x", csecretkey[i]); - printf("\n"); + if (output_mode == 2) { + fwrite(csecretkey, 1, crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES, stdout); + fwrite(cpublickey, 1, crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES, stdout); + } else if (output_mode == 1) { + for (i = 0; i < crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES; i++) printf("%02x", csecretkey[i]); + printf(" "); + for (i = 0; i < crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES; i++) printf("%02x", cpublickey[i]); + printf("\n"); + } else { + printf("SECRET: "); + for (i = 0; i < crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES; i++) printf("%02x", csecretkey[i]); + printf("\n"); - printf("PUBLIC: "); - for (i = 0; i < crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES; i++) printf("%02x", cpublickey[i]); - printf("\n"); + printf("PUBLIC: "); + for (i = 0; i < crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES; i++) printf("%02x", cpublickey[i]); + printf("\n"); + } return 0; }