Skip to content

Commit 57adc7f

Browse files
committed
more ssl module tests
1 parent cde16c9 commit 57adc7f

File tree

2 files changed

+86
-63
lines changed

2 files changed

+86
-63
lines changed
Binary file not shown.

graalpython/com.oracle.graal.python.test/src/tests/test_ssl.py

Lines changed: 86 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@
4141
import ssl
4242
import os
4343
import json
44-
44+
import sys
45+
import subprocess
4546

4647
def data_file(name):
4748
return os.path.join(os.path.dirname(__file__), "ssldata", name)
@@ -50,7 +51,38 @@ def data_file(name):
5051
class StringWrapper(str):
5152
pass
5253

53-
54+
def check_handshake(server_context, client_context, err = None):
55+
hostname = 'localhost'
56+
c_in = ssl.MemoryBIO()
57+
c_out = ssl.MemoryBIO()
58+
s_in = ssl.MemoryBIO()
59+
s_out = ssl.MemoryBIO()
60+
client = client_context.wrap_bio(c_in, c_out, server_hostname=hostname)
61+
server = server_context.wrap_bio(s_in, s_out, server_side=True)
62+
63+
try:
64+
for _ in range(5):
65+
try:
66+
client.do_handshake()
67+
except ssl.SSLWantReadError:
68+
pass
69+
if c_out.pending:
70+
s_in.write(c_out.read())
71+
try:
72+
server.do_handshake()
73+
except ssl.SSLWantReadError:
74+
pass
75+
if s_out.pending:
76+
c_in.write(s_out.read())
77+
except Exception as e:
78+
if err is None:
79+
assert False
80+
else:
81+
assert isinstance(e, err)
82+
else:
83+
if err is not None:
84+
assert False
85+
5486
class CertTests(unittest.TestCase):
5587

