diff options
author | Rob Austein <sra@hactrn.net> | 2006-07-18 21:34:32 +0000 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2006-07-18 21:34:32 +0000 |
commit | b8d34feecc7a8b0033b08f45739df3d42fc8c64a (patch) | |
tree | f844372a590144067326ada6b248444b4b4b8ee6 /openssl/trunk/crypto/x509v3/v3_asid.c | |
parent | ebe9ea655f85106c74b490be9d462078e9e7e9a5 (diff) |
Hack ASN.1, add initial attempt at i2r handler.
svn path=/openssl/trunk/crypto/x509v3/v3_asid.c; revision=18
Diffstat (limited to 'openssl/trunk/crypto/x509v3/v3_asid.c')
-rw-r--r-- | openssl/trunk/crypto/x509v3/v3_asid.c | 129 |
1 files changed, 87 insertions, 42 deletions
diff --git a/openssl/trunk/crypto/x509v3/v3_asid.c b/openssl/trunk/crypto/x509v3/v3_asid.c index ef4b0b96..737f45f2 100644 --- a/openssl/trunk/crypto/x509v3/v3_asid.c +++ b/openssl/trunk/crypto/x509v3/v3_asid.c @@ -2,9 +2,9 @@ /* $Id$ */ /* - * Initial attempt to implement RFC 3779 section 3. - * I'd be very surprised if this even compiled yet, - * as I'm still figuring out OpenSSL's ASN.1 template goop. + * Initial attempt to implement RFC 3779 section 3. I'd be very + * surprised if this even compiled yet, as I'm still figuring out + * OpenSSL's ASN.1 template goop. */ #include <stdio.h> @@ -16,50 +16,95 @@ /* RFC 3779 AS ID */ -static int i2r_asid(X509V3_EXT_METHOD *method, ASIDENTIFERS *asid, BIO *out, int indent); -static ASIDENTIFERS *r2i_asid(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, char *value); +ASN1_SEQUENCE(ASRange) = { + ASN1_SIMPLE(ASRange, min, ASN1_INTEGER), + ASN1_SIMPLE(ASRange, max, ASN1_INTEGER) +} ASN1_SEQUENCE_END(ASRange) -X509V3_EXT_METHOD v3_asid = { - NID_rfc3779_asidentifer_extension, - 0, - ASN1_ITEM_ref(ASIDENTIFER_EXTENSION), - 0, 0, 0, 0, 0, 0, 0, 0, 0, - (X509V3_EXT_I2R) i2r_asid, - (X509V3_EXT_R2I) r2i_asid, - NULL -}; - -ASN1_ITEM_TEMPLATE(ASIDENTIFER_EXTENSION) = - ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE, 0, - ASIDENTIFER_EXTENSION, ASIDENTIFERS) -ASN1_ITEM_TEMPLATE_END(ASIDENTIFER_EXTENSION) - -IMPLEMENT_ASN1_FUNCTIONS(ASIDENTIFER_EXTENSION) +ASN1_CHOICE(ASIdOrRange) = { + ASN1_SIMPLE(ASIdOrRange, u.id, ASN1_INTEGER), + ASN1_SIMPLE(ASIdOrRange, u.range, ASRange) +} ASN1_CHOICE_END(ASIdOrRange) -ASN1_SEQUENCE(ASIDENTIFERS) = { - ASN1_EXP_OPT(ASIDENTIFERS, asnum, ASIDENTIFERCHOICE, 0), - ASN1_EXP_OPT(ASIDENTIFERS, rdi, ASIDENTIFERCHOICE, 1) -} ASN1_SEQUENCE_END(ASIDENTIFERS) +ASN1_CHOICE(ASIdentiferChoice) = { + ASN1_IMP(ASIdentiferChoice, u.inherit, ASN1_NULL), + ASN1_IMP_SEQUENCE_OF(ASIdentiferChoice, u.asIdsOrRanges, ASIdOrRange) +} ASN1_CHOICE_END(ASIdentiferChoice) -IMPLEMENT_ASN1_FUNCTIONS(ASIDENTIFERS) +ASN1_SEQUENCE(ASIdentifiers) = { + ASN1_EXP_OPT(ASIdentifiers, asnum, ASIdentiferChoice, 0), + ASN1_EXP_OPT(ASIdentifiers, rdi, ASIdentiferChoice, 1) +} ASN1_SEQUENCE_END(ASIdentifiers) -ASN1_CHOICE(ASIDENTIFERCHOICE) = { - ASN1_IMP(ASIDENTIFERCHOICE, inherit, ASN1_NULL, 0), - ASN1_IMP_SEQUENCE_OF(ASIDENTIFERCHOICE, asIdsOrRanges, ASIDORRANGE, 1) -} ASN1_CHOICE_END(ASIDENTIFERCHOICE) +IMPLEMENT_ASN1_FUNCTIONS(ASRange) +IMPLEMENT_ASN1_FUNCTIONS(ASIdOrRange) +IMPLEMENT_ASN1_FUNCTIONS(ASIdentiferChoice) +IMPLEMENT_ASN1_FUNCTIONS(ASIdentifiers) -IMPLEMENT_ASN1_FUNCTIONS(ASIDENTIFERCHOICE) +static int i2r_ASIdentifierChoice(BIO *out, ASIdentiferChoice *choice, int indent, const char *msg) +{ + int i; + char *s; + if (choice == NULL) + return 1; + BIO_printf(out, "%*s%s: ", indent, "", msg); + switch (choice->type) { + case ASIdentifierChoice_inherit: + BIO_puts(out, "inherit"); + break; + case ASIdentifierChoice_asIdsOrRanges: + for (i = 0; i < sk_ASIdOrRange_num(choice->u.asIdsOrRanges); i++) { + ASIdOrRange aor = sk_ASIdOrRange_num(choice->u.asIdsOrRanges, i); + if (i > 0) + BIO_puts(out, ", "); + switch (aor->type) { + case ASIdOrRange_id: + if ((s = i2s_ASN1_INTEGER(NULL, aor->u.id)) == NULL) + return 0; + BIO_puts(out, s); + OPENSSL_free(s); + break; + case ASIdOrRange_range: + if ((s = i2s_ASN1_INTEGER(NULL, aor->u.range->min)) == NULL) + return 0; + BIO_puts(out, s); + OPENSSL_free(s); + BIO_puts(out, " - "); + if ((s = i2s_ASN1_INTEGER(NULL, aor->u.range->max)) == NULL) + return 0; + BIO_puts(out, s); + OPENSSL_free(s); + break; + default: + return 0; + } + } + break; + default: + return 0; + } + BIO_puts(out, "\n"); + return 1; +} -ASN1_CHOICE(ASIDORRANGE) = { - ASN1_IMP(ASIDORRANGE, id, ASN1_INTEGER, 0), - ASN1_IMP(ASIDORRANGE, range, ASRANGE, 1) -} ASN1_CHOICE_END(ASIDORRANGE) +static int i2r_ASIdentifiers(X509V3_EXT_METHOD *method, ASIdentifiers *asid, BIO *out, int indent) +{ + return (i2r_ASIdentifierChoice(out, asid->asnum, indent, "Autonomous System Numbers") && + i2r_ASIdentifierChoice(out, asid->rdi, indent, "Routing Domain Identifiers")); +} -IMPLEMENT_ASN1_FUNCTIONS(ASIDORRANGE) +static ASIdentifiers *r2i_ASIdentifiers(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, char *value); -ASN1_SEQUENCE(ASRANGE) = { - ASN1_SIMPLE(ASRANGE, min, ASN1_INTEGER), - ASN1_SIMPLE(ASRANGE, max, ASN1_INTEGER) -} ASN1_SEQUENCE_END(ASRANGE) - -IMPLEMENT_ASN1_FUNCTIONS(ASRANGE) +X509V3_EXT_METHOD v3_asid = { + NID_ASIdentifiers, /* nid */ + 0, /* flags */ + ASN1_ITEM_ref(ASIdentifiers), /* template */ + NULL, NULL, NULL, NULL, /* Old ASN.1 functions, ignored */ + NULL, /* i2s */ + NULL, /* s2i */ + NULL, /* i2v */ + NULL, /* v2i */ + (X509V3_EXT_I2R) i2r_ASIdentifiers, /* i2r */ + (X509V3_EXT_R2I) r2i_ASIdentifiers, /* r2i */ + NULL /* extension-specific data */ +}; |