PyTypeObject *keyszany_pytype, *keyszrange_pytype, *keyszset_pytype;
PyObject *sha_pyobj, *has160_pyobj;
+#ifndef KSZ_OPMASK
+# define KSZ_OPMASK 0x1f
+#endif
+
+#ifndef KSZ_16BIT
+# define KSZ_16BIT 0x20
+#endif
+
PyObject *keysz_pywrap(const octet *k)
{
- switch (k[0]) {
+ unsigned op = *k++;
+#define ARG(i) (op&KSZ_16BIT ? LOAD16(k + 2*(i)) : k[i])
+ switch (op&KSZ_OPMASK) {
case KSZ_ANY: {
keysz_pyobj *o = PyObject_New(keysz_pyobj, keyszany_pytype);
- o->dfl = k[1];
+ o->dfl = ARG(0);
return ((PyObject *)o);
} break;
case KSZ_RANGE: {
keyszrange_pyobj *o =
PyObject_New(keyszrange_pyobj, keyszrange_pytype);
- o->dfl = k[1];
- o->min = k[2];
- o->max = k[3];
- o->mod = k[4];
+ o->dfl = ARG(0);
+ o->min = ARG(1);
+ o->max = ARG(2);
+ o->mod = ARG(3);
if (!o->mod) o->mod = 1;
return ((PyObject *)o);
} break;
keyszset_pyobj *o =
PyObject_New(keyszset_pyobj, keyszset_pytype);
int i, n;
- o->dfl = k[1];
- for (i = 0; k[i + 1]; i++) ;
+ o->dfl = ARG(0);
+ for (i = 0; ARG(i); i++) ;
n = i; o->set = PyTuple_New(n);
for (i = 0; i < n; i++)
- PyTuple_SET_ITEM(o->set, i, PyInt_FromLong(k[i + 1]));
+ PyTuple_SET_ITEM(o->set, i, PyInt_FromLong(ARG(i)));
return ((PyObject *)o);
} break;
default:
abort();
}
+#undef ARG
}
static PyObject *keyszany_pynew(PyTypeObject *ty,
{
char *kwlist[] = { "k", 0 };
char *k;
- int sz;
+ Py_ssize_t sz;
if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#:new", kwlist, &k, &sz))
goto end;
static PyObject *gcmeth_encrypt(PyObject *me, PyObject *arg)
{
char *p;
- int sz;
+ Py_ssize_t sz;
PyObject *rc = 0;
if (!PyArg_ParseTuple(arg, "s#:encrypt", &p, &sz)) return (0);
static PyObject *gcmeth_decrypt(PyObject *me, PyObject *arg)
{
char *p;
- int sz;
+ Py_ssize_t sz;
PyObject *rc = 0;
if (!PyArg_ParseTuple(arg, "s#:decrypt", &p, &sz)) return (0);
static PyObject *gcmeth_setiv(PyObject *me, PyObject *arg)
{
char *p;
- int sz;
+ Py_ssize_t sz;
if (!PyArg_ParseTuple(arg, "s#:setiv", &p, &sz)) goto end;
+ if (!GCIPHER_C(me)->ops->setiv) VALERR("`setiv' not supported");
if (!GC_CLASS(GCIPHER_C(me))->blksz) VALERR("not a block cipher mode");
if (sz != GC_CLASS(GCIPHER_C(me))->blksz) VALERR("bad IV length");
GC_SETIV(GCIPHER_C(me), p);
static PyObject *gcmeth_bdry(PyObject *me, PyObject *arg)
{
if (!PyArg_ParseTuple(arg, ":bdry")) goto end;
+ if (!GCIPHER_C(me)->ops->bdry) VALERR("`bdry' not supported");
if (!GC_CLASS(GCIPHER_C(me))->blksz) VALERR("not a block cipher mode");
GC_BDRY(GCIPHER_C(me));
RETURN_ME;
static PyObject *ghmeth_hash(PyObject *me, PyObject *arg)
{
char *p;
- int sz;
+ Py_ssize_t sz;
if (!PyArg_ParseTuple(arg, "s#:hash", &p, &sz)) return (0);
GH_HASH(GHASH_H(me), p, sz);
RETURN_ME;
static PyObject *ghmeth_hashbuf##w(PyObject *me, PyObject *arg) \
{ \
char *p; \
- int sz; \
+ Py_ssize_t sz; \
if (!PyArg_ParseTuple(arg, "s#:hashbuf" #w, &p, &sz)) goto end; \
if (sz > MASK##n) TYERR("string too long"); \
GH_HASHBUF##W(GHASH_H(me), p, sz); \
{
char *kwlist[] = { "k", 0 };
char *k;
- int sz;
+ Py_ssize_t sz;
if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#:new", kwlist, &k, &sz))
goto end;
poly1305key_pyobj *pk = (poly1305key_pyobj *)ty;
poly1305hash_pyobj *ph;
char *m = 0;
- int sz;
+ Py_ssize_t sz;
if (!PyArg_ParseTupleAndKeywords(arg, kw, "|s#:new", kwlist, &m, &sz))
return (0);
char *kwlist[] = { "k", 0 };
poly1305key_pyobj *pk;
char *k;
- int sz;
+ Py_ssize_t sz;
if (!PyArg_ParseTupleAndKeywords(arg, kw, "s#:new", kwlist, &k, &sz))
goto end;
static PyObject *polymeth_hash(PyObject *me, PyObject *arg)
{
char *p;
- int sz;
+ Py_ssize_t sz;
if (!PyArg_ParseTuple(arg, "s#:hash", &p, &sz)) return (0);
poly1305_hash(P1305_CTX(me), p, sz);
RETURN_ME;
uint##n x; \
octet b[SZ_##W]; \
if (!PyArg_ParseTuple(arg, "O&:hashu" #w, convu##n, &x)) goto end; \
- STORE##W(b, n); poly1305_hash(P1305_CTX(me), b, sizeof(b)); \
+ STORE##W(b, x); poly1305_hash(P1305_CTX(me), b, sizeof(b)); \
RETURN_ME; \
end: \
return (0); \
static PyObject *polymeth_hashbuf##w(PyObject *me, PyObject *arg) \
{ \
char *p; \
- int sz; \
+ Py_ssize_t sz; \
octet b[SZ_##W]; \
if (!PyArg_ParseTuple(arg, "s#:hashbuf" #w, &p, &sz)) goto end; \
if (sz > MASK##n) TYERR("string too long"); \
- STORE##W(b, n); poly1305_hash(P1305_CTX(me), b, sizeof(b)); \
+ STORE##W(b, sz); poly1305_hash(P1305_CTX(me), b, sizeof(b)); \
poly1305_hash(P1305_CTX(me), p, sz); \
RETURN_ME; \
end: \
RETURN_ME;
}
+static PyObject *polymeth_flushzero(PyObject *me, PyObject *arg)
+{
+ if (!PyArg_ParseTuple(arg, ":flushzero")) return (0);
+ poly1305_flushzero(P1305_CTX(me));
+ RETURN_ME;
+}
+
static PyObject *polymeth_concat(PyObject *me, PyObject *arg)
{
PyObject *pre, *suff;
#undef METHBUF_
METH (hashstrz, "P.hashstrz(STRING)")
METH (flush, "P.flush()")
+ METH (flushzero, "P.flushzero()")
METH (concat, "P.concat(PREFIX, SUFFIX)")
METH (done, "P.done() -> TAG")
#undef METHNAME
0 /* @tp_is_gc@ */
};
+/*----- Special snowflake for HSalsa and HChaCha --------------------------*/
+
+#define DEF_HDANCE(DANCE, HDANCE, dance, hdance) \
+ static PyObject *meth_##hdance##_prf(PyObject *me, PyObject *arg) \
+ { \
+ dance##_ctx dance; \
+ char *k, *n; \
+ Py_ssize_t ksz, nsz; \
+ PyObject *rc; \
+ if (!PyArg_ParseTuple(arg, "s#s#:" #hdance "_prf", \
+ &k, &ksz, &n, &nsz)) \
+ goto end; \
+ if (ksz != DANCE##_KEYSZ) VALERR("bad key length"); \
+ if (nsz != HDANCE##_INSZ) VALERR("bad input length"); \
+ rc = bytestring_pywrap(0, HSALSA20_OUTSZ); \
+ dance##_init(&dance, k, ksz, 0); \
+ hdance##_prf(&dance, n, PyString_AS_STRING(rc)); \
+ return (rc); \
+ end: \
+ return (0); \
+ }
+
+DEF_HDANCE(SALSA20, HSALSA20, salsa20, hsalsa20)
+DEF_HDANCE(SALSA20, HSALSA20, salsa20, hsalsa2012)
+DEF_HDANCE(SALSA20, HSALSA20, salsa20, hsalsa208)
+
+DEF_HDANCE(CHACHA, HCHACHA, chacha, hchacha20)
+DEF_HDANCE(CHACHA, HCHACHA, chacha, hchacha12)
+DEF_HDANCE(CHACHA, HCHACHA, chacha, hchacha8)
/*----- Pseudorandom permutations -----------------------------------------*/
{
char *kwlist[] = { "key", 0 };
char *k;
- int sz;
+ Py_ssize_t sz;
const prpinfo *prp = GCPRP_PRP(ty);
PyObject *me;
static PyObject *gpmeth_encrypt(PyObject *me, PyObject *arg)
{
char *p;
- int n;
+ Py_ssize_t n;
PyObject *rc = 0;
if (!PyArg_ParseTuple(arg, "s#:encrypt", &p, &n)) goto end;
static PyObject *gpmeth_decrypt(PyObject *me, PyObject *arg)
{
char *p;
- int n;
+ Py_ssize_t n;
PyObject *rc = 0;
if (!PyArg_ParseTuple(arg, "s#:decrypt", &p, &n)) goto end;
toif(N) -> M: convert work factor to integer factorization problem size")
METH (_KeySZ_toec, "\
toec(N) -> M: convert work factor to elliptic curve group order")
+ METH (_KeySZ_toec, "\
+toec(N) -> M: convert work factor to elliptic curve group order")
+#define METH_HDANCE(hdance, HDance) METH(hdance##_prf, "\
+" #hdance "_prf(K, N) -> H: calculate " HDance " hash of N with K")
+ METH_HDANCE(hsalsa20, "HSalsa20")
+ METH_HDANCE(hsalsa2012, "HSalsa20/12")
+ METH_HDANCE(hsalsa208, "HSalsa20/8")
+ METH_HDANCE(hchacha20, "HChaCha20")
+ METH_HDANCE(hchacha12, "HChaCha12")
+ METH_HDANCE(hchacha8, "HChaCha8")
+#undef METH_DANCE
#undef METHNAME
{ 0 }
};