summaryrefslogtreecommitdiffstats
path: root/security/nss/lib/cryptohi/cryptohi.h
blob: e529fa34f5c81bb9ea3993f9cab0a3441248d2c8 (plain)
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
/*
 * cryptohi.h - public prototypes for the crypto library
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef _CRYPTOHI_H_
#define _CRYPTOHI_H_

#include "blapit.h"

#include "seccomon.h"
#include "secoidt.h"
#include "secdert.h"
#include "cryptoht.h"
#include "keyt.h"
#include "certt.h"

SEC_BEGIN_PROTOS

/****************************************/
/*
** DER encode/decode (EC)DSA signatures
*/

/* ANSI X9.57 defines DSA signatures as DER encoded data.  Our DSA1 code (and
 * most of the rest of the world) just generates 40 bytes of raw data.  These
 * functions convert between formats.
 */
extern SECStatus DSAU_EncodeDerSig(SECItem *dest, SECItem *src);
extern SECItem *DSAU_DecodeDerSig(const SECItem *item);

/*
 * Unlike DSA1, raw DSA2 and ECDSA signatures do not have a fixed length.
 * Rather they contain two integers r and s whose length depends
 * on the size of q or the EC key used for signing.
 *
 * We can reuse the DSAU_EncodeDerSig interface to DER encode
 * raw ECDSA signature keeping in mind that the length of r
 * is the same as that of s and exactly half of src->len.
 *
 * For decoding, we need to pass the length of the desired
 * raw signature (twice the key size) explicitly.
 */
extern SECStatus DSAU_EncodeDerSigWithLen(SECItem *dest, SECItem *src,
                                          unsigned int len);
extern SECItem *DSAU_DecodeDerSigToLen(const SECItem *item, unsigned int len);

/****************************************/
/*
** Signature creation operations
*/

/*
** Create a new signature context used for signing a data stream.
**      "alg" the signature algorithm to use (e.g. SEC_OID_PKCS1_MD5_WITH_RSA_ENCRYPTION)
**	"privKey" the private key to use
*/
extern SGNContext *SGN_NewContext(SECOidTag alg, SECKEYPrivateKey *privKey);

/*
** Create a new signature context from an algorithmID.
**      "alg" the signature algorithm to use
**	"privKey" the private key to use
*/
extern SGNContext *SGN_NewContextWithAlgorithmID(SECAlgorithmID *alg,
                                                 SECKEYPrivateKey *privKey);

/*
** Destroy a signature-context object
**	"cx" the object
**	"freeit" if PR_TRUE then free the object as well as its sub-objects
*/
extern void SGN_DestroyContext(SGNContext *cx, PRBool freeit);

/*
** Reset the signing context "cx" to its initial state, preparing it for
** another stream of data.
*/
extern SECStatus SGN_Begin(SGNContext *cx);

/*
** Update the signing context with more data to sign.
**	"cx" the context
**	"input" the input data to sign
**	"inputLen" the length of the input data
*/
extern SECStatus SGN_Update(SGNContext *cx, const unsigned char *input,
                            unsigned int inputLen);

/*
** Finish the signature process. Use either k0 or k1 to sign the data
** stream that was input using SGN_Update. The resulting signature is
** formatted using PKCS#1 and then encrypted using RSA private or public
** encryption.
**	"cx" the context
**	"result" the final signature data (memory is allocated)
*/
extern SECStatus SGN_End(SGNContext *cx, SECItem *result);

/*
** Sign a single block of data using private key encryption and given
** signature/hash algorithm.
**	"result" the final signature data (memory is allocated)
**	"buf" the input data to sign
**	"len" the amount of data to sign
**	"pk" the private key to encrypt with
**	"algid" the signature/hash algorithm to sign with
**		(must be compatible with the key type).
*/
extern SECStatus SEC_SignData(SECItem *result,
                              const unsigned char *buf, int len,
                              SECKEYPrivateKey *pk, SECOidTag algid);

/*
** Sign a single block of data using private key encryption and given
** signature/hash algorithm with parameters from an algorithmID.
**	"result" the final signature data (memory is allocated)
**	"buf" the input data to sign
**	"len" the amount of data to sign
**	"pk" the private key to encrypt with
**	"algid" the signature/hash algorithm to sign with
**		(must be compatible with the key type).
*/
extern SECStatus SEC_SignDataWithAlgorithmID(SECItem *result,
                                             const unsigned char *buf, int len,
                                             SECKEYPrivateKey *pk,
                                             SECAlgorithmID *algid);

