summaryrefslogtreecommitdiff
path: root/astroid/brain/brain_ssl.py
blob: a4d89b74810e28ac8850141705b0787924a8b224 (plain)
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
# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
# For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE
# Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt

"""Astroid hooks for the ssl library."""

from astroid import parse
from astroid.brain.helpers import register_module_extender
from astroid.const import PY310_PLUS
from astroid.manager import AstroidManager


def _verifyflags_enum() -> str:
    enum = """
    class VerifyFlags(_IntFlag):
        VERIFY_DEFAULT = 0
        VERIFY_CRL_CHECK_LEAF = 1
        VERIFY_CRL_CHECK_CHAIN = 2
        VERIFY_X509_STRICT = 3
        VERIFY_X509_TRUSTED_FIRST = 4"""
    if PY310_PLUS:
        enum += """
        VERIFY_ALLOW_PROXY_CERTS = 5
        VERIFY_X509_PARTIAL_CHAIN = 6
        """
    return enum


def _options_enum() -> str:
    enum = """
    class Options(_IntFlag):
        OP_ALL = 1
        OP_NO_SSLv2 = 2
        OP_NO_SSLv3 = 3
        OP_NO_TLSv1 = 4
        OP_NO_TLSv1_1 = 5
        OP_NO_TLSv1_2 = 6
        OP_NO_TLSv1_3 = 7
        OP_CIPHER_SERVER_PREFERENCE = 8
        OP_SINGLE_DH_USE = 9
        OP_SINGLE_ECDH_USE = 10
        OP_NO_COMPRESSION = 11
        OP_NO_TICKET = 12
        OP_NO_RENEGOTIATION = 13
        OP_ENABLE_MIDDLEBOX_COMPAT = 14"""
    return enum