5688
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
@@ -64,7 +96,7 @@ def check_load_cert_chain_error(self, certfile, keyfile=None, errno=-1, strerror
6496
except err as e:
6597
if errno != -1:
6698
self.assertEqual(e.errno, errno)
67-
if strerror is not None:
99+
if strerror is not None:
68100
self.assertIn(strerror, e.strerror)
69101
self.assertIsInstance(type(e), type(err))
70102
else:
@@ -92,8 +124,7 @@ def check_load_verify_locations_error(self, cafile=None, capath=None, cadata=Non
92124
assert False
93125

94126
def check_load_verify_locations_cadata_bytes_error(self, cadata, errno=-1, strerror=None, err=ssl.SSLError):
95-
try:
96-
127+
try:
97128
cadata = open(data_file(cadata)).read()
98129
cadata.replace("")
99130
self.ctx.load_verify_locations(cafile, capath, cadata)
@@ -214,41 +245,33 @@ def test_load_default_verify_paths(self):
214245
assert False
215246
finally:
216247
if certFile is not None:
217-
os.environ["SSL_CERT_FILE"] = certFile
218-
if certDir is not None:
219-
os.environ["SSL_CERT_DIR"] = certDir
220-
221-
def check_handshake(self, server_context, client_context, err = None):
222-
hostname = 'localhost'
223-
c_in = ssl.MemoryBIO()
224-
c_out = ssl.MemoryBIO()
225-
s_in = ssl.MemoryBIO()
226-
s_out = ssl.MemoryBIO()
227-
client = client_context.wrap_bio(c_in, c_out, server_hostname=hostname)
228-
server = server_context.wrap_bio(s_in, s_out, server_side=True)
229-
230-
try:
231-
for _ in range(5):
232-
try:
233-
client.do_handshake()
234-
except ssl.SSLWantReadError:
235-
pass
236-
if c_out.pending:
237-
s_in.write(c_out.read())
238-
try:
239-
server.do_handshake()
240-
except ssl.SSLWantReadError:
241-
pass
242-
if s_out.pending:
243-
c_in.write(s_out.read())
244-
except Exception as e:
245-
if err is None:
246-
assert False
248+
env["SSL_CERT_FILE"] = certFile
249+
else:
250+
del env["SSL_CERT_FILE"]
251+
if certDir is not None:
252+
env["SSL_CERT_DIR"] = certDir
247253
else:
248-
assert isinstance(e, err)
249-
else:
250-
if err is not None:
251-
assert False
254+
del env["SSL_CERT_DIR"]
255+
256+
@unittest.skipIf(sys.implementation.name == 'cpython', "graalpython specific")
257+
def test_load_default_verify_keystore(self):
258+
# execute with javax.net.ssl.trustStore=tests/ssldata/signing_keystore.jks
259+
# the JKS keystore:
260+
# - contains one trusted certificate, the same as in tests/ssldata/signing_ca.pem
261+
# - password is testssl
262+
curdir = os.path.abspath(os.path.dirname(__file__))
263+
src = "import ssl, sys, os\n" \
264+
"sys.path.append('" + curdir + "')\n" \
265+
"from test_ssl import data_file, check_handshake\n" \
266+
"server_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)\n" \
267+
"server_context.load_cert_chain(data_file('signed_cert.pem'))\n" \
268+
"client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)\n" \
269+
"check_handshake(server_context, client_context, ssl.SSLCertVerificationError)\n" \
270+
"client_context.load_default_certs()\n" \
271+
"check_handshake(server_context, client_context)\n"
272+
env = os.environ.copy()
273+
env['JAVA_TOOL_OPTIONS'] = "-Djavax.net.ssl.trustStore=" + curdir + "/ssldata/signing_keystore.jks"
274+
subprocess.run([sys.executable, '-c', src], env=env)
252275

253276
def test_verify_mode(self):
254277
signed_cert = data_file("signed_cert.pem")
@@ -269,47 +292,47 @@ def test_verify_mode(self):
269292
# no cert chain on server
270293
# openssl SSLError: [SSL: NO_SHARED_CIPHER] / jdk javax.net.ssl.SSLHandshakeException: No available authentication scheme
271294
client_context.verify_mode = ssl.CERT_NONE
272-
self.check_handshake(server_context, client_context, ssl.SSLError)
295+
check_handshake(server_context, client_context, ssl.SSLError)
273296
client_context.verify_mode = ssl.CERT_REQUIRED
274-
self.check_handshake(server_context, client_context, ssl.SSLError)
297+
check_handshake(server_context, client_context, ssl.SSLError)
275298
client_context.verify_mode = ssl.CERT_OPTIONAL
276-
self.check_handshake(server_context, client_context, ssl.SSLError)
299+
check_handshake(server_context, client_context, ssl.SSLError)
277300

278301
# server provides cert, but client has noverify locations
279302
server_context.load_cert_chain(signed_cert)
280303

281304
client_context.verify_mode = ssl.CERT_NONE
282-
self.check_handshake(server_context, client_context)
305+
check_handshake(server_context, client_context)
283306
client_context.verify_mode = ssl.CERT_REQUIRED
284-
self.check_handshake(server_context, client_context, ssl.SSLCertVerificationError)
307+
check_handshake(server_context, client_context, ssl.SSLCertVerificationError)
285308
client_context.verify_mode = ssl.CERT_OPTIONAL
286309
# CERT_OPTIONAL in client mode has the same meaning as CERT_REQUIRED
287-
self.check_handshake(server_context, client_context, ssl.SSLCertVerificationError)
310+
check_handshake(server_context, client_context, ssl.SSLCertVerificationError)
288311

289312
client_context.check_hostname = True
290313

291314
with self.assertRaisesRegex(ValueError, "Cannot set verify_mode to CERT_NONE when check_hostname is enabled"):
292315
client_context.verify_mode = ssl.CERT_NONE
293316

294317
client_context.verify_mode = ssl.CERT_REQUIRED
295-
self.check_handshake(server_context, client_context, ssl.SSLCertVerificationError)
318+
check_handshake(server_context, client_context, ssl.SSLCertVerificationError)
296319

297320
client_context.verify_mode = ssl.CERT_OPTIONAL
298321
# CERT_OPTIONAL in client mode has the same meaning as CERT_REQUIRED
299-
self.check_handshake(server_context, client_context, ssl.SSLCertVerificationError)
322+
check_handshake(server_context, client_context, ssl.SSLCertVerificationError)
300323

301324
# client provides cert, server verifies
302325
client_context.load_verify_locations(signing_ca)
303326

304327
client_context.verify_mode = ssl.CERT_REQUIRED
305-
self.check_handshake(server_context, client_context)
328+
check_handshake(server_context, client_context)
306329
client_context.verify_mode = ssl.CERT_OPTIONAL
307-
self.check_handshake(server_context, client_context)
330+
check_handshake(server_context, client_context)
308331

309332
# server provides wrong cert for CERT_OPTIONAL client
310333
server_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
311334
server_context.load_cert_chain(signed_cert2)
312-
self.check_handshake(server_context, client_context, ssl.SSLCertVerificationError)
335+
check_handshake(server_context, client_context, ssl.SSLCertVerificationError)
313336

314337
########################################################################
315338
# verify_mode - server
@@ -324,46 +347,46 @@ def test_verify_mode(self):
324347
# no cert chain on server and client
325348
# openssl SSLError: [SSL: NO_SHARED_CIPHER] / jdk javax.net.ssl.SSLHandshakeException: No available authentication scheme
326349
server_context.verify_mode = ssl.CERT_NONE
327-
self.check_handshake(server_context, client_context, ssl.SSLError)
350+
check_handshake(server_context, client_context, ssl.SSLError)
328351
server_context.verify_mode = ssl.CERT_REQUIRED
329-
self.check_handshake(server_context, client_context, ssl.SSLError)
352+
check_handshake(server_context, client_context, ssl.SSLError)
330353
server_context.verify_mode = ssl.CERT_OPTIONAL
331-
self.check_handshake(server_context, client_context, ssl.SSLError)
354+
check_handshake(server_context, client_context, ssl.SSLError)
332355

333356
# no cert from client
334357
server_context.load_cert_chain(signed_cert)
335358

336359
server_context.verify_mode = ssl.CERT_NONE
337-
self.check_handshake(server_context, client_context)
360+
check_handshake(server_context, client_context)
338361
server_context.verify_mode = ssl.CERT_REQUIRED
339-
self.check_handshake(server_context, client_context, ssl.SSLError)
362+
check_handshake(server_context, client_context, ssl.SSLError)
340363
server_context.verify_mode = ssl.CERT_OPTIONAL
341-
self.check_handshake(server_context, client_context)
364+
check_handshake(server_context, client_context)
342365

343366
# client provides cert, but server has nothing to verify with
344367
client_context.load_cert_chain(signed_cert)
345368

346369
server_context.verify_mode = ssl.CERT_NONE
347-
self.check_handshake(server_context, client_context)
370+
check_handshake(server_context, client_context)
348371
server_context.verify_mode = ssl.CERT_REQUIRED
349-
self.check_handshake(server_context, client_context, ssl.SSLError)
372+
check_handshake(server_context, client_context, ssl.SSLError)
350373
server_context.verify_mode = ssl.CERT_OPTIONAL
351-
self.check_handshake(server_context, client_context, ssl.SSLCertVerificationError)
374+
check_handshake(server_context, client_context, ssl.SSLCertVerificationError)
352375

353376
# client provides cert, server verifies
354377
server_context.load_verify_locations(signing_ca)
355378

356379
server_context.verify_mode = ssl.CERT_NONE
357-
self.check_handshake(server_context, client_context)
380+
check_handshake(server_context, client_context)
358381
server_context.verify_mode = ssl.CERT_REQUIRED
359-
self.check_handshake(server_context, client_context)
382+
check_handshake(server_context, client_context)
360383
server_context.verify_mode = ssl.CERT_OPTIONAL
361-
self.check_handshake(server_context, client_context)
384+
check_handshake(server_context, client_context)
362385

363386
# client provides wrong cert for CERT_OPTIONAL server
364387
client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
365388
client_context.load_cert_chain(signed_cert2)
366-
self.check_handshake(server_context, client_context, ssl.SSLCertVerificationError)
389+
check_handshake(server_context, client_context, ssl.SSLCertVerificationError)
367390

368391
def get_cipher_list(cipher_string):
369392
context = ssl.SSLContext()

0 commit comments

Comments
 (0)