nss_sys/
cert.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use libc::{c_char, c_uint, c_int, c_void};
6use nspr::{PLArenaPool, PRBool, PRUint32, PRCList};
7use super::{SECItem, SECAlgorithmID, NSSTrustDomainStr, NSSCertificateStr, PK11SlotInfo, CK_OBJECT_HANDLE, SECStatus};
8
9pub type CERTCertList = CERTCertListStr;
10pub type CERTCertListNode = CERTCertListNodeStr;
11pub type CERTCertificate = CERTCertificateStr;
12pub type CERTSignedData = CERTSignedDataStr;
13pub type CERTName = CERTNameStr;
14pub type CERTRDN = CERTRDNStr;
15pub type CERTAVA = CERTAVAStr;
16pub type CERTValidity = CERTValidityStr;
17pub type CERTSubjectPublicKeyInfo = CERTSubjectPublicKeyInfoStr;
18pub type CERTCertExtension = CERTCertExtensionStr;
19pub type CERTCertDBHandle = NSSTrustDomainStr;
20pub type CERTOKDomainName = CERTOKDomainNameStr;
21pub type CERTCertTrust = CERTCertTrustStr;
22pub type CERTSubjectList = CERTSubjectListStr;
23pub type CERTSubjectNode = CERTSubjectNodeStr;
24pub type CERTAuthKeyID = CERTAuthKeyIDStr;
25pub type CERTGeneralName = CERTGeneralNameStr;
26
27#[derive(Debug)]
28#[repr(C)]
29pub struct CERTCertListStr {
30    pub list: PRCList,
31    pub arena: *mut PLArenaPool,
32}
33
34#[derive(Debug)]
35#[repr(C)]
36pub struct CERTCertListNodeStr {
37    pub links: PRCList,
38    pub cert: *mut CERTCertificate,
39    pub appData: *mut c_void,
40}
41
42#[derive(Debug)]
43#[repr(C)]
44pub struct CERTCertificateStr {
45    pub arena: *mut PLArenaPool,
46    pub subjectName: *mut c_char,
47    pub issuerName: *mut c_char,
48    pub signatureWrap: CERTSignedData,
49    pub derCert: SECItem,
50    pub derIssuer: SECItem,
51    pub derSubject: SECItem,
52    pub derPublicKey: SECItem,
53    pub certKey: SECItem,
54    pub version: SECItem,
55    pub serialNumber: SECItem,
56    pub signature: SECAlgorithmID,
57    pub issuer: CERTName,
58    pub validity: CERTValidity,
59    pub subject: CERTName,
60    pub subjectPublicKeyInfo: CERTSubjectPublicKeyInfo,
61    pub issuerID: SECItem,
62    pub subjectID: SECItem,
63    pub extensions: *mut *mut CERTCertExtension,
64    pub emailAddr: *mut c_char,
65    pub dbhandle: *mut CERTCertDBHandle,
66    pub subjectKeyID: SECItem,
67    pub keyIDGenerated: PRBool,
68    pub keyUsage: c_uint,
69    pub rawKeyUsage: c_uint,
70    pub keyUsagePresent: PRBool,
71    pub nsCertType: PRUint32,
72    pub keepSession: PRBool,
73    pub timeOK: PRBool,
74    pub domainOK: *mut CERTOKDomainName,
75    pub isperm: PRBool,
76    pub istemp: PRBool,
77    pub nickname: *mut c_char,
78    pub dbnickname: *mut c_char,
79    pub nssCertificate: *mut NSSCertificateStr,
80    pub trust: *mut CERTCertTrust,
81    pub referenceCount: c_int,
82    pub subjectList: *mut CERTSubjectList,
83    pub authKeyID: *mut CERTAuthKeyID,
84    pub isRoot: PRBool,
85    // In C, `options` is a union of a `void*` and an `unsigned int : 1` bitfield.
86    // The comment also indicates that it's used only be "the browser" and
87    // not by NSS itself, so exposing it in detail may not be necessary.
88    pub options: usize,
89    pub series: c_int,
90    pub slot: *mut PK11SlotInfo,
91    pub pkcs11ID: CK_OBJECT_HANDLE,
92    pub ownSlot: PRBool,
93}
94
95#[derive(Debug)]
96#[repr(C)]
97pub struct CERTSignedDataStr {
98    pub data: SECItem,
99    pub signatureAlgorithm: SECAlgorithmID,
100    pub signature: SECItem,
101}
102
103#[derive(Debug)]
104#[repr(C)]
105pub struct CERTNameStr {
106    pub arena: *mut PLArenaPool,
107    pub rdns: *mut *mut CERTRDN,
108}
109
110#[derive(Debug)]
111#[repr(C)]
112pub struct CERTRDNStr {
113    pub avas: *mut *mut CERTAVA,
114}
115
116#[derive(Debug)]
117#[repr(C)]
118pub struct CERTAVAStr {
119    pub type_: SECItem,
120    pub value: SECItem,
121}
122
123#[derive(Debug)]
124#[repr(C)]
125pub struct CERTValidityStr {
126    pub arena: *mut PLArenaPool,
127    pub notBefore: SECItem,
128    pub notAfter: SECItem,
129}
130
131#[derive(Debug)]
132#[repr(C)]
133pub struct CERTSubjectPublicKeyInfoStr {
134    pub arena: *mut PLArenaPool,
135    pub algorithm: SECAlgorithmID,
136    pub subjectPublicKey: SECItem,
137}
138
139#[derive(Debug)]
140#[repr(C)]
141pub struct CERTCertExtensionStr {
142    pub id: SECItem,
143    pub critical: SECItem,
144    pub value: SECItem,
145}
146
147#[derive(Debug)]
148#[repr(C)]
149pub struct CERTOKDomainNameStr {
150    pub next: *mut CERTOKDomainName,
151    // Actually a variable-length array (null-terminated), but can't
152    // use an unsized `[c_char]` in Rust because that would make raw
153    // pointers to this struct have an extra length word, which is
154    // wrong.  This is good enough for reading the string (getting the
155    // address, calling `strlen`, and creating a slice); if Rust code
156    // needs to construct one of these then that might need raw
157    // pointer arithmetic.
158    pub name0: c_char,
159}
160
161#[derive(Debug)]
162#[repr(C)]
163// This might need some accompanying enums....
164pub struct CERTCertTrustStr {
165    pub sslFlags: c_uint,
166    pub emailFlags: c_uint,
167    pub objectSigningFlags: c_uint,
168}
169
170#[derive(Debug)]
171#[repr(C)]
172pub struct CERTSubjectListStr {
173    pub arena: *mut PLArenaPool,
174    pub ncerts: c_int,
175    pub emailAddr: *mut c_char,
176    pub head: *mut CERTSubjectNode,
177    pub tail: *mut CERTSubjectNode,
178    pub entry: *mut c_void,
179}
180
181#[derive(Debug)]
182#[repr(C)]
183pub struct CERTSubjectNodeStr {
184    pub next: *mut CERTSubjectNodeStr,
185    pub prev: *mut CERTSubjectNodeStr,
186    pub certKey: SECItem,
187    pub keyID: SECItem,
188}
189
190#[derive(Debug)]
191#[repr(C)]
192pub struct CERTAuthKeyIDStr {
193    pub keyID: SECItem,
194    pub authCertIssuer: *mut CERTGeneralName,
195    pub authCertSerialNumber: SECItem,
196    pub DERAuthCertIssuer: *mut *mut SECItem,
197}
198
199// FIXME -- has union
200pub enum CERTGeneralNameStr { }
201
202extern "C" {
203    pub fn CERT_DestroyCertificate(cert: *mut CERTCertificate);
204    pub fn CERT_DestroyCertList(cert: *mut CERTCertList);
205    pub fn CERT_VerifyCertName(cert: *const CERTCertificate, hn: *const c_char) -> SECStatus;
206}