File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / pki / commands / dn.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 3 09:46:44 2020 UTC (4 years, 3 months ago) by misho
Branches: strongswan, MAIN
CVS tags: v5_9_2p0, v5_8_4p7, HEAD
Strongswan

    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>