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