1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/nss/lib/softoken/softoken.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,266 @@ 1.4 +/* 1.5 + * softoken.h - private data structures and prototypes for the softoken lib 1.6 + * 1.7 + * This Source Code Form is subject to the terms of the Mozilla Public 1.8 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.9 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.10 + 1.11 +#ifndef _SOFTOKEN_H_ 1.12 +#define _SOFTOKEN_H_ 1.13 + 1.14 +#include "blapi.h" 1.15 +#include "lowkeyti.h" 1.16 +#include "softoknt.h" 1.17 +#include "secoidt.h" 1.18 + 1.19 +#include "pkcs11t.h" 1.20 + 1.21 +SEC_BEGIN_PROTOS 1.22 + 1.23 +/* 1.24 + * Convenience wrapper for doing a single PKCS#1 v1.5 RSA operations where the 1.25 + * encoded digest info is computed internally, rather than by the caller. 1.26 + * 1.27 + * The HashSign variants expect as input the value of H, the computed hash 1.28 + * from RFC 3447, Section 9.2, Step 1, and will compute the DER-encoded 1.29 + * DigestInfo structure internally prior to signing/verifying. 1.30 + */ 1.31 +extern SECStatus 1.32 +RSA_HashSign(SECOidTag hashOid, NSSLOWKEYPrivateKey *key, 1.33 + unsigned char *sig, unsigned int *sigLen, unsigned int maxLen, 1.34 + const unsigned char *hash, unsigned int hashLen); 1.35 + 1.36 +extern SECStatus 1.37 +RSA_HashCheckSign(SECOidTag hashOid, NSSLOWKEYPublicKey *key, 1.38 + const unsigned char *sig, unsigned int sigLen, 1.39 + const unsigned char *hash, unsigned int hashLen); 1.40 + 1.41 +/* 1.42 +** Prepare a buffer for padded CBC encryption, growing to the appropriate 1.43 +** boundary, filling with the appropriate padding. 1.44 +** 1.45 +** blockSize must be a power of 2. 1.46 +** 1.47 +** We add from 1 to blockSize bytes -- we *always* grow. 1.48 +** The extra bytes contain the value of the length of the padding: 1.49 +** if we have 2 bytes of padding, then the padding is "0x02, 0x02". 1.50 +** 1.51 +** NOTE: If arena is non-NULL, we re-allocate from there, otherwise 1.52 +** we assume (and use) PR memory (re)allocation. 1.53 +*/ 1.54 +extern unsigned char * CBC_PadBuffer(PLArenaPool *arena, unsigned char *inbuf, 1.55 + unsigned int inlen, unsigned int *outlen, 1.56 + int blockSize); 1.57 + 1.58 + 1.59 +/****************************************/ 1.60 +/* 1.61 +** Power-Up selftests required for FIPS and invoked only 1.62 +** under PKCS #11 FIPS mode. 1.63 +*/ 1.64 +extern CK_RV sftk_fipsPowerUpSelfTest( void ); 1.65 + 1.66 +/* 1.67 +** make known fixed PKCS #11 key types to their sizes in bytes 1.68 +*/ 1.69 +unsigned long sftk_MapKeySize(CK_KEY_TYPE keyType); 1.70 + 1.71 +/* 1.72 +** FIPS 140-2 auditing 1.73 +*/ 1.74 +extern PRBool sftk_audit_enabled; 1.75 + 1.76 +extern void sftk_LogAuditMessage(NSSAuditSeverity severity, 1.77 + NSSAuditType, const char *msg); 1.78 + 1.79 +extern void sftk_AuditCreateObject(CK_SESSION_HANDLE hSession, 1.80 + CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, 1.81 + CK_OBJECT_HANDLE_PTR phObject, CK_RV rv); 1.82 + 1.83 +extern void sftk_AuditCopyObject(CK_SESSION_HANDLE hSession, 1.84 + CK_OBJECT_HANDLE hObject, 1.85 + CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, 1.86 + CK_OBJECT_HANDLE_PTR phNewObject, CK_RV rv); 1.87 + 1.88 +extern void sftk_AuditDestroyObject(CK_SESSION_HANDLE hSession, 1.89 + CK_OBJECT_HANDLE hObject, CK_RV rv); 1.90 + 1.91 +extern void sftk_AuditGetObjectSize(CK_SESSION_HANDLE hSession, 1.92 + CK_OBJECT_HANDLE hObject, CK_ULONG_PTR pulSize, 1.93 + CK_RV rv); 1.94 + 1.95 +extern void sftk_AuditGetAttributeValue(CK_SESSION_HANDLE hSession, 1.96 + CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, 1.97 + CK_ULONG ulCount, CK_RV rv); 1.98 + 1.99 +extern void sftk_AuditSetAttributeValue(CK_SESSION_HANDLE hSession, 1.100 + CK_OBJECT_HANDLE hObject, CK_ATTRIBUTE_PTR pTemplate, 1.101 + CK_ULONG ulCount, CK_RV rv); 1.102 + 1.103 +extern void sftk_AuditCryptInit(const char *opName, 1.104 + CK_SESSION_HANDLE hSession, 1.105 + CK_MECHANISM_PTR pMechanism, 1.106 + CK_OBJECT_HANDLE hKey, CK_RV rv); 1.107 + 1.108 +extern void sftk_AuditGenerateKey(CK_SESSION_HANDLE hSession, 1.109 + CK_MECHANISM_PTR pMechanism, 1.110 + CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, 1.111 + CK_OBJECT_HANDLE_PTR phKey, CK_RV rv); 1.112 + 1.113 +extern void sftk_AuditGenerateKeyPair(CK_SESSION_HANDLE hSession, 1.114 + CK_MECHANISM_PTR pMechanism, 1.115 + CK_ATTRIBUTE_PTR pPublicKeyTemplate, 1.116 + CK_ULONG ulPublicKeyAttributeCount, 1.117 + CK_ATTRIBUTE_PTR pPrivateKeyTemplate, 1.118 + CK_ULONG ulPrivateKeyAttributeCount, 1.119 + CK_OBJECT_HANDLE_PTR phPublicKey, 1.120 + CK_OBJECT_HANDLE_PTR phPrivateKey, CK_RV rv); 1.121 + 1.122 +extern void sftk_AuditWrapKey(CK_SESSION_HANDLE hSession, 1.123 + CK_MECHANISM_PTR pMechanism, 1.124 + CK_OBJECT_HANDLE hWrappingKey, CK_OBJECT_HANDLE hKey, 1.125 + CK_BYTE_PTR pWrappedKey, 1.126 + CK_ULONG_PTR pulWrappedKeyLen, CK_RV rv); 1.127 + 1.128 +extern void sftk_AuditUnwrapKey(CK_SESSION_HANDLE hSession, 1.129 + CK_MECHANISM_PTR pMechanism, 1.130 + CK_OBJECT_HANDLE hUnwrappingKey, 1.131 + CK_BYTE_PTR pWrappedKey, CK_ULONG ulWrappedKeyLen, 1.132 + CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulAttributeCount, 1.133 + CK_OBJECT_HANDLE_PTR phKey, CK_RV rv); 1.134 + 1.135 +extern void sftk_AuditDeriveKey(CK_SESSION_HANDLE hSession, 1.136 + CK_MECHANISM_PTR pMechanism, 1.137 + CK_OBJECT_HANDLE hBaseKey, 1.138 + CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulAttributeCount, 1.139 + CK_OBJECT_HANDLE_PTR phKey, CK_RV rv); 1.140 + 1.141 +extern void sftk_AuditDigestKey(CK_SESSION_HANDLE hSession, 1.142 + CK_OBJECT_HANDLE hKey, CK_RV rv); 1.143 + 1.144 +/* 1.145 +** FIPS 140-2 Error state 1.146 +*/ 1.147 +extern PRBool sftk_fatalError; 1.148 + 1.149 +/* 1.150 +** macros to check for forked child process after C_Initialize 1.151 +*/ 1.152 +#if defined(XP_UNIX) && !defined(NO_FORK_CHECK) 1.153 + 1.154 +#ifdef DEBUG 1.155 + 1.156 +#define FORK_ASSERT() \ 1.157 + { \ 1.158 + char* forkAssert = getenv("NSS_STRICT_NOFORK"); \ 1.159 + if ( (!forkAssert) || (0 == strcmp(forkAssert, "1")) ) { \ 1.160 + PORT_Assert(0); \ 1.161 + } \ 1.162 + } 1.163 + 1.164 +#else 1.165 + 1.166 +#define FORK_ASSERT() 1.167 + 1.168 +#endif 1.169 + 1.170 +/* we have 3 methods of implementing the fork checks : 1.171 + * - Solaris "mixed" method 1.172 + * - pthread_atfork method 1.173 + * - getpid method 1.174 + */ 1.175 + 1.176 +#if !defined (CHECK_FORK_MIXED) && !defined(CHECK_FORK_PTHREAD) && \ 1.177 + !defined (CHECK_FORK_GETPID) 1.178 + 1.179 +/* Choose fork check method automatically unless specified 1.180 + * This section should be updated as more platforms get pthread fixes 1.181 + * to unregister fork handlers in dlclose. 1.182 + */ 1.183 + 1.184 +#ifdef SOLARIS 1.185 + 1.186 +/* Solaris 8, s9 use PID checks, s10 uses pthread_atfork */ 1.187 + 1.188 +#define CHECK_FORK_MIXED 1.189 + 1.190 +#elif defined(LINUX) 1.191 + 1.192 +#define CHECK_FORK_PTHREAD 1.193 + 1.194 +#else 1.195 + 1.196 +/* Other Unix platforms use only PID checks. Even if pthread_atfork is 1.197 + * available, the behavior of dlclose isn't guaranteed by POSIX to 1.198 + * unregister the fork handler. */ 1.199 + 1.200 +#define CHECK_FORK_GETPID 1.201 + 1.202 +#endif 1.203 + 1.204 +#endif 1.205 + 1.206 +#if defined(CHECK_FORK_MIXED) 1.207 + 1.208 +extern PRBool usePthread_atfork; 1.209 +#include <unistd.h> 1.210 +extern pid_t myPid; 1.211 +extern PRBool forked; 1.212 + 1.213 +#define PARENT_FORKED() (usePthread_atfork ? forked : (myPid && myPid != getpid())) 1.214 + 1.215 +#elif defined(CHECK_FORK_PTHREAD) 1.216 + 1.217 +extern PRBool forked; 1.218 + 1.219 +#define PARENT_FORKED() forked 1.220 + 1.221 +#elif defined(CHECK_FORK_GETPID) 1.222 + 1.223 +#include <unistd.h> 1.224 +extern pid_t myPid; 1.225 + 1.226 +#define PARENT_FORKED() (myPid && myPid != getpid()) 1.227 + 1.228 +#endif 1.229 + 1.230 +extern PRBool parentForkedAfterC_Initialize; 1.231 +extern PRBool sftkForkCheckDisabled; 1.232 + 1.233 +#define CHECK_FORK() \ 1.234 + do { \ 1.235 + if (!sftkForkCheckDisabled && PARENT_FORKED()) { \ 1.236 + FORK_ASSERT(); \ 1.237 + return CKR_DEVICE_ERROR; \ 1.238 + } \ 1.239 + } while (0) 1.240 + 1.241 +#define SKIP_AFTER_FORK(x) if (!parentForkedAfterC_Initialize) x 1.242 + 1.243 +#define ENABLE_FORK_CHECK() \ 1.244 + { \ 1.245 + char* doForkCheck = getenv("NSS_STRICT_NOFORK"); \ 1.246 + if ( doForkCheck && !strcmp(doForkCheck, "DISABLED") ) { \ 1.247 + sftkForkCheckDisabled = PR_TRUE; \ 1.248 + } \ 1.249 + } 1.250 + 1.251 + 1.252 +#else 1.253 + 1.254 +/* non-Unix platforms, or fork check disabled */ 1.255 + 1.256 +#define CHECK_FORK() 1.257 +#define SKIP_AFTER_FORK(x) x 1.258 +#define ENABLE_FORK_CHECK() 1.259 + 1.260 +#ifndef NO_FORK_CHECK 1.261 +#define NO_FORK_CHECK 1.262 +#endif 1.263 + 1.264 +#endif 1.265 + 1.266 + 1.267 +SEC_END_PROTOS 1.268 + 1.269 +#endif /* _SOFTOKEN_H_ */