X-Git-Url: https://git.distorted.org.uk/~mdw/tripe/blobdiff_plain/52b866481399dfcecd295560800d3e3fe0090f24..ef09dae1af4f84ae093aa071f475d9dd1fc6b1bc:/server/servutil.c diff --git a/server/servutil.c b/server/servutil.c index 1f6301a4..70721396 100644 --- a/server/servutil.c +++ b/server/servutil.c @@ -9,19 +9,18 @@ * * This file is part of Trivial IP Encryption (TrIPE). * - * TrIPE is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * TrIPE is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 3 of the License, or (at your + * option) any later version. * - * TrIPE is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * TrIPE is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. * * You should have received a copy of the GNU General Public License - * along with TrIPE; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * along with TrIPE. If not, see . */ /*----- Header files ------------------------------------------------------*/ @@ -30,45 +29,61 @@ /*----- Global variables --------------------------------------------------*/ -octet buf_i[PKBUFSZ], buf_o[PKBUFSZ], buf_t[PKBUFSZ]; +octet buf_i[PKBUFSZ], buf_o[PKBUFSZ], buf_t[PKBUFSZ], buf_u[PKBUFSZ]; -/*----- Main code ---------------------------------------------------------*/ +/*----- Sequence numbers --------------------------------------------------*/ -/* --- @mpstr@ --- * +/* --- @seq_reset@ --- * * - * Arguments: @mp *m@ = a multiprecision integer + * Arguments: @seqwin *s@ = sequence-checking window * - * Returns: A pointer to the integer's textual representation. + * Returns: --- * - * Use: Converts a multiprecision integer to a string. Corrupts - * @buf_t@. + * Use: Resets a sequence number window. */ -const char *mpstr(mp *m) -{ - if (mp_writestring(m, (char *)buf_t, sizeof(buf_t), 10)) - return (""); - return ((const char *)buf_t); -} +void seq_reset(seqwin *s) { s->seq = 0; s->win = 0; } -/* --- @gestr@ --- * +/* --- @seq_check@ --- * * - * Arguments: @group *g@ = a group - * @ge *x@ = a group element + * Arguments: @seqwin *s@ = sequence-checking window + * @uint32 q@ = sequence number to check + * @const char *service@ = service to report message from * - * Returns: A pointer to the element's textual representation. + * Returns: Zero on success, nonzero if the sequence number was bad. * - * Use: Converts a group element to a string. Corrupts - * @buf_t@. + * Use: Checks a sequence number against the window, updating things + * as necessary. */ -const char *gestr(group *g, ge *x) +int seq_check(seqwin *s, uint32 q, const char *service) { - if (group_writestring(g, x, (char *)buf_t, sizeof(buf_t))) - return (""); - return ((const char *)buf_t); + uint32 qbit; + uint32 n; + + if (q < s->seq) { + a_warn(service, "replay", "old-sequence", A_END); + return (-1); + } + if (q >= s->seq + SEQ_WINSZ) { + n = q - (s->seq + SEQ_WINSZ - 1); + if (n < SEQ_WINSZ) + s->win >>= n; + else + s->win = 0; + s->seq += n; + } + qbit = 1 << (q - s->seq); + if (s->win & qbit) { + a_warn(service, "replay", "duplicated-sequence", A_END); + return (-1); + } + s->win |= qbit; + return (0); } +/*----- Random odds and sods ----------------------------------------------*/ + /* --- @timestr@ --- * * * Arguments: @time_t t@ = a time to convert @@ -76,7 +91,7 @@ const char *gestr(group *g, ge *x) * Returns: A pointer to a textual representation of the time. * * Use: Converts a time to a textual representation. Corrupts - * @buf_t@. + * @buf_u@. */ const char *timestr(time_t t) @@ -85,8 +100,8 @@ const char *timestr(time_t t) if (!t) return ("NEVER"); tm = localtime(&t); - strftime((char *)buf_t, sizeof(buf_t), "%Y-%m-%dT%H:%M:%S", tm); - return ((const char *)buf_t); + strftime((char *)buf_u, sizeof(buf_u), "%Y-%m-%dT%H:%M:%S", tm); + return ((const char *)buf_u); } /* --- @mystrieq@ --- * @@ -106,53 +121,19 @@ int mystrieq(const char *x, const char *y) } } -/* --- @seq_reset@ --- * +/* --- @addrsz@ --- * * - * Arguments: @seqwin *s@ = sequence-checking window + * Arguments: @const addr *a@ = a network address * - * Returns: --- - * - * Use: Resets a sequence number window. - */ - -void seq_reset(seqwin *s) { s->seq = 0; s->win = 0; } - -/* --- @seq_check@ --- * - * - * Arguments: @seqwin *s@ = sequence-checking window - * @uint32 q@ = sequence number to check - * @const char *service@ = service to report message from - * - * Returns: Zero on success, nonzero if the sequence number was bad. - * - * Use: Checks a sequence number against the window, updating things - * as necessary. + * Returns: The size of the address, for passing into the sockets API. */ -int seq_check(seqwin *s, uint32 q, const char *service) +socklen_t addrsz(const addr *a) { - uint32 qbit; - uint32 n; - - if (q < s->seq) { - a_warn(service, "replay", "old-sequence", A_END); - return (-1); + switch (a->sa.sa_family) { + case AF_INET: return (sizeof(a->sin)); + default: abort(); } - if (q >= s->seq + SEQ_WINSZ) { - n = q - (s->seq + SEQ_WINSZ - 1); - if (n < SEQ_WINSZ) - s->win >>= n; - else - s->win = 0; - s->seq += n; - } - qbit = 1 << (q - s->seq); - if (s->win & qbit) { - a_warn(service, "replay", "duplicated-sequence", A_END); - return (-1); - } - s->win |= qbit; - return (0); } /*----- That's all, folks -------------------------------------------------*/