Annotation of embedaddon/strongswan/src/pki/commands/dn.c, revision 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>