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

1.1       misho       1: /*
                      2:  * Copyright (C) 2010 Martin Willi
                      3:  * Copyright (C) 2010 revosec AG
                      4:  *
                      5:  * Copyright (C) 2015-2016 Andreas Steffen
                      6:  * HSR Hochschule fuer Technik Rapperswil
                      7:  *
                      8:  * This program is free software; you can redistribute it and/or modify it
                      9:  * under the terms of the GNU General Public License as published by the
                     10:  * Free Software Foundation; either version 2 of the License, or (at your
                     11:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     12:  *
                     13:  * This program is distributed in the hope that it will be useful, but
                     14:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     15:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     16:  * for more details.
                     17:  */
                     18: 
                     19: #include "pki.h"
                     20: 
                     21: #include <credentials/certificates/certificate.h>
                     22: #include <credentials/certificates/certificate_printer.h>
                     23: 
                     24: #include <errno.h>
                     25: 
                     26: /**
                     27:  * Print private key information
                     28:  */
                     29: static void print_key(private_key_t *key)
                     30: {
                     31:        public_key_t *public;
                     32:        chunk_t chunk;
                     33: 
                     34:        public = key->get_public_key(key);
                     35:        if (public)
                     36:        {
                     37:                printf("  privkey:   %N %d bits\n", key_type_names,
                     38:                           public->get_type(public), public->get_keysize(public));
                     39:                if (public->get_fingerprint(public, KEYID_PUBKEY_INFO_SHA1, &chunk))
                     40:                {
                     41:                        printf("  keyid:     %#B\n", &chunk);
                     42:                }
                     43:                if (public->get_fingerprint(public, KEYID_PUBKEY_SHA1, &chunk))
                     44:                {
                     45:                        printf("  subjkey:   %#B\n", &chunk);
                     46:                }
                     47:                public->destroy(public);
                     48:        }
                     49:        else
                     50:        {
                     51:                printf("extracting public from private key failed\n");
                     52:        }
                     53: }
                     54: 
                     55: /**
                     56:  * Print a credential in a human readable form
                     57:  */
                     58: static int print()
                     59: {
                     60:        credential_type_t type = CRED_CERTIFICATE;
                     61:        int subtype = CERT_X509;
                     62:        void *cred;
                     63:        char *arg, *file = NULL, *keyid = NULL;
                     64:        chunk_t chunk;
                     65: 
                     66:        while (TRUE)
                     67:        {
                     68:                switch (command_getopt(&arg))
                     69:                {
                     70:                        case 'h':
                     71:                                return command_usage(NULL);
                     72:                        case 't':
                     73:                                if (streq(arg, "x509"))
                     74:                                {
                     75:                                        type = CRED_CERTIFICATE;
                     76:                                        subtype = CERT_X509;
                     77:                                }
                     78:                                else if (streq(arg, "crl"))
                     79:                                {
                     80:                                        type = CRED_CERTIFICATE;
                     81:                                        subtype = CERT_X509_CRL;
                     82:                                }
                     83:                                else if (streq(arg, "ac"))
                     84:                                {
                     85:                                        type = CRED_CERTIFICATE;
                     86:                                        subtype = CERT_X509_AC;
                     87:                                }
                     88:                                else if (streq(arg, "pub"))
                     89:                                {
                     90:                                        type = CRED_CERTIFICATE;
                     91:                                        subtype = CERT_TRUSTED_PUBKEY;
                     92:                                }
                     93:                                else if (streq(arg, "priv"))
                     94:                                {
                     95:                                        type = CRED_PRIVATE_KEY;
                     96:                                        subtype = KEY_ANY;
                     97:                                }
                     98:                                else if (streq(arg, "rsa") ||
                     99:                                                 streq(arg, "rsa-priv"))
                    100:                                {
                    101:                                        type = CRED_PRIVATE_KEY;
                    102:                                        subtype = KEY_RSA;
                    103:                                }
                    104:                                else if (streq(arg, "ecdsa") ||
                    105:                                                 streq(arg, "ecdsa-priv"))
                    106:                                {
                    107:                                        type = CRED_PRIVATE_KEY;
                    108:                                        subtype = KEY_ECDSA;
                    109:                                }
                    110:                                else if (streq(arg, "ed25519") ||
                    111:                                                 streq(arg, "ed25519-priv"))
                    112:                                {
                    113:                                        type = CRED_PRIVATE_KEY;
                    114:                                        subtype = KEY_ED25519;
                    115:                                }
                    116:                                else if (streq(arg, "ed448") ||
                    117:                                                 streq(arg, "ed448-priv"))
                    118:                                {
                    119:                                        type = CRED_PRIVATE_KEY;
                    120:                                        subtype = KEY_ED448;
                    121:                                }
                    122:                                else if (streq(arg, "bliss") ||
                    123:                                                 streq(arg, "bliss-priv"))
                    124:                                {
                    125:                                        type = CRED_PRIVATE_KEY;
                    126:                                        subtype = KEY_BLISS;
                    127:                                }
                    128:                                else
                    129:                                {
                    130:                                        return command_usage( "invalid input type");
                    131:                                }
                    132:                                continue;
                    133:                        case 'i':
                    134:                                file = arg;
                    135:                                continue;
                    136:                        case 'x':
                    137:                                keyid = arg;
                    138:                                continue;
                    139:                        case EOF:
                    140:                                break;
                    141:                        default:
                    142:                                return command_usage("invalid --print option");
                    143:                }
                    144:                break;
                    145:        }
                    146:        if (keyid)
                    147:        {
                    148:                chunk = chunk_from_hex(chunk_create(keyid, strlen(keyid)), NULL);
                    149:                cred = lib->creds->create(lib->creds, type, subtype,
                    150:                                                                  BUILD_PKCS11_KEYID, chunk, BUILD_END);
                    151:                free(chunk.ptr);
                    152:        }
                    153:        else if (file)
                    154:        {
                    155:                cred = lib->creds->create(lib->creds, type, subtype,
                    156:                                                                  BUILD_FROM_FILE, file, BUILD_END);
                    157:        }
                    158:        else
                    159:        {
                    160:                set_file_mode(stdin, CERT_ASN1_DER);
                    161:                if (!chunk_from_fd(0, &chunk))
                    162:                {
                    163:                        fprintf(stderr, "reading input failed: %s\n", strerror(errno));
                    164:                        return 1;
                    165:                }
                    166:                cred = lib->creds->create(lib->creds, type, subtype,
                    167:                                                                  BUILD_BLOB, chunk, BUILD_END);
                    168:                free(chunk.ptr);
                    169:        }
                    170:        if (!cred)
                    171:        {
                    172:                fprintf(stderr, "parsing input failed\n");
                    173:                return 1;
                    174:        }
                    175: 
                    176:        if (type == CRED_CERTIFICATE)
                    177:        {
                    178:                certificate_t *cert = (certificate_t*)cred;
                    179:                certificate_printer_t *printer;
                    180: 
                    181:                printer = certificate_printer_create(stdout, TRUE, FALSE);
                    182:                printer->print(printer, cert, FALSE);
                    183:                printer->destroy(printer);
                    184:                cert->destroy(cert);
                    185:        }
                    186:        if (type == CRED_PRIVATE_KEY)
                    187:        {
                    188:                private_key_t *key = (private_key_t*)cred;
                    189: 
                    190:                print_key(key);
                    191:                key->destroy(key);
                    192:        }
                    193: 
                    194:        return 0;
                    195: }
                    196: 
                    197: /**
                    198:  * Register the command.
                    199:  */
                    200: static void __attribute__ ((constructor))reg()
                    201: {
                    202:        command_register((command_t)
                    203:                { print, 'a', "print",
                    204:                "print a credential in a human readable form",
                    205:                {"[--in file|--keyid hex]",
                    206:                 "[--type x509|crl|ac|pub|priv|rsa|ecdsa|ed25519|ed448|bliss]"},
                    207:                {
                    208:                        {"help",        'h', 0, "show usage information"},
                    209:                        {"in",          'i', 1, "input file, default: stdin"},
                    210:                        {"keyid",       'x', 1, "smartcard or TPM object handle"},
                    211:                        {"type",        't', 1, "type of credential, default: x509"},
                    212:                }
                    213:        });
                    214: }

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