Annotation of embedaddon/strongswan/src/pki/commands/gen.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2009 Martin Willi
                      3:  * Copyright (C) 2014-2016 Andreas Steffen
                      4:  * HSR Hochschule fuer Technik Rapperswil
                      5:  *
                      6:  * This program is free software; you can redistribute it and/or modify it
                      7:  * under the terms of the GNU General Public License as published by the
                      8:  * Free Software Foundation; either version 2 of the License, or (at your
                      9:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     10:  *
                     11:  * This program is distributed in the hope that it will be useful, but
                     12:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     13:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     14:  * for more details.
                     15:  */
                     16: 
                     17: #include "pki.h"
                     18: 
                     19: /**
                     20:  * Generate a private key
                     21:  */
                     22: static int gen()
                     23: {
                     24:        cred_encoding_type_t form = PRIVKEY_ASN1_DER;
                     25:        key_type_t type = KEY_RSA;
                     26:        u_int size = 0, shares = 0, threshold = 1;
                     27:        private_key_t *key;
                     28:        chunk_t encoding;
                     29:        bool safe_primes = FALSE;
                     30:        char *arg;
                     31: 
                     32:        while (TRUE)
                     33:        {
                     34:                switch (command_getopt(&arg))
                     35:                {
                     36:                        case 'h':
                     37:                                return command_usage(NULL);
                     38:                        case 't':
                     39:                                if (streq(arg, "rsa"))
                     40:                                {
                     41:                                        type = KEY_RSA;
                     42:                                }
                     43:                                else if (streq(arg, "ecdsa"))
                     44:                                {
                     45:                                        type = KEY_ECDSA;
                     46:                                }
                     47:                                else if (streq(arg, "ed25519"))
                     48:                                {
                     49:                                        type = KEY_ED25519;
                     50:                                }
                     51:                                else if (streq(arg, "ed448"))
                     52:                                {
                     53:                                        type = KEY_ED448;
                     54:                                }
                     55:                                else if (streq(arg, "bliss"))
                     56:                                {
                     57:                                        type = KEY_BLISS;
                     58:                                }
                     59:                                else
                     60:                                {
                     61:                                        return command_usage("invalid key type");
                     62:                                }
                     63:                                continue;
                     64:                        case 'f':
                     65:                                if (!get_form(arg, &form, CRED_PRIVATE_KEY))
                     66:                                {
                     67:                                        return command_usage("invalid key output format");
                     68:                                }
                     69:                                continue;
                     70:                        case 's':
                     71:                                size = atoi(arg);
                     72:                                if (!size)
                     73:                                {
                     74:                                        return command_usage("invalid key size");
                     75:                                }
                     76:                                continue;
                     77:                        case 'p':
                     78:                                safe_primes = TRUE;
                     79:                                continue;
                     80:                        case 'n':
                     81:                                shares = atoi(arg);
                     82:                                if (shares < 2)
                     83:                                {
                     84:                                        return command_usage("invalid number of key shares");
                     85:                                }
                     86:                                continue;
                     87:                        case 'l':
                     88:                                threshold = atoi(arg);
                     89:                                if (threshold < 1)
                     90:                                {
                     91:                                        return command_usage("invalid key share threshold");
                     92:                                }
                     93:                                continue;
                     94:                        case EOF:
                     95:                                break;
                     96:                        default:
                     97:                                return command_usage("invalid --gen option");
                     98:                }
                     99:                break;
                    100:        }
                    101:        /* default key sizes */
                    102:        if (!size)
                    103:        {
                    104:                switch (type)
                    105:                {
                    106:                        case KEY_RSA:
                    107:                                size = 2048;
                    108:                                break;
                    109:                        case KEY_ECDSA:
                    110:                                size = 384;
                    111:                                break;
                    112:                        case KEY_ED25519:
                    113:                                size = 256;
                    114:                                break;
                    115:                        case KEY_ED448:
                    116:                                size = 456;
                    117:                                break;
                    118:                        case KEY_BLISS:
                    119:                                size = 1;
                    120:                                break;
                    121:                        default:
                    122:                                break;
                    123:                }
                    124:        }
                    125:        if (type == KEY_RSA && shares)
                    126:        {
                    127:                if (threshold > shares)
                    128:                {
                    129:                        return command_usage("threshold is larger than number of shares");
                    130:                }
                    131:                key = lib->creds->create(lib->creds, CRED_PRIVATE_KEY, type,
                    132:                                                        BUILD_KEY_SIZE, size, BUILD_SAFE_PRIMES,
                    133:                                                        BUILD_SHARES, shares, BUILD_THRESHOLD, threshold,
                    134:                                                        BUILD_END);
                    135:        }
                    136:        else if (type == KEY_RSA && safe_primes)
                    137:        {
                    138:                key = lib->creds->create(lib->creds, CRED_PRIVATE_KEY, type,
                    139:                                                        BUILD_KEY_SIZE, size, BUILD_SAFE_PRIMES, BUILD_END);
                    140:        }
                    141:        else
                    142:        {
                    143:                key = lib->creds->create(lib->creds, CRED_PRIVATE_KEY, type,
                    144:                                                        BUILD_KEY_SIZE, size, BUILD_END);
                    145:        }
                    146:        if (!key)
                    147:        {
                    148:                fprintf(stderr, "private key generation failed\n");
                    149:                return 1;
                    150:        }
                    151:        if (!key->get_encoding(key, form, &encoding))
                    152:        {
                    153:                fprintf(stderr, "private key encoding failed\n");
                    154:                key->destroy(key);
                    155:                return 1;
                    156:        }
                    157:        key->destroy(key);
                    158:        set_file_mode(stdout, form);
                    159:        if (fwrite(encoding.ptr, encoding.len, 1, stdout) != 1)
                    160:        {
                    161:                fprintf(stderr, "writing private key failed\n");
                    162:                free(encoding.ptr);
                    163:                return 1;
                    164:        }
                    165:        free(encoding.ptr);
                    166:        return 0;
                    167: }
                    168: 
                    169: /**
                    170:  * Register the command.
                    171:  */
                    172: static void __attribute__ ((constructor))reg()
                    173: {
                    174:        command_register((command_t) {
                    175:                gen, 'g', "gen", "generate a new private key",
                    176:                {"[--type rsa|ecdsa|ed25519|ed448|bliss] [--size bits] [--safe-primes]",
                    177:                 "[--shares n] [--threshold l] [--outform der|pem]"},
                    178:                {
                    179:                        {"help",                'h', 0, "show usage information"},
                    180:                        {"type",                't', 1, "type of key, default: rsa"},
                    181:                        {"size",                's', 1, "keylength in bits, default: rsa 2048, ecdsa 384, bliss 1"},
                    182:                        {"safe-primes", 'p', 0, "generate rsa safe primes"},
                    183:                        {"shares",              'n', 1, "number of private rsa key shares"},
                    184:                        {"threshold",   'l', 1, "minimum number of participating rsa key shares"},
                    185:                        {"outform",             'f', 1, "encoding of generated private key, default: der"},
                    186:                }
                    187:        });
                    188: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>