X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/96a5a09cc7d5327fad4992a8e1000d409853a000..778b9e26bfb8fa2beba1f8915164d3655538cb3a:/base/keysz.c 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 -------------------------------------------------*/