Skip to main content

csv_rs/crypto/key/
group.rs

1// Copyright (C) Hygon Info Technologies Ltd.
2//
3// SPDX-License-Identifier: Apache-2.0
4
5use 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}