blob: 6a9af926d1d76f4c08195348a4e822a0f7fe7feb [file] [log] [blame]
Jean-Paul Calderonec7b3c892011-03-02 19:40:02 -05001# Copyright (C) Jean-Paul Calderone
2# See LICENSE for details.
3
Jean-Paul Calderone19555b92008-02-19 22:29:57 -05004import sys
5
Jean-Paul Calderone8e37f762011-09-14 10:00:50 -04006from OpenSSL.crypto import (
7 FILETYPE_PEM, TYPE_DSA, Error, PKey, X509, load_privatekey)
Jean-Paul Calderone19555b92008-02-19 22:29:57 -05008
Jean-Paul Calderone8e37f762011-09-14 10:00:50 -04009
10
11class BaseChecker(object):
Jean-Paul Calderone19555b92008-02-19 22:29:57 -050012 def __init__(self, iterations):
13 self.iterations = iterations
14
15
Jean-Paul Calderone8e37f762011-09-14 10:00:50 -040016
17class Checker_X509_get_pubkey(BaseChecker):
18 """
19 Leak checks for L{X509.get_pubkey}.
20 """
Jean-Paul Calderone19555b92008-02-19 22:29:57 -050021 def check_exception(self):
22 """
23 Call the method repeatedly such that it will raise an exception.
24 """
25 for i in xrange(self.iterations):
26 cert = X509()
27 try:
28 cert.get_pubkey()
29 except Error:
30 pass
31
32
33 def check_success(self):
34 """
35 Call the method repeatedly such that it will return a PKey object.
36 """
37 small = xrange(3)
38 for i in xrange(self.iterations):
39 key = PKey()
40 key.generate_key(TYPE_DSA, 256)
41 for i in small:
42 cert = X509()
43 cert.set_pubkey(key)
44 for i in small:
45 cert.get_pubkey()
46
47
Jean-Paul Calderone8e37f762011-09-14 10:00:50 -040048
49class Checker_load_privatekey(BaseChecker):
50 """
51 Leak checks for :py:obj:`load_privatekey`.
52 """
53 ENCRYPTED_PEM = """\
54-----BEGIN RSA PRIVATE KEY-----
55Proc-Type: 4,ENCRYPTED
56DEK-Info: BF-CBC,3763C340F9B5A1D0
57
58a/DO10mLjHLCAOG8/Hc5Lbuh3pfjvcTZiCexShP+tupkp0VxW2YbZjML8uoXrpA6
59fSPUo7cEC+r96GjV03ZIVhjmsxxesdWMpfkzXRpG8rUbWEW2KcCJWdSX8bEkuNW3
60uvAXdXZwiOrm56ANDo/48gj27GcLwnlA8ld39+ylAzkUJ1tcMVzzTjfcyd6BMFpR
61Yjg23ikseug6iWEsZQormdl0ITdYzmFpM+YYsG7kmmmi4UjCEYfb9zFaqJn+WZT2
62qXxmo2ZPFzmEVkuB46mf5GCqMwLRN2QTbIZX2+Dljj1Hfo5erf5jROewE/yzcTwO
63FCB5K3c2kkTv2KjcCAimjxkE+SBKfHg35W0wB0AWkXpVFO5W/TbHg4tqtkpt/KMn
64/MPnSxvYr/vEqYMfW4Y83c45iqK0Cyr2pwY60lcn8Kk=
65-----END RSA PRIVATE KEY-----
66"""
67 def check_load_privatekey_callback(self):
68 """
69 Call the function with an encrypted PEM and a passphrase callback.
70 """
71 for i in xrange(self.iterations * 10):
72 load_privatekey(
73 FILETYPE_PEM, self.ENCRYPTED_PEM, lambda *args: "hello, secret")
74
75
76 def check_load_privatekey_callback_incorrect(self):
77 """
78 Call the function with an encrypted PEM and a passphrase callback which
79 returns the wrong passphrase.
80 """
81 for i in xrange(self.iterations * 10):
82 try:
83 load_privatekey(
84 FILETYPE_PEM, self.ENCRYPTED_PEM,
85 lambda *args: "hello, public")
86 except Error:
87 pass
88
89
90 def check_load_privatekey_callback_wrong_type(self):
91 """
92 Call the function with an encrypted PEM and a passphrase callback which
93 returns a non-string.
94 """
95 for i in xrange(self.iterations * 10):
96 try:
97 load_privatekey(
98 FILETYPE_PEM, self.ENCRYPTED_PEM,
99 lambda *args: {})
Jean-Paul Calderone2a864f12011-09-14 11:10:29 -0400100 except ValueError:
Jean-Paul Calderone8e37f762011-09-14 10:00:50 -0400101 pass
102
103
Jean-Paul Calderone19555b92008-02-19 22:29:57 -0500104def vmsize():
105 return [x for x in file('/proc/self/status').readlines() if 'VmSize' in x]
106
107
108def main(iterations='1000'):
109 iterations = int(iterations)
110 for klass in globals():
111 if klass.startswith('Checker_'):
112 klass = globals()[klass]
113 print klass
114 checker = klass(iterations)
115 for meth in dir(checker):
116 if meth.startswith('check_'):
117 print '\t', meth, vmsize(), '...',
118 getattr(checker, meth)()
119 print vmsize()
120
121
122if __name__ == '__main__':
123 main(*sys.argv[1:])