Blame nss/cmd/ppcertdata/ppcertdata.c

Packit 40b132
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit 40b132
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit 40b132
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit 40b132
Packit 40b132
#include <stdio.h>
Packit 40b132
#include <string.h>
Packit 40b132
#include <ctype.h>
Packit 40b132
#include <stdlib.h>
Packit 40b132
#include "secutil.h"
Packit 40b132
#include "nss.h"
Packit 40b132
Packit 40b132
unsigned char  binary_line[64 * 1024];
Packit 40b132
Packit 40b132
int
Packit 40b132
main(int argc, const char ** argv)
Packit 40b132
{
Packit 40b132
    int            skip_count = 0;
Packit 40b132
    int            bytes_read;
Packit 40b132
    char           line[133];
Packit 40b132
Packit 40b132
    if (argc > 1) {
Packit 40b132
    	skip_count = atoi(argv[1]);
Packit 40b132
    }
Packit 40b132
    if (argc > 2 || skip_count < 0) {
Packit 40b132
        printf("Usage: %s [ skip_columns ] \n", argv[0]);
Packit 40b132
	return 1;
Packit 40b132
    }
Packit 40b132
Packit 40b132
    NSS_NoDB_Init(NULL);
Packit 40b132
Packit 40b132
    while (fgets(line, 132, stdin) && (bytes_read = strlen(line)) > 0 ) {
Packit 40b132
	int    bytes_written;
Packit 40b132
	char * found;
Packit 40b132
	char * in          = line       + skip_count; 
Packit 40b132
	int    left        = bytes_read - skip_count;
Packit 40b132
	int    is_cert;
Packit 40b132
	int    is_serial;
Packit 40b132
	int    is_name;
Packit 40b132
	int    is_hash;
Packit 40b132
	int    use_pp      = 0;
Packit 40b132
	int    out = 0;
Packit 40b132
	SECItem der = {siBuffer, NULL, 0 };
Packit 40b132
Packit 40b132
	line[bytes_read] = 0;
Packit 40b132
	if (bytes_read <= skip_count) 
Packit 40b132
	    continue;
Packit 40b132
	fwrite(in, 1, left, stdout);
Packit 40b132
	found = strstr(in, "MULTILINE_OCTAL");
Packit 40b132
	if (!found) 
Packit 40b132
	    continue;
Packit 40b132
	fflush(stdout);
Packit 40b132
Packit 40b132
	is_cert   = (NULL != strstr(in, "CKA_VALUE"));
Packit 40b132
	is_serial = (NULL != strstr(in, "CKA_SERIAL_NUMBER"));
Packit 40b132
	is_name   = (NULL != strstr(in, "CKA_ISSUER")) ||
Packit 40b132
		    (NULL != strstr(in, "CKA_SUBJECT"));
Packit 40b132
	is_hash   = (NULL != strstr(in, "_HASH"));
Packit 40b132
	while (fgets(line, 132, stdin) && 
Packit 40b132
	       (bytes_read = strlen(line)) > 0 ) {
Packit 40b132
	    in   = line       + skip_count; 
Packit 40b132
	    left = bytes_read - skip_count;
Packit 40b132
Packit 40b132
	    if ((left >= 3) && !strncmp(in, "END", 3))
Packit 40b132
		break;
Packit 40b132
	    while (left >= 4) {
Packit 40b132
		if (in[0] == '\\'  && isdigit(in[1]) && 
Packit 40b132
		    isdigit(in[2]) && isdigit(in[3])) {
Packit 40b132
		    left -= 4;
Packit 40b132
		    binary_line[out++] = ((in[1] - '0') << 6) |
Packit 40b132
					 ((in[2] - '0') << 3) | 
Packit 40b132
					  (in[3] - '0');
Packit 40b132
		    in += 4;
Packit 40b132
		} else 
Packit 40b132
		    break;
Packit 40b132
	    }
Packit 40b132
	}
Packit 40b132
	der.data = binary_line;
Packit 40b132
	der.len  = out;
Packit 40b132
	if (is_cert)
Packit 40b132
	    SECU_PrintSignedData(stdout, &der, "Certificate", 0,
Packit 40b132
				 SECU_PrintCertificate);
Packit 40b132
	else if (is_name)
Packit 40b132
	    SECU_PrintDERName(stdout, &der, "Name", 0);
Packit 40b132
	else if (is_serial) {
Packit 40b132
	    if (out > 2 && binary_line[0] == 2 &&
Packit 40b132
	        out == 2 + binary_line[1]) {
Packit 40b132
		der.data += 2;
Packit 40b132
		der.len  -= 2;
Packit 40b132
		SECU_PrintInteger(stdout, &der, "DER Serial Number", 0);
Packit 40b132
	    } else
Packit 40b132
		SECU_PrintInteger(stdout, &der, "Raw Serial Number", 0);
Packit 40b132
	} else if (is_hash) 
Packit 40b132
	    SECU_PrintAsHex(stdout, &der, "Hash", 0);
Packit 40b132
	else 
Packit 40b132
	    SECU_PrintBuf(stdout, "Other", binary_line, out);
Packit 40b132
    }
Packit 40b132
    NSS_Shutdown();
Packit 40b132
    return 0;
Packit 40b132
}
Packit 40b132