1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#![no_std]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![doc(
html_logo_url = "https://raw.githubusercontent.com/RustCrypto/meta/master/logo.svg",
html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/meta/master/logo.svg",
html_root_url = "https://docs.rs/p384/0.7.0"
)]
#![forbid(unsafe_code)]
#![warn(missing_docs, rust_2018_idioms, unused_qualifications)]
#[cfg(feature = "ecdsa")]
#[cfg_attr(docsrs, doc(cfg(feature = "ecdsa")))]
pub mod ecdsa;
pub use elliptic_curve;
#[cfg(feature = "pkcs8")]
pub use elliptic_curve::pkcs8;
use elliptic_curve::consts::U48;
#[derive(Clone, Debug, Default, Eq, PartialEq, PartialOrd, Ord)]
pub struct NistP384;
impl elliptic_curve::Curve for NistP384 {
type FieldSize = U48;
}
impl elliptic_curve::weierstrass::Curve for NistP384 {}
#[cfg(target_pointer_width = "32")]
impl elliptic_curve::Order for NistP384 {
type Limbs = [u32; 12];
const ORDER: Self::Limbs = [
0xccc5_2973,
0xecec_196a,
0x48b0_a77a,
0x581a_0db2,
0xf437_2ddf,
0xc763_4d81,
0xffff_ffff,
0xffff_ffff,
0xffff_ffff,
0xffff_ffff,
0xffff_ffff,
0xffff_ffff,
];
}
#[cfg(target_pointer_width = "64")]
impl elliptic_curve::Order for NistP384 {
type Limbs = [u64; 6];
const ORDER: Self::Limbs = [
0xecec_196a_ccc5_2973,
0x581a_0db2_48b0_a77a,
0xc763_4d81_f437_2ddf,
0xffff_ffff_ffff_ffff,
0xffff_ffff_ffff_ffff,
0xffff_ffff_ffff_ffff,
];
}
impl elliptic_curve::weierstrass::PointCompression for NistP384 {
const COMPRESS_POINTS: bool = false;
}
#[cfg(feature = "jwk")]
#[cfg_attr(docsrs, doc(cfg(feature = "jwk")))]
impl elliptic_curve::JwkParameters for NistP384 {
const CRV: &'static str = "P-384";
}
#[cfg(feature = "pkcs8")]
impl elliptic_curve::AlgorithmParameters for NistP384 {
const OID: pkcs8::ObjectIdentifier = pkcs8::ObjectIdentifier::new("1.3.132.0.34");
}
pub type FieldBytes = elliptic_curve::FieldBytes<NistP384>;
pub type EncodedPoint = elliptic_curve::sec1::EncodedPoint<NistP384>;
#[cfg(feature = "zeroize")]
#[cfg_attr(docsrs, doc(cfg(feature = "zeroize")))]
pub type SecretKey = elliptic_curve::SecretKey<NistP384>;
#[cfg(feature = "zeroize")]
#[cfg_attr(docsrs, doc(cfg(feature = "zeroize")))]
pub type SecretBytes = elliptic_curve::SecretBytes<NistP384>;
#[cfg(feature = "zeroize")]
impl elliptic_curve::SecretValue for NistP384 {
type Secret = SecretBytes;
fn from_secret_bytes(bytes: &FieldBytes) -> Option<SecretBytes> {
Some(bytes.clone().into())
}
}
#[cfg(feature = "zeroize")]
impl elliptic_curve::sec1::ValidatePublicKey for NistP384 {}