3 static int p5_ssl_ex_ssl_ptr=0;
4 static int p5_ssl_ex_ssl_info_callback=0;
5 static int p5_ssl_ex_ssl_ctx_ptr=0;
6 static int p5_ssl_ctx_ex_ssl_info_callback=0;
8 typedef struct ssl_ic_args_st {
13 static void p5_ssl_info_callback(ssl,mode,ret)
21 me=(SV *)SSL_get_ex_data(ssl,p5_ssl_ex_ssl_ptr);
22 cb=(SV *)SSL_get_ex_data(ssl,p5_ssl_ex_ssl_info_callback);
24 cb=(SV *)SSL_CTX_get_ex_data(
25 SSL_get_SSL_CTX(ssl),p5_ssl_ctx_ex_ssl_info_callback);
32 XPUSHs(sv_2mortal(newSViv(mode)));
33 XPUSHs(sv_2mortal(newSViv(ret)));
36 i=perl_call_sv(cb,G_DISCARD);
40 croak("Internal error in SSL p5_ssl_info_callback");
47 SSL_get_ex_new_index(0,"SSLeay::SSL",ex_new,NULL,ex_cleanup);
48 p5_ssl_ex_ssl_info_callback=
49 SSL_get_ex_new_index(0,"ssl_info_callback",NULL,NULL,
51 p5_ssl_ex_ssl_ctx_ptr=
52 SSL_get_ex_new_index(0,"ssl_ctx_ptr",NULL,NULL,
54 p5_ssl_ctx_ex_ssl_info_callback=
55 SSL_CTX_get_ex_new_index(0,"ssl_ctx_info_callback",NULL,NULL,
60 MODULE = SSLeay::SSL PACKAGE = SSLeay::SSL::CTX PREFIX = p5_SSL_CTX_
71 pr_name("p5_SSL_CTX_new");
72 if ((items == 1) && SvPOK(ST(0)))
73 method=SvPV(ST(0),na);
74 else if ((items == 2) && SvPOK(ST(1)))
75 method=SvPV(ST(1),na);
77 croak("Usage: SSLeay::SSL_CTX::new(type)");
79 if (strcmp(method,"SSLv3") == 0)
81 else if (strcmp(method,"SSLv3_client") == 0)
82 meth=SSLv3_client_method();
83 else if (strcmp(method,"SSLv3_server") == 0)
84 meth=SSLv3_server_method();
85 else if (strcmp(method,"SSLv23") == 0)
87 else if (strcmp(method,"SSLv23_client") == 0)
88 meth=SSLv23_client_method();
89 else if (strcmp(method,"SSLv23_server") == 0)
90 meth=SSLv23_server_method();
91 else if (strcmp(method,"SSLv2") == 0)
93 else if (strcmp(method,"SSLv2_client") == 0)
94 meth=SSLv2_client_method();
95 else if (strcmp(method,"SSLv2_server") == 0)
96 meth=SSLv2_server_method();
99 croak("Not passed a valid SSL method name, should be 'SSLv[23] [client|server]'");
102 PUSHs(sv_newmortal());
103 ctx=SSL_CTX_new(meth);
104 sv_setref_pv(ST(0), "SSLeay::SSL::CTX", (void*)ctx);
107 p5_SSL_CTX_use_PrivateKey_file(ctx,file,...)
111 int i=SSL_FILETYPE_PEM;
114 pr_name("p5_SSL_CTX_use_PrivateKey_file");
116 croak("SSLeay::SSL::CTX::use_PrivateKey_file(ssl_ctx,file[,type])");
120 if (strcmp(ptr,"der") == 0)
125 RETVAL=SSL_CTX_use_RSAPrivateKey_file(ctx,file,i);
130 p5_SSL_CTX_set_options(ctx,...)
137 pr_name("p5_SSL_CTX_set_options");
139 for (i=1; i<items; i++)
142 croak("Usage: SSLeay::SSL_CTX::set_options(ssl_ctx[,option,value]+)");
144 if (strcmp(ptr,"-info_callback") == 0)
146 SSL_CTX_set_info_callback(ctx,
147 p5_ssl_info_callback);
148 sv=sv_mortalcopy(ST(i+1));
150 SSL_CTX_set_ex_data(ctx,
151 p5_ssl_ctx_ex_ssl_info_callback,
157 croak("SSLeay::SSL_CTX::set_options(): unknown option");
162 p5_SSL_CTX_DESTROY(ctx)
167 pr_name_d("p5_SSL_CTX_DESTROY",ctx->references);
170 MODULE = SSLeay::SSL PACKAGE = SSLeay::SSL PREFIX = p5_SSL_
181 pr_name("p5_SSL_new");
182 if ((items != 1) && (items != 2))
183 croak("Usage: SSLeay::SSL::new(ssl_ctx)");
184 if (sv_derived_from(ST(items-1),"SSLeay::SSL::CTX"))
186 IV tmp = SvIV((SV*)SvRV(ST(items-1)));
191 croak("ssl_ctx is not of type SSLeay::SSL::CTX");
194 PUSHs(sv_newmortal());
196 sv_setref_pv(ST(0), "SSLeay::SSL", (void*)ssl);
198 /* Now this is being a little hairy, we keep a pointer to
199 * our perl reference. We need to do a different one
200 * to the one we return because it will have it's reference
201 * count droped to 0 apon return and if we up its reference
202 * count, it will never be DESTROYED */
204 SSL_set_ex_data(ssl,p5_ssl_ex_ssl_ptr,(char *)arg);
205 SvREFCNT_inc(sv_ctx);
206 SSL_set_ex_data(ssl,p5_ssl_ex_ssl_ctx_ptr,(char *)sv_ctx);
212 RETVAL=SSL_connect(ssl);
220 RETVAL=SSL_connect(ssl);
225 p5_SSL_sysread(ssl,in,num, ...)
244 croak("Offset outside string");
248 if ((num+offset) > olen)
250 SvGROW(in,num+offset+1);
252 memset(&(p[olen]),0,(num+offset)-olen+1);
256 i=SSL_read(ssl,p+offset,num);
259 SvCUR_set(in,offset+i);
264 p5_SSL_syswrite(ssl,in, ...)
276 len=SvOK(ST(2))?SvIV(ST(2)):in_len;
282 if (-offset > in_len)
283 croak("Offset outside string");
286 else if ((offset >= in_len) && (in_len > 0))
287 croak("Offset outside string");
289 if (len >= (in_len-offset))
295 RETVAL=SSL_write(ssl,ptr+offset,len);
300 p5_SSL_set_bio(ssl,bio)
305 SSL_set_bio(ssl,bio,bio);
308 p5_SSL_set_options(ssl,...)
315 pr_name("p5_SSL_set_options");
317 for (i=1; i<items; i++)
320 croak("Usage: SSLeay::SSL::set_options(ssl[,option,value]+)");
322 if (strcmp(ptr,"-info_callback") == 0)
324 SSL_set_info_callback(ssl,
325 p5_ssl_info_callback);
326 sv=sv_mortalcopy(ST(i+1));
329 p5_ssl_ex_ssl_info_callback,(char *)sv);
332 else if (strcmp(ptr,"-connect_state") == 0)
334 SSL_set_connect_state(ssl);
336 else if (strcmp(ptr,"-accept_state") == 0)
338 SSL_set_accept_state(ssl);
342 croak("SSLeay::SSL::set_options(): unknown option");
352 pr_name("p5_SSL_state");
354 PUSHs(sv_newmortal());
355 state=SSL_state(ssl);
356 sv_setpv(ST(0),SSL_state_string_long(ssl));
357 sv_setiv(ST(0),state);
364 pr_name_dd("p5_SSL_DESTROY",ssl->references,ssl->ctx->references);
365 fprintf(stderr,"SSL_DESTROY %d\n",ssl->references);
369 p5_SSL_references(ssl)
372 RETVAL=ssl->references;
377 p5_SSL_do_handshake(ssl)
380 RETVAL=SSL_do_handshake(ssl);
385 p5_SSL_renegotiate(ssl)
388 RETVAL=SSL_renegotiate(ssl);
396 RETVAL=SSL_shutdown(ssl);
401 p5_SSL_get_version(ssl)
404 RETVAL=SSL_get_version(ssl);
409 p5_SSL_get_current_cipher(ssl)
412 RETVAL=SSL_get_current_cipher(ssl);
417 p5_SSL_get_peer_certificate(ssl)
420 RETVAL=SSL_get_peer_certificate(ssl);
424 MODULE = SSLeay::SSL PACKAGE = SSLeay::SSL::CIPHER PREFIX = p5_SSL_CIPHER_
427 p5_SSL_CIPHER_get_bits(sc)
433 PUSHs(sv_newmortal());
434 PUSHs(sv_newmortal());
435 ret=SSL_CIPHER_get_bits(sc,&i);
436 sv_setiv(ST(0),(IV)ret);
437 sv_setiv(ST(1),(IV)i);
440 p5_SSL_CIPHER_get_version(sc)
443 RETVAL=SSL_CIPHER_get_version(sc);
448 p5_SSL_CIPHER_get_name(sc)
451 RETVAL=SSL_CIPHER_get_name(sc);
455 MODULE = SSLeay::SSL PACKAGE = SSLeay::BIO PREFIX = p5_BIO_
465 if ((i=BIO_get_ssl(bio,&ssl)) > 0)
467 ret=(SV *)SSL_get_ex_data(ssl,p5_ssl_ex_ssl_ptr);
468 ret=sv_mortalcopy(ret);