certhtml.c
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 624 行 · 第 1/2 页
C
624 行
/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is the Netscape security libraries. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1994-2000 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL"), in which case the provisions of the GPL are applicable * instead of those above. If you wish to allow use of your * version of this file only under the terms of the GPL and not to * allow others to use your version of this file under the MPL, * indicate your decision by deleting the provisions above and * replace them with the notice and other provisions required by * the GPL. If you do not delete the provisions above, a recipient * may use your version of this file under either the MPL or the * GPL. *//* * certhtml.c --- convert a cert to html * * $Id: certhtml.c,v 1.1 2000/03/31 19:42:54 relyea%netscape.com Exp $ */#include "seccomon.h"#include "secitem.h"#include "sechash.h"#include "cert.h"#include "keyhi.h"#include "secder.h"#include "prprf.h"#include "secport.h"#include "secasn1.h"#include "pk11func.h"static char *hex = "0123456789ABCDEF";/*** Convert a der-encoded integer to a hex printable string form*/char *CERT_Hexify (SECItem *i, int do_colon){ unsigned char *cp, *end; char *rv, *o; if (!i->len) { return PORT_Strdup("00"); } rv = o = (char*) PORT_Alloc(i->len * 3); if (!rv) return rv; cp = i->data; end = cp + i->len; while (cp < end) { unsigned char ch = *cp++; *o++ = hex[(ch >> 4) & 0xf]; *o++ = hex[ch & 0xf]; if (cp != end) { if (do_colon) { *o++ = ':'; } } } *o = 0; /* Null terminate the string */ return rv;}static char *gatherStrings(char **strings){ char **strs; int len; char *ret; char *s; /* find total length of all strings */ strs = strings; len = 0; while ( *strs ) { len += PORT_Strlen(*strs); strs++; } /* alloc enough memory for it */ ret = (char*)PORT_Alloc(len + 1); if ( !ret ) { return(ret); } s = ret; /* copy the strings */ strs = strings; while ( *strs ) { PORT_Strcpy(s, *strs); s += PORT_Strlen(*strs); strs++; } return( ret );}static PRBoolCERT_IsAVAInUnicode(CERTAVA *ava, SECOidTag type){ switch(type) { case SEC_OID_AVA_COUNTRY_NAME: case SEC_OID_PKCS9_EMAIL_ADDRESS: case SEC_OID_RFC1274_MAIL: return PR_FALSE; default: if(ava->value.data[0] == SEC_ASN1_UNIVERSAL_STRING) { return PR_TRUE; } break; } return PR_FALSE;}#define BREAK "<br>"#define BREAKLEN 4#define COMMA ", "#define COMMALEN 2#define MAX_OUS 20#define MAX_DC MAX_OUSchar *CERT_FormatName (CERTName *name){ CERTRDN** rdns; CERTRDN * rdn; CERTAVA** avas; CERTAVA* ava; char * buf = 0; char * tmpbuf = 0; SECItem * cn = 0; SECItem * email = 0; SECItem * org = 0; SECItem * loc = 0; SECItem * state = 0; SECItem * country = 0; SECItem * dq = 0; unsigned len = 0; int tag; int i; int ou_count = 0; int dc_count = 0; PRBool first; SECItem * orgunit[MAX_OUS]; SECItem * dc[MAX_DC]; /* Loop over name components and gather the interesting ones */ rdns = name->rdns; while ((rdn = *rdns++) != 0) { avas = rdn->avas; while ((ava = *avas++) != 0) { tag = CERT_GetAVATag(ava); switch(tag) { case SEC_OID_AVA_COMMON_NAME: cn = CERT_DecodeAVAValue(&ava->value); len += cn->len; break; case SEC_OID_AVA_COUNTRY_NAME: country = CERT_DecodeAVAValue(&ava->value); len += country->len; break; case SEC_OID_AVA_LOCALITY: loc = CERT_DecodeAVAValue(&ava->value); len += loc->len; break; case SEC_OID_AVA_STATE_OR_PROVINCE: state = CERT_DecodeAVAValue(&ava->value); len += state->len; break; case SEC_OID_AVA_ORGANIZATION_NAME: org = CERT_DecodeAVAValue(&ava->value); len += org->len; break; case SEC_OID_AVA_DN_QUALIFIER: dq = CERT_DecodeAVAValue(&ava->value); len += dq->len; break; case SEC_OID_AVA_ORGANIZATIONAL_UNIT_NAME: if (ou_count < MAX_OUS) { orgunit[ou_count] = CERT_DecodeAVAValue(&ava->value); len += orgunit[ou_count++]->len; } break; case SEC_OID_AVA_DC: if (dc_count < MAX_DC) { dc[dc_count] = CERT_DecodeAVAValue(&ava->value); len += dc[dc_count++]->len; } break; case SEC_OID_PKCS9_EMAIL_ADDRESS: case SEC_OID_RFC1274_MAIL: email = CERT_DecodeAVAValue(&ava->value); len += email->len; break; default: break; } } } /* XXX - add some for formatting */ len += 128; /* allocate buffer */ buf = (char *)PORT_Alloc(len); if ( !buf ) { return(0); } tmpbuf = buf; if ( cn ) { PORT_Memcpy(tmpbuf, cn->data, cn->len); tmpbuf += cn->len; PORT_Memcpy(tmpbuf, BREAK, BREAKLEN); tmpbuf += BREAKLEN; SECITEM_FreeItem(cn, PR_TRUE); } if ( email ) { PORT_Memcpy(tmpbuf, email->data, email->len); tmpbuf += ( email->len ); PORT_Memcpy(tmpbuf, BREAK, BREAKLEN); tmpbuf += BREAKLEN; SECITEM_FreeItem(email, PR_TRUE); } for (i=ou_count-1; i >= 0; i--) { PORT_Memcpy(tmpbuf, orgunit[i]->data, orgunit[i]->len); tmpbuf += ( orgunit[i]->len ); PORT_Memcpy(tmpbuf, BREAK, BREAKLEN); tmpbuf += BREAKLEN; SECITEM_FreeItem(orgunit[i], PR_TRUE); } if ( dq ) { PORT_Memcpy(tmpbuf, dq->data, dq->len); tmpbuf += ( dq->len ); PORT_Memcpy(tmpbuf, BREAK, BREAKLEN); tmpbuf += BREAKLEN; SECITEM_FreeItem(dq, PR_TRUE); } if ( org ) { PORT_Memcpy(tmpbuf, org->data, org->len); tmpbuf += ( org->len ); PORT_Memcpy(tmpbuf, BREAK, BREAKLEN); tmpbuf += BREAKLEN; SECITEM_FreeItem(org, PR_TRUE); } for (i=dc_count-1; i >= 0; i--) { PORT_Memcpy(tmpbuf, dc[i]->data, dc[i]->len); tmpbuf += ( dc[i]->len ); PORT_Memcpy(tmpbuf, BREAK, BREAKLEN); tmpbuf += BREAKLEN; SECITEM_FreeItem(dc[i], PR_TRUE); } first = PR_TRUE; if ( loc ) { PORT_Memcpy(tmpbuf, loc->data, loc->len); tmpbuf += ( loc->len ); first = PR_FALSE; SECITEM_FreeItem(loc, PR_TRUE); } if ( state ) { if ( !first ) { PORT_Memcpy(tmpbuf, COMMA, COMMALEN); tmpbuf += COMMALEN; } PORT_Memcpy(tmpbuf, state->data, state->len); tmpbuf += ( state->len ); first = PR_FALSE; SECITEM_FreeItem(state, PR_TRUE); } if ( country ) { if ( !first ) { PORT_Memcpy(tmpbuf, COMMA, COMMALEN); tmpbuf += COMMALEN; } PORT_Memcpy(tmpbuf, country->data, country->len); tmpbuf += ( country->len ); first = PR_FALSE; SECITEM_FreeItem(country, PR_TRUE); } if ( !first ) { PORT_Memcpy(tmpbuf, BREAK, BREAKLEN); tmpbuf += BREAKLEN; } *tmpbuf = 0; return(buf);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?