Initial commit: up to and including data exchange functionality
This initial commit for the PyDTLS package includes the following functionality:
* DTLS cookie exchange, using secure hmac cookies
* A platform-independent routing UDP demultiplexer
* SSL handshaking over UDP using the DTLS protocol
* Datagram exchange using the DTLS protocol
* SSL shutdown over UDP
The package is structured as follows:
* dtls: top-level package
* dtls.demux: demultiplexer package; automatically loads a
demultiplexer appropriate for the currently executing
platform
* dtls.demux.router: a routing demux for platforms whose network stacks
cannot assign incoming UDP packets to sockets based
on the sockets' connection information
* dtls.demux.osnet: a demux that uses the operating system's UDP packet
routing functionality
* dtls.err: package-wide error handling and error definitions
* dtls.sslconnection: a client and server-side connection class for
UDP network connections secured with the DTLS protocol
* dtls.openssl: a ctypes-based wrapper for the OpenSSL library
* dtls.test: test scripts, utilities, and unit tests
The following binaries are provided:
* libeay32.dll: cryptographic portion of the OpenSSL library
* ssleay32.dll: protocol portion of the OpenSSL library (depends on former)
* cygcrypto-1.0.0.dll: as libeay32.dll, but with debugging symbols
* cygssl-1.0.0.dll: as ssleay32.dll, but with debugging symbols
All binaries have been built with the MinGW tool chain, targeted for msvcr90.
The unstripped dll's can be debugged on Windows with gdb. Cygwin is not used.
This commit is contained in:
1 parent
91323b475b
commit
9bb24c5d29
17 files changed
+1430
No files matched your search
@@ -0,0 +1,5 @@
|
||||
# Test: unit tests for PyDTLS. Written by Ray Brown.
|
||||
"""PyDTLs unit tests
|
||||
|
||||
This package contains unit tests and other test scripts and resources.
|
||||
"""
|
||||
@@ -0,0 +1,13 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIB3TCCAYegAwIBAgIJAJdD48tCuQ4ZMA0GCSqGSIb3DQEBBQUAMEoxCzAJBgNV
|
||||
BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRMwEQYDVQQKEwpSYXkgQ0EgSW5j
|
||||
MREwDwYDVQQDEwhSYXlDQUluYzAeFw0xMjA5MjEyMTE0MTZaFw0xMzA5MjEyMTE0
|
||||
MTZaMEoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRMwEQYDVQQK
|
||||
EwpSYXkgQ0EgSW5jMREwDwYDVQQDEwhSYXlDQUluYzBcMA0GCSqGSIb3DQEBAQUA
|
||||
A0sAMEgCQQC33ThS1uvx6c9/jdQgPrLnVepv9NJdtyRMIDH3ZVfIKwwC6Nde3CJh
|
||||
bdo3j2njxlY7pw0P6J/F6mQpGtsRGaX1AgMBAAGjUDBOMB0GA1UdDgQWBBQBj0cB
|
||||
lkz531jiz4oLP0osGlVR3zAfBgNVHSMEGDAWgBQBj0cBlkz531jiz4oLP0osGlVR
|
||||
3zAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA0EAUyS5rT6LFjhhPeoW1Gk1
|
||||
sibwzgPSKdEzllt0vGZtWESekkoJ0UxnDvRzKv8OEVSclt+2YuzJXuZGteFABxDA
|
||||
Cw==
|
||||
-----END CERTIFICATE-----
|
||||
@@ -0,0 +1,36 @@
|
||||
Certificate:
|
||||
Data:
|
||||
Version: 1 (0x0)
|
||||
Serial Number: 1 (0x1)
|
||||
Signature Algorithm: md5WithRSAEncryption
|
||||
Issuer: C=US, ST=Washington, O=Ray CA Inc, CN=RayCAInc
|
||||
Validity
|
||||
Not Before: Sep 21 21:16:18 2012 GMT
|
||||
Not After : Sep 21 21:16:18 2013 GMT
|
||||
Subject: C=US, ST=Washington, O=Ray Srv Inc, CN=RaySrvInc
|
||||
Subject Public Key Info:
|
||||
Public Key Algorithm: rsaEncryption
|
||||
Public-Key: (512 bit)
|
||||
Modulus:
|
||||
00:b8:f7:77:26:6c:9d:25:f5:e1:ca:28:b4:6a:0b:
|
||||
15:81:13:0e:51:c3:b2:ba:57:5b:69:ff:cb:bb:86:
|
||||
d9:f9:4d:33:1f:43:92:a1:89:2f:d0:08:5b:cf:b7:
|
||||
a1:2b:ea:06:31:e5:32:fd:2b:86:54:09:fb:24:bc:
|
||||
a3:ce:56:22:f1
|
||||
Exponent: 65537 (0x10001)
|
||||
Signature Algorithm: md5WithRSAEncryption
|
||||
12:4c:55:17:c1:c4:19:5f:0d:e2:66:00:84:37:22:62:9b:6d:
|
||||
9e:76:fd:a5:82:f5:a2:41:c6:ae:16:88:16:ab:bd:0f:5d:0b:
|
||||
7c:fd:52:2a:9b:3f:ea:cf:ea:35:29:37:61:a2:15:8f:27:56:
|
||||
38:71:1f:eb:1a:f8:cc:99:22:17
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIBgDCCASoCAQEwDQYJKoZIhvcNAQEEBQAwSjELMAkGA1UEBhMCVVMxEzARBgNV
|
||||
BAgTCldhc2hpbmd0b24xEzARBgNVBAoTClJheSBDQSBJbmMxETAPBgNVBAMTCFJh
|
||||
eUNBSW5jMB4XDTEyMDkyMTIxMTYxOFoXDTEzMDkyMTIxMTYxOFowTDELMAkGA1UE
|
||||
BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xFDASBgNVBAoTC1JheSBTcnYgSW5j
|
||||
MRIwEAYDVQQDEwlSYXlTcnZJbmMwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAuPd3
|
||||
JmydJfXhyii0agsVgRMOUcOyuldbaf/Lu4bZ+U0zH0OSoYkv0Ahbz7ehK+oGMeUy
|
||||
/SuGVAn7JLyjzlYi8QIDAQABMA0GCSqGSIb3DQEBBAUAA0EAEkxVF8HEGV8N4mYA
|
||||
hDciYpttnnb9pYL1okHGrhaIFqu9D10LfP1SKps/6s/qNSk3YaIVjydWOHEf6xr4
|
||||
zJkiFw==
|
||||
-----END CERTIFICATE-----
|
||||
@@ -0,0 +1,10 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAuPd3JmydJfXhyii0
|
||||
agsVgRMOUcOyuldbaf/Lu4bZ+U0zH0OSoYkv0Ahbz7ehK+oGMeUy/SuGVAn7JLyj
|
||||
zlYi8QIDAQABAkAygtnV82lC2Y/Mbis+nkJEGlkZuRCQ1JRRMRqI3n2eF6CviqF3
|
||||
PiBXIEEExzKihC9bvbHKTAkYDLr+/4YpbiQBAiEA7JLS5Lp7KI/ayWwEzl2r5XXu
|
||||
k/cbH++A4zZz6A9XIsECIQDIJ8ciDa5/VGyQnYMzBNgKnwaFDDBOiEUFDaU/9ZN8
|
||||
MQIgCG3Gw819G9ncQrbtiOi/eiJ0iKMSPVYMMow7HvaE9UECIQCLyQwPwlJd5s4z
|
||||
aW4ZkYZ4VHuvK8YI8q6RSuhf9Nhd4QIgFbRNdEeehgrzGzGug2yVCMzVzS3MQNBJ
|
||||
6LqBZaPlFsM=
|
||||
-----END PRIVATE KEY-----
|
||||
@@ -0,0 +1,102 @@
|
||||
# PyDTLS sequential echo. Written by Ray Brown.
|
||||
"""PyDTLS sequential echo
|
||||
|
||||
This script runs a sequential echo server. It is sequential in that it will
|
||||
respond without error only to a single sclient that invokes the following steps
|
||||
in order:
|
||||
* DTLS cookie exchange on port 28000 of localhost
|
||||
* DTLS handshake (application-default ciphers)
|
||||
* Write and receive echo back for an arbitrary number of datagrams
|
||||
* Isue shutdown notification and receive the shutdown notification response
|
||||
|
||||
Note that this script's operation is slow and inefficient on purpose: it
|
||||
invokes the demux without socket select, but with 5-second timeouts after
|
||||
the cookie exchange; this is done so that one can follow the debug logs when
|
||||
operating this server from a client shell interactively.
|
||||
"""
|
||||
|
||||
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))
|
||||
sck.settimeout(30)
|
||||
cert_path = path.join(path.abspath(path.dirname(__file__)), "certs")
|
||||
scn = SSLConnection(
|
||||
sck,
|
||||
keyfile=path.join(cert_path, "server-key.pem"),
|
||||
certfile=path.join(cert_path, "server-cert.pem"),
|
||||
server_side=True,
|
||||
ca_certs=path.join(cert_path, "ca-cert.pem"),
|
||||
do_handshake_on_connect=False)
|
||||
cnt = 0
|
||||
|
||||
while True:
|
||||
cnt += 1
|
||||
print "Listen invocation: %d" % cnt
|
||||
peer_address = scn.listen()
|
||||
if peer_address:
|
||||
print "Completed listening for peer: %s" % str(peer_address)
|
||||
break
|
||||
|
||||
print "Accepting..."
|
||||
conn = scn.accept()
|
||||
sck.settimeout(5)
|
||||
conn.rsock.settimeout(5)
|
||||
|
||||
cnt = 0
|
||||
while True:
|
||||
cnt += 1
|
||||
print "Listen invocation: %d" % cnt
|
||||
peer_address = scn.listen()
|
||||
assert not peer_address
|
||||
print "Handshake invocation: %d" % cnt
|
||||
try:
|
||||
conn.do_handshake()
|
||||
except SSLError as err:
|
||||
if err.args[0] == SSL_ERROR_WANT_READ:
|
||||
continue
|
||||
raise
|
||||
print "Completed handshaking with peer"
|
||||
break
|
||||
|
||||
cnt = 0
|
||||
while True:
|
||||
cnt += 1
|
||||
print "Listen invocation: %d" % cnt
|
||||
peer_address = scn.listen()
|
||||
assert not peer_address
|
||||
print "Read invocation: %d" % cnt
|
||||
try:
|
||||
message = conn.read()
|
||||
except SSLError as err:
|
||||
if err.args[0] == SSL_ERROR_WANT_READ:
|
||||
continue
|
||||
if err.args[0] == SSL_ERROR_ZERO_RETURN:
|
||||
break
|
||||
raise
|
||||
print message
|
||||
conn.write("Back to you: " + message)
|
||||
|
||||
cnt = 0
|
||||
while True:
|
||||
cnt += 1
|
||||
print "Listen invocation: %d" % cnt
|
||||
peer_address = scn.listen()
|
||||
assert not peer_address
|
||||
print "Shutdown invocation: %d" % cnt
|
||||
try:
|
||||
conn.shutdown()
|
||||
except SSLError as err:
|
||||
if err.args[0] == SSL_ERROR_WANT_READ:
|
||||
continue
|
||||
raise
|
||||
break
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,26 @@
|
||||
# PyDTLS reloader. Written by Ray Brown.
|
||||
"""PyDTLS package reloader
|
||||
|
||||
This script reloads all modules of the DTLS package. This can be useful in
|
||||
runtime environments that usually persist across package file edits, such as
|
||||
the IPython shell.
|
||||
"""
|
||||
|
||||
import dtls
|
||||
import dtls.err
|
||||
import dtls.sslconnection
|
||||
import dtls.openssl
|
||||
import dtls.demux
|
||||
import dtls.demux.router
|
||||
|
||||
def main():
|
||||
reload(dtls)
|
||||
reload(dtls.err)
|
||||
reload(dtls.sslconnection)
|
||||
reload(dtls.openssl)
|
||||
reload(dtls.demux)
|
||||
reload(dtls.demux.router)
|
||||
reload(dtls.sslconnection)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in new issue
Block a user