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:
|
||||
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
|
||||
|
||||
|
|
|
@ -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 --no-binary :all: $PACKAGES_BUILD
|
||||
$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 -c "from Crypto.Cipher import AES"
|
||||
$PYTHON -m pip install --upgrade --no-binary :all: https://github.com/Legrandin/pycryptodome/archive/master.zip
|
||||
$PYTHON -c "from Crypto.Cipher import AES; AES.new"
|
||||
if [ ! $? -eq 0 ]; then
|
||||
echo "pycryptodome build failed"
|
||||
exit 1
|
||||
|
|
|
@ -28,9 +28,12 @@
|
|||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
# ===================================================================
|
||||
|
||||
import sys
|
||||
import abc
|
||||
from Crypto.Util.py3compat import byte_string
|
||||
from Crypto.Util._file_system import pycryptodome_filename
|
||||
|
||||
#
|
||||
# List of file suffixes for Python extensions
|
||||
#
|
||||
|
||||
import imp
|
||||
extension_suffixes = []
|
||||
|
@ -38,10 +41,30 @@ for ext, mod, typ in imp.get_suffixes():
|
|||
if typ == imp.C_EXTENSION:
|
||||
extension_suffixes.append(ext)
|
||||
|
||||
from ctypes import (CDLL, c_void_p, byref, c_ulong, c_ulonglong, c_size_t,
|
||||
create_string_buffer, c_ubyte)
|
||||
_buffer_type = (bytearray, memoryview)
|
||||
|
||||
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 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
|
||||
|
||||
|
@ -61,19 +84,48 @@ def get_c_string(c_string):
|
|||
def get_raw_buffer(buf):
|
||||
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):
|
||||
if byte_string(data) or isinstance(data, Array):
|
||||
if byte_string(data) or isinstance(data, _Array):
|
||||
return data
|
||||
elif isinstance(data, bytearray):
|
||||
local_type = c_ubyte * len(data)
|
||||
return local_type.from_buffer(data)
|
||||
elif isinstance(data, _buffer_type):
|
||||
obj = _py_object(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:
|
||||
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):
|
||||
self._p = c_void_p()
|
||||
|
@ -84,13 +136,15 @@ class VoidPointer(object):
|
|||
def address_of(self):
|
||||
return byref(self._p)
|
||||
|
||||
def VoidPointer():
|
||||
return VoidPointer_ctypes()
|
||||
|
||||
backend = "ctypes"
|
||||
del ctypes
|
||||
|
||||
class SmartPointer(object):
|
||||
"""Class to hold a non-managed piece of memory"""
|
||||
|
||||
__slots__ = ( '_raw_pointer', '_destructor' )
|
||||
|
||||
def __init__(self, raw_pointer, destructor):
|
||||
self._raw_pointer = raw_pointer
|
||||
self._destructor = destructor
|
||||
|
@ -107,11 +161,18 @@ class SmartPointer(object):
|
|||
if self._raw_pointer is not None:
|
||||
self._destructor(self._raw_pointer)
|
||||
self._raw_pointer = None
|
||||
|
||||
self._destructor = None
|
||||
except AttributeError:
|
||||
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):
|
||||
"""Load a shared library and return a handle to it.
|
||||
|
||||
|
|
Loading…
Reference in New Issue