@@ -6,7 +6,9 @@ use crate::obj::objbyteinner::PyBytesLike;
6
6
use crate :: obj:: objbytes:: PyBytesRef ;
7
7
use crate :: obj:: objstr:: { PyString , PyStringRef } ;
8
8
use crate :: obj:: { objtype:: PyClassRef , objweakref:: PyWeak } ;
9
- use crate :: pyobject:: { PyClassImpl , PyObjectRef , PyRef , PyResult , PyValue , TryFromObject } ;
9
+ use crate :: pyobject:: {
10
+ IntoPyObject , PyClassImpl , PyObjectRef , PyRef , PyResult , PyValue , TryFromObject ,
11
+ } ;
10
12
use crate :: types:: create_type;
11
13
use crate :: VirtualMachine ;
12
14
@@ -577,6 +579,19 @@ fn convert_ssl_error(vm: &VirtualMachine, e: ssl::Error) -> PyBaseExceptionRef {
577
579
}
578
580
}
579
581
582
+ fn parse_version_info ( mut n : i64 ) -> ( u8 , u8 , u8 , u8 , u8 ) {
583
+ let status = ( n & 0xF ) as u8 ;
584
+ n >>= 4 ;
585
+ let patch = ( n & 0xFF ) as u8 ;
586
+ n >>= 8 ;
587
+ let fix = ( n & 0xFF ) as u8 ;
588
+ n >>= 8 ;
589
+ let minor = ( n & 0xFF ) as u8 ;
590
+ n >>= 8 ;
591
+ let major = ( n & 0xFF ) as u8 ;
592
+ ( major, minor, fix, patch, status)
593
+ }
594
+
580
595
pub fn make_module ( vm : & VirtualMachine ) -> PyObjectRef {
581
596
openssl:: init ( ) ;
582
597
let ctx = & vm. ctx ;
@@ -594,6 +609,9 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
594
609
"get_default_verify_paths" => ctx. new_function( ssl_get_default_verify_paths) ,
595
610
596
611
// Constants
612
+ "OPENSSL_VERSION" => ctx. new_str( openssl:: version:: version( ) . to_owned( ) ) ,
613
+ "OPENSSL_VERSION_NUMBER" => ctx. new_int( openssl:: version:: number( ) ) ,
614
+ "OPENSSL_VERSION_INFO" => parse_version_info( openssl:: version:: number( ) ) . into_pyobject( vm) . unwrap( ) ,
597
615
"PROTOCOL_SSLv2" => ctx. new_int( SslVersion :: Ssl2 as u32 ) ,
598
616
"PROTOCOL_SSLv3" => ctx. new_int( SslVersion :: Ssl3 as u32 ) ,
599
617
"PROTOCOL_SSLv23" => ctx. new_int( SslVersion :: Tls as u32 ) ,
0 commit comments