First version of Threefish512-CTR with BLAKE3-MAC & a custom shamirs secret sharing port alongside C bridges with test vectors & Compilation instructions
This commit is contained in:
100
crypto/shamirs_secret_sharing/py_bridge.c
Normal file
100
crypto/shamirs_secret_sharing/py_bridge.c
Normal file
@@ -0,0 +1,100 @@
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
#include <Python.h>
|
||||
#include <windows.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
static PyObject *mod = NULL;
|
||||
static PyObject *combine_fn = NULL;
|
||||
static PyObject *split_fn = NULL;
|
||||
|
||||
static void init_python()
|
||||
{
|
||||
static int initialized = 0;
|
||||
if (initialized) return;
|
||||
|
||||
Py_Initialize();
|
||||
|
||||
PyRun_SimpleString("import sys; sys.path.append('.')");
|
||||
|
||||
mod = PyImport_ImportModule("shamirs_secret_sharing");
|
||||
if (!mod) {
|
||||
PyErr_Print();
|
||||
abort();
|
||||
}
|
||||
|
||||
combine_fn = PyObject_GetAttrString(mod, "combine_wrapper");
|
||||
split_fn = PyObject_GetAttrString(mod, "split_wrapper");
|
||||
|
||||
if (!combine_fn || !split_fn) {
|
||||
PyErr_Print();
|
||||
abort();
|
||||
}
|
||||
|
||||
initialized = 1;
|
||||
}
|
||||
|
||||
__declspec(dllexport)
|
||||
char* combine_shares(const char** shares, int count)
|
||||
{
|
||||
init_python();
|
||||
|
||||
PyObject* list = PyList_New(count);
|
||||
for (int i = 0; i < count; i++) {
|
||||
PyList_SetItem(list, i, PyUnicode_FromString(shares[i]));
|
||||
}
|
||||
|
||||
PyObject* args = PyTuple_Pack(2, list, PyLong_FromLong(count));
|
||||
PyObject* res = PyObject_CallObject(combine_fn, args);
|
||||
|
||||
Py_DECREF(list);
|
||||
Py_DECREF(args);
|
||||
|
||||
if (!res) {
|
||||
PyErr_Print();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char* s = PyUnicode_AsUTF8(res);
|
||||
char* out = _strdup(s);
|
||||
Py_DECREF(res);
|
||||
return out;
|
||||
}
|
||||
|
||||
__declspec(dllexport)
|
||||
char* split_secret(const char* secret, int shares, int threshold)
|
||||
{
|
||||
init_python();
|
||||
|
||||
PyObject* pystr = PyUnicode_FromString(secret);
|
||||
PyObject* list = PyList_New(1);
|
||||
PyList_SetItem(list, 0, pystr);
|
||||
|
||||
PyObject* args = PyTuple_Pack(4,
|
||||
list,
|
||||
PyLong_FromLong(1),
|
||||
PyLong_FromLong(shares),
|
||||
PyLong_FromLong(threshold)
|
||||
);
|
||||
|
||||
PyObject* res = PyObject_CallObject(split_fn, args);
|
||||
|
||||
Py_DECREF(list);
|
||||
Py_DECREF(args);
|
||||
|
||||
if (!res) {
|
||||
PyErr_Print();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char* s = PyUnicode_AsUTF8(res);
|
||||
char* out = _strdup(s);
|
||||
Py_DECREF(res);
|
||||
return out;
|
||||
}
|
||||
|
||||
__declspec(dllexport)
|
||||
void free_string(char* p)
|
||||
{
|
||||
free(p);
|
||||
}
|
||||
Reference in New Issue
Block a user