brain_ssl.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. # Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
  2. # For details: https://github.com/pylint-dev/astroid/blob/main/LICENSE
  3. # Copyright (c) https://github.com/pylint-dev/astroid/blob/main/CONTRIBUTORS.txt
  4. """Astroid hooks for the ssl library."""
  5. from astroid import nodes
  6. from astroid.brain.helpers import register_module_extender
  7. from astroid.builder import parse
  8. from astroid.const import PY312_PLUS
  9. from astroid.manager import AstroidManager
  10. def _verifyflags_enum() -> str:
  11. enum = """
  12. class VerifyFlags(_IntFlag):
  13. VERIFY_DEFAULT = 0
  14. VERIFY_CRL_CHECK_LEAF = 1
  15. VERIFY_CRL_CHECK_CHAIN = 2
  16. VERIFY_X509_STRICT = 3
  17. VERIFY_X509_TRUSTED_FIRST = 4
  18. VERIFY_ALLOW_PROXY_CERTS = 5
  19. VERIFY_X509_PARTIAL_CHAIN = 6
  20. """
  21. return enum
  22. def _options_enum() -> str:
  23. enum = """
  24. class Options(_IntFlag):
  25. OP_ALL = 1
  26. OP_NO_SSLv2 = 2
  27. OP_NO_SSLv3 = 3
  28. OP_NO_TLSv1 = 4
  29. OP_NO_TLSv1_1 = 5
  30. OP_NO_TLSv1_2 = 6
  31. OP_NO_TLSv1_3 = 7
  32. OP_CIPHER_SERVER_PREFERENCE = 8
  33. OP_SINGLE_DH_USE = 9
  34. OP_SINGLE_ECDH_USE = 10
  35. OP_NO_COMPRESSION = 11
  36. OP_NO_TICKET = 12
  37. OP_NO_RENEGOTIATION = 13
  38. OP_ENABLE_MIDDLEBOX_COMPAT = 14
  39. """
  40. if PY312_PLUS:
  41. enum += "OP_LEGACY_SERVER_CONNECT = 15"
  42. return enum
  43. def ssl_transform() -> nodes.Module:
  44. return parse(
  45. f"""
  46. # Import necessary for conversion of objects defined in C into enums
  47. from enum import IntEnum as _IntEnum, IntFlag as _IntFlag
  48. from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION
  49. from _ssl import _SSLContext, MemoryBIO
  50. from _ssl import (
  51. SSLError, SSLZeroReturnError, SSLWantReadError, SSLWantWriteError,
  52. SSLSyscallError, SSLEOFError,
  53. )
  54. from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED
  55. from _ssl import txt2obj as _txt2obj, nid2obj as _nid2obj
  56. from _ssl import RAND_status, RAND_add, RAND_bytes, RAND_pseudo_bytes
  57. try:
  58. from _ssl import RAND_egd
  59. except ImportError:
  60. # LibreSSL does not provide RAND_egd
  61. pass
  62. from _ssl import (OP_ALL, OP_CIPHER_SERVER_PREFERENCE,
  63. OP_NO_COMPRESSION, OP_NO_SSLv2, OP_NO_SSLv3,
  64. OP_NO_TLSv1, OP_NO_TLSv1_1, OP_NO_TLSv1_2,
  65. OP_SINGLE_DH_USE, OP_SINGLE_ECDH_USE)
  66. {"from _ssl import OP_LEGACY_SERVER_CONNECT" if PY312_PLUS else ""}
  67. from _ssl import (ALERT_DESCRIPTION_ACCESS_DENIED, ALERT_DESCRIPTION_BAD_CERTIFICATE,
  68. ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE,
  69. ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE,
  70. ALERT_DESCRIPTION_BAD_RECORD_MAC,
  71. ALERT_DESCRIPTION_CERTIFICATE_EXPIRED,
  72. ALERT_DESCRIPTION_CERTIFICATE_REVOKED,
  73. ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN,
  74. ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE,
  75. ALERT_DESCRIPTION_CLOSE_NOTIFY, ALERT_DESCRIPTION_DECODE_ERROR,
  76. ALERT_DESCRIPTION_DECOMPRESSION_FAILURE,
  77. ALERT_DESCRIPTION_DECRYPT_ERROR,
  78. ALERT_DESCRIPTION_HANDSHAKE_FAILURE,
  79. ALERT_DESCRIPTION_ILLEGAL_PARAMETER,
  80. ALERT_DESCRIPTION_INSUFFICIENT_SECURITY,
  81. ALERT_DESCRIPTION_INTERNAL_ERROR,
  82. ALERT_DESCRIPTION_NO_RENEGOTIATION,
  83. ALERT_DESCRIPTION_PROTOCOL_VERSION,
  84. ALERT_DESCRIPTION_RECORD_OVERFLOW,
  85. ALERT_DESCRIPTION_UNEXPECTED_MESSAGE,
  86. ALERT_DESCRIPTION_UNKNOWN_CA,
  87. ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY,
  88. ALERT_DESCRIPTION_UNRECOGNIZED_NAME,
  89. ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE,
  90. ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION,
  91. ALERT_DESCRIPTION_USER_CANCELLED)
  92. from _ssl import (SSL_ERROR_EOF, SSL_ERROR_INVALID_ERROR_CODE, SSL_ERROR_SSL,
  93. SSL_ERROR_SYSCALL, SSL_ERROR_WANT_CONNECT, SSL_ERROR_WANT_READ,
  94. SSL_ERROR_WANT_WRITE, SSL_ERROR_WANT_X509_LOOKUP, SSL_ERROR_ZERO_RETURN)
  95. from _ssl import VERIFY_CRL_CHECK_CHAIN, VERIFY_CRL_CHECK_LEAF, VERIFY_DEFAULT, VERIFY_X509_STRICT
  96. from _ssl import HAS_SNI, HAS_ECDH, HAS_NPN, HAS_ALPN
  97. from _ssl import _OPENSSL_API_VERSION
  98. from _ssl import PROTOCOL_SSLv23, PROTOCOL_TLSv1, PROTOCOL_TLSv1_1, PROTOCOL_TLSv1_2
  99. from _ssl import PROTOCOL_TLS, PROTOCOL_TLS_CLIENT, PROTOCOL_TLS_SERVER
  100. class AlertDescription(_IntEnum):
  101. ALERT_DESCRIPTION_ACCESS_DENIED = 0
  102. ALERT_DESCRIPTION_BAD_CERTIFICATE = 1
  103. ALERT_DESCRIPTION_BAD_CERTIFICATE_HASH_VALUE = 2
  104. ALERT_DESCRIPTION_BAD_CERTIFICATE_STATUS_RESPONSE = 3
  105. ALERT_DESCRIPTION_BAD_RECORD_MAC = 4
  106. ALERT_DESCRIPTION_CERTIFICATE_EXPIRED = 5
  107. ALERT_DESCRIPTION_CERTIFICATE_REVOKED = 6
  108. ALERT_DESCRIPTION_CERTIFICATE_UNKNOWN = 7
  109. ALERT_DESCRIPTION_CERTIFICATE_UNOBTAINABLE = 8
  110. ALERT_DESCRIPTION_CLOSE_NOTIFY = 9
  111. ALERT_DESCRIPTION_DECODE_ERROR = 10
  112. ALERT_DESCRIPTION_DECOMPRESSION_FAILURE = 11
  113. ALERT_DESCRIPTION_DECRYPT_ERROR = 12
  114. ALERT_DESCRIPTION_HANDSHAKE_FAILURE = 13
  115. ALERT_DESCRIPTION_ILLEGAL_PARAMETER = 14
  116. ALERT_DESCRIPTION_INSUFFICIENT_SECURITY = 15
  117. ALERT_DESCRIPTION_INTERNAL_ERROR = 16
  118. ALERT_DESCRIPTION_NO_RENEGOTIATION = 17
  119. ALERT_DESCRIPTION_PROTOCOL_VERSION = 18
  120. ALERT_DESCRIPTION_RECORD_OVERFLOW = 19
  121. ALERT_DESCRIPTION_UNEXPECTED_MESSAGE = 20
  122. ALERT_DESCRIPTION_UNKNOWN_CA = 21
  123. ALERT_DESCRIPTION_UNKNOWN_PSK_IDENTITY = 22
  124. ALERT_DESCRIPTION_UNRECOGNIZED_NAME = 23
  125. ALERT_DESCRIPTION_UNSUPPORTED_CERTIFICATE = 24
  126. ALERT_DESCRIPTION_UNSUPPORTED_EXTENSION = 25
  127. ALERT_DESCRIPTION_USER_CANCELLED = 26
  128. class SSLErrorNumber(_IntEnum):
  129. SSL_ERROR_EOF = 0
  130. SSL_ERROR_INVALID_ERROR_CODE = 1
  131. SSL_ERROR_SSL = 2
  132. SSL_ERROR_SYSCALL = 3
  133. SSL_ERROR_WANT_CONNECT = 4
  134. SSL_ERROR_WANT_READ = 5
  135. SSL_ERROR_WANT_WRITE = 6
  136. SSL_ERROR_WANT_X509_LOOKUP = 7
  137. SSL_ERROR_ZERO_RETURN = 8
  138. class VerifyMode(_IntEnum):
  139. CERT_NONE = 0
  140. CERT_OPTIONAL = 1
  141. CERT_REQUIRED = 2
  142. """
  143. + _verifyflags_enum()
  144. + _options_enum()
  145. )
  146. def register(manager: AstroidManager) -> None:
  147. register_module_extender(manager, "ssl", ssl_transform)