@@ -10,7 +10,6 @@ mod encrypting_key;
10
10
pub use self :: { decrypting_key:: DecryptingKey , encrypting_key:: EncryptingKey } ;
11
11
12
12
use alloc:: boxed:: Box ;
13
- use alloc:: string:: { String , ToString } ;
14
13
use alloc:: vec:: Vec ;
15
14
use core:: fmt;
16
15
@@ -45,7 +44,7 @@ pub struct Oaep {
45
44
pub mgf_digest : Box < dyn DynDigest + Send + Sync > ,
46
45
47
46
/// Optional label.
48
- pub label : Option < String > ,
47
+ pub label : Option < Box < [ u8 ] > > ,
49
48
}
50
49
51
50
impl Oaep {
@@ -75,13 +74,13 @@ impl Oaep {
75
74
}
76
75
77
76
/// Create a new OAEP `PaddingScheme` with an associated `label`, using `T` as the hash function for both the label and for MGF1.
78
- pub fn new_with_label < T : ' static + Digest + DynDigest + Send + Sync , S : AsRef < str > > (
77
+ pub fn new_with_label < T : ' static + Digest + DynDigest + Send + Sync , S : Into < Box < [ u8 ] > > > (
79
78
label : S ,
80
79
) -> Self {
81
80
Self {
82
81
digest : Box :: new ( T :: new ( ) ) ,
83
82
mgf_digest : Box :: new ( T :: new ( ) ) ,
84
- label : Some ( label. as_ref ( ) . to_string ( ) ) ,
83
+ label : Some ( label. into ( ) ) ,
85
84
}
86
85
}
87
86
@@ -118,14 +117,14 @@ impl Oaep {
118
117
pub fn new_with_mgf_hash_and_label <
119
118
T : ' static + Digest + DynDigest + Send + Sync ,
120
119
U : ' static + Digest + DynDigest + Send + Sync ,
121
- S : AsRef < str > ,
120
+ S : Into < Box < [ u8 ] > > ,
122
121
> (
123
122
label : S ,
124
123
) -> Self {
125
124
Self {
126
125
digest : Box :: new ( T :: new ( ) ) ,
127
126
mgf_digest : Box :: new ( U :: new ( ) ) ,
128
- label : Some ( label. as_ref ( ) . to_string ( ) ) ,
127
+ label : Some ( label. into ( ) ) ,
129
128
}
130
129
}
131
130
}
@@ -188,7 +187,7 @@ fn encrypt<R: CryptoRngCore + ?Sized>(
188
187
msg : & [ u8 ] ,
189
188
digest : & mut dyn DynDigest ,
190
189
mgf_digest : & mut dyn DynDigest ,
191
- label : Option < String > ,
190
+ label : Option < Box < [ u8 ] > > ,
192
191
) -> Result < Vec < u8 > > {
193
192
key:: check_public ( pub_key) ?;
194
193
@@ -209,7 +208,7 @@ fn encrypt_digest<R: CryptoRngCore + ?Sized, D: Digest, MGD: Digest + FixedOutpu
209
208
rng : & mut R ,
210
209
pub_key : & RsaPublicKey ,
211
210
msg : & [ u8 ] ,
212
- label : Option < String > ,
211
+ label : Option < Box < [ u8 ] > > ,
213
212
) -> Result < Vec < u8 > > {
214
213
key:: check_public ( pub_key) ?;
215
214
@@ -238,7 +237,7 @@ fn decrypt<R: CryptoRngCore + ?Sized>(
238
237
ciphertext : & [ u8 ] ,
239
238
digest : & mut dyn DynDigest ,
240
239
mgf_digest : & mut dyn DynDigest ,
241
- label : Option < String > ,
240
+ label : Option < Box < [ u8 ] > > ,
242
241
) -> Result < Vec < u8 > > {
243
242
if ciphertext. len ( ) != priv_key. size ( ) {
244
243
return Err ( Error :: Decryption ) ;
@@ -267,7 +266,7 @@ fn decrypt_digest<R: CryptoRngCore + ?Sized, D: Digest, MGD: Digest + FixedOutpu
267
266
rng : Option < & mut R > ,
268
267
priv_key : & RsaPrivateKey ,
269
268
ciphertext : & [ u8 ] ,
270
- label : Option < String > ,
269
+ label : Option < Box < [ u8 ] > > ,
271
270
) -> Result < Vec < u8 > > {
272
271
key:: check_public ( priv_key) ?;
273
272
@@ -288,7 +287,6 @@ mod tests {
288
287
use crate :: traits:: PublicKeyParts ;
289
288
use crate :: traits:: { Decryptor , RandomizedDecryptor , RandomizedEncryptor } ;
290
289
291
- use alloc:: string:: String ;
292
290
use digest:: { Digest , DynDigest , FixedOutputReset } ;
293
291
use num_bigint:: BigUint ;
294
292
use num_traits:: FromPrimitive ;
@@ -362,18 +360,12 @@ mod tests {
362
360
do_test_oaep_with_different_hashes :: < Sha3_512 , Sha1 > ( & priv_key) ;
363
361
}
364
362
365
- fn get_label ( rng : & mut ChaCha8Rng ) -> Option < String > {
366
- const GEN_ASCII_STR_CHARSET : & [ u8 ; 64 ] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ\
367
- abcdefghijklmnopqrstuvwxyz\
368
- 0123456789=+";
369
-
363
+ fn get_label ( rng : & mut ChaCha8Rng ) -> Option < Box < [ u8 ] > > {
370
364
let mut buf = [ 0u8 ; 32 ] ;
371
365
rng. fill_bytes ( & mut buf) ;
372
- if buf[ 0 ] < ( 1 << 7 ) {
373
- for v in buf. iter_mut ( ) {
374
- * v = GEN_ASCII_STR_CHARSET [ ( * v >> 2 ) as usize ] ;
375
- }
376
- Some ( core:: str:: from_utf8 ( & buf) . unwrap ( ) . to_string ( ) )
366
+
367
+ if rng. next_u32 ( ) % 2 == 0 {
368
+ Some ( buf. into ( ) )
377
369
} else {
378
370
None
379
371
}
@@ -398,7 +390,7 @@ mod tests {
398
390
let pub_key: RsaPublicKey = prk. into ( ) ;
399
391
400
392
let ciphertext = if let Some ( ref label) = label {
401
- let padding = Oaep :: new_with_label :: < D , _ > ( label) ;
393
+ let padding = Oaep :: new_with_label :: < D , _ > ( label. clone ( ) ) ;
402
394
pub_key. encrypt ( & mut rng, padding, & input) . unwrap ( )
403
395
} else {
404
396
let padding = Oaep :: new :: < D > ( ) ;
@@ -408,8 +400,8 @@ mod tests {
408
400
assert_ne ! ( input, ciphertext) ;
409
401
let blind: bool = rng. next_u32 ( ) < ( 1 << 31 ) ;
410
402
411
- let padding = if let Some ( ref label) = label {
412
- Oaep :: new_with_label :: < D , _ > ( label)
403
+ let padding = if let Some ( label) = label {
404
+ Oaep :: new_with_label :: < D , Box < [ u8 ] > > ( label)
413
405
} else {
414
406
Oaep :: new :: < D > ( )
415
407
} ;
@@ -446,7 +438,7 @@ mod tests {
446
438
let pub_key: RsaPublicKey = prk. into ( ) ;
447
439
448
440
let ciphertext = if let Some ( ref label) = label {
449
- let padding = Oaep :: new_with_mgf_hash_and_label :: < D , U , _ > ( label) ;
441
+ let padding = Oaep :: new_with_mgf_hash_and_label :: < D , U , _ > ( label. clone ( ) ) ;
450
442
pub_key. encrypt ( & mut rng, padding, & input) . unwrap ( )
451
443
} else {
452
444
let padding = Oaep :: new_with_mgf_hash :: < D , U > ( ) ;
@@ -456,7 +448,7 @@ mod tests {
456
448
assert_ne ! ( input, ciphertext) ;
457
449
let blind: bool = rng. next_u32 ( ) < ( 1 << 31 ) ;
458
450
459
- let padding = if let Some ( ref label) = label {
451
+ let padding = if let Some ( label) = label {
460
452
Oaep :: new_with_mgf_hash_and_label :: < D , U , _ > ( label)
461
453
} else {
462
454
Oaep :: new_with_mgf_hash :: < D , U > ( )
@@ -484,7 +476,7 @@ mod tests {
484
476
priv_key
485
477
. decrypt_blinded(
486
478
& mut rng,
487
- Oaep :: new_with_label:: <Sha1 , _>( "label" ) ,
479
+ Oaep :: new_with_label:: <Sha1 , _>( "label" . as_bytes ( ) ) ,
488
480
& ciphertext,
489
481
)
490
482
. is_err( ) ,
@@ -572,7 +564,7 @@ mod tests {
572
564
let priv_key = get_private_key ( ) ;
573
565
let pub_key: RsaPublicKey = ( & priv_key) . into ( ) ;
574
566
let encrypting_key = EncryptingKey :: < Sha1 > :: new ( pub_key) ;
575
- let decrypting_key = DecryptingKey :: < Sha1 > :: new_with_label ( priv_key, "label" ) ;
567
+ let decrypting_key = DecryptingKey :: < Sha1 > :: new_with_label ( priv_key, "label" . as_bytes ( ) ) ;
576
568
let ciphertext = encrypting_key
577
569
. encrypt_with_rng ( & mut rng, "a_plain_text" . as_bytes ( ) )
578
570
. unwrap ( ) ;
0 commit comments