def ssl_transform():
    return parse(
        """
    # Import necessary for conversion of objects defined in C into enums
    from enum import IntEnum as _IntEnum, IntFlag as _IntFlag

    from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION
    from _ssl import _SSLContext, MemoryBIO
    from _ssl import (
        SSLError, SSLZeroReturnError, SSLWantReadError, SSLWantWriteError,
        SSLSyscallError, SSLEOFError,
        )
    from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED
    from _ssl import txt2obj as _txt2obj, nid2obj as _nid2obj
    from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes
    try:
        from _ssl import RAND_egd
    except ImportError:
        # LibreSSL does not provide RAND_egd
        pass
    from _ssl import (OP_ALL, OP_CIPHER_SERVER_PREFERENCE,
                      OP_NO_COMPRESSION, OP_NO_SSLv2, OP_NO_SSLv3,
                      OP_NO_TLSv1, OP_NO_TLSv1_1, OP_NO_TLSv1_2,
                      OP_SINGLE_DH_USE, OP_SINGLE_ECDH_USE)

    from _ssl import (ALERT_DESCRIPTION_ACCESS_DENIED, ALERT_DESCRIPTION_BAD_CERTIFICATE,
                      ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE,
                      ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE,
                      ALERT_DESCRIPTION_BAD_RECORD_MAC,
                      ALERT_DESCRIPTION_CERTIFICATE_EXPIRED,
                      ALERT_DESCRIPTION_CERTIFICATE_REVOKED,
                      ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN,
                      ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE,
                      ALERT_DESCRIPTION_CLOSE_NOTIFY, ALERT_DESCRIPTION_DECODE_ERROR,
                      ALERT_DESCRIPTION_DECOMPRESSION_FAILURE,
                      ALERT_DESCRIPTION_DECRYPT_ERROR,
                      ALERT_DESCRIPTION_HANDSHAKE_FAILURE,
                      ALERT_DESCRIPTION_ILLEGAL_PARAMETER,
                      ALERT_DESCRIPTION_INSUFFICIENT_SECURITY,
                      ALERT_DESCRIPTION_INTERNAL_ERROR,
                      ALERT_DESCRIPTION_NO_RENEGOTIATION,
                      ALERT_DESCRIPTION_PROTOCOL_VERSION,
                      ALERT_DESCRIPTION_RECORD_OVERFLOW,
                      ALERT_DESCRIPTION_UNEXPECTED_MESSAGE,
                      ALERT_DESCRIPTION_UNKNOWN_CA,
                      ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY,
                      ALERT_DESCRIPTION_UNRECOGNIZED_NAME,
                      ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE,
                      ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION,
                      ALERT_DESCRIPTION_USER_CANCELLED)
    from _ssl import (SSL_ERROR_EOF, SSL_ERROR_INVALID_ERROR_CODE, SSL_ERROR_SSL,
                      SSL_ERROR_SYSCALL, SSL_ERROR_WANT_CONNECT, SSL_ERROR_WANT_READ,
                      SSL_ERROR_WANT_WRITE, SSL_ERROR_WANT_X509_LOOKUP, SSL_ERROR_ZERO_RETURN)
    from _ssl import VERIFY_CRL_CHECK_CHAIN, VERIFY_CRL_CHECK_LEAF, VERIFY_DEFAULT, VERIFY_X509_STRICT
    from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN, HAS_ALPN
    from _ssl import _OPENSSL_API_VERSION
    from _ssl import PROTOCOL_SSLv23, PROTOCOL_TLSv1, PROTOCOL_TLSv1_1, PROTOCOL_TLSv1_2
    from _ssl import PROTOCOL_TLS, PROTOCOL_TLS_CLIENT, PROTOCOL_TLS_SERVER

    class AlertDescription(_IntEnum):
        ALERT_DESCRIPTION_ACCESS_DENIED = 0
        ALERT_DESCRIPTION_BAD_CERTIFICATE = 1
        ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE = 2
        ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE = 3
        ALERT_DESCRIPTION_BAD_RECORD_MAC = 4
        ALERT_DESCRIPTION_CERTIFICATE_EXPIRED = 5
        ALERT_DESCRIPTION_CERTIFICATE_REVOKED = 6
        ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN = 7
        ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE = 8
        ALERT_DESCRIPTION_CLOSE_NOTIFY = 9
        ALERT_DESCRIPTION_DECODE_ERROR = 10
        ALERT_DESCRIPTION_DECOMPRESSION_FAILURE = 11
        ALERT_DESCRIPTION_DECRYPT_ERROR = 12
        ALERT_DESCRIPTION_HANDSHAKE_FAILURE = 13
        ALERT_DESCRIPTION_ILLEGAL_PARAMETER = 14
        ALERT_DESCRIPTION_INSUFFICIENT_SECURITY = 15
        ALERT_DESCRIPTION_INTERNAL_ERROR = 16
        ALERT_DESCRIPTION_NO_RENEGOTIATION = 17
        ALERT_DESCRIPTION_PROTOCOL_VERSION = 18
        ALERT_DESCRIPTION_RECORD_OVERFLOW = 19
        ALERT_DESCRIPTION_UNEXPECTED_MESSAGE = 20
        ALERT_DESCRIPTION_UNKNOWN_CA = 21
        ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY = 22
        ALERT_DESCRIPTION_UNRECOGNIZED_NAME = 23
        ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE = 24
        ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION = 25
        ALERT_DESCRIPTION_USER_CANCELLED = 26

    class SSLErrorNumber(_IntEnum):
        SSL_ERROR_EOF = 0
        SSL_ERROR_INVALID_ERROR_CODE = 1
        SSL_ERROR_SSL = 2
        SSL_ERROR_SYSCALL = 3
        SSL_ERROR_WANT_CONNECT = 4
        SSL_ERROR_WANT_READ = 5
        SSL_ERROR_WANT_WRITE = 6
        SSL_ERROR_WANT_X509_LOOKUP = 7
        SSL_ERROR_ZERO_RETURN = 8

    class VerifyMode(_IntEnum):
        CERT_NONE = 0
        CERT_OPTIONAL = 1
        CERT_REQUIRED = 2
    """
        + _verifyflags_enum()
        + _options_enum()
    )


register_module_extender(AstroidManager(), "ssl", ssl_transform)