diff --git a/ChangeLog b/ChangeLog index d41b469..c2e4c02 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2017-03-17 Björn Freise + + SSL_write() extended to handle ctypes.Array as data + + * dtls/openssl.py: SSL_write() can handle ctypes.Array data + * dtls/sslconnection.py: Added missing import ERR_BOTH_KEY_CERT_FILES + * dtls/test/simple_client.py: Added basic test client to use with dtls/test/echo_seq.py + 2017-03-17 Björn Freise Beautified lists and maps, grouped imports for easy merges in the future - no changed functionality! diff --git a/dtls/openssl.py b/dtls/openssl.py index c04520f..210e3be 100644 --- a/dtls/openssl.py +++ b/dtls/openssl.py @@ -769,12 +769,14 @@ def SSL_read(ssl, length, buffer): def SSL_write(ssl, data): if isinstance(data, str): - str_data = data - elif hasattr(data, "tobytes") and callable(data.tobytes): - str_data = data.tobytes() - else: - str_data = str(data) - return _SSL_write(ssl, str_data, len(str_data)) + str_data = data + elif hasattr(data, "tobytes") and callable(data.tobytes): + str_data = data.tobytes() + elif isinstance(data, ctypes.Array): + str_data = data.raw + else: + str_data = str(data) + return _SSL_write(ssl, str_data, len(str_data)) def OBJ_obj2txt(asn1_object, no_name): buf = create_string_buffer(X509_NAME_MAXLEN) diff --git a/dtls/sslconnection.py b/dtls/sslconnection.py index 2b6caf2..baf665e 100644 --- a/dtls/sslconnection.py +++ b/dtls/sslconnection.py @@ -52,13 +52,13 @@ from weakref import proxy from err import openssl_error, InvalidSocketError from err import raise_ssl_error from err import SSL_ERROR_WANT_READ, SSL_ERROR_SYSCALL -from err import ERR_COOKIE_MISMATCH, ERR_NO_CERTS -from err import ERR_NO_CIPHER, ERR_HANDSHAKE_TIMEOUT, ERR_PORT_UNREACHABLE -from err import ERR_READ_TIMEOUT, ERR_WRITE_TIMEOUT -from err import ERR_BOTH_KEY_CERT_FILES_SVR -from x509 import _X509, decode_cert -from tlock import tlock_init -from openssl import * +from err import ERR_COOKIE_MISMATCH, ERR_NO_CERTS +from err import ERR_NO_CIPHER, ERR_HANDSHAKE_TIMEOUT, ERR_PORT_UNREACHABLE +from err import ERR_READ_TIMEOUT, ERR_WRITE_TIMEOUT +from err import ERR_BOTH_KEY_CERT_FILES, ERR_BOTH_KEY_CERT_FILES_SVR +from x509 import _X509, decode_cert +from tlock import tlock_init +from openssl import * from util import _Rsrc, _BIO _logger = getLogger(__name__) diff --git a/dtls/test/echo_seq.py b/dtls/test/echo_seq.py index 87192e6..8fd2aec 100644 --- a/dtls/test/echo_seq.py +++ b/dtls/test/echo_seq.py @@ -36,12 +36,13 @@ import socket from os import path from logging import basicConfig, DEBUG basicConfig(level=DEBUG) # set now for dtls import code -from dtls.sslconnection import SSLConnection -from dtls.err import SSLError, SSL_ERROR_WANT_READ, SSL_ERROR_ZERO_RETURN - -def main(): - sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - sck.bind(("127.0.0.1", 28000)) +from dtls.sslconnection import SSLConnection +from dtls.err import SSLError, SSL_ERROR_WANT_READ, SSL_ERROR_ZERO_RETURN + + +def main(): + sck = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + sck.bind(("127.0.0.1", 28000)) sck.settimeout(30) cert_path = path.join(path.abspath(path.dirname(__file__)), "certs") scn = SSLConnection( diff --git a/dtls/test/simple_client.py b/dtls/test/simple_client.py new file mode 100644 index 0000000..562c136 --- /dev/null +++ b/dtls/test/simple_client.py @@ -0,0 +1,15 @@ +from os import path +import ssl +from socket import socket, AF_INET, SOCK_DGRAM, SHUT_RDWR +from logging import basicConfig, DEBUG +basicConfig(level=DEBUG) # set now for dtls import code +from dtls import do_patch +do_patch() + +cert_path = path.join(path.abspath(path.dirname(__file__)), "certs") +sock = ssl.wrap_socket(socket(AF_INET, SOCK_DGRAM), cert_reqs=ssl.CERT_REQUIRED, ca_certs=path.join(cert_path, "ca-cert.pem")) +sock.connect(('localhost', 28000)) +sock.send('Hi there') +print sock.recv() +sock.unwrap() +sock.shutdown(SHUT_RDWR)