aboutsummaryrefslogtreecommitdiff
path: root/rcynic
diff options
context:
space:
mode:
authorRob Austein <sra@hactrn.net>2013-11-22 05:28:06 +0000
committerRob Austein <sra@hactrn.net>2013-11-22 05:28:06 +0000
commitaf0494654bb1d5fe476eb4e164f93e9903f08bd2 (patch)
tree3708566d434ac01a2f6160cd24c5fa3036526858 /rcynic
parentb6567fdf3afefb203a36e40c9e60d6494be5ff5e (diff)
Add NIDs for OIDs OpenSSL doesn't know about, convert all use of
literal OIDs in rcynic to use the NID API. We could probably do something a bit prettier with a .h file built by a script, but this addresses the basic problem. Closes #263. svn path=/trunk/; revision=5598
Diffstat (limited to 'rcynic')
-rw-r--r--rcynic/rcynic.c184
1 files changed, 111 insertions, 73 deletions
diff --git a/rcynic/rcynic.c b/rcynic/rcynic.c
index 0c580c69..c189d960 100644
--- a/rcynic/rcynic.c
+++ b/rcynic/rcynic.c
@@ -580,54 +580,88 @@ struct rcynic_ctx {
log_level_t log_level;
X509_STORE *x509_store;
};
-
-/**
- * Subversion ID data.
- */
-static const char svn_id[] = "$Id$";
+
/*
- * ASN.1 Object identifiers in form suitable for use with oid_cmp()
+ * Handle NIDs we wish OpenSSL knew about. This is carefully (we
+ * hope) written to do nothing at all for any NID that OpenSSL knows
+ * about; the intent is just to add definitions for things OpenSSL
+ * doesn't know about yet. Of necessity, this is a bit gross, since
+ * it confounds runtime static variables with predefined macro names,
+ * but we try to put all the magic associated with this in one place.
+ *
+ * In the long run it might be cleaner to generate this with a trivial
+ * script and put the result in a shared .h file, but this will do for
+ * the moment.
*/
-/** 1.3.6.1.5.5.7.48.2 */
-static const unsigned char id_ad_caIssuers[] =
- {0x2b, 0x6, 0x1, 0x5, 0x5, 0x7, 0x30, 0x2};
+#ifndef NID_ad_rpkiManifest
+static int NID_ad_rpkiManifest;
+#endif
+
+#ifndef NID_ad_signedObject
+static int NID_ad_signedObject;
+#endif
+
+#ifndef NID_ct_ROA
+static int NID_ct_ROA;
+#endif
+
+#ifndef NID_ct_rpkiManifest
+static int NID_ct_rpkiManifest;
+#endif
+
+#ifndef NID_ct_rpkiGhostbusters
+static int NID_ct_rpkiGhostbusters;
+#endif
+
+#ifndef NID_cp_ipAddr_asNumber
+static int NID_cp_ipAddr_asNumber;
+#endif
+
+/**
+ * Missing NIDs, if any.
+ */
+static const struct {
+ int *nid;
+ const char *oid;
+ const char *sn;
+ const char *ln;
+} missing_nids[] = {
+
+#ifndef NID_ad_rpkiManifest
+ {&NID_ad_rpkiManifest, "1.3.6.1.5.5.7.48.10", "id-ad-rpkiManifest", "RPKI Manifest"},
+#endif
-/** 1.3.6.1.5.5.7.48.5 */
-static const unsigned char id_ad_caRepository[] =
- {0x2b, 0x6, 0x1, 0x5, 0x5, 0x7, 0x30, 0x5};
+#ifndef NID_ad_signedObject
+ {&NID_ad_signedObject, "1.3.6.1.5.5.7.48.11", "id-ad-signedObject", "Signed Object"},
+#endif
-/** 1.3.6.1.5.5.7.48.10 */
-static const unsigned char id_ad_rpkiManifest[] =
- {0x2b, 0x6, 0x1, 0x5, 0x5, 0x7, 0x30, 0xa};
+#ifndef NID_ct_ROA
+ {&NID_ct_ROA, "1.2.840.113549.1.9.16.1.24", "id-ct-routeOriginAttestation", "ROA eContent"},
+#endif
-/** 1.3.6.1.5.5.7.48.11 */
-static const unsigned char id_ad_signedObject[] =
- {0x2b, 0x6, 0x1, 0x5, 0x5, 0x7, 0x30, 0xb};
+#ifndef NID_ct_rpkiManifest
+ {&NID_ct_rpkiManifest, "1.2.840.113549.1.9.16.1.26", "id-ct-rpkiManifest", "RPKI Manifest eContent"},
+#endif
-/** 1.2.840.113549.1.9.16.1.24 */
-static const unsigned char id_ct_routeOriginAttestation[] =
- {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x01, 0x18};
+#ifndef NID_ct_rpkiGhostbusters
+ {&NID_ct_rpkiGhostbusters, "1.2.840.113549.1.9.16.1.35", "id-ct-rpkiGhostbusters", "RPKI Ghostbusters eContent"},
+#endif
-/** 1.2.840.113549.1.9.16.1.26 */
-static const unsigned char id_ct_rpkiManifest[] =
- {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x01, 0x1a};
+#ifndef NID_cp_ipAddr_asNumber
+ {&NID_cp_ipAddr_asNumber, "1.3.6.1.5.5.7.14.2", "id-cp-ipAddr-asNumber", "RPKI Certificate Policy"}
+#endif
-/** 1.2.840.113549.1.9.16.1.35 */
-static const unsigned char id_ct_rpkiGhostbusters[] =
- {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x10, 0x01, 0x23};
+};
-/** 2.16.840.1.101.3.4.2.1 */
-static const unsigned char id_sha256[] =
- {0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01};
+
/**
- * RPKI certificate policy OID in form suitable for use with
- * X509_VERIFY_PARAM_add0_policy().
+ * Subversion ID data.
*/
-static const char rpki_policy_oid[] = "1.3.6.1.5.5.7.14.2";
+static const char svn_id[] = "$Id$";
/**
* Suffix we use temporarily during the symlink shuffle. Could be
@@ -655,6 +689,26 @@ static int NID_binary_signing_time;
/**
+ * Handle missing NIDs.
+ */
+static int
+create_missing_nids(void)
+{
+ int i;
+
+ for (i = 0; i < (int) (sizeof(missing_nids) / sizeof(*missing_nids)); i++)
+ if ((*missing_nids[i].nid = OBJ_txt2nid(missing_nids[i].oid)) == NID_undef &&
+ (*missing_nids[i].nid = OBJ_create(missing_nids[i].oid,
+ missing_nids[i].sn,
+ missing_nids[i].ln)) == NID_undef)
+ return 0;
+
+ return 1;
+}
+
+
+
+/**
* Type-safe wrapper around free() to keep safestack macros happy.
*/
static void OPENSSL_STRING_free(OPENSSL_STRING s)
@@ -1041,18 +1095,6 @@ static int uri_to_filename(const rcynic_ctx_t *rc,
}
/**
- * OID comparison.
- */
-static int oid_cmp(const ASN1_OBJECT *obj, const unsigned char *oid, const size_t oidlen)
-{
- assert(obj != NULL && oid != NULL);
- if (obj->length != oidlen)
- return obj->length - oidlen;
- else
- return memcmp(obj->data, oid, oidlen);
-}
-
-/**
* Compare filename fields of two FileAndHash structures.
*/
static int FileAndHash_name_cmp(const FileAndHash * const *a, const FileAndHash * const *b)
@@ -3143,20 +3185,19 @@ static int extract_access_uri(rcynic_ctx_t *rc,
const uri_t *uri,
const object_generation_t generation,
const AUTHORITY_INFO_ACCESS *xia,
- const unsigned char *oid,
- const int oidlen,
+ const int nid,
uri_t *result,
int *count)
{
int i;
- assert(rc && uri && xia && oid && result && count);
+ assert(rc && uri && xia && result && count);
for (i = 0; i < sk_ACCESS_DESCRIPTION_num(xia); i++) {
ACCESS_DESCRIPTION *a = sk_ACCESS_DESCRIPTION_value(xia, i);
if (a == NULL || a->location->type != GEN_URI)
return 0;
- if (oid_cmp(a->method, oid, oidlen))
+ if (OBJ_obj2nid(a->method) != nid)
continue;
++*count;
if (!is_rsync((char *) a->location->d.uniformResourceIdentifier->data))
@@ -3674,8 +3715,7 @@ static int check_x509(rcynic_ctx_t *rc,
if ((aia = X509_get_ext_d2i(x, NID_info_access, NULL, NULL)) != NULL) {
int n_caIssuers = 0;
ex_count--;
- if (!extract_access_uri(rc, uri, generation, aia,
- id_ad_caIssuers, sizeof(id_ad_caIssuers),
+ if (!extract_access_uri(rc, uri, generation, aia, NID_ad_ca_issuers,
&certinfo->aia, &n_caIssuers) ||
!certinfo->aia.s[0] ||
sk_ACCESS_DESCRIPTION_num(aia) != n_caIssuers) {
@@ -3698,12 +3738,12 @@ static int check_x509(rcynic_ctx_t *rc,
int got_caDirectory, got_rpkiManifest, got_signedObject;
int n_caDirectory = 0, n_rpkiManifest = 0, n_signedObject = 0;
ex_count--;
- ok = (extract_access_uri(rc, uri, generation, sia, id_ad_caRepository,
- sizeof(id_ad_caRepository), &certinfo->sia, &n_caDirectory) &&
- extract_access_uri(rc, uri, generation, sia, id_ad_rpkiManifest,
- sizeof(id_ad_rpkiManifest), &certinfo->manifest, &n_rpkiManifest) &&
- extract_access_uri(rc, uri, generation, sia, id_ad_signedObject,
- sizeof(id_ad_signedObject), &certinfo->signedobject, &n_signedObject));
+ ok = (extract_access_uri(rc, uri, generation, sia, NID_caRepository,
+ &certinfo->sia, &n_caDirectory) &&
+ extract_access_uri(rc, uri, generation, sia, NID_ad_rpkiManifest,
+ &certinfo->manifest, &n_rpkiManifest) &&
+ extract_access_uri(rc, uri, generation, sia, NID_ad_signedObject,
+ &certinfo->signedobject, &n_signedObject));
got_caDirectory = certinfo->sia.s[0] != '\0';
got_rpkiManifest = certinfo->manifest.s[0] != '\0';
got_signedObject = certinfo->signedobject.s[0] != '\0';
@@ -3988,7 +4028,7 @@ static int check_x509(rcynic_ctx_t *rc,
X509_VERIFY_PARAM_set_flags(rctx.ctx.param, flags);
- X509_VERIFY_PARAM_add0_policy(rctx.ctx.param, OBJ_txt2obj(rpki_policy_oid, 1));
+ X509_VERIFY_PARAM_add0_policy(rctx.ctx.param, OBJ_nid2obj(NID_cp_ipAddr_asNumber));
if (X509_verify_cert(&rctx.ctx) <= 0) {
log_validation_status(rc, uri, certificate_failed_validation, generation);
@@ -4054,12 +4094,10 @@ static int check_cms(rcynic_ctx_t *rc,
BIO *bio,
const unsigned char *hash,
const size_t hashlen,
- const unsigned char *expected_eContentType,
- const size_t expected_eContentType_len,
+ const int expected_eContentType_nid,
const int require_inheritance,
const object_generation_t generation)
{
- const ASN1_OBJECT *eContentType = NULL;
STACK_OF(CMS_SignerInfo) *signer_infos = NULL;
CMS_ContentInfo *cms = NULL;
CMS_SignerInfo *si = NULL;
@@ -4074,7 +4112,7 @@ static int check_cms(rcynic_ctx_t *rc,
certinfo_t certinfo_;
int i, result = 0;
- assert(rc && wsk && uri && path && prefix && expected_eContentType);
+ assert(rc && wsk && uri && path && prefix);
if (!certinfo)
certinfo = &certinfo_;
@@ -4097,9 +4135,7 @@ static int check_cms(rcynic_ctx_t *rc,
goto error;
}
- if (!(eContentType = CMS_get0_eContentType(cms)) ||
- oid_cmp(eContentType, expected_eContentType,
- expected_eContentType_len)) {
+ if (OBJ_obj2nid(CMS_get0_eContentType(cms)) != expected_eContentType_nid) {
log_validation_status(rc, uri, bad_cms_econtenttype, generation);
goto error;
}
@@ -4157,7 +4193,7 @@ static int check_cms(rcynic_ctx_t *rc,
goto error;
}
- if (oid_cmp(oid, expected_eContentType, expected_eContentType_len)) {
+ if (OBJ_obj2nid(oid) != expected_eContentType_nid) {
log_validation_status(rc, uri, bad_cms_si_contenttype, generation);
goto error;
}
@@ -4330,7 +4366,7 @@ static Manifest *check_manifest_1(rcynic_ctx_t *rc,
}
if (!check_cms(rc, wsk, uri, path, prefix, &cms, &x, certinfo, bio, NULL, 0,
- id_ct_rpkiManifest, sizeof(id_ct_rpkiManifest), 1, generation))
+ NID_ct_rpkiManifest, 1, generation))
goto done;
if ((manifest = ASN1_item_d2i_bio(ASN1_ITEM_rptr(Manifest), bio, NULL)) == NULL) {
@@ -4366,8 +4402,7 @@ static Manifest *check_manifest_1(rcynic_ctx_t *rc,
goto done;
}
- if (manifest->fileHashAlg == NULL ||
- oid_cmp(manifest->fileHashAlg, id_sha256, sizeof(id_sha256))) {
+ if (OBJ_obj2nid(manifest->fileHashAlg) != NID_sha256) {
log_validation_status(rc, uri, nonconformant_digest_algorithm, generation);
goto done;
}
@@ -4644,8 +4679,7 @@ static int check_roa_1(rcynic_ctx_t *rc,
}
if (!check_cms(rc, wsk, uri, path, prefix, &cms, &x, NULL, bio, NULL, 0,
- id_ct_routeOriginAttestation, sizeof(id_ct_routeOriginAttestation),
- 0, generation))
+ NID_ct_ROA, 0, generation))
goto error;
if (!(roa = ASN1_item_d2i_bio(ASN1_ITEM_rptr(ROA), bio, NULL))) {
@@ -4841,8 +4875,7 @@ static int check_ghostbuster_1(rcynic_ctx_t *rc,
#endif
if (!check_cms(rc, wsk, uri, path, prefix, &cms, &x, NULL, bio, NULL, 0,
- id_ct_rpkiGhostbusters, sizeof(id_ct_rpkiGhostbusters),
- 1, generation))
+ NID_ct_rpkiGhostbusters, 1, generation))
goto error;
#if 0
@@ -5552,6 +5585,11 @@ int main(int argc, char *argv[])
OpenSSL_add_all_algorithms();
ERR_load_crypto_strings();
+ if (!create_missing_nids()) {
+ logmsg(&rc, log_sys_err, "Couldn't initialize missing OIDs!");
+ goto done;
+ }
+
memset(&ta_dir, 0, sizeof(&ta_dir));
while ((c = getopt(argc, argv, "a:c:l:sej:u:Vx:")) > 0) {