@@ -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
@@ -575,6 +577,19 @@ fn convert_ssl_error(vm: &VirtualMachine, e: ssl::Error) -> PyBaseExceptionRef {
575
577
}
576
578
}
577
579
580
+ fn parse_version_info ( mut n : i64 ) -> ( u8 , u8 , u8 , u8 , u8 ) {
581
+ let status = ( n & 0xF ) as u8 ;
582
+ n >>= 4 ;
583
+ let patch = ( n & 0xFF ) as u8 ;
584
+ n >>= 8 ;
585
+ let fix = ( n & 0xFF ) as u8 ;
586
+ n >>= 8 ;
587
+ let minor = ( n & 0xFF ) as u8 ;
588
+ n >>= 8 ;
589
+ let major = ( n & 0xFF ) as u8 ;
590
+ ( major, minor, fix, patch, status)
591
+ }
592
+
578
593
pub fn make_module ( vm : & VirtualMachine ) -> PyObjectRef {
579
594
openssl:: init ( ) ;
580
595
let ctx = & vm. ctx ;
@@ -592,6 +607,9 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
592
607
"get_default_verify_paths" => ctx. new_function( ssl_get_default_verify_paths) ,
593
608
594
609
// Constants
610
+ "OPENSSL_VERSION" => ctx. new_str( openssl:: version:: version( ) . to_owned( ) ) ,
611
+ "OPENSSL_VERSION_NUMBER" => ctx. new_int( openssl:: version:: number( ) ) ,
612
+ "OPENSSL_VERSION_INFO" => parse_version_info( openssl:: version:: number( ) ) . into_pyobject( vm) . unwrap( ) ,
595
613
"PROTOCOL_SSLv2" => ctx. new_int( SslVersion :: Ssl2 as u32 ) ,
596
614
"PROTOCOL_SSLv3" => ctx. new_int( SslVersion :: Ssl3 as u32 ) ,
597
615
"PROTOCOL_SSLv23" => ctx. new_int( SslVersion :: Tls as u32 ) ,
0 commit comments