mirror of https://github.com/n1nj4sec/pupy.git
client: Support recent pycryptodome
This commit is contained in:
parent
7c54a452a7
commit
667507de3d
|
@ -64,7 +64,8 @@ else
|
||||||
python -m pip install pyuv --upgrade --no-binary :all:
|
python -m pip install pyuv --upgrade --no-binary :all:
|
||||||
fi
|
fi
|
||||||
|
|
||||||
python -m pip install --upgrade --no-binary :all: pycryptodome==3.7.0
|
# python -m pip install --upgrade --no-binary :all: pycryptodome==3.7.0
|
||||||
|
python -m pip install --upgrade --no-binary :all: https://github.com/Legrandin/pycryptodome/archive/master.zip
|
||||||
|
|
||||||
cd /usr/lib/python2.7
|
cd /usr/lib/python2.7
|
||||||
|
|
||||||
|
|
|
@ -26,8 +26,8 @@ for PYTHON in $PYTHON32 $PYTHON64; do
|
||||||
$PYTHON -m pip install --upgrade $PACKAGES pycryptodomex==3.7.0
|
$PYTHON -m pip install --upgrade $PACKAGES pycryptodomex==3.7.0
|
||||||
$PYTHON -m pip install --upgrade --no-binary :all: $PACKAGES_BUILD
|
$PYTHON -m pip install --upgrade --no-binary :all: $PACKAGES_BUILD
|
||||||
$PYTHON -m pip install cryptography==1.7.2 pyOpenSSL==17.5.0 paramiko
|
$PYTHON -m pip install cryptography==1.7.2 pyOpenSSL==17.5.0 paramiko
|
||||||
$PYTHON -m pip install --no-binary :all: pycryptodome==3.6.6
|
$PYTHON -m pip install --upgrade --no-binary :all: https://github.com/Legrandin/pycryptodome/archive/master.zip
|
||||||
$PYTHON -c "from Crypto.Cipher import AES"
|
$PYTHON -c "from Crypto.Cipher import AES; AES.new"
|
||||||
if [ ! $? -eq 0 ]; then
|
if [ ! $? -eq 0 ]; then
|
||||||
echo "pycryptodome build failed"
|
echo "pycryptodome build failed"
|
||||||
exit 1
|
exit 1
|
||||||
|
|
|
@ -28,9 +28,12 @@
|
||||||
# POSSIBILITY OF SUCH DAMAGE.
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
|
|
||||||
import sys
|
import abc
|
||||||
from Crypto.Util.py3compat import byte_string
|
from Crypto.Util.py3compat import byte_string
|
||||||
from Crypto.Util._file_system import pycryptodome_filename
|
|
||||||
|
#
|
||||||
|
# List of file suffixes for Python extensions
|
||||||
|
#
|
||||||
|
|
||||||
import imp
|
import imp
|
||||||
extension_suffixes = []
|
extension_suffixes = []
|
||||||
|
@ -38,10 +41,30 @@ for ext, mod, typ in imp.get_suffixes():
|
||||||
if typ == imp.C_EXTENSION:
|
if typ == imp.C_EXTENSION:
|
||||||
extension_suffixes.append(ext)
|
extension_suffixes.append(ext)
|
||||||
|
|
||||||
from ctypes import (CDLL, c_void_p, byref, c_ulong, c_ulonglong, c_size_t,
|
_buffer_type = (bytearray, memoryview)
|
||||||
create_string_buffer, c_ubyte)
|
|
||||||
|
class _VoidPointer(object):
|
||||||
|
@abc.abstractmethod
|
||||||
|
def get(self):
|
||||||
|
"""Return the memory location we point to"""
|
||||||
|
return
|
||||||
|
|
||||||
|
@abc.abstractmethod
|
||||||
|
def address_of(self):
|
||||||
|
"""Return a raw pointer to this pointer"""
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
import ctypes
|
||||||
|
from ctypes import (CDLL, c_void_p, byref, c_ubyte)
|
||||||
from ctypes.util import find_library
|
from ctypes.util import find_library
|
||||||
from _ctypes import Array
|
from ctypes import Array as _Array
|
||||||
|
|
||||||
|
from ctypes import create_string_buffer
|
||||||
|
from ctypes import c_size_t
|
||||||
|
|
||||||
|
assert(create_string_buffer)
|
||||||
|
assert(c_size_t)
|
||||||
|
|
||||||
null_pointer = None
|
null_pointer = None
|
||||||
|
|
||||||
|
@ -61,19 +84,48 @@ def get_c_string(c_string):
|
||||||
def get_raw_buffer(buf):
|
def get_raw_buffer(buf):
|
||||||
return buf.raw
|
return buf.raw
|
||||||
|
|
||||||
|
# ---- Get raw pointer ---
|
||||||
|
|
||||||
|
_PyBUF_SIMPLE = 0
|
||||||
|
_PyObject_GetBuffer = ctypes.pythonapi.PyObject_GetBuffer
|
||||||
|
_py_object = ctypes.py_object
|
||||||
|
_c_ssize_t = ctypes.c_ssize_t
|
||||||
|
_c_ssize_p = ctypes.POINTER(_c_ssize_t)
|
||||||
|
|
||||||
|
# See Include/object.h for CPython
|
||||||
|
# and https://github.com/pallets/click/blob/master/click/_winconsole.py
|
||||||
|
class _Py_buffer(ctypes.Structure):
|
||||||
|
_fields_ = [
|
||||||
|
('buf', c_void_p),
|
||||||
|
('obj', ctypes.py_object),
|
||||||
|
('len', _c_ssize_t),
|
||||||
|
('itemsize', _c_ssize_t),
|
||||||
|
('readonly', ctypes.c_int),
|
||||||
|
('ndim', ctypes.c_int),
|
||||||
|
('format', ctypes.c_char_p),
|
||||||
|
('shape', _c_ssize_p),
|
||||||
|
('strides', _c_ssize_p),
|
||||||
|
('suboffsets', _c_ssize_p),
|
||||||
|
('internal', c_void_p),
|
||||||
|
('smalltable', _c_ssize_t * 2)
|
||||||
|
]
|
||||||
|
|
||||||
def c_uint8_ptr(data):
|
def c_uint8_ptr(data):
|
||||||
if byte_string(data) or isinstance(data, Array):
|
if byte_string(data) or isinstance(data, _Array):
|
||||||
return data
|
return data
|
||||||
elif isinstance(data, bytearray):
|
elif isinstance(data, _buffer_type):
|
||||||
local_type = c_ubyte * len(data)
|
obj = _py_object(data)
|
||||||
return local_type.from_buffer(data)
|
buf = _Py_buffer()
|
||||||
|
_PyObject_GetBuffer(obj, byref(buf), _PyBUF_SIMPLE)
|
||||||
|
buffer_type = c_ubyte * buf.len
|
||||||
|
return buffer_type.from_address(buf.buf)
|
||||||
else:
|
else:
|
||||||
raise TypeError("Object type %s cannot be passed to C code" % type(data))
|
raise TypeError("Object type %s cannot be passed to C code" % type(data))
|
||||||
|
|
||||||
class VoidPointer(object):
|
# ---
|
||||||
"""Model a newly allocated pointer to void"""
|
|
||||||
|
|
||||||
__slots__ = [ '_p' ]
|
class VoidPointer_ctypes(_VoidPointer):
|
||||||
|
"""Model a newly allocated pointer to void"""
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._p = c_void_p()
|
self._p = c_void_p()
|
||||||
|
@ -84,13 +136,15 @@ class VoidPointer(object):
|
||||||
def address_of(self):
|
def address_of(self):
|
||||||
return byref(self._p)
|
return byref(self._p)
|
||||||
|
|
||||||
|
def VoidPointer():
|
||||||
|
return VoidPointer_ctypes()
|
||||||
|
|
||||||
backend = "ctypes"
|
backend = "ctypes"
|
||||||
|
del ctypes
|
||||||
|
|
||||||
class SmartPointer(object):
|
class SmartPointer(object):
|
||||||
"""Class to hold a non-managed piece of memory"""
|
"""Class to hold a non-managed piece of memory"""
|
||||||
|
|
||||||
__slots__ = ( '_raw_pointer', '_destructor' )
|
|
||||||
|
|
||||||
def __init__(self, raw_pointer, destructor):
|
def __init__(self, raw_pointer, destructor):
|
||||||
self._raw_pointer = raw_pointer
|
self._raw_pointer = raw_pointer
|
||||||
self._destructor = destructor
|
self._destructor = destructor
|
||||||
|
@ -107,11 +161,18 @@ class SmartPointer(object):
|
||||||
if self._raw_pointer is not None:
|
if self._raw_pointer is not None:
|
||||||
self._destructor(self._raw_pointer)
|
self._destructor(self._raw_pointer)
|
||||||
self._raw_pointer = None
|
self._raw_pointer = None
|
||||||
|
|
||||||
self._destructor = None
|
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def is_buffer(x):
|
||||||
|
"""Return True if object x supports the buffer interface"""
|
||||||
|
return isinstance(x, (bytes, bytearray, memoryview))
|
||||||
|
|
||||||
|
def is_writeable_buffer(x):
|
||||||
|
return (isinstance(x, bytearray) or
|
||||||
|
(isinstance(x, memoryview) and not x.readonly))
|
||||||
|
|
||||||
def load_pycryptodome_raw_lib(name, cdecl):
|
def load_pycryptodome_raw_lib(name, cdecl):
|
||||||
"""Load a shared library and return a handle to it.
|
"""Load a shared library and return a handle to it.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue