◐ Shell
clean mode source ↗

[3.5] bpo-30947: Update libexpat from 2.2.1 to 2.2.3 (#3106) by vstinner · Pull Request #3144 · python/cpython

Expand Up @@ -2,24 +2,34 @@ * siphash.h - SipHash-2-4 in a single header file * -------------------------------------------------------------------------- * Derived by William Ahern from the reference implementation[1] published[2] * by Jean-Philippe Aumasson and Daniel J. Berstein. Licensed in kind. * by Jean-Philippe Aumasson and Daniel J. Berstein. * Minimal changes by Sebastian Pipping on top, details below. * Minimal changes by Sebastian Pipping and Victor Stinner on top, see below. * Licensed under the CC0 Public Domain Dedication license. * * 1. https://www.131002.net/siphash/siphash24.c * 2. https://www.131002.net/siphash/ * -------------------------------------------------------------------------- * HISTORY: * * 2017-06-10 (Sebastian Pipping) * 2017-07-25 (Vadim Zeitlin) * - Fix use of SIPHASH_MAIN macro * * 2017-07-05 (Sebastian Pipping) * - Use _SIP_ULL macro to not require a C++11 compiler if compiled as C++ * - Add const qualifiers at two places * - Ensure <=80 characters line length (assuming tab width 4) * * 2017-06-23 (Victor Stinner) * - Address Win64 compile warnings * * 2017-06-18 (Sebastian Pipping) * - Clarify license note in the header * - Address C89 issues: * - Stop using inline keyword (and let compiler decide) * - Turn integer suffix ULL to UL * - Replace _Bool by int * - Turn macro siphash24 into a function * - Address invalid conversion (void pointer) by explicit cast * - Address lack of stdint.h for Visual Studio 2003 to 2008 * - Always expose sip24_valid (for self-tests) * * 2012-11-04 - Born. (William Ahern) Expand Down Expand Up @@ -76,7 +86,23 @@ #define SIPHASH_H
#include <stddef.h> /* size_t */ #include <stdint.h> /* uint64_t uint32_t uint8_t */
#if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER < 1600) /* For vs2003/7.1 up to vs2008/9.0; _MSC_VER 1600 is vs2010/10.0 */ typedef unsigned __int8 uint8_t; typedef unsigned __int32 uint32_t; typedef unsigned __int64 uint64_t; #else #include <stdint.h> /* uint64_t uint32_t uint8_t */ #endif

/* * Workaround to not require a C++11 compiler for using ULL suffix * if this code is included and compiled as C++; related GCC warning is: * warning: use of C++11 long long integer constant [-Wlong-long] */ #define _SIP_ULL(high, low) (((uint64_t)high << 32) | low)

#define SIP_ROTL(x, b) (uint64_t)(((x) << (b)) | ( (x) >> (64 - (b)))) Expand Down Expand Up @@ -158,11 +184,12 @@ static void sip_round(struct siphash *H, const int rounds) { } /* sip_round() */

static struct siphash *sip24_init(struct siphash *H, const struct sipkey *key) { H->v0 = 0x736f6d6570736575UL ^ key->k[0]; H->v1 = 0x646f72616e646f6dUL ^ key->k[1]; H->v2 = 0x6c7967656e657261UL ^ key->k[0]; H->v3 = 0x7465646279746573UL ^ key->k[1]; static struct siphash *sip24_init(struct siphash *H, const struct sipkey *key) { H->v0 = _SIP_ULL(0x736f6d65U, 0x70736575U) ^ key->k[0]; H->v1 = _SIP_ULL(0x646f7261U, 0x6e646f6dU) ^ key->k[1]; H->v2 = _SIP_ULL(0x6c796765U, 0x6e657261U) ^ key->k[0]; H->v3 = _SIP_ULL(0x74656462U, 0x79746573U) ^ key->k[1];
H->p = H->buf; H->c = 0; Expand All @@ -173,7 +200,8 @@ static struct siphash *sip24_init(struct siphash *H, const struct sipkey *key) {
#define sip_endof(a) (&(a)[sizeof (a) / sizeof *(a)])
static struct siphash *sip24_update(struct siphash *H, const void *src, size_t len) { static struct siphash *sip24_update(struct siphash *H, const void *src, size_t len) { const unsigned char *p = (const unsigned char *)src, *pe = p + len; uint64_t m;
Expand All @@ -198,7 +226,7 @@ static struct siphash *sip24_update(struct siphash *H, const void *src, size_t l

static uint64_t sip24_final(struct siphash *H) { char left = H->p - H->buf; const char left = (char)(H->p - H->buf); uint64_t b = (H->c + left) << 56;
switch (left) { Expand All @@ -222,7 +250,8 @@ static uint64_t sip24_final(struct siphash *H) { } /* sip24_final() */

static uint64_t siphash24(const void *src, size_t len, const struct sipkey *key) { static uint64_t siphash24(const void *src, size_t len, const struct sipkey *key) { struct siphash state = SIPHASH_INITIALIZER; return sip24_final(sip24_update(sip24_init(&state, key), src, len)); } /* siphash24() */ Expand Down Expand Up @@ -310,10 +339,11 @@ static int sip24_valid(void) { struct sipkey k; size_t i;
sip_tokey(&k, "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017"); sip_tokey(&k, "\000\001\002\003\004\005\006\007\010\011" "\012\013\014\015\016\017");
for (i = 0; i < sizeof in; ++i) { in[i] = i; in[i] = (unsigned char)i;
if (siphash24(in, i, &k) != SIP_U8TO64_LE(vectors[i])) return 0; Expand All @@ -323,12 +353,12 @@ static int sip24_valid(void) { } /* sip24_valid() */

#if SIPHASH_MAIN #ifdef SIPHASH_MAIN
#include <stdio.h>
int main(void) { int ok = sip24_valid(); const int ok = sip24_valid();
if (ok) puts("OK"); Expand Down