@@ -18,6 +18,7 @@ use crate::x509::store::X509Lookup;
18
18
use crate :: x509:: store:: X509StoreBuilder ;
19
19
#[ cfg( any( ossl102, boringssl, libressl261) ) ]
20
20
use crate :: x509:: verify:: { X509VerifyFlags , X509VerifyParam } ;
21
+ use crate :: x509:: X509KeyUsage ;
21
22
#[ cfg( any( ossl102, boringssl) ) ]
22
23
use crate :: x509:: X509PurposeId ;
23
24
#[ cfg( any( ossl102, boringssl, libressl261) ) ]
@@ -1192,3 +1193,63 @@ fn test_store_all_certificates() {
1192
1193
1193
1194
assert_eq ! ( store. all_certificates( ) . len( ) , 1 ) ;
1194
1195
}
1196
+
1197
+ #[ test]
1198
+ fn should_get_x509_key_usage ( ) {
1199
+ let pkey = pkey ( ) ;
1200
+
1201
+ let mut name = X509Name :: builder ( ) . unwrap ( ) ;
1202
+ name. append_entry_by_nid ( Nid :: COMMONNAME , "key_usage.com" )
1203
+ . unwrap ( ) ;
1204
+ let name = name. build ( ) ;
1205
+
1206
+ let mut builder = X509 :: builder ( ) . unwrap ( ) ;
1207
+ builder. set_version ( 2 ) . unwrap ( ) ;
1208
+ builder. set_subject_name ( & name) . unwrap ( ) ;
1209
+ builder. set_issuer_name ( & name) . unwrap ( ) ;
1210
+ builder
1211
+ . set_not_before ( & Asn1Time :: days_from_now ( 0 ) . unwrap ( ) )
1212
+ . unwrap ( ) ;
1213
+ builder
1214
+ . set_not_after ( & Asn1Time :: days_from_now ( 365 ) . unwrap ( ) )
1215
+ . unwrap ( ) ;
1216
+ builder. set_pubkey ( & pkey) . unwrap ( ) ;
1217
+
1218
+ let mut serial = BigNum :: new ( ) . unwrap ( ) ;
1219
+ serial. rand ( 128 , MsbOption :: MAYBE_ZERO , false ) . unwrap ( ) ;
1220
+ builder
1221
+ . set_serial_number ( & serial. to_asn1_integer ( ) . unwrap ( ) )
1222
+ . unwrap ( ) ;
1223
+
1224
+ let key_usage = KeyUsage :: new ( )
1225
+ . digital_signature ( )
1226
+ . key_encipherment ( )
1227
+ . build ( )
1228
+ . unwrap ( ) ;
1229
+ builder. append_extension ( key_usage) . unwrap ( ) ;
1230
+ builder. sign ( & pkey, MessageDigest :: sha256 ( ) ) . unwrap ( ) ;
1231
+
1232
+ let x509 = builder. build ( ) ;
1233
+
1234
+ assert ! ( pkey. public_eq( & x509. public_key( ) . unwrap( ) ) ) ;
1235
+ assert ! ( x509. verify( & pkey) . unwrap( ) ) ;
1236
+
1237
+ let cn = x509
1238
+ . subject_name ( )
1239
+ . entries_by_nid ( Nid :: COMMONNAME )
1240
+ . next ( )
1241
+ . unwrap ( ) ;
1242
+ assert_eq ! ( cn. data( ) . as_slice( ) , b"key_usage.com" ) ;
1243
+
1244
+ let usage = x509. key_usage ( ) ;
1245
+ assert ! ( usage. contains( X509KeyUsage :: DIGITAL_SIGNATURE ) ) ;
1246
+ assert ! ( usage. contains( X509KeyUsage :: KEY_ENCIPHERMENT ) ) ;
1247
+ assert ! ( !usage. contains( X509KeyUsage :: CRL_SIGN ) ) ;
1248
+ assert ! ( !usage. contains( X509KeyUsage :: NON_REPUDIATION ) ) ;
1249
+ assert ! ( !usage. contains( X509KeyUsage :: DATA_ENCIPHERMENT ) ) ;
1250
+ assert ! ( !usage. contains( X509KeyUsage :: KEY_AGREEMENT ) ) ;
1251
+ assert ! ( !usage. contains( X509KeyUsage :: KEY_CERT_SIGN ) ) ;
1252
+ assert ! ( !usage. contains( X509KeyUsage :: CRL_SIGN ) ) ;
1253
+ assert ! ( !usage. contains( X509KeyUsage :: ENCIPHER_ONLY ) ) ;
1254
+ assert ! ( !usage. contains( X509KeyUsage :: DECIPHER_ONLY ) ) ;
1255
+ }
0 commit comments