X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/8276a9c565bc29afbc6cc120dfde0801c06c2bbd..HEAD:/base/keysz.c diff --git a/base/keysz.c b/base/keysz.c index 48c965e3..13d850a4 100644 --- a/base/keysz.c +++ b/base/keysz.c @@ -56,7 +56,7 @@ size_t keysz(size_t sz, const octet *ksz) unsigned t, u, v; ksz++; -#define ARG(i) (wd == 1 ? ksz[i] : LOAD16(2*i)) +#define ARG(i) (wd == 1 ? ksz[i] : LOAD16(ksz + 2*i)) if (sz == 0) return (ARG(0)); else switch (op) { @@ -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 -------------------------------------------------*/