зеркало из https://github.com/mozilla/pjs.git
Fix for Bug 66939 r=javi, sr=mscott
This commit is contained in:
Родитель
95b1ae98b0
Коммит
a2a78eaa30
|
@ -102,6 +102,8 @@ static char * gUserDir = NULL;
|
||||||
static PRMonitor *policySetLock = NULL;
|
static PRMonitor *policySetLock = NULL;
|
||||||
static PRBool policySet = PR_FALSE;
|
static PRBool policySet = PR_FALSE;
|
||||||
|
|
||||||
|
static char *gLoadableRootsModuleName = NULL;
|
||||||
|
|
||||||
SSMStatus SSM_InitPolicyHandler(void)
|
SSMStatus SSM_InitPolicyHandler(void)
|
||||||
{
|
{
|
||||||
policySetLock = PR_NewMonitor();
|
policySetLock = PR_NewMonitor();
|
||||||
|
@ -925,11 +927,7 @@ ssm_OpenKeyDB(const char * configdir, SSMControlConnection *ctrl)
|
||||||
SECStatus
|
SECStatus
|
||||||
ssm_OpenSecModDB(const char * configdir)
|
ssm_OpenSecModDB(const char * configdir)
|
||||||
{
|
{
|
||||||
static char *secmodname;
|
char *secmodname = NULL;
|
||||||
|
|
||||||
if (secmodname) {
|
|
||||||
return SECSuccess;
|
|
||||||
}
|
|
||||||
#ifdef XP_UNIX
|
#ifdef XP_UNIX
|
||||||
secmodname = PR_smprintf("%s/secmodule.db", configdir);
|
secmodname = PR_smprintf("%s/secmodule.db", configdir);
|
||||||
#elif defined(XP_MAC)
|
#elif defined(XP_MAC)
|
||||||
|
@ -957,6 +955,12 @@ ssm_ShutdownNSS(SSMControlConnection *ctrl)
|
||||||
if (ctrl->m_keydb != NULL) {
|
if (ctrl->m_keydb != NULL) {
|
||||||
SECKEY_CloseKeyDB(ctrl->m_keydb);
|
SECKEY_CloseKeyDB(ctrl->m_keydb);
|
||||||
}
|
}
|
||||||
|
if (gLoadableRootsModuleName) {
|
||||||
|
int type;
|
||||||
|
|
||||||
|
SECMOD_DeleteModule(gLoadableRootsModuleName, &type);
|
||||||
|
PR_FREEIF(gLoadableRootsModuleName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -1106,10 +1110,14 @@ SSM_InitNSS(char* certpath, SSMControlConnection *ctrl, PRInt32 policy)
|
||||||
PR_FREEIF(processDir);
|
PR_FREEIF(processDir);
|
||||||
/* If a module exists with the same name, delete it. */
|
/* If a module exists with the same name, delete it. */
|
||||||
SECMOD_DeleteModule(modName, &modType);
|
SECMOD_DeleteModule(modName, &modType);
|
||||||
|
gLoadableRootsModuleName = modName;
|
||||||
SSM_DEBUG("Will try to load <%s> for root certs.\n",fullModuleName);
|
SSM_DEBUG("Will try to load <%s> for root certs.\n",fullModuleName);
|
||||||
if (SECMOD_AddNewModule(modName, fullModuleName, 0, 0) != SECSuccess) {
|
if (SECMOD_AddNewModule(modName, fullModuleName, 0, 0) != SECSuccess) {
|
||||||
SSM_DEBUG("Couldn't load the module at <%s>",fullModuleName);
|
SSM_DEBUG("Couldn't load the module at <%s>",fullModuleName);
|
||||||
}
|
}
|
||||||
|
//We want to keep the modName around in gLoadableRootsModule so that
|
||||||
|
//we can delete it from secmod.db on the way out.
|
||||||
|
modName = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
loser:
|
loser:
|
||||||
|
@ -1205,6 +1213,19 @@ SSMControlConnection_SetupNSS(SSMControlConnection *ctrl, PRInt32 policy)
|
||||||
/* Do the libsec initialization */
|
/* Do the libsec initialization */
|
||||||
|
|
||||||
if (gUserDir != NULL) {
|
if (gUserDir != NULL) {
|
||||||
|
#ifdef XP_MAC
|
||||||
|
ctrl->m_certdb = CERT_GetDefaultCertDB();
|
||||||
|
ctrl->m_keydb = SECKEY_GetDefaultKeyDB();
|
||||||
|
ssm_ShutdownNSS(ctrl);
|
||||||
|
free(gUserDir);
|
||||||
|
ctrl->m_certdb = NULL;
|
||||||
|
ctrl->m_keydb = NULL;
|
||||||
|
gUserDir = strdup(ctrl->m_dirRoot);
|
||||||
|
srv = SSM_InitNSS(ctrl->m_dirRoot, ctrl, policy);
|
||||||
|
if (srv != SECSuccess) {
|
||||||
|
goto loser;
|
||||||
|
}
|
||||||
|
#else
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
if (strcmp(ctrl->m_dirRoot, gUserDir) != 0) {
|
if (strcmp(ctrl->m_dirRoot, gUserDir) != 0) {
|
||||||
goto loser;
|
goto loser;
|
||||||
|
@ -1221,6 +1242,7 @@ SSMControlConnection_SetupNSS(SSMControlConnection *ctrl, PRInt32 policy)
|
||||||
*/
|
*/
|
||||||
ctrl->m_certdb = CERT_GetDefaultCertDB();
|
ctrl->m_certdb = CERT_GetDefaultCertDB();
|
||||||
ctrl->m_keydb = SECKEY_GetDefaultKeyDB();
|
ctrl->m_keydb = SECKEY_GetDefaultKeyDB();
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
gUserDir = strdup(ctrl->m_dirRoot);
|
gUserDir = strdup(ctrl->m_dirRoot);
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1,660 +0,0 @@
|
||||||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
||||||
/*
|
|
||||||
* The contents of this file are subject to the Mozilla Public
|
|
||||||
* License Version 1.1 (the "License"); you may not use this file
|
|
||||||
* except in compliance with the License. You may obtain a copy of
|
|
||||||
* the License at http://www.mozilla.org/MPL/
|
|
||||||
*
|
|
||||||
* Software distributed under the License is distributed on an "AS
|
|
||||||
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
||||||
* implied. See the License for the specific language governing
|
|
||||||
* rights and limitations under the License.
|
|
||||||
*
|
|
||||||
* The Original Code is the Netscape security libraries.
|
|
||||||
*
|
|
||||||
* The Initial Developer of the Original Code is Netscape
|
|
||||||
* Communications Corporation. Portions created by Netscape are
|
|
||||||
* Copyright (C) 1994-2000 Netscape Communications Corporation. All
|
|
||||||
* Rights Reserved.
|
|
||||||
*
|
|
||||||
* Contributor(s):
|
|
||||||
*
|
|
||||||
* Alternatively, the contents of this file may be used under the
|
|
||||||
* terms of the GNU General Public License Version 2 or later (the
|
|
||||||
* "GPL"), in which case the provisions of the GPL are applicable
|
|
||||||
* instead of those above. If you wish to allow use of your
|
|
||||||
* version of this file only under the terms of the GPL and not to
|
|
||||||
* allow others to use your version of this file under the MPL,
|
|
||||||
* indicate your decision by deleting the provisions above and
|
|
||||||
* replace them with the notice and other provisions required by
|
|
||||||
* the GPL. If you do not delete the provisions above, a recipient
|
|
||||||
* may use your version of this file under either the MPL or the
|
|
||||||
* GPL.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "serv.h"
|
|
||||||
#include "secport.h"
|
|
||||||
#include "dataconn.h"
|
|
||||||
#include "ctrlconn.h"
|
|
||||||
#include "minihttp.h"
|
|
||||||
#include "ciferfam.h"
|
|
||||||
#include "secmime.h"
|
|
||||||
#include "messages.h"
|
|
||||||
#include "textgen.h"
|
|
||||||
#include "oldfunc.h"
|
|
||||||
#include "nss.h"
|
|
||||||
#include "p12plcy.h"
|
|
||||||
#include "nlslayer.h"
|
|
||||||
#include "softoken.h"
|
|
||||||
|
|
||||||
void SSM_InitLogging(void);
|
|
||||||
|
|
||||||
#ifdef TIMEBOMB
|
|
||||||
#include "timebomb.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
#include <wtypes.h>
|
|
||||||
#include <winreg.h>
|
|
||||||
#include <winerror.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XP_UNIX
|
|
||||||
#include <signal.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#ifndef SIG_ERR
|
|
||||||
#define SIG_ERR -1
|
|
||||||
#endif /*SIG_ERR*/
|
|
||||||
|
|
||||||
#endif /*XP_UNIX*/
|
|
||||||
|
|
||||||
#define POLICY_TYPE_INDEX 0
|
|
||||||
|
|
||||||
SSMCollection * connections = NULL;
|
|
||||||
SSMHashTable * tokenList = NULL;
|
|
||||||
PRMonitor * tokenLock = NULL;
|
|
||||||
SSMHashTable * ctrlConnections = NULL;
|
|
||||||
|
|
||||||
SSMPolicyType policyType = ssmDomestic;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following is a quick write of enabling various ciphers. This code is
|
|
||||||
* essentially moved from the server core code. Eventually we will need to
|
|
||||||
* place this data and functionality in a more modular way.
|
|
||||||
*/
|
|
||||||
#define SSM_POLICY_END 0 /* end of table */
|
|
||||||
#define SSM_POLICY_SSL 1 /* SSL ciphersuites: not really used */
|
|
||||||
#define SSM_POLICY_PK12 2 /* PKCS #12 ciphersuites */
|
|
||||||
#define SSM_POLICY_SMIME 3 /* S/MIME ciphersuites */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
PRInt32 policy;
|
|
||||||
PRInt32 key;
|
|
||||||
PRInt32 value;
|
|
||||||
} SSMPolicyEntry;
|
|
||||||
|
|
||||||
static SSMPolicyEntry ssmPK12PolicyTable[] =
|
|
||||||
{
|
|
||||||
{SSM_POLICY_PK12, PKCS12_RC4_40, (PRInt32)PR_TRUE},
|
|
||||||
{SSM_POLICY_PK12, PKCS12_RC4_128, (PRInt32)PR_TRUE},
|
|
||||||
{SSM_POLICY_PK12, PKCS12_RC2_CBC_40, (PRInt32)PR_TRUE},
|
|
||||||
{SSM_POLICY_PK12, PKCS12_RC2_CBC_128, (PRInt32)PR_TRUE},
|
|
||||||
{SSM_POLICY_PK12, PKCS12_DES_56, (PRInt32)PR_TRUE},
|
|
||||||
{SSM_POLICY_PK12, PKCS12_DES_EDE3_168, (PRInt32)PR_TRUE},
|
|
||||||
{SSM_POLICY_END, 0, 0}
|
|
||||||
};
|
|
||||||
|
|
||||||
static SSMPolicyEntry ssmSMIMEPolicyTable[] =
|
|
||||||
{
|
|
||||||
{SSM_POLICY_SMIME, SMIME_RC2_CBC_40, (PRInt32)PR_TRUE},
|
|
||||||
{SSM_POLICY_SMIME, SMIME_RC2_CBC_64, (PRInt32)PR_TRUE},
|
|
||||||
{SSM_POLICY_SMIME, SMIME_RC2_CBC_128, (PRInt32)PR_TRUE},
|
|
||||||
{SSM_POLICY_SMIME, SMIME_DES_CBC_56, (PRInt32)PR_TRUE},
|
|
||||||
{SSM_POLICY_SMIME, SMIME_DES_EDE3_168, (PRInt32)PR_TRUE},
|
|
||||||
{SSM_POLICY_SMIME, SMIME_RC5PAD_64_16_40, (PRInt32)PR_TRUE},
|
|
||||||
{SSM_POLICY_SMIME, SMIME_RC5PAD_64_16_64, (PRInt32)PR_TRUE},
|
|
||||||
{SSM_POLICY_SMIME, SMIME_RC5PAD_64_16_128, (PRInt32)PR_TRUE},
|
|
||||||
{SSM_POLICY_END, 0, 0}
|
|
||||||
};
|
|
||||||
|
|
||||||
static SSMStatus SSM_InstallPK12Policy(void)
|
|
||||||
{
|
|
||||||
const SSMPolicyEntry* entry = ssmPK12PolicyTable;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; entry[i].policy != SSM_POLICY_END; i++) {
|
|
||||||
if (SEC_PKCS12EnableCipher(entry[i].key, entry[i].value) !=
|
|
||||||
SECSuccess) {
|
|
||||||
return SSM_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return SSM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static SSMStatus SSM_InstallSMIMEPolicy(void)
|
|
||||||
{
|
|
||||||
const SSMPolicyEntry* entry = ssmSMIMEPolicyTable;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; entry[i].policy != SSM_POLICY_END; i++) {
|
|
||||||
if (SECMIME_SetPolicy(entry[i].key, entry[i].value) != SECSuccess) {
|
|
||||||
return SSM_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return SSM_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* XXX sjlee: we don't need to do a similar thing for SSL as we can call an
|
|
||||||
* NSS function to do it
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/*
|
|
||||||
* This function is required by svrplcy to set the
|
|
||||||
* utility policy. This will tell us what kind of
|
|
||||||
* policy we are running.
|
|
||||||
*/
|
|
||||||
SECStatus Utility_SetPolicy(long which, int policy)
|
|
||||||
{
|
|
||||||
policyType = ssmDomestic;
|
|
||||||
return SECSuccess;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void SSM_SetPolicy(void)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
SVRPLCY_InstallSSLPolicy();
|
|
||||||
SVRPLCY_InstallPK12Policy();
|
|
||||||
SVRPLCY_InstallSMIMEPolicy();
|
|
||||||
SVRPLCY_InstallUtilityPolicy();
|
|
||||||
#else
|
|
||||||
/* Always domestic policy now */
|
|
||||||
NSS_SetDomesticPolicy();
|
|
||||||
SSM_InstallPK12Policy();
|
|
||||||
SSM_InstallSMIMEPolicy();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
SSMPolicyType
|
|
||||||
SSM_GetPolicy(void)
|
|
||||||
{
|
|
||||||
return policyType;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
enable_SMIME_cipher_prefs(void)
|
|
||||||
{
|
|
||||||
SSMPolicyType policy;
|
|
||||||
|
|
||||||
policy = SSM_GetPolicy();
|
|
||||||
|
|
||||||
switch (policy)
|
|
||||||
{
|
|
||||||
case ssmDomestic:
|
|
||||||
SECMIME_EnableCipher(SMIME_DES_EDE3_168, 1);
|
|
||||||
SECMIME_EnableCipher(SMIME_RC2_CBC_128, 1);
|
|
||||||
SECMIME_EnableCipher(SMIME_RC2_CBC_64, 1);
|
|
||||||
SECMIME_EnableCipher(SMIME_DES_CBC_56, 1);
|
|
||||||
#if 0
|
|
||||||
SECMIME_EnableCipher(SMIME_RC5PAD_64_16_128, 1);
|
|
||||||
SECMIME_EnableCipher(SMIME_RC5PAD_64_16_64, 1);
|
|
||||||
SECMIME_EnableCipher(SMIME_FORTEZZA, 1);
|
|
||||||
#endif
|
|
||||||
case ssmExport:
|
|
||||||
SECMIME_EnableCipher(SMIME_RC2_CBC_40, 1);
|
|
||||||
#if 0
|
|
||||||
SECMIME_EnableCipher(SMIME_RC5PAD_64_16_40, 1);
|
|
||||||
#endif
|
|
||||||
case ssmFrance:
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* now tell secmime that we've sent it the last preference */
|
|
||||||
SECMIME_EnableCipher(CIPHER_FAMILYID_MASK, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define SHORT_PK11_STRING 33
|
|
||||||
#define LONG_PK11_STRING 65
|
|
||||||
|
|
||||||
static char*
|
|
||||||
ssm_ConverToLength(char *origString, PRUint32 newLen)
|
|
||||||
{
|
|
||||||
char *newString;
|
|
||||||
PRUint32 origLen;
|
|
||||||
PRUint32 copyLen;
|
|
||||||
|
|
||||||
newString = SSM_NEW_ARRAY(char,newLen+1);
|
|
||||||
if (newString == NULL) {
|
|
||||||
return origString;
|
|
||||||
}
|
|
||||||
origLen = PL_strlen(origString);
|
|
||||||
copyLen = (origLen > newLen) ? newLen : origLen;
|
|
||||||
memcpy(newString, origString, copyLen);
|
|
||||||
memset(newString+copyLen, ' ' ,newLen - copyLen);
|
|
||||||
newString[newLen]='\0';
|
|
||||||
PR_Free(origString);
|
|
||||||
return newString;
|
|
||||||
}
|
|
||||||
|
|
||||||
SECStatus
|
|
||||||
ssm_InitializePKCS11Strings(void)
|
|
||||||
{
|
|
||||||
char *manufacturerID = NULL;
|
|
||||||
char *libraryDescription = NULL;
|
|
||||||
char *tokenDescription = NULL;
|
|
||||||
char *privateTokenDescription = NULL;
|
|
||||||
char *slotDescription = NULL;
|
|
||||||
char *privateSlotDescription = NULL;
|
|
||||||
char *fipsSlotDescription = NULL;
|
|
||||||
char *fipsPrivateSlotDescription = NULL;
|
|
||||||
|
|
||||||
SSMTextGenContext *cx;
|
|
||||||
SSMStatus rv;
|
|
||||||
|
|
||||||
rv = SSMTextGen_NewTopLevelContext(NULL, &cx);
|
|
||||||
if (rv != SSM_SUCCESS) {
|
|
||||||
goto loser;
|
|
||||||
}
|
|
||||||
rv = SSM_FindUTF8StringInBundles(cx, "manufacturerID", &manufacturerID);
|
|
||||||
if (rv != SSM_SUCCESS) {
|
|
||||||
goto loser;
|
|
||||||
}
|
|
||||||
if (PL_strlen(manufacturerID) != SHORT_PK11_STRING) {
|
|
||||||
manufacturerID = ssm_ConverToLength(manufacturerID, SHORT_PK11_STRING);
|
|
||||||
}
|
|
||||||
rv = SSM_FindUTF8StringInBundles(cx, "libraryDescription",
|
|
||||||
&libraryDescription);
|
|
||||||
if (rv != SSM_SUCCESS) {
|
|
||||||
goto loser;
|
|
||||||
}
|
|
||||||
if (PL_strlen(libraryDescription) != SHORT_PK11_STRING) {
|
|
||||||
libraryDescription = ssm_ConverToLength(libraryDescription,
|
|
||||||
SHORT_PK11_STRING);
|
|
||||||
}
|
|
||||||
rv = SSM_FindUTF8StringInBundles(cx, "tokenDescription",
|
|
||||||
&tokenDescription);
|
|
||||||
if (rv != SSM_SUCCESS) {
|
|
||||||
goto loser;
|
|
||||||
}
|
|
||||||
if (PL_strlen(tokenDescription) != SHORT_PK11_STRING) {
|
|
||||||
tokenDescription = ssm_ConverToLength(tokenDescription,
|
|
||||||
SHORT_PK11_STRING);
|
|
||||||
}
|
|
||||||
rv = SSM_FindUTF8StringInBundles(cx, "privateTokenDescription",
|
|
||||||
&privateTokenDescription);
|
|
||||||
if (rv != SSM_SUCCESS) {
|
|
||||||
goto loser;
|
|
||||||
}
|
|
||||||
if (PL_strlen(privateTokenDescription) != SHORT_PK11_STRING) {
|
|
||||||
privateTokenDescription = ssm_ConverToLength(privateTokenDescription,
|
|
||||||
SHORT_PK11_STRING);
|
|
||||||
}
|
|
||||||
rv = SSM_FindUTF8StringInBundles(cx, "slotDescription", &slotDescription);
|
|
||||||
if (rv != SSM_SUCCESS) {
|
|
||||||
goto loser;
|
|
||||||
}
|
|
||||||
if (PL_strlen(slotDescription) != LONG_PK11_STRING) {
|
|
||||||
slotDescription = ssm_ConverToLength(slotDescription,
|
|
||||||
LONG_PK11_STRING);
|
|
||||||
}
|
|
||||||
rv = SSM_FindUTF8StringInBundles(cx, "privateSlotDescription",
|
|
||||||
&privateSlotDescription);
|
|
||||||
if (rv != SSM_SUCCESS) {
|
|
||||||
goto loser;
|
|
||||||
}
|
|
||||||
if (PL_strlen(privateSlotDescription) != LONG_PK11_STRING) {
|
|
||||||
privateSlotDescription = ssm_ConverToLength(privateSlotDescription,
|
|
||||||
LONG_PK11_STRING);
|
|
||||||
}
|
|
||||||
rv = SSM_FindUTF8StringInBundles(cx, "fipsSlotDescription",
|
|
||||||
&fipsSlotDescription);
|
|
||||||
if (rv != SSM_SUCCESS) {
|
|
||||||
goto loser;
|
|
||||||
}
|
|
||||||
if (PL_strlen(fipsSlotDescription) != LONG_PK11_STRING) {
|
|
||||||
fipsSlotDescription = ssm_ConverToLength(fipsSlotDescription,
|
|
||||||
LONG_PK11_STRING);
|
|
||||||
}
|
|
||||||
rv = SSM_FindUTF8StringInBundles(cx, "fipsPrivateSlotDescription",
|
|
||||||
&fipsPrivateSlotDescription);
|
|
||||||
if (rv != SSM_SUCCESS) {
|
|
||||||
goto loser;
|
|
||||||
}
|
|
||||||
if (PL_strlen(fipsPrivateSlotDescription) != LONG_PK11_STRING) {
|
|
||||||
fipsPrivateSlotDescription =
|
|
||||||
ssm_ConverToLength(fipsPrivateSlotDescription, LONG_PK11_STRING);
|
|
||||||
}
|
|
||||||
if (cx != NULL) {
|
|
||||||
SSMTextGen_DestroyContext(cx);
|
|
||||||
}
|
|
||||||
PK11_ConfigurePKCS11(manufacturerID, libraryDescription, tokenDescription,
|
|
||||||
privateTokenDescription, slotDescription,
|
|
||||||
privateSlotDescription, fipsSlotDescription,
|
|
||||||
fipsPrivateSlotDescription, 0, 0);
|
|
||||||
return SECSuccess;
|
|
||||||
loser:
|
|
||||||
PR_FREEIF(manufacturerID);
|
|
||||||
PR_FREEIF(libraryDescription);
|
|
||||||
PR_FREEIF(tokenDescription);
|
|
||||||
PR_FREEIF(privateTokenDescription);
|
|
||||||
PR_FREEIF(slotDescription);
|
|
||||||
PR_FREEIF(privateSlotDescription);
|
|
||||||
if (cx != NULL) {
|
|
||||||
SSMTextGen_DestroyContext(cx);
|
|
||||||
}
|
|
||||||
return SECFailure;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef XP_UNIX
|
|
||||||
#define CATCH_SIGNAL_DEFAULT(SIGNAL) \
|
|
||||||
if (((int)signal(SIGNAL, psm_signal_handler_default)) == ((int)SIG_ERR)) \
|
|
||||||
goto loser;
|
|
||||||
|
|
||||||
#define CATCH_SIGNAL_IGNORE(SIGNAL) \
|
|
||||||
if (((int)signal(SIGNAL, psm_signal_handler_ignore)) == ((int)SIG_ERR)) \
|
|
||||||
goto loser;
|
|
||||||
|
|
||||||
static void
|
|
||||||
psm_signal_handler_default(int sig)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf ("Trapping the signal %d\n", sig);
|
|
||||||
#endif
|
|
||||||
SSM_ReleaseLockFile();
|
|
||||||
kill(getpid(),SIGKILL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
psm_signal_handler_ignore(int sig)
|
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf ("Ignoring the signal %d\n", sig);
|
|
||||||
#endif
|
|
||||||
signal(sig,psm_signal_handler_ignore);
|
|
||||||
}
|
|
||||||
|
|
||||||
static SSMStatus
|
|
||||||
psm_catch_signals(void)
|
|
||||||
{
|
|
||||||
CATCH_SIGNAL_IGNORE(SIGHUP);
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGINT);
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGQUIT);
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGILL);
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGTRAP);
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGABRT);
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGIOT);
|
|
||||||
#ifdef SIGEMT
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGEMT);
|
|
||||||
#endif
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGFPE);
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGBUS);
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGSEGV);
|
|
||||||
#ifdef SIGSYS
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGSYS);
|
|
||||||
#endif
|
|
||||||
CATCH_SIGNAL_IGNORE(SIGPIPE);
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGTERM);
|
|
||||||
#ifndef LINUX
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGUSR1);
|
|
||||||
#endif
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGUSR2);
|
|
||||||
#ifdef SIGXCPU
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGXCPU);
|
|
||||||
#endif
|
|
||||||
#ifdef SIGDANGER
|
|
||||||
CATCH_SIGNAL_DEFAULT(SIGDANGER);
|
|
||||||
#endif
|
|
||||||
return SSM_SUCCESS;
|
|
||||||
loser:
|
|
||||||
return SSM_FAILURE;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*#if defined(XP_PC) && !defined(DEBUG)*/
|
|
||||||
#if 0
|
|
||||||
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
|
|
||||||
LPSTR lpszLine, int nShow)
|
|
||||||
#elif defined(XP_MAC)
|
|
||||||
/*
|
|
||||||
We run RunMacPSM in a separate thread off the main thread.
|
|
||||||
This is because we can't do any blocking I/O routines on the main
|
|
||||||
thread, because Mac NSPR doesn't own the original thread used to
|
|
||||||
run the app.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void* glue_component = NULL;
|
|
||||||
|
|
||||||
void RunMacPSM(void *arg)
|
|
||||||
#else
|
|
||||||
int psm_main(int argc, char ** argv)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
/*#if (defined(XP_PC) && !defined(DEBUG)) || (defined(XP_MAC))*/
|
|
||||||
#ifdef XP_MAC
|
|
||||||
/* substitute argc and argv for NSPR */
|
|
||||||
int argc = 0;
|
|
||||||
char *argv[] = {"", NULL};
|
|
||||||
#endif
|
|
||||||
PRIntn result = 0;
|
|
||||||
|
|
||||||
#ifdef XP_MAC
|
|
||||||
glue_component = arg;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
PR_STDIO_INIT();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
/* Initialize logging. */
|
|
||||||
SSM_InitLogging();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef TIMEBOMB
|
|
||||||
SSM_CheckTimebomb();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef XP_UNIX
|
|
||||||
if (psm_catch_signals() != SSM_SUCCESS) {
|
|
||||||
SSM_DEBUG("Couldn't set signal handlers. Quitting\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SSM_SetPolicy();
|
|
||||||
enable_SMIME_cipher_prefs();
|
|
||||||
if (SSM_GetPolicy() == ssmDomestic) {
|
|
||||||
SSM_EnableHighGradeKeyGen();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize NLS layer */
|
|
||||||
if (nlsInit() != PR_TRUE) {
|
|
||||||
SSM_DEBUG("Failed to initialize the NLS layer\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize global list of control connections. */
|
|
||||||
connections = SSM_NewCollection();
|
|
||||||
if (connections == NULL)
|
|
||||||
{
|
|
||||||
SSM_DEBUG("Can't initialize! (%ld)\n", (long) result);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
/* Initialize global list of tokens */
|
|
||||||
result = SSM_HashCreate(&tokenList);
|
|
||||||
if (result != PR_SUCCESS || !tokenList) {
|
|
||||||
SSM_DEBUG("Can't initialize - tokenList \n");
|
|
||||||
exit(result);
|
|
||||||
}
|
|
||||||
tokenLock = PR_NewMonitor();
|
|
||||||
if (!tokenLock) {
|
|
||||||
SSM_DEBUG("Can't initialize - tokenLock\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
/* Initialize hash table of control connections */
|
|
||||||
result = SSM_HashCreate(&ctrlConnections);
|
|
||||||
if (result != PR_SUCCESS || !ctrlConnections) {
|
|
||||||
SSM_DEBUG("Can't initialize global table for control connections \n");
|
|
||||||
exit(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize resource table */
|
|
||||||
SSM_ResourceInit();
|
|
||||||
|
|
||||||
if (SSM_InitPolicyHandler() != PR_SUCCESS) {
|
|
||||||
SSM_DEBUG("Couldn't initialize the Policy Handler.\n");
|
|
||||||
exit (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* initialize random number generator */
|
|
||||||
SSM_DEBUG("Initializing random number generator.\n");
|
|
||||||
RNG_RNGInit();
|
|
||||||
RNG_SystemInfoForRNG();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* All the ciphers except SSL_RSA_WITH_NULL_MD5 are on by default.
|
|
||||||
* Enable encryption, enable NULL cipher.
|
|
||||||
*/
|
|
||||||
#ifdef XP_MAC
|
|
||||||
result = mainLoop(argc, argv);
|
|
||||||
#else
|
|
||||||
result = PR_Initialize(mainLoop, argc, argv, 0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("main: Finishing (%ld)\n", (long) result);
|
|
||||||
#endif
|
|
||||||
#ifdef XP_UNIX
|
|
||||||
SSM_ReleaseLockFile();
|
|
||||||
#endif
|
|
||||||
#ifndef XP_MAC
|
|
||||||
return result;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef XP_MAC
|
|
||||||
void *
|
|
||||||
psm_malloc(unsigned long numbytes)
|
|
||||||
{
|
|
||||||
return NewPtrClear(numbytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
psm_free(void *ptr)
|
|
||||||
{
|
|
||||||
DisposePtr((char *) ptr);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
PRIntn mainLoop(PRIntn argc, char ** argv)
|
|
||||||
{
|
|
||||||
PRFileDesc *socket, *respsocket;
|
|
||||||
PRNetAddr clientaddr;
|
|
||||||
SSMControlConnection *curconnect;
|
|
||||||
SSMResourceID ctrlID;
|
|
||||||
SSMStatus status = PR_FAILURE;
|
|
||||||
PRBool alive = PR_TRUE;
|
|
||||||
|
|
||||||
/* Register ourselves so that logs, etc can identify us */
|
|
||||||
SSM_RegisterThread("main", NULL);
|
|
||||||
|
|
||||||
/* Open NLS stuff */
|
|
||||||
SSM_DEBUG("Initializing NLS.\n");
|
|
||||||
#ifdef XP_MAC
|
|
||||||
SSM_InitNLS(":ui:");
|
|
||||||
#else
|
|
||||||
SSM_InitNLS("ui");
|
|
||||||
#endif
|
|
||||||
ssm_InitializePKCS11Strings();
|
|
||||||
|
|
||||||
/* Initialize the protocol */
|
|
||||||
#ifdef XP_MAC
|
|
||||||
CMT_Init(malloc, free);
|
|
||||||
#else
|
|
||||||
CMT_Init(PR_Malloc, PR_Free);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Open the HTTP listener */
|
|
||||||
SSM_DEBUG("Opening HTTP thread.\n");
|
|
||||||
status = SSM_InitHTTP();
|
|
||||||
if (status != SSM_SUCCESS)
|
|
||||||
{
|
|
||||||
SSM_DEBUG("Couldn't open web port. Exiting.\n");
|
|
||||||
goto loser;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* open a port for control connections, with well-known port# */
|
|
||||||
socket = SSM_OpenControlPort();
|
|
||||||
if (!socket)
|
|
||||||
{
|
|
||||||
SSM_DEBUG("Couldn't open control port. Exiting.\n");
|
|
||||||
goto loser;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef XP_MAC
|
|
||||||
if (PR_CEnterMonitor(glue_component) != NULL) {
|
|
||||||
PR_CNotify(glue_component);
|
|
||||||
PR_CExitMonitor(glue_component);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
while (alive)
|
|
||||||
{
|
|
||||||
/* wait until there is incoming request */
|
|
||||||
|
|
||||||
respsocket = PR_Accept(socket, &clientaddr, PR_INTERVAL_NO_TIMEOUT);
|
|
||||||
/* while (respsocket == NULL)
|
|
||||||
{
|
|
||||||
if (PR_GetError() != PR_WOULD_BLOCK_ERROR)
|
|
||||||
goto loser;
|
|
||||||
PR_Sleep(CARTMAN_SPINTIME);
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("master: Still ready for client connection on port %d\n", CARTMAN_PORT); fflush(stdout);
|
|
||||||
#endif
|
|
||||||
respsocket = PR_Accept(socket, &clientaddr,
|
|
||||||
PR_SecondsToInterval(2));
|
|
||||||
} */
|
|
||||||
if (!respsocket) {
|
|
||||||
/* accept failed: abort */
|
|
||||||
status = PR_GetError();
|
|
||||||
SSM_DEBUG("Error %d accepting control connection. Exiting.\n",
|
|
||||||
status);
|
|
||||||
goto loser;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SSM_SocketPeerCheck(respsocket, PR_TRUE)) {
|
|
||||||
SSM_DEBUG("creating control connection.\n");
|
|
||||||
status = SSM_CreateResource(SSM_RESTYPE_CONTROL_CONNECTION,
|
|
||||||
respsocket,
|
|
||||||
NULL,
|
|
||||||
&ctrlID,
|
|
||||||
(SSMResource **) &curconnect);
|
|
||||||
if (status != PR_SUCCESS)
|
|
||||||
break;
|
|
||||||
|
|
||||||
PR_ASSERT(RESOURCE_CLASS(curconnect) == SSM_RESTYPE_CONTROL_CONNECTION);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* connection did not come from localhost: shut down the
|
|
||||||
* connection and continue to loop
|
|
||||||
*/
|
|
||||||
SSM_DEBUG("Connection attempt from a non-local host!\n");
|
|
||||||
status = PR_Shutdown(respsocket, PR_SHUTDOWN_BOTH);
|
|
||||||
respsocket = NULL;
|
|
||||||
}
|
|
||||||
} /* end while(true) */
|
|
||||||
loser:
|
|
||||||
/* Shut down the HTTP thread. */
|
|
||||||
if (httpListenThread != NULL){
|
|
||||||
PR_Interrupt(httpListenThread);
|
|
||||||
}
|
|
||||||
exit(1);
|
|
||||||
/* ### mwelch - should we return meaningful error code? */
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
Загрузка…
Ссылка в новой задаче