1
1
use std:: cmp:: Ordering ;
2
+ use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr } ;
3
+ use std:: str:: FromStr ;
2
4
3
5
use crate :: asn1:: { Asn1Object , Asn1OctetString , Asn1Time } ;
4
6
use crate :: bn:: { BigNum , MsbOption } ;
@@ -11,7 +13,7 @@ use crate::ssl::SslFiletype;
11
13
use crate :: stack:: Stack ;
12
14
use crate :: x509:: extension:: {
13
15
AuthorityKeyIdentifier , BasicConstraints , ExtendedKeyUsage , KeyUsage , SubjectAlternativeName ,
14
- SubjectKeyIdentifier ,
16
+ SubjectKeyIdentifier , SbgpAsIdentifier , SbgpIpAddressIdentifier
15
17
} ;
16
18
#[ cfg( not( boringssl) ) ]
17
19
use crate :: x509:: store:: X509Lookup ;
@@ -27,6 +29,7 @@ use crate::x509::{CrlReason, X509Builder};
27
29
use crate :: x509:: {
28
30
CrlStatus , X509Crl , X509Extension , X509Name , X509Req , X509StoreContext , X509VerifyResult , X509 ,
29
31
} ;
32
+ use crate :: x509:: sbgp:: ExtractSBGPInfo ;
30
33
31
34
#[ cfg( ossl110) ]
32
35
use foreign_types:: ForeignType ;
@@ -1177,3 +1180,46 @@ fn test_dist_point_null() {
1177
1180
let cert = X509 :: from_pem ( cert) . unwrap ( ) ;
1178
1181
assert ! ( cert. crl_distribution_points( ) . is_none( ) ) ;
1179
1182
}
1183
+
1184
+ #[ test]
1185
+ fn test_sbgp_extensions_parsing ( ) {
1186
+ let cert = include_bytes ! ( "../../test/rfc3779.pem" ) ;
1187
+ let cert = X509 :: from_pem ( cert) . unwrap ( ) ;
1188
+
1189
+ let asn_ranges = cert. asn ( ) . unwrap ( ) . ranges ( ) . unwrap ( ) ;
1190
+ assert_eq ! ( asn_ranges[ 0 ] , ( 10 , 18 ) ) ;
1191
+ assert_eq ! ( asn_ranges[ 1 ] , ( 20 , 20 ) ) ;
1192
+
1193
+ let families = cert. ip_addresses ( ) . unwrap ( ) ;
1194
+ for family in families {
1195
+ let ranges = family. range ( ) . unwrap ( ) ;
1196
+ for ( ip_min, ip_max) in ranges {
1197
+ if let ( IpAddr :: V6 ( a_v6_min) , IpAddr :: V6 ( a_v6_max) ) = ( ip_min, ip_max) {
1198
+ assert_eq ! ( a_v6_min, Ipv6Addr :: from_str( "fd00::" ) . unwrap( ) ) ;
1199
+ assert_eq ! ( a_v6_max, Ipv6Addr :: from_str( "fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" ) . unwrap( ) ) ;
1200
+ }
1201
+ if let ( IpAddr :: V4 ( a_v4_min) , IpAddr :: V4 ( a_v4_max) ) = ( ip_min, ip_max) {
1202
+ assert_eq ! ( a_v4_min, Ipv4Addr :: from_str( "10.0.0.0" ) . unwrap( ) ) ;
1203
+ assert_eq ! ( a_v4_max, Ipv4Addr :: from_str( "10.0.0.255" ) . unwrap( ) ) ;
1204
+ }
1205
+ }
1206
+ }
1207
+ }
1208
+
1209
+ #[ test]
1210
+ fn test_sbgp_extensions_builder ( ) {
1211
+ let mut builder = X509Builder :: new ( ) . unwrap ( ) ;
1212
+ let asn_ext = SbgpAsIdentifier :: new ( )
1213
+ . critical ( )
1214
+ . add_asn ( 32 )
1215
+ . add_asn_range ( 10 , 20 )
1216
+ . build ( & builder. x509v3_context ( None , None ) ) . unwrap ( ) ;
1217
+ builder. append_extension ( asn_ext) . unwrap ( ) ;
1218
+
1219
+ let mut ip_addr_ext = SbgpIpAddressIdentifier :: new ( ) ;
1220
+ ip_addr_ext. critical ( ) ;
1221
+ ip_addr_ext. add_ipv6_addr_range ( Ipv6Addr :: from_str ( "fd00::" ) . unwrap ( ) , Ipv6Addr :: from_str ( "fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" ) . unwrap ( ) ) ;
1222
+ ip_addr_ext. add_ipv4_addr_range ( Ipv4Addr :: from_str ( "10.0.0.0" ) . unwrap ( ) , Ipv4Addr :: from_str ( "10.0.0.255" ) . unwrap ( ) ) ;
1223
+ let build_ext = ip_addr_ext. build ( & builder. x509v3_context ( None , None ) ) . unwrap ( ) ;
1224
+ builder. append_extension ( build_ext) . unwrap ( ) ;
1225
+ }
0 commit comments