• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 *
_ssl__SSLSocket_do_handshake(PySSLSocket * self,PyObject * Py_UNUSED (ignored))17 _ssl__SSLSocket_do_handshake(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
18 {
19     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 *
_ssl__test_decode_cert(PyObject * module,PyObject * arg)34 _ssl__test_decode_cert(PyObject *module, PyObject *arg)
35 {
36     PyObject *return_value = NULL;
37     PyObject *path;
38 
39     if (!PyUnicode_FSConverter(arg, &path)) {
40         goto exit;
41     }
42     return_value = _ssl__test_decode_cert_impl(module, path);
43 
44 exit:
45     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)(void(*)(void))_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 *
_ssl__SSLSocket_getpeercert(PySSLSocket * self,PyObject * const * args,Py_ssize_t nargs)69 _ssl__SSLSocket_getpeercert(PySSLSocket *self, PyObject *const *args, Py_ssize_t nargs)
70 {
71     PyObject *return_value = NULL;
72     int binary_mode = 0;
73 
74     if (!_PyArg_CheckPositional("getpeercert", nargs, 0, 1)) {
75         goto exit;
76     }
77     if (nargs < 1) {
78         goto skip_optional;
79     }
80     binary_mode = PyObject_IsTrue(args[0]);
81     if (binary_mode < 0) {
82         goto exit;
83     }
84 skip_optional:
85     return_value = _ssl__SSLSocket_getpeercert_impl(self, binary_mode);
86 
87 exit:
88     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 *
_ssl__SSLSocket_get_verified_chain(PySSLSocket * self,PyObject * Py_UNUSED (ignored))103 _ssl__SSLSocket_get_verified_chain(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
104 {
105     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 *
_ssl__SSLSocket_get_unverified_chain(PySSLSocket * self,PyObject * Py_UNUSED (ignored))120 _ssl__SSLSocket_get_unverified_chain(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
121 {
122     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 *
_ssl__SSLSocket_shared_ciphers(PySSLSocket * self,PyObject * Py_UNUSED (ignored))137 _ssl__SSLSocket_shared_ciphers(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
138 {
139     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 *
_ssl__SSLSocket_cipher(PySSLSocket * self,PyObject * Py_UNUSED (ignored))154 _ssl__SSLSocket_cipher(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
155 {
156     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 *
_ssl__SSLSocket_version(PySSLSocket * self,PyObject * Py_UNUSED (ignored))171 _ssl__SSLSocket_version(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
172 {
173     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 *
_ssl__SSLSocket_selected_alpn_protocol(PySSLSocket * self,PyObject * Py_UNUSED (ignored))188 _ssl__SSLSocket_selected_alpn_protocol(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
189 {
190     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 *
_ssl__SSLSocket_compression(PySSLSocket * self,PyObject * Py_UNUSED (ignored))205 _ssl__SSLSocket_compression(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
206 {
207     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 *
_ssl__SSLSocket_write(PySSLSocket * self,PyObject * arg)225 _ssl__SSLSocket_write(PySSLSocket *self, PyObject *arg)
226 {
227     PyObject *return_value = NULL;
228     Py_buffer b = {NULL, NULL};
229 
230     if (PyObject_GetBuffer(arg, &b, PyBUF_SIMPLE) != 0) {
231         goto exit;
232     }
233     if (!PyBuffer_IsContiguous(&b, 'C')) {
234         _PyArg_BadArgument("write", "argument", "contiguous buffer", arg);
235         goto exit;
236     }
237     return_value = _ssl__SSLSocket_write_impl(self, &b);
238 
239 exit:
240     /* Cleanup for b */
241     if (b.obj) {
242        PyBuffer_Release(&b);
243     }
244 
245     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 *
_ssl__SSLSocket_pending(PySSLSocket * self,PyObject * Py_UNUSED (ignored))261 _ssl__SSLSocket_pending(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
262 {
263     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 *
_ssl__SSLSocket_read(PySSLSocket * self,PyObject * args)278 _ssl__SSLSocket_read(PySSLSocket *self, PyObject *args)
279 {
280     PyObject *return_value = NULL;
281     Py_ssize_t len;
282     int group_right_1 = 0;
283     Py_buffer buffer = {NULL, NULL};
284 
285     switch (PyTuple_GET_SIZE(args)) {
286         case 1:
287             if (!PyArg_ParseTuple(args, "n:read", &len)) {
288                 goto exit;
289             }
290             break;
291         case 2:
292             if (!PyArg_ParseTuple(args, "nw*:read", &len, &buffer)) {
293                 goto exit;
294             }
295             group_right_1 = 1;
296             break;
297         default:
298             PyErr_SetString(PyExc_TypeError, "_ssl._SSLSocket.read requires 1 to 2 arguments");
299             goto exit;
300     }
301     return_value = _ssl__SSLSocket_read_impl(self, len, group_right_1, &buffer);
302 
303 exit:
304     /* Cleanup for buffer */
305     if (buffer.obj) {
306        PyBuffer_Release(&buffer);
307     }
308 
309     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 *
_ssl__SSLSocket_shutdown(PySSLSocket * self,PyObject * Py_UNUSED (ignored))325 _ssl__SSLSocket_shutdown(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
326 {
327     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)(void(*)(void))_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 *
_ssl__SSLSocket_get_channel_binding(PySSLSocket * self,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)348 _ssl__SSLSocket_get_channel_binding(PySSLSocket *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
349 {
350     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     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
355     const char *cb_type = "tls-unique";
356 
357     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
358     if (!args) {
359         goto exit;
360     }
361     if (!noptargs) {
362         goto skip_optional_pos;
363     }
364     if (!PyUnicode_Check(args[0])) {
365         _PyArg_BadArgument("get_channel_binding", "argument 'cb_type'", "str", args[0]);
366         goto exit;
367     }
368     Py_ssize_t cb_type_length;
369     cb_type = PyUnicode_AsUTF8AndSize(args[0], &cb_type_length);
370     if (cb_type == NULL) {
371         goto exit;
372     }
373     if (strlen(cb_type) != (size_t)cb_type_length) {
374         PyErr_SetString(PyExc_ValueError, "embedded null character");
375         goto exit;
376     }
377 skip_optional_pos:
378     return_value = _ssl__SSLSocket_get_channel_binding_impl(self, cb_type);
379 
380 exit:
381     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 *
_ssl__SSLSocket_verify_client_post_handshake(PySSLSocket * self,PyObject * Py_UNUSED (ignored))397 _ssl__SSLSocket_verify_client_post_handshake(PySSLSocket *self, PyObject *Py_UNUSED(ignored))
398 {
399     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 *
_ssl__SSLContext(PyTypeObject * type,PyObject * args,PyObject * kwargs)406 _ssl__SSLContext(PyTypeObject *type, PyObject *args, PyObject *kwargs)
407 {
408     PyObject *return_value = NULL;
409     int proto_version;
410 
411     if ((type == get_state_type(type)->PySSLContext_Type) &&
412         !_PyArg_NoKeywords("_SSLContext", kwargs)) {
413         goto exit;
414     }
415     if (!_PyArg_CheckPositional("_SSLContext", PyTuple_GET_SIZE(args), 1, 1)) {
416         goto exit;
417     }
418     proto_version = _PyLong_AsInt(PyTuple_GET_ITEM(args, 0));
419     if (proto_version == -1 && PyErr_Occurred()) {
420         goto exit;
421     }
422     return_value = _ssl__SSLContext_impl(type, proto_version);
423 
424 exit:
425     return return_value;
426 }
427 
428 PyDoc_STRVAR(_ssl__SSLContext_set_ciphers__doc__,
429 "set_ciphers($self, cipherlist, /)\n"
430 "--\n"
431 "\n");
432 
433 #define _SSL__SSLCONTEXT_SET_CIPHERS_METHODDEF    \
434     {"set_ciphers", (PyCFunction)_ssl__SSLContext_set_ciphers, METH_O, _ssl__SSLContext_set_ciphers__doc__},
435 
436 static PyObject *
437 _ssl__SSLContext_set_ciphers_impl(PySSLContext *self, const char *cipherlist);
438 
439 static PyObject *
_ssl__SSLContext_set_ciphers(PySSLContext * self,PyObject * arg)440 _ssl__SSLContext_set_ciphers(PySSLContext *self, PyObject *arg)
441 {
442     PyObject *return_value = NULL;
443     const char *cipherlist;
444 
445     if (!PyUnicode_Check(arg)) {
446         _PyArg_BadArgument("set_ciphers", "argument", "str", arg);
447         goto exit;
448     }
449     Py_ssize_t cipherlist_length;
450     cipherlist = PyUnicode_AsUTF8AndSize(arg, &cipherlist_length);
451     if (cipherlist == NULL) {
452         goto exit;
453     }
454     if (strlen(cipherlist) != (size_t)cipherlist_length) {
455         PyErr_SetString(PyExc_ValueError, "embedded null character");
456         goto exit;
457     }
458     return_value = _ssl__SSLContext_set_ciphers_impl(self, cipherlist);
459 
460 exit:
461     return return_value;
462 }
463 
464 PyDoc_STRVAR(_ssl__SSLContext_get_ciphers__doc__,
465 "get_ciphers($self, /)\n"
466 "--\n"
467 "\n");
468 
469 #define _SSL__SSLCONTEXT_GET_CIPHERS_METHODDEF    \
470     {"get_ciphers", (PyCFunction)_ssl__SSLContext_get_ciphers, METH_NOARGS, _ssl__SSLContext_get_ciphers__doc__},
471 
472 static PyObject *
473 _ssl__SSLContext_get_ciphers_impl(PySSLContext *self);
474 
475 static PyObject *
_ssl__SSLContext_get_ciphers(PySSLContext * self,PyObject * Py_UNUSED (ignored))476 _ssl__SSLContext_get_ciphers(PySSLContext *self, PyObject *Py_UNUSED(ignored))
477 {
478     return _ssl__SSLContext_get_ciphers_impl(self);
479 }
480 
481 PyDoc_STRVAR(_ssl__SSLContext__set_alpn_protocols__doc__,
482 "_set_alpn_protocols($self, protos, /)\n"
483 "--\n"
484 "\n");
485 
486 #define _SSL__SSLCONTEXT__SET_ALPN_PROTOCOLS_METHODDEF    \
487     {"_set_alpn_protocols", (PyCFunction)_ssl__SSLContext__set_alpn_protocols, METH_O, _ssl__SSLContext__set_alpn_protocols__doc__},
488 
489 static PyObject *
490 _ssl__SSLContext__set_alpn_protocols_impl(PySSLContext *self,
491                                           Py_buffer *protos);
492 
493 static PyObject *
_ssl__SSLContext__set_alpn_protocols(PySSLContext * self,PyObject * arg)494 _ssl__SSLContext__set_alpn_protocols(PySSLContext *self, PyObject *arg)
495 {
496     PyObject *return_value = NULL;
497     Py_buffer protos = {NULL, NULL};
498 
499     if (PyObject_GetBuffer(arg, &protos, PyBUF_SIMPLE) != 0) {
500         goto exit;
501     }
502     if (!PyBuffer_IsContiguous(&protos, 'C')) {
503         _PyArg_BadArgument("_set_alpn_protocols", "argument", "contiguous buffer", arg);
504         goto exit;
505     }
506     return_value = _ssl__SSLContext__set_alpn_protocols_impl(self, &protos);
507 
508 exit:
509     /* Cleanup for protos */
510     if (protos.obj) {
511        PyBuffer_Release(&protos);
512     }
513 
514     return return_value;
515 }
516 
517 PyDoc_STRVAR(_ssl__SSLContext_load_cert_chain__doc__,
518 "load_cert_chain($self, /, certfile, keyfile=None, password=None)\n"
519 "--\n"
520 "\n");
521 
522 #define _SSL__SSLCONTEXT_LOAD_CERT_CHAIN_METHODDEF    \
523     {"load_cert_chain", (PyCFunction)(void(*)(void))_ssl__SSLContext_load_cert_chain, METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext_load_cert_chain__doc__},
524 
525 static PyObject *
526 _ssl__SSLContext_load_cert_chain_impl(PySSLContext *self, PyObject *certfile,
527                                       PyObject *keyfile, PyObject *password);
528 
529 static PyObject *
_ssl__SSLContext_load_cert_chain(PySSLContext * self,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)530 _ssl__SSLContext_load_cert_chain(PySSLContext *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
531 {
532     PyObject *return_value = NULL;
533     static const char * const _keywords[] = {"certfile", "keyfile", "password", NULL};
534     static _PyArg_Parser _parser = {NULL, _keywords, "load_cert_chain", 0};
535     PyObject *argsbuf[3];
536     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
537     PyObject *certfile;
538     PyObject *keyfile = Py_None;
539     PyObject *password = Py_None;
540 
541     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 3, 0, argsbuf);
542     if (!args) {
543         goto exit;
544     }
545     certfile = args[0];
546     if (!noptargs) {
547         goto skip_optional_pos;
548     }
549     if (args[1]) {
550         keyfile = args[1];
551         if (!--noptargs) {
552             goto skip_optional_pos;
553         }
554     }
555     password = args[2];
556 skip_optional_pos:
557     return_value = _ssl__SSLContext_load_cert_chain_impl(self, certfile, keyfile, password);
558 
559 exit:
560     return return_value;
561 }
562 
563 PyDoc_STRVAR(_ssl__SSLContext_load_verify_locations__doc__,
564 "load_verify_locations($self, /, cafile=None, capath=None, cadata=None)\n"
565 "--\n"
566 "\n");
567 
568 #define _SSL__SSLCONTEXT_LOAD_VERIFY_LOCATIONS_METHODDEF    \
569     {"load_verify_locations", (PyCFunction)(void(*)(void))_ssl__SSLContext_load_verify_locations, METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext_load_verify_locations__doc__},
570 
571 static PyObject *
572 _ssl__SSLContext_load_verify_locations_impl(PySSLContext *self,
573                                             PyObject *cafile,
574                                             PyObject *capath,
575                                             PyObject *cadata);
576 
577 static PyObject *
_ssl__SSLContext_load_verify_locations(PySSLContext * self,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)578 _ssl__SSLContext_load_verify_locations(PySSLContext *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
579 {
580     PyObject *return_value = NULL;
581     static const char * const _keywords[] = {"cafile", "capath", "cadata", NULL};
582     static _PyArg_Parser _parser = {NULL, _keywords, "load_verify_locations", 0};
583     PyObject *argsbuf[3];
584     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
585     PyObject *cafile = Py_None;
586     PyObject *capath = Py_None;
587     PyObject *cadata = Py_None;
588 
589     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 3, 0, argsbuf);
590     if (!args) {
591         goto exit;
592     }
593     if (!noptargs) {
594         goto skip_optional_pos;
595     }
596     if (args[0]) {
597         cafile = args[0];
598         if (!--noptargs) {
599             goto skip_optional_pos;
600         }
601     }
602     if (args[1]) {
603         capath = args[1];
604         if (!--noptargs) {
605             goto skip_optional_pos;
606         }
607     }
608     cadata = args[2];
609 skip_optional_pos:
610     return_value = _ssl__SSLContext_load_verify_locations_impl(self, cafile, capath, cadata);
611 
612 exit:
613     return return_value;
614 }
615 
616 PyDoc_STRVAR(_ssl__SSLContext_load_dh_params__doc__,
617 "load_dh_params($self, path, /)\n"
618 "--\n"
619 "\n");
620 
621 #define _SSL__SSLCONTEXT_LOAD_DH_PARAMS_METHODDEF    \
622     {"load_dh_params", (PyCFunction)_ssl__SSLContext_load_dh_params, METH_O, _ssl__SSLContext_load_dh_params__doc__},
623 
624 PyDoc_STRVAR(_ssl__SSLContext__wrap_socket__doc__,
625 "_wrap_socket($self, /, sock, server_side, server_hostname=None, *,\n"
626 "             owner=None, session=None)\n"
627 "--\n"
628 "\n");
629 
630 #define _SSL__SSLCONTEXT__WRAP_SOCKET_METHODDEF    \
631     {"_wrap_socket", (PyCFunction)(void(*)(void))_ssl__SSLContext__wrap_socket, METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext__wrap_socket__doc__},
632 
633 static PyObject *
634 _ssl__SSLContext__wrap_socket_impl(PySSLContext *self, PyObject *sock,
635                                    int server_side, PyObject *hostname_obj,
636                                    PyObject *owner, PyObject *session);
637 
638 static PyObject *
_ssl__SSLContext__wrap_socket(PySSLContext * self,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)639 _ssl__SSLContext__wrap_socket(PySSLContext *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
640 {
641     PyObject *return_value = NULL;
642     static const char * const _keywords[] = {"sock", "server_side", "server_hostname", "owner", "session", NULL};
643     static _PyArg_Parser _parser = {NULL, _keywords, "_wrap_socket", 0};
644     PyObject *argsbuf[5];
645     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 2;
646     PyObject *sock;
647     int server_side;
648     PyObject *hostname_obj = Py_None;
649     PyObject *owner = Py_None;
650     PyObject *session = Py_None;
651 
652     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 2, 3, 0, argsbuf);
653     if (!args) {
654         goto exit;
655     }
656     if (!PyObject_TypeCheck(args[0], get_state_ctx(self)->Sock_Type)) {
657         _PyArg_BadArgument("_wrap_socket", "argument 'sock'", (get_state_ctx(self)->Sock_Type)->tp_name, args[0]);
658         goto exit;
659     }
660     sock = args[0];
661     server_side = _PyLong_AsInt(args[1]);
662     if (server_side == -1 && PyErr_Occurred()) {
663         goto exit;
664     }
665     if (!noptargs) {
666         goto skip_optional_pos;
667     }
668     if (args[2]) {
669         hostname_obj = args[2];
670         if (!--noptargs) {
671             goto skip_optional_pos;
672         }
673     }
674 skip_optional_pos:
675     if (!noptargs) {
676         goto skip_optional_kwonly;
677     }
678     if (args[3]) {
679         owner = args[3];
680         if (!--noptargs) {
681             goto skip_optional_kwonly;
682         }
683     }
684     session = args[4];
685 skip_optional_kwonly:
686     return_value = _ssl__SSLContext__wrap_socket_impl(self, sock, server_side, hostname_obj, owner, session);
687 
688 exit:
689     return return_value;
690 }
691 
692 PyDoc_STRVAR(_ssl__SSLContext__wrap_bio__doc__,
693 "_wrap_bio($self, /, incoming, outgoing, server_side,\n"
694 "          server_hostname=None, *, owner=None, session=None)\n"
695 "--\n"
696 "\n");
697 
698 #define _SSL__SSLCONTEXT__WRAP_BIO_METHODDEF    \
699     {"_wrap_bio", (PyCFunction)(void(*)(void))_ssl__SSLContext__wrap_bio, METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext__wrap_bio__doc__},
700 
701 static PyObject *
702 _ssl__SSLContext__wrap_bio_impl(PySSLContext *self, PySSLMemoryBIO *incoming,
703                                 PySSLMemoryBIO *outgoing, int server_side,
704                                 PyObject *hostname_obj, PyObject *owner,
705                                 PyObject *session);
706 
707 static PyObject *
_ssl__SSLContext__wrap_bio(PySSLContext * self,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)708 _ssl__SSLContext__wrap_bio(PySSLContext *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
709 {
710     PyObject *return_value = NULL;
711     static const char * const _keywords[] = {"incoming", "outgoing", "server_side", "server_hostname", "owner", "session", NULL};
712     static _PyArg_Parser _parser = {NULL, _keywords, "_wrap_bio", 0};
713     PyObject *argsbuf[6];
714     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 3;
715     PySSLMemoryBIO *incoming;
716     PySSLMemoryBIO *outgoing;
717     int server_side;
718     PyObject *hostname_obj = Py_None;
719     PyObject *owner = Py_None;
720     PyObject *session = Py_None;
721 
722     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 3, 4, 0, argsbuf);
723     if (!args) {
724         goto exit;
725     }
726     if (!PyObject_TypeCheck(args[0], get_state_ctx(self)->PySSLMemoryBIO_Type)) {
727         _PyArg_BadArgument("_wrap_bio", "argument 'incoming'", (get_state_ctx(self)->PySSLMemoryBIO_Type)->tp_name, args[0]);
728         goto exit;
729     }
730     incoming = (PySSLMemoryBIO *)args[0];
731     if (!PyObject_TypeCheck(args[1], get_state_ctx(self)->PySSLMemoryBIO_Type)) {
732         _PyArg_BadArgument("_wrap_bio", "argument 'outgoing'", (get_state_ctx(self)->PySSLMemoryBIO_Type)->tp_name, args[1]);
733         goto exit;
734     }
735     outgoing = (PySSLMemoryBIO *)args[1];
736     server_side = _PyLong_AsInt(args[2]);
737     if (server_side == -1 && PyErr_Occurred()) {
738         goto exit;
739     }
740     if (!noptargs) {
741         goto skip_optional_pos;
742     }
743     if (args[3]) {
744         hostname_obj = args[3];
745         if (!--noptargs) {
746             goto skip_optional_pos;
747         }
748     }
749 skip_optional_pos:
750     if (!noptargs) {
751         goto skip_optional_kwonly;
752     }
753     if (args[4]) {
754         owner = args[4];
755         if (!--noptargs) {
756             goto skip_optional_kwonly;
757         }
758     }
759     session = args[5];
760 skip_optional_kwonly:
761     return_value = _ssl__SSLContext__wrap_bio_impl(self, incoming, outgoing, server_side, hostname_obj, owner, session);
762 
763 exit:
764     return return_value;
765 }
766 
767 PyDoc_STRVAR(_ssl__SSLContext_session_stats__doc__,
768 "session_stats($self, /)\n"
769 "--\n"
770 "\n");
771 
772 #define _SSL__SSLCONTEXT_SESSION_STATS_METHODDEF    \
773     {"session_stats", (PyCFunction)_ssl__SSLContext_session_stats, METH_NOARGS, _ssl__SSLContext_session_stats__doc__},
774 
775 static PyObject *
776 _ssl__SSLContext_session_stats_impl(PySSLContext *self);
777 
778 static PyObject *
_ssl__SSLContext_session_stats(PySSLContext * self,PyObject * Py_UNUSED (ignored))779 _ssl__SSLContext_session_stats(PySSLContext *self, PyObject *Py_UNUSED(ignored))
780 {
781     return _ssl__SSLContext_session_stats_impl(self);
782 }
783 
784 PyDoc_STRVAR(_ssl__SSLContext_set_default_verify_paths__doc__,
785 "set_default_verify_paths($self, /)\n"
786 "--\n"
787 "\n");
788 
789 #define _SSL__SSLCONTEXT_SET_DEFAULT_VERIFY_PATHS_METHODDEF    \
790     {"set_default_verify_paths", (PyCFunction)_ssl__SSLContext_set_default_verify_paths, METH_NOARGS, _ssl__SSLContext_set_default_verify_paths__doc__},
791 
792 static PyObject *
793 _ssl__SSLContext_set_default_verify_paths_impl(PySSLContext *self);
794 
795 static PyObject *
_ssl__SSLContext_set_default_verify_paths(PySSLContext * self,PyObject * Py_UNUSED (ignored))796 _ssl__SSLContext_set_default_verify_paths(PySSLContext *self, PyObject *Py_UNUSED(ignored))
797 {
798     return _ssl__SSLContext_set_default_verify_paths_impl(self);
799 }
800 
801 PyDoc_STRVAR(_ssl__SSLContext_set_ecdh_curve__doc__,
802 "set_ecdh_curve($self, name, /)\n"
803 "--\n"
804 "\n");
805 
806 #define _SSL__SSLCONTEXT_SET_ECDH_CURVE_METHODDEF    \
807     {"set_ecdh_curve", (PyCFunction)_ssl__SSLContext_set_ecdh_curve, METH_O, _ssl__SSLContext_set_ecdh_curve__doc__},
808 
809 PyDoc_STRVAR(_ssl__SSLContext_cert_store_stats__doc__,
810 "cert_store_stats($self, /)\n"
811 "--\n"
812 "\n"
813 "Returns quantities of loaded X.509 certificates.\n"
814 "\n"
815 "X.509 certificates with a CA extension and certificate revocation lists\n"
816 "inside the context\'s cert store.\n"
817 "\n"
818 "NOTE: Certificates in a capath directory aren\'t loaded unless they have\n"
819 "been used at least once.");
820 
821 #define _SSL__SSLCONTEXT_CERT_STORE_STATS_METHODDEF    \
822     {"cert_store_stats", (PyCFunction)_ssl__SSLContext_cert_store_stats, METH_NOARGS, _ssl__SSLContext_cert_store_stats__doc__},
823 
824 static PyObject *
825 _ssl__SSLContext_cert_store_stats_impl(PySSLContext *self);
826 
827 static PyObject *
_ssl__SSLContext_cert_store_stats(PySSLContext * self,PyObject * Py_UNUSED (ignored))828 _ssl__SSLContext_cert_store_stats(PySSLContext *self, PyObject *Py_UNUSED(ignored))
829 {
830     return _ssl__SSLContext_cert_store_stats_impl(self);
831 }
832 
833 PyDoc_STRVAR(_ssl__SSLContext_get_ca_certs__doc__,
834 "get_ca_certs($self, /, binary_form=False)\n"
835 "--\n"
836 "\n"
837 "Returns a list of dicts with information of loaded CA certs.\n"
838 "\n"
839 "If the optional argument is True, returns a DER-encoded copy of the CA\n"
840 "certificate.\n"
841 "\n"
842 "NOTE: Certificates in a capath directory aren\'t loaded unless they have\n"
843 "been used at least once.");
844 
845 #define _SSL__SSLCONTEXT_GET_CA_CERTS_METHODDEF    \
846     {"get_ca_certs", (PyCFunction)(void(*)(void))_ssl__SSLContext_get_ca_certs, METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext_get_ca_certs__doc__},
847 
848 static PyObject *
849 _ssl__SSLContext_get_ca_certs_impl(PySSLContext *self, int binary_form);
850 
851 static PyObject *
_ssl__SSLContext_get_ca_certs(PySSLContext * self,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)852 _ssl__SSLContext_get_ca_certs(PySSLContext *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
853 {
854     PyObject *return_value = NULL;
855     static const char * const _keywords[] = {"binary_form", NULL};
856     static _PyArg_Parser _parser = {NULL, _keywords, "get_ca_certs", 0};
857     PyObject *argsbuf[1];
858     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
859     int binary_form = 0;
860 
861     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
862     if (!args) {
863         goto exit;
864     }
865     if (!noptargs) {
866         goto skip_optional_pos;
867     }
868     binary_form = PyObject_IsTrue(args[0]);
869     if (binary_form < 0) {
870         goto exit;
871     }
872 skip_optional_pos:
873     return_value = _ssl__SSLContext_get_ca_certs_impl(self, binary_form);
874 
875 exit:
876     return return_value;
877 }
878 
879 static PyObject *
880 _ssl_MemoryBIO_impl(PyTypeObject *type);
881 
882 static PyObject *
_ssl_MemoryBIO(PyTypeObject * type,PyObject * args,PyObject * kwargs)883 _ssl_MemoryBIO(PyTypeObject *type, PyObject *args, PyObject *kwargs)
884 {
885     PyObject *return_value = NULL;
886 
887     if ((type == get_state_type(type)->PySSLMemoryBIO_Type) &&
888         !_PyArg_NoPositional("MemoryBIO", args)) {
889         goto exit;
890     }
891     if ((type == get_state_type(type)->PySSLMemoryBIO_Type) &&
892         !_PyArg_NoKeywords("MemoryBIO", kwargs)) {
893         goto exit;
894     }
895     return_value = _ssl_MemoryBIO_impl(type);
896 
897 exit:
898     return return_value;
899 }
900 
901 PyDoc_STRVAR(_ssl_MemoryBIO_read__doc__,
902 "read($self, size=-1, /)\n"
903 "--\n"
904 "\n"
905 "Read up to size bytes from the memory BIO.\n"
906 "\n"
907 "If size is not specified, read the entire buffer.\n"
908 "If the return value is an empty bytes instance, this means either\n"
909 "EOF or that no data is available. Use the \"eof\" property to\n"
910 "distinguish between the two.");
911 
912 #define _SSL_MEMORYBIO_READ_METHODDEF    \
913     {"read", (PyCFunction)(void(*)(void))_ssl_MemoryBIO_read, METH_FASTCALL, _ssl_MemoryBIO_read__doc__},
914 
915 static PyObject *
916 _ssl_MemoryBIO_read_impl(PySSLMemoryBIO *self, int len);
917 
918 static PyObject *
_ssl_MemoryBIO_read(PySSLMemoryBIO * self,PyObject * const * args,Py_ssize_t nargs)919 _ssl_MemoryBIO_read(PySSLMemoryBIO *self, PyObject *const *args, Py_ssize_t nargs)
920 {
921     PyObject *return_value = NULL;
922     int len = -1;
923 
924     if (!_PyArg_CheckPositional("read", nargs, 0, 1)) {
925         goto exit;
926     }
927     if (nargs < 1) {
928         goto skip_optional;
929     }
930     len = _PyLong_AsInt(args[0]);
931     if (len == -1 && PyErr_Occurred()) {
932         goto exit;
933     }
934 skip_optional:
935     return_value = _ssl_MemoryBIO_read_impl(self, len);
936 
937 exit:
938     return return_value;
939 }
940 
941 PyDoc_STRVAR(_ssl_MemoryBIO_write__doc__,
942 "write($self, b, /)\n"
943 "--\n"
944 "\n"
945 "Writes the bytes b into the memory BIO.\n"
946 "\n"
947 "Returns the number of bytes written.");
948 
949 #define _SSL_MEMORYBIO_WRITE_METHODDEF    \
950     {"write", (PyCFunction)_ssl_MemoryBIO_write, METH_O, _ssl_MemoryBIO_write__doc__},
951 
952 static PyObject *
953 _ssl_MemoryBIO_write_impl(PySSLMemoryBIO *self, Py_buffer *b);
954 
955 static PyObject *
_ssl_MemoryBIO_write(PySSLMemoryBIO * self,PyObject * arg)956 _ssl_MemoryBIO_write(PySSLMemoryBIO *self, PyObject *arg)
957 {
958     PyObject *return_value = NULL;
959     Py_buffer b = {NULL, NULL};
960 
961     if (PyObject_GetBuffer(arg, &b, PyBUF_SIMPLE) != 0) {
962         goto exit;
963     }
964     if (!PyBuffer_IsContiguous(&b, 'C')) {
965         _PyArg_BadArgument("write", "argument", "contiguous buffer", arg);
966         goto exit;
967     }
968     return_value = _ssl_MemoryBIO_write_impl(self, &b);
969 
970 exit:
971     /* Cleanup for b */
972     if (b.obj) {
973        PyBuffer_Release(&b);
974     }
975 
976     return return_value;
977 }
978 
979 PyDoc_STRVAR(_ssl_MemoryBIO_write_eof__doc__,
980 "write_eof($self, /)\n"
981 "--\n"
982 "\n"
983 "Write an EOF marker to the memory BIO.\n"
984 "\n"
985 "When all data has been read, the \"eof\" property will be True.");
986 
987 #define _SSL_MEMORYBIO_WRITE_EOF_METHODDEF    \
988     {"write_eof", (PyCFunction)_ssl_MemoryBIO_write_eof, METH_NOARGS, _ssl_MemoryBIO_write_eof__doc__},
989 
990 static PyObject *
991 _ssl_MemoryBIO_write_eof_impl(PySSLMemoryBIO *self);
992 
993 static PyObject *
_ssl_MemoryBIO_write_eof(PySSLMemoryBIO * self,PyObject * Py_UNUSED (ignored))994 _ssl_MemoryBIO_write_eof(PySSLMemoryBIO *self, PyObject *Py_UNUSED(ignored))
995 {
996     return _ssl_MemoryBIO_write_eof_impl(self);
997 }
998 
999 PyDoc_STRVAR(_ssl_RAND_add__doc__,
1000 "RAND_add($module, string, entropy, /)\n"
1001 "--\n"
1002 "\n"
1003 "Mix string into the OpenSSL PRNG state.\n"
1004 "\n"
1005 "entropy (a float) is a lower bound on the entropy contained in\n"
1006 "string.  See RFC 4086.");
1007 
1008 #define _SSL_RAND_ADD_METHODDEF    \
1009     {"RAND_add", (PyCFunction)(void(*)(void))_ssl_RAND_add, METH_FASTCALL, _ssl_RAND_add__doc__},
1010 
1011 static PyObject *
1012 _ssl_RAND_add_impl(PyObject *module, Py_buffer *view, double entropy);
1013 
1014 static PyObject *
_ssl_RAND_add(PyObject * module,PyObject * const * args,Py_ssize_t nargs)1015 _ssl_RAND_add(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
1016 {
1017     PyObject *return_value = NULL;
1018     Py_buffer view = {NULL, NULL};
1019     double entropy;
1020 
1021     if (!_PyArg_CheckPositional("RAND_add", nargs, 2, 2)) {
1022         goto exit;
1023     }
1024     if (PyUnicode_Check(args[0])) {
1025         Py_ssize_t len;
1026         const char *ptr = PyUnicode_AsUTF8AndSize(args[0], &len);
1027         if (ptr == NULL) {
1028             goto exit;
1029         }
1030         PyBuffer_FillInfo(&view, args[0], (void *)ptr, len, 1, 0);
1031     }
1032     else { /* any bytes-like object */
1033         if (PyObject_GetBuffer(args[0], &view, PyBUF_SIMPLE) != 0) {
1034             goto exit;
1035         }
1036         if (!PyBuffer_IsContiguous(&view, 'C')) {
1037             _PyArg_BadArgument("RAND_add", "argument 1", "contiguous buffer", args[0]);
1038             goto exit;
1039         }
1040     }
1041     if (PyFloat_CheckExact(args[1])) {
1042         entropy = PyFloat_AS_DOUBLE(args[1]);
1043     }
1044     else
1045     {
1046         entropy = PyFloat_AsDouble(args[1]);
1047         if (entropy == -1.0 && PyErr_Occurred()) {
1048             goto exit;
1049         }
1050     }
1051     return_value = _ssl_RAND_add_impl(module, &view, entropy);
1052 
1053 exit:
1054     /* Cleanup for view */
1055     if (view.obj) {
1056        PyBuffer_Release(&view);
1057     }
1058 
1059     return return_value;
1060 }
1061 
1062 PyDoc_STRVAR(_ssl_RAND_bytes__doc__,
1063 "RAND_bytes($module, n, /)\n"
1064 "--\n"
1065 "\n"
1066 "Generate n cryptographically strong pseudo-random bytes.");
1067 
1068 #define _SSL_RAND_BYTES_METHODDEF    \
1069     {"RAND_bytes", (PyCFunction)_ssl_RAND_bytes, METH_O, _ssl_RAND_bytes__doc__},
1070 
1071 static PyObject *
1072 _ssl_RAND_bytes_impl(PyObject *module, int n);
1073 
1074 static PyObject *
_ssl_RAND_bytes(PyObject * module,PyObject * arg)1075 _ssl_RAND_bytes(PyObject *module, PyObject *arg)
1076 {
1077     PyObject *return_value = NULL;
1078     int n;
1079 
1080     n = _PyLong_AsInt(arg);
1081     if (n == -1 && PyErr_Occurred()) {
1082         goto exit;
1083     }
1084     return_value = _ssl_RAND_bytes_impl(module, n);
1085 
1086 exit:
1087     return return_value;
1088 }
1089 
1090 PyDoc_STRVAR(_ssl_RAND_pseudo_bytes__doc__,
1091 "RAND_pseudo_bytes($module, n, /)\n"
1092 "--\n"
1093 "\n"
1094 "Generate n pseudo-random bytes.\n"
1095 "\n"
1096 "Return a pair (bytes, is_cryptographic).  is_cryptographic is True\n"
1097 "if the bytes generated are cryptographically strong.");
1098 
1099 #define _SSL_RAND_PSEUDO_BYTES_METHODDEF    \
1100     {"RAND_pseudo_bytes", (PyCFunction)_ssl_RAND_pseudo_bytes, METH_O, _ssl_RAND_pseudo_bytes__doc__},
1101 
1102 static PyObject *
1103 _ssl_RAND_pseudo_bytes_impl(PyObject *module, int n);
1104 
1105 static PyObject *
_ssl_RAND_pseudo_bytes(PyObject * module,PyObject * arg)1106 _ssl_RAND_pseudo_bytes(PyObject *module, PyObject *arg)
1107 {
1108     PyObject *return_value = NULL;
1109     int n;
1110 
1111     n = _PyLong_AsInt(arg);
1112     if (n == -1 && PyErr_Occurred()) {
1113         goto exit;
1114     }
1115     return_value = _ssl_RAND_pseudo_bytes_impl(module, n);
1116 
1117 exit:
1118     return return_value;
1119 }
1120 
1121 PyDoc_STRVAR(_ssl_RAND_status__doc__,
1122 "RAND_status($module, /)\n"
1123 "--\n"
1124 "\n"
1125 "Returns True if the OpenSSL PRNG has been seeded with enough data and False if not.\n"
1126 "\n"
1127 "It is necessary to seed the PRNG with RAND_add() on some platforms before\n"
1128 "using the ssl() function.");
1129 
1130 #define _SSL_RAND_STATUS_METHODDEF    \
1131     {"RAND_status", (PyCFunction)_ssl_RAND_status, METH_NOARGS, _ssl_RAND_status__doc__},
1132 
1133 static PyObject *
1134 _ssl_RAND_status_impl(PyObject *module);
1135 
1136 static PyObject *
_ssl_RAND_status(PyObject * module,PyObject * Py_UNUSED (ignored))1137 _ssl_RAND_status(PyObject *module, PyObject *Py_UNUSED(ignored))
1138 {
1139     return _ssl_RAND_status_impl(module);
1140 }
1141 
1142 PyDoc_STRVAR(_ssl_get_default_verify_paths__doc__,
1143 "get_default_verify_paths($module, /)\n"
1144 "--\n"
1145 "\n"
1146 "Return search paths and environment vars that are used by SSLContext\'s set_default_verify_paths() to load default CAs.\n"
1147 "\n"
1148 "The values are \'cert_file_env\', \'cert_file\', \'cert_dir_env\', \'cert_dir\'.");
1149 
1150 #define _SSL_GET_DEFAULT_VERIFY_PATHS_METHODDEF    \
1151     {"get_default_verify_paths", (PyCFunction)_ssl_get_default_verify_paths, METH_NOARGS, _ssl_get_default_verify_paths__doc__},
1152 
1153 static PyObject *
1154 _ssl_get_default_verify_paths_impl(PyObject *module);
1155 
1156 static PyObject *
_ssl_get_default_verify_paths(PyObject * module,PyObject * Py_UNUSED (ignored))1157 _ssl_get_default_verify_paths(PyObject *module, PyObject *Py_UNUSED(ignored))
1158 {
1159     return _ssl_get_default_verify_paths_impl(module);
1160 }
1161 
1162 PyDoc_STRVAR(_ssl_txt2obj__doc__,
1163 "txt2obj($module, /, txt, name=False)\n"
1164 "--\n"
1165 "\n"
1166 "Lookup NID, short name, long name and OID of an ASN1_OBJECT.\n"
1167 "\n"
1168 "By default objects are looked up by OID. With name=True short and\n"
1169 "long name are also matched.");
1170 
1171 #define _SSL_TXT2OBJ_METHODDEF    \
1172     {"txt2obj", (PyCFunction)(void(*)(void))_ssl_txt2obj, METH_FASTCALL|METH_KEYWORDS, _ssl_txt2obj__doc__},
1173 
1174 static PyObject *
1175 _ssl_txt2obj_impl(PyObject *module, const char *txt, int name);
1176 
1177 static PyObject *
_ssl_txt2obj(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1178 _ssl_txt2obj(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1179 {
1180     PyObject *return_value = NULL;
1181     static const char * const _keywords[] = {"txt", "name", NULL};
1182     static _PyArg_Parser _parser = {NULL, _keywords, "txt2obj", 0};
1183     PyObject *argsbuf[2];
1184     Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 1;
1185     const char *txt;
1186     int name = 0;
1187 
1188     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 2, 0, argsbuf);
1189     if (!args) {
1190         goto exit;
1191     }
1192     if (!PyUnicode_Check(args[0])) {
1193         _PyArg_BadArgument("txt2obj", "argument 'txt'", "str", args[0]);
1194         goto exit;
1195     }
1196     Py_ssize_t txt_length;
1197     txt = PyUnicode_AsUTF8AndSize(args[0], &txt_length);
1198     if (txt == NULL) {
1199         goto exit;
1200     }
1201     if (strlen(txt) != (size_t)txt_length) {
1202         PyErr_SetString(PyExc_ValueError, "embedded null character");
1203         goto exit;
1204     }
1205     if (!noptargs) {
1206         goto skip_optional_pos;
1207     }
1208     name = PyObject_IsTrue(args[1]);
1209     if (name < 0) {
1210         goto exit;
1211     }
1212 skip_optional_pos:
1213     return_value = _ssl_txt2obj_impl(module, txt, name);
1214 
1215 exit:
1216     return return_value;
1217 }
1218 
1219 PyDoc_STRVAR(_ssl_nid2obj__doc__,
1220 "nid2obj($module, nid, /)\n"
1221 "--\n"
1222 "\n"
1223 "Lookup NID, short name, long name and OID of an ASN1_OBJECT by NID.");
1224 
1225 #define _SSL_NID2OBJ_METHODDEF    \
1226     {"nid2obj", (PyCFunction)_ssl_nid2obj, METH_O, _ssl_nid2obj__doc__},
1227 
1228 static PyObject *
1229 _ssl_nid2obj_impl(PyObject *module, int nid);
1230 
1231 static PyObject *
_ssl_nid2obj(PyObject * module,PyObject * arg)1232 _ssl_nid2obj(PyObject *module, PyObject *arg)
1233 {
1234     PyObject *return_value = NULL;
1235     int nid;
1236 
1237     nid = _PyLong_AsInt(arg);
1238     if (nid == -1 && PyErr_Occurred()) {
1239         goto exit;
1240     }
1241     return_value = _ssl_nid2obj_impl(module, nid);
1242 
1243 exit:
1244     return return_value;
1245 }
1246 
1247 #if defined(_MSC_VER)
1248 
1249 PyDoc_STRVAR(_ssl_enum_certificates__doc__,
1250 "enum_certificates($module, /, store_name)\n"
1251 "--\n"
1252 "\n"
1253 "Retrieve certificates from Windows\' cert store.\n"
1254 "\n"
1255 "store_name may be one of \'CA\', \'ROOT\' or \'MY\'.  The system may provide\n"
1256 "more cert storages, too.  The function returns a list of (bytes,\n"
1257 "encoding_type, trust) tuples.  The encoding_type flag can be interpreted\n"
1258 "with X509_ASN_ENCODING or PKCS_7_ASN_ENCODING. The trust setting is either\n"
1259 "a set of OIDs or the boolean True.");
1260 
1261 #define _SSL_ENUM_CERTIFICATES_METHODDEF    \
1262     {"enum_certificates", (PyCFunction)(void(*)(void))_ssl_enum_certificates, METH_FASTCALL|METH_KEYWORDS, _ssl_enum_certificates__doc__},
1263 
1264 static PyObject *
1265 _ssl_enum_certificates_impl(PyObject *module, const char *store_name);
1266 
1267 static PyObject *
_ssl_enum_certificates(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1268 _ssl_enum_certificates(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1269 {
1270     PyObject *return_value = NULL;
1271     static const char * const _keywords[] = {"store_name", NULL};
1272     static _PyArg_Parser _parser = {NULL, _keywords, "enum_certificates", 0};
1273     PyObject *argsbuf[1];
1274     const char *store_name;
1275 
1276     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1277     if (!args) {
1278         goto exit;
1279     }
1280     if (!PyUnicode_Check(args[0])) {
1281         _PyArg_BadArgument("enum_certificates", "argument 'store_name'", "str", args[0]);
1282         goto exit;
1283     }
1284     Py_ssize_t store_name_length;
1285     store_name = PyUnicode_AsUTF8AndSize(args[0], &store_name_length);
1286     if (store_name == NULL) {
1287         goto exit;
1288     }
1289     if (strlen(store_name) != (size_t)store_name_length) {
1290         PyErr_SetString(PyExc_ValueError, "embedded null character");
1291         goto exit;
1292     }
1293     return_value = _ssl_enum_certificates_impl(module, store_name);
1294 
1295 exit:
1296     return return_value;
1297 }
1298 
1299 #endif /* defined(_MSC_VER) */
1300 
1301 #if defined(_MSC_VER)
1302 
1303 PyDoc_STRVAR(_ssl_enum_crls__doc__,
1304 "enum_crls($module, /, store_name)\n"
1305 "--\n"
1306 "\n"
1307 "Retrieve CRLs from Windows\' cert store.\n"
1308 "\n"
1309 "store_name may be one of \'CA\', \'ROOT\' or \'MY\'.  The system may provide\n"
1310 "more cert storages, too.  The function returns a list of (bytes,\n"
1311 "encoding_type) tuples.  The encoding_type flag can be interpreted with\n"
1312 "X509_ASN_ENCODING or PKCS_7_ASN_ENCODING.");
1313 
1314 #define _SSL_ENUM_CRLS_METHODDEF    \
1315     {"enum_crls", (PyCFunction)(void(*)(void))_ssl_enum_crls, METH_FASTCALL|METH_KEYWORDS, _ssl_enum_crls__doc__},
1316 
1317 static PyObject *
1318 _ssl_enum_crls_impl(PyObject *module, const char *store_name);
1319 
1320 static PyObject *
_ssl_enum_crls(PyObject * module,PyObject * const * args,Py_ssize_t nargs,PyObject * kwnames)1321 _ssl_enum_crls(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
1322 {
1323     PyObject *return_value = NULL;
1324     static const char * const _keywords[] = {"store_name", NULL};
1325     static _PyArg_Parser _parser = {NULL, _keywords, "enum_crls", 0};
1326     PyObject *argsbuf[1];
1327     const char *store_name;
1328 
1329     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf);
1330     if (!args) {
1331         goto exit;
1332     }
1333     if (!PyUnicode_Check(args[0])) {
1334         _PyArg_BadArgument("enum_crls", "argument 'store_name'", "str", args[0]);
1335         goto exit;
1336     }
1337     Py_ssize_t store_name_length;
1338     store_name = PyUnicode_AsUTF8AndSize(args[0], &store_name_length);
1339     if (store_name == NULL) {
1340         goto exit;
1341     }
1342     if (strlen(store_name) != (size_t)store_name_length) {
1343         PyErr_SetString(PyExc_ValueError, "embedded null character");
1344         goto exit;
1345     }
1346     return_value = _ssl_enum_crls_impl(module, store_name);
1347 
1348 exit:
1349     return return_value;
1350 }
1351 
1352 #endif /* defined(_MSC_VER) */
1353 
1354 #ifndef _SSL_ENUM_CERTIFICATES_METHODDEF
1355     #define _SSL_ENUM_CERTIFICATES_METHODDEF
1356 #endif /* !defined(_SSL_ENUM_CERTIFICATES_METHODDEF) */
1357 
1358 #ifndef _SSL_ENUM_CRLS_METHODDEF
1359     #define _SSL_ENUM_CRLS_METHODDEF
1360 #endif /* !defined(_SSL_ENUM_CRLS_METHODDEF) */
1361 /*[clinic end generated code: output=5a7d7bf5cf8ee092 input=a9049054013a1b77]*/
1362