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

1.1       misho       1: /*
                      2:  * Copyright (C) 2015 Tobias Brunner
                      3:  * HSR Hochschule fuer Technik Rapperswil
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or modify it
                      6:  * under the terms of the GNU General Public License as published by the
                      7:  * Free Software Foundation; either version 2 of the License, or (at your
                      8:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                      9:  *
                     10:  * This program is distributed in the hope that it will be useful, but
                     11:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     12:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     13:  * for more details.
                     14:  */
                     15: 
                     16: #include "pki.h"
                     17: 
                     18: #include <credentials/certificates/certificate.h>
                     19: 
                     20: #include <errno.h>
                     21: 
                     22: /**
                     23:  * Extract subject DN
                     24:  */
                     25: static int dn()
                     26: {
                     27:        identification_t *id;
                     28:        certificate_t *cert;
                     29:        chunk_t chunk;
                     30:        enum {
                     31:                FORMAT_CONFIG,
                     32:                FORMAT_HEX,
                     33:                FORMAT_BASE64,
                     34:                FORMAT_BINARY,
                     35:        } format = FORMAT_CONFIG;
                     36:        char *arg, *file = NULL, *fmt;
                     37: 
                     38:        while (TRUE)
                     39:        {
                     40:                switch (command_getopt(&arg))
                     41:                {
                     42:                        case 'h':
                     43:                                return command_usage(NULL);
                     44:                        case 'f':
                     45:                                if (streq(arg, "hex"))
                     46:                                {
                     47:                                        format = FORMAT_HEX;
                     48:                                }
                     49:                                else if (streq(arg, "base64"))
                     50:                                {
                     51:                                        format = FORMAT_BASE64;
                     52:                                }
                     53:                                else if (streq(arg, "bin"))
                     54:                                {
                     55:                                        format = FORMAT_BINARY;
                     56:                                }
                     57:                                else if (!streq(arg, "config"))
                     58:                                {
                     59:                                        return command_usage( "invalid output format");
                     60:                                }
                     61:                                continue;
                     62:                        case 'i':
                     63:                                file = arg;
                     64:                                continue;
                     65:                        case EOF:
                     66:                                break;
                     67:                        default:
                     68:                                return command_usage("invalid --print option");
                     69:                }
                     70:                break;
                     71:        }
                     72:        if (file)
                     73:        {
                     74:                cert = lib->creds->create(lib->creds, CRED_CERTIFICATE, CERT_X509,
                     75:                                                                  BUILD_FROM_FILE, file, BUILD_END);
                     76:        }
                     77:        else
                     78:        {
                     79:                chunk_t chunk;
                     80: 
                     81:                set_file_mode(stdin, CERT_ASN1_DER);
                     82:                if (!chunk_from_fd(0, &chunk))
                     83:                {
                     84:                        fprintf(stderr, "reading input failed: %s\n", strerror(errno));
                     85:                        return 1;
                     86:                }
                     87:                cert = lib->creds->create(lib->creds, CRED_CERTIFICATE, CERT_X509,
                     88:                                                                  BUILD_BLOB, chunk, BUILD_END);
                     89:                free(chunk.ptr);
                     90:        }
                     91:        if (!cert)
                     92:        {
                     93:                fprintf(stderr, "parsing input failed\n");
                     94:                return 1;
                     95:        }
                     96:        id = cert->get_subject(cert);
                     97:        if (!id)
                     98:        {
                     99:                fprintf(stderr, "failed to get certificate's subject DN\n");
                    100:                cert->destroy(cert);
                    101:                return 1;
                    102:        }
                    103:        fmt = "%.*s\n";
                    104:        switch (format)
                    105:        {
                    106:                case FORMAT_CONFIG:
                    107:                        fmt = "\"asn1dn:#%.*s\"\n";
                    108:                        /* fall-through */
                    109:                case FORMAT_HEX:
                    110:                        chunk = chunk_to_hex(id->get_encoding(id), NULL, FALSE);
                    111:                        printf(fmt, (int)chunk.len, chunk.ptr);
                    112:                        chunk_free(&chunk);
                    113:                        break;
                    114:                case FORMAT_BASE64:
                    115:                        chunk = chunk_to_base64(id->get_encoding(id), NULL);
                    116:                        printf(fmt, (int)chunk.len, chunk.ptr);
                    117:                        chunk_free(&chunk);
                    118:                        break;
                    119:                case FORMAT_BINARY:
                    120:                        chunk = id->get_encoding(id);
                    121:                        if (fwrite(chunk.ptr, chunk.len, 1, stdout) != 1)
                    122:                        {
                    123:                                fprintf(stderr, "writing subject DN failed\n");
                    124:                        }
                    125:                        break;
                    126:        }
                    127:        cert->destroy(cert);
                    128:        return 0;
                    129: }
                    130: 
                    131: /**
                    132:  * Register the command.
                    133:  */
                    134: static void __attribute__ ((constructor))reg()
                    135: {
                    136:        command_register((command_t)
                    137:                { dn, 'd', "dn",
                    138:                "extract the subject DN of an X.509 certificate",
                    139:                {"[--in file] [--format config|hex|base64|bin]"},
                    140:                {
                    141:                        {"help",                'h', 0, "show usage information"},
                    142:                        {"in",                  'i', 1, "input file, default: stdin"},
                    143:                        {"format",              'f', 1, "output format, default: config"},
                    144:                }
                    145:        });
                    146: }

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