diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..5f27c0e7d0eea587e87e5b3b5959debdcd9eaeb7 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,30 @@ +project(dap_chain_wallet_python_module C) +cmake_minimum_required(VERSION 2.8) + +set(CMAKE_VERBOSE_MAKEFILE ON) +set(CMAKE_COLOR_MAKEFILE ON) +set(CMAKE_C_STANDARD 11) +add_definitions("-fpic") +add_definitions("-DDAP_LOG_MT") + +file(GLOB CHAIN_WALLET_PYTHON_SRCS src/*.c) +file(GLOB CHAIN_WALLET_PYTHON_HEADERS include/*.h) + +set(Python_ADDITIONAL_VERSIONS 3.7 3.6 3.5 3.4) +find_package (PythonLibs REQUIRED) +include_directories(${PYTHON_INCLUDE_DIR} include/) + +add_library(${PROJECT_NAME} STATIC ${CHAIN_WALLET_PYTHON_SRCS} ${CHAIN_WALLET_PYTHON_HEADERS}) + +target_link_libraries(${PROJECT_NAME}) + +target_link_libraries(${PROJECT_NAME} dap_core + dap_crypto + dap_crypto_python_module + dap_chain dap_chain_crypto + dap_chain_python_module + dap_chain_net + dap_chain_wallet ) + +target_include_directories(${PROJECT_NAME} PUBLIC include/ ) + diff --git a/include/dap_chain_wallet_python.h b/include/dap_chain_wallet_python.h new file mode 100644 index 0000000000000000000000000000000000000000..52b033c9cd17a06e085d119c93061aeb1e216e2d --- /dev/null +++ b/include/dap_chain_wallet_python.h @@ -0,0 +1,119 @@ +#ifndef _DAP_CHAIN_WALLET_PYTHON_ +#define _DAP_CHAIN_WALLET_PYTHON_ + +#include <Python.h> +#include "dap_common.h" +#include "dap_chain_wallet.h" +#include "wrapping_dap_chain_common.h" +#include "libdap_crypto_key_python.h" +#include "wrapping_dap_sign.h" +#include "wrapping_dap_pkey.h" +#include "wrapping_cert.h" + +#ifdef __cplusplus +extern "C"{ +#endif + +#undef LOG_TAG +#define LOG_TAG "dap_chain_wallet_python" + +typedef struct PyDapChainWallet{ + PyObject_HEAD + dap_chain_wallet_t *wallet; +}PyDapChainWalletObject; + +int dap_chain_wallet_init_py(void); +void dap_chain_wallet_deinit_py(void); + +PyObject *dap_chain_wallet_get_path_py(PyObject *self, PyObject *argv); + +PyObject *dap_chain_wallet_create_with_seed_py(PyObject *self, PyObject *argv); +PyObject *dap_chain_wallet_create_py(PyTypeObject *type, PyObject *argv, PyObject *kwds); +PyObject *dap_chain_wallet_open_file_py(PyObject *self, PyObject *argv); +PyObject *dap_chain_wallet_open_py(PyObject *self, PyObject *argv); +PyObject *dap_chain_wallet_save_py(PyObject *self, PyObject *argv); + +void dap_chain_wallet_close_py(PyDapChainWalletObject *self); + +PyObject *dap_cert_to_addr_py(PyObject *self, PyObject *argv); + +PyObject *dap_chain_wallet_get_addr_py(PyObject *self, PyObject *argv); +PyObject *dap_chain_wallet_get_certs_number_py(PyObject *self, PyObject *argv); +PyObject *dap_chain_wallet_get_pkey_py(PyObject *self, PyObject *argv); +PyObject *dap_chain_wallet_get_key_py(PyObject *self, PyObject *argv); + +//PyObject *dap_chain_wallet_save_file_py(PyObject *self, PyObject *argv); + +static PyMethodDef ChainWalletMethods[] = { + {"getPath", (PyCFunction)dap_chain_wallet_get_path_py, METH_VARARGS | METH_STATIC, ""}, + {"createWithSeed", (PyCFunction)dap_chain_wallet_create_with_seed_py, METH_VARARGS | METH_STATIC, ""}, + {"openFile", (PyCFunction)dap_chain_wallet_open_file_py, METH_VARARGS | METH_STATIC, ""}, + {"open", (PyCFunction)dap_chain_wallet_open_py, METH_VARARGS | METH_STATIC, ""}, + {"save", (PyCFunction)dap_chain_wallet_save_py, METH_NOARGS, ""}, + {"certToAddr", (PyCFunction)dap_cert_to_addr_py, METH_VARARGS | METH_STATIC, ""}, + {"getAddr", (PyCFunction)dap_chain_wallet_get_addr_py, METH_VARARGS, ""}, + {"getCertsNumber", (PyCFunction)dap_chain_wallet_get_certs_number_py, METH_NOARGS, ""}, + {"getPKey", (PyCFunction)dap_chain_wallet_get_pkey_py, METH_VARARGS, ""}, + {"getKey", (PyCFunction)dap_chain_wallet_get_key_py, METH_VARARGS, ""}, + {NULL, NULL, 0, NULL} +}; + +static PyTypeObject DapChainWallet_dapChainWalletType = { + PyVarObject_HEAD_INIT(NULL, 0) + "ChainWallet", /* tp_name */ + sizeof(PyDapChainWalletObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)dap_chain_wallet_close_py, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_reserved */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT | + Py_TPFLAGS_BASETYPE, /* tp_flags */ + "Chain wallet object", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + ChainWalletMethods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + dap_chain_wallet_create_py,/* tp_new */ + 0, /* tp_free */ + 0, /* tp_is_gc*/ + 0, /* tp_bases*/ + 0, /* tp_mro */ + 0, /* tp_cache */ + 0, /* tp_subclasses */ + 0, /* tp_weaklist */ + 0, /* tp_del */ + 0, /* tp_version_tag*/ + 0, /* tp_finalize*/ +}; + + +#ifdef __cplusplus +} +#endif + + +#endif // _DAP_CHAIN_WALLET_PYTHON_ diff --git a/src/dap_chain_wallet_python.c b/src/dap_chain_wallet_python.c new file mode 100644 index 0000000000000000000000000000000000000000..df71af90e3f61d967522875adfc213398406d9e2 --- /dev/null +++ b/src/dap_chain_wallet_python.c @@ -0,0 +1,137 @@ +#include "dap_chain_wallet_python.h" + +int dap_chain_wallet_init_py(void){ + return dap_chain_wallet_init(); +} +void dap_chain_wallet_deinit_py(void){ + dap_chain_wallet_deinit(); +} + +PyObject *dap_chain_wallet_get_path_py(PyObject *self, PyObject *argv){ + (void)self; + (void)argv; + const char *path = dap_chain_wallet_get_path(g_config); + return Py_BuildValue("(s)", path); +} + +PyObject *dap_chain_wallet_create_with_seed_py(PyObject *self, PyObject *argv){ + (void)self; + const char *wallet_name; + const char *path_wallets; + PyObject *obj_sig_type; + PyObject *obj_seed; + if (!PyArg_ParseTuple(argv, "ssOO", &wallet_name, &path_wallets, &obj_sig_type, &obj_seed)) + return NULL; + if (PyBytes_Check(obj_seed)){ + PyErr_SetString(PyExc_TypeError, "Fourth argument to not have a Bytes object type"); + return NULL; + } + void *seed = (void *)PyBytes_AsString(obj_seed); + size_t seed_size = PyBytes_Size(obj_seed); + PyObject *obj_wallet = _PyObject_New(&DapChainWallet_dapChainWalletType); + ((PyDapChainWalletObject*)obj_wallet)->wallet = dap_chain_wallet_create_with_seed( + wallet_name, + path_wallets, + *((PyDapSignTypeObject*)obj_sig_type)->sign_type, + seed, + seed_size); + return Py_BuildValue("(O)", obj_wallet); +} +PyObject *dap_chain_wallet_create_py(PyTypeObject *type, PyObject *argv, PyObject *kwds){ + (void)kwds; + PyDapChainWalletObject *self; + const char *wallet_name; + const char *path_wallets; + PyObject *obj_sign_type; + if (!PyArg_ParseTuple(argv, "ssO", &wallet_name, &path_wallets, &obj_sign_type)) + return NULL; + self = (PyDapChainWalletObject*)type->tp_alloc(type, 0); + if (self != NULL){ + self->wallet = dap_chain_wallet_create(wallet_name, path_wallets, *((PyDapSignTypeObject*)obj_sign_type)->sign_type); + if (self->wallet == NULL){ + Py_XDECREF(self); + return NULL; + } + } + return (PyObject*)self; +} +PyObject *dap_chain_wallet_open_file_py(PyObject *self, PyObject *argv){ + (void)self; + const char *file_path; + if (!PyArg_ParseTuple(argv, "s", &file_path)) + return NULL; + PyObject *obj_wallet = _PyObject_New(&DapChainWallet_dapChainWalletType); + ((PyDapChainWalletObject*)obj_wallet)->wallet = dap_chain_wallet_open_file(file_path); + return Py_BuildValue("(O)", obj_wallet); +} +PyObject *dap_chain_wallet_open_py(PyObject *self, PyObject *argv){ + (void)self; + const char *wallet_name; + const char *wallet_path; + if (!PyArg_ParseTuple(argv, "ss", &wallet_name, &wallet_path)) + return NULL; + PyObject *obj_wallet = _PyObject_New(&DapChainWallet_dapChainWalletType); + ((PyDapChainWalletObject*)obj_wallet)->wallet = dap_chain_wallet_open(wallet_name, wallet_path); + return Py_BuildValue("(O)", obj_wallet); +} +PyObject *dap_chain_wallet_save_py(PyObject *self, PyObject *argv){ + (void)argv; + int result = dap_chain_wallet_save(((PyDapChainWalletObject*)self)->wallet); + return PyLong_FromLong(result); +} + +void dap_chain_wallet_close_py(PyDapChainWalletObject *self){ + dap_chain_wallet_close(self->wallet); + Py_TYPE(self)->tp_free((PyObject*)self); +} + +PyObject *dap_cert_to_addr_py(PyObject *self, PyObject *argv){ + (void)self; + PyObject *obj_cert; + PyObject *obj_net_id; + if (!PyArg_ParseTuple(argv, "OO", &obj_cert, &obj_net_id)) + return NULL; + PyObject *obj_addr = _PyObject_New(&DapChainAddrObject_DapChainAddrObjectType); + ((PyDapChainAddrObject*)obj_addr)->addr = dap_cert_to_addr( + ((PyCryptoCertObject*)obj_cert)->cert, + ((PyDapChainNetIdObject*)obj_net_id)->net_id + ); + return Py_BuildValue("(O)", obj_addr); +} + +PyObject *dap_chain_wallet_get_addr_py(PyObject *self, PyObject *argv){ + PyObject *obj_net_id; + if (!PyArg_ParseTuple(argv, "O", &obj_net_id)) + return NULL; + PyObject *obj_addr = _PyObject_New(&DapChainAddrObject_DapChainAddrObjectType); + ((PyDapChainAddrObject*)obj_addr)->addr = dap_chain_wallet_get_addr( + ((PyDapChainWalletObject*)self)->wallet, + ((PyDapChainNetIdObject*)obj_net_id)->net_id + ); + return Py_BuildValue("(O)", obj_addr); +} +PyObject *dap_chain_wallet_get_certs_number_py(PyObject *self, PyObject *argv){ + (void)argv; + size_t result = dap_chain_wallet_get_certs_number(((PyDapChainWalletObject*)self)->wallet); + return PyLong_FromLong(result); +} +PyObject *dap_chain_wallet_get_pkey_py(PyObject *self, PyObject *argv){ + uint32_t key_idx; + if (!PyArg_ParseTuple(argv, "I", &key_idx)) + return NULL; + PyObject *obj_pkey = _PyObject_New(&DapPkeyObject_DapPkeyObjectType); + ((PyDapPkeyObject*)obj_pkey)->pkey = dap_chain_wallet_get_pkey(((PyDapChainWalletObject*)self)->wallet, + key_idx); + return Py_BuildValue("(O)", obj_pkey); +} +PyObject *dap_chain_wallet_get_key_py(PyObject *self, PyObject *argv){ + uint32_t key_idx; + if (!PyArg_ParseTuple(argv, "I", &key_idx)) + return NULL; + PyObject *obj_key = _PyObject_New(&PyCryptoKeyObject_PyCryptoKeyType); + ((PyCryptoKeyObject*)obj_key)->key = dap_chain_wallet_get_key( + ((PyDapChainWalletObject*)self)->wallet, + key_idx + ); + return Py_BuildValue("(O)", obj_key); +}