File Coverage

lib/Crypt/OpenSSL3.xs
Criterion Covered Total %
statement 218 697 31.2
branch 55 482 11.4
condition n/a
subroutine n/a
pod n/a
total 273 1179 23.1


line stmt bran cond sub pod time code
1             #define PERL_NO_GET_CONTEXT
2             #include "EXTERN.h"
3             #include "perl.h"
4             #include "XSUB.h"
5              
6             #ifndef __bool_true_false_are_defined
7             #undef bool
8             #include
9             #endif
10              
11             #define NEED_mg_findext
12             #include "ppport.h"
13              
14             #include
15             #include
16             #include
17             #include
18             #include
19             #include
20             #include
21              
22             #include
23             #include
24             #include
25             #include
26              
27             #define TYPE_TYPE(c_type, xs_type) typedef c_type * Crypt__OpenSSL3__ ## xs_type;
28             #define MAGIC_TABLE(xs_type, dup, free)\
29             static const MGVTBL Crypt__OpenSSL3__ ## xs_type ## _magic = {\
30             .svt_free = free,\
31             .svt_dup = dup,\
32             };
33              
34             #define TYPE_COMMON(c_type, xs_type, p_type)\
35             static SV* make_ ## c_type(pTHX_ void* var) {\
36             SV* result = newSV(0);\
37             const char* classname = "Crypt::OpenSSL3::" #p_type;\
38             const MGVTBL* mgvtbl = &Crypt__OpenSSL3__## xs_type ##_magic;\
39             MAGIC* magic = sv_magicext(newSVrv(result, classname), NULL, PERL_MAGIC_ext, mgvtbl, (const char*)var, 0);\
40             magic->mg_flags |= MGf_DUP;\
41             return result;\
42             }\
43             static c_type* get_ ## c_type (pTHX_ SV* value) {\
44             if (!SvROK(value))\
45             return NULL;\
46             MAGIC* magic = mg_findext(SvRV(value), PERL_MAGIC_ext, &Crypt__OpenSSL3__## xs_type ##_magic);\
47             return magic ? (c_type*)magic->mg_ptr : NULL;\
48             }
49              
50             #define DUPLICATING_TYPE(c_type, xs_type, p_type)\
51             TYPE_TYPE(c_type, xs_type)\
52             static int c_type ## _magic_dup(pTHX_ MAGIC* mg, CLONE_PARAMS* params) {\
53             mg->mg_ptr = (char*)c_type ## _dup((c_type*)mg->mg_ptr);\
54             return 0;\
55             }\
56             static int c_type ## _magic_free(pTHX_ SV* sv, MAGIC* mg) {\
57             c_type ## _free((c_type*)mg->mg_ptr);\
58             return 0;\
59             }\
60             MAGIC_TABLE(xs_type, c_type ## _magic_dup, c_type ## _magic_free)\
61             TYPE_COMMON(c_type, xs_type, p_type)
62              
63             #define COUNTING_TYPE(c_type, xs_type, p_type)\
64             typedef c_type * Crypt__OpenSSL3__ ## xs_type;\
65             static int c_type ## _magic_dup(pTHX_ MAGIC* mg, CLONE_PARAMS* params) {\
66             c_type ## _up_ref((c_type*)mg->mg_ptr);\
67             return 0;\
68             }\
69             static int c_type ## _magic_free(pTHX_ SV* sv, MAGIC* mg) {\
70             c_type ## _free((c_type*)mg->mg_ptr);\
71             return 0;\
72             }\
73             MAGIC_TABLE(xs_type, c_type ## _magic_dup, c_type ## _magic_free)\
74             TYPE_COMMON(c_type, xs_type, p_type)
75              
76             #define SIMPLE_TYPE(c_type, xs_type, p_type, modifier)\
77             TYPE_TYPE(modifier c_type, xs_type)\
78             MAGIC_TABLE(xs_type, NULL, NULL)\
79             TYPE_COMMON(c_type, xs_type, p_type)
80              
81             #if !OPENSSL_VERSION_PREREQ(3, 2)
82 0           static EVP_MD_CTX *EVP_MD_CTX_dup(const EVP_MD_CTX *in) {
83 0           EVP_MD_CTX* result = EVP_MD_CTX_new();
84 0           EVP_MD_CTX_copy(result, in);
85 0           return result;
86             }
87              
88 0           static EVP_CIPHER_CTX *EVP_CIPHER_CTX_dup(const EVP_CIPHER_CTX *in) {
89 0           EVP_CIPHER_CTX* result = EVP_CIPHER_CTX_new();
90 0           EVP_CIPHER_CTX_copy(result, in);
91 0           return result;
92             }
93             #define EVP_RAND_CTX_up_ref(ctx) NULL
94             #endif
95              
96             typedef unsigned long Crypt__OpenSSL3__Error;
97 0 0         COUNTING_TYPE(EVP_RAND, Random, Random)
  0 0          
  0            
  0            
  0            
98 0 0         COUNTING_TYPE(EVP_RAND_CTX, Random__Context, Random::Context)
  0 0          
  0            
  0            
  0            
99 249 0         COUNTING_TYPE(EVP_CIPHER, Cipher, Cipher)
  0 0          
  124            
  125            
  0            
100 2 0         DUPLICATING_TYPE(EVP_CIPHER_CTX, Cipher__Context, Cipher::Context)
  0 0          
  0            
  2            
  0            
101 45 0         COUNTING_TYPE(EVP_MD, MD, MD)
  0 0          
  22            
  23            
  0            
102 3 0         DUPLICATING_TYPE(EVP_MD_CTX, MD__Context, MD::Context)
  0 0          
  0            
  3            
  0            
103 19 0         COUNTING_TYPE(EVP_MAC, MAC, MAC)
  0 0          
  9            
  10            
  0            
104 1 0         DUPLICATING_TYPE(EVP_MAC_CTX, MAC__Context, MAC::Context)
  0 0          
  0            
  1            
  0            
105 25 0         COUNTING_TYPE(EVP_KDF, KDF, KDF)
  0 0          
  12            
  13            
  0            
106 1 0         DUPLICATING_TYPE(EVP_KDF_CTX, KDF__Context, KDF::Context)
  0 0          
  0            
  1            
  0            
107 0 0         COUNTING_TYPE(EVP_SIGNATURE, Signature, Signature)
  0 0          
  0            
  0            
  0            
108 2 0         DUPLICATING_TYPE(EVP_PKEY, PKey, PKey)
  0 0          
  0            
  2            
  0            
109 4 0         DUPLICATING_TYPE(EVP_PKEY_CTX, PKey__Context, PKey::Context)
  0 0          
  0            
  4            
  0            
110              
111             typedef BIGNUM BN;
112 6 50         DUPLICATING_TYPE(BN, BigNum, BigNum);
  6 0          
  0            
  0            
  0            
113             #define BN_CTX_dup(old) BN_CTX_new()
114 0 0         DUPLICATING_TYPE(BN_CTX, BigNum__Context, BigNum::Context)
  0 0          
  0            
  0            
  0            
115              
116 0 0         SIMPLE_TYPE(ASN1_OBJECT, ASN1__Object, ASN1::Object, )
  0 0          
  0            
117 0 0         DUPLICATING_TYPE(ASN1_INTEGER, ASN1__Integer, ASN1::Integer)
  0 0          
  0            
  0            
  0            
118             #define ASN1_ENUMERATED_dup ASN1_INTEGER_dup
119 0 0         DUPLICATING_TYPE(ASN1_ENUMERATED, ASN1__Enumerated, ASN1::Enumerated)
  0 0          
  0            
  0            
  0            
120 0 0         DUPLICATING_TYPE(ASN1_STRING, ASN1__String, ASN1::String)
  0 0          
  0            
  0            
  0            
121 0 0         DUPLICATING_TYPE(ASN1_OCTET_STRING, ASN1__String__Octet, ASN1::String::Octet)
  0 0          
  0            
  0            
  0            
122 0 0         DUPLICATING_TYPE(ASN1_TIME, ASN1__Time, ASN1::Time)
  0 0          
  0            
  0            
  0            
123 0 0         DUPLICATING_TYPE(ASN1_GENERALIZEDTIME, ASN1__Time__Generalized, ASN1::Time::Generalized)
  0 0          
  0            
  0            
  0            
124 0 0         DUPLICATING_TYPE(ASN1_UTCTIME, ASN1__Time__UTC, ASN1::Time::UTC)
  0 0          
  0            
  0            
  0            
125 0 0         DUPLICATING_TYPE(X509, X509, X509)
  0 0          
  0            
  0            
  0            
126 0 0         COUNTING_TYPE(X509_STORE, X509__Store, X509::Store)
  0 0          
  0            
  0            
  0            
127 0 0         DUPLICATING_TYPE(X509_NAME, X509__Name, X509::Name)
  0 0          
  0            
  0            
  0            
128 0 0         DUPLICATING_TYPE(X509_NAME_ENTRY, X509__Name__Entry, X509::Name::Entry)
  0 0          
  0            
  0            
  0            
129 0 0         DUPLICATING_TYPE(X509_ALGOR, X509__Algorithm, X509::Algoritm)
  0 0          
  0            
  0            
  0            
130 0 0         DUPLICATING_TYPE(X509_EXTENSION, X509__Extension, X509::Extension)
  0 0          
  0            
  0            
  0            
131 0 0         SIMPLE_TYPE(X509_VERIFY_PARAM, X509__VerifyParam, X509::VerifyParam, )
  0 0          
  0            
132 0 0         DUPLICATING_TYPE(GENERAL_NAME, X509__GeneralName, X509::GeneralName)
  0 0          
  0            
  0            
  0            
133             typedef long Crypt__OpenSSL3__X509__VerifyResult;
134              
135 2 0         COUNTING_TYPE(BIO, BIO, BIO)
  0 0          
  0            
  2            
  0            
136             #if OPENSSL_VERSION_PREREQ(3, 2)
137             DUPLICATING_TYPE(BIO_ADDR, BIO__Address, BIO::Address)
138             typedef BIO_POLL_DESCRIPTOR* Crypt__OpenSSL3__BIO__PollDescriptor;
139             #endif
140              
141 0 0         SIMPLE_TYPE(SSL_METHOD, SSL__Method, SSL::Method, const)
  0 0          
  0            
142 1 0         COUNTING_TYPE(SSL_CTX, SSL__Context, SSL::Context)
  0 0          
  0            
  1            
  0            
143 2 0         COUNTING_TYPE(SSL, SSL, SSL)
  0 0          
  0            
  2            
  0            
144 0 0         DUPLICATING_TYPE(SSL_SESSION, SSL__Session, SSL::Session)
  0 0          
  0            
  0            
  0            
145 0 0         SIMPLE_TYPE(SSL_CIPHER, SSL__Cipher, SSL::Context, const)
  0 0          
  0            
146              
147             #define PARAMS(a) OSSL_PARAM*
148             #define CTX_PARAMS(a) OSSL_PARAM*
149              
150             #undef OPENSSL_VERSION_TEXT
151             #define OPENSSL_VERSION_TEXT OPENSSL_VERSION
152              
153             #define BIO_new_mem() BIO_new(BIO_s_mem())
154             #define BIO_POLL_DESCRIPTOR_new(class) safecalloc(1, sizeof(BIO_POLL_DESCRIPTOR))
155             #define BIO_POLL_DESCRIPTOR_type(desc) ((desc)->type)
156             #define BIO_POLL_DESCRIPTOR_fd(desc) ((desc)->value.fd)
157              
158             #define BN_generate_prime BN_generate_prime_ex2
159              
160             #define OBJ_get_data OBJ_get0_data
161             #define ASN1_INTEGER_get_BN(ai) ASN1_INTEGER_to_BN(ai, NULL)
162             #define ASN1_INTEGER_set_BN(ai, bn) BN_to_ASN1_INTEGER(bn, ai)
163             #define ASN1_ENUMERATED_set_BN(ai, bn) BN_to_ASN1_ENUMERATED(bn, ai)
164             #define ASN1_ENUMERATED_get_BN(ai) ASN1_ENUMERATED_to_BN(ai, NULL)
165              
166             #define GENERAL_NAME_type(gn) (gn->type)
167              
168             #define X509_read_pem PEM_read_bio_X509
169             #define X509_write_pem PEM_write_bio_X509
170             #define X509_get_tbs_sigalg(c) (X509_ALGOR*)X509_get0_tbs_sigalg(c)
171             #define X509_get_signature X509_get0_signature
172             #define X509_get_subject_key_id(c) (ASN1_OCTET_STRING*)X509_get0_subject_key_id(c)
173             #define X509_get_authority_key_id(c) (ASN1_OCTET_STRING*)X509_get0_authority_key_id(c)
174             #define X509_get_authority_serial(c) (ASN1_INTEGER*)X509_get0_authority_serial(c)
175             #define X509_set_notAfter X509_set1_notAfter
176             #define X509_set_notBefore X509_set1_notBefore
177             #define X509_get_distinguishing_id X509_get0_distinguishing_id
178             #define X509_set_distinguishing_id X509_set0_distinguishing_id
179              
180             #define X509_ALGOR_get X509_ALGOR_get0
181             #define X509_ALGOR_set X509_ALGOR_set0
182             #define X509_verify_cert_error_code(value) value
183             #define X509_verify_cert_ok(value) (value == X509_V_OK)
184             #define X509_VERIFY_PARAM_add_policy X509_VERIFY_PARAM_add0_policy
185             #define X509_VERIFY_PARAM_get_host X509_VERIFY_PARAM_get0_host
186             #define X509_VERIFY_PARAM_set_host X509_VERIFY_PARAM_set1_host
187             #define X509_VERIFY_PARAM_add_host X509_VERIFY_PARAM_add1_host
188             #define X509_VERIFY_PARAM_get_peername X509_VERIFY_PARAM_get0_peername
189             #define X509_VERIFY_PARAM_get_email X509_VERIFY_PARAM_get0_email
190             #define X509_VERIFY_PARAM_set_email X509_VERIFY_PARAM_set1_email
191             #define X509_VERIFY_PARAM_get_ip_asc X509_VERIFY_PARAM_get1_ip_asc
192             #define X509_VERIFY_PARAM_set_ip X509_VERIFY_PARAM_set1_ip
193             #define X509_VERIFY_PARAM_set_ip_asc X509_VERIFY_PARAM_set1_ip_asc
194              
195             #define SSL_Method_TLS TLS_method
196             #define SSL_Method_TLS_server TLS_server_method
197             #define SSL_Method_TLS_client TLS_client_method
198              
199             #define SSL_Method_DTLS DTLS_method
200             #define SSL_Method_DTLS_server DTLS_server_method
201             #define SSL_Method_DTLS_client DTLS_client_method
202              
203             #define SSL_Method_QUIC_client OSSL_QUIC_client_method
204             #define SSL_Method_QUIC_client_thread OSSL_QUIC_client_thread_method
205             #define SSL_Method_QUIC_server OSSL_QUIC_server_method
206              
207             #define SSL_CTX_get_param SSL_CTX_get0_param
208             #define SSL_CTX_set_param SSL_CTX_set1_param
209              
210             #define SSL_set_host SSL_set1_host
211             #define SSL_set_rbio SSL_set0_rbio
212             #define SSL_set_wbio SSL_set0_wbio
213             #define SSL_get_context SSL_get_SSL_CTX
214             #define SSL_get_alpn_selected SSL_get0_alpn_selected
215             #define SSL_get_connection SSL_get0_connection
216             #define SSL_get_listener SSL_get0_listener
217             #define SSL_get_domain SSL_get0_domain
218             #define SSL_set_initial_peer_addr SSL_set1_initial_peer_addr
219             #define SSL_get_param SSL_get0_param
220             #define SSL_set_param SSL_set1_param
221             #if !OPENSSL_VERSION_PREREQ(3, 2)
222             #define SSL_is_tls(s) (!SSL_is_dtls(s))
223             #define SSL_is_quic(s) FALSE
224             #endif
225              
226             #define SSL_SESSION_get_peer SSL_SESSION_get0_peer
227             #define SSL_SESSION_get_alpn_selected SSL_SESSION_get0_alpn_selected
228             #define SSL_SESSION_get_cipher SSL_SESSION_get0_cipher
229             #define SSL_SESSION_get_hostname SSL_SESSION_get0_hostname
230             #define SSL_SESSION_get_id_context SSL_SESSION_get0_id_context
231             #define SSL_SESSION_get_ticket SSL_SESSION_get0_ticket
232             #define SSL_SESSION_set_alpn_selected SSL_SESSION_set1_alpn_selected
233             #define SSL_SESSION_set_hostname SSL_SESSION_set1_hostname
234             #define SSL_SESSION_set_id SSL_SESSION_set1_id
235             #define SSL_SESSION_set_id_context SSL_SESSION_set1_id_context
236             #if !OPENSSL_VERSION_PREREQ(3,2)
237             #define SSL_get_event_timeout(s, tv, inf) DTLSv1_get_timeout(s, tv)
238             #define SSL_handle_events DTLSv1_handle_timeout
239             #endif
240             #if OPENSSL_VERSION_PREREQ(3, 3)
241             #define SSL_SESSION_get_time SSL_SESSION_get_time_ex
242             #define SSL_SESSION_set_time SSL_SESSION_set_time_ex
243             #endif
244              
245              
246             #define SSL_CIPHER_get_handshake_digest(c) (EVP_MD*)SSL_CIPHER_get_handshake_digest(c)
247              
248             #define RAND_get_primary RAND_get0_primary
249             #define RAND_get_public RAND_get0_public
250             #define RAND_get_private RAND_get0_private
251             #define RAND_set_public RAND_set0_public
252             #define RAND_set_private RAND_set0_private
253             #define EVP_RAND_get_name EVP_RAND_get0_name
254             #define EVP_RAND_get_description EVP_RAND_get0_description
255             #define EVP_RAND_CTX_get_rand EVP_RAND_CTX_get0_rand
256             #define EVP_CIPHER_get_name EVP_CIPHER_get0_name
257             #define EVP_CIPHER_get_description EVP_CIPHER_get0_description
258             #undef EVP_CIPHER_CTX_init
259             #define EVP_CIPHER_CTX_init EVP_CipherInit_ex2
260             #define EVP_CIPHER_CTX_update EVP_CipherUpdate
261             #define EVP_CIPHER_CTX_final EVP_CipherFinal_ex
262             #define EVP_CIPHER_CTX_set_aead_ivlen(ctx, length) EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, length, NULL)
263             #define EVP_CIPHER_CTX_get_aead_tag(ctx, ptr, length) EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, length, ptr)
264             #define EVP_CIPHER_CTX_set_aead_tag(ctx, ptr, length) EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, length, ptr)
265             #define EVP_CIPHER_CTX_get_name EVP_CIPHER_CTX_get0_name
266             #define EVP_CIPHER_CTX_get_cipher EVP_CIPHER_CTX_get1_cipher
267              
268             #define EVP_MD_digest EVP_Digest
269             #define EVP_MD_get_name EVP_MD_get0_name
270             #define EVP_MD_get_description EVP_MD_get0_description
271             #undef EVP_MD_CTX_init
272             #define EVP_MD_CTX_get_md EVP_MD_CTX_get1_md
273             #define EVP_MD_CTX_get_name EVP_MD_CTX_get0_name
274             #define EVP_MD_CTX_init EVP_DigestInit_ex2
275             #define EVP_MD_CTX_update EVP_DigestUpdate
276             #define EVP_MD_CTX_final EVP_DigestFinal_ex
277             #define EVP_MD_CTX_final_xof EVP_DigestFinalXOF
278             #define EVP_MD_CTX_squeeze EVP_DigestSqueeze
279             #define EVP_MD_CTX_sign_init EVP_DigestSignInit
280             #define EVP_MD_CTX_sign_init_ex EVP_DigestSignInit_ex
281             #define EVP_MD_CTX_sign_update EVP_DigestSignUpdate
282             #define EVP_MD_CTX_sign_final EVP_DigestSignFinal
283             #define EVP_MD_CTX_sign EVP_DigestSign
284             #define EVP_MD_CTX_verify_init EVP_DigestVerifyInit
285             #define EVP_MD_CTX_verify_update EVP_DigestVerifyUpdate
286             #define EVP_MD_CTX_verify_final EVP_DigestVerifyFinal
287             #define EVP_MD_CTX_verify EVP_DigestVerify
288              
289             #define EVP_MAC_get_name EVP_MAC_get0_name
290             #define EVP_MAC_get_description EVP_MAC_get0_description
291             #define EVP_MAC_CTX_get_mac EVP_MAC_CTX_get0_mac
292             #define EVP_MAC_CTX_get_name EVP_MAC_CTX_get0_name
293              
294             #define EVP_KDF_get_name EVP_KDF_get0_name
295             #define EVP_KDF_get_description EVP_KDF_get0_description
296             #define EVP_KDF_CTX_get_name EVP_KDF_CTX_get0_name
297             #define EVP_KDF_CTX_kdf(ctx) (EVP_KDF*)EVP_KDF_CTX_kdf(ctx)
298              
299             #define EVP_SIGNATURE_get_name EVP_SIGNATURE_get0_name
300             #define EVP_SIGNATURE_get_description EVP_SIGNATURE_get0_description
301              
302             #define EVP_PKEY_read_pem_private_key PEM_read_bio_PrivateKey_ex
303             #define EVP_PKEY_write_pem_private_key PEM_write_bio_PrivateKey_ex
304             #define EVP_PKEY_read_pem_public_key PEM_read_bio_PUBKEY_ex
305             #define EVP_PKEY_write_pem_public_key PEM_write_bio_PUBKEY_ex
306             #define EVP_PKEY_new_raw_private_key EVP_PKEY_new_raw_private_key_ex
307             #define EVP_PKEY_new_raw_public_key EVP_PKEY_new_raw_public_key_ex
308             #define EVP_PKEY_get_description EVP_PKEY_get0_description
309             #define EVP_PKEY_get_type_name EVP_PKEY_get0_type_name
310             #define EVP_PKEY_get_encoded_public_key EVP_PKEY_get1_encoded_public_key
311             #define EVP_PKEY_set_encoded_public_key EVP_PKEY_set1_encoded_public_key
312             #define EVP_PKEY_encrypt_init EVP_PKEY_encrypt_init_ex
313             #define EVP_PKEY_decrypt_init EVP_PKEY_decrypt_init_ex
314             #define EVP_PKEY_derive_init EVP_PKEY_derive_init_ex
315             #define EVP_PKEY_derive_set_peer EVP_PKEY_derive_set_peer_ex
316             #define EVP_PKEY_CTX_add_hkdf_info EVP_PKEY_CTX_add1_hkdf_info
317             #define EVP_PKEY_CTX_set_hkdf_salt EVP_PKEY_CTX_set1_hkdf_salt
318             #define EVP_PKEY_CTX_set_hkdf_key EVP_PKEY_CTX_set1_hkdf_key
319             #define EVP_PKEY_CTX_get_dh_kdf_oid EVP_PKEY_CTX_get0_dh_kdf_oid
320             #define EVP_PKEY_CTX_set_dh_kdf_oid EVP_PKEY_CTX_set0_dh_kdf_oid
321             #define EVP_PKEY_CTX_get_rsa_oaep_label EVP_PKEY_CTX_get0_rsa_oaep_label
322             #define EVP_PKEY_CTX_set_rsa_oaep_label EVP_PKEY_CTX_set0_rsa_oaep_label
323             #define EVP_PKEY_CTX_set_id EVP_PKEY_CTX_set1_id
324              
325             #if !OPENSSL_VERSION_PREREQ(3, 4)
326 0           static int EVP_PKEY_sign_init_ex2(EVP_PKEY_CTX *ctx, EVP_SIGNATURE *algo, const OSSL_PARAM params[]) {
327 0 0         if (algo)
328 0           return FALSE;
329 0           return EVP_PKEY_sign_init_ex(ctx, params);
330             }
331              
332 0           static int EVP_PKEY_verify_init_ex2(EVP_PKEY_CTX *ctx, EVP_SIGNATURE *algo, const OSSL_PARAM params[]) {
333 0 0         if (algo)
334 0           return FALSE;
335 0           return EVP_PKEY_verify_init_ex(ctx, params);
336             }
337             #endif
338             #define EVP_PKEY_sign_init EVP_PKEY_sign_init_ex2
339             #define EVP_PKEY_verify_init EVP_PKEY_verify_init_ex2
340              
341             #define CONSTANT2(PREFIX, VALUE) newCONSTSUB(stash, #VALUE, newSVuv(PREFIX##VALUE))
342              
343 12           static unsigned char* S_make_buffer(pTHX_ SV** retval, size_t size) {
344 12           *retval = newSVpv("", 0);
345 12 50         char* ptr = SvGROW(*retval, size);
    100          
346 12           return (unsigned char*)ptr;
347             }
348             #define make_buffer(svp, size) S_make_buffer(aTHX_ svp, size)
349              
350 1           static char* S_grow_buffer(pTHX_ SV* buffer, size_t size) {
351 1 50         SvUPGRADE(buffer, SVt_PV);
352 1 50         SV_CHECK_THINKFIRST(buffer);
353 1 50         return SvGROW(buffer, size);
    50          
354             }
355             #define grow_buffer(sv, size) S_grow_buffer(aTHX_ sv, size)
356              
357 13           static inline void S_set_buffer_length(pTHX_ SV* buffer, ssize_t result) {
358 13           SvCUR_set(buffer, result);
359 13           SvPOK_only(buffer);
360 13           }
361             #define set_buffer_length(buffer, result) S_set_buffer_length(aTHX_ buffer, result)
362              
363 7           static OSSL_PARAM* S_params_for(pTHX_ const OSSL_PARAM* settable, SV* input) {
364 7 50         if (!SvROK(input) || SvTYPE(SvRV(input)) != SVt_PVHV)
    50          
365 0           return NULL;
366              
367 7           OSSL_PARAM_BLD* builder = OSSL_PARAM_BLD_new();
368 7           HV* hash = (HV*)SvRV(input);
369              
370 7           hv_iterinit(hash);
371             char* name;
372             I32 name_len;
373             SV* sv;
374              
375 19 100         while (sv = hv_iternextsv(hash, &name, &name_len)) {
376 12           const OSSL_PARAM* found = OSSL_PARAM_locate_const(settable, name);
377              
378 12 100         if (found) {
379             const BIGNUM* big;
380 11 50         if (found->data_type == OSSL_PARAM_INTEGER) {
381 0 0         if (big = get_BN(aTHX_ sv))
382 0           OSSL_PARAM_BLD_push_BN(builder, found->key, big);
383             else
384 0           OSSL_PARAM_BLD_push_int64(builder, found->key, SvIV(sv));
385 11 100         } else if (found->data_type == OSSL_PARAM_UNSIGNED_INTEGER) {
386 6 50         if (big = get_BN(aTHX_ sv))
387 0           OSSL_PARAM_BLD_push_BN(builder, found->key, big);
388             else
389 6           OSSL_PARAM_BLD_push_uint64(builder, found->key, SvUV(sv));
390 5 50         } else if (found->data_type == OSSL_PARAM_REAL) {
391 0           OSSL_PARAM_BLD_push_double(builder, found->key, SvNV(sv));
392 5 100         } else if (found->data_type == OSSL_PARAM_UTF8_STRING) {
393             STRLEN length;
394 4           const char* ptr = SvPVutf8(sv, length);
395 4           OSSL_PARAM_BLD_push_utf8_string(builder, found->key, ptr, length);
396 1 50         } else if (found->data_type == OSSL_PARAM_OCTET_STRING) {
397             STRLEN length;
398 1           const char* ptr = SvPVbyte(sv, length);
399 1           OSSL_PARAM_BLD_push_octet_string(builder, found->key, ptr, length);
400             }
401             }
402             }
403              
404 7           OSSL_PARAM* result = OSSL_PARAM_BLD_to_param(builder);
405 7           OSSL_PARAM_BLD_free(builder);
406 7           SAVEDESTRUCTOR(OSSL_PARAM_free, result);
407 7           return result;
408             }
409             #define params_for(settable, sv) S_params_for(aTHX_ settable, sv)
410              
411 1           static SV* S_make_param_scalar(pTHX_ OSSL_PARAM* iter) {
412 1 50         if (iter->data_type == OSSL_PARAM_INTEGER) {
413 0 0         if (iter->data_size == 0)
414 0           return newSViv(0);
415 0 0         else if (iter->data_size <= IVSIZE) {
416             int64_t value;
417 0           OSSL_PARAM_get_int64(iter, &value);
418 0           return newSViv(value);
419             } else {
420 0           BIGNUM* value = NULL;
421 0           OSSL_PARAM_get_BN(iter, &value);
422 0           return make_BN(aTHX_ value);
423             }
424             }
425 1 50         else if (iter->data_type == OSSL_PARAM_UNSIGNED_INTEGER) {
426 1 50         if (iter->data_size == 0)
427 0           return newSVuv(0);
428 1 50         else if (iter->data_size <= UVSIZE) {
429 1           uint64_t value = 0;
430 1           OSSL_PARAM_get_uint64(iter, &value);
431 1           return newSVuv(value);
432             } else {
433 0           BIGNUM* value = NULL;
434 0           OSSL_PARAM_get_BN(iter, &value);
435 0           return make_BN(aTHX_ value);
436             }
437             }
438 0 0         else if (iter->data_type == OSSL_PARAM_REAL) {
439             double value;
440 0           OSSL_PARAM_get_double(iter, &value);
441 0           return newSVnv(value);
442             }
443 0 0         else if (iter->data_type == OSSL_PARAM_UTF8_STRING) {
444 0           return newSVpvn_utf8((const char*)iter->data, iter->data_size, 1);
445             }
446 0 0         else if (iter->data_type == OSSL_PARAM_OCTET_STRING) {
447 0           return newSVpvn((const char*)iter->data, iter->data_size);
448             }
449              
450 0           return NULL;
451             }
452             #define make_param_scalar(params) S_make_param_scalar(aTHX_ params)
453              
454             #define GENERATE_GET_PARAM(prefix, arg, name)\
455             RETVAL = &PL_sv_undef;\
456             const OSSL_PARAM* description = OSSL_PARAM_locate_const(prefix ## _gettable_params(arg), name);\
457             if (description) {\
458             OSSL_PARAM params[] = {\
459             OSSL_PARAM_DEFN(description->key, description->data_type, NULL, SIZE_MAX),\
460             OSSL_PARAM_END,\
461             };\
462             if (prefix ## _get_params(arg, params)) {\
463             if (OSSL_PARAM_modified(params)) {\
464             params->data = OPENSSL_zalloc(params->return_size);\
465             params->data_size = params->return_size;\
466             }\
467             if (prefix ## _get_params(arg, params))\
468             RETVAL = make_param_scalar(params);\
469             }\
470             }
471              
472             #ifdef MULTIPLICITY
473             #define iTHX aTHX
474             #else
475             #define iTHX NULL
476             #endif
477              
478 0           static void EVP_name_callback(const char* name, void* vdata) {
479             dTHXa((PerlInterpreter*)vdata);
480 0           dSP;
481 0 0         mXPUSHp(name, strlen(name));
482 0           PUTBACK;
483 0           }
484              
485             #define DEFINE_PROVIDED_CALLBACK(c_type)\
486             static void c_type ## _provided_callback(c_type* provided, void* vdata) {\
487             dTHXa((PerlInterpreter*)vdata);\
488             c_type ## _up_ref(provided);\
489             SV* object = make_ ## c_type(aTHX_ provided);\
490             dSP;\
491             mXPUSHs(object);\
492             PUTBACK;\
493             }
494 0 0         DEFINE_PROVIDED_CALLBACK(EVP_RAND)
495 124 50         DEFINE_PROVIDED_CALLBACK(EVP_CIPHER)
496 22 50         DEFINE_PROVIDED_CALLBACK(EVP_MD)
497 9 50         DEFINE_PROVIDED_CALLBACK(EVP_MAC)
498 12 50         DEFINE_PROVIDED_CALLBACK(EVP_KDF)
499 0 0         DEFINE_PROVIDED_CALLBACK(EVP_SIGNATURE)
500              
501             typedef int Bool;
502             typedef int Success;
503             typedef int PrintRet;
504             #define undef &PL_sv_undef
505              
506             // This will force byte semantics on all strings
507             // This should come as the last thing in the C section of this file
508             #undef SvPV
509             #define SvPV(sv, len) SvPVbyte(sv, len)
510             #undef SvPV_nolen
511             #define SvPV_nolen(sv) SvPVbyte_nolen(sv)
512              
513             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3 PREFIX = OpenSSL_
514              
515             REQUIRE: 3.60
516              
517             PROTOTYPES: DISABLE
518              
519             TYPEMAP: <
520             const unsigned char* T_PV
521             Bool T_BOOL
522             struct timeval T_TIMEVAL
523             int64_t T_IV
524             uint32_t T_UV
525             uint64_t T_UV
526             Success T_SUCCESS
527             PrintRet T_PRINT
528              
529             Crypt::OpenSSL3::Random T_MAGICEXT
530             Crypt::OpenSSL3::Random::Context T_MAGICEXT
531             Crypt::OpenSSL3::Cipher T_MAGICEXT
532             Crypt::OpenSSL3::Cipher::Context T_MAGICEXT
533             Crypt::OpenSSL3::MD T_MAGICEXT
534             Crypt::OpenSSL3::MD::Context T_MAGICEXT
535             Crypt::OpenSSL3::MAC T_MAGICEXT
536             Crypt::OpenSSL3::MAC::Context T_MAGICEXT
537             Crypt::OpenSSL3::KDF T_MAGICEXT
538             Crypt::OpenSSL3::KDF::Context T_MAGICEXT
539             Crypt::OpenSSL3::Signature T_MAGICEXT
540             Crypt::OpenSSL3::PKey T_MAGICEXT
541             Crypt::OpenSSL3::PKey::Context T_MAGICEXT
542              
543             Crypt::OpenSSL3::BIO T_MAGICEXT
544             Crypt::OpenSSL3::BIO::Address T_MAGICEXT
545             Crypt::OpenSSL3::BIO::PollDescriptor T_MAGICBUF
546             Crypt::OpenSSL3::Error T_INTOBJ
547              
548             Crypt::OpenSSL3::BigNum T_MAGICEXT
549             Crypt::OpenSSL3::BigNum::Context T_MAGICEXT
550              
551             Crypt::OpenSSL3::ASN1::Object T_MAGICEXT
552             Crypt::OpenSSL3::ASN1::Integer T_MAGICEXT
553             Crypt::OpenSSL3::ASN1::Enumerated T_MAGICEXT
554             Crypt::OpenSSL3::ASN1::String T_MAGICEXT
555             Crypt::OpenSSL3::ASN1::String::Octet T_MAGICEXT
556             Crypt::OpenSSL3::ASN1::String::UTF8 T_MAGICEXT
557             Crypt::OpenSSL3::ASN1::Time T_MAGICEXT
558             Crypt::OpenSSL3::ASN1::Time::Generalized T_MAGICEXT
559             Crypt::OpenSSL3::ASN1::Time::UTC T_MAGICEXT
560              
561             Crypt::OpenSSL3::X509 T_MAGICEXT
562             Crypt::OpenSSL3::X509::Store T_MAGICEXT
563             Crypt::OpenSSL3::X509::Name T_MAGICEXT
564             Crypt::OpenSSL3::X509::Name::Entry T_MAGICEXT
565             Crypt::OpenSSL3::X509::Algorithm T_MAGICEXT
566             Crypt::OpenSSL3::X509::VerifyResult T_INTOBJ
567             Crypt::OpenSSL3::X509::GeneralName T_MAGICEXT
568             Crypt::OpenSSL3::X509::Extension T_MAGICEXT
569             Crypt::OpenSSL3::X509::VerifyParam T_MAGICEXT
570              
571             Crypt::OpenSSL3::SSL::Method T_MAGICEXT
572             Crypt::OpenSSL3::SSL::Context T_MAGICEXT
573             Crypt::OpenSSL3::SSL T_MAGICEXT
574             Crypt::OpenSSL3::SSL::Session T_MAGICEXT
575             Crypt::OpenSSL3::SSL::Cipher T_MAGICEXT
576              
577             PARAMS(EVP_RAND_CTX) T_PARAMS
578             PARAMS(EVP_CIPHER_CTX) T_PARAMS
579             CTX_PARAMS(EVP_CIPHER) T_CTX_PARAMS
580             PARAMS(EVP_MD_CTX) T_PARAMS
581             CTX_PARAMS(EVP_MD) T_CTX_PARAMS
582             PARAMS(EVP_MAC_CTX) T_PARAMS
583             PARAMS(EVP_KDF_CTX) T_PARAMS
584             PARAMS(EVP_PKEY) T_PARAMS
585             PARAMS(EVP_PKEY_CTX) T_PARAMS
586             CTX_PARAMS(EVP_SIGNATURE) T_CTX_PARAMS
587              
588             INPUT
589             T_PARAMS
590             const OSSL_PARAM* settable = ${ (my $settable = $type) =~ s/ PARAMS \( (\w+) \) /$1_settable_params(ctx)/x; \$settable };
591             $var = params_for(settable, $arg);
592              
593             T_CTX_PARAMS
594             const OSSL_PARAM* settable = ${ (my $settable = $type) =~ s/ CTX_PARAMS \( (\w+) \) /$1_settable_ctx_params(type)/x; \$settable };
595             $var = params_for(settable, $arg);
596              
597             OUTPUT
598             T_TIMEVAL
599             sv_setnv($arg, $var.tv_sec + $var.tv_usec / 1000000.0);
600             T_SUCCESS
601             ${"$var" eq "RETVAL" ? \"$arg = $var < 0 ? &PL_sv_undef : boolSV($var);" : \"sv_setsv($arg, $var < 0 ? &PL_sv_undef : boolSV($var));"}
602             T_PRINT
603             ${"$var" eq "RETVAL" ? \"$arg = $var < 0 ? &PL_sv_undef : newSViv($var);" : \"if ($var < 0) sv_setsv($arg, &PL_sv_undef); else sv_setiv($arg, $var);"}
604             T_PV
605             sv_setpv((SV*)$arg, (const char*)$var);
606             END
607              
608             BOOT:
609             {
610 47           HV* stash = gv_stashpvs("Crypt::OpenSSL3::", GV_ADD | GV_ADDMULTI);
611 47           CONSTANT2(OPENSSL_, VERSION_STRING);
612 47           CONSTANT2(OPENSSL_, VERSION_TEXT);
613 47           CONSTANT2(OPENSSL_, FULL_VERSION_STRING);
614 47           CONSTANT2(OPENSSL_, CFLAGS);
615 47           CONSTANT2(OPENSSL_, BUILT_ON);
616 47           CONSTANT2(OPENSSL_, PLATFORM);
617 47           CONSTANT2(OPENSSL_, DIR);
618 47           CONSTANT2(OPENSSL_, ENGINES_DIR);
619 47           CONSTANT2(OPENSSL_, MODULES_DIR);
620 47           CONSTANT2(OPENSSL_, CPU_INFO);
621 47           CONSTANT2(OPENSSL_, INFO_CONFIG_DIR);
622 47           CONSTANT2(OPENSSL_, INFO_ENGINES_DIR);
623 47           CONSTANT2(OPENSSL_, INFO_MODULES_DIR);
624 47           CONSTANT2(OPENSSL_, INFO_DSO_EXTENSION);
625 47           CONSTANT2(OPENSSL_, INFO_DIR_FILENAME_SEPARATOR);
626 47           CONSTANT2(OPENSSL_, INFO_LIST_SEPARATOR);
627 47           CONSTANT2(OPENSSL_, INFO_CPU_SETTINGS);
628             #if OPENSSL_VERSION_PREREQ(3, 4)
629             CONSTANT2(OPENSSL_, WINCTX);
630             CONSTANT2(OPENSSL_, INFO_WINDOWS_CONTEXT);
631             #endif
632             }
633              
634             const char *OpenSSL_version(int t = OPENSSL_VERSION_STRING)
635              
636             unsigned long OpenSSL_version_num()
637              
638             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3 PREFIX = OPENSSL_
639              
640             unsigned int OPENSSL_version_major()
641              
642             unsigned int OPENSSL_version_minor()
643              
644             unsigned int OPENSSL_version_patch()
645              
646             const char *OPENSSL_version_pre_release()
647              
648             const char *OPENSSL_version_build_metadata()
649              
650             const char *OPENSSL_info(int t)
651              
652             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3 PREFIX = ERR_
653              
654             Crypt::OpenSSL3::Error ERR_get_error()
655              
656             Crypt::OpenSSL3::Error ERR_peek_error()
657              
658             void ERR_clear_error()
659              
660             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::Error PREFIX = ERR_
661              
662             SV* ERR_error_string(unsigned long e, size_t length = 64)
663             CODE:
664 0           char* ptr = (char*)make_buffer(&RETVAL, length);
665 0           ERR_error_string_n(e, ptr, length);
666 0           set_buffer_length(RETVAL, strlen(ptr));
667             OUTPUT: RETVAL
668              
669             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::BIO PREFIX = BIO_
670              
671             Crypt::OpenSSL3::BIO BIO_new_file(SV* classname, const char *filename, const char *mode)
672             C_ARGS: filename, mode
673              
674             Crypt::OpenSSL3::BIO BIO_new_fd(class, int fd, bool close_flag = FALSE)
675             INTERFACE: BIO_new_fd BIO_new_socket BIO_new_dgram
676             C_ARGS: fd, close_flag
677              
678             NO_OUTPUT int BIO_new_bio_pair(SV* classname, OUTLIST Crypt::OpenSSL3::BIO bio1, size_t writebuf1, OUTLIST Crypt::OpenSSL3::BIO bio2, size_t writebuf2);
679             C_ARGS: &bio1, writebuf1, &bio2, writebuf2
680             POSTCALL:
681 1 50         if (!RETVAL)
682 0           XSRETURN_EMPTY;
683              
684             Crypt::OpenSSL3::BIO BIO_new_mem(class)
685             C_ARGS:
686              
687             bool BIO_reset(Crypt::OpenSSL3::BIO b)
688              
689             int BIO_seek(Crypt::OpenSSL3::BIO b, int ofs)
690              
691             int BIO_tell(Crypt::OpenSSL3::BIO b)
692              
693             bool BIO_flush(Crypt::OpenSSL3::BIO b)
694              
695             bool BIO_eof(Crypt::OpenSSL3::BIO b)
696              
697             bool BIO_set_close(Crypt::OpenSSL3::BIO b, bool flag)
698              
699             bool BIO_get_close(Crypt::OpenSSL3::BIO b)
700              
701             int BIO_pending(Crypt::OpenSSL3::BIO b)
702              
703             int BIO_wpending(Crypt::OpenSSL3::BIO b)
704              
705             size_t BIO_ctrl_pending(Crypt::OpenSSL3::BIO b)
706              
707             size_t BIO_ctrl_wpending(Crypt::OpenSSL3::BIO b)
708              
709             NO_OUTPUT int BIO_read(Crypt::OpenSSL3::BIO b, OUTLIST SV* out, int size)
710             INTERFACE: BIO_read BIO_gets BIO_get_line
711             INIT:
712 0           unsigned char* ptr = make_buffer(&out, size);
713             C_ARGS: b, ptr, size
714             POSTCALL:
715 0 0         if (RETVAL >= 0)
716 0           set_buffer_length(out, RETVAL);
717              
718             int BIO_write(Crypt::OpenSSL3::BIO b, const char *data, int length(data))
719              
720             bool BIO_get_ktls_send(Crypt::OpenSSL3::BIO b)
721              
722             bool BIO_get_ktls_recv(Crypt::OpenSSL3::BIO b)
723              
724             #if OPENSSL_VERSION_PREREQ(3, 2)
725             bool BIO_get_rpoll_descriptor(Crypt::OpenSSL3::BIO b, Crypt::OpenSSL3::BIO::PollDescriptor desc)
726              
727             bool BIO_get_wpoll_descriptor(Crypt::OpenSSL3::BIO b, Crypt::OpenSSL3::BIO::PollDescriptor desc)
728             #endif
729              
730              
731             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::BIO::Address PREFIX = BIO_ADDR_
732              
733             #if OPENSSL_VERSION_PREREQ(3, 2)
734              
735             Crypt::OpenSSL3::BIO::Address BIO_ADDR_new()
736              
737             bool BIO_ADDR_copy(Crypt::OpenSSL3::BIO::Address dst, Crypt::OpenSSL3::BIO::Address src)
738              
739             Crypt::OpenSSL3::BIO::Address BIO_ADDR_dup(Crypt::OpenSSL3::BIO::Address ap)
740              
741             void BIO_ADDR_clear(Crypt::OpenSSL3::BIO::Address ap)
742              
743             bool BIO_ADDR_rawmake(Crypt::OpenSSL3::BIO::Address ap, int family, const char *where, size_t length(where), unsigned short port)
744              
745             int BIO_ADDR_family(Crypt::OpenSSL3::BIO::Address ap)
746              
747             SV* BIO_ADDR_rawaddress(Crypt::OpenSSL3::BIO::Address ap)
748             CODE:
749             size_t length = 0;
750             if (BIO_ADDR_rawaddress(ap, NULL, &length)) {
751             unsigned char* ptr = make_buffer(&RETVAL, length);
752             if (BIO_ADDR_rawaddress(ap, ptr, &length))
753             set_buffer_length(RETVAL, length);
754             } else
755             RETVAL = &PL_sv_undef;
756             OUTPUT: RETVAL
757              
758             unsigned short BIO_ADDR_rawport(Crypt::OpenSSL3::BIO::Address ap)
759              
760             char *BIO_ADDR_hostname_string(Crypt::OpenSSL3::BIO::Address ap, int numeric)
761             INTERFACE:
762             BIO_ADDR_hostname_string BIO_ADDR_service_string BIO_ADDR_path_string
763             CLEANUP:
764             OPENSSL_free(RETVAL);
765              
766             #endif
767              
768             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::BIO::PollDescriptor PREFIX = BIO_POLL_DESCRIPTOR_
769             BOOT:
770             {
771             #if OPENSSL_VERSION_PREREQ(3, 2)
772             HV* stash = gv_stashpvs("Crypt::OpenSSL3::BIO::PollDescriptor", GV_ADD | GV_ADDMULTI);
773             CONSTANT2(BIO_POLL_DESCRIPTOR_, TYPE_NONE);
774             CONSTANT2(BIO_POLL_DESCRIPTOR_, TYPE_SOCK_FD);
775             CONSTANT2(BIO_POLL_DESCRIPTOR_, CUSTOM_START);
776             #endif
777             }
778              
779             #if OPENSSL_VERSION_PREREQ(3, 2)
780             Crypt::OpenSSL3::BIO::PollDescriptor BIO_POLL_DESCRIPTOR_new(class)
781              
782             int BIO_POLL_DESCRIPTOR_type(Crypt::OpenSSL3::BIO::PollDescriptor desc)
783              
784             int BIO_POLL_DESCRIPTOR_fd(Crypt::OpenSSL3::BIO::PollDescriptor desc)
785             #endif
786              
787             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::BigNum PREFIX = BN_
788              
789             BOOT:
790             {
791 47           HV* stash = gv_stashpvs("Crypt::OpenSSL3::BigNum", GV_ADD | GV_ADDMULTI);
792 47           CONSTANT2(BN_, RAND_TOP_ANY);
793 47           CONSTANT2(BN_, RAND_TOP_ONE);
794 47           CONSTANT2(BN_, RAND_TOP_TWO);
795              
796 47           CONSTANT2(BN_, RAND_BOTTOM_ANY);
797 47           CONSTANT2(BN_, RAND_BOTTOM_ODD);
798             }
799              
800              
801             Crypt::OpenSSL3::BigNum BN_new(SV* classname)
802             INTERFACE: BN_new BN_secure_new
803             C_ARGS:
804              
805             Crypt::OpenSSL3::BigNum BN_dup(Crypt::OpenSSL3::BigNum self)
806              
807             bool BN_copy(Crypt::OpenSSL3::BigNum self, Crypt::OpenSSL3::BigNum other)
808              
809             void BN_clear(Crypt::OpenSSL3::BigNum a)
810              
811             bool BN_add(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum b)
812              
813             bool BN_sub(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum b)
814              
815             bool BN_mul(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum b, Crypt::OpenSSL3::BigNum::Context ctx)
816              
817             bool BN_sqr(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum::Context ctx)
818              
819             bool BN_div(Crypt::OpenSSL3::BigNum dv, Crypt::OpenSSL3::BigNum rem, Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum d, Crypt::OpenSSL3::BigNum::Context ctx)
820              
821             bool BN_mod(Crypt::OpenSSL3::BigNum rem, Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum m, Crypt::OpenSSL3::BigNum::Context ctx)
822              
823             bool BN_nnmod(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum m, Crypt::OpenSSL3::BigNum::Context ctx)
824              
825             bool BN_mod_add(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum b, Crypt::OpenSSL3::BigNum m, Crypt::OpenSSL3::BigNum::Context ctx)
826              
827             bool BN_mod_sub(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum b, Crypt::OpenSSL3::BigNum m, Crypt::OpenSSL3::BigNum::Context ctx)
828              
829             bool BN_mod_mul(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum b, Crypt::OpenSSL3::BigNum m, Crypt::OpenSSL3::BigNum::Context ctx)
830              
831             bool BN_mod_sqr(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum m, Crypt::OpenSSL3::BigNum::Context ctx)
832              
833             bool BN_mod_sqrt(Crypt::OpenSSL3::BigNum in, Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum p, Crypt::OpenSSL3::BigNum::Context ctx)
834              
835             bool BN_exp(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum p, Crypt::OpenSSL3::BigNum::Context ctx)
836              
837             bool BN_mod_exp(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum p, Crypt::OpenSSL3::BigNum m, Crypt::OpenSSL3::BigNum::Context ctx)
838              
839             bool BN_gcd(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum b, Crypt::OpenSSL3::BigNum::Context ctx)
840              
841             int BN_num_bytes(Crypt::OpenSSL3::BigNum a)
842              
843             int BN_num_bits(Crypt::OpenSSL3::BigNum a)
844              
845             NO_OUTPUT int BN_bn2bin(Crypt::OpenSSL3::BigNum a, OUTLIST SV* out)
846             INIT:
847 0           unsigned char* ptr = make_buffer(&out, BN_num_bytes(a));
848             C_ARGS: a, ptr
849             POSTCALL:
850 0           set_buffer_length(out, RETVAL);
851              
852             NO_OUTPUT int BN_bn2binpad(Crypt::OpenSSL3::BigNum a, OUTLIST SV* out, int tolen = BN_num_bytes(a))
853             INTERFACE: BN_bn2binpad BN_bn2lebinpad BN_bn2nativepad
854             INIT:
855 0           unsigned char* ptr = make_buffer(&out, tolen);
856             C_ARGS: a, ptr, tolen
857             POSTCALL:
858 0 0         if (RETVAL >= 0)
859 0           set_buffer_length(out, RETVAL);
860              
861             Crypt::OpenSSL3::BigNum BN_bin2bn(const unsigned char *s, int length(s))
862             C_ARGS: s, XSauto_length_of_s, NULL
863              
864              
865             NO_OUTPUT int BN_bn2lebinpad(Crypt::OpenSSL3::BigNum a, OUTLIST SV* out, int tolen)
866             INIT:
867 0           unsigned char* ptr = make_buffer(&out, tolen);
868             C_ARGS: a, ptr, tolen
869             POSTCALL:
870 0 0         if (RETVAL >= 0)
871 0           set_buffer_length(out, RETVAL);
872              
873             Crypt::OpenSSL3::BigNum BN_lebin2bn(const unsigned char *s, int length(s))
874             C_ARGS: s, XSauto_length_of_s, NULL
875              
876              
877             NO_OUTPUT int BN_bn2nativepad(Crypt::OpenSSL3::BigNum a, OUTLIST SV* out, int tolen)
878             INIT:
879 0           unsigned char* ptr = make_buffer(&out, tolen);
880             C_ARGS: a, ptr, tolen
881             POSTCALL:
882 0 0         if (RETVAL >= 0)
883 0           set_buffer_length(out, RETVAL);
884              
885             Crypt::OpenSSL3::BigNum BN_native2bn(const unsigned char *s, int length(s))
886             C_ARGS: s, XSauto_length_of_s, NULL
887              
888             #if OPENSSL_VERSION_PREREQ(3, 2)
889             NO_OUTPUT int BN_signed_bn2lebin(Crypt::OpenSSL3::BigNum a, OUTLIST SV* out, int tolen = BN_num_bytes(a))
890             INTERFACE: BN_signed_bn2bin BN_signed_bn2lebin BN_signed_bn2native
891             INIT:
892             unsigned char* ptr = make_buffer(&out, tolen);
893             C_ARGS: a, ptr, tolen
894             POSTCALL:
895             if (RETVAL >= 0)
896             set_buffer_length(out, RETVAL);
897              
898             Crypt::OpenSSL3::BigNum BN_signed_bin2bn(const unsigned char *s, int length(s))
899             C_ARGS: s, XSauto_length_of_s, NULL
900              
901             Crypt::OpenSSL3::BigNum BN_signed_lebin2bn(const unsigned char *s, int length(s))
902             C_ARGS: s, XSauto_length_of_s, NULL
903              
904              
905             NO_OUTPUT int BN_signed_bn2native(Crypt::OpenSSL3::BigNum a, OUTLIST SV* out, int tolen)
906             INIT:
907             unsigned char* ptr = make_buffer(&out, tolen);
908             C_ARGS: a, ptr, tolen
909             POSTCALL:
910             if (RETVAL >= 0)
911             set_buffer_length(out, RETVAL);
912              
913             Crypt::OpenSSL3::BigNum BN_signed_native2bn(const unsigned char *s, int length(s))
914             C_ARGS: s, XSauto_length_of_s, NULL
915             #endif
916              
917             char *BN_bn2hex(Crypt::OpenSSL3::BigNum a)
918             INTERFACE: BN_bn2hex BN_bn2dec
919             CLEANUP:
920 0           OPENSSL_free(RETVAL);
921              
922             int BN_hex2bn(Crypt::OpenSSL3::BigNum a, const char *str)
923             INTERFACE: BN_hex2bn BN_dec2bn
924             C_ARGS: &a, str
925              
926             bool BN_print(Crypt::OpenSSL3::BIO fp, Crypt::OpenSSL3::BigNum a)
927              
928              
929             NO_OUTPUT int BN_bn2mpi(Crypt::OpenSSL3::BigNum a, OUTLIST SV* out)
930             INIT:
931 0           unsigned char* ptr = make_buffer(&out, BN_bn2mpi(a, NULL));
932             C_ARGS: a, ptr
933             POSTCALL:
934 0           set_buffer_length(out, RETVAL);
935              
936             Crypt::OpenSSL3::BigNum BN_mpi2bn(unsigned char *s, int len)
937             C_ARGS: s, len, NULL
938              
939             bool BN_check_prime(Crypt::OpenSSL3::BigNum p, Crypt::OpenSSL3::BigNum::Context ctx)
940             C_ARGS: p, ctx, NULL
941              
942             bool BN_generate_prime(Crypt::OpenSSL3::BigNum ret, int bits, int safe, Crypt::OpenSSL3::BigNum add, Crypt::OpenSSL3::BigNum rem, Crypt::OpenSSL3::BigNum::Context ctx)
943             C_ARGS: ret, bits, safe, add, rem, NULL, ctx
944              
945             bool BN_set_word(Crypt::OpenSSL3::BigNum a, UV w)
946              
947             UV BN_get_word(Crypt::OpenSSL3::BigNum a)
948              
949             bool BN_add_word(Crypt::OpenSSL3::BigNum a, UV w)
950              
951             bool BN_sub_word(Crypt::OpenSSL3::BigNum a, UV w)
952              
953             bool BN_mul_word(Crypt::OpenSSL3::BigNum a, UV w)
954              
955             UV BN_div_word(Crypt::OpenSSL3::BigNum a, UV w)
956              
957             UV BN_mod_word(Crypt::OpenSSL3::BigNum a, UV w)
958              
959             int BN_cmp(Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum b)
960              
961             int BN_ucmp(Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum b)
962              
963             bool BN_is_zero(Crypt::OpenSSL3::BigNum a)
964              
965             bool BN_is_one(Crypt::OpenSSL3::BigNum a)
966              
967             bool BN_is_word(Crypt::OpenSSL3::BigNum a, UV w)
968              
969             bool BN_abs_is_word(Crypt::OpenSSL3::BigNum a, UV w)
970              
971             bool BN_is_odd(Crypt::OpenSSL3::BigNum a)
972              
973             #if OPENSSL_VERSION_PREREQ(3, 2)
974             bool BN_are_coprime(Crypt::OpenSSL3::BigNum a, Crypt::OpenSSL3::BigNum b, Crypt::OpenSSL3::BigNum::Context ctx);
975             #endif
976              
977             bool BN_clear_bit(Crypt::OpenSSL3::BigNum a, int n)
978              
979             bool BN_is_bit_set(Crypt::OpenSSL3::BigNum a, int n)
980              
981             bool BN_mask_bits(Crypt::OpenSSL3::BigNum a, int n)
982              
983             bool BN_lshift(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a, int n)
984              
985             bool BN_lshift1(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a)
986              
987             bool BN_rshift(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a, int n)
988              
989             bool BN_rshift1(Crypt::OpenSSL3::BigNum r, Crypt::OpenSSL3::BigNum a)
990              
991             bool BN_rand_ex(Crypt::OpenSSL3::BigNum rnd, int bits, int top, int bottom, unsigned int strength, Crypt::OpenSSL3::BigNum::Context ctx)
992              
993             bool BN_rand(Crypt::OpenSSL3::BigNum rnd, int bits, int top, int bottom)
994              
995              
996             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::BigNum::Context PREFIX = BN_CTX_
997              
998             Crypt::OpenSSL3::BigNum::Context BN_CTX_new(SV* classname)
999             INTERFACE: BN_CTX_new BN_CTX_secure_new
1000             C_ARGS:
1001              
1002              
1003             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::ASN1::Object PREFIX = OBJ_
1004              
1005             int OBJ_create(class, const char *oid, const char *sn, const char *ln)
1006             C_ARGS: oid, sn, ln
1007             POSTCALL:
1008 0 0         if (RETVAL == NID_undef)
1009 0           XSRETURN_UNDEF;
1010              
1011             Crypt::OpenSSL3::ASN1::Object OBJ_txt2obj(const char *s, bool no_name = FALSE)
1012              
1013             Crypt::OpenSSL3::ASN1::Object OBJ_nid2obj(int n)
1014              
1015             int OBJ_cmp(Crypt::OpenSSL3::ASN1::Object a, Crypt::OpenSSL3::ASN1::Object b)
1016              
1017             int OBJ_obj2nid(Crypt::OpenSSL3::ASN1::Object o)
1018              
1019             size_t OBJ_length(Crypt::OpenSSL3::ASN1::Object obj)
1020              
1021             const unsigned char *OBJ_get_data(Crypt::OpenSSL3::ASN1::Object obj)
1022              
1023             SV* OBJ_obj2txt(Crypt::OpenSSL3::ASN1::Object a, bool no_name = FALSE)
1024             CODE:
1025 0           int buf_len = OBJ_obj2txt(NULL, 0, a, no_name);
1026 0 0         if (buf_len > 0) {
1027 0           char* ptr = make_buffer(&RETVAL, buf_len);
1028 0 0         if (OBJ_obj2txt(ptr, buf_len, a, no_name) > 0)
1029 0           set_buffer_length(RETVAL, buf_len);
1030             }
1031             OUTPUT: RETVAL
1032              
1033             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::ASN1::Integer PREFIX = ASN1_INTEGER_
1034              
1035             Crypt::OpenSSL3::ASN1::Integer ASN1_INTEGER_new()
1036             C_ARGS:
1037              
1038             NO_OUTPUT int ASN1_INTEGER_get_int64(Crypt::OpenSSL3::ASN1::Integer a, OUTLIST int64_t pr)
1039             C_ARGS: &pr, a
1040             POSTCALL:
1041 0 0         if (!RETVAL)
1042 0           XSRETURN_UNDEF;
1043              
1044             bool ASN1_INTEGER_set_int64(Crypt::OpenSSL3::ASN1::Integer a, int64_t r)
1045              
1046             NO_OUTPUT int ASN1_INTEGER_get_uint64(Crypt::OpenSSL3::ASN1::Integer a, OUTLIST uint64_t pr)
1047             C_ARGS: &pr, a
1048             POSTCALL:
1049 0 0         if (!RETVAL)
1050 0           XSRETURN_UNDEF;
1051              
1052             bool ASN1_INTEGER_set_uint64(Crypt::OpenSSL3::ASN1::Integer a, uint64_t r)
1053              
1054             Crypt::OpenSSL3::BigNum ASN1_INTEGER_get_BN(Crypt::OpenSSL3::ASN1::Integer ai)
1055              
1056             bool ASN1_INTEGER_set_BN(Crypt::OpenSSL3::ASN1::Integer ai, Crypt::OpenSSL3::BigNum bn)
1057              
1058             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::ASN1::Enumerated PREFIX = ASN1_ENUMERATED_
1059              
1060             Crypt::OpenSSL3::ASN1::Enumerated ASN1_ENUMERATED_new()
1061             C_ARGS:
1062              
1063             NO_OUTPUT int ASN1_ENUMERATED_get_int64(Crypt::OpenSSL3::ASN1::Enumerated a, OUTLIST int64_t pr)
1064             C_ARGS: &pr, a
1065             POSTCALL:
1066 0 0         if (!RETVAL)
1067 0           XSRETURN_UNDEF;
1068              
1069             bool ASN1_ENUMERATED_set_int64(Crypt::OpenSSL3::ASN1::Enumerated a, int64_t r)
1070              
1071             bool ASN1_ENUMERATED_set_BN(Crypt::OpenSSL3::ASN1::Integer ai, Crypt::OpenSSL3::BigNum bn)
1072              
1073             Crypt::OpenSSL3::BigNum ASN1_ENUMERATED_get_BN(Crypt::OpenSSL3::ASN1::Enumerated ai)
1074              
1075             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::ASN1::String PREFIX = ASN1_STRING_
1076              
1077             BOOT:
1078             {
1079 47           HV* stash = gv_stashpvs("Crypt::OpenSSL3::ASN1::String", GV_ADD | GV_ADDMULTI);
1080 47           CONSTANT2(ASN1_STR, FLGS_ESC_2253);
1081 47           CONSTANT2(ASN1_STR, FLGS_ESC_CTRL);
1082 47           CONSTANT2(ASN1_STR, FLGS_ESC_MSB);
1083 47           CONSTANT2(ASN1_STR, FLGS_UTF8_CONVERT);
1084 47           CONSTANT2(ASN1_STR, FLGS_IGNORE_TYPE);
1085 47           CONSTANT2(ASN1_STR, FLGS_SHOW_TYPE);
1086 47           CONSTANT2(ASN1_STR, FLGS_DUMP_ALL);
1087 47           CONSTANT2(ASN1_STR, FLGS_DUMP_UNKNOWN);
1088 47           CONSTANT2(ASN1_STR, FLGS_DUMP_DER);
1089 47           CONSTANT2(ASN1_STR, FLGS_ESC_2254);
1090 47           CONSTANT2(ASN1_STR, FLGS_RFC2253);
1091             }
1092              
1093             int ASN1_STRING_length(Crypt::OpenSSL3::ASN1::String x)
1094              
1095             SV* ASN1_STRING_get_data(Crypt::OpenSSL3::ASN1::String x)
1096             CODE:
1097 0           const char* data = ASN1_STRING_get0_data(x);
1098 0           int length = ASN1_STRING_length(x);
1099 0           RETVAL = newSVpvn(data, length);
1100             OUTPUT: RETVAL
1101              
1102             Crypt::OpenSSL3::ASN1::String ASN1_STRING_dup(Crypt::OpenSSL3::ASN1::String a)
1103              
1104             int ASN1_STRING_cmp(Crypt::OpenSSL3::ASN1::String a, Crypt::OpenSSL3::ASN1::String b)
1105              
1106             int ASN1_STRING_set(Crypt::OpenSSL3::ASN1::String str, const char *data, int length(data))
1107              
1108             int ASN1_STRING_type(Crypt::OpenSSL3::ASN1::String x)
1109              
1110             SV* ASN1_STRING_to_UTF8(Crypt::OpenSSL3::ASN1::String in)
1111             CODE:
1112 0           unsigned char* out = NULL;
1113 0           int result = ASN1_STRING_to_UTF8(&out, in);
1114 0 0         if (result > 0) {
1115 0           RETVAL = newSVpvn_utf8(out, result, 1);
1116 0           OPENSSL_free(out);
1117             } else
1118 0           RETVAL = &PL_sv_undef;
1119             OUTPUT: RETVAL
1120              
1121             bool ASN1_STRING_print(Crypt::OpenSSL3::BIO out, Crypt::OpenSSL3::ASN1::String str)
1122              
1123             PrintRet ASN1_STRING_print_ex(Crypt::OpenSSL3::BIO out, Crypt::OpenSSL3::ASN1::String str, unsigned long flags)
1124              
1125             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::ASN1::String::Octet PREFIX = ASN1_OCTET_STRING_
1126              
1127             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::ASN1::Time PREFIX = ASN1_TIME_
1128              
1129             Crypt::OpenSSL3::ASN1::Time ASN1_TIME_new(class)
1130             C_ARGS:
1131              
1132             Crypt::OpenSSL3::ASN1::Time ASN1_TIME_dup(Crypt::OpenSSL3::ASN1::Time t);
1133              
1134             bool ASN1_TIME_set(Crypt::OpenSSL3::ASN1::Time s, time_t t)
1135              
1136             bool ASN1_TIME_adj(Crypt::OpenSSL3::ASN1::Time s, time_t t, int offset_day, long offset_sec)
1137              
1138             bool ASN1_TIME_set_string(Crypt::OpenSSL3::ASN1::Time s, const char *str)
1139              
1140             bool ASN1_TIME_set_string_X509(Crypt::OpenSSL3::ASN1::Time s, const char *str)
1141              
1142             bool ASN1_TIME_normalize(Crypt::OpenSSL3::ASN1::Time s)
1143              
1144             bool ASN1_TIME_check(Crypt::OpenSSL3::ASN1::Time t)
1145              
1146             bool ASN1_TIME_print(Crypt::OpenSSL3::BIO b, Crypt::OpenSSL3::ASN1::Time s)
1147              
1148             PrintRet ASN1_TIME_print_ex(Crypt::OpenSSL3::BIO bp, Crypt::OpenSSL3::ASN1::Time tm, unsigned long flags)
1149              
1150             NO_OUTPUT bool ASN1_TIME_diff(Crypt::OpenSSL3::ASN1::Time from, Crypt::OpenSSL3::ASN1::Time to, OUTLIST int pday, OUTLIST int psec)
1151             C_ARGS: &pday, &psec, from, to
1152             POSTCALL:
1153 0 0         if (!RETVAL)
1154 0           XSRETURN_EMPTY;
1155              
1156             int ASN1_TIME_compare(Crypt::OpenSSL3::ASN1::Time a, Crypt::OpenSSL3::ASN1::Time b)
1157             POSTCALL:
1158 0 0         if (RETVAL == -2)
1159 0           XSRETURN_UNDEF;
1160              
1161             void ASN1_TIME_to_tm(Crypt::OpenSSL3::ASN1::Time s)
1162             PPCODE:
1163             struct tm tm;
1164 0 0         if (ASN1_TIME_to_tm(s, &tm)) {
1165 0 0         EXTEND(SP, 9);
1166 0           mPUSHi(tm.tm_sec);
1167 0           mPUSHi(tm.tm_min);
1168 0           mPUSHi(tm.tm_hour);
1169 0           mPUSHi(tm.tm_mday);
1170 0           mPUSHi(tm.tm_mon);
1171 0           mPUSHi(tm.tm_year);
1172 0           mPUSHi(tm.tm_wday);
1173 0           mPUSHi(tm.tm_yday);
1174 0           mPUSHi(tm.tm_isdst);
1175             }
1176              
1177             Crypt::OpenSSL3::ASN1::Time::Generalized ASN1_TIME_to_generalizedtime(Crypt::OpenSSL3::ASN1::Time t)
1178             C_ARGS: t, NULL
1179             POSTCALL:
1180 0 0         if (!RETVAL)
1181 0           XSRETURN_UNDEF;
1182              
1183              
1184             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::ASN1::Time PREFIX = X509_
1185              
1186             int X509_cmp_time(Crypt::OpenSSL3::ASN1::Time asn1_time, time_t in_tm)
1187             C_ARGS: asn1_time, &in_tm
1188              
1189             int X509_cmp_current_time(Crypt::OpenSSL3::ASN1::Time asn1_time)
1190              
1191             int X509_cmp_timeframe(Crypt::OpenSSL3::ASN1::Time start, Crypt::OpenSSL3::ASN1::Time end, Crypt::OpenSSL3::X509::VerifyParam vpm)
1192             C_ARGS: vpm, start, end
1193              
1194             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::ASN1::Time::Generalized PREFIX = ASN1_GENERALIZEDTIME_
1195              
1196             Crypt::OpenSSL3::ASN1::Time::Generalized ASN1_GENERALIZEDTIME_new(class)
1197             C_ARGS:
1198              
1199             Crypt::OpenSSL3::ASN1::Time::Generalized ASN1_GENERALIZEDTIME_dup(Crypt::OpenSSL3::ASN1::Time::Generalized t);
1200              
1201             bool ASN1_GENERALIZEDTIME_set(Crypt::OpenSSL3::ASN1::Time::Generalized s, time_t t)
1202              
1203             bool ASN1_GENERALIZEDTIME_adj(Crypt::OpenSSL3::ASN1::Time::Generalized s, time_t t, int offset_day, long offset_sec)
1204              
1205             bool ASN1_GENERALIZEDTIME_set_string(Crypt::OpenSSL3::ASN1::Time::Generalized s, const char *str)
1206              
1207             bool ASN1_GENERALIZEDTIME_check(Crypt::OpenSSL3::ASN1::Time::Generalized t)
1208              
1209             bool ASN1_GENERALIZEDTIME_print(Crypt::OpenSSL3::BIO b, Crypt::OpenSSL3::ASN1::Time::Generalized s)
1210              
1211              
1212             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::ASN1::Time::UTC PREFIX = ASN1_UTCTIME_
1213              
1214             Crypt::OpenSSL3::ASN1::Time::UTC ASN1_UTCTIME_new(class)
1215             C_ARGS:
1216              
1217             Crypt::OpenSSL3::ASN1::Time::UTC ASN1_UTCTIME_dup(Crypt::OpenSSL3::ASN1::Time::UTC t);
1218              
1219             bool ASN1_UTCTIME_set(Crypt::OpenSSL3::ASN1::Time::UTC s, time_t t)
1220              
1221             bool ASN1_UTCTIME_adj(Crypt::OpenSSL3::ASN1::Time::UTC s, time_t t, int offset_day, long offset_sec)
1222              
1223             bool ASN1_UTCTIME_set_string(Crypt::OpenSSL3::ASN1::Time::UTC s, const char *str)
1224              
1225             int ASN1_UTCTIME_cmp_time_t(Crypt::OpenSSL3::ASN1::Time::UTC s, time_t t)
1226              
1227             bool ASN1_UTCTIME_check(Crypt::OpenSSL3::ASN1::Time::UTC t)
1228              
1229             bool ASN1_UTCTIME_print(Crypt::OpenSSL3::BIO b, Crypt::OpenSSL3::ASN1::Time::UTC s)
1230              
1231              
1232             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::X509 PREFIX = X509_
1233              
1234             BOOT:
1235             {
1236 47           HV* stash = gv_stashpvs("Crypt::OpenSSL3::X509", GV_ADD | GV_ADDMULTI);
1237 47           CONSTANT2(X509_, CHECK_FLAG_ALWAYS_CHECK_SUBJECT);
1238 47           CONSTANT2(X509_, CHECK_FLAG_NEVER_CHECK_SUBJECT);
1239 47           CONSTANT2(X509_, CHECK_FLAG_NO_WILDCARDS);
1240 47           CONSTANT2(X509_, CHECK_FLAG_NO_PARTIAL_WILDCARDS);
1241 47           CONSTANT2(X509_, CHECK_FLAG_MULTI_LABEL_WILDCARDS);
1242 47           CONSTANT2(X509_, CHECK_FLAG_SINGLE_LABEL_SUBDOMAINS);
1243             }
1244              
1245             Crypt::OpenSSL3::X509 X509_new(class)
1246             C_ARGS:
1247              
1248             Crypt::OpenSSL3::X509 X509_dup(Crypt::OpenSSL3::X509 self)
1249              
1250             Crypt::OpenSSL3::X509 X509_read_pem(class, Crypt::OpenSSL3::BIO bio)
1251             C_ARGS: bio, NULL, NULL, NULL
1252             POSTCALL:
1253 0 0         if (!RETVAL)
1254 0           XSRETURN_UNDEF;
1255              
1256             bool X509_write_pem(Crypt::OpenSSL3::X509 x, Crypt::OpenSSL3::BIO bio)
1257             C_ARGS: bio, x
1258              
1259             const char *X509_get_default_cert_file(class)
1260             C_ARGS:
1261              
1262             const char *X509_get_default_cert_dir(class)
1263             C_ARGS:
1264              
1265             const char *X509_get_default_cert_file_env(class)
1266             C_ARGS:
1267              
1268             const char *X509_get_default_cert_dir_env(class)
1269             C_ARGS:
1270              
1271             bool X509_sign(Crypt::OpenSSL3::X509 x, Crypt::OpenSSL3::PKey pkey, Crypt::OpenSSL3::MD md)
1272              
1273             bool X509_sign_ctx(Crypt::OpenSSL3::X509 x, Crypt::OpenSSL3::MD::Context ctx)
1274              
1275             bool X509_verify(Crypt::OpenSSL3::X509 x, Crypt::OpenSSL3::PKey pkey)
1276              
1277             bool X509_self_signed(Crypt::OpenSSL3::X509 cert, bool verify_signature)
1278              
1279             Crypt::OpenSSL3::PKey X509_get_pubkey(Crypt::OpenSSL3::X509 x)
1280              
1281             bool X509_set_pubkey(Crypt::OpenSSL3::X509 x, Crypt::OpenSSL3::PKey pkey);
1282              
1283             long X509_get_version(Crypt::OpenSSL3::X509 x)
1284              
1285             bool X509_set_version(Crypt::OpenSSL3::X509 x, long version)
1286              
1287             void X509_get_signature(Crypt::OpenSSL3::X509 x, OUTLIST Crypt::OpenSSL3::ASN1::String::Octet psig, OUTLIST Crypt::OpenSSL3::X509::Algorithm palg)
1288             C_ARGS: (const ASN1_BIT_STRING**)&psig, (const X509_ALGOR**)&palg, x
1289             POSTCALL:
1290 0           psig = ASN1_STRING_dup(psig);
1291 0           palg = X509_ALGOR_dup(palg);
1292              
1293             int X509_get_signature_nid(Crypt::OpenSSL3::X509 x)
1294              
1295             Crypt::OpenSSL3::X509::Algorithm X509_get_tbs_sigalg(Crypt::OpenSSL3::X509 x)
1296             POSTCALL:
1297 0           RETVAL = X509_ALGOR_dup(RETVAL);
1298              
1299             Crypt::OpenSSL3::ASN1::Time X509_get_notBefore(Crypt::OpenSSL3::X509 x)
1300             POSTCALL:
1301 0           RETVAL = ASN1_TIME_dup(RETVAL);
1302              
1303             Crypt::OpenSSL3::ASN1::Time X509_get_notAfter(Crypt::OpenSSL3::X509 x)
1304             POSTCALL:
1305 0           RETVAL = ASN1_TIME_dup(RETVAL);
1306              
1307             bool X509_set_notBefore(Crypt::OpenSSL3::X509 x, Crypt::OpenSSL3::ASN1::Time tm)
1308              
1309             bool X509_set_notAfter(Crypt::OpenSSL3::X509 x, Crypt::OpenSSL3::ASN1::Time tm)
1310              
1311             Crypt::OpenSSL3::X509::Name X509_get_subject_name(Crypt::OpenSSL3::X509 x)
1312             INTERFACE:
1313             X509_get_subject_name X509_get_issuer_name
1314             POSTCALL:
1315 0           RETVAL = X509_NAME_dup(RETVAL);
1316              
1317             bool X509_set_subject_name(Crypt::OpenSSL3::X509 x, Crypt::OpenSSL3::X509::Name name)
1318              
1319             bool X509_set_issuer_name(Crypt::OpenSSL3::X509 x, Crypt::OpenSSL3::X509::Name name)
1320              
1321             unsigned long X509_subject_name_hash(Crypt::OpenSSL3::X509 x)
1322              
1323             unsigned long X509_issuer_name_hash(Crypt::OpenSSL3::X509 x)
1324              
1325             NO_OUTPUT Bool X509_digest(Crypt::OpenSSL3::X509 data, Crypt::OpenSSL3::MD type, OUTLIST SV* digest)
1326             INTERFACE: X509_digest X509_pubkey_digest
1327             INIT:
1328 0           unsigned int output_length = EVP_MD_size(type);
1329 0           unsigned char* ptr = make_buffer(&digest, output_length);
1330             C_ARGS: data, type, ptr, &output_length
1331             POSTCALL:
1332 0 0         if (RETVAL)
1333 0           set_buffer_length(digest, output_length);
1334              
1335             Crypt::OpenSSL3::ASN1::String::Octet X509_digest_sig(Crypt::OpenSSL3::X509 cert)
1336             C_ARGS: cert, NULL, NULL
1337              
1338             Crypt::OpenSSL3::ASN1::String::Octet X509_get_distinguishing_id(Crypt::OpenSSL3::X509 x)
1339              
1340             void X509_set_distinguishing_id(Crypt::OpenSSL3::X509 x, Crypt::OpenSSL3::ASN1::String::Octet distid)
1341              
1342             bool X509_check_ca(Crypt::OpenSSL3::X509 cert)
1343              
1344             bool X509_check_host(Crypt::OpenSSL3::X509 cert, const char *name, size_t length(name), unsigned int flags, OUTLIST char *peername)
1345              
1346             bool X509_check_email(Crypt::OpenSSL3::X509 cert, const char *address, size_t length(address), unsigned int flags)
1347              
1348             bool X509_check_ip(Crypt::OpenSSL3::X509 cert, const unsigned char *address, size_t length(address), unsigned int flags)
1349              
1350             bool X509_check_ip_asc(Crypt::OpenSSL3::X509 cert, const char *address, unsigned int flags)
1351              
1352             bool X509_check_issued(Crypt::OpenSSL3::X509 issuer, Crypt::OpenSSL3::X509 subject)
1353              
1354             bool X509_check_private_key(Crypt::OpenSSL3::X509 cert, Crypt::OpenSSL3::PKey pkey)
1355              
1356             int X509_cmp(Crypt::OpenSSL3::X509 a, Crypt::OpenSSL3::X509 b)
1357              
1358             int X509_issuer_and_serial_cmp(Crypt::OpenSSL3::X509 a, Crypt::OpenSSL3::X509 b)
1359              
1360             int X509_issuer_name_cmp(Crypt::OpenSSL3::X509 a, Crypt::OpenSSL3::X509 b)
1361              
1362             int X509_subject_name_cmp(Crypt::OpenSSL3::X509 a, Crypt::OpenSSL3::X509 b)
1363              
1364             long X509_get_pathlen(Crypt::OpenSSL3::X509 x)
1365              
1366             uint32_t X509_get_extension_flags(Crypt::OpenSSL3::X509 x)
1367              
1368             uint32_t X509_get_key_usage(Crypt::OpenSSL3::X509 x)
1369              
1370             uint32_t X509_get_extended_key_usage(Crypt::OpenSSL3::X509 x)
1371              
1372             Crypt::OpenSSL3::ASN1::String::Octet X509_get_subject_key_id(Crypt::OpenSSL3::X509 x)
1373             POSTCALL:
1374 0           RETVAL = ASN1_OCTET_STRING_dup(RETVAL);
1375              
1376             Crypt::OpenSSL3::ASN1::String::Octet X509_get_authority_key_id(Crypt::OpenSSL3::X509 x)
1377             POSTCALL:
1378 0           RETVAL = ASN1_OCTET_STRING_dup(RETVAL);
1379              
1380             #if 0
1381             Crypt::OpenSSL3::X509::GeneralName X509_get0_authority_issuer(Crypt::OpenSSL3::X509 x)
1382             #endif
1383              
1384             Crypt::OpenSSL3::ASN1::Integer X509_get_authority_serial(Crypt::OpenSSL3::X509 x)
1385             POSTCALL:
1386 0           RETVAL = ASN1_INTEGER_dup(RETVAL);
1387              
1388             void X509_set_proxy_flag(Crypt::OpenSSL3::X509 x)
1389              
1390             void X509_set_proxy_pathlen(Crypt::OpenSSL3::X509 x, int l)
1391              
1392             long X509_get_proxy_pathlen(Crypt::OpenSSL3::X509 x)
1393              
1394             int X509_get_ext_count(Crypt::OpenSSL3::X509 x)
1395              
1396             Crypt::OpenSSL3::X509::Extension X509_get_ext(Crypt::OpenSSL3::X509 x, int loc)
1397              
1398             int X509_get_ext_by_NID(Crypt::OpenSSL3::X509 x, int nid, int lastpos = -1)
1399              
1400             int X509_get_ext_by_OBJ(Crypt::OpenSSL3::X509 x, Crypt::OpenSSL3::ASN1::Object obj, int lastpos = -1)
1401              
1402             int X509_get_ext_by_critical(Crypt::OpenSSL3::X509 x, int crit, int lastpos = -1)
1403              
1404             Crypt::OpenSSL3::X509::Extension X509_delete_ext(Crypt::OpenSSL3::X509 x, int loc)
1405              
1406             int X509_add_ext(Crypt::OpenSSL3::X509 x, Crypt::OpenSSL3::X509::Extension ex, int loc = -1)
1407              
1408             Crypt::OpenSSL3::ASN1::Integer X509_get_serialNumber(Crypt::OpenSSL3::X509 x)
1409              
1410             bool X509_set_serialNumber(Crypt::OpenSSL3::X509 x, Crypt::OpenSSL3::ASN1::Integer serial)
1411              
1412              
1413             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::X509::VerifyParam PREFIX = X509_VERIFY_PARAM_
1414              
1415             bool X509_VERIFY_PARAM_set_flags(Crypt::OpenSSL3::X509::VerifyParam param, unsigned long flags)
1416              
1417             bool X509_VERIFY_PARAM_clear_flags(Crypt::OpenSSL3::X509::VerifyParam param, unsigned long flags)
1418              
1419             unsigned long X509_VERIFY_PARAM_get_flags(Crypt::OpenSSL3::X509::VerifyParam param)
1420              
1421             bool X509_VERIFY_PARAM_set_inh_flags(Crypt::OpenSSL3::X509::VerifyParam param, uint32_t flags)
1422              
1423             uint32_t X509_VERIFY_PARAM_get_inh_flags(Crypt::OpenSSL3::X509::VerifyParam param)
1424              
1425             bool X509_VERIFY_PARAM_set_purpose(Crypt::OpenSSL3::X509::VerifyParam param, int purpose)
1426              
1427             #if OPENSSL_VERSION_PREREQ(3, 5)
1428             int X509_VERIFY_PARAM_get_purpose(Crypt::OpenSSL3::X509::VerifyParam param)
1429             #endif
1430              
1431             bool X509_VERIFY_PARAM_set_trust(Crypt::OpenSSL3::X509::VerifyParam param, int trust)
1432              
1433             void X509_VERIFY_PARAM_set_time(Crypt::OpenSSL3::X509::VerifyParam param, time_t t)
1434              
1435             time_t X509_VERIFY_PARAM_get_time(Crypt::OpenSSL3::X509::VerifyParam param)
1436              
1437             bool X509_VERIFY_PARAM_add_policy(Crypt::OpenSSL3::X509::VerifyParam param, Crypt::OpenSSL3::ASN1::Object policy)
1438             C_ARGS: param, (ASN1_OBJECT*)policy
1439              
1440             #if 0
1441             bool X509_VERIFY_PARAM_set1_policies(Crypt::OpenSSL3::X509::VerifyParam param, Crypt::OpenSSL3::ASN1::Object policies)
1442             #endif
1443              
1444             void X509_VERIFY_PARAM_set_depth(Crypt::OpenSSL3::X509::VerifyParam param, int depth)
1445              
1446             int X509_VERIFY_PARAM_get_depth(Crypt::OpenSSL3::X509::VerifyParam param)
1447              
1448             void X509_VERIFY_PARAM_set_auth_level(Crypt::OpenSSL3::X509::VerifyParam param, int auth_level)
1449              
1450             int X509_VERIFY_PARAM_get_auth_level(Crypt::OpenSSL3::X509::VerifyParam param)
1451              
1452             char *X509_VERIFY_PARAM_get_host(Crypt::OpenSSL3::X509::VerifyParam param, int n)
1453              
1454             bool X509_VERIFY_PARAM_set_host(Crypt::OpenSSL3::X509::VerifyParam param, const char *name, size_t length(name))
1455              
1456             bool X509_VERIFY_PARAM_add_host(Crypt::OpenSSL3::X509::VerifyParam param, const char *name, size_t length(name))
1457              
1458             void X509_VERIFY_PARAM_set_hostflags(Crypt::OpenSSL3::X509::VerifyParam param, unsigned int flags)
1459              
1460             unsigned int X509_VERIFY_PARAM_get_hostflags(Crypt::OpenSSL3::X509::VerifyParam param)
1461              
1462             char *X509_VERIFY_PARAM_get_peername(Crypt::OpenSSL3::X509::VerifyParam param)
1463              
1464             char *X509_VERIFY_PARAM_get_email(Crypt::OpenSSL3::X509::VerifyParam param)
1465              
1466             bool X509_VERIFY_PARAM_set_email(Crypt::OpenSSL3::X509::VerifyParam param, const char *email, size_t length(email))
1467              
1468             char *X509_VERIFY_PARAM_get_ip_asc(Crypt::OpenSSL3::X509::VerifyParam param)
1469             CLEANUP:
1470 0           OPENSSL_free(RETVAL);
1471              
1472             bool X509_VERIFY_PARAM_set_ip(Crypt::OpenSSL3::X509::VerifyParam param, const unsigned char *ip, size_t length(ip))
1473              
1474             bool X509_VERIFY_PARAM_set_ip_asc(Crypt::OpenSSL3::X509::VerifyParam param, const char *ipasc)
1475              
1476              
1477             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::X509::GeneralName PREFIX = GENERAL_NAME_
1478              
1479             Crypt::OpenSSL3::X509::GeneralName GENERAL_NAME_dup(Crypt::OpenSSL3::X509::GeneralName gn)
1480              
1481             int GENERAL_NAME_type(Crypt::OpenSSL3::X509::GeneralName gn)
1482              
1483             SV* GENERAL_NAME_to_string(Crypt::OpenSSL3::X509::GeneralName gn)
1484             CODE:
1485 0 0         switch (gn->type) {
1486 0           case GEN_OTHERNAME: {
1487 0           ASN1_UTF8STRING* str = gn->d.otherName->value->value.utf8string;
1488 0           RETVAL = newSVpvn(ASN1_STRING_get0_data(str), ASN1_STRING_length(str));
1489 0           break;
1490             }
1491 0           default:
1492 0           RETVAL = &PL_sv_undef;
1493             }
1494             OUTPUT: RETVAL
1495              
1496              
1497             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::X509::Algorithm PREFIX = X509_ALGOR_
1498              
1499             Crypt::OpenSSL3::X509::Algorithm X509_ALGOR_dup(Crypt::OpenSSL3::X509::Algorithm alg)
1500              
1501             bool X509_ALGOR_set(Crypt::OpenSSL3::X509::Algorithm alg, Crypt::OpenSSL3::ASN1::Object aobj)
1502             C_ARGS: alg, (ASN1_OBJECT*)aobj, V_ASN1_UNDEF, NULL
1503              
1504             void X509_ALGOR_get(Crypt::OpenSSL3::X509::Algorithm alg, OUTLIST Crypt::OpenSSL3::ASN1::Object paobj)
1505             C_ARGS: (const ASN1_OBJECT**)&paobj, NULL, NULL, alg
1506              
1507             void X509_ALGOR_set_md(Crypt::OpenSSL3::X509::Algorithm alg, Crypt::OpenSSL3::MD md)
1508              
1509             int X509_ALGOR_cmp(Crypt::OpenSSL3::X509::Algorithm a, Crypt::OpenSSL3::X509::Algorithm b)
1510              
1511             bool X509_ALGOR_copy(Crypt::OpenSSL3::X509::Algorithm dest, Crypt::OpenSSL3::X509::Algorithm src)
1512              
1513             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::X509::Attribute PREFIX = X509_ATTRIBUTE_
1514              
1515              
1516             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::X509::Extension PREFIX = X509_EXTENSION_
1517              
1518             Crypt::OpenSSL3::X509::Extension X509_EXTENSION_dup(Crypt::OpenSSL3::X509::Extension ex)
1519              
1520             bool X509_EXTENSION_set_object(Crypt::OpenSSL3::X509::Extension ex, Crypt::OpenSSL3::ASN1::Object obj)
1521              
1522             bool X509_EXTENSION_set_critical(Crypt::OpenSSL3::X509::Extension ex, bool crit)
1523              
1524             bool X509_EXTENSION_set_data(Crypt::OpenSSL3::X509::Extension ex, Crypt::OpenSSL3::ASN1::String::Octet data)
1525              
1526             Crypt::OpenSSL3::X509::Extension X509_EXTENSION_create_by_NID(int nid, bool crit, Crypt::OpenSSL3::ASN1::String::Octet data)
1527             C_ARGS: NULL, nid, crit, data
1528              
1529             Crypt::OpenSSL3::X509::Extension X509_EXTENSION_create_by_OBJ(Crypt::OpenSSL3::ASN1::Object obj, bool crit, Crypt::OpenSSL3::ASN1::String::Octet data)
1530             C_ARGS: NULL, obj, crit, data
1531              
1532             Crypt::OpenSSL3::ASN1::Object X509_EXTENSION_get_object(Crypt::OpenSSL3::X509::Extension ex)
1533              
1534             bool X509_EXTENSION_get_critical(Crypt::OpenSSL3::X509::Extension ex)
1535              
1536             Crypt::OpenSSL3::ASN1::String::Octet X509_EXTENSION_get_data(Crypt::OpenSSL3::X509::Extension ne)
1537              
1538              
1539             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::X509::VerifyResult PREFIX = X509_verify_cert_
1540              
1541             IV X509_verify_cert_error_code(Crypt::OpenSSL3::X509::VerifyResult result)
1542              
1543             bool X509_verify_cert_ok(Crypt::OpenSSL3::X509::VerifyResult result)
1544              
1545             const char* X509_verify_cert_error_string(Crypt::OpenSSL3::X509::VerifyResult result)
1546              
1547             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::X509::Name PREFIX = X509_NAME_
1548              
1549             Crypt::OpenSSL3::X509::Name X509_NAME_dup(Crypt::OpenSSL3::X509::Name self)
1550              
1551             int X509_NAME_cmp(Crypt::OpenSSL3::X509::Name a, Crypt::OpenSSL3::X509::Name b)
1552              
1553             int X509_NAME_get_index_by_NID(Crypt::OpenSSL3::X509::Name name, int nid, int lastpos)
1554              
1555             int X509_NAME_get_index_by_OBJ(Crypt::OpenSSL3::X509::Name name, Crypt::OpenSSL3::ASN1::Object obj, int lastpos)
1556              
1557             int X509_NAME_entry_count(Crypt::OpenSSL3::X509::Name name)
1558              
1559             Crypt::OpenSSL3::X509::Name::Entry X509_NAME_get_entry(Crypt::OpenSSL3::X509::Name name, int loc)
1560             POSTCALL:
1561 0           RETVAL = X509_NAME_ENTRY_dup(RETVAL);
1562              
1563             char* X509_NAME_oneline(Crypt::OpenSSL3::X509::Name a)
1564             C_ARGS: a, NULL, 0
1565             CLEANUP:
1566 0 0         if (RETVAL)
1567 0           OPENSSL_free(RETVAL);
1568              
1569             NO_OUTPUT int X509_NAME_digest(Crypt::OpenSSL3::X509::Name data, Crypt::OpenSSL3::MD type, OUTLIST SV* hash)
1570             INIT:
1571 0           unsigned len = EVP_MD_size(type);
1572 0           char* ptr = make_buffer(&hash, len);
1573             C_ARGS: data, type, ptr, &len
1574             POSTCALL:
1575 0 0         if (RETVAL)
1576 0           set_buffer_length(hash, len);
1577              
1578             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::X509::Name::Entry PREFIX = X509_NAME_ENTRY
1579              
1580              
1581              
1582             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::X509::Store PREFIX = X509_STORE_
1583              
1584             bool X509_STORE_add_cert(Crypt::OpenSSL3::X509::Store store, Crypt::OpenSSL3::X509 x)
1585              
1586             bool X509_STORE_set_depth(Crypt::OpenSSL3::X509::Store store, int depth)
1587              
1588             bool X509_STORE_set_flags(Crypt::OpenSSL3::X509::Store store, unsigned long flags)
1589              
1590             bool X509_STORE_set_purpose(Crypt::OpenSSL3::X509::Store store, int purpose)
1591              
1592             bool X509_STORE_set_trust(Crypt::OpenSSL3::X509::Store store, int trust)
1593              
1594             bool X509_STORE_load_locations(Crypt::OpenSSL3::X509::Store store, const char *file, const char *dir)
1595              
1596             bool X509_STORE_set_default_paths(Crypt::OpenSSL3::X509::Store store)
1597              
1598              
1599             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::SSL::Method PREFIX = SSL_Method_
1600              
1601             Crypt::OpenSSL3::SSL::Method SSL_Method_TLS()
1602              
1603             Crypt::OpenSSL3::SSL::Method SSL_Method_TLS_server()
1604              
1605             Crypt::OpenSSL3::SSL::Method SSL_Method_TLS_client()
1606              
1607             Crypt::OpenSSL3::SSL::Method SSL_Method_DTLS()
1608              
1609             Crypt::OpenSSL3::SSL::Method SSL_Method_DTLS_server()
1610              
1611             Crypt::OpenSSL3::SSL::Method SSL_Method_DTLS_client()
1612              
1613             #if OPENSSL_VERSION_PREREQ(3, 2)
1614             Crypt::OpenSSL3::SSL::Method SSL_Method_QUIC_client()
1615              
1616             Crypt::OpenSSL3::SSL::Method SSL_Method_QUIC_client_thread()
1617             #endif
1618              
1619             #if OPENSSL_VERSION_PREREQ(3, 5)
1620             Crypt::OpenSSL3::SSL::Method SSL_Method_QUIC_server()
1621             #endif
1622              
1623             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::SSL::Context PREFIX = SSL_CTX_
1624              
1625             Crypt::OpenSSL3::SSL::Context SSL_CTX_new(SV* classname, Crypt::OpenSSL3::SSL::Method method = TLS_method())
1626             C_ARGS: method
1627              
1628             long SSL_CTX_set_options(Crypt::OpenSSL3::SSL::Context ctx, long options)
1629              
1630             long SSL_CTX_clear_options(Crypt::OpenSSL3::SSL::Context ctx, long options)
1631              
1632             long SSL_CTX_get_options(Crypt::OpenSSL3::SSL::Context ctx)
1633              
1634             void SSL_CTX_set_read_ahead(Crypt::OpenSSL3::SSL::Context ctx, bool yes)
1635              
1636             bool SSL_CTX_get_read_ahead(Crypt::OpenSSL3::SSL::Context ctx)
1637              
1638             bool SSL_CTX_set_session_id_context(Crypt::OpenSSL3::SSL::Context ctx, const unsigned char *sid_ctx, unsigned int length(sid_ctx))
1639              
1640             long SSL_CTX_set_mode(Crypt::OpenSSL3::SSL::Context ctx, long mode)
1641              
1642             long SSL_CTX_clear_mode(Crypt::OpenSSL3::SSL::Context ctx, long mode)
1643              
1644             long SSL_CTX_get_mode(Crypt::OpenSSL3::SSL::Context ctx)
1645              
1646             bool SSL_CTX_set_min_proto_version(Crypt::OpenSSL3::SSL::Context ctx, int version)
1647              
1648             bool SSL_CTX_set_max_proto_version(Crypt::OpenSSL3::SSL::Context ctx, int version)
1649              
1650             int SSL_CTX_get_min_proto_version(Crypt::OpenSSL3::SSL::Context ctx)
1651              
1652             int SSL_CTX_get_max_proto_version(Crypt::OpenSSL3::SSL::Context ctx)
1653              
1654             bool SSL_CTX_set_alpn_protos(Crypt::OpenSSL3::SSL::Context ctx, const unsigned char *protos, unsigned int length(protos))
1655              
1656             Crypt::OpenSSL3::X509::Store SSL_CTX_get_cert_store(Crypt::OpenSSL3::SSL::Context ctx)
1657             POSTCALL:
1658 0           X509_STORE_up_ref(RETVAL);
1659              
1660             void SSL_CTX_set_cert_store(Crypt::OpenSSL3::SSL::Context ctx, Crypt::OpenSSL3::X509::Store store)
1661             POSTCALL:
1662 0           X509_STORE_up_ref(store);
1663              
1664             bool SSL_CTX_load_verify_locations(Crypt::OpenSSL3::SSL::Context ctx, const char *CAfile, const char *CApath)
1665              
1666             bool SSL_CTX_load_verify_file(Crypt::OpenSSL3::SSL::Context ctx, const char *CAfile)
1667              
1668             bool SSL_CTX_load_verify_dir(Crypt::OpenSSL3::SSL::Context ctx, const char *CApath)
1669              
1670             bool SSL_CTX_load_verify_store(Crypt::OpenSSL3::SSL::Context ctx, const char *CAstore)
1671              
1672             bool SSL_CTX_set_default_verify_paths(Crypt::OpenSSL3::SSL::Context ctx)
1673              
1674             bool SSL_CTX_set_default_verify_dir(Crypt::OpenSSL3::SSL::Context ctx)
1675              
1676             bool SSL_CTX_set_default_verify_file(Crypt::OpenSSL3::SSL::Context ctx)
1677              
1678             bool SSL_CTX_use_certificate(Crypt::OpenSSL3::SSL::Context ctx, Crypt::OpenSSL3::X509 x)
1679              
1680             bool SSL_CTX_use_certificate_ASN1(Crypt::OpenSSL3::SSL::Context ctx, int length(d), const unsigned char *d)
1681              
1682             bool SSL_CTX_use_certificate_file(Crypt::OpenSSL3::SSL::Context ctx, const char *file, int type)
1683              
1684             bool SSL_CTX_use_certificate_chain_file(Crypt::OpenSSL3::SSL::Context ctx, const char *file)
1685              
1686             long SSL_CTX_add_extra_chain_cert(Crypt::OpenSSL3::SSL::Context ctx, Crypt::OpenSSL3::X509 x509)
1687              
1688             long SSL_CTX_clear_extra_chain_certs(Crypt::OpenSSL3::SSL::Context ctx)
1689              
1690             bool SSL_CTX_use_PrivateKey(Crypt::OpenSSL3::SSL::Context ctx, Crypt::OpenSSL3::PKey pkey)
1691              
1692             bool SSL_CTX_use_PrivateKey_ASN1(Crypt::OpenSSL3::SSL::Context ctx, int pk, const unsigned char *d, long length(d))
1693             C_ARGS: pk, ctx, d, XSauto_length_of_d
1694              
1695             bool SSL_CTX_use_PrivateKey_file(Crypt::OpenSSL3::SSL::Context ctx, const char *file, int type)
1696              
1697             bool SSL_CTX_check_private_key(Crypt::OpenSSL3::SSL::Context ctx)
1698              
1699             void SSL_CTX_set_verify(Crypt::OpenSSL3::SSL::Context ctx, int mode)
1700             C_ARGS: ctx, mode, NULL
1701              
1702             void SSL_CTX_set_verify_depth(Crypt::OpenSSL3::SSL::Context ctx, int depth)
1703              
1704             void SSL_CTX_set_post_handshake_auth(Crypt::OpenSSL3::SSL::Context ctx, int val)
1705              
1706             bool SSL_CTX_set_cipher_list(Crypt::OpenSSL3::SSL::Context ctx, const char *str)
1707              
1708             bool SSL_CTX_set_ciphersuites(Crypt::OpenSSL3::SSL::Context ctx, const char *str)
1709              
1710             Crypt::OpenSSL3::X509::VerifyParam SSL_CTX_get_param(Crypt::OpenSSL3::SSL::Context ctx)
1711              
1712             bool SSL_CTX_set_param(Crypt::OpenSSL3::SSL::Context ctx, Crypt::OpenSSL3::X509::VerifyParam vpm);
1713              
1714             int SSL_CTX_add_client_CA(Crypt::OpenSSL3::SSL::Context ctx, Crypt::OpenSSL3::X509 cacert)
1715             POSTCALL:
1716 0           X509_up_ref(cacert);
1717              
1718             bool SSL_CTX_add_session(Crypt::OpenSSL3::SSL::Context ctx, Crypt::OpenSSL3::SSL::Session c);
1719              
1720             bool SSL_CTX_remove_session(Crypt::OpenSSL3::SSL::Context ctx, Crypt::OpenSSL3::SSL::Session c);
1721              
1722             long SSL_CTX_sess_number(Crypt::OpenSSL3::SSL::Context ctx)
1723              
1724             long SSL_CTX_sess_connect(Crypt::OpenSSL3::SSL::Context ctx)
1725              
1726             long SSL_CTX_sess_connect_good(Crypt::OpenSSL3::SSL::Context ctx)
1727              
1728             long SSL_CTX_sess_connect_renegotiate(Crypt::OpenSSL3::SSL::Context ctx)
1729              
1730             long SSL_CTX_sess_accept(Crypt::OpenSSL3::SSL::Context ctx)
1731              
1732             long SSL_CTX_sess_accept_good(Crypt::OpenSSL3::SSL::Context ctx)
1733              
1734             long SSL_CTX_sess_accept_renegotiate(Crypt::OpenSSL3::SSL::Context ctx)
1735              
1736             long SSL_CTX_sess_hits(Crypt::OpenSSL3::SSL::Context ctx)
1737              
1738             long SSL_CTX_sess_cb_hits(Crypt::OpenSSL3::SSL::Context ctx)
1739              
1740             long SSL_CTX_sess_misses(Crypt::OpenSSL3::SSL::Context ctx)
1741              
1742             long SSL_CTX_sess_timeouts(Crypt::OpenSSL3::SSL::Context ctx)
1743              
1744             long SSL_CTX_sess_cache_full(Crypt::OpenSSL3::SSL::Context ctx)
1745              
1746             long SSL_CTX_sess_set_cache_size(Crypt::OpenSSL3::SSL::Context ctx, long t)
1747              
1748             long SSL_CTX_sess_get_cache_size(Crypt::OpenSSL3::SSL::Context ctx)
1749              
1750             int SSL_CTX_set_num_tickets(Crypt::OpenSSL3::SSL::Context ctx, size_t num_tickets)
1751              
1752             size_t SSL_CTX_get_num_tickets(Crypt::OpenSSL3::SSL::Context ctx)
1753              
1754             #if OPENSSL_VERSION_PREREQ(3, 5)
1755              
1756             bool SSL_CTX_set_domain_flags(Crypt::OpenSSL3::SSL::Context ctx, uint64_t flags)
1757              
1758             NO_OUTPUT bool SSL_CTX_get_domain_flags(Crypt::OpenSSL3::SSL::Context ctx, OUTLIST uint64_t flags)
1759             POSTCALL:
1760             if (!RETVAL)
1761             XSRETURN_UNDEF;
1762             #endif
1763              
1764             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::SSL PREFIX = SSL_
1765              
1766             BOOT:
1767             {
1768 47           HV* stash = gv_stashpvs("Crypt::OpenSSL3::SSL", GV_ADD | GV_ADDMULTI);
1769 47           CONSTANT2(SSL_, ERROR_NONE);
1770 47           CONSTANT2(SSL_, ERROR_ZERO_RETURN);
1771 47           CONSTANT2(SSL_, ERROR_WANT_READ);
1772 47           CONSTANT2(SSL_, ERROR_WANT_WRITE);
1773 47           CONSTANT2(SSL_, ERROR_WANT_CONNECT);
1774 47           CONSTANT2(SSL_, ERROR_WANT_ACCEPT);
1775 47           CONSTANT2(SSL_, ERROR_WANT_X509_LOOKUP);
1776 47           CONSTANT2(SSL_, ERROR_WANT_ASYNC);
1777 47           CONSTANT2(SSL_, ERROR_WANT_ASYNC_JOB);
1778 47           CONSTANT2(SSL_, ERROR_SYSCALL);
1779 47           CONSTANT2(SSL_, ERROR_SSL);
1780              
1781 47           CONSTANT2(SSL_, VERIFY_NONE);
1782 47           CONSTANT2(SSL_, VERIFY_PEER);
1783 47           CONSTANT2(SSL_, VERIFY_FAIL_IF_NO_PEER_CERT);
1784 47           CONSTANT2(SSL_, VERIFY_CLIENT_ONCE);
1785 47           CONSTANT2(SSL_, VERIFY_POST_HANDSHAKE);
1786              
1787 47           CONSTANT2(SSL_, MODE_ENABLE_PARTIAL_WRITE);
1788 47           CONSTANT2(SSL_, MODE_ACCEPT_MOVING_WRITE_BUFFER);
1789 47           CONSTANT2(SSL_, MODE_AUTO_RETRY);
1790 47           CONSTANT2(SSL_, MODE_RELEASE_BUFFERS);
1791 47           CONSTANT2(SSL_, MODE_SEND_FALLBACK_SCSV);
1792 47           CONSTANT2(SSL_, MODE_ASYNC);
1793              
1794 47           CONSTANT2(SSL_, FILETYPE_PEM);
1795 47           CONSTANT2(SSL_, FILETYPE_ASN1);
1796              
1797 47           CONSTANT2(, TLS1_VERSION);
1798 47           CONSTANT2(, TLS1_1_VERSION);
1799 47           CONSTANT2(, TLS1_2_VERSION);
1800 47           CONSTANT2(, TLS1_3_VERSION);
1801 47           CONSTANT2(, DTLS1_VERSION);
1802 47           CONSTANT2(, DTLS1_2_VERSION);
1803             #if OPENSSL_VERSION_PREREQ(3, 2)
1804             CONSTANT2(OSSL_, QUIC1_VERSION);
1805             CONSTANT2(SSL_, ACCEPT_STREAM_NO_BLOCK);
1806             CONSTANT2(SSL_, INCOMING_STREAM_POLICY_AUTO);
1807             CONSTANT2(SSL_, INCOMING_STREAM_POLICY_ACCEPT);
1808             CONSTANT2(SSL_, INCOMING_STREAM_POLICY_REJECT);
1809             CONSTANT2(SSL_, STREAM_FLAG_UNI);
1810             CONSTANT2(SSL_, STREAM_FLAG_NO_BLOCK);
1811             CONSTANT2(SSL_, STREAM_FLAG_ADVANCE);
1812             CONSTANT2(SSL_, STREAM_TYPE_NONE);
1813             CONSTANT2(SSL_, STREAM_TYPE_BIDI);
1814             CONSTANT2(SSL_, STREAM_TYPE_READ);
1815             CONSTANT2(SSL_, STREAM_TYPE_WRITE);
1816             #endif
1817             #if OPENSSL_VERSION_PREREQ(3, 5)
1818             CONSTANT2(SSL_, ACCEPT_CONNECTION_NO_BLOCK);
1819             CONSTANT2(SSL_, DOMAIN_FLAG_SINGLE_THREAD);
1820             CONSTANT2(SSL_, DOMAIN_FLAG_MULTI_THREAD);
1821             CONSTANT2(SSL_, DOMAIN_FLAG_THREAD_ASSISTED);
1822             CONSTANT2(SSL_, DOMAIN_FLAG_BLOCKING);
1823             CONSTANT2(SSL_, DOMAIN_FLAG_LEGACY_BLOCKING);
1824             #endif
1825             }
1826              
1827             Crypt::OpenSSL3::SSL SSL_new(SV* classname, Crypt::OpenSSL3::SSL::Context context)
1828             C_ARGS: context
1829              
1830             Crypt::OpenSSL3::SSL::Method SSL_get_ssl_method(Crypt::OpenSSL3::SSL ssl)
1831              
1832             Crypt::OpenSSL3::SSL::Context SSL_get_context(Crypt::OpenSSL3::SSL ssl)
1833             POSTCALL:
1834 0           SSL_CTX_up_ref(RETVAL);
1835              
1836             NO_OUTPUT int SSL_get_event_timeout(Crypt::OpenSSL3::SSL s, OUTLIST struct timeval tv, OUTLIST Bool is_infinite)
1837             INIT:
1838 0           is_infinite = 0;
1839             POSTCALL:
1840 0 0         if (!RETVAL)
1841 0           XSRETURN_EMPTY;
1842              
1843             bool SSL_handle_events(Crypt::OpenSSL3::SSL ssl)
1844              
1845             long SSL_set_options(Crypt::OpenSSL3::SSL ssl, long options)
1846              
1847             long SSL_clear_options(Crypt::OpenSSL3::SSL ssl, long options)
1848              
1849             long SSL_get_options(Crypt::OpenSSL3::SSL ssl)
1850              
1851             bool SSL_set_session_id_context(Crypt::OpenSSL3::SSL ssl, const unsigned char *sid_ctx, unsigned int length(sid_ctx))
1852              
1853             long SSL_set_mode(Crypt::OpenSSL3::SSL ssl, long mode)
1854              
1855             long SSL_clear_mode(Crypt::OpenSSL3::SSL ssl, long mode)
1856              
1857             long SSL_get_mode(Crypt::OpenSSL3::SSL ssl)
1858              
1859             bool SSL_set_min_proto_version(Crypt::OpenSSL3::SSL ssl, int version)
1860              
1861             bool SSL_set_max_proto_version(Crypt::OpenSSL3::SSL ssl, int version)
1862              
1863             void SSL_set_security_level(Crypt::OpenSSL3::SSL s, int level)
1864              
1865             int SSL_get_security_level(Crypt::OpenSSL3::SSL s)
1866              
1867             bool SSL_set_alpn_protos(Crypt::OpenSSL3::SSL ssl, const unsigned char *protos, unsigned int length(protos))
1868              
1869             bool SSL_use_certificate(Crypt::OpenSSL3::SSL ssl, Crypt::OpenSSL3::X509 x)
1870              
1871             bool SSL_use_certificate_ASN1(Crypt::OpenSSL3::SSL ssl, const unsigned char *d, int length(d))
1872              
1873             bool SSL_use_certificate_file(Crypt::OpenSSL3::SSL ssl, const char *file, int type)
1874              
1875             bool SSL_use_certificate_chain_file(Crypt::OpenSSL3::SSL ssl, const char *file)
1876              
1877             bool SSL_use_PrivateKey(Crypt::OpenSSL3::SSL ssl, Crypt::OpenSSL3::PKey pkey)
1878              
1879             bool SSL_use_PrivateKey_ASN1(Crypt::OpenSSL3::SSL ssl, int pk, const unsigned char *d, long length(d))
1880             C_ARGS: pk, ssl, d, XSauto_length_of_d
1881              
1882             bool SSL_use_PrivateKey_file(Crypt::OpenSSL3::SSL ssl, const char *file, int type)
1883              
1884             bool SSL_check_private_key(Crypt::OpenSSL3::SSL ssl)
1885              
1886             void SSL_set_verify(Crypt::OpenSSL3::SSL ssl, int mode)
1887             C_ARGS: ssl, mode, NULL
1888              
1889             void SSL_set_verify_depth(Crypt::OpenSSL3::SSL ssl, int depth)
1890              
1891             Crypt::OpenSSL3::X509::VerifyResult SSL_get_verify_result(Crypt::OpenSSL3::SSL ssl);
1892              
1893             void SSL_set_post_handshake_auth(Crypt::OpenSSL3::SSL ssl, int val)
1894              
1895             bool SSL_set_cipher_list(Crypt::OpenSSL3::SSL ssl, const char *str)
1896              
1897             bool SSL_set_ciphersuites(Crypt::OpenSSL3::SSL ssl, const char *str)
1898              
1899             const char *SSL_get_cipher_list(Crypt::OpenSSL3::SSL ssl, int priority)
1900             POSTCALL:
1901 0 0         if (!RETVAL)
1902 0           XSRETURN_UNDEF;
1903              
1904             Crypt::OpenSSL3::X509::VerifyParam SSL_get_param(Crypt::OpenSSL3::SSL ssl)
1905              
1906             bool SSL_set_param(Crypt::OpenSSL3::SSL ssl, Crypt::OpenSSL3::X509::VerifyParam vpm);
1907              
1908             int SSL_add_client_CA(Crypt::OpenSSL3::SSL ssl, Crypt::OpenSSL3::X509 cacert)
1909             POSTCALL:
1910 0           X509_up_ref(cacert);
1911              
1912             bool SSL_verify_client_post_handshake(Crypt::OpenSSL3::SSL ssl)
1913              
1914             int SSL_get_error(Crypt::OpenSSL3::SSL ssl, int ret)
1915              
1916             bool SSL_set_tlsext_host_name(Crypt::OpenSSL3::SSL s, const char *name)
1917              
1918             const char* SSL_get_servername(Crypt::OpenSSL3::SSL s, int type)
1919              
1920             int SSL_get_servername_type(Crypt::OpenSSL3::SSL s)
1921              
1922             bool SSL_set_host(Crypt::OpenSSL3::SSL s, const char *hostname)
1923              
1924             int SSL_connect(Crypt::OpenSSL3::SSL ssl)
1925              
1926             int SSL_accept(Crypt::OpenSSL3::SSL ssl)
1927              
1928             int SSL_clear(Crypt::OpenSSL3::SSL ssl)
1929              
1930             int SSL_do_handshake(Crypt::OpenSSL3::SSL ssl)
1931              
1932             void SSL_set_connect_state(Crypt::OpenSSL3::SSL ssl)
1933              
1934             void SSL_set_accept_state(Crypt::OpenSSL3::SSL ssl)
1935              
1936             bool SSL_is_server(Crypt::OpenSSL3::SSL ssl)
1937              
1938             int SSL_read(Crypt::OpenSSL3::SSL ssl, SV* buffer, size_t size)
1939             INTERFACE: SSL_read SSL_peek
1940             INIT:
1941 1           char* ptr = grow_buffer(buffer, size);
1942             C_ARGS: ssl, ptr, size
1943             POSTCALL:
1944 1 50         if (RETVAL > 0)
1945 1           set_buffer_length(buffer, RETVAL);
1946              
1947             int SSL_write(Crypt::OpenSSL3::SSL ssl, const char* buf, int length(buf))
1948              
1949             ssize_t SSL_sendfile(Crypt::OpenSSL3::SSL s, int fd, uint64_t offset, size_t size, int flags)
1950              
1951             int SSL_shutdown(Crypt::OpenSSL3::SSL ssl)
1952              
1953             bool SSL_set_fd(Crypt::OpenSSL3::SSL ssl, int fd)
1954              
1955             bool SSL_set_rfd(Crypt::OpenSSL3::SSL ssl, int fd)
1956              
1957             bool SSL_set_wfd(Crypt::OpenSSL3::SSL ssl, int fd)
1958              
1959             int SSL_get_fd(Crypt::OpenSSL3::SSL ssl)
1960              
1961             int SSL_get_rfd(Crypt::OpenSSL3::SSL ssl)
1962              
1963             int SSL_get_wfd(Crypt::OpenSSL3::SSL ssl)
1964              
1965             void SSL_set_rbio(Crypt::OpenSSL3::SSL s, Crypt::OpenSSL3::BIO bio)
1966             INTERFACE: SSL_set_rbio SSL_set_wbio
1967             INIT:
1968 4           BIO_up_ref(bio);
1969              
1970             Crypt::OpenSSL3::BIO SSL_get_rbio(Crypt::OpenSSL3::SSL ssl)
1971             INTERFACE: SSL_get_rbio SSL_get_wbio
1972             POSTCALL:
1973 0 0         if (RETVAL)
1974 0           BIO_up_ref(RETVAL);
1975             else
1976 0           XSRETURN_UNDEF;
1977              
1978             void SSL_set_read_ahead(Crypt::OpenSSL3::SSL s, bool yes)
1979              
1980             bool SSL_get_read_ahead(Crypt::OpenSSL3::SSL s)
1981              
1982             Crypt::OpenSSL3::SSL::Session SSL_get_session(Crypt::OpenSSL3::SSL ssl)
1983             POSTCALL:
1984 0 0         if (RETVAL)
1985 0           SSL_SESSION_up_ref(RETVAL);
1986             else
1987 0           XSRETURN_UNDEF;
1988              
1989             bool SSL_set_session(Crypt::OpenSSL3::SSL ssl, Crypt::OpenSSL3::SSL::Session session)
1990              
1991             bool SSL_session_reused(Crypt::OpenSSL3::SSL ssl)
1992              
1993             void SSL_copy_session_id(Crypt::OpenSSL3::SSL to, Crypt::OpenSSL3::SSL from)
1994              
1995             Crypt::OpenSSL3::X509 SSL_get_certificate(Crypt::OpenSSL3::SSL ssl)
1996             INTERFACE: SSL_get_certificate SSL_get_peer_certificate
1997             POSTCALL:
1998 0 0         if (RETVAL)
1999 0           X509_up_ref(RETVAL);
2000             else
2001 0           XSRETURN_UNDEF;
2002              
2003             Crypt::OpenSSL3::PKey SSL_get_privatekey(Crypt::OpenSSL3::SSL ssl)
2004             POSTCALL:
2005 0 0         if (RETVAL)
2006 0           EVP_PKEY_up_ref(RETVAL);
2007             else
2008 0           XSRETURN_UNDEF;
2009              
2010             Crypt::OpenSSL3::SSL::Cipher SSL_get_current_cipher(Crypt::OpenSSL3::SSL ssl)
2011             INTERFACE: SSL_get_current_cipher SSL_get_pending_cipher
2012             POSTCALL:
2013 0 0         if (!RETVAL)
2014 0           XSRETURN_UNDEF;
2015              
2016             int SSL_client_version(Crypt::OpenSSL3::SSL s)
2017              
2018             const char *SSL_get_version(Crypt::OpenSSL3::SSL ssl)
2019              
2020             bool SSL_is_dtls(Crypt::OpenSSL3::SSL ssl)
2021              
2022             bool SSL_is_tls(Crypt::OpenSSL3::SSL ssl)
2023              
2024             bool SSL_is_quic(Crypt::OpenSSL3::SSL ssl)
2025              
2026             bool SSL_in_init(Crypt::OpenSSL3::SSL s)
2027              
2028             bool SSL_in_before(Crypt::OpenSSL3::SSL s)
2029              
2030             bool SSL_is_init_finished(Crypt::OpenSSL3::SSL s)
2031              
2032             bool SSL_in_connect_init(Crypt::OpenSSL3::SSL s)
2033              
2034             bool SSL_in_accept_init(Crypt::OpenSSL3::SSL s)
2035              
2036             int SSL_pending(Crypt::OpenSSL3::SSL ssl)
2037              
2038             bool SSL_has_pending(Crypt::OpenSSL3::SSL s)
2039              
2040             int SSL_version(Crypt::OpenSSL3::SSL s)
2041              
2042             const char *SSL_state_string(Crypt::OpenSSL3::SSL ssl)
2043              
2044             const char *SSL_state_string_long(Crypt::OpenSSL3::SSL ssl)
2045              
2046             const char *SSL_rstate_string(Crypt::OpenSSL3::SSL ssl)
2047              
2048             const char *SSL_rstate_string_long(Crypt::OpenSSL3::SSL ssl)
2049              
2050             int SSL_set_num_tickets(Crypt::OpenSSL3::SSL s, size_t num_tickets)
2051              
2052             size_t SSL_get_num_tickets(Crypt::OpenSSL3::SSL s)
2053              
2054             bool SSL_new_session_ticket(Crypt::OpenSSL3::SSL s)
2055              
2056             NO_OUTPUT size_t SSL_get_finished(Crypt::OpenSSL3::SSL ssl, OUTLIST SV* result)
2057             INIT:
2058 0           unsigned char* ptr = make_buffer(&result, EVP_MAX_MD_SIZE);
2059             C_ARGS: ssl, ptr, EVP_MAX_MD_SIZE
2060             POSTCALL:
2061 0 0         if (RETVAL)
2062 0           set_buffer_length(result, RETVAL);
2063              
2064             NO_OUTPUT size_t SSL_get_peer_finished(Crypt::OpenSSL3::SSL ssl, OUTLIST SV* result)
2065             INIT:
2066 0           unsigned char* ptr = make_buffer(&result, EVP_MAX_MD_SIZE);
2067             C_ARGS: ssl, ptr, EVP_MAX_MD_SIZE
2068             POSTCALL:
2069 0 0         if (RETVAL)
2070 0           set_buffer_length(result, RETVAL);
2071              
2072             void SSL_get_alpn_selected(Crypt::OpenSSL3::SSL s, OUTLIST SV* result)
2073             const unsigned char* ptr = NULL;
2074             unsigned int len = 0;
2075             C_ARGS: s, &ptr, &len
2076             POSTCALL:
2077 0           result = newSVpvn((char*)ptr, len);
2078              
2079             #if OPENSSL_VERSION_PREREQ(3, 2)
2080              
2081             bool SSL_set_blocking_mode(Crypt::OpenSSL3::SSL s, int blocking)
2082              
2083             Success SSL_get_blocking_mode(Crypt::OpenSSL3::SSL s)
2084              
2085             Crypt::OpenSSL3::SSL SSL_new_stream(Crypt::OpenSSL3::SSL ssl, uint64_t flags)
2086              
2087             bool SSL_set_incoming_stream_policy(Crypt::OpenSSL3::SSL conn, int policy, uint64_t app_error_code = 0)
2088              
2089             Crypt::OpenSSL3::SSL SSL_accept_stream(Crypt::OpenSSL3::SSL ssl, uint64_t flags)
2090              
2091             size_t SSL_get_accept_stream_queue_len(Crypt::OpenSSL3::SSL ssl)
2092              
2093             bool SSL_set_default_stream_mode(Crypt::OpenSSL3::SSL conn, unsigned mode)
2094              
2095             bool SSL_stream_conclude(Crypt::OpenSSL3::SSL s, uint64_t flags)
2096              
2097             bool SSL_stream_reset(Crypt::OpenSSL3::SSL ssl)
2098             C_ARGS: ssl, NULL, 0
2099              
2100             int SSL_get_rpoll_descriptor(Crypt::OpenSSL3::SSL s, Crypt::OpenSSL3::BIO::PollDescriptor desc)
2101              
2102             int SSL_get_wpoll_descriptor(Crypt::OpenSSL3::SSL s, Crypt::OpenSSL3::BIO::PollDescriptor desc)
2103              
2104             bool SSL_net_read_desired(Crypt::OpenSSL3::SSL s)
2105              
2106             bool SSL_net_write_desired(Crypt::OpenSSL3::SSL s)
2107              
2108             Crypt::OpenSSL3::SSL SSL_get_connection(Crypt::OpenSSL3::SSL ssl)
2109             POSTCALL:
2110             SSL_up_ref(RETVAL);
2111              
2112             bool SSL_is_connection(Crypt::OpenSSL3::SSL ssl)
2113              
2114             uint64_t SSL_get_stream_id(Crypt::OpenSSL3::SSL ssl)
2115             POSTCALL:
2116             if (RETVAL == UINT64_MAX)
2117             XSRETURN_UNDEF;
2118              
2119             int SSL_get_stream_type(Crypt::OpenSSL3::SSL ssl)
2120              
2121             Success SSL_is_stream_local(Crypt::OpenSSL3::SSL ssl)
2122              
2123             bool SSL_set_initial_peer_addr(Crypt::OpenSSL3::SSL s, Crypt::OpenSSL3::BIO::Address addr)
2124              
2125             #endif
2126              
2127              
2128             #if OPENSSL_VERSION_PREREQ(3, 5)
2129              
2130             Crypt::OpenSSL3::SSL SSL_new_listener(SV* classname, Crypt::OpenSSL3::SSL::Context ctx, uint64_t flags)
2131             C_ARGS: ctx, flags
2132              
2133             Crypt::OpenSSL3::SSL SSL_new_listener_from(Crypt::OpenSSL3::SSL ssl, uint64_t flags)
2134              
2135             bool SSL_is_listener(Crypt::OpenSSL3::SSL ssl)
2136              
2137             Crypt::OpenSSL3::SSL SSL_get_listener(Crypt::OpenSSL3::SSL ssl)
2138             INTERFACE: SSL_get_listener SSL_get_domain
2139             POSTCALL:
2140             if (RETVAL)
2141             SSL_up_ref(RETVAL);
2142             else
2143             XSRETURN_UNDEF;
2144              
2145             bool SSL_listen(Crypt::OpenSSL3::SSL ssl)
2146              
2147             Crypt::OpenSSL3::SSL SSL_accept_connection(Crypt::OpenSSL3::SSL ssl, uint64_t flags)
2148              
2149             size_t SSL_get_accept_connection_queue_len(Crypt::OpenSSL3::SSL ssl)
2150              
2151             Crypt::OpenSSL3::SSL SSL_new_from_listener(Crypt::OpenSSL3::SSL ssl, uint64_t flags)
2152              
2153             Crypt::OpenSSL3::SSL SSL_new_domain(Crypt::OpenSSL3::SSL::Context ctx, uint64_t flags)
2154              
2155             bool SSL_is_domain(Crypt::OpenSSL3::SSL ssl)
2156              
2157             NO_OUTPUT int SSL_get_domain_flags(Crypt::OpenSSL3::SSL ssl, OUTLIST uint64_t flags)
2158             POSTCALL:
2159             if (!RETVAL)
2160             XSRETURN_UNDEF;
2161              
2162             #endif
2163              
2164              
2165             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::SSL::Cipher PREFIX = SSL_CIPHER_
2166              
2167             const char *SSL_CIPHER_get_name(Crypt::OpenSSL3::SSL::Cipher cipher)
2168              
2169             const char *SSL_CIPHER_standard_name(Crypt::OpenSSL3::SSL::Cipher cipher)
2170              
2171             NO_OUTPUT int SSL_CIPHER_get_bits(Crypt::OpenSSL3::SSL::Cipher cipher, OUTLIST int alg_bits)
2172             POSTCALL:
2173 0 0         if (!RETVAL)
2174 0           alg_bits = 0;
2175              
2176             const char *SSL_CIPHER_get_version(Crypt::OpenSSL3::SSL::Cipher cipher)
2177              
2178             NO_OUTPUT char *SSL_CIPHER_description(Crypt::OpenSSL3::SSL::Cipher cipher, OUTLIST SV* description, int length = 128)
2179             INIT:
2180 0           char* ptr = (char*)make_buffer(&description, length);
2181             C_ARGS: cipher, ptr, length
2182             POSTCALL:
2183 0 0         if (RETVAL)
2184 0           set_buffer_length(description, strlen(ptr));
2185              
2186             int SSL_CIPHER_get_cipher_nid(Crypt::OpenSSL3::SSL::Cipher c)
2187              
2188             int SSL_CIPHER_get_digest_nid(Crypt::OpenSSL3::SSL::Cipher c)
2189              
2190             Crypt::OpenSSL3::MD SSL_CIPHER_get_handshake_digest(Crypt::OpenSSL3::SSL::Cipher c)
2191             POSTCALL:
2192 0 0         if (RETVAL)
2193 0           EVP_MD_up_ref(RETVAL);
2194             else
2195 0           XSRETURN_UNDEF;
2196              
2197             int SSL_CIPHER_get_kx_nid(Crypt::OpenSSL3::SSL::Cipher c)
2198              
2199             int SSL_CIPHER_get_auth_nid(Crypt::OpenSSL3::SSL::Cipher c)
2200              
2201             bool SSL_CIPHER_is_aead(Crypt::OpenSSL3::SSL::Cipher c)
2202              
2203             unsigned SSL_CIPHER_get_id(Crypt::OpenSSL3::SSL::Cipher c)
2204              
2205             unsigned SSL_CIPHER_get_protocol_id(Crypt::OpenSSL3::SSL::Cipher c)
2206              
2207              
2208              
2209             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::SSL::Session PREFIX = SSL_SESSION_
2210              
2211             Crypt::OpenSSL3::SSL::Session SSL_SESSION_new(class)
2212             C_ARGS:
2213              
2214             Crypt::OpenSSL3::SSL::Session SSL_SESSION_dup(Crypt::OpenSSL3::SSL::Session s)
2215              
2216             long SSL_SESSION_get_timeout(Crypt::OpenSSL3::SSL::Session s)
2217              
2218             long SSL_SESSION_set_timeout(Crypt::OpenSSL3::SSL::Session s, long t)
2219              
2220             int SSL_SESSION_get_protocol_version(Crypt::OpenSSL3::SSL::Session s)
2221              
2222             int SSL_SESSION_set_protocol_version(Crypt::OpenSSL3::SSL::Session s, int version)
2223              
2224             time_t SSL_SESSION_get_time(Crypt::OpenSSL3::SSL::Session s)
2225              
2226             time_t SSL_SESSION_set_time(Crypt::OpenSSL3::SSL::Session s, time_t t)
2227              
2228             const char *SSL_SESSION_get_hostname(Crypt::OpenSSL3::SSL::Session s)
2229              
2230             bool SSL_SESSION_set_hostname(Crypt::OpenSSL3::SSL::Session s, const char *hostname)
2231              
2232             void SSL_SESSION_get_alpn_selected(Crypt::OpenSSL3::SSL::Session s, OUTLIST SV* result)
2233             const unsigned char* ptr = NULL;
2234             size_t len = 0;
2235             C_ARGS: s, &ptr, &len
2236             POSTCALL:
2237 0           result = newSVpvn((char*)ptr, len);
2238              
2239             bool SSL_SESSION_set_alpn_selected(Crypt::OpenSSL3::SSL::Session s, const unsigned char *alpn, size_t length(alpn))
2240              
2241             Crypt::OpenSSL3::SSL::Cipher SSL_SESSION_get_cipher(Crypt::OpenSSL3::SSL::Session s)
2242              
2243             bool SSL_SESSION_set_cipher(Crypt::OpenSSL3::SSL::Session s, Crypt::OpenSSL3::SSL::Cipher cipher)
2244              
2245             bool SSL_SESSION_has_ticket(Crypt::OpenSSL3::SSL::Session s)
2246              
2247             unsigned long SSL_SESSION_get_ticket_lifetime_hint(Crypt::OpenSSL3::SSL::Session s)
2248              
2249             void SSL_SESSION_get_ticket(Crypt::OpenSSL3::SSL::Session s, OUTLIST SV* result)
2250             const unsigned char* ptr = NULL;
2251             size_t len = 0;
2252             C_ARGS: s, &ptr, &len
2253             POSTCALL:
2254 0           result = newSVpvn((char*)ptr, len);
2255              
2256             unsigned SSL_SESSION_get_max_early_data(Crypt::OpenSSL3::SSL::Session s)
2257              
2258             bool SSL_SESSION_set_max_early_data(Crypt::OpenSSL3::SSL::Session s, unsigned max_early_data)
2259              
2260             Crypt::OpenSSL3::X509 SSL_SESSION_get_peer(Crypt::OpenSSL3::SSL::Session session)
2261             POSTCALL:
2262 0 0         if (RETVAL)
2263 0           X509_up_ref(RETVAL);
2264             else
2265 0           XSRETURN_UNDEF;
2266              
2267             bool SSL_SESSION_set_id_context(Crypt::OpenSSL3::SSL::Session s, const unsigned char *sid_ctx, unsigned int length(sid_ctx))
2268              
2269             bool SSL_SESSION_set_id(Crypt::OpenSSL3::SSL::Session s, const unsigned char *sid, unsigned int length(sid))
2270              
2271             bool SSL_SESSION_is_resumable(Crypt::OpenSSL3::SSL::Session s)
2272              
2273             NO_OUTPUT const unsigned char *SSL_SESSION_get_id(Crypt::OpenSSL3::SSL::Session s, OUTLIST SV* result)
2274             INTERFACE: SSL_SESSION_get_id SSL_SESSION_get_id_context
2275             INIT:
2276 0           unsigned int len = 0;
2277             C_ARGS: s, &len
2278             POSTCALL:
2279 0           result = newSVpvn((char*)RETVAL, len);
2280              
2281             unsigned int SSL_SESSION_get_compress_id(Crypt::OpenSSL3::SSL::Session s)
2282              
2283             bool SSL_SESSION_print(Crypt::OpenSSL3::BIO fp, Crypt::OpenSSL3::SSL::Session ses)
2284              
2285             bool SSL_SESSION_print_keylog(Crypt::OpenSSL3::BIO bp, Crypt::OpenSSL3::SSL::Session x)
2286              
2287              
2288             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::Random PREFIX = EVP_RAND_
2289              
2290             Crypt::OpenSSL3::Random EVP_RAND_fetch(SV* classname, const char* algorithm, const char* properties = "")
2291             C_ARGS: NULL, algorithm, properties
2292             POSTCALL:
2293 0 0         if (RETVAL == NULL)
2294 0           XSRETURN_UNDEF;
2295              
2296             bool EVP_RAND_is_a(Crypt::OpenSSL3::Random rand, const char *name)
2297              
2298             const char *EVP_RAND_get_name(Crypt::OpenSSL3::Random rand)
2299              
2300             const char *EVP_RAND_get_description(Crypt::OpenSSL3::Random rand)
2301              
2302             void EVP_RAND_names_list_all(Crypt::OpenSSL3::Random rand)
2303             PPCODE:
2304 0           PUTBACK;
2305 0           EVP_RAND_names_do_all(rand, EVP_name_callback, iTHX);
2306 0           SPAGAIN;
2307              
2308             void EVP_RAND_list_all_provided(SV* classname)
2309             PPCODE:
2310 0           PUTBACK;
2311 0           EVP_RAND_do_all_provided(NULL, EVP_RAND_provided_callback, iTHX);
2312 0           SPAGAIN;
2313              
2314             SV* EVP_RAND_get_param(Crypt::OpenSSL3::Random rand, const char* name)
2315             CODE:
2316 0 0         GENERATE_GET_PARAM(EVP_RAND, rand, name)
    0          
    0          
    0          
2317             OUTPUT: RETVAL
2318              
2319             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::Random PREFIX = RAND_
2320              
2321             NO_OUTPUT int RAND_bytes(SV* classname, OUTLIST SV* buffer, int num)
2322             INTERFACE: RAND_bytes RAND_priv_bytes
2323             INIT:
2324 0           unsigned char* ptr = make_buffer(&buffer, num);
2325 0           set_buffer_length(buffer, num);
2326             C_ARGS: ptr, num
2327              
2328             Crypt::OpenSSL3::Random::Context RAND_get_primary(SV* classname)
2329             INTERFACE: RAND_get_primary RAND_get_public RAND_get_private
2330             C_ARGS: NULL
2331             POSTCALL:
2332             EVP_RAND_CTX_up_ref(RETVAL);
2333              
2334             #if OPENSSL_VERSION_PREREQ(3, 2)
2335             Bool RAND_set_public(SV* classname, Crypt::OpenSSL3::Random::Context rand)
2336             INTERFACE: RAND_set_public RAND_set_private
2337             C_ARGS: NULL, rand
2338             POSTCALL:
2339             if (RETVAL)
2340             EVP_RAND_CTX_up_ref(rand);
2341             #endif
2342              
2343             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::Random::Context PREFIX = EVP_RAND_CTX_
2344              
2345             Crypt::OpenSSL3::Random::Context EVP_RAND_CTX_new(SV* classname, Crypt::OpenSSL3::Random type, Crypt::OpenSSL3::Random::Context parent = NULL)
2346             C_ARGS: type, parent
2347              
2348             Crypt::OpenSSL3::Random EVP_RAND_CTX_get_rand(Crypt::OpenSSL3::Random::Context ctx)
2349             POSTCALL:
2350 0           EVP_RAND_up_ref(RETVAL);
2351              
2352             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::Random::Context PREFIX = EVP_RAND_
2353              
2354             bool EVP_RAND_instantiate(Crypt::OpenSSL3::Random::Context ctx, unsigned int strength, int prediction_resistance, const unsigned char *pstr, size_t length(pstr), PARAMS(EVP_RAND_CTX) params = NULL)
2355              
2356             bool EVP_RAND_uninstantiate(Crypt::OpenSSL3::Random::Context ctx)
2357              
2358             NO_OUTPUT int EVP_RAND_generate(Crypt::OpenSSL3::Random::Context ctx, OUTLIST SV* buffer, size_t outlen, unsigned int strength, int prediction_resistance, const unsigned char *addin, size_t length(addin))
2359             INIT:
2360 0           unsigned char* ptr = make_buffer(&buffer, outlen);
2361             C_ARGS: ctx, ptr, outlen, strength, prediction_resistance, addin, XSauto_length_of_addin
2362             POSTCALL:
2363 0 0         if (RETVAL)
2364 0           set_buffer_length(buffer, outlen);
2365              
2366             int EVP_RAND_reseed(Crypt::OpenSSL3::Random::Context ctx, int prediction_resistance, const unsigned char *ent, size_t length(ent), const unsigned char *addin, size_t addin_len)
2367              
2368             NO_OUTPUT int EVP_RAND_nonce(Crypt::OpenSSL3::Random::Context ctx, OUTLIST SV* buffer, size_t outlen)
2369             INIT:
2370 0           unsigned char* ptr = make_buffer(&buffer, outlen);
2371             C_ARGS: ctx, ptr, outlen
2372             POSTCALL:
2373 0           set_buffer_length(buffer, RETVAL);
2374              
2375             bool EVP_RAND_enable_locking(Crypt::OpenSSL3::Random::Context ctx)
2376              
2377             bool EVP_RAND_verify_zeroization(Crypt::OpenSSL3::Random::Context ctx)
2378              
2379             unsigned int EVP_RAND_get_strength(Crypt::OpenSSL3::Random::Context ctx)
2380              
2381             int EVP_RAND_get_state(Crypt::OpenSSL3::Random::Context ctx)
2382              
2383              
2384             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::Cipher PREFIX = EVP_CIPHER_
2385              
2386             Crypt::OpenSSL3::Cipher EVP_CIPHER_fetch(SV* classname, const char* algorithm, const char* properties = "")
2387             C_ARGS: NULL, algorithm, properties
2388             POSTCALL:
2389 1 50         if (RETVAL == NULL)
2390 0           XSRETURN_UNDEF;
2391              
2392             int EVP_CIPHER_get_nid(Crypt::OpenSSL3::Cipher e)
2393              
2394             int EVP_CIPHER_get_block_size(Crypt::OpenSSL3::Cipher e)
2395              
2396             int EVP_CIPHER_get_key_length(Crypt::OpenSSL3::Cipher e)
2397              
2398             int EVP_CIPHER_get_iv_length(Crypt::OpenSSL3::Cipher e)
2399              
2400             unsigned long EVP_CIPHER_get_mode(Crypt::OpenSSL3::Cipher e)
2401              
2402             int EVP_CIPHER_get_type(Crypt::OpenSSL3::Cipher cipher)
2403              
2404             bool EVP_CIPHER_is_a(Crypt::OpenSSL3::Cipher cipher, const char *name)
2405              
2406             const char *EVP_CIPHER_get_name(Crypt::OpenSSL3::Cipher cipher)
2407              
2408             const char *EVP_CIPHER_get_description(Crypt::OpenSSL3::Cipher cipher)
2409              
2410             void EVP_CIPHER_names_list_all(Crypt::OpenSSL3::Cipher cipher)
2411             PPCODE:
2412 0           PUTBACK;
2413 0           EVP_CIPHER_names_do_all(cipher, EVP_name_callback, iTHX);
2414 0           SPAGAIN;
2415              
2416             void EVP_CIPHER_list_all_provided(SV* classname)
2417             PPCODE:
2418 1           PUTBACK;
2419 1           EVP_CIPHER_do_all_provided(NULL, EVP_CIPHER_provided_callback, iTHX);
2420 1           SPAGAIN;
2421              
2422             SV* EVP_CIPHER_get_param(Crypt::OpenSSL3::Cipher cipher, const char* name)
2423             CODE:
2424 0 0         GENERATE_GET_PARAM(EVP_CIPHER, cipher, name)
    0          
    0          
    0          
2425             OUTPUT: RETVAL
2426              
2427              
2428             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::Cipher::Context PREFIX = EVP_CIPHER_CTX_
2429              
2430             Crypt::OpenSSL3::Cipher::Context EVP_CIPHER_CTX_new(SV* classname)
2431             C_ARGS:
2432              
2433             Crypt::OpenSSL3::Cipher::Context EVP_CIPHER_CTX_dup(Crypt::OpenSSL3::Cipher::Context ctx)
2434              
2435             bool EVP_CIPHER_CTX_copy(Crypt::OpenSSL3::Cipher::Context self, Crypt::OpenSSL3::Cipher::Context other)
2436              
2437             bool EVP_CIPHER_CTX_reset(Crypt::OpenSSL3::Cipher::Context ctx)
2438              
2439             bool EVP_CIPHER_CTX_init(Crypt::OpenSSL3::Cipher::Context ctx, Crypt::OpenSSL3::Cipher type, const unsigned char* key, size_t length(key), const unsigned char* iv, size_t length(iv), bool enc, CTX_PARAMS(EVP_CIPHER) params = NULL)
2440             INIT:
2441 2 50         if (XSauto_length_of_key != EVP_CIPHER_get_key_length(type) || XSauto_length_of_iv != EVP_CIPHER_get_iv_length(type))
    50          
2442 0           XSRETURN_NO;
2443             C_ARGS: ctx, type, key, iv, enc, params
2444              
2445             NO_OUTPUT int EVP_CIPHER_CTX_update(Crypt::OpenSSL3::Cipher::Context ctx, const unsigned char* input, size_t length(input), OUTLIST SV* output)
2446             INIT:
2447 2           int outl = XSauto_length_of_input + EVP_CIPHER_CTX_get_block_size(ctx);
2448 2           unsigned char* ptr = make_buffer(&output, outl);
2449             C_ARGS: ctx, ptr, &outl, input, XSauto_length_of_input
2450             POSTCALL:
2451 2 50         if (RETVAL)
2452 2           set_buffer_length(output, outl);
2453              
2454             NO_OUTPUT int EVP_CIPHER_CTX_final(Crypt::OpenSSL3::Cipher::Context ctx, OUTLIST SV* output)
2455             INIT:
2456 2           int size = EVP_CIPHER_CTX_get_block_size(ctx);
2457 2           unsigned char* ptr = make_buffer(&output, size);
2458             C_ARGS: ctx, ptr, &size
2459             POSTCALL:
2460 2 50         if (RETVAL)
2461 2           set_buffer_length(output, size);
2462              
2463             bool EVP_CIPHER_CTX_set_params(Crypt::OpenSSL3::Cipher::Context ctx, PARAMS(EVP_CIPHER_CTX) params = NULL)
2464              
2465             SV* EVP_CIPHER_CTX_get_param(Crypt::OpenSSL3::Cipher::Context ctx, const char* name)
2466             CODE:
2467 1 50         GENERATE_GET_PARAM(EVP_CIPHER_CTX, ctx, name)
    50          
    50          
    50          
2468             OUTPUT: RETVAL
2469              
2470              
2471             int EVP_CIPHER_CTX_get_nid(Crypt::OpenSSL3::Cipher::Context e)
2472              
2473             int EVP_CIPHER_CTX_get_block_size(Crypt::OpenSSL3::Cipher::Context e)
2474              
2475             int EVP_CIPHER_CTX_get_key_length(Crypt::OpenSSL3::Cipher::Context e)
2476              
2477             int EVP_CIPHER_CTX_get_iv_length(Crypt::OpenSSL3::Cipher::Context e)
2478              
2479             unsigned long EVP_CIPHER_CTX_get_mode(Crypt::OpenSSL3::Cipher::Context e)
2480              
2481             int EVP_CIPHER_CTX_type(Crypt::OpenSSL3::Cipher::Context ctx)
2482              
2483             bool EVP_CIPHER_CTX_set_padding(Crypt::OpenSSL3::Cipher::Context ctx, int padding)
2484              
2485             bool EVP_CIPHER_CTX_set_key_length(Crypt::OpenSSL3::Cipher::Context ctx, int keylen)
2486              
2487             int EVP_CIPHER_CTX_ctrl(Crypt::OpenSSL3::Cipher::Context ctx, int cmd, int p1, char *p2)
2488              
2489             NO_OUTPUT int EVP_CIPHER_CTX_rand_key(Crypt::OpenSSL3::Cipher::Context ctx, OUTLIST SV* key)
2490             INIT:
2491 0           size_t size = EVP_CIPHER_CTX_key_length(ctx);
2492 0           unsigned char* ptr = make_buffer(&key, size);
2493             C_ARGS: ctx, ptr
2494             POSTCALL:
2495 0 0         if (RETVAL > 0)
2496 0           set_buffer_length(key, size);
2497              
2498             Crypt::OpenSSL3::Cipher EVP_CIPHER_CTX_get_cipher(Crypt::OpenSSL3::Cipher::Context ctx)
2499              
2500             const char *EVP_CIPHER_CTX_get_name(Crypt::OpenSSL3::Cipher::Context ctx)
2501              
2502             bool EVP_CIPHER_CTX_is_encrypting(Crypt::OpenSSL3::Cipher::Context ctx)
2503              
2504             bool EVP_CIPHER_CTX_set_aead_ivlen(Crypt::OpenSSL3::Cipher::Context ctx, int length)
2505              
2506             NO_OUTPUT bool EVP_CIPHER_CTX_get_aead_tag(Crypt::OpenSSL3::Cipher::Context ctx, OUTLIST SV* tag)
2507             INIT:
2508 1           int length = EVP_CIPHER_CTX_get_tag_length(ctx);
2509 1           unsigned char* ptr = make_buffer(&tag, length);
2510             C_ARGS: ctx, ptr, length
2511             POSTCALL:
2512 1 50         if (RETVAL)
2513 1           set_buffer_length(tag, length);
2514              
2515             bool EVP_CIPHER_CTX_set_aead_tag(Crypt::OpenSSL3::Cipher::Context ctx, char* ptr, int length(ptr))
2516              
2517              
2518             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::MD PREFIX = EVP_MD_
2519              
2520             Crypt::OpenSSL3::MD EVP_MD_fetch(SV* classname, const char* algorithm, const char* properties = "")
2521             C_ARGS: NULL, algorithm, properties
2522             POSTCALL:
2523 1 50         if (RETVAL == NULL)
2524 0           XSRETURN_UNDEF;
2525              
2526             const char *EVP_MD_get_name(Crypt::OpenSSL3::MD md)
2527              
2528             const char *EVP_MD_get_description(Crypt::OpenSSL3::MD md)
2529              
2530             bool EVP_MD_is_a(Crypt::OpenSSL3::MD md, const char *name)
2531              
2532             void EVP_MD_names_list_all(Crypt::OpenSSL3::MD md)
2533             PPCODE:
2534 0           PUTBACK;
2535 0           EVP_MD_names_do_all(md, EVP_name_callback, iTHX);
2536 0           SPAGAIN;
2537              
2538             void EVP_MD_list_all_provided(SV* classname)
2539             PPCODE:
2540 1           PUTBACK;
2541 1           EVP_MD_do_all_provided(NULL, EVP_MD_provided_callback, iTHX);
2542 1           SPAGAIN;
2543              
2544             int EVP_MD_get_type(Crypt::OpenSSL3::MD md)
2545              
2546             int EVP_MD_get_pkey_type(Crypt::OpenSSL3::MD md)
2547              
2548             int EVP_MD_get_size(Crypt::OpenSSL3::MD md)
2549              
2550             int EVP_MD_get_block_size(Crypt::OpenSSL3::MD md)
2551              
2552             unsigned long EVP_MD_get_flags(Crypt::OpenSSL3::MD md)
2553              
2554             #if OPENSSL_VERSION_PREREQ(3, 4)
2555             bool EVP_MD_xof(Crypt::OpenSSL3::MD md)
2556             #endif
2557              
2558             SV* EVP_MD_get_param(Crypt::OpenSSL3::MD md, const char* name)
2559             CODE:
2560 0 0         GENERATE_GET_PARAM(EVP_MD, md, name)
    0          
    0          
    0          
2561             OUTPUT: RETVAL
2562              
2563             NO_OUTPUT bool EVP_MD_digest(Crypt::OpenSSL3::MD md, const char* input, size_t length(input), OUTLIST SV* digest)
2564             INIT:
2565 0           unsigned int size = EVP_MD_get_size(md);
2566 0           unsigned char* ptr = make_buffer(&digest, size);
2567             C_ARGS: input, XSauto_length_of_input, ptr, &size, md, NULL
2568             POSTCALL:
2569 0 0         if (RETVAL)
2570 0           set_buffer_length(digest, size);
2571              
2572              
2573             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::MD::Context PREFIX = EVP_MD_CTX_
2574              
2575             Crypt::OpenSSL3::MD::Context EVP_MD_CTX_new(SV* classname)
2576             C_ARGS:
2577              
2578             Crypt::OpenSSL3::MD::Context EVP_MD_CTX_dup(Crypt::OpenSSL3::MD::Context ctx)
2579              
2580             bool EVP_MD_CTX_copy(Crypt::OpenSSL3::MD::Context self, Crypt::OpenSSL3::MD::Context other)
2581              
2582             bool EVP_MD_CTX_reset(Crypt::OpenSSL3::MD::Context ctx)
2583              
2584             bool EVP_MD_CTX_init(Crypt::OpenSSL3::MD::Context ctx, Crypt::OpenSSL3::MD type, CTX_PARAMS(EVP_MD) params = NULL)
2585              
2586             bool EVP_MD_CTX_update(Crypt::OpenSSL3::MD::Context ctx, const char *d, size_t length(d))
2587              
2588             NO_OUTPUT bool EVP_MD_CTX_final(Crypt::OpenSSL3::MD::Context ctx, OUTLIST SV* digest)
2589             INIT:
2590 1           unsigned int size = EVP_MD_CTX_size(ctx);
2591 1           unsigned char* ptr = make_buffer(&digest , size);
2592             C_ARGS: ctx, ptr, &size
2593             POSTCALL:
2594 1 50         if (RETVAL)
2595 1           set_buffer_length(digest, size);
2596              
2597             NO_OUTPUT bool EVP_MD_CTX_final_xof(Crypt::OpenSSL3::MD::Context ctx, OUTLIST SV* digest, size_t outlen)
2598             INIT:
2599 0           unsigned char* ptr = make_buffer(&digest, outlen);
2600             C_ARGS: ctx, ptr, outlen
2601             POSTCALL:
2602 0 0         if (RETVAL)
2603 0           set_buffer_length(digest, outlen);
2604              
2605             #if OPENSSL_VERSION_PREREQ(3, 3)
2606             NO_OUTPUT bool EVP_MD_CTX_squeeze(Crypt::OpenSSL3::MD::Context ctx, OUTLIST SV* digest, size_t outlen)
2607             INIT:
2608             unsigned char* ptr = make_buffer(&digest, outlen);
2609             C_ARGS: ctx, ptr, outlen
2610             POSTCALL:
2611             if (RETVAL)
2612             set_buffer_length(digest, outlen);
2613             #endif
2614              
2615             bool EVP_MD_CTX_sign_init(Crypt::OpenSSL3::MD::Context ctx, Crypt::OpenSSL3::MD type, Crypt::OpenSSL3::PKey pkey, Crypt::OpenSSL3::PKey::Context pctx = NULL)
2616             C_ARGS: ctx, pctx ? &pctx : NULL, type, NULL, pkey
2617              
2618             bool EVP_MD_CTX_sign_init_ex(Crypt::OpenSSL3::MD::Context ctx, const char* mdname, Crypt::OpenSSL3::PKey pkey, Crypt::OpenSSL3::PKey::Context pctx = NULL, const char* props = NULL)
2619             C_ARGS: ctx, pctx ? &pctx : NULL, mdname, NULL, props, pkey, NULL
2620              
2621             bool EVP_MD_CTX_sign_update(Crypt::OpenSSL3::MD::Context ctx, const char *d, size_t length(d))
2622              
2623             SV* EVP_MD_CTX_sign_final(Crypt::OpenSSL3::MD::Context ctx)
2624             CODE:
2625 1           size_t size = 0;
2626 1 50         if (EVP_DigestSignFinal(ctx, NULL, &size) == 1) {
2627 1           unsigned char* ptr = make_buffer(&RETVAL, size);
2628 1 50         if (EVP_DigestSignFinal(ctx, ptr, &size) == 1)
2629 1           set_buffer_length(RETVAL, size);
2630             } else
2631 0           RETVAL = &PL_sv_undef;
2632             OUTPUT: RETVAL
2633              
2634             SV* EVP_MD_CTX_sign(Crypt::OpenSSL3::MD::Context ctx, const unsigned char *tbs, size_t length(tbs))
2635             CODE:
2636 0           size_t size = 0;
2637 0 0         if (EVP_DigestSign(ctx, NULL, &size, tbs, XSauto_length_of_tbs) == 1) {
2638 0           unsigned char* ptr = make_buffer(&RETVAL, size);
2639 0 0         if (EVP_DigestSign(ctx, ptr, &size, tbs, XSauto_length_of_tbs) == 1)
2640 0           set_buffer_length(RETVAL, size);
2641             } else
2642 0           RETVAL = &PL_sv_undef;
2643             OUTPUT: RETVAL
2644              
2645             bool EVP_MD_CTX_verify_init(Crypt::OpenSSL3::MD::Context ctx, Crypt::OpenSSL3::MD type, Crypt::OpenSSL3::PKey pkey, Crypt::OpenSSL3::PKey::Context pctx = NULL)
2646             C_ARGS: ctx, pctx ? &pctx : NULL, type, NULL, pkey
2647            
2648             bool EVP_MD_CTX_verify_update(Crypt::OpenSSL3::MD::Context ctx, const char *d, size_t length(d))
2649              
2650             Success EVP_MD_CTX_verify_final(Crypt::OpenSSL3::MD::Context ctx, const unsigned char *sig, size_t length(sig))
2651              
2652             Success EVP_MD_CTX_verify(Crypt::OpenSSL3::MD::Context ctx, const unsigned char *sig, size_t length(sig), const unsigned char *tbs, size_t length(tbs))
2653              
2654             bool EVP_MD_CTX_set_params(Crypt::OpenSSL3::MD::Context ctx, PARAMS(EVP_MD_CTX) params = NULL)
2655              
2656             SV* EVP_MD_CTX_get_param(Crypt::OpenSSL3::MD::Context ctx, const char* name)
2657             CODE:
2658 0 0         GENERATE_GET_PARAM(EVP_MD_CTX, ctx, name)
    0          
    0          
    0          
2659             OUTPUT: RETVAL
2660              
2661              
2662             void EVP_MD_CTX_ctrl(Crypt::OpenSSL3::MD::Context ctx, int cmd, int p1, char* p2);
2663              
2664             void EVP_MD_CTX_set_flags(Crypt::OpenSSL3::MD::Context ctx, int flags)
2665              
2666             void EVP_MD_CTX_clear_flags(Crypt::OpenSSL3::MD::Context ctx, int flags)
2667              
2668             int EVP_MD_CTX_test_flags(Crypt::OpenSSL3::MD::Context ctx, int flags)
2669              
2670             Crypt::OpenSSL3::MD EVP_MD_CTX_get_md(Crypt::OpenSSL3::MD::Context ctx)
2671              
2672             const char *EVP_MD_CTX_get_name(Crypt::OpenSSL3::MD::Context ctx)
2673              
2674             int EVP_MD_CTX_get_size(Crypt::OpenSSL3::MD::Context ctx)
2675              
2676             int EVP_MD_CTX_get_block_size(Crypt::OpenSSL3::MD::Context ctx)
2677              
2678             int EVP_MD_CTX_get_type(Crypt::OpenSSL3::MD::Context ctx)
2679              
2680              
2681              
2682             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::MAC PREFIX = EVP_MAC_
2683              
2684             Crypt::OpenSSL3::MAC EVP_MAC_fetch(SV* classname, const char* algorithm, const char* properties = "")
2685             C_ARGS: NULL, algorithm, properties
2686             POSTCALL:
2687 1 50         if (RETVAL == NULL)
2688 0           XSRETURN_UNDEF;
2689              
2690             const char *EVP_MAC_get_name(Crypt::OpenSSL3::MAC mac)
2691              
2692             const char *EVP_MAC_get_description(Crypt::OpenSSL3::MAC mac)
2693              
2694             bool EVP_MAC_is_a(Crypt::OpenSSL3::MAC mac, const char *name)
2695              
2696             void EVP_MAC_names_list_all(Crypt::OpenSSL3::MAC mac, SV* callback)
2697             PPCODE:
2698 0           PUTBACK;
2699 0           EVP_MAC_names_do_all(mac, EVP_name_callback, iTHX);
2700 0           SPAGAIN;
2701              
2702             void EVP_MAC_list_all_provided(SV* classname)
2703             PPCODE:
2704 1           PUTBACK;
2705 1           EVP_MAC_do_all_provided(NULL, EVP_MAC_provided_callback, iTHX);
2706 1           SPAGAIN;
2707              
2708             SV* EVP_MAC_get_param(Crypt::OpenSSL3::MAC mac, const char* name)
2709             CODE:
2710 0 0         GENERATE_GET_PARAM(EVP_MAC, mac, name)
    0          
    0          
    0          
2711             OUTPUT: RETVAL
2712              
2713              
2714              
2715             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::MAC::Context PREFIX = EVP_MAC_CTX_
2716              
2717             Crypt::OpenSSL3::MAC::Context EVP_MAC_CTX_new(SV* classname, Crypt::OpenSSL3::MAC ctx)
2718             C_ARGS: ctx
2719              
2720             Crypt::OpenSSL3::MAC::Context EVP_MAC_CTX_dup(Crypt::OpenSSL3::MAC::Context ctx)
2721              
2722             Crypt::OpenSSL3::MAC EVP_MAC_CTX_get_mac(Crypt::OpenSSL3::MAC::Context ctx);
2723             POSTCALL:
2724 0           EVP_MAC_up_ref(RETVAL);
2725              
2726             size_t EVP_MAC_CTX_get_mac_size(Crypt::OpenSSL3::MAC::Context ctx)
2727              
2728             size_t EVP_MAC_CTX_get_block_size(Crypt::OpenSSL3::MAC::Context ctx)
2729              
2730             bool EVP_MAC_CTX_set_params(Crypt::OpenSSL3::MAC::Context ctx, PARAMS(EVP_MAC_CTX) params = NULL)
2731              
2732             SV* EVP_MAC_CTX_get_param(Crypt::OpenSSL3::MAC::Context ctx, const char* name)
2733             CODE:
2734 0 0         GENERATE_GET_PARAM(EVP_MAC_CTX, ctx, name)
    0          
    0          
    0          
2735             OUTPUT: RETVAL
2736              
2737              
2738              
2739             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::MAC::Context PREFIX = EVP_MAC_
2740              
2741             bool EVP_MAC_init(Crypt::OpenSSL3::MAC::Context ctx, const unsigned char *key, size_t length(key), PARAMS(EVP_MAC_CTX) params = NULL)
2742              
2743             bool EVP_MAC_update(Crypt::OpenSSL3::MAC::Context ctx, const unsigned char *data, size_t length(data))
2744              
2745             NO_OUTPUT bool EVP_MAC_final(Crypt::OpenSSL3::MAC::Context ctx, OUTLIST SV* code)
2746             CODE:
2747             size_t outsize;
2748 1           EVP_MAC_final(ctx, NULL, &outsize, 0);
2749 1           unsigned char* ptr = make_buffer(&code, outsize);
2750 1           int result = EVP_MAC_final(ctx, ptr, &outsize, outsize);
2751 1 50         if (result)
2752 1           set_buffer_length(code, outsize);
2753              
2754             NO_OUTPUT int EVP_MAC_finalXOF(Crypt::OpenSSL3::MAC::Context ctx, OUTLIST SV* code, size_t outsize)
2755             INIT:
2756 0           unsigned char* ptr = make_buffer(&code, outsize);
2757             C_ARGS: ctx, ptr, outsize
2758             POSTCALL:
2759 0 0         if (RETVAL)
2760 0           set_buffer_length(code, outsize);
2761              
2762              
2763              
2764             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::KDF PREFIX = EVP_KDF_
2765              
2766             Crypt::OpenSSL3::KDF EVP_KDF_fetch(SV* classname, const char* algorithm, const char* properties = "")
2767             C_ARGS: NULL, algorithm, properties
2768             POSTCALL:
2769 1 50         if (RETVAL == NULL)
2770 0           XSRETURN_UNDEF;
2771              
2772             const char *EVP_KDF_get_name(Crypt::OpenSSL3::KDF kdf)
2773              
2774             const char *EVP_KDF_get_description(Crypt::OpenSSL3::KDF kdf)
2775              
2776             bool EVP_KDF_is_a(Crypt::OpenSSL3::KDF kdf, const char *name)
2777              
2778             void EVP_KDF_names_list_all(Crypt::OpenSSL3::KDF kdf)
2779             PPCODE:
2780 0           PUTBACK;
2781 0           EVP_KDF_names_do_all(kdf, EVP_name_callback, iTHX);
2782 0           SPAGAIN;
2783              
2784             void EVP_KDF_list_all_provided(SV* classname)
2785             PPCODE:
2786 1           PUTBACK;
2787 1           EVP_KDF_do_all_provided(NULL, EVP_KDF_provided_callback, iTHX);
2788 1           SPAGAIN;
2789              
2790             SV* EVP_KDF_get_param(Crypt::OpenSSL3::KDF kdf, const char* name)
2791             CODE:
2792 0 0         GENERATE_GET_PARAM(EVP_KDF, kdf, name)
    0          
    0          
    0          
2793             OUTPUT: RETVAL
2794              
2795              
2796             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::KDF::Context PREFIX = EVP_KDF_CTX_
2797              
2798             Crypt::OpenSSL3::KDF::Context EVP_KDF_CTX_new(SV* classname, Crypt::OpenSSL3::KDF ctx)
2799             C_ARGS: ctx
2800              
2801             Crypt::OpenSSL3::KDF::Context EVP_KDF_CTX_dup(Crypt::OpenSSL3::KDF::Context ctx)
2802              
2803             void EVP_KDF_CTX_reset(Crypt::OpenSSL3::KDF::Context ctx)
2804              
2805             size_t EVP_KDF_CTX_get_kdf_size(Crypt::OpenSSL3::KDF::Context ctx)
2806              
2807             bool EVP_KDF_CTX_set_params(Crypt::OpenSSL3::KDF::Context ctx, PARAMS(EVP_KDF_CTX) params = NULL)
2808              
2809             SV* EVP_KDF_CTX_get_param(Crypt::OpenSSL3::KDF::Context ctx, const char* name)
2810             CODE:
2811 0 0         GENERATE_GET_PARAM(EVP_KDF_CTX, ctx, name)
    0          
    0          
    0          
2812             OUTPUT: RETVAL
2813              
2814             Crypt::OpenSSL3::KDF EVP_KDF_CTX_kdf(Crypt::OpenSSL3::KDF::Context ctx)
2815             POSTCALL:
2816 0           EVP_KDF_up_ref(RETVAL);
2817              
2818              
2819             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::KDF::Context PREFIX = EVP_KDF_
2820              
2821             NO_OUTPUT bool EVP_KDF_derive(Crypt::OpenSSL3::KDF::Context ctx, OUTLIST SV* derived, size_t keylen, PARAMS(EVP_KDF_CTX) params)
2822             INIT:
2823 1           unsigned char* ptr = make_buffer(&derived, keylen);
2824             C_ARGS: ctx, ptr, keylen, params
2825             POSTCALL:
2826 1 50         if (RETVAL)
2827 1           set_buffer_length(derived, keylen);
2828              
2829              
2830              
2831             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::Signature PREFIX = EVP_SIGNATURE_
2832              
2833             Crypt::OpenSSL3::Signature EVP_SIGNATURE_fetch(SV* classname, const char* algorithm, const char* properties = "")
2834             C_ARGS: NULL, algorithm, properties
2835             POSTCALL:
2836 0 0         if (RETVAL == NULL)
2837 0           XSRETURN_UNDEF;
2838              
2839             const char *EVP_SIGNATURE_get_name(Crypt::OpenSSL3::Signature signature)
2840              
2841             const char *EVP_SIGNATURE_get_description(Crypt::OpenSSL3::Signature signature)
2842              
2843             bool EVP_SIGNATURE_is_a(Crypt::OpenSSL3::Signature signature, const char *name)
2844              
2845             void EVP_SIGNATURE_names_list_all(Crypt::OpenSSL3::Signature signature)
2846             PPCODE:
2847 0           PUTBACK;
2848 0           EVP_SIGNATURE_names_do_all(signature, EVP_name_callback, iTHX);
2849 0           SPAGAIN;
2850              
2851             void EVP_SIGNATURE_list_all_provided(SV* classname)
2852             PPCODE:
2853 0           PUTBACK;
2854 0           EVP_SIGNATURE_do_all_provided(NULL, EVP_SIGNATURE_provided_callback, iTHX);
2855 0           SPAGAIN;
2856              
2857              
2858             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::PKey PREFIX = EVP_PKEY_
2859              
2860             Crypt::OpenSSL3::PKey EVP_PKEY_new(SV* classname)
2861             C_ARGS:
2862              
2863             Crypt::OpenSSL3::PKey EVP_PKEY_new_raw_private_key(SV* classname, const char *keytype, const unsigned char *key, size_t length(key), const char *propq = "")
2864             C_ARGS: NULL, keytype, propq, key, XSauto_length_of_key
2865             POSTCALL:
2866 0 0         if (RETVAL == NULL)
2867 0           XSRETURN_UNDEF;
2868              
2869             Crypt::OpenSSL3::PKey EVP_PKEY_new_raw_public_key(SV* classname, const char *keytype, const unsigned char *key, size_t length(key), const char *propq = "")
2870             C_ARGS: NULL, keytype, propq, key, XSauto_length_of_key
2871             POSTCALL:
2872 0 0         if (RETVAL == NULL)
2873 0           XSRETURN_UNDEF;
2874              
2875             Crypt::OpenSSL3::PKey EVP_PKEY_dup(Crypt::OpenSSL3::PKey ctx)
2876              
2877             bool EVP_PKEY_eq(Crypt::OpenSSL3::PKey a, Crypt::OpenSSL3::PKey b)
2878              
2879             bool EVP_PKEY_parameters_eq(Crypt::OpenSSL3::PKey a, Crypt::OpenSSL3::PKey b)
2880              
2881             NO_OUTPUT void EVP_PKEY_get_raw_private_key(Crypt::OpenSSL3::PKey pkey, OUTLIST SV* key)
2882             CODE:
2883             size_t length;
2884 0           int result = EVP_PKEY_get_raw_private_key(pkey, NULL, &length);
2885 0 0         if (!result)
2886 0           XSRETURN_UNDEF;
2887 0           unsigned char* ptr = make_buffer(&key, length);
2888 0           result = EVP_PKEY_get_raw_private_key(pkey, ptr, &length);
2889 0 0         if (result)
2890 0           set_buffer_length(key, length);
2891              
2892              
2893             NO_OUTPUT void EVP_PKEY_get_raw_public_key(Crypt::OpenSSL3::PKey pkey, OUTLIST SV* key)
2894             CODE:
2895             size_t length;
2896 0           int result = EVP_PKEY_get_raw_public_key(pkey, NULL, &length);
2897 0 0         if (!result)
2898 0           XSRETURN_UNDEF;
2899 0           unsigned char* ptr = make_buffer(&key, length);
2900 0           result = EVP_PKEY_get_raw_public_key(pkey, ptr, &length);
2901 0 0         if (result)
2902 0           set_buffer_length(key, length);
2903              
2904             Crypt::OpenSSL3::PKey EVP_PKEY_read_pem_private_key(Crypt::OpenSSL3::BIO bio, SV* password_cb = undef, const char* propq = "")
2905             C_ARGS: bio, NULL, NULL, NULL, NULL, propq
2906             POSTCALL:
2907 0 0         if (!RETVAL)
2908 0           XSRETURN_UNDEF;
2909              
2910             bool EVP_PKEY_write_pem_private_key(Crypt::OpenSSL3::PKey pkey, Crypt::OpenSSL3::BIO bio, SV* cipher_sv = undef, SV* key = undef, const char* propq = "")
2911             INIT:
2912 0 0         const EVP_CIPHER* cipher = SvOK(cipher_sv) ? get_EVP_CIPHER(aTHX_ cipher_sv) : NULL;
2913 0           STRLEN klen = 0;
2914 0           const unsigned char* kstr = NULL;
2915 0 0         if (SvOK(key))
2916 0           kstr = (unsigned char*)SvPV(key, klen);
2917             C_ARGS: bio, pkey, cipher, kstr, klen, NULL, NULL, NULL, propq
2918              
2919             Crypt::OpenSSL3::PKey EVP_PKEY_read_pem_public_key(Crypt::OpenSSL3::BIO bio, const char* propq = "")
2920             C_ARGS: bio, NULL, NULL, NULL, NULL, propq
2921             POSTCALL:
2922 0 0         if (!RETVAL)
2923 0           XSRETURN_UNDEF;
2924              
2925             bool EVP_PKEY_write_pem_public_key(Crypt::OpenSSL3::PKey pkey, Crypt::OpenSSL3::BIO bio, const char* propq = "")
2926             C_ARGS: bio, pkey, NULL, propq
2927              
2928             int EVP_PKEY_get_id(Crypt::OpenSSL3::PKey pkey)
2929              
2930             int EVP_PKEY_get_base_id(Crypt::OpenSSL3::PKey pkey)
2931              
2932             int EVP_PKEY_type(int type)
2933              
2934             bool EVP_PKEY_set_type(Crypt::OpenSSL3::PKey pkey, int type)
2935              
2936             bool EVP_PKEY_set_type_str(Crypt::OpenSSL3::PKey pkey, const char *str, int length(str))
2937              
2938             int EVP_PKEY_get_size(Crypt::OpenSSL3::PKey pkey)
2939              
2940             int EVP_PKEY_get_bits(Crypt::OpenSSL3::PKey pkey)
2941              
2942             int EVP_PKEY_get_security_bits(Crypt::OpenSSL3::PKey pkey)
2943              
2944             bool EVP_PKEY_is_a(Crypt::OpenSSL3::PKey pkey, const char *name)
2945              
2946             bool EVP_PKEY_can_sign(Crypt::OpenSSL3::PKey pkey)
2947              
2948             void EVP_PKEY_type_names_list_all(Crypt::OpenSSL3::PKey pkey)
2949             PPCODE:
2950 0           PUTBACK;
2951 0           EVP_PKEY_type_names_do_all(pkey, EVP_name_callback, iTHX);
2952 0           SPAGAIN;
2953              
2954             const char *EVP_PKEY_get_type_name(Crypt::OpenSSL3::PKey key)
2955              
2956             const char *EVP_PKEY_get_description(Crypt::OpenSSL3::PKey key)
2957              
2958             Success EVP_PKEY_digestsign_supports_digest(Crypt::OpenSSL3::PKey pkey, const char *name, const char *propq)
2959             C_ARGS: pkey, NULL, name, propq
2960              
2961             NO_OUTPUT int EVP_PKEY_get_default_digest_name(Crypt::OpenSSL3::PKey pkey, OUTLIST SV* mdname)
2962             INIT:
2963 0           char* ptr = (char*)make_buffer(&mdname, 32);
2964             C_ARGS: pkey, ptr, 32
2965             POSTCALL:
2966 0 0         if (RETVAL > 0)
2967 0           set_buffer_length(mdname, strlen(SvPV_nolen(mdname)));
2968              
2969             NO_OUTPUT int EVP_PKEY_get_default_digest_nid(Crypt::OpenSSL3::PKey pkey, OUTLIST int pnid)
2970             POSTCALL:
2971 0 0         if (RETVAL <= 0)
2972 0           XSRETURN_UNDEF;
2973              
2974             int EVP_PKEY_get_field_type(Crypt::OpenSSL3::PKey pkey)
2975              
2976             int EVP_PKEY_get_ec_point_conv_form(Crypt::OpenSSL3::PKey pkey)
2977              
2978             NO_OUTPUT int EVP_PKEY_get_group_name(Crypt::OpenSSL3::PKey pkey, OUTLIST SV* name, size_t size = 32)
2979             INIT:
2980 0           char* ptr = (char*)make_buffer(&name, size);
2981             C_ARGS: pkey, ptr, size + 1, &size
2982             POSTCALL:
2983 0 0         if (RETVAL)
2984 0           set_buffer_length(name, size);
2985              
2986             bool EVP_PKEY_set_encoded_public_key(Crypt::OpenSSL3::PKey pkey, const unsigned char *pub, size_t length(pub))
2987              
2988             NO_OUTPUT size_t EVP_PKEY_get_encoded_public_key(Crypt::OpenSSL3::PKey pkey, OUTLIST SV* result)
2989             INIT:
2990 0           unsigned char* ptr = NULL;
2991             C_ARGS: pkey, &ptr
2992             POSTCALL:
2993 0 0         result = RETVAL > 0 ? newSVpvn((char*)ptr, RETVAL) : &PL_sv_undef;
2994 0           OPENSSL_free(ptr);
2995              
2996             SV* EVP_PKEY_get_param(Crypt::OpenSSL3::PKey pkey, const char* name)
2997             CODE:
2998 0 0         GENERATE_GET_PARAM(EVP_PKEY, pkey, name)
    0          
    0          
    0          
2999             OUTPUT: RETVAL
3000              
3001             bool EVP_PKEY_get_int_param(Crypt::OpenSSL3::PKey pkey, const char *key_name, OUT int out)
3002              
3003             bool EVP_PKEY_get_size_t_param(Crypt::OpenSSL3::PKey pkey, const char *key_name, OUT size_t out)
3004              
3005             bool EVP_PKEY_get_bn_param(Crypt::OpenSSL3::PKey pkey, const char *key_name, OUT Crypt::OpenSSL3::BigNum bn)
3006              
3007             bool EVP_PKEY_get_utf8_string_param(Crypt::OpenSSL3::PKey pkey, const char *key_name, char *str, size_t length(str), OUT size_t out_len)
3008              
3009             bool EVP_PKEY_get_octet_string_param(Crypt::OpenSSL3::PKey pkey, const char *key_name, unsigned char *buf, size_t length(buf), OUT size_t out_len)
3010              
3011             bool EVP_PKEY_set_params(Crypt::OpenSSL3::PKey ctx, PARAMS(EVP_PKEY) params = NULL)
3012              
3013             bool EVP_PKEY_set_int_param(Crypt::OpenSSL3::PKey pkey, const char *key_name, int in)
3014              
3015             bool EVP_PKEY_set_size_t_param(Crypt::OpenSSL3::PKey pkey, const char *key_name, size_t in)
3016              
3017             bool EVP_PKEY_set_bn_param(Crypt::OpenSSL3::PKey pkey, const char *key_name, Crypt::OpenSSL3::BigNum bn)
3018              
3019             bool EVP_PKEY_set_utf8_string_param(Crypt::OpenSSL3::PKey pkey, const char *key_name, const char *str)
3020              
3021             bool EVP_PKEY_set_octet_string_param(Crypt::OpenSSL3::PKey pkey, const char *key_name, const unsigned char *buf, size_t length(buf))
3022              
3023             Success EVP_PKEY_print_public(Crypt::OpenSSL3::BIO out, Crypt::OpenSSL3::PKey pkey, int indent)
3024             C_ARGS: out, pkey, indent, NULL
3025              
3026             Success EVP_PKEY_print_private(Crypt::OpenSSL3::BIO out, Crypt::OpenSSL3::PKey pkey, int indent)
3027             C_ARGS: out, pkey, indent, NULL
3028              
3029             Success EVP_PKEY_print_params(Crypt::OpenSSL3::BIO out, Crypt::OpenSSL3::PKey pkey, int indent)
3030             C_ARGS: out, pkey, indent, NULL
3031              
3032             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::PKey::Context PREFIX = EVP_PKEY_CTX_
3033              
3034              
3035             Crypt::OpenSSL3::PKey::Context EVP_PKEY_CTX_new(SV* classname, Crypt::OpenSSL3::PKey pkey)
3036             C_ARGS: pkey, NULL
3037              
3038             Crypt::OpenSSL3::PKey::Context EVP_PKEY_CTX_new_id(SV* classname, int id)
3039             C_ARGS: id, NULL
3040              
3041             Crypt::OpenSSL3::PKey::Context EVP_PKEY_CTX_new_from_name(SV* classname, const char *name, const char *propquery = "")
3042             C_ARGS: NULL, name, propquery
3043              
3044             Crypt::OpenSSL3::PKey::Context EVP_PKEY_CTX_new_from_pkey(SV* classname, Crypt::OpenSSL3::PKey pkey, const char *propquery = "")
3045             C_ARGS: NULL, pkey, propquery
3046              
3047             Crypt::OpenSSL3::PKey::Context EVP_PKEY_CTX_dup(Crypt::OpenSSL3::PKey::Context ctx)
3048              
3049             bool EVP_PKEY_CTX_set_params(Crypt::OpenSSL3::PKey::Context ctx, PARAMS(EVP_PKEY_CTX) params = NULL)
3050              
3051             SV* EVP_PKEY_CTX_get_param(Crypt::OpenSSL3::PKey::Context ctx, const char* name)
3052             CODE:
3053 0 0         GENERATE_GET_PARAM(EVP_PKEY_CTX, ctx, name)
    0          
    0          
    0          
3054             OUTPUT: RETVAL
3055              
3056              
3057             bool EVP_PKEY_CTX_is_a(Crypt::OpenSSL3::PKey::Context ctx, const char *keytype)
3058              
3059             bool EVP_PKEY_CTX_set_signature_md(Crypt::OpenSSL3::PKey::Context ctx, Crypt::OpenSSL3::MD md)
3060              
3061             void EVP_PKEY_CTX_get_signature_md(Crypt::OpenSSL3::PKey::Context ctx, OUTLIST Crypt::OpenSSL3::MD md)
3062             C_ARGS: ctx, (const EVP_MD**)&md
3063              
3064             bool EVP_PKEY_CTX_set_mac_key(Crypt::OpenSSL3::PKey::Context ctx, const unsigned char *key, int length(key))
3065              
3066             bool EVP_PKEY_CTX_set_group_name(Crypt::OpenSSL3::PKey::Context ctx, const char *name)
3067              
3068             NO_OUTPUT bool EVP_PKEY_CTX_get_group_name(Crypt::OpenSSL3::PKey::Context ctx, OUTLIST SV* name, size_t size = 32)
3069             INIT:
3070 0           char* ptr = (char*)make_buffer(&name, size);
3071             C_ARGS: ctx, ptr, size + 1
3072             POSTCALL:
3073 0 0         if (RETVAL)
3074 0           set_buffer_length(name, strlen(ptr));
3075              
3076             bool EVP_PKEY_CTX_set_kem_op(Crypt::OpenSSL3::PKey::Context ctx, const char *op)
3077              
3078              
3079             bool EVP_PKEY_CTX_set_rsa_padding(Crypt::OpenSSL3::PKey::Context ctx, int pad)
3080              
3081             bool EVP_PKEY_CTX_get_rsa_padding(Crypt::OpenSSL3::PKey::Context ctx, OUT int pad)
3082              
3083             bool EVP_PKEY_CTX_set_rsa_pss_saltlen(Crypt::OpenSSL3::PKey::Context ctx, int saltlen)
3084              
3085             bool EVP_PKEY_CTX_get_rsa_pss_saltlen(Crypt::OpenSSL3::PKey::Context ctx, OUT int saltlen)
3086              
3087             bool EVP_PKEY_CTX_set_rsa_keygen_bits(Crypt::OpenSSL3::PKey::Context ctx, int mbits)
3088              
3089             bool EVP_PKEY_CTX_set_rsa_keygen_primes(Crypt::OpenSSL3::PKey::Context ctx, int primes)
3090              
3091             bool EVP_PKEY_CTX_set_rsa_mgf1_md_name(Crypt::OpenSSL3::PKey::Context ctx, const char *mdname, const char *mdprops)
3092              
3093             bool EVP_PKEY_CTX_set_rsa_mgf1_md(Crypt::OpenSSL3::PKey::Context ctx, Crypt::OpenSSL3::MD md)
3094              
3095             bool EVP_PKEY_CTX_get_rsa_mgf1_md(Crypt::OpenSSL3::PKey::Context ctx, OUT Crypt::OpenSSL3::MD md)
3096             C_ARGS: ctx, (const EVP_MD**)&md
3097              
3098             bool EVP_PKEY_CTX_get_rsa_mgf1_md_name(Crypt::OpenSSL3::PKey::Context ctx, char *name, size_t length(name))
3099              
3100             bool EVP_PKEY_CTX_set_rsa_oaep_md_name(Crypt::OpenSSL3::PKey::Context ctx, const char *mdname, const char *mdprops)
3101              
3102             bool EVP_PKEY_CTX_set_rsa_oaep_md(Crypt::OpenSSL3::PKey::Context ctx, Crypt::OpenSSL3::MD md)
3103              
3104             bool EVP_PKEY_CTX_get_rsa_oaep_md(Crypt::OpenSSL3::PKey::Context ctx, OUT Crypt::OpenSSL3::MD md)
3105             C_ARGS: ctx, (const EVP_MD**)&md
3106              
3107             bool EVP_PKEY_CTX_get_rsa_oaep_md_name(Crypt::OpenSSL3::PKey::Context ctx, char *name, size_t length(name))
3108              
3109             bool EVP_PKEY_CTX_set_rsa_oaep_label(Crypt::OpenSSL3::PKey::Context ctx, char *label, int length(label))
3110              
3111             bool EVP_PKEY_CTX_get_rsa_oaep_label(Crypt::OpenSSL3::PKey::Context ctx, OUT unsigned char *label)
3112              
3113              
3114             bool EVP_PKEY_CTX_set_dsa_paramgen_bits(Crypt::OpenSSL3::PKey::Context ctx, int nbits)
3115              
3116             bool EVP_PKEY_CTX_set_dsa_paramgen_q_bits(Crypt::OpenSSL3::PKey::Context ctx, int qbits)
3117              
3118             bool EVP_PKEY_CTX_set_dsa_paramgen_md(Crypt::OpenSSL3::PKey::Context ctx, Crypt::OpenSSL3::MD md)
3119              
3120             bool EVP_PKEY_CTX_set_dsa_paramgen_md_props(Crypt::OpenSSL3::PKey::Context ctx, const char *md_name, const char *md_properties)
3121              
3122             bool EVP_PKEY_CTX_set_dsa_paramgen_type(Crypt::OpenSSL3::PKey::Context ctx, const char *name)
3123              
3124             bool EVP_PKEY_CTX_set_dsa_paramgen_gindex(Crypt::OpenSSL3::PKey::Context ctx, int gindex)
3125              
3126             bool EVP_PKEY_CTX_set_dsa_paramgen_seed(Crypt::OpenSSL3::PKey::Context ctx, const unsigned char *seed, size_t length(seed))
3127              
3128              
3129             bool EVP_PKEY_CTX_set_dh_paramgen_prime_len(Crypt::OpenSSL3::PKey::Context ctx, int len)
3130              
3131             bool EVP_PKEY_CTX_set_dh_paramgen_subprime_len(Crypt::OpenSSL3::PKey::Context ctx, int len)
3132              
3133             bool EVP_PKEY_CTX_set_dh_paramgen_generator(Crypt::OpenSSL3::PKey::Context ctx, int gen)
3134              
3135             bool EVP_PKEY_CTX_set_dh_paramgen_type(Crypt::OpenSSL3::PKey::Context ctx, int type)
3136              
3137             bool EVP_PKEY_CTX_set_dh_pad(Crypt::OpenSSL3::PKey::Context ctx, int pad)
3138              
3139             bool EVP_PKEY_CTX_set_dh_nid(Crypt::OpenSSL3::PKey::Context ctx, int nid)
3140              
3141             bool EVP_PKEY_CTX_set_dh_rfc5114(Crypt::OpenSSL3::PKey::Context ctx, int rfc5114)
3142              
3143             bool EVP_PKEY_CTX_set_dhx_rfc5114(Crypt::OpenSSL3::PKey::Context ctx, int rfc5114)
3144              
3145             bool EVP_PKEY_CTX_set_dh_paramgen_gindex(Crypt::OpenSSL3::PKey::Context ctx, int gindex)
3146              
3147             bool EVP_PKEY_CTX_set_dh_paramgen_seed(Crypt::OpenSSL3::PKey::Context ctx, const unsigned char *seed, size_t length(seed))
3148              
3149             bool EVP_PKEY_CTX_set_dh_kdf_type(Crypt::OpenSSL3::PKey::Context ctx, int kdf)
3150              
3151             bool EVP_PKEY_CTX_get_dh_kdf_type(Crypt::OpenSSL3::PKey::Context ctx)
3152              
3153             bool EVP_PKEY_CTX_set_dh_kdf_oid(Crypt::OpenSSL3::PKey::Context ctx, Crypt::OpenSSL3::ASN1::Object oid)
3154             C_ARGS: ctx, (ASN1_OBJECT*) oid
3155              
3156             bool EVP_PKEY_CTX_get_dh_kdf_oid(Crypt::OpenSSL3::PKey::Context ctx, OUT Crypt::OpenSSL3::ASN1::Object oid)
3157             C_ARGS: ctx, (ASN1_OBJECT**) &oid
3158              
3159             bool EVP_PKEY_CTX_set_dh_kdf_md(Crypt::OpenSSL3::PKey::Context ctx, Crypt::OpenSSL3::MD md)
3160              
3161             bool EVP_PKEY_CTX_get_dh_kdf_md(Crypt::OpenSSL3::PKey::Context ctx, OUT Crypt::OpenSSL3::MD md)
3162             C_ARGS: ctx, (const EVP_MD**)&md
3163              
3164             bool EVP_PKEY_CTX_set_dh_kdf_outlen(Crypt::OpenSSL3::PKey::Context ctx, int len)
3165              
3166             bool EVP_PKEY_CTX_get_dh_kdf_outlen(Crypt::OpenSSL3::PKey::Context ctx, OUT int len)
3167              
3168              
3169             bool EVP_PKEY_CTX_set_ec_paramgen_curve_nid(Crypt::OpenSSL3::PKey::Context ctx, int nid)
3170              
3171             bool EVP_PKEY_CTX_set_ec_param_enc(Crypt::OpenSSL3::PKey::Context ctx, int param_enc)
3172              
3173             bool EVP_PKEY_CTX_set_ecdh_cofactor_mode(Crypt::OpenSSL3::PKey::Context ctx, int cofactor_mode)
3174              
3175             bool EVP_PKEY_CTX_get_ecdh_cofactor_mode(Crypt::OpenSSL3::PKey::Context ctx)
3176              
3177             bool EVP_PKEY_CTX_set_ecdh_kdf_type(Crypt::OpenSSL3::PKey::Context ctx, int kdf)
3178              
3179             bool EVP_PKEY_CTX_get_ecdh_kdf_type(Crypt::OpenSSL3::PKey::Context ctx)
3180              
3181             bool EVP_PKEY_CTX_set_ecdh_kdf_md(Crypt::OpenSSL3::PKey::Context ctx, Crypt::OpenSSL3::MD md)
3182              
3183             bool EVP_PKEY_CTX_get_ecdh_kdf_md(Crypt::OpenSSL3::PKey::Context ctx, OUT Crypt::OpenSSL3::MD md)
3184             C_ARGS: ctx, (const EVP_MD**)&md
3185              
3186             bool EVP_PKEY_CTX_set_ecdh_kdf_outlen(Crypt::OpenSSL3::PKey::Context ctx, int len)
3187              
3188             bool EVP_PKEY_CTX_get_ecdh_kdf_outlen(Crypt::OpenSSL3::PKey::Context ctx, OUT int len)
3189              
3190             bool EVP_PKEY_CTX_set_id(Crypt::OpenSSL3::PKey::Context ctx, const char* id, size_t length(id))
3191              
3192             bool EVP_PKEY_CTX_get_id(Crypt::OpenSSL3::PKey::Context ctx, SV* id)
3193             CODE:
3194             size_t length;
3195 0           EVP_PKEY_CTX_get1_id_len(ctx, &length);
3196 0           char* ptr = grow_buffer(id, length);
3197 0           RETVAL = EVP_PKEY_CTX_get1_id(ctx, ptr);
3198 0 0         if (RETVAL)
3199 0           set_buffer_length(id, length);
3200             OUTPUT: RETVAL
3201              
3202             bool EVP_PKEY_CTX_set_hkdf_mode(Crypt::OpenSSL3::PKey::Context pctx, int mode)
3203              
3204             bool EVP_PKEY_CTX_set_hkdf_md(Crypt::OpenSSL3::PKey::Context pctx, Crypt::OpenSSL3::MD md)
3205              
3206             bool EVP_PKEY_CTX_set_hkdf_salt(Crypt::OpenSSL3::PKey::Context pctx, unsigned char *salt, int length(salt))
3207              
3208             bool EVP_PKEY_CTX_set_hkdf_key(Crypt::OpenSSL3::PKey::Context pctx, unsigned char *key, int length(key))
3209              
3210             bool EVP_PKEY_CTX_add_hkdf_info(Crypt::OpenSSL3::PKey::Context pctx, unsigned char *info, int length(info))
3211              
3212             #if OPENSSL_VERSION_PREREQ(3, 4)
3213             bool EVP_PKEY_CTX_set_signature(Crypt::OpenSSL3::PKey::Context pctx, const unsigned char *sig, size_t length(sig))
3214             #endif
3215              
3216             int EVP_PKEY_CTX_get_keygen_info(Crypt::OpenSSL3::PKey::Context ctx, int idx)
3217              
3218              
3219             MODULE = Crypt::OpenSSL3 PACKAGE = Crypt::OpenSSL3::PKey::Context PREFIX = EVP_PKEY_
3220              
3221             Success EVP_PKEY_keygen_init(Crypt::OpenSSL3::PKey::Context ctx)
3222              
3223             Success EVP_PKEY_paramgen_init(Crypt::OpenSSL3::PKey::Context ctx)
3224              
3225             NO_OUTPUT int EVP_PKEY_generate(Crypt::OpenSSL3::PKey::Context ctx, OUTLIST Crypt::OpenSSL3::PKey ppkey)
3226             INIT:
3227 2           ppkey = NULL;
3228             POSTCALL:
3229 2 50         if (RETVAL <= 0)
3230 0           XSRETURN_UNDEF;
3231              
3232             Success EVP_PKEY_encapsulate_init(Crypt::OpenSSL3::PKey::Context ctx)
3233             C_ARGS: ctx, NULL
3234              
3235             void EVP_PKEY_encapsulate(Crypt::OpenSSL3::PKey::Context ctx, OUTLIST SV* wrapped_key, OUTLIST SV* gen_key)
3236             CODE:
3237             size_t wrapped_length, gen_length;
3238 1 50         if (EVP_PKEY_encapsulate(ctx, NULL, &wrapped_length, NULL, &gen_length) != 1)
3239 0           XSRETURN_EMPTY;
3240              
3241 1           unsigned char* wrapped_ptr = make_buffer(&wrapped_key, wrapped_length);
3242 1           unsigned char* gen_ptr = make_buffer(&gen_key, gen_length);
3243              
3244 1 50         if (EVP_PKEY_encapsulate(ctx, wrapped_ptr, &wrapped_length, gen_ptr, &gen_length)) {
3245 1           set_buffer_length(wrapped_key, wrapped_length);
3246 1           set_buffer_length(gen_key, gen_length);
3247             } else
3248 0           XSRETURN_EMPTY;
3249              
3250             Success EVP_PKEY_decapsulate_init(Crypt::OpenSSL3::PKey::Context ctx)
3251             C_ARGS: ctx, NULL
3252              
3253             SV* EVP_PKEY_decapsulate(Crypt::OpenSSL3::PKey::Context ctx, const unsigned char *wrapped, size_t length(wrapped))
3254             CODE:
3255             size_t unwrapped_length;
3256 1           int result = EVP_PKEY_decapsulate(ctx, NULL, &unwrapped_length, wrapped, XSauto_length_of_wrapped);
3257 1 50         if (result == 1) {
3258 1           unsigned char* unwrapped_ptr = make_buffer(&RETVAL, unwrapped_length);
3259              
3260 1 50         if (EVP_PKEY_decapsulate(ctx, unwrapped_ptr, &unwrapped_length, wrapped, XSauto_length_of_wrapped) == 1)
3261 1           set_buffer_length(RETVAL, unwrapped_length);
3262             } else
3263 0           RETVAL = &PL_sv_undef;
3264             OUTPUT: RETVAL
3265              
3266             #if OPENSSL_VERSION_PREREQ(3, 2)
3267             Success EVP_PKEY_auth_encapsulate_init(Crypt::OpenSSL3::PKey::Context ctx, Crypt::OpenSSL3::PKey authpriv)
3268             C_ARGS: ctx, authpriv, NULL
3269              
3270             Success EVP_PKEY_auth_decapsulate_init(Crypt::OpenSSL3::PKey::Context ctx, Crypt::OpenSSL3::PKey authpub)
3271             C_ARGS: ctx, authpub, NULL
3272             #endif
3273              
3274             Success EVP_PKEY_encrypt_init(Crypt::OpenSSL3::PKey::Context ctx)
3275             C_ARGS: ctx, NULL
3276              
3277             SV* EVP_PKEY_encrypt(Crypt::OpenSSL3::PKey::Context ctx, const unsigned char *in, size_t length(in))
3278             CODE:
3279             size_t out_length;
3280 0           bool result = EVP_PKEY_encrypt(ctx, NULL, &out_length, in, XSauto_length_of_in);
3281 0 0         if (result == 1) {
3282 0           unsigned char* out_ptr = make_buffer(&RETVAL, out_length);
3283              
3284 0           result = EVP_PKEY_encrypt(ctx, out_ptr, &out_length, in, XSauto_length_of_in);
3285 0 0         if (result == 1)
3286 0           set_buffer_length(RETVAL, out_length);
3287             } else
3288 0           RETVAL = &PL_sv_undef;
3289             OUTPUT: RETVAL
3290              
3291             bool EVP_PKEY_decrypt_init(Crypt::OpenSSL3::PKey::Context ctx)
3292             C_ARGS: ctx, NULL
3293              
3294             SV* EVP_PKEY_decrypt(Crypt::OpenSSL3::PKey::Context ctx, const unsigned char *in, size_t length(in))
3295             CODE:
3296             size_t out_length;
3297 0 0         if (EVP_PKEY_decrypt(ctx, NULL, &out_length, in, XSauto_length_of_in) == 1) {
3298 0           unsigned char* out_ptr = make_buffer(&RETVAL, out_length);
3299              
3300 0 0         if (EVP_PKEY_decrypt(ctx, out_ptr, &out_length, in, XSauto_length_of_in) == 1)
3301 0           set_buffer_length(RETVAL, out_length);
3302             } else
3303 0           RETVAL = &PL_sv_undef;
3304             OUTPUT: RETVAL
3305              
3306             bool EVP_PKEY_derive_init(Crypt::OpenSSL3::PKey::Context ctx)
3307             C_ARGS: ctx, NULL
3308              
3309             bool EVP_PKEY_derive_set_peer(Crypt::OpenSSL3::PKey::Context ctx, Crypt::OpenSSL3::PKey peer, bool validate_peer = false)
3310              
3311             SV* EVP_PKEY_derive(Crypt::OpenSSL3::PKey::Context ctx)
3312             CODE:
3313             size_t key_length;
3314 0 0         if (EVP_PKEY_derive(ctx, NULL, &key_length) == 1) {
3315 0           unsigned char* key_ptr = make_buffer(&RETVAL, key_length);
3316              
3317 0 0         if (EVP_PKEY_derive(ctx, key_ptr, &key_length) == 1)
3318 0           set_buffer_length(RETVAL, key_length);
3319             } else
3320 0           RETVAL = &PL_sv_undef;
3321             OUTPUT: RETVAL
3322              
3323             Success EVP_PKEY_sign_init(Crypt::OpenSSL3::PKey::Context ctx, Crypt::OpenSSL3::Signature type = NULL, CTX_PARAMS(EVP_SIGNATURE) params = NULL)
3324              
3325             SV* EVP_PKEY_sign(Crypt::OpenSSL3::PKey::Context ctx, const unsigned char *tbs, size_t length(tbs))
3326             CODE:
3327             size_t sig_length;
3328 0 0         if (EVP_PKEY_sign(ctx, NULL, &sig_length, tbs, XSauto_length_of_tbs) == 1) {
3329 0           unsigned char* sig_ptr = make_buffer(&RETVAL, sig_length);
3330              
3331 0 0         if (EVP_PKEY_sign(ctx, sig_ptr, &sig_length, tbs, XSauto_length_of_tbs) == 1)
3332 0           set_buffer_length(RETVAL, sig_length);
3333             } else
3334 0           RETVAL = &PL_sv_undef;
3335             OUTPUT: RETVAL
3336              
3337             Success EVP_PKEY_verify_init(Crypt::OpenSSL3::PKey::Context ctx, Crypt::OpenSSL3::Signature type = NULL, CTX_PARAMS(EVP_SIGNATURE) params = NULL)
3338              
3339             Success EVP_PKEY_verify(Crypt::OpenSSL3::PKey::Context ctx, const unsigned char *sig, size_t length(sig), const unsigned char *tbs, size_t length(tbs))
3340              
3341             #if OPENSSL_VERSION_PREREQ(3, 4)
3342             Success EVP_PKEY_sign_message_init(Crypt::OpenSSL3::PKey::Context ctx, Crypt::OpenSSL3::Signature type = NULL, CTX_PARAMS(EVP_SIGNATURE) params = NULL)
3343              
3344             Success EVP_PKEY_sign_message_update(Crypt::OpenSSL3::PKey::Context ctx, unsigned char *in, size_t length(in))
3345              
3346             SV* EVP_PKEY_sign_message_final(Crypt::OpenSSL3::PKey::Context ctx)
3347             CODE:
3348             size_t sigsize;
3349             if (EVP_PKEY_sign_message_final(ctx, NULL, &sigsize) == 1) {
3350             unsigned char* ptr = make_buffer(&RETVAL, sigsize);
3351             if (EVP_PKEY_sign_message_final(ctx, ptr, &sigsize) == 1)
3352             set_buffer_length(RETVAL, sigsize);
3353             } else
3354             RETVAL = &PL_sv_undef;
3355             OUTPUT: RETVAL
3356              
3357             Success EVP_PKEY_verify_message_init(Crypt::OpenSSL3::PKey::Context ctx, Crypt::OpenSSL3::Signature type = NULL, CTX_PARAMS(EVP_SIGNATURE) params = NULL)
3358              
3359             Success EVP_PKEY_verify_message_update(Crypt::OpenSSL3::PKey::Context ctx, unsigned char *in, size_t length(in))
3360              
3361             Success EVP_PKEY_verify_message_final(Crypt::OpenSSL3::PKey::Context ctx)
3362              
3363             #endif