/*
** Sign a pre-digested block of data using private key encryption, encoding
**  The given signature/hash algorithm.
**	"result" the final signature data (memory is allocated)
**	"digest" the digest to sign
**	"privKey" the private key to encrypt with
**	"algtag" The algorithm tag to encode (need for RSA only)
*/
extern SECStatus SGN_Digest(SECKEYPrivateKey *privKey,
                            SECOidTag algtag, SECItem *result, SECItem *digest);

/*
** DER sign a single block of data using private key encryption and the
** MD5 hashing algorithm. This routine first computes a digital signature
** using SEC_SignData, then wraps it with an CERTSignedData and then der
** encodes the result.
**	"arena" is the memory arena to use to allocate data from
** 	"result" the final der encoded data (memory is allocated)
** 	"buf" the input data to sign
** 	"len" the amount of data to sign
** 	"pk" the private key to encrypt with
*/
extern SECStatus SEC_DerSignData(PLArenaPool *arena, SECItem *result,
                                 const unsigned char *buf, int len,
                                 SECKEYPrivateKey *pk, SECOidTag algid);

/*
** DER sign a single block of data using private key encryption and
** the given signature/hash algorithm with parameters from an
** algorithmID. This routine first computes a digital signature using
** SEC_SignData, then wraps it with an CERTSignedData and then der
** encodes the result.
**	"arena" is the memory arena to use to allocate data from
** 	"result" the final der encoded data (memory is allocated)
** 	"buf" the input data to sign
** 	"len" the amount of data to sign
** 	"pk" the private key to encrypt with
**	"algid" the signature/hash algorithm to sign with
**		(must be compatible with the key type).
*/
extern SECStatus SEC_DerSignDataWithAlgorithmID(PLArenaPool *arena,
                                                SECItem *result,
                                                const unsigned char *buf,
                                                int len,
                                                SECKEYPrivateKey *pk,
                                                SECAlgorithmID *algid);

/*
** Destroy a signed-data object.
**	"sd" the object
**	"freeit" if PR_TRUE then free the object as well as its sub-objects
*/
extern void SEC_DestroySignedData(CERTSignedData *sd, PRBool freeit);

/*
** Get the signature algorithm tag number for the given key type and hash
** algorithm tag. Returns SEC_OID_UNKNOWN if key type and hash algorithm
** do not match or are not supported.
*/
extern SECOidTag SEC_GetSignatureAlgorithmOidTag(KeyType keyType,
                                                 SECOidTag hashAlgTag);

/*
** Create algorithm parameters for signing. Return a new item
** allocated from arena, or NULL on failure.
**	"arena" is the memory arena to use to allocate data from
**	"result" the encoded parameters (memory is allocated)
**	"signAlgTag" is the signing algorithm
**	"hashAlgTag" is the preferred hash algorithm
**	"params" is the default parameters
**	"key" is the private key
*/
extern SECItem *SEC_CreateSignatureAlgorithmParameters(PLArenaPool *arena,
                                                       SECItem *result,
                                                       SECOidTag signAlgTag,
                                                       SECOidTag hashAlgTag,
                                                       const SECItem *params,
                                                       const SECKEYPrivateKey *key);

/****************************************/
/*
** Signature verification operations
*/

/*
** Create a signature verification context. This version is deprecated,
**  This function is deprecated. Use VFY_CreateContextDirect or
**  VFY_CreateContextWithAlgorithmID instead.
**	"key" the public key to verify with
**	"sig" the encrypted signature data if sig is NULL then
**	   VFY_EndWithSignature must be called with the correct signature at
**	   the end of the processing.
**	"sigAlg" specifies the signing algorithm to use (including the
**         hash algorthim).  This must match the key type.
**	"wincx" void pointer to the window context
*/
extern VFYContext *VFY_CreateContext(SECKEYPublicKey *key, SECItem *sig,
                                     SECOidTag sigAlg, void *wincx);
