+ ((gcirand_func *)info->func)(k.p, k.sz, i),
+ f_freeme));
+end:
+ return (0);
+}
+
+static PyObject *gcnrand_pynew(PyTypeObject *ty, PyObject *arg, PyObject *kw)
+{
+ const gccrand_info *info = GCCRAND_INFO(ty);
+ static const char *const kwlist[] = { "key", "nonce", 0 };
+ struct bin k, n;
+
+ if (!PyArg_ParseTupleAndKeywords(arg, kw, "O&O&:new", KWLIST,
+ convbin, &k, convbin, &n))
+ goto end;
+ if (keysz(k.sz, info->keysz) != k.sz) VALERR("bad key length");
+ if (n.sz != info->noncesz) VALERR("bad nonce length");
+ return (grand_dopywrap(ty,
+ ((gcnrand_func *)info->func)(k.p, k.sz, n.p),
+ f_freeme));
+end:
+ return (0);
+}
+
+static PyObject *gcshakyrand_pynew(PyTypeObject *ty,
+ PyObject *arg, PyObject *kw)
+{
+ const gccrand_info *info = GCCRAND_INFO(ty);
+ static const char
+ *const kwlist_shake[] = { "key", "func", "perso", 0 },
+ *const kwlist_func[] = { "key", "perso", 0 };
+ struct bin k, f = { 0, 0 }, p = { 0, 0 };
+
+ if ((info->f&RNGF_MASK) == RNG_SHAKE
+ ? !PyArg_ParseTupleAndKeywords(arg, kw, "O&|O&O&:new",
+ (/*unconst*/ char **)kwlist_shake,
+ convbin, &k,
+ convbin, &f, convbin, &p)
+ : !PyArg_ParseTupleAndKeywords(arg, kw, "O&|O&:new",
+ (/*unconst*/ char **)kwlist_func,
+ convbin, &k, convbin, &p))
+ goto end;
+ if (keysz(k.sz, info->keysz) != k.sz) VALERR("bad key length");
+ return (grand_dopywrap(ty,
+ (info->f&RNGF_MASK) == RNG_SHAKE
+ ? ((gcshakerand_func *)info->func)(f.p, f.sz,
+ p.p, p.sz,
+ k.p, k.sz)
+ : ((gcshafuncrand_func *)info->func)(p.p, p.sz,
+ k.p, k.sz),