3 * The SipHash-2-4 message authentication code
5 * (c) 2024 Straylight/Edgeware
8 /*----- Licensing notice --------------------------------------------------*
10 * This file is part of the mLib utilities library.
12 * mLib is free software: you can redistribute it and/or modify it under
13 * the terms of the GNU Library General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or (at
15 * your option) any later version.
17 * mLib is distributed in the hope that it will be useful, but WITHOUT
18 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
20 * License for more details.
22 * You should have received a copy of the GNU Library General Public
23 * License along with mLib. If not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
28 /*----- Header files ------------------------------------------------------*/
32 /*----- Main code ---------------------------------------------------------*/
34 void siphash_setkey(struct siphash_key
*k
, const octet
*p
)
35 { LOAD64_L_(k
->k0
, p
+ 0); LOAD64_L_(k
->k1
, p
+ 8); }
37 void siphash_init(struct siphash
*s
, const struct siphash_key
*k
)
38 { SIPHASH_INIT(s
->a
, s
->b
, s
->c
, s
->d
, k
); s
->n
= s
->msz
= 0; }
40 void siphash_hash(struct siphash
*s
, const void *p
, size_t sz
)
47 n
= SIPHASH_BLKSZ
- s
->n
;
49 { memcpy(s
->buf
+ s
->n
, q
, sz
); s
->n
+= sz
; return; }
52 memcpy(s
->buf
+ s
->n
, q
, n
); q
+= n
; sz
-= n
;
53 LOAD64_L_(m
, s
->buf
); SIPHASH_WORD(s
->a
, s
->b
, s
->c
, s
->d
, m
);
55 while (sz
>= SIPHASH_BLKSZ
) {
56 LOAD64_L_(m
, q
); SIPHASH_WORD(s
->a
, s
->b
, s
->c
, s
->d
, m
);
57 q
+= SIPHASH_BLKSZ
; sz
-= SIPHASH_BLKSZ
;
59 if (sz
) memcpy(s
->buf
, q
, sz
);
63 kludge64
siphash_done(struct siphash
*s
)
67 SIPHASH_FINAL(s
->a
, s
->b
, s
->c
, s
->d
, z
, s
->buf
, s
->n
, s
->msz
);
71 kludge64
siphash(const struct siphash_key
*k
, const void *p
, size_t sz
)
72 { kludge64 z
; SIPHASH(k
, z
, p
, sz
); return (z
); }
74 /*----- That's all, folks -------------------------------------------------*/