Use RStrBuf in pkcs/x509/asn1 APIs, use RCons from RCore to print that

This commit is contained in:
pancake 2018-09-14 10:29:49 +02:00
parent e19835cbba
commit d521843ae7
9 changed files with 160 additions and 135 deletions

View File

@ -113,8 +113,7 @@ static char *signature (RBinFile *bf, bool json) {
r_json_var_free (json);
return c;
}
r_pkcs7_cms_dump (bin->cms);
return NULL;
return r_pkcs7_cms_to_string (bin->cms);
}
static RList *fields(RBinFile *bf) {

View File

@ -906,8 +906,12 @@ static void cmd_print_fromage(RCore *core, const char *input, const ut8* data, i
{
RASN1Object *asn1 = r_asn1_create_object (data, size);
if (asn1) {
r_asn1_print_object (asn1, 0);
char *res = r_asn1_to_string (asn1, 0, NULL);
r_asn1_free_object (asn1);
if (res) {
r_cons_printf ("%s\n", res);
free (res);
}
} else {
eprintf ("Malformed object: did you supply enough data?\ntry to change the block size (see b?)\n");
}
@ -917,7 +921,13 @@ static void cmd_print_fromage(RCore *core, const char *input, const ut8* data, i
{
RX509Certificate* x509 = r_x509_parse_certificate (r_asn1_create_object (data, size));
if (x509) {
r_x509_certificate_dump (x509, NULL);
RStrBuf *sb = r_strbuf_new ("");
r_x509_certificate_dump (x509, NULL, sb);
char *res = r_strbuf_drain (sb);
if (res) {
r_cons_printf ("%s\n", res);
free (res);
}
r_x509_free_certificate (x509);
} else {
eprintf ("Malformed object: did you supply enough data?\ntry to change the block size (see b?)\n");
@ -928,7 +938,11 @@ static void cmd_print_fromage(RCore *core, const char *input, const ut8* data, i
{
RCMS *cms = r_pkcs7_parse_cms (data, size);
if (cms) {
r_pkcs7_cms_dump (cms);
char *res = r_pkcs7_cms_to_string (cms);
if (res) {
r_cons_printf ("%s\n", res);
free (res);
}
r_pkcs7_free_cms (cms);
} else {
eprintf ("Malformed object: did you supply enough data?\ntry to change the block size (see b?)\n");

View File

@ -96,7 +96,8 @@ R_API RASN1String *r_asn1_stringify_boolean (const ut8 *buffer, ut32 length);
R_API RASN1String *r_asn1_stringify_oid (const ut8* buffer, ut32 length);
R_API void r_asn1_free_object (RASN1Object *object);
R_API void r_asn1_print_object (RASN1Object *object, ut32 depth);
// R_API void r_asn1_print_object (RASN1Object *object, ut32 depth);
R_API char *r_asn1_to_string (RASN1Object *object, ut32 depth, RStrBuf *sb);
R_API void r_asn1_free_string (RASN1String *string);
R_API void r_asn1_free_binary (RASN1Binary *string);

View File

@ -71,7 +71,7 @@ typedef struct r_pkcs7_container_t {
R_API RCMS *r_pkcs7_parse_cms(const ut8 *buffer, ut32 length);
R_API void r_pkcs7_free_cms(RCMS* container);
R_API void r_pkcs7_cms_dump(RCMS* container);
R_API char *r_pkcs7_cms_to_string(RCMS* container);
R_API RJSVar *r_pkcs7_cms_json(RCMS* container);
#ifdef __cplusplus

View File

@ -105,15 +105,17 @@ typedef struct r_x509_certificaterevocationlist {
} RX509CertificateRevocationList;
R_API RX509CertificateRevocationList* r_x509_parse_crl(RASN1Object *object);
R_API void r_x509_free_crl(RX509CertificateRevocationList *crl);
R_API void r_x509_crl_dump(RX509CertificateRevocationList *crl, const char* pad);
// R_API void r_x509_free_crl(RX509CertificateRevocationList *crl);
// R_API void r_x509_crl_dump(RX509CertificateRevocationList *crl, const char* pad);
R_API char *r_x509_crl_to_string(RX509CertificateRevocationList *crl, const char* pad);
R_API RJSVar *r_x509_crl_json(RX509CertificateRevocationList *crl);
R_API RX509Certificate *r_x509_parse_certificate(RASN1Object *object);
R_API RX509Certificate *r_x509_parse_certificate2(const ut8 *buffer, ut32 length);
R_API void r_x509_free_certificate(RX509Certificate* certificate);
R_API void r_x509_certificate_dump(RX509Certificate* certificate, const char* pad);
R_API char *r_x509_certificate_to_string(RX509Certificate* certificate, const char* pad);
R_API RJSVar* r_x509_certificate_json(RX509Certificate *certificate);
R_API void r_x509_certificate_dump(RX509Certificate* cert, const char* pad, RStrBuf *sb);
#ifdef __cplusplus

View File

@ -178,17 +178,22 @@ R_API void r_asn1_print_hex (RASN1Object *object, char* buffer, ut32 size) {
}
}
R_API void r_asn1_print_object (RASN1Object *object, ut32 depth) {
// R_API void r_asn1_print_object (RASN1Object *object, ut32 depth) {
R_API char *r_asn1_to_string (RASN1Object *object, ut32 depth, RStrBuf *sb) {
ut32 i;
bool root = false;
if (!object) {
return;
return NULL;
}
if (!sb) {
sb = r_strbuf_new ("");
root = true;
}
//this shall not be freed. it's a pointer into the buffer.
RASN1String* asn1str = NULL;
static char temp_name[256] = {0};
const char* name = "";
const char* string = "";
memset (temp_name, 0, sizeof (temp_name));
switch (object->klass) {
case CLASS_UNIVERSAL: // universal
@ -204,12 +209,12 @@ R_API void r_asn1_print_object (RASN1Object *object, ut32 depth) {
break;
case TAG_INTEGER:
name = "INTEGER";
r_asn1_print_hex (object, temp_name, 20);
r_asn1_print_hex (object, temp_name, sizeof (temp_name));
string = temp_name;
break;
case TAG_BITSTRING:
name = "BIT_STRING";
r_asn1_print_hex (object, temp_name, 20);
r_asn1_print_hex (object, temp_name, sizeof (temp_name));
string = temp_name;
break;
case TAG_OCTETSTRING:
@ -217,7 +222,7 @@ R_API void r_asn1_print_object (RASN1Object *object, ut32 depth) {
if (r_str_is_printable_limited ((const char *)object->sector, object->length)) {
asn1str = r_asn1_stringify_string (object->sector, object->length);
} else if (!object->list.objects) {
r_asn1_print_hex (object, temp_name, 20);
r_asn1_print_hex (object, temp_name, sizeof (temp_name));
string = temp_name;
}
break;
@ -236,7 +241,7 @@ R_API void r_asn1_print_object (RASN1Object *object, ut32 depth) {
break;
case TAG_REAL:
name = "REAL";
r_asn1_print_hex (object, temp_name, 20);
r_asn1_print_hex (object, temp_name, sizeof (temp_name));
string = temp_name;
break;
case TAG_ENUMERATED:
@ -324,13 +329,14 @@ R_API void r_asn1_print_object (RASN1Object *object, ut32 depth) {
if (asn1str) {
string = asn1str->string;
}
eprintf ("%4u:%2d: %s %-20s: %s\n", object->length, depth, object->form ? "cons" : "prim", name, string);
r_strbuf_appendf (sb, "%4u:%2d: %s %-20s: %s\n", object->length, depth, object->form ? "cons" : "prim", name, string);
r_asn1_free_string (asn1str);
if (object->list.objects) {
for (i = 0; i < object->list.length; ++i) {
r_asn1_print_object (object->list.objects[i], depth + 1);
r_asn1_to_string (object->list.objects[i], depth + 1, sb);
}
}
return root? r_strbuf_drain (sb): NULL;
}
R_API void r_asn1_free_object (RASN1Object *object) {

View File

@ -3,10 +3,11 @@
#include <stdlib.h>
#include <string.h>
#include <r_util.h>
#include <r_cons.h>
#include "./x509.h"
extern RJSVar *r_x509_name_json (RX509Name* name);
extern void r_x509_free_crl (RX509CertificateRevocationList *crl);
extern void r_x509_crlentry_dump (RX509CRLEntry *crle, const char* pad, RStrBuf *sb);
static bool r_pkcs7_parse_attributes (RPKCS7Attributes* attribute, RASN1Object *object);
static bool r_pkcs7_parse_contentinfo (RPKCS7ContentInfo* ci, RASN1Object *object) {
@ -380,7 +381,9 @@ static bool r_pkcs7_parse_attributes (RPKCS7Attributes* attributes, RASN1Object
return true;
}
void r_pkcs7_signerinfos_dump (RX509CertificateRevocationList *crl, const char* pad) {
#if 0
// XXX: unused
static void r_pkcs7_signerinfos_dump (RX509CertificateRevocationList *crl, const char* pad, RStrBuf *sb) {
RASN1String *algo = NULL, *last = NULL, *next = NULL;
ut32 i;
char *pad2, *pad3;
@ -397,18 +400,19 @@ void r_pkcs7_signerinfos_dump (RX509CertificateRevocationList *crl, const char*
algo = crl->signature.algorithm;
last = crl->lastUpdate;
next = crl->nextUpdate;
eprintf ("%sCRL:\n%sSignature:\n%s%s\n%sIssuer\n", pad, pad2, pad3, algo ? algo->string : "", pad2);
r_x509_name_dump (&crl->issuer, pad3);
eprintf ("%sLast Update: %s\n%sNext Update: %s\n%sRevoked Certificates:\n",
r_strbuf_appendf (sb, "%sCRL:\n%sSignature:\n%s%s\n%sIssuer\n", pad, pad2, pad3, algo ? algo->string : "", pad2);
r_x509_name_dump (&crl->issuer, pad3, sb);
r_strbuf_appendf (sb, "%sLast Update: %s\n%sNext Update: %s\n%sRevoked Certificates:\n",
pad2, last ? last->string : "Missing",
pad2, next ? next->string : "Missing", pad2);
for (i = 0; i < crl->length; ++i) {
r_x509_crlentry_dump (crl->revokedCertificates[i], pad3);
r_x509_crlentry_dump (crl->revokedCertificates[i], pad3, sb);
}
free (pad3);
}
#endif
static void r_x509_signedinfo_dump (RPKCS7SignerInfo *si, const char* pad) {
static void r_x509_signedinfo_dump (RPKCS7SignerInfo *si, const char* pad, RStrBuf *sb) {
RASN1String *s = NULL;
RASN1Binary *o = NULL;
ut32 i;
@ -425,35 +429,36 @@ static void r_x509_signedinfo_dump (RPKCS7SignerInfo *si, const char* pad) {
}
pad2 = pad3 + 2;
eprintf ("%sSignerInfo:\n%sVersion: v%u\n%sIssuer\n", pad, pad2, si->version + 1, pad2);
r_x509_name_dump (&si->issuerAndSerialNumber.issuer, pad3);
r_strbuf_appendf (sb, "%sSignerInfo:\n%sVersion: v%u\n%sIssuer\n", pad, pad2, si->version + 1, pad2);
r_x509_name_dump (&si->issuerAndSerialNumber.issuer, pad3, sb);
if ((o = si->issuerAndSerialNumber.serialNumber)) {
s = r_asn1_stringify_integer (o->binary, o->length);
}
eprintf ("%sSerial Number:\n%s%s\n", pad2, pad3, s ? s->string : "Missing");
r_strbuf_appendf (sb, "%sSerial Number:\n%s%s\n", pad2, pad3, s ? s->string : "Missing");
r_asn1_free_string (s);
s = si->digestAlgorithm.algorithm;
eprintf ("%sDigest Algorithm:\n%s%s\n%sAuthenticated Attributes:\n",
pad2, pad3, s ? s->string : "Missing", pad2);
r_strbuf_appendf (sb, "%sDigest Algorithm:\n%s%s\n%sAuthenticated Attributes:\n",
pad2, pad3, s ? s->string : "Missing", pad2);
for (i = 0; i < si->authenticatedAttributes.length; ++i) {
RPKCS7Attribute* attr = si->authenticatedAttributes.elements[i];
if (!attr) continue;
eprintf ("%s%s: %u bytes\n", pad3, attr->oid ? attr->oid->string : "Missing",
if (!attr) {
continue;
}
r_strbuf_appendf (sb, "%s%s: %u bytes\n", pad3, attr->oid ? attr->oid->string : "Missing",
attr->data ? attr->data->length : 0);
}
s = si->digestEncryptionAlgorithm.algorithm;
eprintf ("%sDigest Encryption Algorithm\n%s%s\n", pad2, pad3, s ? s->string : "Missing");
r_strbuf_appendf (sb, "%sDigest Encryption Algorithm\n%s%s\n", pad2, pad3, s ? s->string : "Missing");
// if ((o = si->encryptedDigest)) s = r_asn1_stringify_bytes (o->binary, o->length);
// else s = NULL;
// eprintf ("%sEncrypted Digest: %u bytes\n%s\n", pad2, o ? o->length : 0, s ? s->string : "Missing");
// r_asn1_free_string (s);
eprintf ("%sEncrypted Digest: %u bytes\n", pad2, o ? o->length : 0);
eprintf ("%sUnauthenticated Attributes:\n", pad2);
r_strbuf_appendf (sb, "%sEncrypted Digest: %u bytes\n", pad2, o ? o->length : 0);
r_strbuf_appendf (sb, "%sUnauthenticated Attributes:\n", pad2);
for (i = 0; i < si->unauthenticatedAttributes.length; ++i) {
RPKCS7Attribute* attr = si->unauthenticatedAttributes.elements[i];
if (!attr) {
@ -466,41 +471,45 @@ static void r_x509_signedinfo_dump (RPKCS7SignerInfo *si, const char* pad) {
free (pad3);
}
void r_pkcs7_cms_dump (RCMS* container) {
RPKCS7SignedData *sd;
R_API char *r_pkcs7_cms_to_string (RCMS* container) {
ut32 i;
if (!container) {
return;
return NULL;
}
sd = &container->signedData;
eprintf ("signedData\n Version: v%u\n Digest Algorithms:\n", sd->version);
RPKCS7SignedData *sd = &container->signedData;
RStrBuf *sb = r_strbuf_new ("");
r_strbuf_appendf (sb, "signedData\n Version: v%u\n Digest Algorithms:\n", sd->version);
if (container->signedData.digestAlgorithms.elements) {
eprintf("aaa\n");
for (i = 0; i < container->signedData.digestAlgorithms.length; ++i) {
if (container->signedData.digestAlgorithms.elements[i]) {
RASN1String *s = container->signedData.digestAlgorithms.elements[i]->algorithm;
eprintf (" %s\n", s ? s->string : "Missing");
r_strbuf_appendf (sb, " %s\n", s ? s->string : "Missing");
}
}
}
eprintf (" Certificates: %u\n", container->signedData.certificates.length);
r_strbuf_appendf (sb, " Certificates: %u\n", container->signedData.certificates.length);
for (i = 0; i < container->signedData.certificates.length; ++i) {
r_x509_certificate_dump (container->signedData.certificates.elements[i], " ");
r_x509_certificate_dump (container->signedData.certificates.elements[i], " ", sb);
}
for (i = 0; i < container->signedData.crls.length; ++i) {
r_x509_crl_dump (container->signedData.crls.elements[i], " ");
}
eprintf (" SignerInfos:\n");
if (container->signedData.signerinfos.elements) {
for (i = 0; i < container->signedData.signerinfos.length; ++i) {
r_x509_signedinfo_dump (container->signedData.signerinfos.elements[i], " ");
char *res = r_x509_crl_to_string (container->signedData.crls.elements[i], " ");
if (res) {
r_strbuf_append (sb, res);
free (res);
}
}
r_strbuf_appendf (sb, " SignerInfos:\n");
if (container->signedData.signerinfos.elements) {
for (i = 0; i < container->signedData.signerinfos.length; ++i) {
r_x509_signedinfo_dump (container->signedData.signerinfos.elements[i], " ", sb);
}
}
return r_strbuf_drain (sb);
}
RJSVar *r_x509_signedinfo_json (RPKCS7SignerInfo* si) {

View File

@ -265,7 +265,7 @@ RX509CRLEntry *r_x509_parse_crlentry (RASN1Object *object) {
return entry;
}
RX509CertificateRevocationList* r_x509_parse_crl (RASN1Object *object) {
R_API RX509CertificateRevocationList* r_x509_parse_crl (RASN1Object *object) {
RX509CertificateRevocationList *crl;
RASN1Object **elems;
if (!object || object->list.length < 4) {
@ -386,7 +386,7 @@ void r_x509_free_certificate (RX509Certificate * certificate) {
}
}
void r_x509_free_crlentry (RX509CRLEntry *entry) {
static void r_x509_free_crlentry (RX509CRLEntry *entry) {
if (entry) {
r_asn1_free_binary (entry->userCertificate);
r_asn1_free_string (entry->revocationDate);
@ -413,7 +413,7 @@ void r_x509_free_crl (RX509CertificateRevocationList *crl) {
}
}
void r_x509_validity_dump (RX509Validity* validity, const char* pad) {
static void r_x509_validity_dump (RX509Validity* validity, const char* pad, RStrBuf *sb) {
if (!validity) {
return;
}
@ -422,10 +422,10 @@ void r_x509_validity_dump (RX509Validity* validity, const char* pad) {
}
const char* b = validity->notBefore ? validity->notBefore->string : "Missing";
const char* a = validity->notAfter ? validity->notAfter->string : "Missing";
eprintf ("%sNot Before: %s\n%sNot After: %s\n", pad, b, pad, a);
r_strbuf_appendf (sb, "%sNot Before: %s\n%sNot After: %s\n", pad, b, pad, a);
}
void r_x509_name_dump (RX509Name* name, const char* pad) {
void r_x509_name_dump (RX509Name* name, const char* pad, RStrBuf *sb) {
ut32 i;
if (!name) {
return;
@ -437,11 +437,11 @@ void r_x509_name_dump (RX509Name* name, const char* pad) {
if (!name->oids[i] || !name->names[i]) {
continue;
}
eprintf ("%s%s: %s\n", pad, name->oids[i]->string, name->names[i]->string);
r_strbuf_appendf (sb, "%s%s: %s\n", pad, name->oids[i]->string, name->names[i]->string);
}
}
void r_x509_subjectpublickeyinfo_dump (RX509SubjectPublicKeyInfo* spki, const char* pad) {
static void r_x509_subjectpublickeyinfo_dump (RX509SubjectPublicKeyInfo* spki, const char* pad, RStrBuf *sb) {
const char *a;
if (!spki) {
return;
@ -457,13 +457,13 @@ void r_x509_subjectpublickeyinfo_dump (RX509SubjectPublicKeyInfo* spki, const ch
// RASN1String* e = r_asn1_stringify_bytes (spki->subjectPublicKeyExponent->sector, spki->subjectPublicKeyExponent->length);
// r = snprintf (buffer, length, "%sAlgorithm: %s\n%sModule: %s\n%sExponent: %u bytes\n%s\n", pad, a, pad, m->string,
// pad, spki->subjectPublicKeyExponent->length - 1, e->string);
eprintf ("%sAlgorithm: %s\n%sModule: %s\n%sExponent: %u bytes\n", pad, a, pad, m ? m->string : "Missing",
r_strbuf_appendf (sb, "%sAlgorithm: %s\n%sModule: %s\n%sExponent: %u bytes\n", pad, a, pad, m ? m->string : "Missing",
pad, spki->subjectPublicKeyExponent ? spki->subjectPublicKeyExponent->length - 1 : 0);
r_asn1_free_string (m);
// r_asn1_free_string (e);
}
void r_x509_extensions_dump (RX509Extensions* exts, const char* pad) {
static void r_x509_extensions_dump (RX509Extensions* exts, const char* pad, RStrBuf *sb) {
ut32 i;
if (!exts) {
return;
@ -472,76 +472,75 @@ void r_x509_extensions_dump (RX509Extensions* exts, const char* pad) {
pad = "";
}
for (i = 0; i < exts->length; ++i) {
//RASN1String *s;
RX509Extension *e = exts->extensions[i];
if (!e) {
continue;
}
//TODO handle extensions..
//s = r_asn1_stringify_bytes (e->extnValue->sector, e->extnValue->length);
eprintf ("%s%s: %s\n%s%u bytes\n", pad,
e->extnID ? e->extnID->string : "Missing",
e->critical ? "critical" : "",
pad, e->extnValue ? e->extnValue->length : 0);
r_strbuf_appendf (sb, "%s%s: %s\n%s%u bytes\n", pad,
e->extnID ? e->extnID->string : "Missing",
e->critical ? "critical" : "",
pad, e->extnValue ? e->extnValue->length : 0);
//r_asn1_free_string (s);
}
}
void r_x509_tbscertificate_dump (RX509TBSCertificate* tbsc, const char* pad) {
static void r_x509_tbscertificate_dump (RX509TBSCertificate* tbsc, const char* pad, RStrBuf *sb) {
RASN1String *sid = NULL, *iid = NULL;
char *pad2;
if (!tbsc) {
return;
}
if (!pad) {
pad = "";
}
pad2 = r_str_newf ("%s ", pad);
if (!pad2) return;
eprintf ("%sVersion: v%u\n"
"%sSerial Number:\n%s %s\n"
"%sSignature Algorithm:\n%s %s\n"
"%sIssuer:\n",
pad, tbsc->version + 1,
pad, pad, tbsc->serialNumber ? tbsc->serialNumber->string : "Missing",
pad, pad, tbsc->signature.algorithm ? tbsc->signature.algorithm->string : "Missing",
pad);
r_x509_name_dump (&tbsc->issuer, pad2);
char *pad2 = r_str_newf ("%s ", pad);
if (!pad2) {
return;
}
r_strbuf_appendf (sb, "%sVersion: v%u\n"
"%sSerial Number:\n%s %s\n"
"%sSignature Algorithm:\n%s %s\n"
"%sIssuer:\n",
pad, tbsc->version + 1,
pad, pad, tbsc->serialNumber ? tbsc->serialNumber->string : "Missing",
pad, pad, tbsc->signature.algorithm ? tbsc->signature.algorithm->string : "Missing",
pad);
r_x509_name_dump (&tbsc->issuer, pad2, sb);
eprintf ("%sValidity:\n", pad);
r_x509_validity_dump (&tbsc->validity, pad2);
r_strbuf_appendf (sb, "%sValidity:\n", pad);
r_x509_validity_dump (&tbsc->validity, pad2, sb);
eprintf ("%sSubject:\n", pad);
r_x509_name_dump (&tbsc->subject, pad2);
r_strbuf_appendf (sb, "%sSubject:\n", pad);
r_x509_name_dump (&tbsc->subject, pad2, sb);
eprintf ("%sSubject Public Key Info:\n", pad);
r_x509_subjectpublickeyinfo_dump (&tbsc->subjectPublicKeyInfo, pad2);
r_strbuf_appendf (sb, "%sSubject Public Key Info:\n", pad);
r_x509_subjectpublickeyinfo_dump (&tbsc->subjectPublicKeyInfo, pad2, sb);
if (tbsc->issuerUniqueID) {
iid = r_asn1_stringify_integer (tbsc->issuerUniqueID->binary, tbsc->issuerUniqueID->length);
if (iid) {
eprintf ("%sIssuer Unique ID:\n%s %s", pad, pad, iid->string);
r_strbuf_appendf (sb, "%sIssuer Unique ID:\n%s %s", pad, pad, iid->string);
r_asn1_free_string (iid);
}
}
if (tbsc->subjectUniqueID) {
sid = r_asn1_stringify_integer (tbsc->subjectUniqueID->binary, tbsc->subjectUniqueID->length);
if (sid) {
eprintf ("%sSubject Unique ID:\n%s %s", pad, pad, sid->string);
r_strbuf_appendf (sb, "%sSubject Unique ID:\n%s %s", pad, pad, sid->string);
r_asn1_free_string (sid);
}
}
eprintf ("%sExtensions:\n", pad);
r_x509_extensions_dump (&tbsc->extensions, pad2);
r_strbuf_appendf (sb, "%sExtensions:\n", pad);
r_x509_extensions_dump (&tbsc->extensions, pad2, sb);
free (pad2);
}
void r_x509_certificate_dump (RX509Certificate* certificate, const char* pad) {
// RASN1String *signature,
void r_x509_certificate_dump (RX509Certificate* cert, const char* pad, RStrBuf *sb) {
RASN1String *algo = NULL;
char *pad2;
if (!certificate) {
if (!cert) {
return;
}
if (!pad) {
@ -551,21 +550,21 @@ void r_x509_certificate_dump (RX509Certificate* certificate, const char* pad) {
if (!pad2) {
return;
}
eprintf ("%sTBSCertificate:\n", pad);
r_x509_tbscertificate_dump (&certificate->tbsCertificate, pad2);
r_strbuf_appendf (sb, "%sTBSCertificate:\n", pad);
r_x509_tbscertificate_dump (&cert->tbsCertificate, pad2, sb);
algo = certificate->algorithmIdentifier.algorithm;
algo = cert->algorithmIdentifier.algorithm;
// signature = r_asn1_stringify_bytes (certificate->signature->binary, certificate->signature->length);
// eprintf ("%sAlgorithm:\n%s%s\n%sSignature: %u bytes\n%s\n",
// pad, pad2, algo ? algo->string : "",
// pad, certificate->signature->length, signature ? signature->string : "");
eprintf ("%sAlgorithm:\n%s%s\n%sSignature: %u bytes\n",
pad, pad2, algo ? algo->string : "", pad, certificate->signature->length);
r_strbuf_appendf (sb, "%sAlgorithm:\n%s%s\n%sSignature: %u bytes\n",
pad, pad2, algo ? algo->string : "", pad, cert->signature->length);
free (pad2);
// r_asn1_free_string (signature);
}
void r_x509_crlentry_dump (RX509CRLEntry *crle, const char* pad) {
void r_x509_crlentry_dump (RX509CRLEntry *crle, const char* pad, RStrBuf *sb) {
RASN1String *id = NULL, *utc = NULL;
if (!crle) {
return;
@ -577,44 +576,46 @@ void r_x509_crlentry_dump (RX509CRLEntry *crle, const char* pad) {
if (crle->userCertificate) {
id = r_asn1_stringify_integer (crle->userCertificate->binary, crle->userCertificate->length);
}
eprintf ("%sUser Certificate:\n%s %s\n"
"%sRevocation Date:\n%s %s\n",
pad, pad, id ? id->string : "Missing",
pad, pad, utc ? utc->string : "Missing");
r_strbuf_appendf (sb, "%sUser Certificate:\n%s %s\n"
"%sRevocation Date:\n%s %s\n",
pad, pad, id ? id->string : "Missing",
pad, pad, utc ? utc->string : "Missing");
r_asn1_free_string (id);
}
void r_x509_crl_dump (RX509CertificateRevocationList *crl, const char* pad) {
R_API char *r_x509_crl_to_string(RX509CertificateRevocationList *crl, const char* pad) {
RASN1String *algo = NULL, *last = NULL, *next = NULL;
ut32 i;
char *pad2, *pad3;
if (!crl) {
return;
return NULL;
}
if (!pad) {
pad = "";
}
pad3 = r_str_newf ("%s ", pad);
if (!pad3) return;
if (!pad3) {
return NULL;
}
pad2 = pad3 + 2;
algo = crl->signature.algorithm;
last = crl->lastUpdate;
next = crl->nextUpdate;
eprintf ("%sCRL:\n%sSignature:\n%s%s\n%sIssuer\n", pad, pad2, pad3,
RStrBuf *sb = r_strbuf_new ("");
r_strbuf_appendf (sb, "%sCRL:\n%sSignature:\n%s%s\n%sIssuer\n", pad, pad2, pad3,
algo ? algo->string : "", pad2);
r_x509_name_dump (&crl->issuer, pad3);
r_x509_name_dump (&crl->issuer, pad3, sb);
eprintf ("%sLast Update: %s\n%sNext Update: %s\n%sRevoked Certificates:\n",
r_strbuf_appendf (sb, "%sLast Update: %s\n%sNext Update: %s\n%sRevoked Certificates:\n",
pad2, last ? last->string : "Missing",
pad2, next ? next->string : "Missing", pad2);
for (i = 0; i < crl->length; ++i) {
r_x509_crlentry_dump (crl->revokedCertificates[i], pad3);
for (i = 0; i < crl->length; i++) {
r_x509_crlentry_dump (crl->revokedCertificates[i], pad3, sb);
}
free (pad3);
return r_strbuf_drain (sb);
}
RJSVar *r_x509_validity_json (RX509Validity* validity) {
@ -743,7 +744,7 @@ RJSVar *r_x509_crlentry_json (RX509CRLEntry *crle) {
return obj;
}
RJSVar *r_x509_crl_json (RX509CertificateRevocationList *crl) {
R_API RJSVar *r_x509_crl_json (RX509CertificateRevocationList *crl) {
ut32 i;
RJSVar* obj = r_json_object_new ();
RJSVar* array = NULL;

View File

@ -1,33 +1,26 @@
#ifndef R_X509_INTERNAL_H
#define R_X509_INTERNAL_H
R_API bool r_x509_parse_algorithmidentifier (RX509AlgorithmIdentifier *ai, RASN1Object * object);
R_API void r_x509_free_algorithmidentifier (RX509AlgorithmIdentifier * ai);
R_API bool r_x509_parse_algorithmidentifier(RX509AlgorithmIdentifier *ai, RASN1Object * object);
R_API void r_x509_free_algorithmidentifier(RX509AlgorithmIdentifier * ai);
R_API bool r_x509_parse_subjectpublickeyinfo (RX509SubjectPublicKeyInfo * spki, RASN1Object *object);
R_API void r_x509_free_subjectpublickeyinfo (RX509SubjectPublicKeyInfo * spki);
R_API bool r_x509_parse_subjectpublickeyinfo(RX509SubjectPublicKeyInfo * spki, RASN1Object *object);
R_API void r_x509_free_subjectpublickeyinfo(RX509SubjectPublicKeyInfo * spki);
R_API bool r_x509_parse_name (RX509Name *name, RASN1Object * object);
R_API void r_x509_free_name (RX509Name * name);
R_API bool r_x509_parse_name(RX509Name *name, RASN1Object * object);
R_API void r_x509_free_name(RX509Name * name);
R_API bool r_x509_parse_extension (RX509Extension *ext, RASN1Object * object);
R_API void r_x509_free_extension (RX509Extension * ex);
R_API bool r_x509_parse_extension(RX509Extension *ext, RASN1Object * object);
R_API void r_x509_free_extension(RX509Extension * ex);
R_API bool r_x509_parse_extensions (RX509Extensions *ext, RASN1Object * object);
R_API void r_x509_free_extensions (RX509Extensions* ex);
R_API bool r_x509_parse_extensions(RX509Extensions *ext, RASN1Object * object);
R_API void r_x509_free_extensions(RX509Extensions* ex);
R_API bool r_x509_parse_tbscertificate (RX509TBSCertificate *tbsc, RASN1Object * object);
R_API void r_x509_free_tbscertificate (RX509TBSCertificate * tbsc);
R_API bool r_x509_parse_tbscertificate(RX509TBSCertificate *tbsc, RASN1Object * object);
R_API void r_x509_free_tbscertificate(RX509TBSCertificate * tbsc);
R_API RX509CRLEntry *r_x509_parse_crlentry (RASN1Object *object);
R_API void r_x509_free_crlentry (RX509CRLEntry *entry);
R_API void r_x509_validity_dump (RX509Validity* validity, const char* pad);
R_API void r_x509_name_dump (RX509Name* name, const char* pad);
R_API void r_x509_subjectpublickeyinfo_dump (RX509SubjectPublicKeyInfo* spki, const char* pad);
R_API void r_x509_extensions_dump (RX509Extensions* exts, const char* pad);
R_API void r_x509_tbscertificate_dump (RX509TBSCertificate* tbsc, const char* pad);
R_API void r_x509_crlentry_dump (RX509CRLEntry *crle, const char* pad);
R_API RX509CRLEntry *r_x509_parse_crlentry(RASN1Object *object);
void r_x509_name_dump(RX509Name* name, const char* pad, RStrBuf *sb);
#endif /* R_X509_INTERNAL_H */