pki: Support an --addrblock option for self-signed certificates
authorMartin Willi <martin@strongswan.org>
Tue, 21 Feb 2017 14:07:03 +0000 (15:07 +0100)
committerMartin Willi <martin@strongswan.org>
Mon, 27 Feb 2017 08:36:48 +0000 (09:36 +0100)
src/pki/commands/self.c
src/pki/man/pki---self.1.in

index 1899daa..b894ac1 100644 (file)
@@ -22,6 +22,7 @@
 #include <collections/linked_list.h>
 #include <credentials/certificates/certificate.h>
 #include <credentials/certificates/x509.h>
+#include <selectors/traffic_selector.h>
 #include <asn1/asn1.h>
 
 /**
@@ -57,6 +58,7 @@ static int self()
        char *file = NULL, *dn = NULL, *hex = NULL, *error = NULL, *keyid = NULL;
        identification_t *id = NULL;
        linked_list_t *san, *ocsp, *permitted, *excluded, *policies, *mappings;
+       linked_list_t *addrblocks;
        int pathlen = X509_NO_CONSTRAINT, inhibit_any = X509_NO_CONSTRAINT;
        int inhibit_mapping = X509_NO_CONSTRAINT;
        int require_explicit = X509_NO_CONSTRAINT;
@@ -66,6 +68,7 @@ static int self()
        char *datenb = NULL, *datena = NULL, *dateform = NULL;
        x509_flag_t flags = 0;
        x509_cert_policy_t *policy = NULL;
+       traffic_selector_t *ts;
        char *arg;
 
        san = linked_list_create();
@@ -74,6 +77,7 @@ static int self()
        excluded = linked_list_create();
        policies = linked_list_create();
        mappings = linked_list_create();
+       addrblocks = linked_list_create();
 
        while (TRUE)
        {
@@ -153,6 +157,15 @@ static int self()
                        case 'p':
                                pathlen = atoi(arg);
                                continue;
+                       case 'B':
+                               ts = parse_ts(arg);
+                               if (!ts)
+                               {
+                                       error = "invalid addressBlock";
+                                       goto usage;
+                               }
+                               addrblocks->insert_last(addrblocks, ts);
+                               continue;
                        case 'n':
                                permitted->insert_last(permitted,
                                                                           identification_create_from_string(arg));
@@ -360,6 +373,7 @@ static int self()
                                                BUILD_NOT_AFTER_TIME, not_after, BUILD_SERIAL, serial,
                                                BUILD_DIGEST_ALG, digest, BUILD_X509_FLAG, flags,
                                                BUILD_PATHLEN, pathlen, BUILD_SUBJECT_ALTNAMES, san,
+                                               BUILD_ADDRBLOCKS, addrblocks,
                                                BUILD_OCSP_ACCESS_LOCATIONS, ocsp,
                                                BUILD_PERMITTED_NAME_CONSTRAINTS, permitted,
                                                BUILD_EXCLUDED_NAME_CONSTRAINTS, excluded,
@@ -394,6 +408,7 @@ end:
        san->destroy_offset(san, offsetof(identification_t, destroy));
        permitted->destroy_offset(permitted, offsetof(identification_t, destroy));
        excluded->destroy_offset(excluded, offsetof(identification_t, destroy));
+       addrblocks->destroy_offset(addrblocks, offsetof(traffic_selector_t, destroy));
        policies->destroy_function(policies, (void*)destroy_cert_policy);
        mappings->destroy_function(mappings, (void*)destroy_policy_mapping);
        ocsp->destroy(ocsp);
@@ -411,6 +426,7 @@ usage:
        san->destroy_offset(san, offsetof(identification_t, destroy));
        permitted->destroy_offset(permitted, offsetof(identification_t, destroy));
        excluded->destroy_offset(excluded, offsetof(identification_t, destroy));
+       addrblocks->destroy_offset(addrblocks, offsetof(traffic_selector_t, destroy));
        policies->destroy_function(policies, (void*)destroy_cert_policy);
        mappings->destroy_function(mappings, (void*)destroy_policy_mapping);
        ocsp->destroy(ocsp);
@@ -449,6 +465,7 @@ static void __attribute__ ((constructor))reg()
                        {"serial",                      's', 1, "serial number in hex, default: random"},
                        {"ca",                          'b', 0, "include CA basicConstraint, default: no"},
                        {"pathlen",                     'p', 1, "set path length constraint"},
+                       {"addrblock",           'B', 1, "RFC 3779 addrBlock to include"},
                        {"nc-permitted",        'n', 1, "add permitted NameConstraint"},
                        {"nc-excluded",         'N', 1, "add excluded NameConstraint"},
                        {"cert-policy",         'P', 1, "certificatePolicy OID to include"},
index 81f59bb..ec38e6d 100644 (file)
@@ -22,6 +22,7 @@ pki \-\-self \- Create a self-signed certificate
 .OP \-\-ca
 .OP \-\-ocsp uri
 .OP \-\-pathlen len
+.OP \-\-addrblock block
 .OP \-\-nc-permitted name
 .OP \-\-nc-excluded name
 .OP \-\-policy\-mapping mapping
@@ -127,6 +128,11 @@ times.
 .BI "\-p, \-\-pathlen " len
 Set path length constraint.
 .TP
+.BI "\-B, \-\-addrblock " block
+RFC 3779 address block to include in certificate. \fIblock\fR is either a
+CIDR subnet (such as \fI10.0.0.0/8\fR) or an arbitrary address range
+(\fI192.168.1.7-192.168.1.13\fR). Can be repeated to include multiple blocks.
+.TP
 .BI "\-n, \-\-nc-permitted " name
 Add permitted NameConstraint extension to certificate. For DNS or email
 constraints, the identity type is not always detectable by the given name. Use