OLD | NEW |
| (Empty) |
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 http://mozilla.org/MPL/2.0/. */ | |
4 | |
5 /* | |
6 * Header file for routines specific to S/MIME. Keep things that are pure | |
7 * pkcs7 out of here; this is for S/MIME policy, S/MIME interoperability, etc. | |
8 * | |
9 * $Id: secmime.h,v 1.3 2012/04/25 14:50:06 gerv%gerv.net Exp $ | |
10 */ | |
11 | |
12 #ifndef _SECMIME_H_ | |
13 #define _SECMIME_H_ 1 | |
14 | |
15 #include "secpkcs7.h" | |
16 | |
17 | |
18 /************************************************************************/ | |
19 SEC_BEGIN_PROTOS | |
20 | |
21 /* | |
22 * Initialize the local recording of the user S/MIME cipher preferences. | |
23 * This function is called once for each cipher, the order being | |
24 * important (first call records greatest preference, and so on). | |
25 * When finished, it is called with a "which" of CIPHER_FAMILID_MASK. | |
26 * If the function is called again after that, it is assumed that | |
27 * the preferences are being reset, and the old preferences are | |
28 * discarded. | |
29 * | |
30 * XXX This is for a particular user, and right now the storage is | |
31 * XXX local, static. The preference should be stored elsewhere to allow | |
32 * XXX for multiple uses of one library? How does SSL handle this; | |
33 * XXX it has something similar? | |
34 * | |
35 * - The "which" values are defined in ciferfam.h (the SMIME_* values, | |
36 * for example SMIME_DES_CBC_56). | |
37 * - If "on" is non-zero then the named cipher is enabled, otherwise | |
38 * it is disabled. (It is not necessary to call the function for | |
39 * ciphers that are disabled, however, as that is the default.) | |
40 * | |
41 * If the cipher preference is successfully recorded, SECSuccess | |
42 * is returned. Otherwise SECFailure is returned. The only errors | |
43 * are due to failure allocating memory or bad parameters/calls: | |
44 * SEC_ERROR_XXX ("which" is not in the S/MIME cipher family) | |
45 * SEC_ERROR_XXX (function is being called more times than there | |
46 * are known/expected ciphers) | |
47 */ | |
48 extern SECStatus SECMIME_EnableCipher(long which, int on); | |
49 | |
50 /* | |
51 * Initialize the local recording of the S/MIME policy. | |
52 * This function is called to enable/disable a particular cipher. | |
53 * (S/MIME encryption or decryption using a particular cipher is only | |
54 * allowed if that cipher is currently enabled.) At startup, all S/MIME | |
55 * ciphers are disabled. From that point, this function can be called | |
56 * to enable a cipher -- it is not necessary to call this to disable | |
57 * a cipher unless that cipher was previously, explicitly enabled via | |
58 * this function. | |
59 * | |
60 * XXX This is for a the current module, I think, so local, static storage | |
61 * XXX is okay. Is that correct, or could multiple uses of the same | |
62 * XXX library expect to operate under different policies? | |
63 * | |
64 * - The "which" values are defined in ciferfam.h (the SMIME_* values, | |
65 * for example SMIME_DES_CBC_56). | |
66 * - If "on" is non-zero then the named cipher is enabled, otherwise | |
67 * it is disabled. | |
68 * | |
69 * If the cipher is successfully enabled/disabled, SECSuccess is | |
70 * returned. Otherwise SECFailure is returned. The only errors | |
71 * are due to bad parameters: | |
72 * SEC_ERROR_XXX ("which" is not in the S/MIME cipher family) | |
73 * SEC_ERROR_XXX ("which" exceeds expected maximum cipher; this is | |
74 * really an internal error) | |
75 */ | |
76 extern SECStatus SECMIME_SetPolicy(long which, int on); | |
77 | |
78 /* | |
79 * Does the current policy allow S/MIME decryption of this particular | |
80 * algorithm and keysize? | |
81 */ | |
82 extern PRBool SECMIME_DecryptionAllowed(SECAlgorithmID *algid, PK11SymKey *key); | |
83 | |
84 /* | |
85 * Does the current policy allow *any* S/MIME encryption (or decryption)? | |
86 * | |
87 * This tells whether or not *any* S/MIME encryption can be done, | |
88 * according to policy. Callers may use this to do nicer user interface | |
89 * (say, greying out a checkbox so a user does not even try to encrypt | |
90 * a message when they are not allowed to) or for any reason they want | |
91 * to check whether S/MIME encryption (or decryption, for that matter) | |
92 * may be done. | |
93 * | |
94 * It takes no arguments. The return value is a simple boolean: | |
95 * PR_TRUE means encryption (or decryption) is *possible* | |
96 * (but may still fail due to other reasons, like because we cannot | |
97 * find all the necessary certs, etc.; PR_TRUE is *not* a guarantee) | |
98 * PR_FALSE means encryption (or decryption) is not permitted | |
99 * | |
100 * There are no errors from this routine. | |
101 */ | |
102 extern PRBool SECMIME_EncryptionPossible(void); | |
103 | |
104 /* | |
105 * Start an S/MIME encrypting context. | |
106 * | |
107 * "scert" is the cert for the sender. It will be checked for validity. | |
108 * "rcerts" are the certs for the recipients. They will also be checked. | |
109 * | |
110 * "certdb" is the cert database to use for verifying the certs. | |
111 * It can be NULL if a default database is available (like in the client). | |
112 * | |
113 * This function already does all of the stuff specific to S/MIME protocol | |
114 * and local policy; the return value just needs to be passed to | |
115 * SEC_PKCS7Encode() or to SEC_PKCS7EncoderStart() to create the encoded data, | |
116 * and finally to SEC_PKCS7DestroyContentInfo(). | |
117 * | |
118 * An error results in a return value of NULL and an error set. | |
119 * (Retrieve specific errors via PORT_GetError()/XP_GetError().) | |
120 */ | |
121 extern SEC_PKCS7ContentInfo *SECMIME_CreateEncrypted(CERTCertificate *scert, | |
122 CERTCertificate **rcerts, | |
123 CERTCertDBHandle *certdb, | |
124 SECKEYGetPasswordKey pwfn, | |
125 void *pwfn_arg); | |
126 | |
127 /* | |
128 * Start an S/MIME signing context. | |
129 * | |
130 * "scert" is the cert that will be used to sign the data. It will be | |
131 * checked for validity. | |
132 * | |
133 * "certdb" is the cert database to use for verifying the cert. | |
134 * It can be NULL if a default database is available (like in the client). | |
135 * | |
136 * "digestalg" names the digest algorithm. (It should be SEC_OID_SHA1; | |
137 * XXX There should be SECMIME functions for hashing, or the hashing should | |
138 * be built into this interface, which we would like because we would | |
139 * support more smartcards that way, and then this argument should go away.) | |
140 * | |
141 * "digest" is the actual digest of the data. It must be provided in | |
142 * the case of detached data or NULL if the content will be included. | |
143 * | |
144 * This function already does all of the stuff specific to S/MIME protocol | |
145 * and local policy; the return value just needs to be passed to | |
146 * SEC_PKCS7Encode() or to SEC_PKCS7EncoderStart() to create the encoded data, | |
147 * and finally to SEC_PKCS7DestroyContentInfo(). | |
148 * | |
149 * An error results in a return value of NULL and an error set. | |
150 * (Retrieve specific errors via PORT_GetError()/XP_GetError().) | |
151 */ | |
152 extern SEC_PKCS7ContentInfo *SECMIME_CreateSigned(CERTCertificate *scert, | |
153 CERTCertificate *ecert, | |
154 CERTCertDBHandle *certdb, | |
155 SECOidTag digestalg, | |
156 SECItem *digest, | |
157 SECKEYGetPasswordKey pwfn, | |
158 void *pwfn_arg); | |
159 | |
160 /************************************************************************/ | |
161 SEC_END_PROTOS | |
162 | |
163 #endif /* _SECMIME_H_ */ | |
OLD | NEW |