security/nss/cmd/ppcertdata/ppcertdata.c

Wed, 31 Dec 2014 06:55:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:55:50 +0100
changeset 2
7e26c7da4463
permissions
-rw-r--r--

Added tag UPSTREAM_283F7C6 for changeset ca08bd8f51b2

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 #include <stdio.h>
     6 #include <string.h>
     7 #include <ctype.h>
     8 #include <stdlib.h>
     9 #include "secutil.h"
    10 #include "nss.h"
    12 unsigned char  binary_line[64 * 1024];
    14 int
    15 main(int argc, const char ** argv)
    16 {
    17     int            skip_count = 0;
    18     int            bytes_read;
    19     char           line[133];
    21     if (argc > 1) {
    22     	skip_count = atoi(argv[1]);
    23     }
    24     if (argc > 2 || skip_count < 0) {
    25         printf("Usage: %s [ skip_columns ] \n", argv[0]);
    26 	return 1;
    27     }
    29     NSS_NoDB_Init(NULL);
    31     while (fgets(line, 132, stdin) && (bytes_read = strlen(line)) > 0 ) {
    32 	int    bytes_written;
    33 	char * found;
    34 	char * in          = line       + skip_count; 
    35 	int    left        = bytes_read - skip_count;
    36 	int    is_cert;
    37 	int    is_serial;
    38 	int    is_name;
    39 	int    is_hash;
    40 	int    use_pp      = 0;
    41 	int    out = 0;
    42 	SECItem der = {siBuffer, NULL, 0 };
    44 	line[bytes_read] = 0;
    45 	if (bytes_read <= skip_count) 
    46 	    continue;
    47 	fwrite(in, 1, left, stdout);
    48 	found = strstr(in, "MULTILINE_OCTAL");
    49 	if (!found) 
    50 	    continue;
    51 	fflush(stdout);
    53 	is_cert   = (NULL != strstr(in, "CKA_VALUE"));
    54 	is_serial = (NULL != strstr(in, "CKA_SERIAL_NUMBER"));
    55 	is_name   = (NULL != strstr(in, "CKA_ISSUER")) ||
    56 		    (NULL != strstr(in, "CKA_SUBJECT"));
    57 	is_hash   = (NULL != strstr(in, "_HASH"));
    58 	while (fgets(line, 132, stdin) && 
    59 	       (bytes_read = strlen(line)) > 0 ) {
    60 	    in   = line       + skip_count; 
    61 	    left = bytes_read - skip_count;
    63 	    if ((left >= 3) && !strncmp(in, "END", 3))
    64 		break;
    65 	    while (left >= 4) {
    66 		if (in[0] == '\\'  && isdigit(in[1]) && 
    67 		    isdigit(in[2]) && isdigit(in[3])) {
    68 		    left -= 4;
    69 		    binary_line[out++] = ((in[1] - '0') << 6) |
    70 					 ((in[2] - '0') << 3) | 
    71 					  (in[3] - '0');
    72 		    in += 4;
    73 		} else 
    74 		    break;
    75 	    }
    76 	}
    77 	der.data = binary_line;
    78 	der.len  = out;
    79 	if (is_cert)
    80 	    SECU_PrintSignedData(stdout, &der, "Certificate", 0,
    81 				 SECU_PrintCertificate);
    82 	else if (is_name)
    83 	    SECU_PrintDERName(stdout, &der, "Name", 0);
    84 	else if (is_serial) {
    85 	    if (out > 2 && binary_line[0] == 2 &&
    86 	        out == 2 + binary_line[1]) {
    87 		der.data += 2;
    88 		der.len  -= 2;
    89 		SECU_PrintInteger(stdout, &der, "DER Serial Number", 0);
    90 	    } else
    91 		SECU_PrintInteger(stdout, &der, "Raw Serial Number", 0);
    92 	} else if (is_hash) 
    93 	    SECU_PrintAsHex(stdout, &der, "Hash", 0);
    94 	else 
    95 	    SECU_PrintBuf(stdout, "Other", binary_line, out);
    96     }
    97     NSS_Shutdown();
    98     return 0;
    99 }

mercurial