/*
** Create a signature verification context.
**	"key" the public key to verify with
**	"sig" the encrypted signature data if sig is NULL then
**	   VFY_EndWithSignature must be called with the correct signature at
**	   the end of the processing.
**	"pubkAlg" specifies the cryptographic signing algorithm to use (the
**         raw algorithm without any hash specified.  This must match the key
**         type.
**	"hashAlg" specifies the hashing algorithm used. If the key is an
**	   RSA key, and sig is not NULL, then hashAlg can be SEC_OID_UNKNOWN.
**	   the hash is selected from data in the sig.
**	"hash" optional pointer to return the actual hash algorithm used.
**	   in practice this should always match the passed in hashAlg (the
**	   exception is the case where hashAlg is SEC_OID_UNKNOWN above).
**         If this value is NULL no, hash oid is returned.
**	"wincx" void pointer to the window context
*/
extern VFYContext *VFY_CreateContextDirect(const SECKEYPublicKey *key,
                                           const SECItem *sig,
                                           SECOidTag pubkAlg,
                                           SECOidTag hashAlg,
                                           SECOidTag *hash, void *wincx);
/*
** Create a signature verification context from a algorithm ID.
**	"key" the public key to verify with
**	"sig" the encrypted signature data if sig is NULL then
**	   VFY_EndWithSignature must be called with the correct signature at
**	   the end of the processing.
**	"algid" specifies the signing algorithm and parameters to use.
**         This must match the key type.
**      "hash" optional pointer to return the oid of the actual hash used in
**         the signature. If this value is NULL no, hash oid is returned.
**	"wincx" void pointer to the window context
*/
extern VFYContext *VFY_CreateContextWithAlgorithmID(const SECKEYPublicKey *key,
                                                    const SECItem *sig,
                                                    const SECAlgorithmID *algid,
                                                    SECOidTag *hash,
                                                    void *wincx);

/*
** Destroy a verification-context object.
**	"cx" the context to destroy
**	"freeit" if PR_TRUE then free the object as well as its sub-objects
*/
extern void VFY_DestroyContext(VFYContext *cx, PRBool freeit);

extern SECStatus VFY_Begin(VFYContext *cx);

/*
** Update a verification context with more input data. The input data
** is fed to a secure hash function (depending on what was in the
** encrypted signature data).
**	"cx" the context
**	"input" the input data
**	"inputLen" the amount of input data
*/
extern SECStatus VFY_Update(VFYContext *cx, const unsigned char *input,
                            unsigned int inputLen);

/*
** Finish the verification process. The return value is a status which
** indicates success or failure. On success, the SECSuccess value is
** returned. Otherwise, SECFailure is returned and the error code found
** using PORT_GetError() indicates what failure occurred.
** 	"cx" the context
*/
extern SECStatus VFY_End(VFYContext *cx);

/*
** Finish the verification process. The return value is a status which
** indicates success or failure. On success, the SECSuccess value is
** returned. Otherwise, SECFailure is returned and the error code found
** using PORT_GetError() indicates what failure occurred. If signature is
** supplied the verification uses this signature to verify, otherwise the
** signature passed in VFY_CreateContext() is used.
** VFY_EndWithSignature(cx,NULL); is identical to VFY_End(cx);.
** 	"cx" the context
** 	"sig" the encrypted signature data
*/
extern SECStatus VFY_EndWithSignature(VFYContext *cx, SECItem *sig);

/*
** Verify the signature on a block of data for which we already have
** the digest. The signature data is an RSA private key encrypted
** block of data formatted according to PKCS#1.
**  This function is deprecated. Use VFY_VerifyDigestDirect or
**  VFY_VerifyDigestWithAlgorithmID instead.
** 	"dig" the digest
** 	"key" the public key to check the signature with
** 	"sig" the encrypted signature data
**	"sigAlg" specifies the signing algorithm to use.  This must match
**	    the key type.
**	"wincx" void pointer to the window context
**/
extern SECStatus VFY_VerifyDigest(SECItem *dig, SECKEYPublicKey *key,
                                  SECItem *sig, SECOidTag sigAlg, void *wincx);
