Skip to content

Commit c557579

Browse files
committed
sec1: use base16ct and serdect crates
Uses these crates to impl hex encoding/decoding and serde support
1 parent f0f2457 commit c557579

5 files changed

Lines changed: 23 additions & 85 deletions

File tree

Cargo.lock

Lines changed: 3 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sec1/Cargo.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ edition = "2021"
1616
rust-version = "1.57"
1717

1818
[dependencies]
19+
base16ct = { version = "0.1.1", optional = true, default-features = false, path = "../base16ct" }
1920
der = { version = "=0.6.0-pre.4", optional = true, features = ["oid"], path = "../der" }
2021
generic-array = { version = "0.14.4", optional = true, default-features = false }
2122
pkcs8 = { version = "=0.9.0-pre.3", optional = true, default-features = false, path = "../pkcs8" }
22-
serde = { version = "1.0.16", optional = true, default-features = false }
23+
serdect = { version = "0.1", optional = true, default-features = false, features = ["alloc"], path = "../serdect" }
2324
subtle = { version = "2", optional = true, default-features = false }
2425
zeroize = { version = "1", optional = true, default-features = false }
2526

@@ -31,7 +32,8 @@ tempfile = "3"
3132
default = ["der", "point"]
3233
alloc = ["der/alloc", "pkcs8/alloc", "zeroize/alloc"]
3334
pem = ["alloc", "der/pem", "pkcs8/pem"]
34-
point = ["generic-array"]
35+
point = ["base16ct", "generic-array"]
36+
serde = ["serdect"]
3537
std = ["der/std", "alloc"]
3638

3739
[package.metadata.docs.rs]

sec1/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ pub use pkcs8;
6363
#[cfg(feature = "pkcs8")]
6464
use pkcs8::ObjectIdentifier;
6565

66+
#[cfg(all(doc, feature = "serde"))]
67+
use serdect::serde;
68+
6669
/// Algorithm [`ObjectIdentifier`] for elliptic curve public key cryptography
6770
/// (`id-ecPublicKey`).
6871
///

sec1/src/point.rs

Lines changed: 11 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//! [SEC1: Elliptic Curve Cryptography]: https://www.secg.org/sec1-v2.pdf
77
88
use crate::{Error, Result};
9+
use base16ct::HexDisplay;
910
use core::{
1011
cmp::Ordering,
1112
fmt::{self, Debug},
@@ -21,7 +22,7 @@ use generic_array::{
2122
use 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")]
2728
use 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>
422386
where
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>
450400
where
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

serdect/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ edition = "2021"
1515
rust-version = "1.56"
1616

1717
[dependencies]
18-
base16ct = { version = "0.1.1", default-features = false }
19-
serde = { version = "1", default-features = false }
18+
base16ct = { version = "0.1.1", default-features = false, path = "../base16ct" }
19+
serde = { version = "1.0.96", default-features = false }
2020

2121
# optional features
2222
zeroize = { version = "1", optional = true, default-features = false }

0 commit comments

Comments
 (0)