X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/a905c0d66f0cb9d58a897a27233be1881c246a0d..c77f9bb925046e634f0ca3fb2ca45a27dc71a3a9:/base/keysz.c diff --git a/base/keysz.c b/base/keysz.c index 82919281..48c965e3 100644 --- a/base/keysz.c +++ b/base/keysz.c @@ -51,28 +51,31 @@ size_t keysz(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(2*i)) if (sz == 0) - return (ksz[1]); - else switch (ksz[0]) { - case KSZ_ANY: - return (sz); + return (ARG(0)); + else switch (op) { + case KSZ_ANY: return (sz); case KSZ_RANGE: - if (ksz[4]) - sz -= sz % ksz[4]; - if (sz < ksz[2]) - return (0); - if (ksz[3] && sz > ksz[3]) - return (ksz[3]); + t = ARG(1); u = ARG(2); v = ARG(3); + if (v) sz -= sz%v; + if (sz < t) return (0); + if (u && sz > u) return (u); return (sz); - case KSZ_SET: { - unsigned q = 0; - for (ksz++; *ksz; ksz++) { - if (sz >= *ksz && q < *ksz) - q = *ksz; + case KSZ_SET: + u = 0; + for (;;) { + t = ARG(0); ksz += wd; if (!t) break; + if (sz >= t && u < t) u = t; } - return (q); - } + return (u); } +#undef ARG assert(((void)"bad key size table", 0)); return (0);