@@ -10,7 +10,6 @@ mod encrypting_key;
1010pub use self :: { decrypting_key:: DecryptingKey , encrypting_key:: EncryptingKey } ;
1111
1212use alloc:: boxed:: Box ;
13- use alloc:: string:: { String , ToString } ;
1413use alloc:: vec:: Vec ;
1514use core:: fmt;
1615
@@ -45,7 +44,7 @@ pub struct Oaep {
4544 pub mgf_digest : Box < dyn DynDigest + Send + Sync > ,
4645
4746 /// Optional label.
48- pub label : Option < String > ,
47+ pub label : Option < Box < [ u8 ] > > ,
4948}
5049
5150impl Oaep {
@@ -75,13 +74,13 @@ impl Oaep {
7574 }
7675
7776 /// 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 ] > > > (
7978 label : S ,
8079 ) -> Self {
8180 Self {
8281 digest : Box :: new ( T :: new ( ) ) ,
8382 mgf_digest : Box :: new ( T :: new ( ) ) ,
84- label : Some ( label. as_ref ( ) . to_string ( ) ) ,
83+ label : Some ( label. into ( ) ) ,
8584 }
8685 }
8786
@@ -118,14 +117,14 @@ impl Oaep {
118117 pub fn new_with_mgf_hash_and_label <
119118 T : ' static + Digest + DynDigest + Send + Sync ,
120119 U : ' static + Digest + DynDigest + Send + Sync ,
121- S : AsRef < str > ,
120+ S : Into < Box < [ u8 ] > > ,
122121 > (
123122 label : S ,
124123 ) -> Self {
125124 Self {
126125 digest : Box :: new ( T :: new ( ) ) ,
127126 mgf_digest : Box :: new ( U :: new ( ) ) ,
128- label : Some ( label. as_ref ( ) . to_string ( ) ) ,
127+ label : Some ( label. into ( ) ) ,
129128 }
130129 }
131130}
@@ -188,7 +187,7 @@ fn encrypt<R: CryptoRngCore + ?Sized>(
188187 msg : & [ u8 ] ,
189188 digest : & mut dyn DynDigest ,
190189 mgf_digest : & mut dyn DynDigest ,
191- label : Option < String > ,
190+ label : Option < Box < [ u8 ] > > ,
192191) -> Result < Vec < u8 > > {
193192 key:: check_public ( pub_key) ?;
194193
@@ -209,7 +208,7 @@ fn encrypt_digest<R: CryptoRngCore + ?Sized, D: Digest, MGD: Digest + FixedOutpu
209208 rng : & mut R ,
210209 pub_key : & RsaPublicKey ,
211210 msg : & [ u8 ] ,
212- label : Option < String > ,
211+ label : Option < Box < [ u8 ] > > ,
213212) -> Result < Vec < u8 > > {
214213 key:: check_public ( pub_key) ?;
215214
@@ -238,7 +237,7 @@ fn decrypt<R: CryptoRngCore + ?Sized>(
238237 ciphertext : & [ u8 ] ,
239238 digest : & mut dyn DynDigest ,
240239 mgf_digest : & mut dyn DynDigest ,
241- label : Option < String > ,
240+ label : Option < Box < [ u8 ] > > ,
242241) -> Result < Vec < u8 > > {
243242 if ciphertext. len ( ) != priv_key. size ( ) {
244243 return Err ( Error :: Decryption ) ;
@@ -267,7 +266,7 @@ fn decrypt_digest<R: CryptoRngCore + ?Sized, D: Digest, MGD: Digest + FixedOutpu
267266 rng : Option < & mut R > ,
268267 priv_key : & RsaPrivateKey ,
269268 ciphertext : & [ u8 ] ,
270- label : Option < String > ,
269+ label : Option < Box < [ u8 ] > > ,
271270) -> Result < Vec < u8 > > {
272271 key:: check_public ( priv_key) ?;
273272
@@ -288,7 +287,6 @@ mod tests {
288287 use crate :: traits:: PublicKeyParts ;
289288 use crate :: traits:: { Decryptor , RandomizedDecryptor , RandomizedEncryptor } ;
290289
291- use alloc:: string:: String ;
292290 use digest:: { Digest , DynDigest , FixedOutputReset } ;
293291 use num_bigint:: BigUint ;
294292 use num_traits:: FromPrimitive ;
@@ -362,18 +360,12 @@ mod tests {
362360 do_test_oaep_with_different_hashes :: < Sha3_512 , Sha1 > ( & priv_key) ;
363361 }
364362
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 ] > > {
370364 let mut buf = [ 0u8 ; 32 ] ;
371365 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 ( ) )
377369 } else {
378370 None
379371 }
@@ -398,7 +390,7 @@ mod tests {
398390 let pub_key: RsaPublicKey = prk. into ( ) ;
399391
400392 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 ( ) ) ;
402394 pub_key. encrypt ( & mut rng, padding, & input) . unwrap ( )
403395 } else {
404396 let padding = Oaep :: new :: < D > ( ) ;
@@ -408,8 +400,8 @@ mod tests {
408400 assert_ne ! ( input, ciphertext) ;
409401 let blind: bool = rng. next_u32 ( ) < ( 1 << 31 ) ;
410402
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)
413405 } else {
414406 Oaep :: new :: < D > ( )
415407 } ;
@@ -446,7 +438,7 @@ mod tests {
446438 let pub_key: RsaPublicKey = prk. into ( ) ;
447439
448440 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 ( ) ) ;
450442 pub_key. encrypt ( & mut rng, padding, & input) . unwrap ( )
451443 } else {
452444 let padding = Oaep :: new_with_mgf_hash :: < D , U > ( ) ;
@@ -456,7 +448,7 @@ mod tests {
456448 assert_ne ! ( input, ciphertext) ;
457449 let blind: bool = rng. next_u32 ( ) < ( 1 << 31 ) ;
458450
459- let padding = if let Some ( ref label) = label {
451+ let padding = if let Some ( label) = label {
460452 Oaep :: new_with_mgf_hash_and_label :: < D , U , _ > ( label)
461453 } else {
462454 Oaep :: new_with_mgf_hash :: < D , U > ( )
@@ -484,7 +476,7 @@ mod tests {
484476 priv_key
485477 . decrypt_blinded(
486478 & mut rng,
487- Oaep :: new_with_label:: <Sha1 , _>( "label" ) ,
479+ Oaep :: new_with_label:: <Sha1 , _>( "label" . as_bytes ( ) ) ,
488480 & ciphertext,
489481 )
490482 . is_err( ) ,
@@ -572,7 +564,7 @@ mod tests {
572564 let priv_key = get_private_key ( ) ;
573565 let pub_key: RsaPublicKey = ( & priv_key) . into ( ) ;
574566 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 ( ) ) ;
576568 let ciphertext = encrypting_key
577569 . encrypt_with_rng ( & mut rng, "a_plain_text" . as_bytes ( ) )
578570 . unwrap ( ) ;
0 commit comments