mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
s4:pygensec: make sig_size() and sign/check_packet() available
Signed-off-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Günther Deschner <gd@samba.org> Reviewed-by: Andrew Bartlett <abartlet@samba.org>
This commit is contained in:
parent
dec9d085f3
commit
0f6713826d
@ -530,6 +530,83 @@ static PyObject *py_gensec_unwrap(PyObject *self, PyObject *args)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static PyObject *py_gensec_sig_size(PyObject *self, PyObject *args)
|
||||
{
|
||||
struct gensec_security *security = pytalloc_get_type(self, struct gensec_security);
|
||||
Py_ssize_t data_size = 0;
|
||||
size_t sig_size = 0;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "n", &data_size)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
sig_size = gensec_sig_size(security, data_size);
|
||||
|
||||
return PyLong_FromSize_t(sig_size);
|
||||
}
|
||||
|
||||
static PyObject *py_gensec_sign_packet(PyObject *self, PyObject *args)
|
||||
{
|
||||
NTSTATUS status;
|
||||
TALLOC_CTX *mem_ctx = NULL;
|
||||
Py_ssize_t data_length = 0;
|
||||
Py_ssize_t pdu_length = 0;
|
||||
DATA_BLOB data, pdu, sig;
|
||||
PyObject *py_sig;
|
||||
struct gensec_security *security = pytalloc_get_type(self, struct gensec_security);
|
||||
|
||||
if (!PyArg_ParseTuple(args, "z#z#", &data.data, &data_length, &pdu.data, &pdu_length)) {
|
||||
return NULL;
|
||||
}
|
||||
data.length = data_length;
|
||||
pdu.length = pdu_length;
|
||||
|
||||
mem_ctx = talloc_new(NULL);
|
||||
|
||||
status = gensec_sign_packet(security, mem_ctx,
|
||||
data.data, data.length,
|
||||
pdu.data, pdu.length, &sig);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
PyErr_SetNTSTATUS(status);
|
||||
talloc_free(mem_ctx);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
py_sig = PyBytes_FromStringAndSize((const char *)sig.data, sig.length);
|
||||
talloc_free(mem_ctx);
|
||||
return py_sig;
|
||||
}
|
||||
|
||||
static PyObject *py_gensec_check_packet(PyObject *self, PyObject *args)
|
||||
{
|
||||
NTSTATUS status;
|
||||
Py_ssize_t data_length = 0;
|
||||
Py_ssize_t pdu_length = 0;
|
||||
Py_ssize_t sig_length = 0;
|
||||
DATA_BLOB data, pdu, sig;
|
||||
struct gensec_security *security = pytalloc_get_type(self, struct gensec_security);
|
||||
|
||||
if (!PyArg_ParseTuple(args, "z#z#z#",
|
||||
&data.data, &data_length,
|
||||
&pdu.data, &pdu_length,
|
||||
&sig.data, &sig_length)) {
|
||||
return NULL;
|
||||
}
|
||||
data.length = data_length;
|
||||
pdu.length = pdu_length;
|
||||
sig.length = sig_length;
|
||||
|
||||
status = gensec_check_packet(security,
|
||||
data.data, data.length,
|
||||
pdu.data, pdu.length, &sig);
|
||||
if (!NT_STATUS_IS_OK(status)) {
|
||||
PyErr_SetNTSTATUS(status);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyMethodDef py_gensec_security_methods[] = {
|
||||
{ "start_client", (PyCFunction)py_gensec_start_client, METH_VARARGS|METH_KEYWORDS|METH_CLASS,
|
||||
"S.start_client(settings) -> gensec" },
|
||||
@ -567,6 +644,12 @@ static PyMethodDef py_gensec_security_methods[] = {
|
||||
"S.wrap(blob_in) -> blob_out\nPackage one clear packet into a wrapped GENSEC packet." },
|
||||
{ "unwrap", (PyCFunction)py_gensec_unwrap, METH_VARARGS,
|
||||
"S.unwrap(blob_in) -> blob_out\nPerform one wrapped GENSEC packet into a clear packet." },
|
||||
{ "sig_size", (PyCFunction)py_gensec_sig_size, METH_VARARGS,
|
||||
"S.sig_size(data_size) -> sig_size\nSize of the DCERPC packet signature" },
|
||||
{ "sign_packet", (PyCFunction)py_gensec_sign_packet, METH_VARARGS,
|
||||
"S.sign_packet(data, whole_pdu) -> sig\nSign a DCERPC packet." },
|
||||
{ "check_packet", (PyCFunction)py_gensec_check_packet, METH_VARARGS,
|
||||
"S.check_packet(data, whole_pdu, sig)\nCheck a DCERPC packet." },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user