aboutsummaryrefslogtreecommitdiff
path: root/openssl/trunk/crypto/x509v3/v3_asid.c
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2006-07-18 21:34:32 +0000
committerRob Austein <sra@hactrn.net>2006-07-18 21:34:32 +0000
commitb8d34feecc7a8b0033b08f45739df3d42fc8c64a (patch)
treef844372a590144067326ada6b248444b4b4b8ee6 /openssl/trunk/crypto/x509v3/v3_asid.c
parentebe9ea655f85106c74b490be9d462078e9e7e9a5 (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.c129
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 */
+};