66//! [SEC1: Elliptic Curve Cryptography]: https://www.secg.org/sec1-v2.pdf
77
88use crate :: { Error , Result } ;
9+ use base16ct:: HexDisplay ;
910use core:: {
1011 cmp:: Ordering ,
1112 fmt:: { self , Debug } ,
@@ -21,7 +22,7 @@ use generic_array::{
2122use alloc:: boxed:: Box ;
2223
2324#[ cfg( feature = "serde" ) ]
24- use serde:: { de, ser, Deserialize , Serialize } ;
25+ use serdect :: serde:: { de, ser, Deserialize , Serialize } ;
2526
2627#[ cfg( feature = "subtle" ) ]
2728use subtle:: { Choice , ConditionallySelectable } ;
@@ -348,10 +349,7 @@ where
348349 Size : ModulusSize ,
349350{
350351 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
351- for byte in self . as_bytes ( ) {
352- write ! ( f, "{:02x}" , byte) ?;
353- }
354- Ok ( ( ) )
352+ write ! ( f, "{:x}" , HexDisplay ( self . as_bytes( ) ) )
355353 }
356354}
357355
@@ -360,10 +358,7 @@ where
360358 Size : ModulusSize ,
361359{
362360 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
363- for byte in self . as_bytes ( ) {
364- write ! ( f, "{:02X}" , byte) ?;
365- }
366- Ok ( ( ) )
361+ write ! ( f, "{:X}" , HexDisplay ( self . as_bytes( ) ) )
367362 }
368363}
369364
@@ -378,41 +373,10 @@ where
378373 type Err = Error ;
379374
380375 fn from_str ( hex : & str ) -> Result < Self > {
381- let mut buffer = GenericArray :: < u8 , Size :: UncompressedPointSize > :: default ( ) ;
382- let decoded_len = hex. as_bytes ( ) . len ( ) / 2 ;
383-
384- if hex. as_bytes ( ) . len ( ) % 2 != 0 || decoded_len > buffer. len ( ) {
385- return Err ( Error :: PointEncoding ) ;
386- }
387-
388- let mut upper_case = None ;
389-
390- // Ensure all characters are valid and case is not mixed
391- for & byte in hex. as_bytes ( ) {
392- match byte {
393- b'0' ..=b'9' => ( ) ,
394- b'a' ..=b'z' => match upper_case {
395- Some ( true ) => return Err ( Error :: PointEncoding ) ,
396- Some ( false ) => ( ) ,
397- None => upper_case = Some ( false ) ,
398- } ,
399- b'A' ..=b'Z' => match upper_case {
400- Some ( true ) => ( ) ,
401- Some ( false ) => return Err ( Error :: PointEncoding ) ,
402- None => upper_case = Some ( true ) ,
403- } ,
404- _ => return Err ( Error :: PointEncoding ) ,
405- }
406- }
407-
408- for ( digit, byte) in hex. as_bytes ( ) . chunks_exact ( 2 ) . zip ( buffer. iter_mut ( ) ) {
409- * byte = str:: from_utf8 ( digit)
410- . ok ( )
411- . and_then ( |s| u8:: from_str_radix ( s, 16 ) . ok ( ) )
412- . ok_or ( Error :: PointEncoding ) ?;
413- }
414-
415- Self :: from_bytes ( & buffer[ ..decoded_len] )
376+ let mut buf = GenericArray :: < u8 , Size :: UncompressedPointSize > :: default ( ) ;
377+ base16ct:: mixed:: decode ( hex, & mut buf)
378+ . map_err ( |_| Error :: PointEncoding )
379+ . and_then ( Self :: from_bytes)
416380 }
417381}
418382
@@ -422,25 +386,11 @@ impl<Size> Serialize for EncodedPoint<Size>
422386where
423387 Size : ModulusSize ,
424388{
425- #[ cfg( not( feature = "alloc" ) ) ]
426389 fn serialize < S > ( & self , serializer : S ) -> core:: result:: Result < S :: Ok , S :: Error >
427390 where
428391 S : ser:: Serializer ,
429392 {
430- self . as_bytes ( ) . serialize ( serializer)
431- }
432-
433- #[ cfg( feature = "alloc" ) ]
434- fn serialize < S > ( & self , serializer : S ) -> core:: result:: Result < S :: Ok , S :: Error >
435- where
436- S : ser:: Serializer ,
437- {
438- use alloc:: string:: ToString ;
439- if serializer. is_human_readable ( ) {
440- self . to_string ( ) . serialize ( serializer)
441- } else {
442- self . as_bytes ( ) . serialize ( serializer)
443- }
393+ serdect:: slice:: serialize_hex_upper_or_bin ( & self . as_bytes ( ) , serializer)
444394 }
445395}
446396
@@ -450,30 +400,12 @@ impl<'de, Size> Deserialize<'de> for EncodedPoint<Size>
450400where
451401 Size : ModulusSize ,
452402{
453- #[ cfg( not( feature = "alloc" ) ) ]
454- fn deserialize < D > ( deserializer : D ) -> core:: result:: Result < Self , D :: Error >
455- where
456- D : de:: Deserializer < ' de > ,
457- {
458- use de:: Error ;
459- <& [ u8 ] >:: deserialize ( deserializer)
460- . and_then ( |slice| Self :: from_bytes ( slice) . map_err ( D :: Error :: custom) )
461- }
462-
463- #[ cfg( feature = "alloc" ) ]
464403 fn deserialize < D > ( deserializer : D ) -> core:: result:: Result < Self , D :: Error >
465404 where
466405 D : de:: Deserializer < ' de > ,
467406 {
468- use de:: Error ;
469- if deserializer. is_human_readable ( ) {
470- <& str >:: deserialize ( deserializer) ?
471- . parse ( )
472- . map_err ( D :: Error :: custom)
473- } else {
474- <& [ u8 ] >:: deserialize ( deserializer)
475- . and_then ( |bytes| Self :: from_bytes ( bytes) . map_err ( D :: Error :: custom) )
476- }
407+ let bytes = serdect:: slice:: deserialize_hex_or_bin_vec ( deserializer) ?;
408+ Self :: from_bytes ( & bytes) . map_err ( de:: Error :: custom)
477409 }
478410}
479411
0 commit comments