csv_rs/crypto/key/
group.rs1use openssl::{ec, nid};
6use serde::{Deserialize, Serialize};
7use std::io::{Error, ErrorKind, Result};
8
9#[repr(C)]
10#[derive(Debug, Copy, Clone, PartialEq, Eq, Deserialize, Serialize)]
11pub struct Group(u32);
12
13impl Group {
14 pub const SM2_256: Group = Group(3u32.to_le());
15
16 pub fn size(self) -> Result<usize> {
17 Ok(match self {
18 Group::SM2_256 => 32,
19 _ => return Err(ErrorKind::InvalidInput.into()),
20 })
21 }
22}
23
24impl TryFrom<Group> for nid::Nid {
25 type Error = Error;
26 fn try_from(value: Group) -> Result<Self> {
27 Ok(match value {
28 Group::SM2_256 => nid::Nid::SM2,
29 _ => return Err(ErrorKind::InvalidInput.into()),
30 })
31 }
32}
33
34impl TryFrom<nid::Nid> for Group {
35 type Error = Error;
36
37 fn try_from(value: nid::Nid) -> Result<Self> {
38 Ok(match value {
39 nid::Nid::SM2 => Group::SM2_256,
40 _ => return Err(ErrorKind::InvalidInput.into()),
41 })
42 }
43}
44
45impl TryFrom<Group> for ec::EcGroup {
46 type Error = Error;
47
48 fn try_from(value: Group) -> Result<Self> {
49 Ok(ec::EcGroup::from_curve_name(value.try_into()?)?)
50 }
51}
52
53impl TryFrom<&ec::EcGroupRef> for Group {
54 type Error = Error;
55
56 fn try_from(value: &ec::EcGroupRef) -> Result<Self> {
57 value
58 .curve_name()
59 .ok_or(ErrorKind::InvalidInput)?
60 .try_into()
61 }
62}