X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb-python/blobdiff_plain/b2687a0a4b3c5e45cad7c5815a6d3805bfc8d4f1..8854283a73ebad561270b3f138887ab2a90f41b5:/catacomb.c diff --git a/catacomb.c b/catacomb.c index 29f09ac..a856104 100644 --- a/catacomb.c +++ b/catacomb.c @@ -1,7 +1,5 @@ /* -*-c-*- * - * $Id$ - * * Where the fun begins * * (c) 2004 Straylight/Edgeware @@ -33,11 +31,13 @@ /*----- Main code ---------------------------------------------------------*/ static const struct nameval consts[] = { -#define C(x) { #x, x } +#define CF(f, x) { #x, f, x } +#define C(x) { #x, 0, x } C(FTY_PRIME), C(FTY_BINARY), C(PGEN_PASS), C(PGEN_FAIL), C(PGEN_BEGIN), C(PGEN_TRY), C(PGEN_DONE), C(PGEN_ABORT), C(MPW_MAX), + C(RAND_IBITS), C(PMODE_READ), C(PMODE_VERIFY), C(KOPEN_READ), C(KOPEN_WRITE), C(KOPEN_NOFILE), C(KEXP_FOREVER), C(KEXP_EXPIRE), @@ -46,10 +46,19 @@ static const struct nameval consts[] = { C(KF_CATMASK), C(KCAT_SYMM), C(KCAT_PRIV), C(KCAT_PUB), C(KCAT_SHARE), C(KF_NONSECRET), C(KF_BURN), C(KF_OPT), -#define ENTRY(tag, val, str) C(KERR_##tag), + C(EC_XONLY), C(EC_YBIT), C(EC_LSB), C(EC_CMPR), C(EC_EXPLY), C(EC_SORT), + C(X25519_KEYSZ), C(X25519_PUBSZ), C(X25519_OUTSZ), + C(X448_KEYSZ), C(X448_PUBSZ), C(X448_OUTSZ), + C(ED25519_KEYSZ), C(ED25519_PUBSZ), C(ED25519_SIGSZ), + C(ED25519_MAXPERSOSZ), + C(ED448_KEYSZ), C(ED448_PUBSZ), C(ED448_SIGSZ), C(ED448_MAXPERSOSZ), + C(AEADF_PCHSZ), C(AEADF_PCMSZ), C(AEADF_PCTSZ), + C(AEADF_AADNDEP), C(AEADF_AADFIRST), C(AEADF_NOAAD), +#define ENTRY(tag, val, str) CF(CF_SIGNED, KERR_##tag), KEY_ERRORS(ENTRY) #undef ENTRY #undef C +#undef CF { 0 } }; @@ -69,7 +78,8 @@ PyObject *mexp_common(PyObject *me, PyObject *arg, arg = PyTuple_GetItem(arg, 0); Py_INCREF(arg); if (!PySequence_Check(arg)) TYERR("not a sequence"); - n = PySequence_Size(arg); if (!n) { z = id(me); goto end; } + n = PySequence_Size(arg); if (n < 0) goto end; + if (!n) { z = id(me); goto end; } x = PySequence_GetItem(arg, 0); if (PySequence_Check(x)) flat = 0; @@ -146,11 +156,27 @@ static PyMethodDef methods[] = { { 0 } }; +static void init_random(void) +{ +#if PY_MAJOR_VERSION >= 3 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 6) + char *seed; + uint32 r; + + if (!Py_HashRandomizationFlag) return; + seed = getenv("PYTHONHASHSEED"); + if (!seed || strcmp(seed, "random") == 0) r = GR_WORD(&rand_global); + else r = strtoul(seed, 0, 0); + if (!r) r = 0xe011f220; /* zero doesn't work well */ + unihash_setkey(&unihash_global, r); +#endif +} + void init_base(void) { PyObject *mod; addmethods(methods); INIT_MODULES; + init_random(); mod = Py_InitModule("catacomb._base", donemethods()); INSERT_MODULES; INSERT("smallprimes", smallprimes());