summaryrefslogtreecommitdiff
path: root/sys/src/libsec/port/x509.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-10-09 18:31:49 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2015-10-09 18:31:49 +0200
commit6bb63f78321a7c51beb88c1f340b333496d5f272 (patch)
tree921aa51600b59540390d71146f8f4fa6244de52d /sys/src/libsec/port/x509.c
parent4040ea7a5eda976098131794e8df3b162cafa8f4 (diff)
libsec: use the right string encoding for various x509 fields
C= has to be PrintableString, E= and DC= are IA5String, everything else is DirectoryString which can be PrintableString or UTF8String.
Diffstat (limited to 'sys/src/libsec/port/x509.c')
-rw-r--r--sys/src/libsec/port/x509.c43
1 files changed, 31 insertions, 12 deletions
diff --git a/sys/src/libsec/port/x509.c b/sys/src/libsec/port/x509.c
index 1b84ad89a..19119b10f 100644
--- a/sys/src/libsec/port/x509.c
+++ b/sys/src/libsec/port/x509.c
@@ -2358,12 +2358,12 @@ mkbigint(mpint *p)
}
static Elem
-mkstring(char *s)
+mkstring(char *s, int t)
{
Elem e;
e.tag.class = Universal;
- e.tag.num = IA5String;
+ e.tag.num = t;
e.val.tag = VString;
e.val.u.stringval = estrdup(s);
return e;
@@ -2451,25 +2451,44 @@ mkalg(int alg)
return mkseq(mkel(mkoid(alg_oid_tab[alg]), mkel(Null(), nil)));
}
+static int
+printable(char *s)
+{
+ int c;
+
+ while((c = (uchar)*s++) != 0){
+ if((c >= 'a' && c <= 'z')
+ || (c >= 'A' && c <= 'Z')
+ || (c >= '0' && c <= '9')
+ || strchr("'=()+,-./:? ", c) != nil)
+ continue;
+ return 0;
+ }
+ return 1;
+}
+
typedef struct Ints7pref {
- int len;
- int data[7];
+ int len;
+ int data[7];
char prefix[4];
+ int stype;
} Ints7pref;
Ints7pref DN_oid[] = {
- {4, 2, 5, 4, 6, 0, 0, 0, "C="},
- {4, 2, 5, 4, 8, 0, 0, 0, "ST="},
- {4, 2, 5, 4, 7, 0, 0, 0, "L="},
- {4, 2, 5, 4, 10, 0, 0, 0, "O="},
- {4, 2, 5, 4, 11, 0, 0, 0, "OU="},
- {4, 2, 5, 4, 3, 0, 0, 0, "CN="},
- {7, 1,2,840,113549,1,9,1, "E="},
+ {4, 2, 5, 4, 6, 0, 0, 0, "C=", PrintableString},
+ {4, 2, 5, 4, 8, 0, 0, 0, "ST=" },
+ {4, 2, 5, 4, 7, 0, 0, 0, "L=" },
+ {4, 2, 5, 4, 10, 0, 0, 0, "O=" },
+ {4, 2, 5, 4, 11, 0, 0, 0, "OU=" },
+ {4, 2, 5, 4, 3, 0, 0, 0, "CN=" },
+ {7, 1,2,840,113549,1,9,1, "E=", IA5String},
+ {7, 0,9,2342,19200300,100,1,25, "DC=",IA5String},
};
static Elem
mkname(Ints7pref *oid, char *subj)
{
- return mkset(mkel(mkseq(mkel(mkoid((Ints*)oid), mkel(mkstring(subj), nil))), nil));
+ int stype = oid->stype ? oid->stype : (printable(subj) ? PrintableString : UTF8String);
+ return mkset(mkel(mkseq(mkel(mkoid((Ints*)oid), mkel(mkstring(subj, stype), nil))), nil));
}
static Elem