@@ -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
use crypto_bigint:: BoxedUint ;
@@ -44,7 +43,7 @@ pub struct Oaep {
44
43
pub mgf_digest : Box < dyn DynDigest + Send + Sync > ,
45
44
46
45
/// Optional label.
47
- pub label : Option < String > ,
46
+ pub label : Option < Box < [ u8 ] > > ,
48
47
}
49
48
50
49
impl Oaep {
@@ -77,13 +76,13 @@ impl Oaep {
77
76
}
78
77
79
78
/// Create a new OAEP `PaddingScheme` with an associated `label`, using `T` as the hash function for both the label and for MGF1.
80
- pub fn new_with_label < T : ' static + Digest + DynDigest + Send + Sync , S : AsRef < str > > (
79
+ pub fn new_with_label < T : ' static + Digest + DynDigest + Send + Sync , S : Into < Box < [ u8 ] > > > (
81
80
label : S ,
82
81
) -> Self {
83
82
Self {
84
83
digest : Box :: new ( T :: new ( ) ) ,
85
84
mgf_digest : Box :: new ( T :: new ( ) ) ,
86
- label : Some ( label. as_ref ( ) . to_string ( ) ) ,
85
+ label : Some ( label. into ( ) ) ,
87
86
}
88
87
}
89
88
@@ -123,14 +122,14 @@ impl Oaep {
123
122
pub fn new_with_mgf_hash_and_label <
124
123
T : ' static + Digest + DynDigest + Send + Sync ,
125
124
U : ' static + Digest + DynDigest + Send + Sync ,
126
- S : AsRef < str > ,
125
+ S : Into < Box < [ u8 ] > > ,
127
126
> (
128
127
label : S ,
129
128
) -> Self {
130
129
Self {
131
130
digest : Box :: new ( T :: new ( ) ) ,
132
131
mgf_digest : Box :: new ( U :: new ( ) ) ,
133
- label : Some ( label. as_ref ( ) . to_string ( ) ) ,
132
+ label : Some ( label. into ( ) ) ,
134
133
}
135
134
}
136
135
}
@@ -193,7 +192,7 @@ fn encrypt<R: CryptoRngCore + ?Sized>(
193
192
msg : & [ u8 ] ,
194
193
digest : & mut dyn DynDigest ,
195
194
mgf_digest : & mut dyn DynDigest ,
196
- label : Option < String > ,
195
+ label : Option < Box < [ u8 ] > > ,
197
196
) -> Result < Vec < u8 > > {
198
197
key:: check_public ( pub_key) ?;
199
198
@@ -214,7 +213,7 @@ fn encrypt_digest<R: CryptoRngCore + ?Sized, D: Digest, MGD: Digest + FixedOutpu
214
213
rng : & mut R ,
215
214
pub_key : & RsaPublicKey ,
216
215
msg : & [ u8 ] ,
217
- label : Option < String > ,
216
+ label : Option < Box < [ u8 ] > > ,
218
217
) -> Result < Vec < u8 > > {
219
218
key:: check_public ( pub_key) ?;
220
219
@@ -243,7 +242,7 @@ fn decrypt<R: CryptoRngCore + ?Sized>(
243
242
ciphertext : & [ u8 ] ,
244
243
digest : & mut dyn DynDigest ,
245
244
mgf_digest : & mut dyn DynDigest ,
246
- label : Option < String > ,
245
+ label : Option < Box < [ u8 ] > > ,
247
246
) -> Result < Vec < u8 > > {
248
247
if ciphertext. len ( ) != priv_key. size ( ) {
249
248
return Err ( Error :: Decryption ) ;
@@ -274,7 +273,7 @@ fn decrypt_digest<R: CryptoRngCore + ?Sized, D: Digest, MGD: Digest + FixedOutpu
274
273
rng : Option < & mut R > ,
275
274
priv_key : & RsaPrivateKey ,
276
275
ciphertext : & [ u8 ] ,
277
- label : Option < String > ,
276
+ label : Option < Box < [ u8 ] > > ,
278
277
) -> Result < Vec < u8 > > {
279
278
key:: check_public ( priv_key) ?;
280
279
@@ -296,7 +295,6 @@ mod tests {
296
295
use crate :: traits:: PublicKeyParts ;
297
296
use crate :: traits:: { Decryptor , RandomizedDecryptor , RandomizedEncryptor } ;
298
297
299
- use alloc:: string:: String ;
300
298
use crypto_bigint:: { BoxedUint , Odd } ;
301
299
use digest:: { Digest , DynDigest , FixedOutputReset } ;
302
300
use rand_chacha:: {
@@ -369,18 +367,12 @@ mod tests {
369
367
do_test_oaep_with_different_hashes :: < Sha3_512 , Sha1 > ( & priv_key) ;
370
368
}
371
369
372
- fn get_label ( rng : & mut ChaCha8Rng ) -> Option < String > {
373
- const GEN_ASCII_STR_CHARSET : & [ u8 ; 64 ] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ\
374
- abcdefghijklmnopqrstuvwxyz\
375
- 0123456789=+";
376
-
370
+ fn get_label ( rng : & mut ChaCha8Rng ) -> Option < Box < [ u8 ] > > {
377
371
let mut buf = [ 0u8 ; 32 ] ;
378
372
rng. fill_bytes ( & mut buf) ;
379
- if buf[ 0 ] < ( 1 << 7 ) {
380
- for v in buf. iter_mut ( ) {
381
- * v = GEN_ASCII_STR_CHARSET [ ( * v >> 2 ) as usize ] ;
382
- }
383
- Some ( core:: str:: from_utf8 ( & buf) . unwrap ( ) . to_string ( ) )
373
+
374
+ if rng. next_u32 ( ) % 2 == 0 {
375
+ Some ( buf. into ( ) )
384
376
} else {
385
377
None
386
378
}
@@ -405,7 +397,7 @@ mod tests {
405
397
let pub_key: RsaPublicKey = prk. into ( ) ;
406
398
407
399
let ciphertext = if let Some ( ref label) = label {
408
- let padding = Oaep :: new_with_label :: < D , _ > ( label) ;
400
+ let padding = Oaep :: new_with_label :: < D , _ > ( label. clone ( ) ) ;
409
401
pub_key. encrypt ( & mut rng, padding, & input) . unwrap ( )
410
402
} else {
411
403
let padding = Oaep :: new :: < D > ( ) ;
@@ -415,8 +407,8 @@ mod tests {
415
407
assert_ne ! ( input, ciphertext) ;
416
408
let blind: bool = rng. next_u32 ( ) < ( 1 << 31 ) ;
417
409
418
- let padding = if let Some ( ref label) = label {
419
- Oaep :: new_with_label :: < D , _ > ( label)
410
+ let padding = if let Some ( label) = label {
411
+ Oaep :: new_with_label :: < D , Box < [ u8 ] > > ( label)
420
412
} else {
421
413
Oaep :: new :: < D > ( )
422
414
} ;
@@ -453,7 +445,7 @@ mod tests {
453
445
let pub_key: RsaPublicKey = prk. into ( ) ;
454
446
455
447
let ciphertext = if let Some ( ref label) = label {
456
- let padding = Oaep :: new_with_mgf_hash_and_label :: < D , U , _ > ( label) ;
448
+ let padding = Oaep :: new_with_mgf_hash_and_label :: < D , U , _ > ( label. clone ( ) ) ;
457
449
pub_key. encrypt ( & mut rng, padding, & input) . unwrap ( )
458
450
} else {
459
451
let padding = Oaep :: new_with_mgf_hash :: < D , U > ( ) ;
@@ -463,7 +455,7 @@ mod tests {
463
455
assert_ne ! ( input, ciphertext) ;
464
456
let blind: bool = rng. next_u32 ( ) < ( 1 << 31 ) ;
465
457
466
- let padding = if let Some ( ref label) = label {
458
+ let padding = if let Some ( label) = label {
467
459
Oaep :: new_with_mgf_hash_and_label :: < D , U , _ > ( label)
468
460
} else {
469
461
Oaep :: new_with_mgf_hash :: < D , U > ( )
@@ -491,7 +483,7 @@ mod tests {
491
483
priv_key
492
484
. decrypt_blinded(
493
485
& mut rng,
494
- Oaep :: new_with_label:: <Sha1 , _>( "label" ) ,
486
+ Oaep :: new_with_label:: <Sha1 , _>( "label" . as_bytes ( ) ) ,
495
487
& ciphertext,
496
488
)
497
489
. is_err( ) ,
@@ -579,7 +571,7 @@ mod tests {
579
571
let priv_key = get_private_key ( ) ;
580
572
let pub_key: RsaPublicKey = ( & priv_key) . into ( ) ;
581
573
let encrypting_key = EncryptingKey :: < Sha1 > :: new ( pub_key) ;
582
- let decrypting_key = DecryptingKey :: < Sha1 > :: new_with_label ( priv_key, "label" ) ;
574
+ let decrypting_key = DecryptingKey :: < Sha1 > :: new_with_label ( priv_key, "label" . as_bytes ( ) ) ;
583
575
let ciphertext = encrypting_key
584
576
. encrypt_with_rng ( & mut rng, "a_plain_text" . as_bytes ( ) )
585
577
. unwrap ( ) ;
0 commit comments