summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrelyea%netscape.com <devnull@localhost>2002-01-29 17:50:27 +0000
committerrelyea%netscape.com <devnull@localhost>2002-01-29 17:50:27 +0000
commita94bd36b7999077d8174ab6263f5234d9671150b (patch)
treea212895d25dd598a6d86c5f16d157f9c0f809b0a
parent4245a9b3e922dce039074bdaa1a82025104412ea (diff)
downloadnss-hg-a94bd36b7999077d8174ab6263f5234d9671150b.tar.gz
More 'pretty print' improvements. Decode context specific data a little more.
-rw-r--r--security/nss/cmd/lib/secutil.c77
1 files changed, 69 insertions, 8 deletions
diff --git a/security/nss/cmd/lib/secutil.c b/security/nss/cmd/lib/secutil.c
index b706ab7b7..7cb6a0b43 100644
--- a/security/nss/cmd/lib/secutil.c
+++ b/security/nss/cmd/lib/secutil.c
@@ -677,6 +677,7 @@ SECU_PrintAsHex(FILE *out, SECItem *data, char *m, int level)
{
unsigned i;
int column;
+ PRBool isString = PR_TRUE;
if ( m ) {
SECU_Indent(out, level); fprintf(out, "%s:\n", m);
@@ -685,6 +686,11 @@ SECU_PrintAsHex(FILE *out, SECItem *data, char *m, int level)
SECU_Indent(out, level); column = level*INDENT_MULT;
for (i = 0; i < data->len; i++) {
+ unsigned char val = data->data[i];
+
+ if (isString && val && !isprint(val)) {
+ isString = PR_FALSE;
+ }
if (i != data->len - 1) {
fprintf(out, "%02x:", data->data[i]);
column += 4;
@@ -698,6 +704,25 @@ SECU_PrintAsHex(FILE *out, SECItem *data, char *m, int level)
SECU_Indent(out, level); column = level*INDENT_MULT;
}
}
+ if (isString) {
+ secu_Newline(out);
+ SECU_Indent(out, level); column = level*INDENT_MULT;
+ for (i = 0; i < data->len; i++) {
+ unsigned char val = data->data[i];
+
+ if (val) {
+ fprintf(out,"%c",val);
+ column++;
+ } else {
+ column = 77;
+ }
+ if (column > 76) {
+ secu_Newline(out);
+ SECU_Indent(out, level); column = level*INDENT_MULT;
+ }
+ }
+ }
+
level--;
if (column != level*INDENT_MULT) {
secu_Newline(out);
@@ -898,7 +923,7 @@ static void secu_PrintAny(FILE *out, SECItem *i, char *m, int level);
void
SECU_PrintSet(FILE *out, SECItem *t, char *m, int level)
{
- int type= t->data[0] & 0x1f;
+ int type= t->data[0] & SEC_ASN1_TAGNUM_MASK;
int start;
unsigned char *bp;
@@ -906,8 +931,8 @@ SECU_PrintSet(FILE *out, SECItem *t, char *m, int level)
if (m) {
fprintf(out, "%s: ", m);
}
- fprintf(out,"%s {\n",
- type == SEC_ASN1_SET ? "Set" : "Sequence");
+
+ fprintf(out,"%s {\n", type == SEC_ASN1_SET ? "Set" : "Sequence"); /* } */
start = 2;
if (t->data[1] & 0x80) {
@@ -932,15 +957,34 @@ SECU_PrintSet(FILE *out, SECItem *t, char *m, int level)
bp += tmp.len;
secu_PrintAny(out,&tmp,NULL,level+1);
}
- SECU_Indent(out, level); fprintf(out, "}\n");
+ /* { */SECU_Indent(out, level); fprintf(out, "}\n");
+}
+static void
+secu_PrintContextSpecific(FILE *out, SECItem *i, char *m, int level)
+{
+ int type= i->data[0] & SEC_ASN1_TAGNUM_MASK;
+ SECItem tmp;
+ int start;
+
+ SECU_Indent(out, level);
+ if (m) {
+ fprintf(out, "%s: ", m);
+ }
+ fprintf(out,"Option %d\n", type);
+ start = 2;
+ if (i->data[1] & 0x80) {
+ start = (i->data[1] & 0x7f) +1;
+ }
+ tmp.data = &i->data[start];
+ tmp.len = i->len -start;
+ SECU_PrintAsHex(out, &tmp, m, level+1);
}
-static void
-secu_PrintAny(FILE *out, SECItem *i, char *m, int level)
+static
+secu_PrintUniversal(FILE *out, SECItem *i, char *m, int level)
{
- if ( i->len ) {
- switch (i->data[0] & 0x1f) {
+ switch (i->data[0] & SEC_ASN1_TAGNUM_MASK) {
case SEC_ASN1_INTEGER:
SECU_PrintInteger(out, i, m, level);
break;
@@ -977,6 +1021,23 @@ secu_PrintAny(FILE *out, SECItem *i, char *m, int level)
SECU_PrintAsHex(out, i, m, level);
break;
}
+}
+
+static void
+secu_PrintAny(FILE *out, SECItem *i, char *m, int level)
+{
+ if ( i->len ) {
+ switch (i->data[0] & SEC_ASN1_CLASS_MASK) {
+ case SEC_ASN1_CONTEXT_SPECIFIC:
+ secu_PrintContextSpecific(out, i, m, level);
+ break;
+ case SEC_ASN1_UNIVERSAL:
+ secu_PrintUniversal(out, i, m, level);
+ break;
+ default:
+ SECU_PrintAsHex(out, i, m, level);
+ break;
+ }
}
}