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