From 898a4e2555438ff8adb08b4d82690d08715e1048 Mon Sep 17 00:00:00 2001 From: mdw Date: Thu, 8 Apr 2004 01:03:22 +0000 Subject: [PATCH] Force subkeys to be sorted in structured keys. --- key-binary.c | 49 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/key-binary.c b/key-binary.c index 82a1ecb..6726152 100644 --- a/key-binary.c +++ b/key-binary.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: key-binary.c,v 1.5 2004/04/01 12:50:09 mdw Exp $ + * $Id: key-binary.c,v 1.6 2004/04/08 01:03:22 mdw Exp $ * * Key binary encoding * @@ -30,6 +30,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: key-binary.c,v $ + * Revision 1.6 2004/04/08 01:03:22 mdw + * Force subkeys to be sorted in structured keys. + * * Revision 1.5 2004/04/01 12:50:09 mdw * Add cyclic group abstraction, with test code. Separate off exponentation * functions for better static linking. Fix a buttload of bugs on the way. @@ -217,6 +220,11 @@ int key_decode(const void *p, size_t sz, key_data *k) * Use: Encodes a key block as binary data. */ +static int ksbyname(const void *a, const void *b) { + key_struct *const *x = a, *const *y = b; + return (strcmp(SYM_NAME(*x), SYM_NAME(*y))); +} + int key_encode(key_data *k, dstr *d, const key_filter *kf) { int rc = 0; @@ -264,7 +272,7 @@ int key_encode(key_data *k, dstr *d, const key_filter *kf) case KENC_EC: { char *p; - size_t xsz, ysz; + size_t xsz = 0, ysz = 0; size_t sz; if (EC_ATINF(&k->u.e)) @@ -291,7 +299,8 @@ int key_encode(key_data *k, dstr *d, const key_filter *kf) case KENC_STRUCT: { size_t n; char *p; - key_struct *ks; + key_struct *ks, **ksv; + size_t nks, j; sym_iter i; n = d->len; @@ -299,17 +308,29 @@ int key_encode(key_data *k, dstr *d, const key_filter *kf) p = d->buf + n; STORE16(p, k->e & KF_ENCMASK); d->len += 4; - for (sym_mkiter(&i, &k->u.s); (ks = sym_next(&i)) != 0; ) { - size_t o = d->len; - DENSURE(d, 1); - *(octet *)(d->buf + d->len++) = strlen(SYM_NAME(ks)); - DPUTS(d, SYM_NAME(ks)); - while (d->len & 3) - DPUTC(d, 0); - if (key_encode(&ks->k, d, kf)) - rc = 1; - else - d->len = o; + + for (nks = 0, sym_mkiter(&i, &k->u.s); + (ks = sym_next(&i)) != 0; + nks++); + if (nks) { + ksv = xmalloc(nks * sizeof(*ksv)); + for (j = 0, sym_mkiter(&i, &k->u.s); (ks = sym_next(&i)) != 0; j++) + ksv[j] = ks; + qsort(ksv, nks, sizeof(*ksv), ksbyname); + for (j = 0; j < nks; j++) { + size_t o = d->len; + ks = ksv[j]; + DENSURE(d, 1); + *(octet *)(d->buf + d->len++) = strlen(SYM_NAME(ks)); + DPUTS(d, SYM_NAME(ks)); + while (d->len & 3) + DPUTC(d, 0); + if (key_encode(&ks->k, d, kf)) + rc = 1; + else + d->len = o; + } + xfree(ksv); } if (!rc) d->len = n; -- 2.11.0