1
/* ***** BEGIN LICENSE BLOCK *****
2
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
4
* The contents of this file are subject to the Mozilla Public License Version
5
* 1.1 (the "License"); you may not use this file except in compliance with
6
* the License. You may obtain a copy of the License at
7
* http://www.mozilla.org/MPL/
9
* Software distributed under the License is distributed on an "AS IS" basis,
10
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11
* for the specific language governing rights and limitations under the
14
* The Original Code is the Netscape security libraries.
16
* The Initial Developer of the Original Code is
17
* Netscape Communications Corporation.
18
* Portions created by the Initial Developer are Copyright (C) 2000
19
* the Initial Developer. All Rights Reserved.
22
* Ian McGreer <mcgreer@netscape.com>
24
* Alternatively, the contents of this file may be used under the terms of
25
* either the GNU General Public License Version 2 or later (the "GPL"), or
26
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
27
* in which case the provisions of the GPL or the LGPL are applicable instead
28
* of those above. If you wish to allow use of your version of this file only
29
* under the terms of either the GPL or the LGPL, and not to allow others to
30
* use your version of this file under the terms of the MPL, indicate your
31
* decision by deleting the provisions above and replace them with the notice
32
* and other provisions required by the GPL or the LGPL. If you do not delete
33
* the provisions above, a recipient may use your version of this file under
34
* the terms of any one of the MPL, the GPL or the LGPL.
36
* ***** END LICENSE BLOCK ***** */
37
/* $Id: nsPKCS12Blob.h,v 1.16 2006/04/12 15:43:32 benjamin%smedbergs.us Exp $ */
39
#ifndef _NS_PKCS12BLOB_H_
40
#define _NS_PKCS12BLOB_H_
43
#include "nsILocalFile.h"
44
#include "nsIPK11TokenDB.h"
45
#include "nsNSSHelper.h"
46
#include "nsIPK11Token.h"
47
#include "nsIMutableArray.h"
61
// Class for importing/exporting PKCS#12 blobs
67
virtual ~nsPKCS12Blob();
69
// Set the token to use (default is internal)
70
nsresult SetToken(nsIPK11Token *token);
73
nsresult ImportFromFile(nsILocalFile *file);
77
//nsresult LoadCerts(const PRUnichar **certNames, int numCerts);
78
nsresult LoadCerts(nsIX509Cert **certs, int numCerts);
80
nsresult ExportToFile(nsILocalFile *file, nsIX509Cert **certs, int numCerts);
84
nsCOMPtr<nsIPK11Token> mToken;
85
nsCOMPtr<nsIMutableArray> mCertArray;
86
nsCOMPtr<nsIInterfaceRequestor> mUIContext;
88
// local helper functions
89
nsresult getPKCS12FilePassword(SECItem *);
90
nsresult newPKCS12FilePassword(SECItem *);
91
nsresult inputToDecoder(SEC_PKCS12DecoderContext *, nsILocalFile *);
92
void unicodeToItem(const PRUnichar *, SECItem *);
93
PRBool handleError(int myerr = 0);
95
// RetryReason and ImportMode are used when importing a PKCS12 file.
96
// There are two reasons that cause us to retry:
97
// - When the password entered by the user is incorrect.
98
// The user will be prompted to try again.
99
// - When the user entered a zero length password.
100
// An empty password should be represented as an empty
101
// string (a SECItem that contains a single terminating
102
// NULL UTF16 character), but some applications use a
103
// zero length SECItem.
104
// We try both variations, zero length item and empty string,
105
// without giving a user prompt when trying the different empty password flavors.
107
enum RetryReason { rr_do_not_retry, rr_bad_password, rr_auto_retry_empty_password_flavors };
108
enum ImportMode { im_standard_prompt, im_try_zero_length_secitem };
110
nsresult ImportFromFileHelper(nsILocalFile *file, ImportMode aImportMode, RetryReason &aWantRetry);
112
// NSPR file I/O for export file
113
PRFileDesc *mTmpFile;
116
// simulated file I/O for "in memory" temporary digest data
118
nsCString::const_iterator *mDigestIterator;
122
// C-style callback functions for the NSS PKCS#12 library
123
static SECStatus PR_CALLBACK digest_open(void *, PRBool);
124
static SECStatus PR_CALLBACK digest_close(void *, PRBool);
125
static int PR_CALLBACK digest_read(void *, unsigned char *, unsigned long);
126
static int PR_CALLBACK digest_write(void *, unsigned char *, unsigned long);
127
static SECItem * PR_CALLBACK nickname_collision(SECItem *, PRBool *, void *);
128
static void PR_CALLBACK write_export_file(void *arg, const char *buf, unsigned long len);
132
#endif /* _NS_PKCS12BLOB_H_ */