/*
** Verify the signature on a block of data for which we already have
** the digest. The signature data is an RSA private key encrypted
** block of data formatted according to PKCS#1.
** 	"dig" the digest
** 	"key" the public key to check the signature with
** 	"sig" the encrypted signature data
**	"pubkAlg" specifies the cryptographic signing algorithm to use (the
**         raw algorithm without any hash specified.  This must match the key
**         type.
**	"hashAlg" specifies the hashing algorithm used.
**	"wincx" void pointer to the window context
**/
extern SECStatus VFY_VerifyDigestDirect(const SECItem *dig,
                                        const SECKEYPublicKey *key,
                                        const SECItem *sig, SECOidTag pubkAlg,
                                        SECOidTag hashAlg, void *wincx);
/*
** Verify the signature on a block of data for which we already have
** the digest. The signature data is an RSA private key encrypted
** block of data formatted according to PKCS#1.
**	"key" the public key to verify with
**	"sig" the encrypted signature data if sig is NULL then
**	   VFY_EndWithSignature must be called with the correct signature at
**	   the end of the processing.
**	"algid" specifies the signing algorithm and parameters to use.
**         This must match the key type.
**      "hash" oid of the actual hash used to create digest. If this  value is
**         not set to SEC_OID_UNKNOWN, it must match the hash of the signature.
**	"wincx" void pointer to the window context
*/
extern SECStatus VFY_VerifyDigestWithAlgorithmID(const SECItem *dig,
                                                 const SECKEYPublicKey *key, const SECItem *sig,
                                                 const SECAlgorithmID *algid, SECOidTag hash,
                                                 void *wincx);

/*
** Verify the signature on a block of data. The signature data is an RSA
** private key encrypted block of data formatted according to PKCS#1.
**   This function is deprecated. Use VFY_VerifyDataDirect or
**   VFY_VerifyDataWithAlgorithmID instead.
** 	"buf" the input data
** 	"len" the length of the input data
** 	"key" the public key to check the signature with
** 	"sig" the encrypted signature data
**	"sigAlg" specifies the signing algorithm to use.  This must match
**	    the key type.
**	"wincx" void pointer to the window context
*/
extern SECStatus VFY_VerifyData(const unsigned char *buf, int len,
                                const SECKEYPublicKey *key, const SECItem *sig,
                                SECOidTag sigAlg, void *wincx);
/*
** Verify the signature on a block of data. The signature data is an RSA
** private key encrypted block of data formatted according to PKCS#1.
** 	"buf" the input data
** 	"len" the length of the input data
** 	"key" the public key to check the signature with
** 	"sig" the encrypted signature data
**	"pubkAlg" specifies the cryptographic signing algorithm to use (the
**         raw algorithm without any hash specified.  This must match the key
**         type.
**	"hashAlg" specifies the hashing algorithm used. If the key is an
**	   RSA key, and sig is not NULL, then hashAlg can be SEC_OID_UNKNOWN.
**	   the hash is selected from data in the sig.
**	"hash" optional pointer to return the actual hash algorithm used.
**	   in practice this should always match the passed in hashAlg (the
**	   exception is the case where hashAlg is SEC_OID_UNKNOWN above).
**         If this value is NULL no, hash oid is returned.
**	"wincx" void pointer to the window context
*/
extern SECStatus VFY_VerifyDataDirect(const unsigned char *buf, int len,
                                      const SECKEYPublicKey *key,
                                      const SECItem *sig,
                                      SECOidTag pubkAlg, SECOidTag hashAlg,
                                      SECOidTag *hash, void *wincx);

/*
** Verify the signature on a block of data. The signature data is an RSA
** private key encrypted block of data formatted according to PKCS#1.
** 	"buf" the input data
** 	"len" the length of the input data
** 	"key" the public key to check the signature with
** 	"sig" the encrypted signature data
**	"algid" specifies the signing algorithm and parameters to use.
**         This must match the key type.
**      "hash" optional pointer to return the oid of the actual hash used in
**         the signature. If this value is NULL no, hash oid is returned.
**	"wincx" void pointer to the window context
*/
extern SECStatus VFY_VerifyDataWithAlgorithmID(const unsigned char *buf,
                                               int len, const SECKEYPublicKey *key,
                                               const SECItem *sig,
                                               const SECAlgorithmID *algid, SECOidTag *hash,
                                               void *wincx);

SEC_END_PROTOS

#endif /* _CRYPTOHI_H_ */