From: Mark Wooding Date: Fri, 9 Nov 2018 18:21:34 +0000 (+0000) Subject: base/keysz.c: New function to find smallest `key' size larger. X-Git-Tag: 2.5.0~14^2~32 X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/commitdiff_plain/778b9e26bfb8fa2beba1f8915164d3655538cb3a base/keysz.c: New function to find smallest `key' size larger. Now that AEAD schemes are (ab)using key-size lists for permitted nonce lengths, it's useful to ask: what's the smallest acceptable size bigger than the amount of stuff I want to pack into this nonce? The new `keysz_pad' function answers this question. --- diff --git a/base/keysz.c b/base/keysz.c index 8e5e2caf..13d850a4 100644 --- a/base/keysz.c +++ b/base/keysz.c @@ -81,4 +81,43 @@ size_t keysz(size_t sz, const octet *ksz) return (0); } +/* --- @keysz_pad@ --- * + * + * Arguments: @size_t sz@ = a proposed key size + * @const octet *ksz@ = pointer to key size table + * + * Returns: A key size, at least as large as @sz@, or zero if no such + * size is available. + */ + +size_t keysz_pad(size_t sz, const octet *ksz) +{ + unsigned op = ksz[0]&KSZ_OPMASK; + unsigned wd = (ksz[0]&KSZ_16BIT) ? 2 : 1; + unsigned t, u, v; + + ksz++; +#define ARG(i) (wd == 1 ? ksz[i] : LOAD16(ksz + 2*i)) + switch (op) { + case KSZ_ANY: return (sz); + case KSZ_RANGE: + t = ARG(1); u = ARG(2); v = ARG(3); + if (v) { sz += v - 1; sz -= sz%v; } + if (u && sz > u) return (0); + if (sz < t) return (t); + return (sz); + case KSZ_SET: + u = 0; + for (;;) { + t = ARG(0); ksz += wd; if (!t) break; + if (sz <= t && (!u || u > t)) u = t; + } + return (u); + } +#undef ARG + + assert(((void)"bad key size table", 0)); + return (0); +} + /*----- That's all, folks -------------------------------------------------*/ diff --git a/base/keysz.h b/base/keysz.h index b83203b9..4ad772a0 100644 --- a/base/keysz.h +++ b/base/keysz.h @@ -88,6 +88,17 @@ extern size_t keysz(size_t /*sz*/, const octet */*ksz*/); #define KSZ_ASSERT(pre, sz) \ assert(((void)"Bad key size for " #pre, KSZ_CHECK(pre, sz))) +/* --- @keysz_pad@ --- * + * + * Arguments: @size_t sz@ = a proposed key size + * @const octet *ksz@ = pointer to key size table + * + * Returns: A key size, at least as large as @sz@, or zero if no such + * size is available. + */ + +extern size_t keysz_pad(size_t /*sz*/, const octet */*ksz*/); + /*----- Key size conversions ----------------------------------------------*/ /* --- @keysz_fromdl@, @_fromschnorr@, @_fromif@, @_fromec@ --- *