File: test_asn1.py

package info (click to toggle)
m2crypto 0.46.2-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,964 kB
  • sloc: python: 22,936; makefile: 213; ansic: 94; sh: 17
file content (167 lines) | stat: -rw-r--r-- 5,737 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#!/usr/bin/env python

"""Unit tests for M2Crypto.ASN1.

Copyright (c) 2005 Open Source Applications Foundation. All rights reserved.
"""

import datetime
import platform
import time

from M2Crypto import ASN1, m2
from M2Crypto.util import is_32bit, expectedFailureIf
from tests import unittest


class ASN1TestCase(unittest.TestCase):

    def test_Integer(self):
        a_int = ASN1.ASN1_Integer(42, 1)
        self.assertEqual(int(a_int), 42)

    def test_String(self):
        # Currently we are supporting only ASCII strings, support for
        # Unicode strings is unclear.
        # a_str = ASN1.ASN1_String("дощови́й черв'я́к", 1)
        # self.assertEqual(str(a_str), "дощови́й черв'я́к")
        a_str = ASN1.ASN1_String("zizalka", 1)
        self.assertEqual(str(a_str), "zizalka")
        a_str = ASN1.ASN1_String(b"zizalka", 1)
        self.assertEqual(bytes(a_str), b"zizalka")

    def test_String_legacy(self):
        # Old API, which expects ASN1_String on __init__ is still supported
        asn1ptr = m2.asn1_string_new()
        # FIXME this is probably wrong ... asn1_string_set should have
        # Python string as its parameter.
        text = b"hello there"
        # In RFC2253 format:
        # #040B68656C6C6F207468657265
        #      h e l l o   t h e r e
        m2.asn1_string_set(asn1ptr, text)
        a = ASN1.ASN1_String(asn1ptr, 1)
        self.assertEqual(a.as_text(), "hello there", a.as_text())
        self.assertEqual(
            a.as_text(flags=m2.ASN1_STRFLGS_RFC2253),
            "#040B68656C6C6F207468657265",
            a.as_text(flags=m2.ASN1_STRFLGS_RFC2253),
        )
        self.assertEqual(a.as_text(), str(a))

    def test_Object(self):
        pass  # XXX Dunno how to test

    @unittest.skipIf(platform.system() == "Windows", "Skip on Windows.")
    def test_TIME(self):
        asn1 = ASN1.ASN1_TIME()
        self.assertEqual(str(asn1), "Bad time value")

        format = "%b %d %H:%M:%S %Y GMT"
        utcformat = "%y%m%d%H%M%SZ"

        s = "990807053011Z"
        asn1.set_string(s)
        self.assertEqual(str(asn1), "Aug  7 05:30:11 1999 GMT")
        t1 = time.strptime(str(asn1), format)
        t2 = time.strptime(s, utcformat)
        self.assertEqual(t1, t2)

        asn1.set_time(500)
        self.assertEqual(str(asn1), "Jan  1 00:08:20 1970 GMT")
        t1 = time.strftime(format, time.strptime(str(asn1), format))
        t2 = time.strftime(format, time.gmtime(500))
        self.assertEqual(t1, t2)

        t = int(time.time()) + time.timezone
        asn1.set_time(t)
        t1 = time.strftime(format, time.strptime(str(asn1), format))
        t2 = time.strftime(format, time.gmtime(t))
        self.assertEqual(t1, t2)

    @unittest.skipIf(platform.system() == "Windows", "Skip on Windows.")
    def test_UTCTIME(self):
        asn1 = ASN1.ASN1_UTCTIME()
        self.assertEqual(str(asn1), "Bad time value")

        format = "%b %d %H:%M:%S %Y GMT"
        utcformat = "%y%m%d%H%M%SZ"

        s = "990807053011Z"
        asn1.set_string(s)
        # self.assertEqual(str(asn1), 'Aug  7 05:30:11 1999 GMT')
        t1 = time.strptime(str(asn1), format)
        t2 = time.strptime(s, utcformat)
        self.assertEqual(t1, t2)

        asn1.set_time(500)
        # self.assertEqual(str(asn1), 'Jan  1 00:08:20 1970 GMT')
        t1 = time.strftime(format, time.strptime(str(asn1), format))
        t2 = time.strftime(format, time.gmtime(500))
        self.assertEqual(t1, t2)

        t = int(time.time()) + time.timezone
        asn1.set_time(t)
        t1 = time.strftime(format, time.strptime(str(asn1), format))
        t2 = time.strftime(format, time.gmtime(t))
        self.assertEqual(t1, t2)

    @unittest.skipIf(platform.system() == "Windows", "Skip on Windows.")
    def test_TIME_datetime(self):
        asn1 = ASN1.ASN1_TIME()
        # Test get_datetime and set_datetime
        t = time.time()
        dt = datetime.datetime.fromtimestamp(int(t))
        udt = dt.replace(tzinfo=ASN1.LocalTimezone()).astimezone(ASN1.UTC)
        asn1.set_time(int(t))
        t1 = str(asn1)
        asn1.set_datetime(dt)
        t2 = str(asn1)
        self.assertEqual(t1, t2)
        self.assertEqual(str(udt), str(asn1.get_datetime()))

        dt = dt.replace(tzinfo=ASN1.LocalTimezone())
        asn1.set_datetime(dt)
        t2 = str(asn1)
        self.assertEqual(t1, t2)
        self.assertEqual(str(udt), str(asn1.get_datetime()))

        dt = dt.astimezone(ASN1.UTC)
        asn1.set_datetime(dt)
        t2 = str(asn1)
        self.assertEqual(t1, t2)
        self.assertEqual(str(udt), str(asn1.get_datetime()))

    @unittest.skipIf(platform.system() == "Windows", "Skip on Windows.")
    def test_UTCTIME_datetime(self):
        asn1 = ASN1.ASN1_UTCTIME()
        # Test get_datetime and set_datetime
        t = time.time()
        dt = datetime.datetime.fromtimestamp(int(t))
        udt = dt.replace(tzinfo=ASN1.LocalTimezone()).astimezone(ASN1.UTC)
        asn1.set_time(int(t))
        t1 = str(asn1)
        asn1.set_datetime(dt)
        t2 = str(asn1)
        self.assertEqual(t1, t2)
        self.assertEqual(str(udt), str(asn1.get_datetime()))

        dt = dt.replace(tzinfo=ASN1.LocalTimezone())
        asn1.set_datetime(dt)
        t2 = str(asn1)
        self.assertEqual(t1, t2)
        self.assertEqual(str(udt), str(asn1.get_datetime()))

        dt = dt.astimezone(ASN1.UTC)
        asn1.set_datetime(dt)
        t2 = str(asn1)
        self.assertEqual(t1, t2)
        self.assertEqual(str(udt), str(asn1.get_datetime()))


def suite():
    return unittest.TestLoader().loadTestsFromTestCase(ASN1TestCase)


if __name__ == "__main__":
    unittest.TextTestRunner().run(suite())