LCOV - code coverage report
Current view: top level - Modules/clinic - _ssl.c.h (source / functions) Hit Total Coverage
Test: CPython 3.12 LCOV report [commit acb105a7c1f] Lines: 316 393 80.4 %
Date: 2022-07-20 13:12:14 Functions: 38 38 100.0 %
Branches: 139 281 49.5 %

           Branch data     Line data    Source code
       1                 :            : /*[clinic input]
       2                 :            : preserve
       3                 :            : [clinic start generated code]*/
       4                 :            : 
       5                 :            : PyDoc_STRVAR(_ssl__SSLSocket_do_handshake__doc__,
       6                 :            : "do_handshake($self, /)\n"
       7                 :            : "--\n"
       8                 :            : "\n");
       9                 :            : 
      10                 :            : #define _SSL__SSLSOCKET_DO_HANDSHAKE_METHODDEF    \
      11                 :            :     {"do_handshake", (PyCFunction)_ssl__SSLSocket_do_handshake, METH_NOARGS, _ssl__SSLSocket_do_handshake__doc__},
      12                 :            : 
      13                 :            : static PyObject *
      14                 :            : _ssl__SSLSocket_do_handshake_impl(PySSLSocket *self);
      15                 :            : 
      16                 :            : static PyObject *
      17                 :       1954 : _ssl__SSLSocket_do_handshake(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
      18                 :            : {
      19                 :       1954 :     return _ssl__SSLSocket_do_handshake_impl(self);
      20                 :            : }
      21                 :            : 
      22                 :            : PyDoc_STRVAR(_ssl__test_decode_cert__doc__,
      23                 :            : "_test_decode_cert($module, path, /)\n"
      24                 :            : "--\n"
      25                 :            : "\n");
      26                 :            : 
      27                 :            : #define _SSL__TEST_DECODE_CERT_METHODDEF    \
      28                 :            :     {"_test_decode_cert", (PyCFunction)_ssl__test_decode_cert, METH_O, _ssl__test_decode_cert__doc__},
      29                 :            : 
      30                 :            : static PyObject *
      31                 :            : _ssl__test_decode_cert_impl(PyObject *module, PyObject *path);
      32                 :            : 
      33                 :            : static PyObject *
      34                 :          6 : _ssl__test_decode_cert(PyObject *module, PyObject *arg)
      35                 :            : {
      36                 :          6 :     PyObject *return_value = NULL;
      37                 :            :     PyObject *path;
      38                 :            : 
      39         [ -  + ]:          6 :     if (!PyUnicode_FSConverter(arg, &path)) {
      40                 :          0 :         goto exit;
      41                 :            :     }
      42                 :          6 :     return_value = _ssl__test_decode_cert_impl(module, path);
      43                 :            : 
      44                 :          6 : exit:
      45                 :          6 :     return return_value;
      46                 :            : }
      47                 :            : 
      48                 :            : PyDoc_STRVAR(_ssl__SSLSocket_getpeercert__doc__,
      49                 :            : "getpeercert($self, der=False, /)\n"
      50                 :            : "--\n"
      51                 :            : "\n"
      52                 :            : "Returns the certificate for the peer.\n"
      53                 :            : "\n"
      54                 :            : "If no certificate was provided, returns None.  If a certificate was\n"
      55                 :            : "provided, but not validated, returns an empty dictionary.  Otherwise\n"
      56                 :            : "returns a dict containing information about the peer certificate.\n"
      57                 :            : "\n"
      58                 :            : "If the optional argument is True, returns a DER-encoded copy of the\n"
      59                 :            : "peer certificate, or None if no certificate was provided.  This will\n"
      60                 :            : "return the certificate even if it wasn\'t validated.");
      61                 :            : 
      62                 :            : #define _SSL__SSLSOCKET_GETPEERCERT_METHODDEF    \
      63                 :            :     {"getpeercert", _PyCFunction_CAST(_ssl__SSLSocket_getpeercert), METH_FASTCALL, _ssl__SSLSocket_getpeercert__doc__},
      64                 :            : 
      65                 :            : static PyObject *
      66                 :            : _ssl__SSLSocket_getpeercert_impl(PySSLSocket *self, int binary_mode);
      67                 :            : 
      68                 :            : static PyObject *
      69                 :        338 : _ssl__SSLSocket_getpeercert(PySSLSocket *self, PyObject *const *args, Py_ssize_t nargs)
      70                 :            : {
      71                 :        338 :     PyObject *return_value = NULL;
      72                 :        338 :     int binary_mode = 0;
      73                 :            : 
      74   [ +  -  -  +  :        338 :     if (!_PyArg_CheckPositional("getpeercert", nargs, 0, 1)) {
                   -  - ]
      75                 :          0 :         goto exit;
      76                 :            :     }
      77         [ -  + ]:        338 :     if (nargs < 1) {
      78                 :          0 :         goto skip_optional;
      79                 :            :     }
      80                 :        338 :     binary_mode = PyObject_IsTrue(args[0]);
      81         [ -  + ]:        338 :     if (binary_mode < 0) {
      82                 :          0 :         goto exit;
      83                 :            :     }
      84                 :        338 : skip_optional:
      85                 :        338 :     return_value = _ssl__SSLSocket_getpeercert_impl(self, binary_mode);
      86                 :            : 
      87                 :        338 : exit:
      88                 :        338 :     return return_value;
      89                 :            : }
      90                 :            : 
      91                 :            : PyDoc_STRVAR(_ssl__SSLSocket_get_verified_chain__doc__,
      92                 :            : "get_verified_chain($self, /)\n"
      93                 :            : "--\n"
      94                 :            : "\n");
      95                 :            : 
      96                 :            : #define _SSL__SSLSOCKET_GET_VERIFIED_CHAIN_METHODDEF    \
      97                 :            :     {"get_verified_chain", (PyCFunction)_ssl__SSLSocket_get_verified_chain, METH_NOARGS, _ssl__SSLSocket_get_verified_chain__doc__},
      98                 :            : 
      99                 :            : static PyObject *
     100                 :            : _ssl__SSLSocket_get_verified_chain_impl(PySSLSocket *self);
     101                 :            : 
     102                 :            : static PyObject *
     103                 :          2 : _ssl__SSLSocket_get_verified_chain(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
     104                 :            : {
     105                 :          2 :     return _ssl__SSLSocket_get_verified_chain_impl(self);
     106                 :            : }
     107                 :            : 
     108                 :            : PyDoc_STRVAR(_ssl__SSLSocket_get_unverified_chain__doc__,
     109                 :            : "get_unverified_chain($self, /)\n"
     110                 :            : "--\n"
     111                 :            : "\n");
     112                 :            : 
     113                 :            : #define _SSL__SSLSOCKET_GET_UNVERIFIED_CHAIN_METHODDEF    \
     114                 :            :     {"get_unverified_chain", (PyCFunction)_ssl__SSLSocket_get_unverified_chain, METH_NOARGS, _ssl__SSLSocket_get_unverified_chain__doc__},
     115                 :            : 
     116                 :            : static PyObject *
     117                 :            : _ssl__SSLSocket_get_unverified_chain_impl(PySSLSocket *self);
     118                 :            : 
     119                 :            : static PyObject *
     120                 :          2 : _ssl__SSLSocket_get_unverified_chain(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
     121                 :            : {
     122                 :          2 :     return _ssl__SSLSocket_get_unverified_chain_impl(self);
     123                 :            : }
     124                 :            : 
     125                 :            : PyDoc_STRVAR(_ssl__SSLSocket_shared_ciphers__doc__,
     126                 :            : "shared_ciphers($self, /)\n"
     127                 :            : "--\n"
     128                 :            : "\n");
     129                 :            : 
     130                 :            : #define _SSL__SSLSOCKET_SHARED_CIPHERS_METHODDEF    \
     131                 :            :     {"shared_ciphers", (PyCFunction)_ssl__SSLSocket_shared_ciphers, METH_NOARGS, _ssl__SSLSocket_shared_ciphers__doc__},
     132                 :            : 
     133                 :            : static PyObject *
     134                 :            : _ssl__SSLSocket_shared_ciphers_impl(PySSLSocket *self);
     135                 :            : 
     136                 :            : static PyObject *
     137                 :         97 : _ssl__SSLSocket_shared_ciphers(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
     138                 :            : {
     139                 :         97 :     return _ssl__SSLSocket_shared_ciphers_impl(self);
     140                 :            : }
     141                 :            : 
     142                 :            : PyDoc_STRVAR(_ssl__SSLSocket_cipher__doc__,
     143                 :            : "cipher($self, /)\n"
     144                 :            : "--\n"
     145                 :            : "\n");
     146                 :            : 
     147                 :            : #define _SSL__SSLSOCKET_CIPHER_METHODDEF    \
     148                 :            :     {"cipher", (PyCFunction)_ssl__SSLSocket_cipher, METH_NOARGS, _ssl__SSLSocket_cipher__doc__},
     149                 :            : 
     150                 :            : static PyObject *
     151                 :            : _ssl__SSLSocket_cipher_impl(PySSLSocket *self);
     152                 :            : 
     153                 :            : static PyObject *
     154                 :        378 : _ssl__SSLSocket_cipher(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
     155                 :            : {
     156                 :        378 :     return _ssl__SSLSocket_cipher_impl(self);
     157                 :            : }
     158                 :            : 
     159                 :            : PyDoc_STRVAR(_ssl__SSLSocket_version__doc__,
     160                 :            : "version($self, /)\n"
     161                 :            : "--\n"
     162                 :            : "\n");
     163                 :            : 
     164                 :            : #define _SSL__SSLSOCKET_VERSION_METHODDEF    \
     165                 :            :     {"version", (PyCFunction)_ssl__SSLSocket_version, METH_NOARGS, _ssl__SSLSocket_version__doc__},
     166                 :            : 
     167                 :            : static PyObject *
     168                 :            : _ssl__SSLSocket_version_impl(PySSLSocket *self);
     169                 :            : 
     170                 :            : static PyObject *
     171                 :         32 : _ssl__SSLSocket_version(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
     172                 :            : {
     173                 :         32 :     return _ssl__SSLSocket_version_impl(self);
     174                 :            : }
     175                 :            : 
     176                 :            : PyDoc_STRVAR(_ssl__SSLSocket_selected_alpn_protocol__doc__,
     177                 :            : "selected_alpn_protocol($self, /)\n"
     178                 :            : "--\n"
     179                 :            : "\n");
     180                 :            : 
     181                 :            : #define _SSL__SSLSOCKET_SELECTED_ALPN_PROTOCOL_METHODDEF    \
     182                 :            :     {"selected_alpn_protocol", (PyCFunction)_ssl__SSLSocket_selected_alpn_protocol, METH_NOARGS, _ssl__SSLSocket_selected_alpn_protocol__doc__},
     183                 :            : 
     184                 :            : static PyObject *
     185                 :            : _ssl__SSLSocket_selected_alpn_protocol_impl(PySSLSocket *self);
     186                 :            : 
     187                 :            : static PyObject *
     188                 :        121 : _ssl__SSLSocket_selected_alpn_protocol(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
     189                 :            : {
     190                 :        121 :     return _ssl__SSLSocket_selected_alpn_protocol_impl(self);
     191                 :            : }
     192                 :            : 
     193                 :            : PyDoc_STRVAR(_ssl__SSLSocket_compression__doc__,
     194                 :            : "compression($self, /)\n"
     195                 :            : "--\n"
     196                 :            : "\n");
     197                 :            : 
     198                 :            : #define _SSL__SSLSOCKET_COMPRESSION_METHODDEF    \
     199                 :            :     {"compression", (PyCFunction)_ssl__SSLSocket_compression, METH_NOARGS, _ssl__SSLSocket_compression__doc__},
     200                 :            : 
     201                 :            : static PyObject *
     202                 :            : _ssl__SSLSocket_compression_impl(PySSLSocket *self);
     203                 :            : 
     204                 :            : static PyObject *
     205                 :        294 : _ssl__SSLSocket_compression(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
     206                 :            : {
     207                 :        294 :     return _ssl__SSLSocket_compression_impl(self);
     208                 :            : }
     209                 :            : 
     210                 :            : PyDoc_STRVAR(_ssl__SSLSocket_write__doc__,
     211                 :            : "write($self, b, /)\n"
     212                 :            : "--\n"
     213                 :            : "\n"
     214                 :            : "Writes the bytes-like object b into the SSL object.\n"
     215                 :            : "\n"
     216                 :            : "Returns the number of bytes written.");
     217                 :            : 
     218                 :            : #define _SSL__SSLSOCKET_WRITE_METHODDEF    \
     219                 :            :     {"write", (PyCFunction)_ssl__SSLSocket_write, METH_O, _ssl__SSLSocket_write__doc__},
     220                 :            : 
     221                 :            : static PyObject *
     222                 :            : _ssl__SSLSocket_write_impl(PySSLSocket *self, Py_buffer *b);
     223                 :            : 
     224                 :            : static PyObject *
     225                 :       5096 : _ssl__SSLSocket_write(PySSLSocket *self, PyObject *arg)
     226                 :            : {
     227                 :       5096 :     PyObject *return_value = NULL;
     228                 :       5096 :     Py_buffer b = {NULL, NULL};
     229                 :            : 
     230         [ -  + ]:       5096 :     if (PyObject_GetBuffer(arg, &b, PyBUF_SIMPLE) != 0) {
     231                 :          0 :         goto exit;
     232                 :            :     }
     233         [ -  + ]:       5096 :     if (!PyBuffer_IsContiguous(&b, 'C')) {
     234                 :          0 :         _PyArg_BadArgument("write", "argument", "contiguous buffer", arg);
     235                 :          0 :         goto exit;
     236                 :            :     }
     237                 :       5096 :     return_value = _ssl__SSLSocket_write_impl(self, &b);
     238                 :            : 
     239                 :       5096 : exit:
     240                 :            :     /* Cleanup for b */
     241         [ +  - ]:       5096 :     if (b.obj) {
     242                 :       5096 :        PyBuffer_Release(&b);
     243                 :            :     }
     244                 :            : 
     245                 :       5096 :     return return_value;
     246                 :            : }
     247                 :            : 
     248                 :            : PyDoc_STRVAR(_ssl__SSLSocket_pending__doc__,
     249                 :            : "pending($self, /)\n"
     250                 :            : "--\n"
     251                 :            : "\n"
     252                 :            : "Returns the number of already decrypted bytes available for read, pending on the connection.");
     253                 :            : 
     254                 :            : #define _SSL__SSLSOCKET_PENDING_METHODDEF    \
     255                 :            :     {"pending", (PyCFunction)_ssl__SSLSocket_pending, METH_NOARGS, _ssl__SSLSocket_pending__doc__},
     256                 :            : 
     257                 :            : static PyObject *
     258                 :            : _ssl__SSLSocket_pending_impl(PySSLSocket *self);
     259                 :            : 
     260                 :            : static PyObject *
     261                 :          4 : _ssl__SSLSocket_pending(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
     262                 :            : {
     263                 :          4 :     return _ssl__SSLSocket_pending_impl(self);
     264                 :            : }
     265                 :            : 
     266                 :            : PyDoc_STRVAR(_ssl__SSLSocket_read__doc__,
     267                 :            : "read(size, [buffer])\n"
     268                 :            : "Read up to size bytes from the SSL socket.");
     269                 :            : 
     270                 :            : #define _SSL__SSLSOCKET_READ_METHODDEF    \
     271                 :            :     {"read", (PyCFunction)_ssl__SSLSocket_read, METH_VARARGS, _ssl__SSLSocket_read__doc__},
     272                 :            : 
     273                 :            : static PyObject *
     274                 :            : _ssl__SSLSocket_read_impl(PySSLSocket *self, Py_ssize_t len,
     275                 :            :                           int group_right_1, Py_buffer *buffer);
     276                 :            : 
     277                 :            : static PyObject *
     278                 :      26457 : _ssl__SSLSocket_read(PySSLSocket *self, PyObject *args)
     279                 :            : {
     280                 :      26457 :     PyObject *return_value = NULL;
     281                 :            :     Py_ssize_t len;
     282                 :      26457 :     int group_right_1 = 0;
     283                 :      26457 :     Py_buffer buffer = {NULL, NULL};
     284                 :            : 
     285      [ +  +  - ]:      26457 :     switch (PyTuple_GET_SIZE(args)) {
     286                 :      21468 :         case 1:
     287         [ -  + ]:      21468 :             if (!PyArg_ParseTuple(args, "n:read", &len)) {
     288                 :          0 :                 goto exit;
     289                 :            :             }
     290                 :      21468 :             break;
     291                 :       4989 :         case 2:
     292         [ -  + ]:       4989 :             if (!PyArg_ParseTuple(args, "nw*:read", &len, &buffer)) {
     293                 :          0 :                 goto exit;
     294                 :            :             }
     295                 :       4989 :             group_right_1 = 1;
     296                 :       4989 :             break;
     297                 :          0 :         default:
     298                 :          0 :             PyErr_SetString(PyExc_TypeError, "_ssl._SSLSocket.read requires 1 to 2 arguments");
     299                 :          0 :             goto exit;
     300                 :            :     }
     301                 :      26457 :     return_value = _ssl__SSLSocket_read_impl(self, len, group_right_1, &buffer);
     302                 :            : 
     303                 :      26457 : exit:
     304                 :            :     /* Cleanup for buffer */
     305         [ +  + ]:      26457 :     if (buffer.obj) {
     306                 :       4989 :        PyBuffer_Release(&buffer);
     307                 :            :     }
     308                 :            : 
     309                 :      26457 :     return return_value;
     310                 :            : }
     311                 :            : 
     312                 :            : PyDoc_STRVAR(_ssl__SSLSocket_shutdown__doc__,
     313                 :            : "shutdown($self, /)\n"
     314                 :            : "--\n"
     315                 :            : "\n"
     316                 :            : "Does the SSL shutdown handshake with the remote end.");
     317                 :            : 
     318                 :            : #define _SSL__SSLSOCKET_SHUTDOWN_METHODDEF    \
     319                 :            :     {"shutdown", (PyCFunction)_ssl__SSLSocket_shutdown, METH_NOARGS, _ssl__SSLSocket_shutdown__doc__},
     320                 :            : 
     321                 :            : static PyObject *
     322                 :            : _ssl__SSLSocket_shutdown_impl(PySSLSocket *self);
     323                 :            : 
     324                 :            : static PyObject *
     325                 :        620 : _ssl__SSLSocket_shutdown(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
     326                 :            : {
     327                 :        620 :     return _ssl__SSLSocket_shutdown_impl(self);
     328                 :            : }
     329                 :            : 
     330                 :            : PyDoc_STRVAR(_ssl__SSLSocket_get_channel_binding__doc__,
     331                 :            : "get_channel_binding($self, /, cb_type=\'tls-unique\')\n"
     332                 :            : "--\n"
     333                 :            : "\n"
     334                 :            : "Get channel binding data for current connection.\n"
     335                 :            : "\n"
     336                 :            : "Raise ValueError if the requested `cb_type` is not supported.  Return bytes\n"
     337                 :            : "of the data or None if the data is not available (e.g. before the handshake).\n"
     338                 :            : "Only \'tls-unique\' channel binding data from RFC 5929 is supported.");
     339                 :            : 
     340                 :            : #define _SSL__SSLSOCKET_GET_CHANNEL_BINDING_METHODDEF    \
     341                 :            :     {"get_channel_binding", _PyCFunction_CAST(_ssl__SSLSocket_get_channel_binding), METH_FASTCALL|METH_KEYWORDS, _ssl__SSLSocket_get_channel_binding__doc__},
     342                 :            : 
     343                 :            : static PyObject *
     344                 :            : _ssl__SSLSocket_get_channel_binding_impl(PySSLSocket *self,
     345                 :            :                                          const char *cb_type);
     346                 :            : 
     347                 :            : static PyObject *
     348                 :          7 : _ssl__SSLSocket_get_channel_binding(PySSLSocket *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     349                 :            : {
     350                 :          7 :     PyObject *return_value = NULL;
     351                 :            :     static const char * const _keywords[] = {"cb_type", NULL};
     352                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "get_channel_binding", 0};
     353                 :            :     PyObject *argsbuf[1];
     354         [ -  + ]:          7 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
     355                 :          7 :     const char *cb_type = "tls-unique";
     356                 :            : 
     357   [ +  -  +  -  :          7 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
             +  -  -  + ]
     358         [ -  + ]:          7 :     if (!args) {
     359                 :          0 :         goto exit;
     360                 :            :     }
     361         [ -  + ]:          7 :     if (!noptargs) {
     362                 :          0 :         goto skip_optional_pos;
     363                 :            :     }
     364         [ -  + ]:          7 :     if (!PyUnicode_Check(args[0])) {
     365                 :          0 :         _PyArg_BadArgument("get_channel_binding", "argument 'cb_type'", "str", args[0]);
     366                 :          0 :         goto exit;
     367                 :            :     }
     368                 :            :     Py_ssize_t cb_type_length;
     369                 :          7 :     cb_type = PyUnicode_AsUTF8AndSize(args[0], &cb_type_length);
     370         [ -  + ]:          7 :     if (cb_type == NULL) {
     371                 :          0 :         goto exit;
     372                 :            :     }
     373         [ -  + ]:          7 :     if (strlen(cb_type) != (size_t)cb_type_length) {
     374                 :          0 :         PyErr_SetString(PyExc_ValueError, "embedded null character");
     375                 :          0 :         goto exit;
     376                 :            :     }
     377                 :          7 : skip_optional_pos:
     378                 :          7 :     return_value = _ssl__SSLSocket_get_channel_binding_impl(self, cb_type);
     379                 :            : 
     380                 :          7 : exit:
     381                 :          7 :     return return_value;
     382                 :            : }
     383                 :            : 
     384                 :            : PyDoc_STRVAR(_ssl__SSLSocket_verify_client_post_handshake__doc__,
     385                 :            : "verify_client_post_handshake($self, /)\n"
     386                 :            : "--\n"
     387                 :            : "\n"
     388                 :            : "Initiate TLS 1.3 post-handshake authentication");
     389                 :            : 
     390                 :            : #define _SSL__SSLSOCKET_VERIFY_CLIENT_POST_HANDSHAKE_METHODDEF    \
     391                 :            :     {"verify_client_post_handshake", (PyCFunction)_ssl__SSLSocket_verify_client_post_handshake, METH_NOARGS, _ssl__SSLSocket_verify_client_post_handshake__doc__},
     392                 :            : 
     393                 :            : static PyObject *
     394                 :            : _ssl__SSLSocket_verify_client_post_handshake_impl(PySSLSocket *self);
     395                 :            : 
     396                 :            : static PyObject *
     397                 :         10 : _ssl__SSLSocket_verify_client_post_handshake(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
     398                 :            : {
     399                 :         10 :     return _ssl__SSLSocket_verify_client_post_handshake_impl(self);
     400                 :            : }
     401                 :            : 
     402                 :            : static PyObject *
     403                 :            : _ssl__SSLContext_impl(PyTypeObject *type, int proto_version);
     404                 :            : 
     405                 :            : static PyObject *
     406                 :        946 : _ssl__SSLContext(PyTypeObject *type, PyObject *args, PyObject *kwargs)
     407                 :            : {
     408                 :        946 :     PyObject *return_value = NULL;
     409                 :            :     int proto_version;
     410                 :            : 
     411         [ +  - ]:        946 :     if ((type == get_state_type(type)->PySSLContext_Type ||
     412   [ +  -  -  + ]:        946 :          type->tp_init == get_state_type(type)->PySSLContext_Type->tp_init) &&
     413         [ #  # ]:          0 :         !_PyArg_NoKeywords("_SSLContext", kwargs)) {
     414                 :          0 :         goto exit;
     415                 :            :     }
     416   [ +  -  -  +  :        946 :     if (!_PyArg_CheckPositional("_SSLContext", PyTuple_GET_SIZE(args), 1, 1)) {
                   -  - ]
     417                 :          0 :         goto exit;
     418                 :            :     }
     419                 :        946 :     proto_version = _PyLong_AsInt(PyTuple_GET_ITEM(args, 0));
     420   [ +  +  -  + ]:        946 :     if (proto_version == -1 && PyErr_Occurred()) {
     421                 :          0 :         goto exit;
     422                 :            :     }
     423                 :        946 :     return_value = _ssl__SSLContext_impl(type, proto_version);
     424                 :            : 
     425                 :        946 : exit:
     426                 :        946 :     return return_value;
     427                 :            : }
     428                 :            : 
     429                 :            : PyDoc_STRVAR(_ssl__SSLContext_set_ciphers__doc__,
     430                 :            : "set_ciphers($self, cipherlist, /)\n"
     431                 :            : "--\n"
     432                 :            : "\n");
     433                 :            : 
     434                 :            : #define _SSL__SSLCONTEXT_SET_CIPHERS_METHODDEF    \
     435                 :            :     {"set_ciphers", (PyCFunction)_ssl__SSLContext_set_ciphers, METH_O, _ssl__SSLContext_set_ciphers__doc__},
     436                 :            : 
     437                 :            : static PyObject *
     438                 :            : _ssl__SSLContext_set_ciphers_impl(PySSLContext *self, const char *cipherlist);
     439                 :            : 
     440                 :            : static PyObject *
     441                 :         24 : _ssl__SSLContext_set_ciphers(PySSLContext *self, PyObject *arg)
     442                 :            : {
     443                 :         24 :     PyObject *return_value = NULL;
     444                 :            :     const char *cipherlist;
     445                 :            : 
     446         [ -  + ]:         24 :     if (!PyUnicode_Check(arg)) {
     447                 :          0 :         _PyArg_BadArgument("set_ciphers", "argument", "str", arg);
     448                 :          0 :         goto exit;
     449                 :            :     }
     450                 :            :     Py_ssize_t cipherlist_length;
     451                 :         24 :     cipherlist = PyUnicode_AsUTF8AndSize(arg, &cipherlist_length);
     452         [ -  + ]:         24 :     if (cipherlist == NULL) {
     453                 :          0 :         goto exit;
     454                 :            :     }
     455         [ -  + ]:         24 :     if (strlen(cipherlist) != (size_t)cipherlist_length) {
     456                 :          0 :         PyErr_SetString(PyExc_ValueError, "embedded null character");
     457                 :          0 :         goto exit;
     458                 :            :     }
     459                 :         24 :     return_value = _ssl__SSLContext_set_ciphers_impl(self, cipherlist);
     460                 :            : 
     461                 :         24 : exit:
     462                 :         24 :     return return_value;
     463                 :            : }
     464                 :            : 
     465                 :            : PyDoc_STRVAR(_ssl__SSLContext_get_ciphers__doc__,
     466                 :            : "get_ciphers($self, /)\n"
     467                 :            : "--\n"
     468                 :            : "\n");
     469                 :            : 
     470                 :            : #define _SSL__SSLCONTEXT_GET_CIPHERS_METHODDEF    \
     471                 :            :     {"get_ciphers", (PyCFunction)_ssl__SSLContext_get_ciphers, METH_NOARGS, _ssl__SSLContext_get_ciphers__doc__},
     472                 :            : 
     473                 :            : static PyObject *
     474                 :            : _ssl__SSLContext_get_ciphers_impl(PySSLContext *self);
     475                 :            : 
     476                 :            : static PyObject *
     477                 :          2 : _ssl__SSLContext_get_ciphers(PySSLContext *self, PyObject *Py_UNUSED(ignored))
     478                 :            : {
     479                 :          2 :     return _ssl__SSLContext_get_ciphers_impl(self);
     480                 :            : }
     481                 :            : 
     482                 :            : PyDoc_STRVAR(_ssl__SSLContext__set_alpn_protocols__doc__,
     483                 :            : "_set_alpn_protocols($self, protos, /)\n"
     484                 :            : "--\n"
     485                 :            : "\n");
     486                 :            : 
     487                 :            : #define _SSL__SSLCONTEXT__SET_ALPN_PROTOCOLS_METHODDEF    \
     488                 :            :     {"_set_alpn_protocols", (PyCFunction)_ssl__SSLContext__set_alpn_protocols, METH_O, _ssl__SSLContext__set_alpn_protocols__doc__},
     489                 :            : 
     490                 :            : static PyObject *
     491                 :            : _ssl__SSLContext__set_alpn_protocols_impl(PySSLContext *self,
     492                 :            :                                           Py_buffer *protos);
     493                 :            : 
     494                 :            : static PyObject *
     495                 :        113 : _ssl__SSLContext__set_alpn_protocols(PySSLContext *self, PyObject *arg)
     496                 :            : {
     497                 :        113 :     PyObject *return_value = NULL;
     498                 :        113 :     Py_buffer protos = {NULL, NULL};
     499                 :            : 
     500         [ -  + ]:        113 :     if (PyObject_GetBuffer(arg, &protos, PyBUF_SIMPLE) != 0) {
     501                 :          0 :         goto exit;
     502                 :            :     }
     503         [ -  + ]:        113 :     if (!PyBuffer_IsContiguous(&protos, 'C')) {
     504                 :          0 :         _PyArg_BadArgument("_set_alpn_protocols", "argument", "contiguous buffer", arg);
     505                 :          0 :         goto exit;
     506                 :            :     }
     507                 :        113 :     return_value = _ssl__SSLContext__set_alpn_protocols_impl(self, &protos);
     508                 :            : 
     509                 :        113 : exit:
     510                 :            :     /* Cleanup for protos */
     511         [ +  - ]:        113 :     if (protos.obj) {
     512                 :        113 :        PyBuffer_Release(&protos);
     513                 :            :     }
     514                 :            : 
     515                 :        113 :     return return_value;
     516                 :            : }
     517                 :            : 
     518                 :            : PyDoc_STRVAR(_ssl__SSLContext_load_cert_chain__doc__,
     519                 :            : "load_cert_chain($self, /, certfile, keyfile=None, password=None)\n"
     520                 :            : "--\n"
     521                 :            : "\n");
     522                 :            : 
     523                 :            : #define _SSL__SSLCONTEXT_LOAD_CERT_CHAIN_METHODDEF    \
     524                 :            :     {"load_cert_chain", _PyCFunction_CAST(_ssl__SSLContext_load_cert_chain), METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext_load_cert_chain__doc__},
     525                 :            : 
     526                 :            : static PyObject *
     527                 :            : _ssl__SSLContext_load_cert_chain_impl(PySSLContext *self, PyObject *certfile,
     528                 :            :                                       PyObject *keyfile, PyObject *password);
     529                 :            : 
     530                 :            : static PyObject *
     531                 :        441 : _ssl__SSLContext_load_cert_chain(PySSLContext *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     532                 :            : {
     533                 :        441 :     PyObject *return_value = NULL;
     534                 :            :     static const char * const _keywords[] = {"certfile", "keyfile", "password", NULL};
     535                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "load_cert_chain", 0};
     536                 :            :     PyObject *argsbuf[3];
     537         [ +  + ]:        441 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
     538                 :            :     PyObject *certfile;
     539                 :        441 :     PyObject *keyfile = Py_None;
     540                 :        441 :     PyObject *password = Py_None;
     541                 :            : 
     542   [ +  +  +  -  :        441 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf);
             +  -  -  + ]
     543         [ +  + ]:        441 :     if (!args) {
     544                 :          1 :         goto exit;
     545                 :            :     }
     546                 :        440 :     certfile = args[0];
     547         [ +  + ]:        440 :     if (!noptargs) {
     548                 :        325 :         goto skip_optional_pos;
     549                 :            :     }
     550         [ +  + ]:        115 :     if (args[1]) {
     551                 :         99 :         keyfile = args[1];
     552         [ +  + ]:         99 :         if (!--noptargs) {
     553                 :         96 :             goto skip_optional_pos;
     554                 :            :         }
     555                 :            :     }
     556                 :         19 :     password = args[2];
     557                 :        440 : skip_optional_pos:
     558                 :        440 :     return_value = _ssl__SSLContext_load_cert_chain_impl(self, certfile, keyfile, password);
     559                 :            : 
     560                 :        441 : exit:
     561                 :        441 :     return return_value;
     562                 :            : }
     563                 :            : 
     564                 :            : PyDoc_STRVAR(_ssl__SSLContext_load_verify_locations__doc__,
     565                 :            : "load_verify_locations($self, /, cafile=None, capath=None, cadata=None)\n"
     566                 :            : "--\n"
     567                 :            : "\n");
     568                 :            : 
     569                 :            : #define _SSL__SSLCONTEXT_LOAD_VERIFY_LOCATIONS_METHODDEF    \
     570                 :            :     {"load_verify_locations", _PyCFunction_CAST(_ssl__SSLContext_load_verify_locations), METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext_load_verify_locations__doc__},
     571                 :            : 
     572                 :            : static PyObject *
     573                 :            : _ssl__SSLContext_load_verify_locations_impl(PySSLContext *self,
     574                 :            :                                             PyObject *cafile,
     575                 :            :                                             PyObject *capath,
     576                 :            :                                             PyObject *cadata);
     577                 :            : 
     578                 :            : static PyObject *
     579                 :        189 : _ssl__SSLContext_load_verify_locations(PySSLContext *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     580                 :            : {
     581                 :        189 :     PyObject *return_value = NULL;
     582                 :            :     static const char * const _keywords[] = {"cafile", "capath", "cadata", NULL};
     583                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "load_verify_locations", 0};
     584                 :            :     PyObject *argsbuf[3];
     585         [ +  + ]:        189 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
     586                 :        189 :     PyObject *cafile = Py_None;
     587                 :        189 :     PyObject *capath = Py_None;
     588                 :        189 :     PyObject *cadata = Py_None;
     589                 :            : 
     590   [ +  +  +  -  :        189 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 3, 0, argsbuf);
             +  -  -  + ]
     591         [ -  + ]:        189 :     if (!args) {
     592                 :          0 :         goto exit;
     593                 :            :     }
     594         [ +  + ]:        189 :     if (!noptargs) {
     595                 :          1 :         goto skip_optional_pos;
     596                 :            :     }
     597         [ +  + ]:        188 :     if (args[0]) {
     598                 :        169 :         cafile = args[0];
     599         [ +  + ]:        169 :         if (!--noptargs) {
     600                 :        150 :             goto skip_optional_pos;
     601                 :            :         }
     602                 :            :     }
     603         [ +  + ]:         38 :     if (args[1]) {
     604                 :         24 :         capath = args[1];
     605         [ +  + ]:         24 :         if (!--noptargs) {
     606                 :         10 :             goto skip_optional_pos;
     607                 :            :         }
     608                 :            :     }
     609                 :         28 :     cadata = args[2];
     610                 :        189 : skip_optional_pos:
     611                 :        189 :     return_value = _ssl__SSLContext_load_verify_locations_impl(self, cafile, capath, cadata);
     612                 :            : 
     613                 :        189 : exit:
     614                 :        189 :     return return_value;
     615                 :            : }
     616                 :            : 
     617                 :            : PyDoc_STRVAR(_ssl__SSLContext_load_dh_params__doc__,
     618                 :            : "load_dh_params($self, path, /)\n"
     619                 :            : "--\n"
     620                 :            : "\n");
     621                 :            : 
     622                 :            : #define _SSL__SSLCONTEXT_LOAD_DH_PARAMS_METHODDEF    \
     623                 :            :     {"load_dh_params", (PyCFunction)_ssl__SSLContext_load_dh_params, METH_O, _ssl__SSLContext_load_dh_params__doc__},
     624                 :            : 
     625                 :            : PyDoc_STRVAR(_ssl__SSLContext__wrap_socket__doc__,
     626                 :            : "_wrap_socket($self, /, sock, server_side, server_hostname=None, *,\n"
     627                 :            : "             owner=None, session=None)\n"
     628                 :            : "--\n"
     629                 :            : "\n");
     630                 :            : 
     631                 :            : #define _SSL__SSLCONTEXT__WRAP_SOCKET_METHODDEF    \
     632                 :            :     {"_wrap_socket", _PyCFunction_CAST(_ssl__SSLContext__wrap_socket), METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext__wrap_socket__doc__},
     633                 :            : 
     634                 :            : static PyObject *
     635                 :            : _ssl__SSLContext__wrap_socket_impl(PySSLContext *self, PyObject *sock,
     636                 :            :                                    int server_side, PyObject *hostname_obj,
     637                 :            :                                    PyObject *owner, PyObject *session);
     638                 :            : 
     639                 :            : static PyObject *
     640                 :        852 : _ssl__SSLContext__wrap_socket(PySSLContext *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     641                 :            : {
     642                 :        852 :     PyObject *return_value = NULL;
     643                 :            :     static const char * const _keywords[] = {"sock", "server_side", "server_hostname", "owner", "session", NULL};
     644                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "_wrap_socket", 0};
     645                 :            :     PyObject *argsbuf[5];
     646         [ +  - ]:        852 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
     647                 :            :     PyObject *sock;
     648                 :            :     int server_side;
     649                 :        852 :     PyObject *hostname_obj = Py_None;
     650                 :        852 :     PyObject *owner = Py_None;
     651                 :        852 :     PyObject *session = Py_None;
     652                 :            : 
     653   [ -  +  -  -  :        852 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf);
             -  -  -  - ]
     654         [ -  + ]:        852 :     if (!args) {
     655                 :          0 :         goto exit;
     656                 :            :     }
     657         [ -  + ]:        852 :     if (!PyObject_TypeCheck(args[0], get_state_ctx(self)->Sock_Type)) {
     658                 :          0 :         _PyArg_BadArgument("_wrap_socket", "argument 'sock'", (get_state_ctx(self)->Sock_Type)->tp_name, args[0]);
     659                 :          0 :         goto exit;
     660                 :            :     }
     661                 :        852 :     sock = args[0];
     662                 :        852 :     server_side = _PyLong_AsInt(args[1]);
     663   [ -  +  -  - ]:        852 :     if (server_side == -1 && PyErr_Occurred()) {
     664                 :          0 :         goto exit;
     665                 :            :     }
     666         [ -  + ]:        852 :     if (!noptargs) {
     667                 :          0 :         goto skip_optional_pos;
     668                 :            :     }
     669         [ -  + ]:        852 :     if (args[2]) {
     670                 :        852 :         hostname_obj = args[2];
     671         [ +  - ]:        852 :         if (!--noptargs) {
     672                 :          0 :             goto skip_optional_pos;
     673                 :            :         }
     674                 :            :     }
     675                 :        852 : skip_optional_pos:
     676         [ -  + ]:        852 :     if (!noptargs) {
     677                 :          0 :         goto skip_optional_kwonly;
     678                 :            :     }
     679         [ +  - ]:        852 :     if (args[3]) {
     680                 :        852 :         owner = args[3];
     681         [ -  + ]:        852 :         if (!--noptargs) {
     682                 :          0 :             goto skip_optional_kwonly;
     683                 :            :         }
     684                 :            :     }
     685                 :        852 :     session = args[4];
     686                 :        852 : skip_optional_kwonly:
     687                 :        852 :     return_value = _ssl__SSLContext__wrap_socket_impl(self, sock, server_side, hostname_obj, owner, session);
     688                 :            : 
     689                 :        852 : exit:
     690                 :        852 :     return return_value;
     691                 :            : }
     692                 :            : 
     693                 :            : PyDoc_STRVAR(_ssl__SSLContext__wrap_bio__doc__,
     694                 :            : "_wrap_bio($self, /, incoming, outgoing, server_side,\n"
     695                 :            : "          server_hostname=None, *, owner=None, session=None)\n"
     696                 :            : "--\n"
     697                 :            : "\n");
     698                 :            : 
     699                 :            : #define _SSL__SSLCONTEXT__WRAP_BIO_METHODDEF    \
     700                 :            :     {"_wrap_bio", _PyCFunction_CAST(_ssl__SSLContext__wrap_bio), METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext__wrap_bio__doc__},
     701                 :            : 
     702                 :            : static PyObject *
     703                 :            : _ssl__SSLContext__wrap_bio_impl(PySSLContext *self, PySSLMemoryBIO *incoming,
     704                 :            :                                 PySSLMemoryBIO *outgoing, int server_side,
     705                 :            :                                 PyObject *hostname_obj, PyObject *owner,
     706                 :            :                                 PyObject *session);
     707                 :            : 
     708                 :            : static PyObject *
     709                 :        307 : _ssl__SSLContext__wrap_bio(PySSLContext *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     710                 :            : {
     711                 :        307 :     PyObject *return_value = NULL;
     712                 :            :     static const char * const _keywords[] = {"incoming", "outgoing", "server_side", "server_hostname", "owner", "session", NULL};
     713                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "_wrap_bio", 0};
     714                 :            :     PyObject *argsbuf[6];
     715         [ +  - ]:        307 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3;
     716                 :            :     PySSLMemoryBIO *incoming;
     717                 :            :     PySSLMemoryBIO *outgoing;
     718                 :            :     int server_side;
     719                 :        307 :     PyObject *hostname_obj = Py_None;
     720                 :        307 :     PyObject *owner = Py_None;
     721                 :        307 :     PyObject *session = Py_None;
     722                 :            : 
     723   [ -  +  -  -  :        307 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 4, 0, argsbuf);
             -  -  -  - ]
     724         [ -  + ]:        307 :     if (!args) {
     725                 :          0 :         goto exit;
     726                 :            :     }
     727         [ -  + ]:        307 :     if (!PyObject_TypeCheck(args[0], get_state_ctx(self)->PySSLMemoryBIO_Type)) {
     728                 :          0 :         _PyArg_BadArgument("_wrap_bio", "argument 'incoming'", (get_state_ctx(self)->PySSLMemoryBIO_Type)->tp_name, args[0]);
     729                 :          0 :         goto exit;
     730                 :            :     }
     731                 :        307 :     incoming = (PySSLMemoryBIO *)args[0];
     732         [ -  + ]:        307 :     if (!PyObject_TypeCheck(args[1], get_state_ctx(self)->PySSLMemoryBIO_Type)) {
     733                 :          0 :         _PyArg_BadArgument("_wrap_bio", "argument 'outgoing'", (get_state_ctx(self)->PySSLMemoryBIO_Type)->tp_name, args[1]);
     734                 :          0 :         goto exit;
     735                 :            :     }
     736                 :        307 :     outgoing = (PySSLMemoryBIO *)args[1];
     737                 :        307 :     server_side = _PyLong_AsInt(args[2]);
     738   [ -  +  -  - ]:        307 :     if (server_side == -1 && PyErr_Occurred()) {
     739                 :          0 :         goto exit;
     740                 :            :     }
     741         [ -  + ]:        307 :     if (!noptargs) {
     742                 :          0 :         goto skip_optional_pos;
     743                 :            :     }
     744         [ -  + ]:        307 :     if (args[3]) {
     745                 :        307 :         hostname_obj = args[3];
     746         [ +  - ]:        307 :         if (!--noptargs) {
     747                 :          0 :             goto skip_optional_pos;
     748                 :            :         }
     749                 :            :     }
     750                 :        307 : skip_optional_pos:
     751         [ -  + ]:        307 :     if (!noptargs) {
     752                 :          0 :         goto skip_optional_kwonly;
     753                 :            :     }
     754         [ +  - ]:        307 :     if (args[4]) {
     755                 :        307 :         owner = args[4];
     756         [ -  + ]:        307 :         if (!--noptargs) {
     757                 :          0 :             goto skip_optional_kwonly;
     758                 :            :         }
     759                 :            :     }
     760                 :        307 :     session = args[5];
     761                 :        307 : skip_optional_kwonly:
     762                 :        307 :     return_value = _ssl__SSLContext__wrap_bio_impl(self, incoming, outgoing, server_side, hostname_obj, owner, session);
     763                 :            : 
     764                 :        307 : exit:
     765                 :        307 :     return return_value;
     766                 :            : }
     767                 :            : 
     768                 :            : PyDoc_STRVAR(_ssl__SSLContext_session_stats__doc__,
     769                 :            : "session_stats($self, /)\n"
     770                 :            : "--\n"
     771                 :            : "\n");
     772                 :            : 
     773                 :            : #define _SSL__SSLCONTEXT_SESSION_STATS_METHODDEF    \
     774                 :            :     {"session_stats", (PyCFunction)_ssl__SSLContext_session_stats, METH_NOARGS, _ssl__SSLContext_session_stats__doc__},
     775                 :            : 
     776                 :            : static PyObject *
     777                 :            : _ssl__SSLContext_session_stats_impl(PySSLContext *self);
     778                 :            : 
     779                 :            : static PyObject *
     780                 :          6 : _ssl__SSLContext_session_stats(PySSLContext *self, PyObject *Py_UNUSED(ignored))
     781                 :            : {
     782                 :          6 :     return _ssl__SSLContext_session_stats_impl(self);
     783                 :            : }
     784                 :            : 
     785                 :            : PyDoc_STRVAR(_ssl__SSLContext_set_default_verify_paths__doc__,
     786                 :            : "set_default_verify_paths($self, /)\n"
     787                 :            : "--\n"
     788                 :            : "\n");
     789                 :            : 
     790                 :            : #define _SSL__SSLCONTEXT_SET_DEFAULT_VERIFY_PATHS_METHODDEF    \
     791                 :            :     {"set_default_verify_paths", (PyCFunction)_ssl__SSLContext_set_default_verify_paths, METH_NOARGS, _ssl__SSLContext_set_default_verify_paths__doc__},
     792                 :            : 
     793                 :            : static PyObject *
     794                 :            : _ssl__SSLContext_set_default_verify_paths_impl(PySSLContext *self);
     795                 :            : 
     796                 :            : static PyObject *
     797                 :        133 : _ssl__SSLContext_set_default_verify_paths(PySSLContext *self, PyObject *Py_UNUSED(ignored))
     798                 :            : {
     799                 :        133 :     return _ssl__SSLContext_set_default_verify_paths_impl(self);
     800                 :            : }
     801                 :            : 
     802                 :            : PyDoc_STRVAR(_ssl__SSLContext_set_ecdh_curve__doc__,
     803                 :            : "set_ecdh_curve($self, name, /)\n"
     804                 :            : "--\n"
     805                 :            : "\n");
     806                 :            : 
     807                 :            : #define _SSL__SSLCONTEXT_SET_ECDH_CURVE_METHODDEF    \
     808                 :            :     {"set_ecdh_curve", (PyCFunction)_ssl__SSLContext_set_ecdh_curve, METH_O, _ssl__SSLContext_set_ecdh_curve__doc__},
     809                 :            : 
     810                 :            : PyDoc_STRVAR(_ssl__SSLContext_cert_store_stats__doc__,
     811                 :            : "cert_store_stats($self, /)\n"
     812                 :            : "--\n"
     813                 :            : "\n"
     814                 :            : "Returns quantities of loaded X.509 certificates.\n"
     815                 :            : "\n"
     816                 :            : "X.509 certificates with a CA extension and certificate revocation lists\n"
     817                 :            : "inside the context\'s cert store.\n"
     818                 :            : "\n"
     819                 :            : "NOTE: Certificates in a capath directory aren\'t loaded unless they have\n"
     820                 :            : "been used at least once.");
     821                 :            : 
     822                 :            : #define _SSL__SSLCONTEXT_CERT_STORE_STATS_METHODDEF    \
     823                 :            :     {"cert_store_stats", (PyCFunction)_ssl__SSLContext_cert_store_stats, METH_NOARGS, _ssl__SSLContext_cert_store_stats__doc__},
     824                 :            : 
     825                 :            : static PyObject *
     826                 :            : _ssl__SSLContext_cert_store_stats_impl(PySSLContext *self);
     827                 :            : 
     828                 :            : static PyObject *
     829                 :         14 : _ssl__SSLContext_cert_store_stats(PySSLContext *self, PyObject *Py_UNUSED(ignored))
     830                 :            : {
     831                 :         14 :     return _ssl__SSLContext_cert_store_stats_impl(self);
     832                 :            : }
     833                 :            : 
     834                 :            : PyDoc_STRVAR(_ssl__SSLContext_get_ca_certs__doc__,
     835                 :            : "get_ca_certs($self, /, binary_form=False)\n"
     836                 :            : "--\n"
     837                 :            : "\n"
     838                 :            : "Returns a list of dicts with information of loaded CA certs.\n"
     839                 :            : "\n"
     840                 :            : "If the optional argument is True, returns a DER-encoded copy of the CA\n"
     841                 :            : "certificate.\n"
     842                 :            : "\n"
     843                 :            : "NOTE: Certificates in a capath directory aren\'t loaded unless they have\n"
     844                 :            : "been used at least once.");
     845                 :            : 
     846                 :            : #define _SSL__SSLCONTEXT_GET_CA_CERTS_METHODDEF    \
     847                 :            :     {"get_ca_certs", _PyCFunction_CAST(_ssl__SSLContext_get_ca_certs), METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext_get_ca_certs__doc__},
     848                 :            : 
     849                 :            : static PyObject *
     850                 :            : _ssl__SSLContext_get_ca_certs_impl(PySSLContext *self, int binary_form);
     851                 :            : 
     852                 :            : static PyObject *
     853                 :          6 : _ssl__SSLContext_get_ca_certs(PySSLContext *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
     854                 :            : {
     855                 :          6 :     PyObject *return_value = NULL;
     856                 :            :     static const char * const _keywords[] = {"binary_form", NULL};
     857                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "get_ca_certs", 0};
     858                 :            :     PyObject *argsbuf[1];
     859         [ -  + ]:          6 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
     860                 :          6 :     int binary_form = 0;
     861                 :            : 
     862   [ +  -  +  -  :          6 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
             +  -  -  + ]
     863         [ -  + ]:          6 :     if (!args) {
     864                 :          0 :         goto exit;
     865                 :            :     }
     866         [ +  + ]:          6 :     if (!noptargs) {
     867                 :          5 :         goto skip_optional_pos;
     868                 :            :     }
     869                 :          1 :     binary_form = PyObject_IsTrue(args[0]);
     870         [ -  + ]:          1 :     if (binary_form < 0) {
     871                 :          0 :         goto exit;
     872                 :            :     }
     873                 :          1 : skip_optional_pos:
     874                 :          6 :     return_value = _ssl__SSLContext_get_ca_certs_impl(self, binary_form);
     875                 :            : 
     876                 :          6 : exit:
     877                 :          6 :     return return_value;
     878                 :            : }
     879                 :            : 
     880                 :            : static PyObject *
     881                 :            : _ssl_MemoryBIO_impl(PyTypeObject *type);
     882                 :            : 
     883                 :            : static PyObject *
     884                 :        622 : _ssl_MemoryBIO(PyTypeObject *type, PyObject *args, PyObject *kwargs)
     885                 :            : {
     886                 :        622 :     PyObject *return_value = NULL;
     887                 :            : 
     888         [ -  + ]:        622 :     if ((type == get_state_type(type)->PySSLMemoryBIO_Type ||
     889   [ -  -  +  - ]:        622 :          type->tp_init == get_state_type(type)->PySSLMemoryBIO_Type->tp_init) &&
     890         [ -  + ]:        622 :         !_PyArg_NoPositional("MemoryBIO", args)) {
     891                 :          0 :         goto exit;
     892                 :            :     }
     893         [ -  + ]:        622 :     if ((type == get_state_type(type)->PySSLMemoryBIO_Type ||
     894   [ -  -  -  + ]:        622 :          type->tp_init == get_state_type(type)->PySSLMemoryBIO_Type->tp_init) &&
     895         [ #  # ]:          0 :         !_PyArg_NoKeywords("MemoryBIO", kwargs)) {
     896                 :          0 :         goto exit;
     897                 :            :     }
     898                 :        622 :     return_value = _ssl_MemoryBIO_impl(type);
     899                 :            : 
     900                 :        622 : exit:
     901                 :        622 :     return return_value;
     902                 :            : }
     903                 :            : 
     904                 :            : PyDoc_STRVAR(_ssl_MemoryBIO_read__doc__,
     905                 :            : "read($self, size=-1, /)\n"
     906                 :            : "--\n"
     907                 :            : "\n"
     908                 :            : "Read up to size bytes from the memory BIO.\n"
     909                 :            : "\n"
     910                 :            : "If size is not specified, read the entire buffer.\n"
     911                 :            : "If the return value is an empty bytes instance, this means either\n"
     912                 :            : "EOF or that no data is available. Use the \"eof\" property to\n"
     913                 :            : "distinguish between the two.");
     914                 :            : 
     915                 :            : #define _SSL_MEMORYBIO_READ_METHODDEF    \
     916                 :            :     {"read", _PyCFunction_CAST(_ssl_MemoryBIO_read), METH_FASTCALL, _ssl_MemoryBIO_read__doc__},
     917                 :            : 
     918                 :            : static PyObject *
     919                 :            : _ssl_MemoryBIO_read_impl(PySSLMemoryBIO *self, int len);
     920                 :            : 
     921                 :            : static PyObject *
     922                 :       4847 : _ssl_MemoryBIO_read(PySSLMemoryBIO *self, PyObject *const *args, Py_ssize_t nargs)
     923                 :            : {
     924                 :       4847 :     PyObject *return_value = NULL;
     925                 :       4847 :     int len = -1;
     926                 :            : 
     927   [ +  -  -  +  :       4847 :     if (!_PyArg_CheckPositional("read", nargs, 0, 1)) {
                   -  - ]
     928                 :          0 :         goto exit;
     929                 :            :     }
     930         [ +  + ]:       4847 :     if (nargs < 1) {
     931                 :       4839 :         goto skip_optional;
     932                 :            :     }
     933                 :          8 :     len = _PyLong_AsInt(args[0]);
     934   [ -  +  -  - ]:          8 :     if (len == -1 && PyErr_Occurred()) {
     935                 :          0 :         goto exit;
     936                 :            :     }
     937                 :          8 : skip_optional:
     938                 :       4847 :     return_value = _ssl_MemoryBIO_read_impl(self, len);
     939                 :            : 
     940                 :       4847 : exit:
     941                 :       4847 :     return return_value;
     942                 :            : }
     943                 :            : 
     944                 :            : PyDoc_STRVAR(_ssl_MemoryBIO_write__doc__,
     945                 :            : "write($self, b, /)\n"
     946                 :            : "--\n"
     947                 :            : "\n"
     948                 :            : "Writes the bytes b into the memory BIO.\n"
     949                 :            : "\n"
     950                 :            : "Returns the number of bytes written.");
     951                 :            : 
     952                 :            : #define _SSL_MEMORYBIO_WRITE_METHODDEF    \
     953                 :            :     {"write", (PyCFunction)_ssl_MemoryBIO_write, METH_O, _ssl_MemoryBIO_write__doc__},
     954                 :            : 
     955                 :            : static PyObject *
     956                 :            : _ssl_MemoryBIO_write_impl(PySSLMemoryBIO *self, Py_buffer *b);
     957                 :            : 
     958                 :            : static PyObject *
     959                 :       3201 : _ssl_MemoryBIO_write(PySSLMemoryBIO *self, PyObject *arg)
     960                 :            : {
     961                 :       3201 :     PyObject *return_value = NULL;
     962                 :       3201 :     Py_buffer b = {NULL, NULL};
     963                 :            : 
     964         [ +  + ]:       3201 :     if (PyObject_GetBuffer(arg, &b, PyBUF_SIMPLE) != 0) {
     965                 :          4 :         goto exit;
     966                 :            :     }
     967         [ -  + ]:       3197 :     if (!PyBuffer_IsContiguous(&b, 'C')) {
     968                 :          0 :         _PyArg_BadArgument("write", "argument", "contiguous buffer", arg);
     969                 :          0 :         goto exit;
     970                 :            :     }
     971                 :       3197 :     return_value = _ssl_MemoryBIO_write_impl(self, &b);
     972                 :            : 
     973                 :       3201 : exit:
     974                 :            :     /* Cleanup for b */
     975         [ +  + ]:       3201 :     if (b.obj) {
     976                 :       3197 :        PyBuffer_Release(&b);
     977                 :            :     }
     978                 :            : 
     979                 :       3201 :     return return_value;
     980                 :            : }
     981                 :            : 
     982                 :            : PyDoc_STRVAR(_ssl_MemoryBIO_write_eof__doc__,
     983                 :            : "write_eof($self, /)\n"
     984                 :            : "--\n"
     985                 :            : "\n"
     986                 :            : "Write an EOF marker to the memory BIO.\n"
     987                 :            : "\n"
     988                 :            : "When all data has been read, the \"eof\" property will be True.");
     989                 :            : 
     990                 :            : #define _SSL_MEMORYBIO_WRITE_EOF_METHODDEF    \
     991                 :            :     {"write_eof", (PyCFunction)_ssl_MemoryBIO_write_eof, METH_NOARGS, _ssl_MemoryBIO_write_eof__doc__},
     992                 :            : 
     993                 :            : static PyObject *
     994                 :            : _ssl_MemoryBIO_write_eof_impl(PySSLMemoryBIO *self);
     995                 :            : 
     996                 :            : static PyObject *
     997                 :          1 : _ssl_MemoryBIO_write_eof(PySSLMemoryBIO *self, PyObject *Py_UNUSED(ignored))
     998                 :            : {
     999                 :          1 :     return _ssl_MemoryBIO_write_eof_impl(self);
    1000                 :            : }
    1001                 :            : 
    1002                 :            : PyDoc_STRVAR(_ssl_RAND_add__doc__,
    1003                 :            : "RAND_add($module, string, entropy, /)\n"
    1004                 :            : "--\n"
    1005                 :            : "\n"
    1006                 :            : "Mix string into the OpenSSL PRNG state.\n"
    1007                 :            : "\n"
    1008                 :            : "entropy (a float) is a lower bound on the entropy contained in\n"
    1009                 :            : "string.  See RFC 4086.");
    1010                 :            : 
    1011                 :            : #define _SSL_RAND_ADD_METHODDEF    \
    1012                 :            :     {"RAND_add", _PyCFunction_CAST(_ssl_RAND_add), METH_FASTCALL, _ssl_RAND_add__doc__},
    1013                 :            : 
    1014                 :            : static PyObject *
    1015                 :            : _ssl_RAND_add_impl(PyObject *module, Py_buffer *view, double entropy);
    1016                 :            : 
    1017                 :            : static PyObject *
    1018                 :          3 : _ssl_RAND_add(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
    1019                 :            : {
    1020                 :          3 :     PyObject *return_value = NULL;
    1021                 :          3 :     Py_buffer view = {NULL, NULL};
    1022                 :            :     double entropy;
    1023                 :            : 
    1024   [ +  -  -  +  :          3 :     if (!_PyArg_CheckPositional("RAND_add", nargs, 2, 2)) {
                   -  - ]
    1025                 :          0 :         goto exit;
    1026                 :            :     }
    1027         [ +  + ]:          3 :     if (PyUnicode_Check(args[0])) {
    1028                 :            :         Py_ssize_t len;
    1029                 :          1 :         const char *ptr = PyUnicode_AsUTF8AndSize(args[0], &len);
    1030         [ -  + ]:          1 :         if (ptr == NULL) {
    1031                 :          0 :             goto exit;
    1032                 :            :         }
    1033                 :          1 :         PyBuffer_FillInfo(&view, args[0], (void *)ptr, len, 1, 0);
    1034                 :            :     }
    1035                 :            :     else { /* any bytes-like object */
    1036         [ -  + ]:          2 :         if (PyObject_GetBuffer(args[0], &view, PyBUF_SIMPLE) != 0) {
    1037                 :          0 :             goto exit;
    1038                 :            :         }
    1039         [ -  + ]:          2 :         if (!PyBuffer_IsContiguous(&view, 'C')) {
    1040                 :          0 :             _PyArg_BadArgument("RAND_add", "argument 1", "contiguous buffer", args[0]);
    1041                 :          0 :             goto exit;
    1042                 :            :         }
    1043                 :            :     }
    1044         [ +  - ]:          3 :     if (PyFloat_CheckExact(args[1])) {
    1045                 :          3 :         entropy = PyFloat_AS_DOUBLE(args[1]);
    1046                 :            :     }
    1047                 :            :     else
    1048                 :            :     {
    1049                 :          0 :         entropy = PyFloat_AsDouble(args[1]);
    1050   [ #  #  #  # ]:          0 :         if (entropy == -1.0 && PyErr_Occurred()) {
    1051                 :          0 :             goto exit;
    1052                 :            :         }
    1053                 :            :     }
    1054                 :          3 :     return_value = _ssl_RAND_add_impl(module, &view, entropy);
    1055                 :            : 
    1056                 :          3 : exit:
    1057                 :            :     /* Cleanup for view */
    1058         [ +  - ]:          3 :     if (view.obj) {
    1059                 :          3 :        PyBuffer_Release(&view);
    1060                 :            :     }
    1061                 :            : 
    1062                 :          3 :     return return_value;
    1063                 :            : }
    1064                 :            : 
    1065                 :            : PyDoc_STRVAR(_ssl_RAND_bytes__doc__,
    1066                 :            : "RAND_bytes($module, n, /)\n"
    1067                 :            : "--\n"
    1068                 :            : "\n"
    1069                 :            : "Generate n cryptographically strong pseudo-random bytes.");
    1070                 :            : 
    1071                 :            : #define _SSL_RAND_BYTES_METHODDEF    \
    1072                 :            :     {"RAND_bytes", (PyCFunction)_ssl_RAND_bytes, METH_O, _ssl_RAND_bytes__doc__},
    1073                 :            : 
    1074                 :            : static PyObject *
    1075                 :            : _ssl_RAND_bytes_impl(PyObject *module, int n);
    1076                 :            : 
    1077                 :            : static PyObject *
    1078                 :          2 : _ssl_RAND_bytes(PyObject *module, PyObject *arg)
    1079                 :            : {
    1080                 :          2 :     PyObject *return_value = NULL;
    1081                 :            :     int n;
    1082                 :            : 
    1083                 :          2 :     n = _PyLong_AsInt(arg);
    1084   [ -  +  -  - ]:          2 :     if (n == -1 && PyErr_Occurred()) {
    1085                 :          0 :         goto exit;
    1086                 :            :     }
    1087                 :          2 :     return_value = _ssl_RAND_bytes_impl(module, n);
    1088                 :            : 
    1089                 :          2 : exit:
    1090                 :          2 :     return return_value;
    1091                 :            : }
    1092                 :            : 
    1093                 :            : PyDoc_STRVAR(_ssl_RAND_status__doc__,
    1094                 :            : "RAND_status($module, /)\n"
    1095                 :            : "--\n"
    1096                 :            : "\n"
    1097                 :            : "Returns True if the OpenSSL PRNG has been seeded with enough data and False if not.\n"
    1098                 :            : "\n"
    1099                 :            : "It is necessary to seed the PRNG with RAND_add() on some platforms before\n"
    1100                 :            : "using the ssl() function.");
    1101                 :            : 
    1102                 :            : #define _SSL_RAND_STATUS_METHODDEF    \
    1103                 :            :     {"RAND_status", (PyCFunction)_ssl_RAND_status, METH_NOARGS, _ssl_RAND_status__doc__},
    1104                 :            : 
    1105                 :            : static PyObject *
    1106                 :            : _ssl_RAND_status_impl(PyObject *module);
    1107                 :            : 
    1108                 :            : static PyObject *
    1109                 :          1 : _ssl_RAND_status(PyObject *module, PyObject *Py_UNUSED(ignored))
    1110                 :            : {
    1111                 :          1 :     return _ssl_RAND_status_impl(module);
    1112                 :            : }
    1113                 :            : 
    1114                 :            : PyDoc_STRVAR(_ssl_get_default_verify_paths__doc__,
    1115                 :            : "get_default_verify_paths($module, /)\n"
    1116                 :            : "--\n"
    1117                 :            : "\n"
    1118                 :            : "Return search paths and environment vars that are used by SSLContext\'s set_default_verify_paths() to load default CAs.\n"
    1119                 :            : "\n"
    1120                 :            : "The values are \'cert_file_env\', \'cert_file\', \'cert_dir_env\', \'cert_dir\'.");
    1121                 :            : 
    1122                 :            : #define _SSL_GET_DEFAULT_VERIFY_PATHS_METHODDEF    \
    1123                 :            :     {"get_default_verify_paths", (PyCFunction)_ssl_get_default_verify_paths, METH_NOARGS, _ssl_get_default_verify_paths__doc__},
    1124                 :            : 
    1125                 :            : static PyObject *
    1126                 :            : _ssl_get_default_verify_paths_impl(PyObject *module);
    1127                 :            : 
    1128                 :            : static PyObject *
    1129                 :          2 : _ssl_get_default_verify_paths(PyObject *module, PyObject *Py_UNUSED(ignored))
    1130                 :            : {
    1131                 :          2 :     return _ssl_get_default_verify_paths_impl(module);
    1132                 :            : }
    1133                 :            : 
    1134                 :            : PyDoc_STRVAR(_ssl_txt2obj__doc__,
    1135                 :            : "txt2obj($module, /, txt, name=False)\n"
    1136                 :            : "--\n"
    1137                 :            : "\n"
    1138                 :            : "Lookup NID, short name, long name and OID of an ASN1_OBJECT.\n"
    1139                 :            : "\n"
    1140                 :            : "By default objects are looked up by OID. With name=True short and\n"
    1141                 :            : "long name are also matched.");
    1142                 :            : 
    1143                 :            : #define _SSL_TXT2OBJ_METHODDEF    \
    1144                 :            :     {"txt2obj", _PyCFunction_CAST(_ssl_txt2obj), METH_FASTCALL|METH_KEYWORDS, _ssl_txt2obj__doc__},
    1145                 :            : 
    1146                 :            : static PyObject *
    1147                 :            : _ssl_txt2obj_impl(PyObject *module, const char *txt, int name);
    1148                 :            : 
    1149                 :            : static PyObject *
    1150                 :       1732 : _ssl_txt2obj(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
    1151                 :            : {
    1152                 :       1732 :     PyObject *return_value = NULL;
    1153                 :            :     static const char * const _keywords[] = {"txt", "name", NULL};
    1154                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "txt2obj", 0};
    1155                 :            :     PyObject *argsbuf[2];
    1156         [ +  - ]:       1732 :     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
    1157                 :            :     const char *txt;
    1158                 :       1732 :     int name = 0;
    1159                 :            : 
    1160   [ -  +  -  -  :       1732 :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
             -  -  -  - ]
    1161         [ -  + ]:       1732 :     if (!args) {
    1162                 :          0 :         goto exit;
    1163                 :            :     }
    1164         [ -  + ]:       1732 :     if (!PyUnicode_Check(args[0])) {
    1165                 :          0 :         _PyArg_BadArgument("txt2obj", "argument 'txt'", "str", args[0]);
    1166                 :          0 :         goto exit;
    1167                 :            :     }
    1168                 :            :     Py_ssize_t txt_length;
    1169                 :       1732 :     txt = PyUnicode_AsUTF8AndSize(args[0], &txt_length);
    1170         [ -  + ]:       1732 :     if (txt == NULL) {
    1171                 :          0 :         goto exit;
    1172                 :            :     }
    1173         [ -  + ]:       1732 :     if (strlen(txt) != (size_t)txt_length) {
    1174                 :          0 :         PyErr_SetString(PyExc_ValueError, "embedded null character");
    1175                 :          0 :         goto exit;
    1176                 :            :     }
    1177         [ -  + ]:       1732 :     if (!noptargs) {
    1178                 :          0 :         goto skip_optional_pos;
    1179                 :            :     }
    1180                 :       1732 :     name = PyObject_IsTrue(args[1]);
    1181         [ -  + ]:       1732 :     if (name < 0) {
    1182                 :          0 :         goto exit;
    1183                 :            :     }
    1184                 :       1732 : skip_optional_pos:
    1185                 :       1732 :     return_value = _ssl_txt2obj_impl(module, txt, name);
    1186                 :            : 
    1187                 :       1732 : exit:
    1188                 :       1732 :     return return_value;
    1189                 :            : }
    1190                 :            : 
    1191                 :            : PyDoc_STRVAR(_ssl_nid2obj__doc__,
    1192                 :            : "nid2obj($module, nid, /)\n"
    1193                 :            : "--\n"
    1194                 :            : "\n"
    1195                 :            : "Lookup NID, short name, long name and OID of an ASN1_OBJECT by NID.");
    1196                 :            : 
    1197                 :            : #define _SSL_NID2OBJ_METHODDEF    \
    1198                 :            :     {"nid2obj", (PyCFunction)_ssl_nid2obj, METH_O, _ssl_nid2obj__doc__},
    1199                 :            : 
    1200                 :            : static PyObject *
    1201                 :            : _ssl_nid2obj_impl(PyObject *module, int nid);
    1202                 :            : 
    1203                 :            : static PyObject *
    1204                 :       1003 : _ssl_nid2obj(PyObject *module, PyObject *arg)
    1205                 :            : {
    1206                 :       1003 :     PyObject *return_value = NULL;
    1207                 :            :     int nid;
    1208                 :            : 
    1209                 :       1003 :     nid = _PyLong_AsInt(arg);
    1210   [ +  +  -  + ]:       1003 :     if (nid == -1 && PyErr_Occurred()) {
    1211                 :          0 :         goto exit;
    1212                 :            :     }
    1213                 :       1003 :     return_value = _ssl_nid2obj_impl(module, nid);
    1214                 :            : 
    1215                 :       1003 : exit:
    1216                 :       1003 :     return return_value;
    1217                 :            : }
    1218                 :            : 
    1219                 :            : #if defined(_MSC_VER)
    1220                 :            : 
    1221                 :            : PyDoc_STRVAR(_ssl_enum_certificates__doc__,
    1222                 :            : "enum_certificates($module, /, store_name)\n"
    1223                 :            : "--\n"
    1224                 :            : "\n"
    1225                 :            : "Retrieve certificates from Windows\' cert store.\n"
    1226                 :            : "\n"
    1227                 :            : "store_name may be one of \'CA\', \'ROOT\' or \'MY\'.  The system may provide\n"
    1228                 :            : "more cert storages, too.  The function returns a list of (bytes,\n"
    1229                 :            : "encoding_type, trust) tuples.  The encoding_type flag can be interpreted\n"
    1230                 :            : "with X509_ASN_ENCODING or PKCS_7_ASN_ENCODING. The trust setting is either\n"
    1231                 :            : "a set of OIDs or the boolean True.");
    1232                 :            : 
    1233                 :            : #define _SSL_ENUM_CERTIFICATES_METHODDEF    \
    1234                 :            :     {"enum_certificates", _PyCFunction_CAST(_ssl_enum_certificates), METH_FASTCALL|METH_KEYWORDS, _ssl_enum_certificates__doc__},
    1235                 :            : 
    1236                 :            : static PyObject *
    1237                 :            : _ssl_enum_certificates_impl(PyObject *module, const char *store_name);
    1238                 :            : 
    1239                 :            : static PyObject *
    1240                 :            : _ssl_enum_certificates(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
    1241                 :            : {
    1242                 :            :     PyObject *return_value = NULL;
    1243                 :            :     static const char * const _keywords[] = {"store_name", NULL};
    1244                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "enum_certificates", 0};
    1245                 :            :     PyObject *argsbuf[1];
    1246                 :            :     const char *store_name;
    1247                 :            : 
    1248                 :            :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
    1249                 :            :     if (!args) {
    1250                 :            :         goto exit;
    1251                 :            :     }
    1252                 :            :     if (!PyUnicode_Check(args[0])) {
    1253                 :            :         _PyArg_BadArgument("enum_certificates", "argument 'store_name'", "str", args[0]);
    1254                 :            :         goto exit;
    1255                 :            :     }
    1256                 :            :     Py_ssize_t store_name_length;
    1257                 :            :     store_name = PyUnicode_AsUTF8AndSize(args[0], &store_name_length);
    1258                 :            :     if (store_name == NULL) {
    1259                 :            :         goto exit;
    1260                 :            :     }
    1261                 :            :     if (strlen(store_name) != (size_t)store_name_length) {
    1262                 :            :         PyErr_SetString(PyExc_ValueError, "embedded null character");
    1263                 :            :         goto exit;
    1264                 :            :     }
    1265                 :            :     return_value = _ssl_enum_certificates_impl(module, store_name);
    1266                 :            : 
    1267                 :            : exit:
    1268                 :            :     return return_value;
    1269                 :            : }
    1270                 :            : 
    1271                 :            : #endif /* defined(_MSC_VER) */
    1272                 :            : 
    1273                 :            : #if defined(_MSC_VER)
    1274                 :            : 
    1275                 :            : PyDoc_STRVAR(_ssl_enum_crls__doc__,
    1276                 :            : "enum_crls($module, /, store_name)\n"
    1277                 :            : "--\n"
    1278                 :            : "\n"
    1279                 :            : "Retrieve CRLs from Windows\' cert store.\n"
    1280                 :            : "\n"
    1281                 :            : "store_name may be one of \'CA\', \'ROOT\' or \'MY\'.  The system may provide\n"
    1282                 :            : "more cert storages, too.  The function returns a list of (bytes,\n"
    1283                 :            : "encoding_type) tuples.  The encoding_type flag can be interpreted with\n"
    1284                 :            : "X509_ASN_ENCODING or PKCS_7_ASN_ENCODING.");
    1285                 :            : 
    1286                 :            : #define _SSL_ENUM_CRLS_METHODDEF    \
    1287                 :            :     {"enum_crls", _PyCFunction_CAST(_ssl_enum_crls), METH_FASTCALL|METH_KEYWORDS, _ssl_enum_crls__doc__},
    1288                 :            : 
    1289                 :            : static PyObject *
    1290                 :            : _ssl_enum_crls_impl(PyObject *module, const char *store_name);
    1291                 :            : 
    1292                 :            : static PyObject *
    1293                 :            : _ssl_enum_crls(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
    1294                 :            : {
    1295                 :            :     PyObject *return_value = NULL;
    1296                 :            :     static const char * const _keywords[] = {"store_name", NULL};
    1297                 :            :     static _PyArg_Parser _parser = {NULL, _keywords, "enum_crls", 0};
    1298                 :            :     PyObject *argsbuf[1];
    1299                 :            :     const char *store_name;
    1300                 :            : 
    1301                 :            :     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
    1302                 :            :     if (!args) {
    1303                 :            :         goto exit;
    1304                 :            :     }
    1305                 :            :     if (!PyUnicode_Check(args[0])) {
    1306                 :            :         _PyArg_BadArgument("enum_crls", "argument 'store_name'", "str", args[0]);
    1307                 :            :         goto exit;
    1308                 :            :     }
    1309                 :            :     Py_ssize_t store_name_length;
    1310                 :            :     store_name = PyUnicode_AsUTF8AndSize(args[0], &store_name_length);
    1311                 :            :     if (store_name == NULL) {
    1312                 :            :         goto exit;
    1313                 :            :     }
    1314                 :            :     if (strlen(store_name) != (size_t)store_name_length) {
    1315                 :            :         PyErr_SetString(PyExc_ValueError, "embedded null character");
    1316                 :            :         goto exit;
    1317                 :            :     }
    1318                 :            :     return_value = _ssl_enum_crls_impl(module, store_name);
    1319                 :            : 
    1320                 :            : exit:
    1321                 :            :     return return_value;
    1322                 :            : }
    1323                 :            : 
    1324                 :            : #endif /* defined(_MSC_VER) */
    1325                 :            : 
    1326                 :            : #ifndef _SSL_ENUM_CERTIFICATES_METHODDEF
    1327                 :            :     #define _SSL_ENUM_CERTIFICATES_METHODDEF
    1328                 :            : #endif /* !defined(_SSL_ENUM_CERTIFICATES_METHODDEF) */
    1329                 :            : 
    1330                 :            : #ifndef _SSL_ENUM_CRLS_METHODDEF
    1331                 :            :     #define _SSL_ENUM_CRLS_METHODDEF
    1332                 :            : #endif /* !defined(_SSL_ENUM_CRLS_METHODDEF) */
    1333                 :            : /*[clinic end generated code: output=9d806f8ff4a06ed3 input=a9049054013a1b77]*/

Generated by: LCOV version 1.14