1*12720SWyllys.Ingersoll@Sun.COM /* 2*12720SWyllys.Ingersoll@Sun.COM * CDDL HEADER START 3*12720SWyllys.Ingersoll@Sun.COM * 4*12720SWyllys.Ingersoll@Sun.COM * The contents of this file are subject to the terms of the 5*12720SWyllys.Ingersoll@Sun.COM * Common Development and Distribution License (the "License"). 6*12720SWyllys.Ingersoll@Sun.COM * You may not use this file except in compliance with the License. 7*12720SWyllys.Ingersoll@Sun.COM * 8*12720SWyllys.Ingersoll@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*12720SWyllys.Ingersoll@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*12720SWyllys.Ingersoll@Sun.COM * See the License for the specific language governing permissions 11*12720SWyllys.Ingersoll@Sun.COM * and limitations under the License. 12*12720SWyllys.Ingersoll@Sun.COM * 13*12720SWyllys.Ingersoll@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*12720SWyllys.Ingersoll@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*12720SWyllys.Ingersoll@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*12720SWyllys.Ingersoll@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*12720SWyllys.Ingersoll@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*12720SWyllys.Ingersoll@Sun.COM * 19*12720SWyllys.Ingersoll@Sun.COM * CDDL HEADER END 20*12720SWyllys.Ingersoll@Sun.COM */ 21*12720SWyllys.Ingersoll@Sun.COM 22*12720SWyllys.Ingersoll@Sun.COM /* 23*12720SWyllys.Ingersoll@Sun.COM * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 24*12720SWyllys.Ingersoll@Sun.COM */ 25*12720SWyllys.Ingersoll@Sun.COM 26*12720SWyllys.Ingersoll@Sun.COM #include <stdio.h> 27*12720SWyllys.Ingersoll@Sun.COM #include <errno.h> 28*12720SWyllys.Ingersoll@Sun.COM 29*12720SWyllys.Ingersoll@Sun.COM #if !defined(UNIX) && !defined(METAWARE) 30*12720SWyllys.Ingersoll@Sun.COM #include "KMSAgent_direct.h" 31*12720SWyllys.Ingersoll@Sun.COM #endif 32*12720SWyllys.Ingersoll@Sun.COM 33*12720SWyllys.Ingersoll@Sun.COM #include <string.h> 34*12720SWyllys.Ingersoll@Sun.COM 35*12720SWyllys.Ingersoll@Sun.COM #include "KMSClientProfile.h" 36*12720SWyllys.Ingersoll@Sun.COM 37*12720SWyllys.Ingersoll@Sun.COM #include "KMSAgent.h" 38*12720SWyllys.Ingersoll@Sun.COM #include "KMS_CAStub.h" 39*12720SWyllys.Ingersoll@Sun.COM #include "KMS_CertificateStub.h" 40*12720SWyllys.Ingersoll@Sun.COM #include "KMS_DiscoveryStub.h" 41*12720SWyllys.Ingersoll@Sun.COM #include "KMSClientProfileImpl.h" 42*12720SWyllys.Ingersoll@Sun.COM #include "KMSAuditLogger.h" 43*12720SWyllys.Ingersoll@Sun.COM #include "KMSAgentSoapUtilities.h" 44*12720SWyllys.Ingersoll@Sun.COM #include "KMSAgentStringUtilities.h" 45*12720SWyllys.Ingersoll@Sun.COM 46*12720SWyllys.Ingersoll@Sun.COM 47*12720SWyllys.Ingersoll@Sun.COM #include "KMSAgentPKICommon.h" // must be before agentstorage 48*12720SWyllys.Ingersoll@Sun.COM 49*12720SWyllys.Ingersoll@Sun.COM #include "stdsoap2.h" 50*12720SWyllys.Ingersoll@Sun.COM #include "KMSAgentStorage.h" // uses KMSClientProfile 51*12720SWyllys.Ingersoll@Sun.COM 52*12720SWyllys.Ingersoll@Sun.COM 53*12720SWyllys.Ingersoll@Sun.COM #include "KMSAgentWebServiceNamespaces.h" 54*12720SWyllys.Ingersoll@Sun.COM #include "k_setupssl.h" 55*12720SWyllys.Ingersoll@Sun.COM #include "KMSAgentChallenge.h" 56*12720SWyllys.Ingersoll@Sun.COM #include "KMSAgentCryptoUtilities.h" 57*12720SWyllys.Ingersoll@Sun.COM #include "ApplianceParameters.h" 58*12720SWyllys.Ingersoll@Sun.COM #include "AutoMutex.h" 59*12720SWyllys.Ingersoll@Sun.COM 60*12720SWyllys.Ingersoll@Sun.COM #include "KMSAgentLoadBalancer.h" 61*12720SWyllys.Ingersoll@Sun.COM #include "KMSAgentDataUnitCache.h" 62*12720SWyllys.Ingersoll@Sun.COM 63*12720SWyllys.Ingersoll@Sun.COM #include "ClientSoapFaultCodes.h" 64*12720SWyllys.Ingersoll@Sun.COM #ifdef METAWARE 65*12720SWyllys.Ingersoll@Sun.COM #include "debug.h" 66*12720SWyllys.Ingersoll@Sun.COM #include "sizet.h" 67*12720SWyllys.Ingersoll@Sun.COM typedef unsigned char uint8_t; 68*12720SWyllys.Ingersoll@Sun.COM typedef unsigned short uint16_t; 69*12720SWyllys.Ingersoll@Sun.COM typedef unsigned int uint32_t; 70*12720SWyllys.Ingersoll@Sun.COM typedef unsigned long long uint64_t; 71*12720SWyllys.Ingersoll@Sun.COM #include "literals.h" 72*12720SWyllys.Ingersoll@Sun.COM #endif 73*12720SWyllys.Ingersoll@Sun.COM #include "KMSAgentAESKeyWrap.h" 74*12720SWyllys.Ingersoll@Sun.COM 75*12720SWyllys.Ingersoll@Sun.COM #if defined(METAWARE) && defined(DEBUG) 76*12720SWyllys.Ingersoll@Sun.COM #include "debug.h" 77*12720SWyllys.Ingersoll@Sun.COM #endif 78*12720SWyllys.Ingersoll@Sun.COM #include "KMSAuditLogger.h" 79*12720SWyllys.Ingersoll@Sun.COM #include "KMSClientProfileImpl.h" 80*12720SWyllys.Ingersoll@Sun.COM 81*12720SWyllys.Ingersoll@Sun.COM #ifdef METAWARE 82*12720SWyllys.Ingersoll@Sun.COM extern "C" void 83*12720SWyllys.Ingersoll@Sun.COM tnMsg( const char *format, 84*12720SWyllys.Ingersoll@Sun.COM ... ); 85*12720SWyllys.Ingersoll@Sun.COM #endif 86*12720SWyllys.Ingersoll@Sun.COM 87*12720SWyllys.Ingersoll@Sun.COM bool g_bUseFileLog = false; 88*12720SWyllys.Ingersoll@Sun.COM char g_wsWorkingDirectory[KMS_MAX_PATH_LENGTH+1] = "./"; 89*12720SWyllys.Ingersoll@Sun.COM 90*12720SWyllys.Ingersoll@Sun.COM 91*12720SWyllys.Ingersoll@Sun.COM static bool InitializeLogging( 92*12720SWyllys.Ingersoll@Sun.COM const utf8cstr i_wsWorkingDirectory, 93*12720SWyllys.Ingersoll@Sun.COM int i_bUseFileLog ) 94*12720SWyllys.Ingersoll@Sun.COM { 95*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( !i_bUseFileLog || i_wsWorkingDirectory ); 96*12720SWyllys.Ingersoll@Sun.COM 97*12720SWyllys.Ingersoll@Sun.COM bool bFileLogSuccess = true; 98*12720SWyllys.Ingersoll@Sun.COM 99*12720SWyllys.Ingersoll@Sun.COM g_bUseFileLog = ( i_bUseFileLog != 0 ); 100*12720SWyllys.Ingersoll@Sun.COM 101*12720SWyllys.Ingersoll@Sun.COM // InitializeFileLogging must always be called, 102*12720SWyllys.Ingersoll@Sun.COM // because the file is always used by FATALs. 103*12720SWyllys.Ingersoll@Sun.COM 104*12720SWyllys.Ingersoll@Sun.COM bFileLogSuccess = InitializeFileLogging( i_wsWorkingDirectory ) ? true:false; 105*12720SWyllys.Ingersoll@Sun.COM 106*12720SWyllys.Ingersoll@Sun.COM return bFileLogSuccess; 107*12720SWyllys.Ingersoll@Sun.COM } 108*12720SWyllys.Ingersoll@Sun.COM 109*12720SWyllys.Ingersoll@Sun.COM static void FinalizeLogging() 110*12720SWyllys.Ingersoll@Sun.COM { 111*12720SWyllys.Ingersoll@Sun.COM // FinalizeFileLogging must always be called, 112*12720SWyllys.Ingersoll@Sun.COM // because the file is always used by FATALs. 113*12720SWyllys.Ingersoll@Sun.COM FinalizeFileLogging(); 114*12720SWyllys.Ingersoll@Sun.COM 115*12720SWyllys.Ingersoll@Sun.COM return; 116*12720SWyllys.Ingersoll@Sun.COM } 117*12720SWyllys.Ingersoll@Sun.COM 118*12720SWyllys.Ingersoll@Sun.COM 119*12720SWyllys.Ingersoll@Sun.COM 120*12720SWyllys.Ingersoll@Sun.COM 121*12720SWyllys.Ingersoll@Sun.COM /*--------------------------------------------------------------------------- 122*12720SWyllys.Ingersoll@Sun.COM * Function: KMSClient_InitializeLibrary 123*12720SWyllys.Ingersoll@Sun.COM * 124*12720SWyllys.Ingersoll@Sun.COM *--------------------------------------------------------------------------*/ 125*12720SWyllys.Ingersoll@Sun.COM 126*12720SWyllys.Ingersoll@Sun.COM bool KMSClient_InitializeLibrary( 127*12720SWyllys.Ingersoll@Sun.COM const utf8cstr i_wsWorkingDirectory, 128*12720SWyllys.Ingersoll@Sun.COM int i_bUseFileLog) 129*12720SWyllys.Ingersoll@Sun.COM { 130*12720SWyllys.Ingersoll@Sun.COM bool bSuccess; 131*12720SWyllys.Ingersoll@Sun.COM 132*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 133*12720SWyllys.Ingersoll@Sun.COM log_printf("KMSClient_InitializeLibrary : ENTERING"); 134*12720SWyllys.Ingersoll@Sun.COM #endif 135*12720SWyllys.Ingersoll@Sun.COM 136*12720SWyllys.Ingersoll@Sun.COM // setup SSL 137*12720SWyllys.Ingersoll@Sun.COM bSuccess = K_SetupSSL() == 1; 138*12720SWyllys.Ingersoll@Sun.COM if(!bSuccess) 139*12720SWyllys.Ingersoll@Sun.COM { 140*12720SWyllys.Ingersoll@Sun.COM return false; 141*12720SWyllys.Ingersoll@Sun.COM } 142*12720SWyllys.Ingersoll@Sun.COM 143*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 144*12720SWyllys.Ingersoll@Sun.COM log_printf("KMSClient_InitializeLibrary : set current directory"); 145*12720SWyllys.Ingersoll@Sun.COM #endif 146*12720SWyllys.Ingersoll@Sun.COM 147*12720SWyllys.Ingersoll@Sun.COM // if i_wsWorkingDirectory is null, caller means current directory 148*12720SWyllys.Ingersoll@Sun.COM if ( i_wsWorkingDirectory != NULL ) 149*12720SWyllys.Ingersoll@Sun.COM { 150*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 151*12720SWyllys.Ingersoll@Sun.COM log_printf("KMSClient_InitializeLibrary : check working directory"); 152*12720SWyllys.Ingersoll@Sun.COM #endif 153*12720SWyllys.Ingersoll@Sun.COM 154*12720SWyllys.Ingersoll@Sun.COM // string is there but is empty or junk 155*12720SWyllys.Ingersoll@Sun.COM if (strlen(i_wsWorkingDirectory) <= 0) 156*12720SWyllys.Ingersoll@Sun.COM { 157*12720SWyllys.Ingersoll@Sun.COM strcpy(i_wsWorkingDirectory, "."); 158*12720SWyllys.Ingersoll@Sun.COM } 159*12720SWyllys.Ingersoll@Sun.COM 160*12720SWyllys.Ingersoll@Sun.COM if ( strlen(i_wsWorkingDirectory) >= KMS_MAX_PATH_LENGTH ) 161*12720SWyllys.Ingersoll@Sun.COM { 162*12720SWyllys.Ingersoll@Sun.COM return false; 163*12720SWyllys.Ingersoll@Sun.COM } 164*12720SWyllys.Ingersoll@Sun.COM 165*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 166*12720SWyllys.Ingersoll@Sun.COM log_printf("KMSClient_InitializeLibrary : set global working directory"); 167*12720SWyllys.Ingersoll@Sun.COM #endif 168*12720SWyllys.Ingersoll@Sun.COM 169*12720SWyllys.Ingersoll@Sun.COM // set global working directory to input 170*12720SWyllys.Ingersoll@Sun.COM strncpy(g_wsWorkingDirectory, 171*12720SWyllys.Ingersoll@Sun.COM i_wsWorkingDirectory, 172*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_PATH_LENGTH); 173*12720SWyllys.Ingersoll@Sun.COM g_wsWorkingDirectory[KMS_MAX_PATH_LENGTH] = 0; 174*12720SWyllys.Ingersoll@Sun.COM } 175*12720SWyllys.Ingersoll@Sun.COM else 176*12720SWyllys.Ingersoll@Sun.COM { 177*12720SWyllys.Ingersoll@Sun.COM strcpy(g_wsWorkingDirectory, "."); 178*12720SWyllys.Ingersoll@Sun.COM } 179*12720SWyllys.Ingersoll@Sun.COM 180*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 181*12720SWyllys.Ingersoll@Sun.COM log_printf("KMSClient_InitializeLibrary : Initialize logging"); 182*12720SWyllys.Ingersoll@Sun.COM #endif 183*12720SWyllys.Ingersoll@Sun.COM 184*12720SWyllys.Ingersoll@Sun.COM // initialize file logging 185*12720SWyllys.Ingersoll@Sun.COM bSuccess = InitializeLogging( g_wsWorkingDirectory, 186*12720SWyllys.Ingersoll@Sun.COM i_bUseFileLog); 187*12720SWyllys.Ingersoll@Sun.COM 188*12720SWyllys.Ingersoll@Sun.COM return bSuccess; 189*12720SWyllys.Ingersoll@Sun.COM } 190*12720SWyllys.Ingersoll@Sun.COM 191*12720SWyllys.Ingersoll@Sun.COM 192*12720SWyllys.Ingersoll@Sun.COM /*--------------------------------------------------------------------------- 193*12720SWyllys.Ingersoll@Sun.COM * Function: KMSClient_FinalizeLibrary 194*12720SWyllys.Ingersoll@Sun.COM *--------------------------------------------------------------------------*/ 195*12720SWyllys.Ingersoll@Sun.COM bool KMSClient_FinalizeLibrary() 196*12720SWyllys.Ingersoll@Sun.COM { 197*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 198*12720SWyllys.Ingersoll@Sun.COM log_printf("KMSClient_FinalizeLibrary : ENTERING"); 199*12720SWyllys.Ingersoll@Sun.COM #endif 200*12720SWyllys.Ingersoll@Sun.COM 201*12720SWyllys.Ingersoll@Sun.COM K_CleanupSSL(); 202*12720SWyllys.Ingersoll@Sun.COM 203*12720SWyllys.Ingersoll@Sun.COM FinalizeLogging(); 204*12720SWyllys.Ingersoll@Sun.COM 205*12720SWyllys.Ingersoll@Sun.COM return true; /* always */ 206*12720SWyllys.Ingersoll@Sun.COM } 207*12720SWyllys.Ingersoll@Sun.COM 208*12720SWyllys.Ingersoll@Sun.COM 209*12720SWyllys.Ingersoll@Sun.COM int LogError_lastErrno; 210*12720SWyllys.Ingersoll@Sun.COM 211*12720SWyllys.Ingersoll@Sun.COM 212*12720SWyllys.Ingersoll@Sun.COM /** 213*12720SWyllys.Ingersoll@Sun.COM * Construct a message for the KMSAuditLogger and store the message 214*12720SWyllys.Ingersoll@Sun.COM * in the profile as the last error message. 215*12720SWyllys.Ingersoll@Sun.COM */ 216*12720SWyllys.Ingersoll@Sun.COM void LogError_function(KMSClientProfile *i_pProfile, 217*12720SWyllys.Ingersoll@Sun.COM int i_iErrno, 218*12720SWyllys.Ingersoll@Sun.COM const char* i_sOperation, 219*12720SWyllys.Ingersoll@Sun.COM const char* i_sEntityID, 220*12720SWyllys.Ingersoll@Sun.COM const char* i_sNetworkAddress, 221*12720SWyllys.Ingersoll@Sun.COM const char* i_sMessage ) 222*12720SWyllys.Ingersoll@Sun.COM { 223*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( i_pProfile && i_sOperation ); 224*12720SWyllys.Ingersoll@Sun.COM 225*12720SWyllys.Ingersoll@Sun.COM // save for caller's use - this shouldn't be a global, but I don't 226*12720SWyllys.Ingersoll@Sun.COM // want this as an item in the profile as I don't want it persisted 227*12720SWyllys.Ingersoll@Sun.COM LogError_lastErrno = i_iErrno; 228*12720SWyllys.Ingersoll@Sun.COM 229*12720SWyllys.Ingersoll@Sun.COM // log the message to a data file (and internal logs) 230*12720SWyllys.Ingersoll@Sun.COM #ifndef METAWARE 231*12720SWyllys.Ingersoll@Sun.COM if ( g_bUseFileLog ) 232*12720SWyllys.Ingersoll@Sun.COM #endif 233*12720SWyllys.Ingersoll@Sun.COM { 234*12720SWyllys.Ingersoll@Sun.COM Log_function(i_iErrno, 235*12720SWyllys.Ingersoll@Sun.COM i_sOperation, 236*12720SWyllys.Ingersoll@Sun.COM i_sEntityID, 237*12720SWyllys.Ingersoll@Sun.COM i_sNetworkAddress, 238*12720SWyllys.Ingersoll@Sun.COM i_sMessage); 239*12720SWyllys.Ingersoll@Sun.COM } 240*12720SWyllys.Ingersoll@Sun.COM 241*12720SWyllys.Ingersoll@Sun.COM #ifdef METAWARE 242*12720SWyllys.Ingersoll@Sun.COM /* print this to the T10000/9840 VOP */ 243*12720SWyllys.Ingersoll@Sun.COM /* NOTE the \n is important to VOP - leave it in */ 244*12720SWyllys.Ingersoll@Sun.COM tnMsg("`msg`KMS2.0:msg#=%i,op=%s\r\n", 245*12720SWyllys.Ingersoll@Sun.COM i_iErrno, 246*12720SWyllys.Ingersoll@Sun.COM i_sOperation); 247*12720SWyllys.Ingersoll@Sun.COM 248*12720SWyllys.Ingersoll@Sun.COM tnMsg("`msg`msg=%s,eid=%s,addr=%s\r\n", 249*12720SWyllys.Ingersoll@Sun.COM i_sMessage, 250*12720SWyllys.Ingersoll@Sun.COM i_sEntityID, 251*12720SWyllys.Ingersoll@Sun.COM i_sNetworkAddress); 252*12720SWyllys.Ingersoll@Sun.COM 253*12720SWyllys.Ingersoll@Sun.COM #endif 254*12720SWyllys.Ingersoll@Sun.COM 255*12720SWyllys.Ingersoll@Sun.COM // copy the error message into the profile (for later reference) 256*12720SWyllys.Ingersoll@Sun.COM strncpy(i_pProfile->m_wsErrorString, 257*12720SWyllys.Ingersoll@Sun.COM i_sOperation, 258*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ERROR_STRING); 259*12720SWyllys.Ingersoll@Sun.COM 260*12720SWyllys.Ingersoll@Sun.COM // make sure to NUL out the end 261*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_wsErrorString[KMS_MAX_ERROR_STRING] = 0; 262*12720SWyllys.Ingersoll@Sun.COM 263*12720SWyllys.Ingersoll@Sun.COM if ( i_sEntityID ) 264*12720SWyllys.Ingersoll@Sun.COM { 265*12720SWyllys.Ingersoll@Sun.COM strncat(i_pProfile->m_wsErrorString, 266*12720SWyllys.Ingersoll@Sun.COM i_sEntityID, 267*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ERROR_STRING); 268*12720SWyllys.Ingersoll@Sun.COM } 269*12720SWyllys.Ingersoll@Sun.COM 270*12720SWyllys.Ingersoll@Sun.COM if ( i_sNetworkAddress ) 271*12720SWyllys.Ingersoll@Sun.COM { 272*12720SWyllys.Ingersoll@Sun.COM strncat(i_pProfile->m_wsErrorString, 273*12720SWyllys.Ingersoll@Sun.COM ",Address=", 274*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ERROR_STRING); 275*12720SWyllys.Ingersoll@Sun.COM strncat(i_pProfile->m_wsErrorString, 276*12720SWyllys.Ingersoll@Sun.COM i_sNetworkAddress, 277*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ERROR_STRING); 278*12720SWyllys.Ingersoll@Sun.COM } 279*12720SWyllys.Ingersoll@Sun.COM 280*12720SWyllys.Ingersoll@Sun.COM if ( i_sMessage ) 281*12720SWyllys.Ingersoll@Sun.COM { 282*12720SWyllys.Ingersoll@Sun.COM strncat(i_pProfile->m_wsErrorString, 283*12720SWyllys.Ingersoll@Sun.COM ",Msg=", 284*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ERROR_STRING); 285*12720SWyllys.Ingersoll@Sun.COM strncat(i_pProfile->m_wsErrorString, 286*12720SWyllys.Ingersoll@Sun.COM i_sMessage, 287*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ERROR_STRING); 288*12720SWyllys.Ingersoll@Sun.COM } 289*12720SWyllys.Ingersoll@Sun.COM 290*12720SWyllys.Ingersoll@Sun.COM // make sure to NUL out the end 291*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_wsErrorString[KMS_MAX_ERROR_STRING] = 0; 292*12720SWyllys.Ingersoll@Sun.COM 293*12720SWyllys.Ingersoll@Sun.COM } 294*12720SWyllys.Ingersoll@Sun.COM 295*12720SWyllys.Ingersoll@Sun.COM // see KMSClientProfileImpl.h 296*12720SWyllys.Ingersoll@Sun.COM bool SSL_InvalidCertificate (const char * const i_sErrorString) 297*12720SWyllys.Ingersoll@Sun.COM { 298*12720SWyllys.Ingersoll@Sun.COM if ( 299*12720SWyllys.Ingersoll@Sun.COM // OpenSSL generates this msg 300*12720SWyllys.Ingersoll@Sun.COM strstr(i_sErrorString, "sslv3 alert certificate unknown")) 301*12720SWyllys.Ingersoll@Sun.COM { 302*12720SWyllys.Ingersoll@Sun.COM return true; 303*12720SWyllys.Ingersoll@Sun.COM } 304*12720SWyllys.Ingersoll@Sun.COM return false; 305*12720SWyllys.Ingersoll@Sun.COM 306*12720SWyllys.Ingersoll@Sun.COM } 307*12720SWyllys.Ingersoll@Sun.COM 308*12720SWyllys.Ingersoll@Sun.COM // see KMSClientProfileImpl.h 309*12720SWyllys.Ingersoll@Sun.COM bool ServerError (const char * i_sErrorString, int i_iErrno ) 310*12720SWyllys.Ingersoll@Sun.COM { 311*12720SWyllys.Ingersoll@Sun.COM // The Client Soap Fault Code returned by the KMA 312*12720SWyllys.Ingersoll@Sun.COM // may be at the start of i_sErrorString or immediately 313*12720SWyllys.Ingersoll@Sun.COM // follwing "SoapFaultString=" depending on the caller's 314*12720SWyllys.Ingersoll@Sun.COM // string 315*12720SWyllys.Ingersoll@Sun.COM 316*12720SWyllys.Ingersoll@Sun.COM int iErrorCode; 317*12720SWyllys.Ingersoll@Sun.COM 318*12720SWyllys.Ingersoll@Sun.COM const char* sFaultstringStart = strstr(i_sErrorString, "SoapFaultString=" ); 319*12720SWyllys.Ingersoll@Sun.COM if ( sFaultstringStart ) 320*12720SWyllys.Ingersoll@Sun.COM { 321*12720SWyllys.Ingersoll@Sun.COM iErrorCode = GET_FAULT_CODE( sFaultstringStart + strlen("SoapFaultString=") ); 322*12720SWyllys.Ingersoll@Sun.COM } 323*12720SWyllys.Ingersoll@Sun.COM else 324*12720SWyllys.Ingersoll@Sun.COM { 325*12720SWyllys.Ingersoll@Sun.COM // This may be zero if there is no error code at the start of the string. 326*12720SWyllys.Ingersoll@Sun.COM iErrorCode = GET_FAULT_CODE( i_sErrorString ); 327*12720SWyllys.Ingersoll@Sun.COM } 328*12720SWyllys.Ingersoll@Sun.COM 329*12720SWyllys.Ingersoll@Sun.COM // the following is commented out so the former check can be observed. This check is no longer 330*12720SWyllys.Ingersoll@Sun.COM // made since invalid certificate failures may be due to a KMA that is behind on 331*12720SWyllys.Ingersoll@Sun.COM // replication updates hence failover would succeed. 332*12720SWyllys.Ingersoll@Sun.COM // if ( 333*12720SWyllys.Ingersoll@Sun.COM // // OpenSSL generates this msg 334*12720SWyllys.Ingersoll@Sun.COM // SSL_InvalidCertificate(i_sErrorString)) 335*12720SWyllys.Ingersoll@Sun.COM // { 336*12720SWyllys.Ingersoll@Sun.COM // return false; 337*12720SWyllys.Ingersoll@Sun.COM // } 338*12720SWyllys.Ingersoll@Sun.COM 339*12720SWyllys.Ingersoll@Sun.COM if ( 340*12720SWyllys.Ingersoll@Sun.COM // when the KMA is locked 341*12720SWyllys.Ingersoll@Sun.COM iErrorCode == CLIENT_ERROR_AGENT_APPLIANCE_LOCKED 342*12720SWyllys.Ingersoll@Sun.COM 343*12720SWyllys.Ingersoll@Sun.COM // KMS 2.2 change when the KMA is locked 344*12720SWyllys.Ingersoll@Sun.COM || iErrorCode == CLIENT_ERROR_MANAGER_APPLIANCE_LOCKED 345*12720SWyllys.Ingersoll@Sun.COM 346*12720SWyllys.Ingersoll@Sun.COM // KMS 2.2 change for core security internal error 347*12720SWyllys.Ingersoll@Sun.COM || iErrorCode == CLIENT_ERROR_MANAGER_INTERNAL 348*12720SWyllys.Ingersoll@Sun.COM 349*12720SWyllys.Ingersoll@Sun.COM // if the KMA's pre-gen'd key pool is depleted 350*12720SWyllys.Ingersoll@Sun.COM || iErrorCode == CLIENT_ERROR_AGENT_NO_READY_KEYS 351*12720SWyllys.Ingersoll@Sun.COM 352*12720SWyllys.Ingersoll@Sun.COM // if the KMA's HSM is broke and the KMA is in FIPS mode 353*12720SWyllys.Ingersoll@Sun.COM || iErrorCode == CLIENT_ERROR_SERVER_HSM_REQUIRED_BUT_MISSING 354*12720SWyllys.Ingersoll@Sun.COM 355*12720SWyllys.Ingersoll@Sun.COM // when the server is too slow 356*12720SWyllys.Ingersoll@Sun.COM || NULL != strstr( i_sErrorString, "Timeout" ) 357*12720SWyllys.Ingersoll@Sun.COM || NULL != strstr( i_sErrorString, "Operation interrupted or timed out" ) 358*12720SWyllys.Ingersoll@Sun.COM 359*12720SWyllys.Ingersoll@Sun.COM // The Appliance is powered down, or is not reachable 360*12720SWyllys.Ingersoll@Sun.COM || NULL != strstr( i_sErrorString, "Connection refused" ) 361*12720SWyllys.Ingersoll@Sun.COM 362*12720SWyllys.Ingersoll@Sun.COM || NULL != strstr( i_sErrorString, "Unknown error" ) 363*12720SWyllys.Ingersoll@Sun.COM 364*12720SWyllys.Ingersoll@Sun.COM // SOAP EOF 365*12720SWyllys.Ingersoll@Sun.COM || NULL != strstr( i_sErrorString, "End of file or no input:" ) 366*12720SWyllys.Ingersoll@Sun.COM 367*12720SWyllys.Ingersoll@Sun.COM // Appliance server software is not running (while Appliance machine is OK) 368*12720SWyllys.Ingersoll@Sun.COM || NULL != strstr( i_sErrorString, "connect failed in tcp_connect()" ) 369*12720SWyllys.Ingersoll@Sun.COM 370*12720SWyllys.Ingersoll@Sun.COM // If the server has an internal error but still responds 371*12720SWyllys.Ingersoll@Sun.COM || NULL != strstr( i_sErrorString, "Server Error" ) 372*12720SWyllys.Ingersoll@Sun.COM 373*12720SWyllys.Ingersoll@Sun.COM // OpenSSL protocol errors (Note: the SSL_ERROR_SSL may be due 374*12720SWyllys.Ingersoll@Sun.COM // to invalid client-side values, but for now it's used as a 375*12720SWyllys.Ingersoll@Sun.COM // catch-all; a side-effect is that any actual invalid client-side 376*12720SWyllys.Ingersoll@Sun.COM // value will cause one audit log entry to be created on each 377*12720SWyllys.Ingersoll@Sun.COM // Appliance in the cluster). 378*12720SWyllys.Ingersoll@Sun.COM || NULL != strstr( i_sErrorString, 379*12720SWyllys.Ingersoll@Sun.COM "Error observed by underlying BIO: No error" ) 380*12720SWyllys.Ingersoll@Sun.COM || NULL != strstr( i_sErrorString, 381*12720SWyllys.Ingersoll@Sun.COM "EOF was observed that violates the protocol" ) 382*12720SWyllys.Ingersoll@Sun.COM || NULL != strstr( i_sErrorString, 383*12720SWyllys.Ingersoll@Sun.COM "SSL_ERROR_SSL" ) ) 384*12720SWyllys.Ingersoll@Sun.COM { 385*12720SWyllys.Ingersoll@Sun.COM return true; 386*12720SWyllys.Ingersoll@Sun.COM } 387*12720SWyllys.Ingersoll@Sun.COM 388*12720SWyllys.Ingersoll@Sun.COM #ifndef WIN32 389*12720SWyllys.Ingersoll@Sun.COM // check for errno values that imply connection problems to the server 390*12720SWyllys.Ingersoll@Sun.COM switch (i_iErrno) 391*12720SWyllys.Ingersoll@Sun.COM { 392*12720SWyllys.Ingersoll@Sun.COM case ECONNABORTED : return true; // Connection aborted. 393*12720SWyllys.Ingersoll@Sun.COM case ECONNREFUSED : return true; // Connection refused. 394*12720SWyllys.Ingersoll@Sun.COM case ECONNRESET : return true; // Connection reset. 395*12720SWyllys.Ingersoll@Sun.COM case EHOSTUNREACH : return true; // Host is unreachable. 396*12720SWyllys.Ingersoll@Sun.COM case ENETDOWN : return true; // Network is down. 397*12720SWyllys.Ingersoll@Sun.COM case ENETRESET : return true; // Connection aborted by network. 398*12720SWyllys.Ingersoll@Sun.COM case ENETUNREACH : return true; // Network unreachable. 399*12720SWyllys.Ingersoll@Sun.COM case ENOPROTOOPT : return true; // Protocol not available. 400*12720SWyllys.Ingersoll@Sun.COM #ifndef METAWARE 401*12720SWyllys.Ingersoll@Sun.COM case ETIME : return true; // Stream ioctl() timeout. 402*12720SWyllys.Ingersoll@Sun.COM #endif 403*12720SWyllys.Ingersoll@Sun.COM case ETIMEDOUT : return true; // Connection timed out. 404*12720SWyllys.Ingersoll@Sun.COM } 405*12720SWyllys.Ingersoll@Sun.COM #endif 406*12720SWyllys.Ingersoll@Sun.COM // at this point we conclude its a client side issue 407*12720SWyllys.Ingersoll@Sun.COM return false; 408*12720SWyllys.Ingersoll@Sun.COM } 409*12720SWyllys.Ingersoll@Sun.COM 410*12720SWyllys.Ingersoll@Sun.COM /*--------------------------------------------------------------------------- 411*12720SWyllys.Ingersoll@Sun.COM * Function: KMSClient_GetLastErrorMessage 412*12720SWyllys.Ingersoll@Sun.COM * 413*12720SWyllys.Ingersoll@Sun.COM *--------------------------------------------------------------------------*/ 414*12720SWyllys.Ingersoll@Sun.COM 415*12720SWyllys.Ingersoll@Sun.COM // extern "C" 416*12720SWyllys.Ingersoll@Sun.COM utf8char * KMSClient_GetLastErrorMessage(KMSClientProfile *i_pProfile) 417*12720SWyllys.Ingersoll@Sun.COM { 418*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT(i_pProfile); 419*12720SWyllys.Ingersoll@Sun.COM 420*12720SWyllys.Ingersoll@Sun.COM CAutoMutex oAutoMutex( 0 ); 421*12720SWyllys.Ingersoll@Sun.COM if ( i_pProfile->m_pLock ) 422*12720SWyllys.Ingersoll@Sun.COM { 423*12720SWyllys.Ingersoll@Sun.COM oAutoMutex.Lock( (K_MUTEX_HANDLE)i_pProfile->m_pLock ); 424*12720SWyllys.Ingersoll@Sun.COM } 425*12720SWyllys.Ingersoll@Sun.COM 426*12720SWyllys.Ingersoll@Sun.COM return i_pProfile->m_wsErrorString; 427*12720SWyllys.Ingersoll@Sun.COM } 428*12720SWyllys.Ingersoll@Sun.COM 429*12720SWyllys.Ingersoll@Sun.COM 430*12720SWyllys.Ingersoll@Sun.COM /*--------------------------------------------------------------------------- 431*12720SWyllys.Ingersoll@Sun.COM * Function: KMSClient_RetrieveEntityCertificate 432*12720SWyllys.Ingersoll@Sun.COM * Get the Root CA Certificate and store it into the profile 433*12720SWyllys.Ingersoll@Sun.COM *--------------------------------------------------------------------------*/ 434*12720SWyllys.Ingersoll@Sun.COM static bool KMSClient_RetrieveEntityCertificate( 435*12720SWyllys.Ingersoll@Sun.COM KMSClientProfile* i_pProfile, 436*12720SWyllys.Ingersoll@Sun.COM utf8cstr i_wsEntityID, 437*12720SWyllys.Ingersoll@Sun.COM utf8cstr i_wsPassphrase, 438*12720SWyllys.Ingersoll@Sun.COM char* const o_sHexHashedPassphrase ) 439*12720SWyllys.Ingersoll@Sun.COM { 440*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( i_pProfile && i_wsEntityID && i_wsPassphrase ); 441*12720SWyllys.Ingersoll@Sun.COM 442*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 443*12720SWyllys.Ingersoll@Sun.COM log_printf("KMSClient_RetrieveEntityCertificate : entered"); 444*12720SWyllys.Ingersoll@Sun.COM #endif 445*12720SWyllys.Ingersoll@Sun.COM 446*12720SWyllys.Ingersoll@Sun.COM CAutoMutex oAutoMutex( (K_MUTEX_HANDLE)i_pProfile->m_pLock ); 447*12720SWyllys.Ingersoll@Sun.COM char sSoapFaultMsg[g_iMAX_SOAP_FAULT_MESSAGE_LENGTH]; 448*12720SWyllys.Ingersoll@Sun.COM char sKmaAddress[g_iMAX_PEER_NETWORK_ADDRESS_LENGTH]; 449*12720SWyllys.Ingersoll@Sun.COM 450*12720SWyllys.Ingersoll@Sun.COM strcpy(o_sHexHashedPassphrase, ""); 451*12720SWyllys.Ingersoll@Sun.COM 452*12720SWyllys.Ingersoll@Sun.COM bool bSuccess = true; 453*12720SWyllys.Ingersoll@Sun.COM bool bTryFailOver = false; 454*12720SWyllys.Ingersoll@Sun.COM 455*12720SWyllys.Ingersoll@Sun.COM struct soap *pstCASoap; 456*12720SWyllys.Ingersoll@Sun.COM pstCASoap = (struct soap *) malloc( sizeof(struct soap) ); 457*12720SWyllys.Ingersoll@Sun.COM if(pstCASoap == NULL) 458*12720SWyllys.Ingersoll@Sun.COM { 459*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 460*12720SWyllys.Ingersoll@Sun.COM log_printf("Malloc %x pstCASoap returned null\n", sizeof(struct soap)); 461*12720SWyllys.Ingersoll@Sun.COM #endif 462*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile, 463*12720SWyllys.Ingersoll@Sun.COM LoadProfile_AUDIT_CLIENT_GET_ROOT_CA_CERTIFICATE_SOAP_ERROR, 464*12720SWyllys.Ingersoll@Sun.COM NULL, 465*12720SWyllys.Ingersoll@Sun.COM NULL, 466*12720SWyllys.Ingersoll@Sun.COM "malloc failure for pstCASoap" ); 467*12720SWyllys.Ingersoll@Sun.COM return false; 468*12720SWyllys.Ingersoll@Sun.COM } 469*12720SWyllys.Ingersoll@Sun.COM 470*12720SWyllys.Ingersoll@Sun.COM // initialize the SOAP connection that will get the RootCA 471*12720SWyllys.Ingersoll@Sun.COM soap_init2( pstCASoap, (SOAP_XML_STRICT | SOAP_C_UTFSTRING), (SOAP_XML_STRICT | SOAP_C_UTFSTRING) ); 472*12720SWyllys.Ingersoll@Sun.COM 473*12720SWyllys.Ingersoll@Sun.COM #ifdef METAWARE 474*12720SWyllys.Ingersoll@Sun.COM K_SetupCallbacks ( pstCASoap ); 475*12720SWyllys.Ingersoll@Sun.COM #endif 476*12720SWyllys.Ingersoll@Sun.COM 477*12720SWyllys.Ingersoll@Sun.COM CCertificate* pRootCACertificate = 0; 478*12720SWyllys.Ingersoll@Sun.COM CCertificate* pEntityCertificate = 0; 479*12720SWyllys.Ingersoll@Sun.COM CPrivateKey* pEntityPrivateKey = 0; 480*12720SWyllys.Ingersoll@Sun.COM 481*12720SWyllys.Ingersoll@Sun.COM soap_set_namespaces( pstCASoap, KMS_CA_namespaces ); 482*12720SWyllys.Ingersoll@Sun.COM 483*12720SWyllys.Ingersoll@Sun.COM pstCASoap->connect_timeout = i_pProfile->m_iTransactionTimeout; 484*12720SWyllys.Ingersoll@Sun.COM pstCASoap->send_timeout = i_pProfile->m_iTransactionTimeout; 485*12720SWyllys.Ingersoll@Sun.COM pstCASoap->recv_timeout = i_pProfile->m_iTransactionTimeout; 486*12720SWyllys.Ingersoll@Sun.COM 487*12720SWyllys.Ingersoll@Sun.COM struct soap *pstCertificateSoap; 488*12720SWyllys.Ingersoll@Sun.COM 489*12720SWyllys.Ingersoll@Sun.COM pstCertificateSoap = (struct soap *) malloc( sizeof(struct soap) ); 490*12720SWyllys.Ingersoll@Sun.COM 491*12720SWyllys.Ingersoll@Sun.COM if(pstCertificateSoap == NULL) 492*12720SWyllys.Ingersoll@Sun.COM { 493*12720SWyllys.Ingersoll@Sun.COM #if defined(METAWARE) 494*12720SWyllys.Ingersoll@Sun.COM log_printf("Malloc %x pstCertificateSoap returned null\n", 495*12720SWyllys.Ingersoll@Sun.COM sizeof(struct soap)); 496*12720SWyllys.Ingersoll@Sun.COM #endif 497*12720SWyllys.Ingersoll@Sun.COM soap_free( pstCASoap ); 498*12720SWyllys.Ingersoll@Sun.COM free(pstCASoap); 499*12720SWyllys.Ingersoll@Sun.COM return false; 500*12720SWyllys.Ingersoll@Sun.COM } 501*12720SWyllys.Ingersoll@Sun.COM 502*12720SWyllys.Ingersoll@Sun.COM // initialize the SOAP connection that will get the Certificate 503*12720SWyllys.Ingersoll@Sun.COM soap_init2( pstCertificateSoap, (SOAP_XML_STRICT | SOAP_C_UTFSTRING), (SOAP_XML_STRICT | SOAP_C_UTFSTRING) ); 504*12720SWyllys.Ingersoll@Sun.COM 505*12720SWyllys.Ingersoll@Sun.COM #ifdef METAWARE 506*12720SWyllys.Ingersoll@Sun.COM K_SetupCallbacks ( pstCertificateSoap ); 507*12720SWyllys.Ingersoll@Sun.COM #endif 508*12720SWyllys.Ingersoll@Sun.COM 509*12720SWyllys.Ingersoll@Sun.COM soap_set_namespaces( pstCertificateSoap, KMS_Certificate_namespaces ); 510*12720SWyllys.Ingersoll@Sun.COM 511*12720SWyllys.Ingersoll@Sun.COM pstCertificateSoap->connect_timeout = i_pProfile->m_iTransactionTimeout; 512*12720SWyllys.Ingersoll@Sun.COM pstCertificateSoap->send_timeout = i_pProfile->m_iTransactionTimeout; 513*12720SWyllys.Ingersoll@Sun.COM pstCertificateSoap->recv_timeout = i_pProfile->m_iTransactionTimeout; 514*12720SWyllys.Ingersoll@Sun.COM 515*12720SWyllys.Ingersoll@Sun.COM CAgentLoadBalancer oLoadBalancer(i_pProfile); 516*12720SWyllys.Ingersoll@Sun.COM int iIndex = oLoadBalancer.Balance(); 517*12720SWyllys.Ingersoll@Sun.COM 518*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 519*12720SWyllys.Ingersoll@Sun.COM log_printf("KMSClient_RetrieveEntityCertificate : call KMS_CA__RetrieveRootCACertificate"); 520*12720SWyllys.Ingersoll@Sun.COM #endif 521*12720SWyllys.Ingersoll@Sun.COM 522*12720SWyllys.Ingersoll@Sun.COM // get the server's URL that will provide SOAP services 523*12720SWyllys.Ingersoll@Sun.COM do 524*12720SWyllys.Ingersoll@Sun.COM { 525*12720SWyllys.Ingersoll@Sun.COM bSuccess = true; 526*12720SWyllys.Ingersoll@Sun.COM bTryFailOver = false; 527*12720SWyllys.Ingersoll@Sun.COM bool bFailedOnRetrieveRootCA = false; 528*12720SWyllys.Ingersoll@Sun.COM const char* sURL = 0; 529*12720SWyllys.Ingersoll@Sun.COM 530*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 531*12720SWyllys.Ingersoll@Sun.COM { 532*12720SWyllys.Ingersoll@Sun.COM sURL = oLoadBalancer.GetHTTPURL(iIndex, 533*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_iPortForCAService); 534*12720SWyllys.Ingersoll@Sun.COM 535*12720SWyllys.Ingersoll@Sun.COM if ( !sURL ) 536*12720SWyllys.Ingersoll@Sun.COM { 537*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 538*12720SWyllys.Ingersoll@Sun.COM } 539*12720SWyllys.Ingersoll@Sun.COM } 540*12720SWyllys.Ingersoll@Sun.COM 541*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 542*12720SWyllys.Ingersoll@Sun.COM { 543*12720SWyllys.Ingersoll@Sun.COM strncpy(i_pProfile->m_sURL, sURL, KMS_MAX_URL); 544*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_sURL[KMS_MAX_URL] = 0; 545*12720SWyllys.Ingersoll@Sun.COM } 546*12720SWyllys.Ingersoll@Sun.COM 547*12720SWyllys.Ingersoll@Sun.COM 548*12720SWyllys.Ingersoll@Sun.COM // SOAP CALL - retrieve Root CA Certificate from the Server 549*12720SWyllys.Ingersoll@Sun.COM struct KMS_CA:: 550*12720SWyllys.Ingersoll@Sun.COM KMS_CA__RetrieveRootCACertificateResponse stRootCACertificateResponse; 551*12720SWyllys.Ingersoll@Sun.COM 552*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 553*12720SWyllys.Ingersoll@Sun.COM { 554*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 555*12720SWyllys.Ingersoll@Sun.COM log_printf("KMSClient_RetrieveCertificate : call KMS_CA__RetrieveRootCACertificate again"); 556*12720SWyllys.Ingersoll@Sun.COM #endif 557*12720SWyllys.Ingersoll@Sun.COM bSuccess = 558*12720SWyllys.Ingersoll@Sun.COM KMS_CA::soap_call_KMS_CA__RetrieveRootCACertificate( 559*12720SWyllys.Ingersoll@Sun.COM pstCASoap, 560*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_sURL, 561*12720SWyllys.Ingersoll@Sun.COM NULL, 562*12720SWyllys.Ingersoll@Sun.COM i_wsEntityID, 563*12720SWyllys.Ingersoll@Sun.COM stRootCACertificateResponse ) == SOAP_OK; 564*12720SWyllys.Ingersoll@Sun.COM 565*12720SWyllys.Ingersoll@Sun.COM if ( !bSuccess ) 566*12720SWyllys.Ingersoll@Sun.COM { 567*12720SWyllys.Ingersoll@Sun.COM GetSoapFault(sSoapFaultMsg, (struct soap*)pstCASoap); 568*12720SWyllys.Ingersoll@Sun.COM GetPeerNetworkAddress(sKmaAddress, pstCASoap); 569*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile, 570*12720SWyllys.Ingersoll@Sun.COM LoadProfile_AUDIT_CLIENT_GET_ROOT_CA_CERTIFICATE_SOAP_ERROR, 571*12720SWyllys.Ingersoll@Sun.COM NULL, 572*12720SWyllys.Ingersoll@Sun.COM sKmaAddress, 573*12720SWyllys.Ingersoll@Sun.COM sSoapFaultMsg ); 574*12720SWyllys.Ingersoll@Sun.COM 575*12720SWyllys.Ingersoll@Sun.COM bTryFailOver = ServerError(GET_SOAP_FAULTSTRING(pstCASoap), pstCASoap->errnum); 576*12720SWyllys.Ingersoll@Sun.COM bFailedOnRetrieveRootCA = true; 577*12720SWyllys.Ingersoll@Sun.COM } 578*12720SWyllys.Ingersoll@Sun.COM } 579*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 580*12720SWyllys.Ingersoll@Sun.COM else 581*12720SWyllys.Ingersoll@Sun.COM { 582*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 1\n"); 583*12720SWyllys.Ingersoll@Sun.COM } 584*12720SWyllys.Ingersoll@Sun.COM #endif 585*12720SWyllys.Ingersoll@Sun.COM 586*12720SWyllys.Ingersoll@Sun.COM 587*12720SWyllys.Ingersoll@Sun.COM // Validate the SOAP response 588*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 589*12720SWyllys.Ingersoll@Sun.COM { 590*12720SWyllys.Ingersoll@Sun.COM if ( stRootCACertificateResponse.RootCACertificate.__size < 1 || 591*12720SWyllys.Ingersoll@Sun.COM stRootCACertificateResponse.RootCACertificate.__ptr == NULL || 592*12720SWyllys.Ingersoll@Sun.COM stRootCACertificateResponse.AuthenticationHashIterationCount < 593*12720SWyllys.Ingersoll@Sun.COM MIN_AUTHENTICATION_ITERATION_COUNT || 594*12720SWyllys.Ingersoll@Sun.COM stRootCACertificateResponse.AuthenticationHashIterationCount > 595*12720SWyllys.Ingersoll@Sun.COM MAX_AUTHENTICATION_ITERATION_COUNT || 596*12720SWyllys.Ingersoll@Sun.COM stRootCACertificateResponse.ClientAuthenticationChallenge.__size != 597*12720SWyllys.Ingersoll@Sun.COM AUTHENTICATION_CHALLENGE_LENGTH || 598*12720SWyllys.Ingersoll@Sun.COM stRootCACertificateResponse.ClientAuthenticationChallenge.__ptr == NULL ) 599*12720SWyllys.Ingersoll@Sun.COM { 600*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 601*12720SWyllys.Ingersoll@Sun.COM 602*12720SWyllys.Ingersoll@Sun.COM GetPeerNetworkAddress(sKmaAddress, pstCASoap); 603*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile, 604*12720SWyllys.Ingersoll@Sun.COM AUDIT_CLIENT_GET_ROOT_CA_CERTIFICATE_INVALID_RESPONSE_FORMAT, 605*12720SWyllys.Ingersoll@Sun.COM NULL, 606*12720SWyllys.Ingersoll@Sun.COM sKmaAddress, 607*12720SWyllys.Ingersoll@Sun.COM NULL); 608*12720SWyllys.Ingersoll@Sun.COM } 609*12720SWyllys.Ingersoll@Sun.COM else 610*12720SWyllys.Ingersoll@Sun.COM { 611*12720SWyllys.Ingersoll@Sun.COM GetPeerNetworkAddress(sKmaAddress, pstCASoap); 612*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_GET_ROOT_CA_CERTIFICATE_SUCCESS, 613*12720SWyllys.Ingersoll@Sun.COM NULL, 614*12720SWyllys.Ingersoll@Sun.COM sKmaAddress, 615*12720SWyllys.Ingersoll@Sun.COM NULL); 616*12720SWyllys.Ingersoll@Sun.COM } 617*12720SWyllys.Ingersoll@Sun.COM 618*12720SWyllys.Ingersoll@Sun.COM } 619*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 620*12720SWyllys.Ingersoll@Sun.COM else 621*12720SWyllys.Ingersoll@Sun.COM { 622*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 2\n"); 623*12720SWyllys.Ingersoll@Sun.COM } 624*12720SWyllys.Ingersoll@Sun.COM #endif 625*12720SWyllys.Ingersoll@Sun.COM 626*12720SWyllys.Ingersoll@Sun.COM // build our RootCACertificate object 627*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 628*12720SWyllys.Ingersoll@Sun.COM { 629*12720SWyllys.Ingersoll@Sun.COM pRootCACertificate = new CCertificate; 630*12720SWyllys.Ingersoll@Sun.COM 631*12720SWyllys.Ingersoll@Sun.COM // make sure the new was successful 632*12720SWyllys.Ingersoll@Sun.COM bSuccess = ( pRootCACertificate != 0 ); 633*12720SWyllys.Ingersoll@Sun.COM } 634*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 635*12720SWyllys.Ingersoll@Sun.COM else 636*12720SWyllys.Ingersoll@Sun.COM { 637*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 3\n"); 638*12720SWyllys.Ingersoll@Sun.COM } 639*12720SWyllys.Ingersoll@Sun.COM #endif 640*12720SWyllys.Ingersoll@Sun.COM 641*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 642*12720SWyllys.Ingersoll@Sun.COM { 643*12720SWyllys.Ingersoll@Sun.COM // OVERLOADED Load method - 3 parameters means 644*12720SWyllys.Ingersoll@Sun.COM // recall from BUFFER 645*12720SWyllys.Ingersoll@Sun.COM bSuccess = 646*12720SWyllys.Ingersoll@Sun.COM pRootCACertificate->Load( 647*12720SWyllys.Ingersoll@Sun.COM stRootCACertificateResponse.RootCACertificate.__ptr, // to here 648*12720SWyllys.Ingersoll@Sun.COM stRootCACertificateResponse.RootCACertificate.__size, // size 649*12720SWyllys.Ingersoll@Sun.COM PKI_FORMAT ); // ignored 650*12720SWyllys.Ingersoll@Sun.COM 651*12720SWyllys.Ingersoll@Sun.COM if( !bSuccess ) 652*12720SWyllys.Ingersoll@Sun.COM { 653*12720SWyllys.Ingersoll@Sun.COM GetPeerNetworkAddress(sKmaAddress, pstCASoap); 654*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile, 655*12720SWyllys.Ingersoll@Sun.COM AUDIT_CLIENT_GET_ROOT_CA_CERTIFICATE_INVALID_CA_CERTIFICATE_FORMAT, 656*12720SWyllys.Ingersoll@Sun.COM NULL, 657*12720SWyllys.Ingersoll@Sun.COM sKmaAddress, 658*12720SWyllys.Ingersoll@Sun.COM NULL); 659*12720SWyllys.Ingersoll@Sun.COM } 660*12720SWyllys.Ingersoll@Sun.COM 661*12720SWyllys.Ingersoll@Sun.COM } 662*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 663*12720SWyllys.Ingersoll@Sun.COM else 664*12720SWyllys.Ingersoll@Sun.COM { 665*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 4\n"); 666*12720SWyllys.Ingersoll@Sun.COM } 667*12720SWyllys.Ingersoll@Sun.COM #endif 668*12720SWyllys.Ingersoll@Sun.COM 669*12720SWyllys.Ingersoll@Sun.COM 670*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 671*12720SWyllys.Ingersoll@Sun.COM { 672*12720SWyllys.Ingersoll@Sun.COM // save the built CACertificate object to a FILE (i_pProfile gets the 673*12720SWyllys.Ingersoll@Sun.COM // persistent handle to that file) 674*12720SWyllys.Ingersoll@Sun.COM bSuccess = StoreCACertificate( i_pProfile, pRootCACertificate ); 675*12720SWyllys.Ingersoll@Sun.COM 676*12720SWyllys.Ingersoll@Sun.COM if ( !bSuccess ) 677*12720SWyllys.Ingersoll@Sun.COM { 678*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile,AUDIT_CLIENT_GET_CERTIFICATE_SAVE_CA_CERTIFICATE_FAILED, 679*12720SWyllys.Ingersoll@Sun.COM NULL, 680*12720SWyllys.Ingersoll@Sun.COM NULL, 681*12720SWyllys.Ingersoll@Sun.COM NULL); 682*12720SWyllys.Ingersoll@Sun.COM } 683*12720SWyllys.Ingersoll@Sun.COM } 684*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 685*12720SWyllys.Ingersoll@Sun.COM else 686*12720SWyllys.Ingersoll@Sun.COM { 687*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 5\n"); 688*12720SWyllys.Ingersoll@Sun.COM } 689*12720SWyllys.Ingersoll@Sun.COM #endif 690*12720SWyllys.Ingersoll@Sun.COM 691*12720SWyllys.Ingersoll@Sun.COM //------------------------------- 692*12720SWyllys.Ingersoll@Sun.COM // Initialize SSL - use SERVER AUTH 693*12720SWyllys.Ingersoll@Sun.COM //------------------------------- 694*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 695*12720SWyllys.Ingersoll@Sun.COM { 696*12720SWyllys.Ingersoll@Sun.COM // SERVER_AUTHENTICATION needs just the pstCertificateSoap 697*12720SWyllys.Ingersoll@Sun.COM bSuccess = 698*12720SWyllys.Ingersoll@Sun.COM K_soap_ssl_client_context( 699*12720SWyllys.Ingersoll@Sun.COM i_pProfile, // in ->m_wsProfileName,->m_sHexHashedPassphrase 700*12720SWyllys.Ingersoll@Sun.COM pstCertificateSoap, // in - soap structure 701*12720SWyllys.Ingersoll@Sun.COM SOAP_SSL_REQUIRE_SERVER_AUTHENTICATION // in - flags 702*12720SWyllys.Ingersoll@Sun.COM ) == SOAP_OK; 703*12720SWyllys.Ingersoll@Sun.COM 704*12720SWyllys.Ingersoll@Sun.COM if ( !bSuccess ) 705*12720SWyllys.Ingersoll@Sun.COM { 706*12720SWyllys.Ingersoll@Sun.COM GetSoapFault(sSoapFaultMsg, (struct soap*)pstCertificateSoap); 707*12720SWyllys.Ingersoll@Sun.COM GetPeerNetworkAddress(sKmaAddress, pstCertificateSoap); 708*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile,AUDIT_CLIENT_GET_CERTIFICATE_SOAP_ERROR, 709*12720SWyllys.Ingersoll@Sun.COM NULL, 710*12720SWyllys.Ingersoll@Sun.COM sKmaAddress, 711*12720SWyllys.Ingersoll@Sun.COM sSoapFaultMsg ); 712*12720SWyllys.Ingersoll@Sun.COM } 713*12720SWyllys.Ingersoll@Sun.COM } 714*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 715*12720SWyllys.Ingersoll@Sun.COM else 716*12720SWyllys.Ingersoll@Sun.COM { 717*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 6\n"); 718*12720SWyllys.Ingersoll@Sun.COM } 719*12720SWyllys.Ingersoll@Sun.COM #endif 720*12720SWyllys.Ingersoll@Sun.COM 721*12720SWyllys.Ingersoll@Sun.COM // hash the passphrase passed in 722*12720SWyllys.Ingersoll@Sun.COM char sHexAuthenticationSecret[2*HASH_LENGTH+1]; 723*12720SWyllys.Ingersoll@Sun.COM 724*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 725*12720SWyllys.Ingersoll@Sun.COM { 726*12720SWyllys.Ingersoll@Sun.COM bSuccess = ComputeFixedEntityHashedPassphraseAndAuthenticationSecret( 727*12720SWyllys.Ingersoll@Sun.COM i_wsPassphrase, 728*12720SWyllys.Ingersoll@Sun.COM o_sHexHashedPassphrase, 729*12720SWyllys.Ingersoll@Sun.COM stRootCACertificateResponse.AuthenticationHashIterationCount, 730*12720SWyllys.Ingersoll@Sun.COM sHexAuthenticationSecret ); 731*12720SWyllys.Ingersoll@Sun.COM 732*12720SWyllys.Ingersoll@Sun.COM if ( !bSuccess ) 733*12720SWyllys.Ingersoll@Sun.COM { 734*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile,AUDIT_CLIENT_COMPUTE_FIXED_FAILED, 735*12720SWyllys.Ingersoll@Sun.COM NULL, 736*12720SWyllys.Ingersoll@Sun.COM NULL, 737*12720SWyllys.Ingersoll@Sun.COM NULL); 738*12720SWyllys.Ingersoll@Sun.COM } 739*12720SWyllys.Ingersoll@Sun.COM } 740*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 741*12720SWyllys.Ingersoll@Sun.COM else 742*12720SWyllys.Ingersoll@Sun.COM { 743*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 7\n"); 744*12720SWyllys.Ingersoll@Sun.COM } 745*12720SWyllys.Ingersoll@Sun.COM #endif 746*12720SWyllys.Ingersoll@Sun.COM 747*12720SWyllys.Ingersoll@Sun.COM // copy received Root CA into buffer for input 748*12720SWyllys.Ingersoll@Sun.COM // into challenge-response computation 749*12720SWyllys.Ingersoll@Sun.COM unsigned char aRootCACertificate[MAX_CERT_SIZE]; 750*12720SWyllys.Ingersoll@Sun.COM int iRootCACertificateLength; 751*12720SWyllys.Ingersoll@Sun.COM 752*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 753*12720SWyllys.Ingersoll@Sun.COM { 754*12720SWyllys.Ingersoll@Sun.COM // OVERLOADED save method - save iRootCACertificateLength to aRootCACertificate 755*12720SWyllys.Ingersoll@Sun.COM // buffer 756*12720SWyllys.Ingersoll@Sun.COM bSuccess = pRootCACertificate->Save( 757*12720SWyllys.Ingersoll@Sun.COM aRootCACertificate, 758*12720SWyllys.Ingersoll@Sun.COM MAX_CERT_SIZE, 759*12720SWyllys.Ingersoll@Sun.COM &iRootCACertificateLength, 760*12720SWyllys.Ingersoll@Sun.COM PKI_FORMAT ); 761*12720SWyllys.Ingersoll@Sun.COM 762*12720SWyllys.Ingersoll@Sun.COM if ( !bSuccess ) 763*12720SWyllys.Ingersoll@Sun.COM { 764*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile,AUDIT_CLIENT_SAVE_ROOTCA_FAILED, 765*12720SWyllys.Ingersoll@Sun.COM NULL, 766*12720SWyllys.Ingersoll@Sun.COM NULL, 767*12720SWyllys.Ingersoll@Sun.COM NULL); 768*12720SWyllys.Ingersoll@Sun.COM } 769*12720SWyllys.Ingersoll@Sun.COM } 770*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 771*12720SWyllys.Ingersoll@Sun.COM else 772*12720SWyllys.Ingersoll@Sun.COM { 773*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 8\n"); 774*12720SWyllys.Ingersoll@Sun.COM } 775*12720SWyllys.Ingersoll@Sun.COM #endif 776*12720SWyllys.Ingersoll@Sun.COM 777*12720SWyllys.Ingersoll@Sun.COM // respond to server's challenge 778*12720SWyllys.Ingersoll@Sun.COM unsigned char aAuthenticationSecret[AUTHENTICATION_SECRET_LENGTH]; 779*12720SWyllys.Ingersoll@Sun.COM unsigned char 780*12720SWyllys.Ingersoll@Sun.COM aClientAuthenticationChallengeResponse[AUTHENTICATION_RESPONSE_LENGTH]; 781*12720SWyllys.Ingersoll@Sun.COM 782*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 783*12720SWyllys.Ingersoll@Sun.COM { 784*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( AUTHENTICATION_SECRET_LENGTH == 785*12720SWyllys.Ingersoll@Sun.COM ConvertUTF8HexStringToBinary( 786*12720SWyllys.Ingersoll@Sun.COM sHexAuthenticationSecret, NULL ) ); 787*12720SWyllys.Ingersoll@Sun.COM 788*12720SWyllys.Ingersoll@Sun.COM ConvertUTF8HexStringToBinary( 789*12720SWyllys.Ingersoll@Sun.COM sHexAuthenticationSecret, aAuthenticationSecret ); 790*12720SWyllys.Ingersoll@Sun.COM 791*12720SWyllys.Ingersoll@Sun.COM // client authentication response 792*12720SWyllys.Ingersoll@Sun.COM bSuccess = ComputeChallengeResponse( 793*12720SWyllys.Ingersoll@Sun.COM aAuthenticationSecret, 794*12720SWyllys.Ingersoll@Sun.COM AUTHENTICATION_SECRET_LENGTH, 795*12720SWyllys.Ingersoll@Sun.COM aRootCACertificate, 796*12720SWyllys.Ingersoll@Sun.COM iRootCACertificateLength, 797*12720SWyllys.Ingersoll@Sun.COM stRootCACertificateResponse.ClientAuthenticationChallenge.__ptr, 798*12720SWyllys.Ingersoll@Sun.COM AUTHENTICATION_CHALLENGE_LENGTH, 799*12720SWyllys.Ingersoll@Sun.COM aClientAuthenticationChallengeResponse, 800*12720SWyllys.Ingersoll@Sun.COM AUTHENTICATION_RESPONSE_LENGTH ); 801*12720SWyllys.Ingersoll@Sun.COM 802*12720SWyllys.Ingersoll@Sun.COM if ( !bSuccess ) 803*12720SWyllys.Ingersoll@Sun.COM { 804*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile,AUDIT_CLIENT_COMPUTE_CHALLENGE_RESPONSE_FAILED, 805*12720SWyllys.Ingersoll@Sun.COM NULL, 806*12720SWyllys.Ingersoll@Sun.COM NULL, 807*12720SWyllys.Ingersoll@Sun.COM NULL); 808*12720SWyllys.Ingersoll@Sun.COM } 809*12720SWyllys.Ingersoll@Sun.COM } 810*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 811*12720SWyllys.Ingersoll@Sun.COM else 812*12720SWyllys.Ingersoll@Sun.COM { 813*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 9\n"); 814*12720SWyllys.Ingersoll@Sun.COM } 815*12720SWyllys.Ingersoll@Sun.COM #endif 816*12720SWyllys.Ingersoll@Sun.COM 817*12720SWyllys.Ingersoll@Sun.COM struct KMS_Certificate::xsd__hexBinary stClientAuthenticationResponse; 818*12720SWyllys.Ingersoll@Sun.COM 819*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 820*12720SWyllys.Ingersoll@Sun.COM { 821*12720SWyllys.Ingersoll@Sun.COM stClientAuthenticationResponse.__size = 822*12720SWyllys.Ingersoll@Sun.COM AUTHENTICATION_RESPONSE_LENGTH; 823*12720SWyllys.Ingersoll@Sun.COM stClientAuthenticationResponse.__ptr = 824*12720SWyllys.Ingersoll@Sun.COM (unsigned char*)soap_malloc( 825*12720SWyllys.Ingersoll@Sun.COM pstCertificateSoap, AUTHENTICATION_RESPONSE_LENGTH ); 826*12720SWyllys.Ingersoll@Sun.COM 827*12720SWyllys.Ingersoll@Sun.COM if ( stClientAuthenticationResponse.__ptr != NULL ) 828*12720SWyllys.Ingersoll@Sun.COM { 829*12720SWyllys.Ingersoll@Sun.COM memcpy( stClientAuthenticationResponse.__ptr, 830*12720SWyllys.Ingersoll@Sun.COM aClientAuthenticationChallengeResponse, 831*12720SWyllys.Ingersoll@Sun.COM AUTHENTICATION_RESPONSE_LENGTH ); 832*12720SWyllys.Ingersoll@Sun.COM } 833*12720SWyllys.Ingersoll@Sun.COM else 834*12720SWyllys.Ingersoll@Sun.COM { 835*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 836*12720SWyllys.Ingersoll@Sun.COM } 837*12720SWyllys.Ingersoll@Sun.COM } 838*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 839*12720SWyllys.Ingersoll@Sun.COM else 840*12720SWyllys.Ingersoll@Sun.COM { 841*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 10\n"); 842*12720SWyllys.Ingersoll@Sun.COM } 843*12720SWyllys.Ingersoll@Sun.COM #endif 844*12720SWyllys.Ingersoll@Sun.COM 845*12720SWyllys.Ingersoll@Sun.COM // generate challenge nonce 846*12720SWyllys.Ingersoll@Sun.COM struct KMS_Certificate::xsd__hexBinary stServerAuthenticationChallenge; 847*12720SWyllys.Ingersoll@Sun.COM 848*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 849*12720SWyllys.Ingersoll@Sun.COM { 850*12720SWyllys.Ingersoll@Sun.COM stServerAuthenticationChallenge.__size = 851*12720SWyllys.Ingersoll@Sun.COM AUTHENTICATION_CHALLENGE_LENGTH; 852*12720SWyllys.Ingersoll@Sun.COM stServerAuthenticationChallenge.__ptr = 853*12720SWyllys.Ingersoll@Sun.COM (unsigned char*)soap_malloc( pstCertificateSoap, 854*12720SWyllys.Ingersoll@Sun.COM AUTHENTICATION_CHALLENGE_LENGTH ); 855*12720SWyllys.Ingersoll@Sun.COM 856*12720SWyllys.Ingersoll@Sun.COM bSuccess = ( stServerAuthenticationChallenge.__ptr != NULL ); 857*12720SWyllys.Ingersoll@Sun.COM } 858*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 859*12720SWyllys.Ingersoll@Sun.COM else 860*12720SWyllys.Ingersoll@Sun.COM { 861*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 11\n"); 862*12720SWyllys.Ingersoll@Sun.COM } 863*12720SWyllys.Ingersoll@Sun.COM #endif 864*12720SWyllys.Ingersoll@Sun.COM 865*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 866*12720SWyllys.Ingersoll@Sun.COM { 867*12720SWyllys.Ingersoll@Sun.COM bSuccess = GetPseudorandomBytes( 868*12720SWyllys.Ingersoll@Sun.COM AUTHENTICATION_CHALLENGE_LENGTH, 869*12720SWyllys.Ingersoll@Sun.COM stServerAuthenticationChallenge.__ptr ); 870*12720SWyllys.Ingersoll@Sun.COM } 871*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 872*12720SWyllys.Ingersoll@Sun.COM else 873*12720SWyllys.Ingersoll@Sun.COM { 874*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 12\n"); 875*12720SWyllys.Ingersoll@Sun.COM } 876*12720SWyllys.Ingersoll@Sun.COM #endif 877*12720SWyllys.Ingersoll@Sun.COM 878*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 879*12720SWyllys.Ingersoll@Sun.COM { 880*12720SWyllys.Ingersoll@Sun.COM sURL = oLoadBalancer.GetHTTPSURL(iIndex, 881*12720SWyllys.Ingersoll@Sun.COM i_pProfile-> 882*12720SWyllys.Ingersoll@Sun.COM m_iPortForCertificateService); 883*12720SWyllys.Ingersoll@Sun.COM 884*12720SWyllys.Ingersoll@Sun.COM if ( !sURL ) 885*12720SWyllys.Ingersoll@Sun.COM { 886*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 887*12720SWyllys.Ingersoll@Sun.COM } 888*12720SWyllys.Ingersoll@Sun.COM } 889*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 890*12720SWyllys.Ingersoll@Sun.COM else 891*12720SWyllys.Ingersoll@Sun.COM { 892*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 13\n"); 893*12720SWyllys.Ingersoll@Sun.COM } 894*12720SWyllys.Ingersoll@Sun.COM #endif 895*12720SWyllys.Ingersoll@Sun.COM 896*12720SWyllys.Ingersoll@Sun.COM // Verify that the same URL is used for Root CA Certificate 897*12720SWyllys.Ingersoll@Sun.COM // retrieval as for Entity Certificate retrieval 898*12720SWyllys.Ingersoll@Sun.COM 899*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 900*12720SWyllys.Ingersoll@Sun.COM { 901*12720SWyllys.Ingersoll@Sun.COM char sTempCAURL[KMS_MAX_URL + 1]; 902*12720SWyllys.Ingersoll@Sun.COM strncpy( sTempCAURL, i_pProfile->m_sURL, KMS_MAX_URL ); 903*12720SWyllys.Ingersoll@Sun.COM sTempCAURL[KMS_MAX_URL] = 0; 904*12720SWyllys.Ingersoll@Sun.COM 905*12720SWyllys.Ingersoll@Sun.COM char * sRetrieveRootCACertificateURL = strtok( sTempCAURL, ":" ); 906*12720SWyllys.Ingersoll@Sun.COM 907*12720SWyllys.Ingersoll@Sun.COM sRetrieveRootCACertificateURL = strtok(NULL, ":"); 908*12720SWyllys.Ingersoll@Sun.COM 909*12720SWyllys.Ingersoll@Sun.COM char sTempAgentURL[KMS_MAX_URL + 1]; 910*12720SWyllys.Ingersoll@Sun.COM strncpy( sTempAgentURL, sURL, KMS_MAX_URL ); 911*12720SWyllys.Ingersoll@Sun.COM sTempAgentURL[KMS_MAX_URL] = 0; 912*12720SWyllys.Ingersoll@Sun.COM char * sRetrieveAgentCertificateURL = strtok( sTempAgentURL, ":" ); 913*12720SWyllys.Ingersoll@Sun.COM sRetrieveAgentCertificateURL = strtok(NULL, ":"); 914*12720SWyllys.Ingersoll@Sun.COM 915*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( strcmp( sRetrieveRootCACertificateURL, 916*12720SWyllys.Ingersoll@Sun.COM sRetrieveAgentCertificateURL ) == 0 ); 917*12720SWyllys.Ingersoll@Sun.COM 918*12720SWyllys.Ingersoll@Sun.COM strncpy(i_pProfile->m_sURL, sURL, KMS_MAX_URL); 919*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_sURL[KMS_MAX_URL] = 0; 920*12720SWyllys.Ingersoll@Sun.COM } 921*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 922*12720SWyllys.Ingersoll@Sun.COM else 923*12720SWyllys.Ingersoll@Sun.COM { 924*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 14\n"); 925*12720SWyllys.Ingersoll@Sun.COM } 926*12720SWyllys.Ingersoll@Sun.COM #endif 927*12720SWyllys.Ingersoll@Sun.COM 928*12720SWyllys.Ingersoll@Sun.COM KMS_Certificate::KMS_Certificate__RetrieveEntityCertificateResponse 929*12720SWyllys.Ingersoll@Sun.COM stRetrieveEntityCertificateResponse; 930*12720SWyllys.Ingersoll@Sun.COM 931*12720SWyllys.Ingersoll@Sun.COM // SOAP - retrieve ENTITY Certificate, passing the challenge response, 932*12720SWyllys.Ingersoll@Sun.COM // a challenge to the server and get back the server's response 933*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 934*12720SWyllys.Ingersoll@Sun.COM { 935*12720SWyllys.Ingersoll@Sun.COM bSuccess = 936*12720SWyllys.Ingersoll@Sun.COM KMS_Certificate::soap_call_KMS_Certificate__RetrieveEntityCertificate( 937*12720SWyllys.Ingersoll@Sun.COM pstCertificateSoap, 938*12720SWyllys.Ingersoll@Sun.COM sURL, 939*12720SWyllys.Ingersoll@Sun.COM NULL, 940*12720SWyllys.Ingersoll@Sun.COM (utf8cstr )i_wsEntityID, 941*12720SWyllys.Ingersoll@Sun.COM stClientAuthenticationResponse, 942*12720SWyllys.Ingersoll@Sun.COM stServerAuthenticationChallenge, 943*12720SWyllys.Ingersoll@Sun.COM stRetrieveEntityCertificateResponse ) == SOAP_OK; 944*12720SWyllys.Ingersoll@Sun.COM 945*12720SWyllys.Ingersoll@Sun.COM if( !bSuccess ) 946*12720SWyllys.Ingersoll@Sun.COM { 947*12720SWyllys.Ingersoll@Sun.COM GetSoapFault(sSoapFaultMsg, (struct soap*)pstCertificateSoap); 948*12720SWyllys.Ingersoll@Sun.COM GetPeerNetworkAddress(sKmaAddress, pstCertificateSoap); 949*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile,AUDIT_CLIENT_GET_CERTIFICATE_SOAP_ERROR, 950*12720SWyllys.Ingersoll@Sun.COM NULL, 951*12720SWyllys.Ingersoll@Sun.COM sKmaAddress, 952*12720SWyllys.Ingersoll@Sun.COM sSoapFaultMsg ); 953*12720SWyllys.Ingersoll@Sun.COM 954*12720SWyllys.Ingersoll@Sun.COM bTryFailOver = ServerError(GET_SOAP_FAULTSTRING(pstCertificateSoap), 955*12720SWyllys.Ingersoll@Sun.COM pstCertificateSoap->errnum); 956*12720SWyllys.Ingersoll@Sun.COM } 957*12720SWyllys.Ingersoll@Sun.COM } 958*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 959*12720SWyllys.Ingersoll@Sun.COM else 960*12720SWyllys.Ingersoll@Sun.COM { 961*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 15\n"); 962*12720SWyllys.Ingersoll@Sun.COM } 963*12720SWyllys.Ingersoll@Sun.COM #endif 964*12720SWyllys.Ingersoll@Sun.COM 965*12720SWyllys.Ingersoll@Sun.COM // Validate the response structure 966*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 967*12720SWyllys.Ingersoll@Sun.COM { 968*12720SWyllys.Ingersoll@Sun.COM if ( stRetrieveEntityCertificateResponse. 969*12720SWyllys.Ingersoll@Sun.COM ServerAuthenticationResponse.__ptr == NULL 970*12720SWyllys.Ingersoll@Sun.COM 971*12720SWyllys.Ingersoll@Sun.COM || stRetrieveEntityCertificateResponse. 972*12720SWyllys.Ingersoll@Sun.COM ServerAuthenticationResponse.__size != 973*12720SWyllys.Ingersoll@Sun.COM AUTHENTICATION_RESPONSE_LENGTH 974*12720SWyllys.Ingersoll@Sun.COM 975*12720SWyllys.Ingersoll@Sun.COM || stRetrieveEntityCertificateResponse.Certificate.__size < 1 976*12720SWyllys.Ingersoll@Sun.COM 977*12720SWyllys.Ingersoll@Sun.COM || stRetrieveEntityCertificateResponse.Certificate.__ptr == 0 978*12720SWyllys.Ingersoll@Sun.COM 979*12720SWyllys.Ingersoll@Sun.COM || stRetrieveEntityCertificateResponse. 980*12720SWyllys.Ingersoll@Sun.COM WrappedPrivateKeyMaterial.__size < 1 981*12720SWyllys.Ingersoll@Sun.COM 982*12720SWyllys.Ingersoll@Sun.COM || stRetrieveEntityCertificateResponse. 983*12720SWyllys.Ingersoll@Sun.COM WrappedPrivateKeyMaterial.__ptr == 0 ) 984*12720SWyllys.Ingersoll@Sun.COM { 985*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 986*12720SWyllys.Ingersoll@Sun.COM 987*12720SWyllys.Ingersoll@Sun.COM GetPeerNetworkAddress(sKmaAddress, pstCertificateSoap); 988*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile,AUDIT_CLIENT_GET_CERTIFICATE_INVALID_RESPONSE_FORMAT, 989*12720SWyllys.Ingersoll@Sun.COM NULL, 990*12720SWyllys.Ingersoll@Sun.COM sKmaAddress, 991*12720SWyllys.Ingersoll@Sun.COM NULL ); 992*12720SWyllys.Ingersoll@Sun.COM } 993*12720SWyllys.Ingersoll@Sun.COM else 994*12720SWyllys.Ingersoll@Sun.COM { 995*12720SWyllys.Ingersoll@Sun.COM GetPeerNetworkAddress(sKmaAddress, pstCertificateSoap); 996*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_GET_CERTIFICATE_SUCCESS, 997*12720SWyllys.Ingersoll@Sun.COM NULL, 998*12720SWyllys.Ingersoll@Sun.COM sKmaAddress, 999*12720SWyllys.Ingersoll@Sun.COM NULL ); 1000*12720SWyllys.Ingersoll@Sun.COM } 1001*12720SWyllys.Ingersoll@Sun.COM } 1002*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1003*12720SWyllys.Ingersoll@Sun.COM else 1004*12720SWyllys.Ingersoll@Sun.COM { 1005*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 16\n"); 1006*12720SWyllys.Ingersoll@Sun.COM } 1007*12720SWyllys.Ingersoll@Sun.COM #endif 1008*12720SWyllys.Ingersoll@Sun.COM 1009*12720SWyllys.Ingersoll@Sun.COM // if valid, calculate the correct challenge-response 1010*12720SWyllys.Ingersoll@Sun.COM unsigned char 1011*12720SWyllys.Ingersoll@Sun.COM aServerAuthenticationChallengeResponse[AUTHENTICATION_RESPONSE_LENGTH]; 1012*12720SWyllys.Ingersoll@Sun.COM 1013*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1014*12720SWyllys.Ingersoll@Sun.COM { 1015*12720SWyllys.Ingersoll@Sun.COM bSuccess = ComputeChallengeResponse( 1016*12720SWyllys.Ingersoll@Sun.COM aAuthenticationSecret, 1017*12720SWyllys.Ingersoll@Sun.COM AUTHENTICATION_SECRET_LENGTH, 1018*12720SWyllys.Ingersoll@Sun.COM aRootCACertificate, 1019*12720SWyllys.Ingersoll@Sun.COM iRootCACertificateLength, 1020*12720SWyllys.Ingersoll@Sun.COM stServerAuthenticationChallenge.__ptr, 1021*12720SWyllys.Ingersoll@Sun.COM AUTHENTICATION_CHALLENGE_LENGTH, 1022*12720SWyllys.Ingersoll@Sun.COM aServerAuthenticationChallengeResponse, 1023*12720SWyllys.Ingersoll@Sun.COM AUTHENTICATION_RESPONSE_LENGTH ); 1024*12720SWyllys.Ingersoll@Sun.COM } 1025*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1026*12720SWyllys.Ingersoll@Sun.COM else 1027*12720SWyllys.Ingersoll@Sun.COM { 1028*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 17\n"); 1029*12720SWyllys.Ingersoll@Sun.COM } 1030*12720SWyllys.Ingersoll@Sun.COM #endif 1031*12720SWyllys.Ingersoll@Sun.COM 1032*12720SWyllys.Ingersoll@Sun.COM // if successful, check if the server provided the correct challenge-response 1033*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1034*12720SWyllys.Ingersoll@Sun.COM { 1035*12720SWyllys.Ingersoll@Sun.COM if ( 0 != memcmp( 1036*12720SWyllys.Ingersoll@Sun.COM aServerAuthenticationChallengeResponse, 1037*12720SWyllys.Ingersoll@Sun.COM stRetrieveEntityCertificateResponse.ServerAuthenticationResponse.__ptr, 1038*12720SWyllys.Ingersoll@Sun.COM AUTHENTICATION_RESPONSE_LENGTH ) ) 1039*12720SWyllys.Ingersoll@Sun.COM { 1040*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 1041*12720SWyllys.Ingersoll@Sun.COM 1042*12720SWyllys.Ingersoll@Sun.COM GetPeerNetworkAddress(sKmaAddress, pstCertificateSoap); 1043*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile,AUDIT_CLIENT_GET_CERTIFICATE_INVALID_CHALLENGE_RESPONSE, 1044*12720SWyllys.Ingersoll@Sun.COM NULL, 1045*12720SWyllys.Ingersoll@Sun.COM sKmaAddress, 1046*12720SWyllys.Ingersoll@Sun.COM NULL ); 1047*12720SWyllys.Ingersoll@Sun.COM } 1048*12720SWyllys.Ingersoll@Sun.COM } 1049*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1050*12720SWyllys.Ingersoll@Sun.COM else 1051*12720SWyllys.Ingersoll@Sun.COM { 1052*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 18\n"); 1053*12720SWyllys.Ingersoll@Sun.COM } 1054*12720SWyllys.Ingersoll@Sun.COM #endif 1055*12720SWyllys.Ingersoll@Sun.COM 1056*12720SWyllys.Ingersoll@Sun.COM 1057*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1058*12720SWyllys.Ingersoll@Sun.COM { 1059*12720SWyllys.Ingersoll@Sun.COM pEntityCertificate = new CCertificate; 1060*12720SWyllys.Ingersoll@Sun.COM // if certificate was obtained 1061*12720SWyllys.Ingersoll@Sun.COM bSuccess = ( pEntityCertificate != 0 ); 1062*12720SWyllys.Ingersoll@Sun.COM } 1063*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1064*12720SWyllys.Ingersoll@Sun.COM else 1065*12720SWyllys.Ingersoll@Sun.COM { 1066*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 19\n"); 1067*12720SWyllys.Ingersoll@Sun.COM } 1068*12720SWyllys.Ingersoll@Sun.COM #endif 1069*12720SWyllys.Ingersoll@Sun.COM 1070*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1071*12720SWyllys.Ingersoll@Sun.COM { 1072*12720SWyllys.Ingersoll@Sun.COM // Load(recall) the signed certificate using OVERLOADED load method 1073*12720SWyllys.Ingersoll@Sun.COM // 3 parameters means load from a buffer 1074*12720SWyllys.Ingersoll@Sun.COM bSuccess = pEntityCertificate->Load( 1075*12720SWyllys.Ingersoll@Sun.COM stRetrieveEntityCertificateResponse.Certificate.__ptr, // load into 1076*12720SWyllys.Ingersoll@Sun.COM stRetrieveEntityCertificateResponse.Certificate.__size, 1077*12720SWyllys.Ingersoll@Sun.COM PKI_FORMAT ); 1078*12720SWyllys.Ingersoll@Sun.COM 1079*12720SWyllys.Ingersoll@Sun.COM if ( !bSuccess ) 1080*12720SWyllys.Ingersoll@Sun.COM { 1081*12720SWyllys.Ingersoll@Sun.COM GetPeerNetworkAddress(sKmaAddress, pstCertificateSoap); 1082*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile,AUDIT_CLIENT_GET_CERTIFICATE_INVALID_CERTIFICATE_FORMAT, 1083*12720SWyllys.Ingersoll@Sun.COM NULL, 1084*12720SWyllys.Ingersoll@Sun.COM sKmaAddress, 1085*12720SWyllys.Ingersoll@Sun.COM NULL ); 1086*12720SWyllys.Ingersoll@Sun.COM } 1087*12720SWyllys.Ingersoll@Sun.COM } 1088*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1089*12720SWyllys.Ingersoll@Sun.COM else 1090*12720SWyllys.Ingersoll@Sun.COM { 1091*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 20\n"); 1092*12720SWyllys.Ingersoll@Sun.COM } 1093*12720SWyllys.Ingersoll@Sun.COM #endif 1094*12720SWyllys.Ingersoll@Sun.COM 1095*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1096*12720SWyllys.Ingersoll@Sun.COM { 1097*12720SWyllys.Ingersoll@Sun.COM pEntityPrivateKey = new CPrivateKey; 1098*12720SWyllys.Ingersoll@Sun.COM bSuccess = ( pEntityPrivateKey != 0 ); 1099*12720SWyllys.Ingersoll@Sun.COM } 1100*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1101*12720SWyllys.Ingersoll@Sun.COM else 1102*12720SWyllys.Ingersoll@Sun.COM { 1103*12720SWyllys.Ingersoll@Sun.COM log_printf("!bSuccess 21\n"); 1104*12720SWyllys.Ingersoll@Sun.COM } 1105*12720SWyllys.Ingersoll@Sun.COM #endif 1106*12720SWyllys.Ingersoll@Sun.COM 1107*12720SWyllys.Ingersoll@Sun.COM 1108*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1109*12720SWyllys.Ingersoll@Sun.COM { 1110*12720SWyllys.Ingersoll@Sun.COM // Load the Private Key using OVERLOADED Load method - 3 parameters 1111*12720SWyllys.Ingersoll@Sun.COM // means load from a buffer 1112*12720SWyllys.Ingersoll@Sun.COM 1113*12720SWyllys.Ingersoll@Sun.COM // TODO: change this when certificate service supports requesting unwrapped private keys 1114*12720SWyllys.Ingersoll@Sun.COM bSuccess = pEntityPrivateKey->Load( 1115*12720SWyllys.Ingersoll@Sun.COM stRetrieveEntityCertificateResponse.WrappedPrivateKeyMaterial.__ptr, // load into 1116*12720SWyllys.Ingersoll@Sun.COM stRetrieveEntityCertificateResponse.WrappedPrivateKeyMaterial.__size, 1117*12720SWyllys.Ingersoll@Sun.COM NULL, 1118*12720SWyllys.Ingersoll@Sun.COM PKI_FORMAT ); 1119*12720SWyllys.Ingersoll@Sun.COM 1120*12720SWyllys.Ingersoll@Sun.COM if (!bSuccess ) 1121*12720SWyllys.Ingersoll@Sun.COM { 1122*12720SWyllys.Ingersoll@Sun.COM 1123*12720SWyllys.Ingersoll@Sun.COM GetPeerNetworkAddress(sKmaAddress, pstCertificateSoap); 1124*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile,AUDIT_CLIENT_GET_CERTIFICATE_INVALID_KEY_FORMAT, 1125*12720SWyllys.Ingersoll@Sun.COM NULL, 1126*12720SWyllys.Ingersoll@Sun.COM sKmaAddress, 1127*12720SWyllys.Ingersoll@Sun.COM NULL ); 1128*12720SWyllys.Ingersoll@Sun.COM } 1129*12720SWyllys.Ingersoll@Sun.COM } 1130*12720SWyllys.Ingersoll@Sun.COM 1131*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1132*12720SWyllys.Ingersoll@Sun.COM { 1133*12720SWyllys.Ingersoll@Sun.COM strncpy(i_pProfile->m_wsEntityID, 1134*12720SWyllys.Ingersoll@Sun.COM i_wsEntityID, 1135*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ENTITY_ID ); 1136*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_wsEntityID[KMS_MAX_ENTITY_ID] = 0; 1137*12720SWyllys.Ingersoll@Sun.COM 1138*12720SWyllys.Ingersoll@Sun.COM // store PKI certificates and unwrapped private key 1139*12720SWyllys.Ingersoll@Sun.COM bSuccess = StorePKIcerts( i_pProfile, 1140*12720SWyllys.Ingersoll@Sun.COM pRootCACertificate, 1141*12720SWyllys.Ingersoll@Sun.COM pEntityCertificate, 1142*12720SWyllys.Ingersoll@Sun.COM pEntityPrivateKey, 1143*12720SWyllys.Ingersoll@Sun.COM #ifdef KMSUSERPKCS12 1144*12720SWyllys.Ingersoll@Sun.COM i_wsPassphrase 1145*12720SWyllys.Ingersoll@Sun.COM #else 1146*12720SWyllys.Ingersoll@Sun.COM NULL 1147*12720SWyllys.Ingersoll@Sun.COM #endif 1148*12720SWyllys.Ingersoll@Sun.COM ); 1149*12720SWyllys.Ingersoll@Sun.COM #ifdef KMSUSERPKCS12 1150*12720SWyllys.Ingersoll@Sun.COM if (bSuccess) { 1151*12720SWyllys.Ingersoll@Sun.COM /* 1152*12720SWyllys.Ingersoll@Sun.COM * Write out the cert and key individually so GetPKIcerts 1153*12720SWyllys.Ingersoll@Sun.COM * can use them. 1154*12720SWyllys.Ingersoll@Sun.COM */ 1155*12720SWyllys.Ingersoll@Sun.COM bSuccess = StoreTempAgentPKI(i_pProfile, 1156*12720SWyllys.Ingersoll@Sun.COM pEntityCertificate, pEntityPrivateKey); 1157*12720SWyllys.Ingersoll@Sun.COM } 1158*12720SWyllys.Ingersoll@Sun.COM 1159*12720SWyllys.Ingersoll@Sun.COM #endif 1160*12720SWyllys.Ingersoll@Sun.COM } 1161*12720SWyllys.Ingersoll@Sun.COM 1162*12720SWyllys.Ingersoll@Sun.COM if ( !bSuccess ) 1163*12720SWyllys.Ingersoll@Sun.COM { 1164*12720SWyllys.Ingersoll@Sun.COM if (pRootCACertificate) 1165*12720SWyllys.Ingersoll@Sun.COM { 1166*12720SWyllys.Ingersoll@Sun.COM delete pRootCACertificate; 1167*12720SWyllys.Ingersoll@Sun.COM } 1168*12720SWyllys.Ingersoll@Sun.COM if (pEntityCertificate) 1169*12720SWyllys.Ingersoll@Sun.COM { 1170*12720SWyllys.Ingersoll@Sun.COM delete pEntityCertificate; 1171*12720SWyllys.Ingersoll@Sun.COM } 1172*12720SWyllys.Ingersoll@Sun.COM if (pEntityPrivateKey) 1173*12720SWyllys.Ingersoll@Sun.COM { 1174*12720SWyllys.Ingersoll@Sun.COM delete pEntityPrivateKey; 1175*12720SWyllys.Ingersoll@Sun.COM } 1176*12720SWyllys.Ingersoll@Sun.COM 1177*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_iEnrolled = FALSE; 1178*12720SWyllys.Ingersoll@Sun.COM 1179*12720SWyllys.Ingersoll@Sun.COM if ( bTryFailOver ) 1180*12720SWyllys.Ingersoll@Sun.COM { 1181*12720SWyllys.Ingersoll@Sun.COM iIndex = oLoadBalancer.FailOver(iIndex, bFailedOnRetrieveRootCA ? pstCASoap : pstCertificateSoap); 1182*12720SWyllys.Ingersoll@Sun.COM } 1183*12720SWyllys.Ingersoll@Sun.COM } 1184*12720SWyllys.Ingersoll@Sun.COM } 1185*12720SWyllys.Ingersoll@Sun.COM while ( bTryFailOver && (iIndex >= 0) && !bSuccess ); 1186*12720SWyllys.Ingersoll@Sun.COM 1187*12720SWyllys.Ingersoll@Sun.COM // certs are now persisted so free up space 1188*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1189*12720SWyllys.Ingersoll@Sun.COM { 1190*12720SWyllys.Ingersoll@Sun.COM delete pRootCACertificate; 1191*12720SWyllys.Ingersoll@Sun.COM delete pEntityCertificate; 1192*12720SWyllys.Ingersoll@Sun.COM delete pEntityPrivateKey; 1193*12720SWyllys.Ingersoll@Sun.COM } 1194*12720SWyllys.Ingersoll@Sun.COM 1195*12720SWyllys.Ingersoll@Sun.COM // Clean up SOAP resources for pstCASoap 1196*12720SWyllys.Ingersoll@Sun.COM soap_destroy( pstCASoap ); 1197*12720SWyllys.Ingersoll@Sun.COM soap_end( pstCASoap ); 1198*12720SWyllys.Ingersoll@Sun.COM soap_done( pstCASoap ); 1199*12720SWyllys.Ingersoll@Sun.COM 1200*12720SWyllys.Ingersoll@Sun.COM // Clean up SOAP resources for pstCertificateSoap 1201*12720SWyllys.Ingersoll@Sun.COM soap_destroy( pstCertificateSoap ); 1202*12720SWyllys.Ingersoll@Sun.COM soap_end( pstCertificateSoap ); 1203*12720SWyllys.Ingersoll@Sun.COM soap_done( pstCertificateSoap ); 1204*12720SWyllys.Ingersoll@Sun.COM 1205*12720SWyllys.Ingersoll@Sun.COM free(pstCASoap); 1206*12720SWyllys.Ingersoll@Sun.COM free(pstCertificateSoap); 1207*12720SWyllys.Ingersoll@Sun.COM 1208*12720SWyllys.Ingersoll@Sun.COM return bSuccess; 1209*12720SWyllys.Ingersoll@Sun.COM } 1210*12720SWyllys.Ingersoll@Sun.COM 1211*12720SWyllys.Ingersoll@Sun.COM /*-------------------------------------------------------------------------- 1212*12720SWyllys.Ingersoll@Sun.COM * LoadClusterInformation 1213*12720SWyllys.Ingersoll@Sun.COM * calls GetCluster - that's it. 1214*12720SWyllys.Ingersoll@Sun.COM * If there is no cluster file, this function will return true, 1215*12720SWyllys.Ingersoll@Sun.COM * but o_bClusterInformationFound will be false. 1216*12720SWyllys.Ingersoll@Sun.COM *-------------------------------------------------------------------------*/ 1217*12720SWyllys.Ingersoll@Sun.COM static bool LoadClusterInformation( KMSClientProfile* i_pProfile, 1218*12720SWyllys.Ingersoll@Sun.COM int& o_bClusterInformationFound ) 1219*12720SWyllys.Ingersoll@Sun.COM { 1220*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( i_pProfile ); 1221*12720SWyllys.Ingersoll@Sun.COM 1222*12720SWyllys.Ingersoll@Sun.COM o_bClusterInformationFound = false; 1223*12720SWyllys.Ingersoll@Sun.COM 1224*12720SWyllys.Ingersoll@Sun.COM CAutoMutex oAutoMutex( (K_MUTEX_HANDLE)i_pProfile->m_pLock ); 1225*12720SWyllys.Ingersoll@Sun.COM 1226*12720SWyllys.Ingersoll@Sun.COM return GetCluster( i_pProfile, o_bClusterInformationFound ) ; 1227*12720SWyllys.Ingersoll@Sun.COM 1228*12720SWyllys.Ingersoll@Sun.COM } 1229*12720SWyllys.Ingersoll@Sun.COM 1230*12720SWyllys.Ingersoll@Sun.COM 1231*12720SWyllys.Ingersoll@Sun.COM /*-------------------------------------------------------------------------- 1232*12720SWyllys.Ingersoll@Sun.COM * EnrollAgent 1233*12720SWyllys.Ingersoll@Sun.COM * calls functions to perform enrollment and save PKI info to persistent storage 1234*12720SWyllys.Ingersoll@Sun.COM * stores configuration in persistent storage 1235*12720SWyllys.Ingersoll@Sun.COM *-------------------------------------------------------------------------*/ 1236*12720SWyllys.Ingersoll@Sun.COM 1237*12720SWyllys.Ingersoll@Sun.COM static bool EnrollAgent( KMSClientProfile * io_pProfile, 1238*12720SWyllys.Ingersoll@Sun.COM utf8cstr i_wsEntityID, 1239*12720SWyllys.Ingersoll@Sun.COM utf8cstr i_wsPassphrase ) 1240*12720SWyllys.Ingersoll@Sun.COM { 1241*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( io_pProfile && i_wsEntityID && i_wsPassphrase ); 1242*12720SWyllys.Ingersoll@Sun.COM 1243*12720SWyllys.Ingersoll@Sun.COM bool bSuccess = true; 1244*12720SWyllys.Ingersoll@Sun.COM 1245*12720SWyllys.Ingersoll@Sun.COM // see KMSAgentCryptoUtilities for HASH_LENGTH, aka KMS_MAX_HASH_SIZE 1246*12720SWyllys.Ingersoll@Sun.COM char sHexHashedPassphrase[2*KMS_MAX_HASH_SIZE+1]; 1247*12720SWyllys.Ingersoll@Sun.COM 1248*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1249*12720SWyllys.Ingersoll@Sun.COM { 1250*12720SWyllys.Ingersoll@Sun.COM // performs enrollment and saves PKI info to persistent storage 1251*12720SWyllys.Ingersoll@Sun.COM bSuccess = KMSClient_RetrieveEntityCertificate( 1252*12720SWyllys.Ingersoll@Sun.COM io_pProfile, 1253*12720SWyllys.Ingersoll@Sun.COM i_wsEntityID, 1254*12720SWyllys.Ingersoll@Sun.COM i_wsPassphrase, 1255*12720SWyllys.Ingersoll@Sun.COM sHexHashedPassphrase ); 1256*12720SWyllys.Ingersoll@Sun.COM 1257*12720SWyllys.Ingersoll@Sun.COM // KMSClient_RetrieveCertificate logs errors 1258*12720SWyllys.Ingersoll@Sun.COM } 1259*12720SWyllys.Ingersoll@Sun.COM 1260*12720SWyllys.Ingersoll@Sun.COM if (bSuccess) 1261*12720SWyllys.Ingersoll@Sun.COM { 1262*12720SWyllys.Ingersoll@Sun.COM strncpy(io_pProfile->m_sHexHashedPassphrase, 1263*12720SWyllys.Ingersoll@Sun.COM sHexHashedPassphrase, 1264*12720SWyllys.Ingersoll@Sun.COM 2*KMS_MAX_HASH_SIZE ); 1265*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_sHexHashedPassphrase[2*KMS_MAX_HASH_SIZE] = 0; 1266*12720SWyllys.Ingersoll@Sun.COM 1267*12720SWyllys.Ingersoll@Sun.COM // persist the profile now updated with the hashed passphrase 1268*12720SWyllys.Ingersoll@Sun.COM bSuccess = StoreConfig( io_pProfile ); 1269*12720SWyllys.Ingersoll@Sun.COM 1270*12720SWyllys.Ingersoll@Sun.COM if (!bSuccess) 1271*12720SWyllys.Ingersoll@Sun.COM { 1272*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_LOAD_PROFILE, 1273*12720SWyllys.Ingersoll@Sun.COM i_wsEntityID, 1274*12720SWyllys.Ingersoll@Sun.COM NULL, 1275*12720SWyllys.Ingersoll@Sun.COM "store config failed following enrollment" ); 1276*12720SWyllys.Ingersoll@Sun.COM } 1277*12720SWyllys.Ingersoll@Sun.COM } 1278*12720SWyllys.Ingersoll@Sun.COM 1279*12720SWyllys.Ingersoll@Sun.COM return bSuccess; 1280*12720SWyllys.Ingersoll@Sun.COM } 1281*12720SWyllys.Ingersoll@Sun.COM 1282*12720SWyllys.Ingersoll@Sun.COM /*--------------------------------------------------------------------------- 1283*12720SWyllys.Ingersoll@Sun.COM * Function: KMSClient_LoadProfile 1284*12720SWyllys.Ingersoll@Sun.COM * 1285*12720SWyllys.Ingersoll@Sun.COM *--------------------------------------------------------------------------*/ 1286*12720SWyllys.Ingersoll@Sun.COM bool KMSClient_LoadProfile( 1287*12720SWyllys.Ingersoll@Sun.COM KMSClientProfile *io_pProfile, 1288*12720SWyllys.Ingersoll@Sun.COM utf8char *i_wsProfileName, 1289*12720SWyllys.Ingersoll@Sun.COM utf8char *i_wsEntityID, 1290*12720SWyllys.Ingersoll@Sun.COM utf8char *i_wsPassphrase, 1291*12720SWyllys.Ingersoll@Sun.COM utf8char *i_wsApplianceAddress, 1292*12720SWyllys.Ingersoll@Sun.COM int i_iTransactionTimeout, 1293*12720SWyllys.Ingersoll@Sun.COM int i_iFailOverLimit, 1294*12720SWyllys.Ingersoll@Sun.COM int i_iClusterDiscoveryFrequency, 1295*12720SWyllys.Ingersoll@Sun.COM int i_eKMSmode) 1296*12720SWyllys.Ingersoll@Sun.COM { 1297*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT(io_pProfile); 1298*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT(i_wsProfileName); 1299*12720SWyllys.Ingersoll@Sun.COM 1300*12720SWyllys.Ingersoll@Sun.COM bool bSuccess = true; 1301*12720SWyllys.Ingersoll@Sun.COM 1302*12720SWyllys.Ingersoll@Sun.COM char sSoapFaultMsg[g_iMAX_SOAP_FAULT_MESSAGE_LENGTH]; 1303*12720SWyllys.Ingersoll@Sun.COM char sKmaAddress[g_iMAX_PEER_NETWORK_ADDRESS_LENGTH]; 1304*12720SWyllys.Ingersoll@Sun.COM 1305*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1306*12720SWyllys.Ingersoll@Sun.COM log_printf("KMSClient_LoadProfile : entered"); 1307*12720SWyllys.Ingersoll@Sun.COM #endif 1308*12720SWyllys.Ingersoll@Sun.COM 1309*12720SWyllys.Ingersoll@Sun.COM memset( io_pProfile, 0, sizeof(KMSClientProfile) ); 1310*12720SWyllys.Ingersoll@Sun.COM 1311*12720SWyllys.Ingersoll@Sun.COM // create lock 1312*12720SWyllys.Ingersoll@Sun.COM 1313*12720SWyllys.Ingersoll@Sun.COM if (bSuccess) 1314*12720SWyllys.Ingersoll@Sun.COM { 1315*12720SWyllys.Ingersoll@Sun.COM bSuccess = 1316*12720SWyllys.Ingersoll@Sun.COM ( K_CreateMutex((K_MUTEX_HANDLE *)&io_pProfile->m_pLock) == 1317*12720SWyllys.Ingersoll@Sun.COM K_SYS_OK ); 1318*12720SWyllys.Ingersoll@Sun.COM } 1319*12720SWyllys.Ingersoll@Sun.COM 1320*12720SWyllys.Ingersoll@Sun.COM // initialize profile with parameters 1321*12720SWyllys.Ingersoll@Sun.COM 1322*12720SWyllys.Ingersoll@Sun.COM strncpy(io_pProfile->m_wsProfileName, 1323*12720SWyllys.Ingersoll@Sun.COM i_wsProfileName, 1324*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ENTITY_ID); 1325*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_wsProfileName[KMS_MAX_ENTITY_ID] = 0; 1326*12720SWyllys.Ingersoll@Sun.COM 1327*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iPortForCAService = 1328*12720SWyllys.Ingersoll@Sun.COM DEFAULT_CA_SERVICE_PORT_NUMBER; 1329*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iPortForCertificateService = 1330*12720SWyllys.Ingersoll@Sun.COM DEFAULT_CERTIFICATE_SERVICE_PORT_NUMBER; 1331*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iPortForDiscoveryService = 1332*12720SWyllys.Ingersoll@Sun.COM DEFAULT_DISCOVERY_SERVICE_PORT_NUMBER; 1333*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iPortForAgentService = 1334*12720SWyllys.Ingersoll@Sun.COM DEFAULT_AGENT_SERVICE_PORT_NUMBER; 1335*12720SWyllys.Ingersoll@Sun.COM strncpy(io_pProfile->m_wsApplianceAddress, 1336*12720SWyllys.Ingersoll@Sun.COM i_wsApplianceAddress, 1337*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_NETWORK_ADDRESS); 1338*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_wsApplianceAddress[KMS_MAX_NETWORK_ADDRESS] = 0; 1339*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iClusterDiscoveryFrequency = i_iClusterDiscoveryFrequency; 1340*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iTransactionTimeout = i_iTransactionTimeout; 1341*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iFailoverLimit = i_iFailOverLimit; 1342*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_eKMSmode = i_eKMSmode; 1343*12720SWyllys.Ingersoll@Sun.COM 1344*12720SWyllys.Ingersoll@Sun.COM // if the file isn't found, create a new one 1345*12720SWyllys.Ingersoll@Sun.COM bool bProfileExists = ProfileExists( g_wsWorkingDirectory, /* pass in default */ 1346*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_wsProfileName ); 1347*12720SWyllys.Ingersoll@Sun.COM 1348*12720SWyllys.Ingersoll@Sun.COM #ifdef KMSUSERPKCS12 1349*12720SWyllys.Ingersoll@Sun.COM /* 1350*12720SWyllys.Ingersoll@Sun.COM * Fix logic for determining if this request is for enrollment. 1351*12720SWyllys.Ingersoll@Sun.COM * Look to see if the server cert and clientkey.p12 file exist. 1352*12720SWyllys.Ingersoll@Sun.COM * We always expect a password for Solaris which is used to 1353*12720SWyllys.Ingersoll@Sun.COM * validate that the user has access to the clientkey data by 1354*12720SWyllys.Ingersoll@Sun.COM * attempting to use it to open the PKCS12 file. 1355*12720SWyllys.Ingersoll@Sun.COM */ 1356*12720SWyllys.Ingersoll@Sun.COM bool bEnrolling = !ClientKeyP12Exists(io_pProfile->m_wsProfileName); 1357*12720SWyllys.Ingersoll@Sun.COM #else 1358*12720SWyllys.Ingersoll@Sun.COM bool bEnrolling = i_wsEntityID && i_wsPassphrase; 1359*12720SWyllys.Ingersoll@Sun.COM #endif 1360*12720SWyllys.Ingersoll@Sun.COM 1361*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess && !bEnrolling && !bProfileExists ) 1362*12720SWyllys.Ingersoll@Sun.COM { 1363*12720SWyllys.Ingersoll@Sun.COM // when not enrolling a profile must exist 1364*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 1365*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_LOAD_PROFILE, 1366*12720SWyllys.Ingersoll@Sun.COM i_wsProfileName, 1367*12720SWyllys.Ingersoll@Sun.COM NULL, 1368*12720SWyllys.Ingersoll@Sun.COM "Enrollment attempted but profile could not be found" ); 1369*12720SWyllys.Ingersoll@Sun.COM } 1370*12720SWyllys.Ingersoll@Sun.COM 1371*12720SWyllys.Ingersoll@Sun.COM // if the file isn't found, create a new one 1372*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess && !bProfileExists ) 1373*12720SWyllys.Ingersoll@Sun.COM { 1374*12720SWyllys.Ingersoll@Sun.COM strncpy(io_pProfile->m_wsEntityID, 1375*12720SWyllys.Ingersoll@Sun.COM i_wsEntityID, 1376*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ENTITY_ID ); 1377*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_wsEntityID[KMS_MAX_ENTITY_ID] = 0; 1378*12720SWyllys.Ingersoll@Sun.COM bSuccess = CreateProfile( io_pProfile, 1379*12720SWyllys.Ingersoll@Sun.COM g_wsWorkingDirectory, 1380*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_wsProfileName ); 1381*12720SWyllys.Ingersoll@Sun.COM } 1382*12720SWyllys.Ingersoll@Sun.COM 1383*12720SWyllys.Ingersoll@Sun.COM // load profile.cfg file 1384*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1385*12720SWyllys.Ingersoll@Sun.COM { 1386*12720SWyllys.Ingersoll@Sun.COM bSuccess = GetConfig( io_pProfile ); 1387*12720SWyllys.Ingersoll@Sun.COM 1388*12720SWyllys.Ingersoll@Sun.COM } 1389*12720SWyllys.Ingersoll@Sun.COM 1390*12720SWyllys.Ingersoll@Sun.COM // if profile settings changed then update the profile storage 1391*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess && 1392*12720SWyllys.Ingersoll@Sun.COM ( strncmp(io_pProfile->m_wsApplianceAddress, 1393*12720SWyllys.Ingersoll@Sun.COM i_wsApplianceAddress, KMS_MAX_NETWORK_ADDRESS ) != 0 || 1394*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iClusterDiscoveryFrequency != i_iClusterDiscoveryFrequency || 1395*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iTransactionTimeout != i_iTransactionTimeout || 1396*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iFailoverLimit != i_iFailOverLimit 1397*12720SWyllys.Ingersoll@Sun.COM )) 1398*12720SWyllys.Ingersoll@Sun.COM { 1399*12720SWyllys.Ingersoll@Sun.COM strncpy(io_pProfile->m_wsApplianceAddress, 1400*12720SWyllys.Ingersoll@Sun.COM i_wsApplianceAddress, 1401*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_NETWORK_ADDRESS); 1402*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_wsApplianceAddress[KMS_MAX_NETWORK_ADDRESS] = 0; 1403*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iClusterDiscoveryFrequency = i_iClusterDiscoveryFrequency; 1404*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iTransactionTimeout = i_iTransactionTimeout; 1405*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iFailoverLimit = i_iFailOverLimit; 1406*12720SWyllys.Ingersoll@Sun.COM 1407*12720SWyllys.Ingersoll@Sun.COM bSuccess = StoreConfig( io_pProfile ); 1408*12720SWyllys.Ingersoll@Sun.COM } 1409*12720SWyllys.Ingersoll@Sun.COM 1410*12720SWyllys.Ingersoll@Sun.COM // get PKI info from prior enrollment 1411*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess && !bEnrolling ) 1412*12720SWyllys.Ingersoll@Sun.COM { 1413*12720SWyllys.Ingersoll@Sun.COM #ifdef KMSUSERPKCS12 1414*12720SWyllys.Ingersoll@Sun.COM /* 1415*12720SWyllys.Ingersoll@Sun.COM * Decrypt the PKCS12 file with the client cert and key using 1416*12720SWyllys.Ingersoll@Sun.COM * the given password. If it fails, then return an auth failure 1417*12720SWyllys.Ingersoll@Sun.COM * status. If success, write the client cert and key to the client file 1418*12720SWyllys.Ingersoll@Sun.COM * so it can be used later by the SOAP SSL functions. 1419*12720SWyllys.Ingersoll@Sun.COM */ 1420*12720SWyllys.Ingersoll@Sun.COM CCertificate* pEntityCertificate = new CCertificate;; 1421*12720SWyllys.Ingersoll@Sun.COM CPrivateKey* pEntityPrivateKey = new CPrivateKey; 1422*12720SWyllys.Ingersoll@Sun.COM bSuccess = GetPKCS12CertAndKey(io_pProfile, 1423*12720SWyllys.Ingersoll@Sun.COM i_wsPassphrase, 1424*12720SWyllys.Ingersoll@Sun.COM pEntityCertificate, 1425*12720SWyllys.Ingersoll@Sun.COM pEntityPrivateKey); 1426*12720SWyllys.Ingersoll@Sun.COM if (!bSuccess) { 1427*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_LOAD_PROFILE, 1428*12720SWyllys.Ingersoll@Sun.COM i_wsProfileName, 1429*12720SWyllys.Ingersoll@Sun.COM NULL, 1430*12720SWyllys.Ingersoll@Sun.COM "Enrollment Certificate and Private Key "\ 1431*12720SWyllys.Ingersoll@Sun.COM "were not loaded from PKCS12" ); 1432*12720SWyllys.Ingersoll@Sun.COM } else { 1433*12720SWyllys.Ingersoll@Sun.COM /* 1434*12720SWyllys.Ingersoll@Sun.COM * Write out the cert and key individually so GetPKIcerts 1435*12720SWyllys.Ingersoll@Sun.COM * can use them. 1436*12720SWyllys.Ingersoll@Sun.COM */ 1437*12720SWyllys.Ingersoll@Sun.COM bSuccess = StoreTempAgentPKI(io_pProfile, 1438*12720SWyllys.Ingersoll@Sun.COM pEntityCertificate, pEntityPrivateKey); 1439*12720SWyllys.Ingersoll@Sun.COM if (!bSuccess) { 1440*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_LOAD_PROFILE, 1441*12720SWyllys.Ingersoll@Sun.COM i_wsProfileName, 1442*12720SWyllys.Ingersoll@Sun.COM NULL, 1443*12720SWyllys.Ingersoll@Sun.COM "Enrollment Certificate and Private Key "\ 1444*12720SWyllys.Ingersoll@Sun.COM "were not stored to file." ); 1445*12720SWyllys.Ingersoll@Sun.COM } 1446*12720SWyllys.Ingersoll@Sun.COM } 1447*12720SWyllys.Ingersoll@Sun.COM delete pEntityCertificate; 1448*12720SWyllys.Ingersoll@Sun.COM delete pEntityPrivateKey; 1449*12720SWyllys.Ingersoll@Sun.COM 1450*12720SWyllys.Ingersoll@Sun.COM #endif 1451*12720SWyllys.Ingersoll@Sun.COM if (bSuccess) 1452*12720SWyllys.Ingersoll@Sun.COM bSuccess = GetPKIcerts( io_pProfile ); 1453*12720SWyllys.Ingersoll@Sun.COM } 1454*12720SWyllys.Ingersoll@Sun.COM 1455*12720SWyllys.Ingersoll@Sun.COM // if not enrolling then previously enrolled PKI info should now be initialized 1456*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess && !bEnrolling && 1457*12720SWyllys.Ingersoll@Sun.COM (!io_pProfile->m_sHexHashedPassphrase || 1458*12720SWyllys.Ingersoll@Sun.COM !io_pProfile->m_iEnrolled )) 1459*12720SWyllys.Ingersoll@Sun.COM { 1460*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 1461*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_LOAD_PROFILE, 1462*12720SWyllys.Ingersoll@Sun.COM i_wsProfileName, 1463*12720SWyllys.Ingersoll@Sun.COM NULL, 1464*12720SWyllys.Ingersoll@Sun.COM "Enrollment Certificates and Private Key were not loaded from profile" ); 1465*12720SWyllys.Ingersoll@Sun.COM } 1466*12720SWyllys.Ingersoll@Sun.COM 1467*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_bIsClusterDiscoveryCalled = false; 1468*12720SWyllys.Ingersoll@Sun.COM 1469*12720SWyllys.Ingersoll@Sun.COM // allocate main soap struct 1470*12720SWyllys.Ingersoll@Sun.COM struct soap* pstSoap = 0; 1471*12720SWyllys.Ingersoll@Sun.COM 1472*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1473*12720SWyllys.Ingersoll@Sun.COM { 1474*12720SWyllys.Ingersoll@Sun.COM pstSoap = (struct soap*)malloc( sizeof(struct soap) ); 1475*12720SWyllys.Ingersoll@Sun.COM 1476*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_pvSoap = pstSoap; 1477*12720SWyllys.Ingersoll@Sun.COM 1478*12720SWyllys.Ingersoll@Sun.COM bSuccess = ( pstSoap != NULL ); 1479*12720SWyllys.Ingersoll@Sun.COM 1480*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1481*12720SWyllys.Ingersoll@Sun.COM { 1482*12720SWyllys.Ingersoll@Sun.COM soap_init2( pstSoap, 1483*12720SWyllys.Ingersoll@Sun.COM (SOAP_XML_STRICT | SOAP_C_UTFSTRING ), 1484*12720SWyllys.Ingersoll@Sun.COM (SOAP_XML_STRICT | SOAP_C_UTFSTRING) ); 1485*12720SWyllys.Ingersoll@Sun.COM 1486*12720SWyllys.Ingersoll@Sun.COM #ifdef METAWARE 1487*12720SWyllys.Ingersoll@Sun.COM K_SetupCallbacks ( pstSoap ); 1488*12720SWyllys.Ingersoll@Sun.COM #endif 1489*12720SWyllys.Ingersoll@Sun.COM 1490*12720SWyllys.Ingersoll@Sun.COM soap_set_namespaces( pstSoap, KMS_Agent_namespaces ); 1491*12720SWyllys.Ingersoll@Sun.COM 1492*12720SWyllys.Ingersoll@Sun.COM pstSoap->connect_timeout = io_pProfile->m_iTransactionTimeout; 1493*12720SWyllys.Ingersoll@Sun.COM pstSoap->send_timeout = io_pProfile->m_iTransactionTimeout; 1494*12720SWyllys.Ingersoll@Sun.COM pstSoap->recv_timeout = io_pProfile->m_iTransactionTimeout; 1495*12720SWyllys.Ingersoll@Sun.COM } 1496*12720SWyllys.Ingersoll@Sun.COM else 1497*12720SWyllys.Ingersoll@Sun.COM { 1498*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1499*12720SWyllys.Ingersoll@Sun.COM log_printf("Malloc %x pstSoap returned null\n", 1500*12720SWyllys.Ingersoll@Sun.COM sizeof(struct soap)); 1501*12720SWyllys.Ingersoll@Sun.COM #endif 1502*12720SWyllys.Ingersoll@Sun.COM 1503*12720SWyllys.Ingersoll@Sun.COM } 1504*12720SWyllys.Ingersoll@Sun.COM } 1505*12720SWyllys.Ingersoll@Sun.COM 1506*12720SWyllys.Ingersoll@Sun.COM // delete the existing cluster config if the input IP address 1507*12720SWyllys.Ingersoll@Sun.COM // does not match one already known to the cluster config 1508*12720SWyllys.Ingersoll@Sun.COM 1509*12720SWyllys.Ingersoll@Sun.COM // Note that KMSClientProfile may be too large to fit on the stack, so we're 1510*12720SWyllys.Ingersoll@Sun.COM // going to put it on the heap. 1511*12720SWyllys.Ingersoll@Sun.COM 1512*12720SWyllys.Ingersoll@Sun.COM KMSClientProfile* pstTempProfile = 0; 1513*12720SWyllys.Ingersoll@Sun.COM bool bFound = false; 1514*12720SWyllys.Ingersoll@Sun.COM int i; 1515*12720SWyllys.Ingersoll@Sun.COM 1516*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1517*12720SWyllys.Ingersoll@Sun.COM { 1518*12720SWyllys.Ingersoll@Sun.COM pstTempProfile = (KMSClientProfile*)malloc( sizeof(KMSClientProfile) ); 1519*12720SWyllys.Ingersoll@Sun.COM bSuccess = (pstTempProfile != 0); 1520*12720SWyllys.Ingersoll@Sun.COM #if defined(METAWARE) 1521*12720SWyllys.Ingersoll@Sun.COM if (!bSuccess) 1522*12720SWyllys.Ingersoll@Sun.COM log_printf("Malloc %x pstTempProfile returned null\n", 1523*12720SWyllys.Ingersoll@Sun.COM sizeof(KMSClientProfile)); 1524*12720SWyllys.Ingersoll@Sun.COM #endif 1525*12720SWyllys.Ingersoll@Sun.COM 1526*12720SWyllys.Ingersoll@Sun.COM } 1527*12720SWyllys.Ingersoll@Sun.COM 1528*12720SWyllys.Ingersoll@Sun.COM int bClusterInformationFound = false; 1529*12720SWyllys.Ingersoll@Sun.COM 1530*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1531*12720SWyllys.Ingersoll@Sun.COM { 1532*12720SWyllys.Ingersoll@Sun.COM memcpy( pstTempProfile, io_pProfile, sizeof(KMSClientProfile) ); 1533*12720SWyllys.Ingersoll@Sun.COM 1534*12720SWyllys.Ingersoll@Sun.COM bSuccess = LoadClusterInformation( pstTempProfile, bClusterInformationFound ); 1535*12720SWyllys.Ingersoll@Sun.COM } 1536*12720SWyllys.Ingersoll@Sun.COM 1537*12720SWyllys.Ingersoll@Sun.COM // got cluster info from persistent storage 1538*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess && bClusterInformationFound ) 1539*12720SWyllys.Ingersoll@Sun.COM { 1540*12720SWyllys.Ingersoll@Sun.COM // see if address is a member of the remembered cluster or is a 1541*12720SWyllys.Ingersoll@Sun.COM // new kma, meaning this KMA joins the cluster as the 1542*12720SWyllys.Ingersoll@Sun.COM // discovery KMA. 1543*12720SWyllys.Ingersoll@Sun.COM for ( i = 0; i < pstTempProfile->m_iClusterNum; i++ ) 1544*12720SWyllys.Ingersoll@Sun.COM { 1545*12720SWyllys.Ingersoll@Sun.COM bFound = (strncmp( pstTempProfile->m_aCluster[i].m_wsApplianceNetworkAddress, 1546*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_wsApplianceAddress, 1547*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_NETWORK_ADDRESS) == 0); 1548*12720SWyllys.Ingersoll@Sun.COM 1549*12720SWyllys.Ingersoll@Sun.COM if ( bFound ) 1550*12720SWyllys.Ingersoll@Sun.COM { 1551*12720SWyllys.Ingersoll@Sun.COM break; 1552*12720SWyllys.Ingersoll@Sun.COM } 1553*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1554*12720SWyllys.Ingersoll@Sun.COM else 1555*12720SWyllys.Ingersoll@Sun.COM log_printf ("KMSClient_LoadProfile : Appliance Address doesn't match"); 1556*12720SWyllys.Ingersoll@Sun.COM #endif 1557*12720SWyllys.Ingersoll@Sun.COM } 1558*12720SWyllys.Ingersoll@Sun.COM 1559*12720SWyllys.Ingersoll@Sun.COM if ( !bFound ) 1560*12720SWyllys.Ingersoll@Sun.COM { 1561*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1562*12720SWyllys.Ingersoll@Sun.COM log_printf ("KMSClient_LoadProfile : delete cluster"); 1563*12720SWyllys.Ingersoll@Sun.COM #endif 1564*12720SWyllys.Ingersoll@Sun.COM DeleteCluster( pstTempProfile ); 1565*12720SWyllys.Ingersoll@Sun.COM char msg[256]; 1566*12720SWyllys.Ingersoll@Sun.COM K_snprintf(msg, 256, 1567*12720SWyllys.Ingersoll@Sun.COM "KMSClientProfile.LoadProfile(): deleting previous cluster config, %s not found\n", 1568*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_wsApplianceAddress); 1569*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_LOAD_PROFILE, 1570*12720SWyllys.Ingersoll@Sun.COM i_wsProfileName, 1571*12720SWyllys.Ingersoll@Sun.COM NULL, 1572*12720SWyllys.Ingersoll@Sun.COM msg ); 1573*12720SWyllys.Ingersoll@Sun.COM DeleteCluster( pstTempProfile ); 1574*12720SWyllys.Ingersoll@Sun.COM } 1575*12720SWyllys.Ingersoll@Sun.COM else 1576*12720SWyllys.Ingersoll@Sun.COM { 1577*12720SWyllys.Ingersoll@Sun.COM // since address is a member of the persisted cluster copy the persisted cluster info to the profile 1578*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iClusterNum = pstTempProfile->m_iClusterNum; 1579*12720SWyllys.Ingersoll@Sun.COM memcpy(io_pProfile->m_aCluster, 1580*12720SWyllys.Ingersoll@Sun.COM pstTempProfile->m_aCluster, 1581*12720SWyllys.Ingersoll@Sun.COM sizeof(KMSClusterEntry)*io_pProfile->m_iClusterNum); 1582*12720SWyllys.Ingersoll@Sun.COM } 1583*12720SWyllys.Ingersoll@Sun.COM } 1584*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1585*12720SWyllys.Ingersoll@Sun.COM else 1586*12720SWyllys.Ingersoll@Sun.COM log_printf ("KMSClient_LoadProfile : no persisted cluster information"); 1587*12720SWyllys.Ingersoll@Sun.COM #endif 1588*12720SWyllys.Ingersoll@Sun.COM 1589*12720SWyllys.Ingersoll@Sun.COM if ( pstTempProfile ) 1590*12720SWyllys.Ingersoll@Sun.COM { 1591*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1592*12720SWyllys.Ingersoll@Sun.COM log_printf ("KMSClient_LoadProfile : free the temporary profile"); 1593*12720SWyllys.Ingersoll@Sun.COM #endif 1594*12720SWyllys.Ingersoll@Sun.COM free( pstTempProfile ); 1595*12720SWyllys.Ingersoll@Sun.COM pstTempProfile = 0; 1596*12720SWyllys.Ingersoll@Sun.COM } 1597*12720SWyllys.Ingersoll@Sun.COM 1598*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess && !io_pProfile->m_iEnrolled ) 1599*12720SWyllys.Ingersoll@Sun.COM { 1600*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1601*12720SWyllys.Ingersoll@Sun.COM log_printf ("KMSClient_LoadProfile : call EnrollAgent"); 1602*12720SWyllys.Ingersoll@Sun.COM #endif 1603*12720SWyllys.Ingersoll@Sun.COM // enroll the agent 1604*12720SWyllys.Ingersoll@Sun.COM bSuccess = EnrollAgent( io_pProfile, 1605*12720SWyllys.Ingersoll@Sun.COM i_wsEntityID, 1606*12720SWyllys.Ingersoll@Sun.COM i_wsPassphrase ); 1607*12720SWyllys.Ingersoll@Sun.COM } 1608*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1609*12720SWyllys.Ingersoll@Sun.COM else if (io_pProfile->m_iEnrolled) 1610*12720SWyllys.Ingersoll@Sun.COM log_printf ("KMSClient_LoadProfile : Already Enrolled"); 1611*12720SWyllys.Ingersoll@Sun.COM #endif 1612*12720SWyllys.Ingersoll@Sun.COM 1613*12720SWyllys.Ingersoll@Sun.COM 1614*12720SWyllys.Ingersoll@Sun.COM 1615*12720SWyllys.Ingersoll@Sun.COM if (bSuccess) 1616*12720SWyllys.Ingersoll@Sun.COM { 1617*12720SWyllys.Ingersoll@Sun.COM // Initialize SSL - use CLIENT AUTH 1618*12720SWyllys.Ingersoll@Sun.COM // CLIENT_AUTHENTICATION needs the pstSoap, and expects 1619*12720SWyllys.Ingersoll@Sun.COM // the profile io_pProfile to be full (have the other certificates 1620*12720SWyllys.Ingersoll@Sun.COM // and keypair) 1621*12720SWyllys.Ingersoll@Sun.COM 1622*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1623*12720SWyllys.Ingersoll@Sun.COM { 1624*12720SWyllys.Ingersoll@Sun.COM bSuccess = 1625*12720SWyllys.Ingersoll@Sun.COM K_soap_ssl_client_context( 1626*12720SWyllys.Ingersoll@Sun.COM io_pProfile, // in/out 1627*12720SWyllys.Ingersoll@Sun.COM pstSoap, // out 1628*12720SWyllys.Ingersoll@Sun.COM SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION // in - flags 1629*12720SWyllys.Ingersoll@Sun.COM ) == SOAP_OK; 1630*12720SWyllys.Ingersoll@Sun.COM 1631*12720SWyllys.Ingersoll@Sun.COM if ( !bSuccess ) 1632*12720SWyllys.Ingersoll@Sun.COM { 1633*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1634*12720SWyllys.Ingersoll@Sun.COM if (!bSuccess) 1635*12720SWyllys.Ingersoll@Sun.COM log_printf ("KMSClient_LoadProfile : K_soap_ssl_client_context failed"); 1636*12720SWyllys.Ingersoll@Sun.COM #endif 1637*12720SWyllys.Ingersoll@Sun.COM GetSoapFault(sSoapFaultMsg, (struct soap*)pstSoap); 1638*12720SWyllys.Ingersoll@Sun.COM GetPeerNetworkAddress(sKmaAddress, pstSoap); 1639*12720SWyllys.Ingersoll@Sun.COM 1640*12720SWyllys.Ingersoll@Sun.COM LogError(io_pProfile, 1641*12720SWyllys.Ingersoll@Sun.COM AUDIT_CLIENT_LOAD_PROFILE_SOAP_ERROR, 1642*12720SWyllys.Ingersoll@Sun.COM NULL, 1643*12720SWyllys.Ingersoll@Sun.COM sKmaAddress, 1644*12720SWyllys.Ingersoll@Sun.COM sSoapFaultMsg ); 1645*12720SWyllys.Ingersoll@Sun.COM } 1646*12720SWyllys.Ingersoll@Sun.COM } 1647*12720SWyllys.Ingersoll@Sun.COM 1648*12720SWyllys.Ingersoll@Sun.COM // discover the cluster 1649*12720SWyllys.Ingersoll@Sun.COM 1650*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess && 1651*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iClusterDiscoveryFrequency > 0 ) 1652*12720SWyllys.Ingersoll@Sun.COM { 1653*12720SWyllys.Ingersoll@Sun.COM bSuccess = ( KMSClient_GetClusterInformation( 1654*12720SWyllys.Ingersoll@Sun.COM io_pProfile, 1655*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_wsEntitySiteID, 1656*12720SWyllys.Ingersoll@Sun.COM sizeof(io_pProfile->m_wsEntitySiteID), 1657*12720SWyllys.Ingersoll@Sun.COM &(io_pProfile->m_iClusterNum), 1658*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_aCluster, 1659*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_CLUSTER_NUM) != 0 ); 1660*12720SWyllys.Ingersoll@Sun.COM // KMSClient_GetClusterInformation logs errors 1661*12720SWyllys.Ingersoll@Sun.COM 1662*12720SWyllys.Ingersoll@Sun.COM if (bSuccess && i_eKMSmode == FIPS_MODE) 1663*12720SWyllys.Ingersoll@Sun.COM { 1664*12720SWyllys.Ingersoll@Sun.COM bSuccess = !KMSClient_NoFIPSCompatibleKMAs(io_pProfile); 1665*12720SWyllys.Ingersoll@Sun.COM if (!bSuccess) 1666*12720SWyllys.Ingersoll@Sun.COM { 1667*12720SWyllys.Ingersoll@Sun.COM LogError(io_pProfile, 1668*12720SWyllys.Ingersoll@Sun.COM AUDIT_CLIENT_AGENT_LOAD_PROFILE_NO_FIPS_COMPATIBLE_KMAS_AVAILABLE, 1669*12720SWyllys.Ingersoll@Sun.COM NULL, 1670*12720SWyllys.Ingersoll@Sun.COM NULL, 1671*12720SWyllys.Ingersoll@Sun.COM NULL ); 1672*12720SWyllys.Ingersoll@Sun.COM } 1673*12720SWyllys.Ingersoll@Sun.COM } 1674*12720SWyllys.Ingersoll@Sun.COM } 1675*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1676*12720SWyllys.Ingersoll@Sun.COM if (!bSuccess) 1677*12720SWyllys.Ingersoll@Sun.COM log_printf ("KMSClient_LoadProfile : getClusterInformation failed"); 1678*12720SWyllys.Ingersoll@Sun.COM #endif 1679*12720SWyllys.Ingersoll@Sun.COM 1680*12720SWyllys.Ingersoll@Sun.COM #ifdef KMSUSERPKCS12 1681*12720SWyllys.Ingersoll@Sun.COM /* 1682*12720SWyllys.Ingersoll@Sun.COM * Once the SSL context is established, delete the 1683*12720SWyllys.Ingersoll@Sun.COM * private key file. 1684*12720SWyllys.Ingersoll@Sun.COM */ 1685*12720SWyllys.Ingersoll@Sun.COM (void) CleanupPrivateKeyFile(io_pProfile); 1686*12720SWyllys.Ingersoll@Sun.COM #endif 1687*12720SWyllys.Ingersoll@Sun.COM } 1688*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1689*12720SWyllys.Ingersoll@Sun.COM else if (!bSuccess) 1690*12720SWyllys.Ingersoll@Sun.COM log_printf ("KMSClient_LoadProfile : EnrollAgent failed"); 1691*12720SWyllys.Ingersoll@Sun.COM #endif 1692*12720SWyllys.Ingersoll@Sun.COM 1693*12720SWyllys.Ingersoll@Sun.COM CAgentLoadBalancer *pAgentLoadBalancer = new CAgentLoadBalancer(io_pProfile); 1694*12720SWyllys.Ingersoll@Sun.COM if(pAgentLoadBalancer == NULL) 1695*12720SWyllys.Ingersoll@Sun.COM { 1696*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 1697*12720SWyllys.Ingersoll@Sun.COM } 1698*12720SWyllys.Ingersoll@Sun.COM 1699*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1700*12720SWyllys.Ingersoll@Sun.COM if (!bSuccess) 1701*12720SWyllys.Ingersoll@Sun.COM log_printf ("KMSClient_LoadProfile : new CAgentLoadBalancer failed"); 1702*12720SWyllys.Ingersoll@Sun.COM #endif 1703*12720SWyllys.Ingersoll@Sun.COM 1704*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_pAgentLoadBalancer = pAgentLoadBalancer; 1705*12720SWyllys.Ingersoll@Sun.COM 1706*12720SWyllys.Ingersoll@Sun.COM // create a data unit server affinity cache for Agents 1707*12720SWyllys.Ingersoll@Sun.COM 1708*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1709*12720SWyllys.Ingersoll@Sun.COM { 1710*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_pDataUnitCache = new CDataUnitCache(); 1711*12720SWyllys.Ingersoll@Sun.COM 1712*12720SWyllys.Ingersoll@Sun.COM bSuccess = ( io_pProfile->m_pDataUnitCache != NULL ); 1713*12720SWyllys.Ingersoll@Sun.COM } 1714*12720SWyllys.Ingersoll@Sun.COM 1715*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 1716*12720SWyllys.Ingersoll@Sun.COM { 1717*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1718*12720SWyllys.Ingersoll@Sun.COM log_printf ("KMSClient_LoadProfile : set version to KMS_AGENT_VERSION = %x", 1719*12720SWyllys.Ingersoll@Sun.COM KMS_AGENT_VERSION); 1720*12720SWyllys.Ingersoll@Sun.COM log_printf ("KMSClient_LoadProfile : profile is: %x\n", io_pProfile); 1721*12720SWyllys.Ingersoll@Sun.COM #endif 1722*12720SWyllys.Ingersoll@Sun.COM // this is checked later by ProfileLoaded and is taken 1723*12720SWyllys.Ingersoll@Sun.COM // to indicate that the profile was correctly loaded 1724*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_iVersion = KMS_AGENT_VERSION; 1725*12720SWyllys.Ingersoll@Sun.COM } 1726*12720SWyllys.Ingersoll@Sun.COM 1727*12720SWyllys.Ingersoll@Sun.COM if( !bSuccess ) 1728*12720SWyllys.Ingersoll@Sun.COM { 1729*12720SWyllys.Ingersoll@Sun.COM K_DestroyMutex((K_MUTEX_HANDLE)io_pProfile->m_pLock); 1730*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_pLock = 0; 1731*12720SWyllys.Ingersoll@Sun.COM 1732*12720SWyllys.Ingersoll@Sun.COM if ( io_pProfile->m_pvSoap ) 1733*12720SWyllys.Ingersoll@Sun.COM { 1734*12720SWyllys.Ingersoll@Sun.COM soap_destroy( (struct soap*)io_pProfile->m_pvSoap ); 1735*12720SWyllys.Ingersoll@Sun.COM soap_end( (struct soap*)io_pProfile->m_pvSoap ); 1736*12720SWyllys.Ingersoll@Sun.COM soap_done( (struct soap*)io_pProfile->m_pvSoap ); 1737*12720SWyllys.Ingersoll@Sun.COM 1738*12720SWyllys.Ingersoll@Sun.COM free( (struct soap*)io_pProfile->m_pvSoap ); 1739*12720SWyllys.Ingersoll@Sun.COM io_pProfile->m_pvSoap = 0; 1740*12720SWyllys.Ingersoll@Sun.COM 1741*12720SWyllys.Ingersoll@Sun.COM if( io_pProfile->m_pAgentLoadBalancer != NULL) 1742*12720SWyllys.Ingersoll@Sun.COM { 1743*12720SWyllys.Ingersoll@Sun.COM delete(reinterpret_cast <CAgentLoadBalancer *>(io_pProfile->m_pAgentLoadBalancer)); 1744*12720SWyllys.Ingersoll@Sun.COM } 1745*12720SWyllys.Ingersoll@Sun.COM 1746*12720SWyllys.Ingersoll@Sun.COM if( io_pProfile->m_pDataUnitCache != NULL) 1747*12720SWyllys.Ingersoll@Sun.COM { 1748*12720SWyllys.Ingersoll@Sun.COM delete(reinterpret_cast <CDataUnitCache *>(io_pProfile->m_pDataUnitCache)); 1749*12720SWyllys.Ingersoll@Sun.COM } 1750*12720SWyllys.Ingersoll@Sun.COM 1751*12720SWyllys.Ingersoll@Sun.COM } 1752*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 1753*12720SWyllys.Ingersoll@Sun.COM log_printf ("KMSClient_LoadProfile : failed - returning"); 1754*12720SWyllys.Ingersoll@Sun.COM #endif 1755*12720SWyllys.Ingersoll@Sun.COM } 1756*12720SWyllys.Ingersoll@Sun.COM 1757*12720SWyllys.Ingersoll@Sun.COM return bSuccess; 1758*12720SWyllys.Ingersoll@Sun.COM } 1759*12720SWyllys.Ingersoll@Sun.COM 1760*12720SWyllys.Ingersoll@Sun.COM /** 1761*12720SWyllys.Ingersoll@Sun.COM * compare cluster entries having equivalent KMA names (aka Appliance alias) and 1762*12720SWyllys.Ingersoll@Sun.COM * return true if equal. Note: KMANetworkAddress comparison is handled separately 1763*12720SWyllys.Ingersoll@Sun.COM * due to IPv4/IPv6 1764*12720SWyllys.Ingersoll@Sun.COM */ 1765*12720SWyllys.Ingersoll@Sun.COM static bool EqualClusterEntry( 1766*12720SWyllys.Ingersoll@Sun.COM struct KMS_Discovery::KMS_Discovery_ClusterMember const *i_pLeft, 1767*12720SWyllys.Ingersoll@Sun.COM KMSClusterEntry const *i_pRight) 1768*12720SWyllys.Ingersoll@Sun.COM { 1769*12720SWyllys.Ingersoll@Sun.COM bool bEnabled = i_pRight->m_iEnabled ? true : false; 1770*12720SWyllys.Ingersoll@Sun.COM if ( i_pLeft->Enabled != bEnabled ) 1771*12720SWyllys.Ingersoll@Sun.COM { 1772*12720SWyllys.Ingersoll@Sun.COM return false; 1773*12720SWyllys.Ingersoll@Sun.COM } 1774*12720SWyllys.Ingersoll@Sun.COM if ( i_pLeft->KMAID != i_pRight->m_lApplianceID ) 1775*12720SWyllys.Ingersoll@Sun.COM { 1776*12720SWyllys.Ingersoll@Sun.COM return false; 1777*12720SWyllys.Ingersoll@Sun.COM } 1778*12720SWyllys.Ingersoll@Sun.COM if ( strncmp(i_pLeft->KMASiteID, 1779*12720SWyllys.Ingersoll@Sun.COM i_pRight->m_wsApplianceSiteID, 1780*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ENTITY_SITE_ID) != 0 ) 1781*12720SWyllys.Ingersoll@Sun.COM { 1782*12720SWyllys.Ingersoll@Sun.COM return false; 1783*12720SWyllys.Ingersoll@Sun.COM } 1784*12720SWyllys.Ingersoll@Sun.COM // Note: we now minimize persistence of cluster changes by not saving 1785*12720SWyllys.Ingersoll@Sun.COM // whenever m_iResponding changes 1786*12720SWyllys.Ingersoll@Sun.COM 1787*12720SWyllys.Ingersoll@Sun.COM return true; 1788*12720SWyllys.Ingersoll@Sun.COM } 1789*12720SWyllys.Ingersoll@Sun.COM /** 1790*12720SWyllys.Ingersoll@Sun.COM * @return true if the current address matches the provided IPv6Address 1791*12720SWyllys.Ingersoll@Sun.COM * when the i_bUseIPv6 arg is true, otherwise compare the current address 1792*12720SWyllys.Ingersoll@Sun.COM * with the IPv4Address. If i_bUseIPv6 then i_pCurrentAddress must be 1793*12720SWyllys.Ingersoll@Sun.COM * enclosed in brackets, i.e. as in RFC 2396. 1794*12720SWyllys.Ingersoll@Sun.COM */ 1795*12720SWyllys.Ingersoll@Sun.COM static bool EqualKMANetworkAddress ( 1796*12720SWyllys.Ingersoll@Sun.COM bool i_bUseIPv6, 1797*12720SWyllys.Ingersoll@Sun.COM const char * const i_pIPv6Address, 1798*12720SWyllys.Ingersoll@Sun.COM const char * const i_pIPv4Address, 1799*12720SWyllys.Ingersoll@Sun.COM const char * const i_pCurrentAddress 1800*12720SWyllys.Ingersoll@Sun.COM ) 1801*12720SWyllys.Ingersoll@Sun.COM { 1802*12720SWyllys.Ingersoll@Sun.COM bool bEqualAddress = true; 1803*12720SWyllys.Ingersoll@Sun.COM 1804*12720SWyllys.Ingersoll@Sun.COM if ( i_pCurrentAddress == NULL ) 1805*12720SWyllys.Ingersoll@Sun.COM { 1806*12720SWyllys.Ingersoll@Sun.COM return false; 1807*12720SWyllys.Ingersoll@Sun.COM } 1808*12720SWyllys.Ingersoll@Sun.COM 1809*12720SWyllys.Ingersoll@Sun.COM if (i_bUseIPv6) 1810*12720SWyllys.Ingersoll@Sun.COM { 1811*12720SWyllys.Ingersoll@Sun.COM if ( i_pIPv6Address == NULL ) 1812*12720SWyllys.Ingersoll@Sun.COM { 1813*12720SWyllys.Ingersoll@Sun.COM return false; 1814*12720SWyllys.Ingersoll@Sun.COM } 1815*12720SWyllys.Ingersoll@Sun.COM char sIPv6Address[KMS_MAX_NETWORK_ADDRESS] = "["; 1816*12720SWyllys.Ingersoll@Sun.COM 1817*12720SWyllys.Ingersoll@Sun.COM strcat(sIPv6Address, i_pIPv6Address); 1818*12720SWyllys.Ingersoll@Sun.COM 1819*12720SWyllys.Ingersoll@Sun.COM char * pLoc = strchr(sIPv6Address, '/'); 1820*12720SWyllys.Ingersoll@Sun.COM 1821*12720SWyllys.Ingersoll@Sun.COM if ( pLoc != NULL ) 1822*12720SWyllys.Ingersoll@Sun.COM { 1823*12720SWyllys.Ingersoll@Sun.COM // remove prefix from address 1824*12720SWyllys.Ingersoll@Sun.COM *pLoc = '\0'; 1825*12720SWyllys.Ingersoll@Sun.COM } 1826*12720SWyllys.Ingersoll@Sun.COM strcat(sIPv6Address, "]"); 1827*12720SWyllys.Ingersoll@Sun.COM bEqualAddress = strncmp(sIPv6Address, i_pCurrentAddress, KMS_MAX_NETWORK_ADDRESS) == 0; 1828*12720SWyllys.Ingersoll@Sun.COM } 1829*12720SWyllys.Ingersoll@Sun.COM else 1830*12720SWyllys.Ingersoll@Sun.COM { 1831*12720SWyllys.Ingersoll@Sun.COM if ( i_pIPv4Address == NULL ) 1832*12720SWyllys.Ingersoll@Sun.COM { 1833*12720SWyllys.Ingersoll@Sun.COM return false; 1834*12720SWyllys.Ingersoll@Sun.COM } 1835*12720SWyllys.Ingersoll@Sun.COM bEqualAddress = strncmp(i_pIPv4Address, i_pCurrentAddress, KMS_MAX_NETWORK_ADDRESS) == 0; 1836*12720SWyllys.Ingersoll@Sun.COM } 1837*12720SWyllys.Ingersoll@Sun.COM 1838*12720SWyllys.Ingersoll@Sun.COM return bEqualAddress; 1839*12720SWyllys.Ingersoll@Sun.COM } 1840*12720SWyllys.Ingersoll@Sun.COM 1841*12720SWyllys.Ingersoll@Sun.COM /** 1842*12720SWyllys.Ingersoll@Sun.COM * compares the profile's current cluster state with the filtered discover 1843*12720SWyllys.Ingersoll@Sun.COM * cluster response and returns true if the repsonse 1844*12720SWyllys.Ingersoll@Sun.COM * differs from i_pProfile->m_aCluster. A cluster has changed if the state of any 1845*12720SWyllys.Ingersoll@Sun.COM * cluster node has changed or if the set of cluster nodes has changed. 1846*12720SWyllys.Ingersoll@Sun.COM * The order of nodes is immaterial. 1847*12720SWyllys.Ingersoll@Sun.COM */ 1848*12720SWyllys.Ingersoll@Sun.COM static bool ClusterConfigChanged ( 1849*12720SWyllys.Ingersoll@Sun.COM KMSClientProfile const *i_pProfile, 1850*12720SWyllys.Ingersoll@Sun.COM char * const i_sResponseEntitySiteID, 1851*12720SWyllys.Ingersoll@Sun.COM struct KMS_Discovery::KMS_Discovery__ArrayOfClusterMembers const *i_pFilteredCluster) 1852*12720SWyllys.Ingersoll@Sun.COM { 1853*12720SWyllys.Ingersoll@Sun.COM int i, j; 1854*12720SWyllys.Ingersoll@Sun.COM 1855*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT(i_pProfile); 1856*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT(i_pFilteredCluster); 1857*12720SWyllys.Ingersoll@Sun.COM 1858*12720SWyllys.Ingersoll@Sun.COM // cardinality check 1859*12720SWyllys.Ingersoll@Sun.COM if (i_pProfile->m_iClusterNum != 1860*12720SWyllys.Ingersoll@Sun.COM i_pFilteredCluster->__size) 1861*12720SWyllys.Ingersoll@Sun.COM { 1862*12720SWyllys.Ingersoll@Sun.COM return true; 1863*12720SWyllys.Ingersoll@Sun.COM } 1864*12720SWyllys.Ingersoll@Sun.COM 1865*12720SWyllys.Ingersoll@Sun.COM // check if the agent's site ID changed 1866*12720SWyllys.Ingersoll@Sun.COM if (strncmp(i_pProfile->m_wsEntitySiteID, 1867*12720SWyllys.Ingersoll@Sun.COM i_sResponseEntitySiteID, KMS_MAX_ENTITY_SITE_ID) != 0) 1868*12720SWyllys.Ingersoll@Sun.COM { 1869*12720SWyllys.Ingersoll@Sun.COM return true; 1870*12720SWyllys.Ingersoll@Sun.COM } 1871*12720SWyllys.Ingersoll@Sun.COM 1872*12720SWyllys.Ingersoll@Sun.COM // for all KMAs in filtered response check if they exist unchanged in the profile 1873*12720SWyllys.Ingersoll@Sun.COM for (i = 0; i < i_pFilteredCluster->__size; i++) 1874*12720SWyllys.Ingersoll@Sun.COM { 1875*12720SWyllys.Ingersoll@Sun.COM bool bFound = false; 1876*12720SWyllys.Ingersoll@Sun.COM for (j = 0; j < i_pProfile->m_iClusterNum; j++) 1877*12720SWyllys.Ingersoll@Sun.COM { 1878*12720SWyllys.Ingersoll@Sun.COM if (strncmp(i_pFilteredCluster->__ptr[i].KMAName, 1879*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[j].m_wsApplianceAlias, 1880*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ENTITY_ID) == 0) 1881*12720SWyllys.Ingersoll@Sun.COM { 1882*12720SWyllys.Ingersoll@Sun.COM bFound = true; 1883*12720SWyllys.Ingersoll@Sun.COM if ( 1884*12720SWyllys.Ingersoll@Sun.COM !EqualKMANetworkAddress( 1885*12720SWyllys.Ingersoll@Sun.COM strchr(i_pProfile->m_wsApplianceAddress, ':') ? true : false, 1886*12720SWyllys.Ingersoll@Sun.COM i_pFilteredCluster->__ptr[i].KMANetworkAddressIPv6, 1887*12720SWyllys.Ingersoll@Sun.COM i_pFilteredCluster->__ptr[i].KMANetworkAddress, 1888*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[j].m_wsApplianceNetworkAddress) || 1889*12720SWyllys.Ingersoll@Sun.COM !EqualClusterEntry((i_pFilteredCluster->__ptr + i), 1890*12720SWyllys.Ingersoll@Sun.COM &i_pProfile->m_aCluster[j])) 1891*12720SWyllys.Ingersoll@Sun.COM 1892*12720SWyllys.Ingersoll@Sun.COM { 1893*12720SWyllys.Ingersoll@Sun.COM return true; 1894*12720SWyllys.Ingersoll@Sun.COM } 1895*12720SWyllys.Ingersoll@Sun.COM } 1896*12720SWyllys.Ingersoll@Sun.COM } 1897*12720SWyllys.Ingersoll@Sun.COM if ( !bFound ) 1898*12720SWyllys.Ingersoll@Sun.COM { 1899*12720SWyllys.Ingersoll@Sun.COM return true; 1900*12720SWyllys.Ingersoll@Sun.COM } 1901*12720SWyllys.Ingersoll@Sun.COM } 1902*12720SWyllys.Ingersoll@Sun.COM return false; 1903*12720SWyllys.Ingersoll@Sun.COM } 1904*12720SWyllys.Ingersoll@Sun.COM 1905*12720SWyllys.Ingersoll@Sun.COM /** 1906*12720SWyllys.Ingersoll@Sun.COM * returns true if the string is a valid IPv6 address syntactically 1907*12720SWyllys.Ingersoll@Sun.COM */ 1908*12720SWyllys.Ingersoll@Sun.COM static bool ValidIPv6KMAaddress( const char * const i_pIPAddress ) 1909*12720SWyllys.Ingersoll@Sun.COM { 1910*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( i_pIPAddress ); 1911*12720SWyllys.Ingersoll@Sun.COM 1912*12720SWyllys.Ingersoll@Sun.COM if ( strlen(i_pIPAddress) <= 0 ) 1913*12720SWyllys.Ingersoll@Sun.COM { 1914*12720SWyllys.Ingersoll@Sun.COM return false; 1915*12720SWyllys.Ingersoll@Sun.COM } 1916*12720SWyllys.Ingersoll@Sun.COM 1917*12720SWyllys.Ingersoll@Sun.COM // simple check 1918*12720SWyllys.Ingersoll@Sun.COM if ( strchr( i_pIPAddress, ':')) 1919*12720SWyllys.Ingersoll@Sun.COM { 1920*12720SWyllys.Ingersoll@Sun.COM return true; 1921*12720SWyllys.Ingersoll@Sun.COM } 1922*12720SWyllys.Ingersoll@Sun.COM 1923*12720SWyllys.Ingersoll@Sun.COM return false; 1924*12720SWyllys.Ingersoll@Sun.COM } 1925*12720SWyllys.Ingersoll@Sun.COM /** 1926*12720SWyllys.Ingersoll@Sun.COM * 1927*12720SWyllys.Ingersoll@Sun.COM */ 1928*12720SWyllys.Ingersoll@Sun.COM static void FreeFilteredCluster ( 1929*12720SWyllys.Ingersoll@Sun.COM struct KMS_Discovery::KMS_Discovery__ArrayOfClusterMembers * const io_stFilteredCluster, 1930*12720SWyllys.Ingersoll@Sun.COM int iLimit ) 1931*12720SWyllys.Ingersoll@Sun.COM { 1932*12720SWyllys.Ingersoll@Sun.COM int j = 0; 1933*12720SWyllys.Ingersoll@Sun.COM for (; j < iLimit; j++ ) 1934*12720SWyllys.Ingersoll@Sun.COM { 1935*12720SWyllys.Ingersoll@Sun.COM free( io_stFilteredCluster->__ptr[j].KMAName ); 1936*12720SWyllys.Ingersoll@Sun.COM free( io_stFilteredCluster->__ptr[j].KMASiteID ); 1937*12720SWyllys.Ingersoll@Sun.COM free( io_stFilteredCluster->__ptr[j].KMAHostName ); 1938*12720SWyllys.Ingersoll@Sun.COM free( io_stFilteredCluster->__ptr[j].KMANetworkAddress ); 1939*12720SWyllys.Ingersoll@Sun.COM free( io_stFilteredCluster->__ptr[j].KMAVersion ); 1940*12720SWyllys.Ingersoll@Sun.COM free( io_stFilteredCluster->__ptr[j].KMAHostNameIPv6 ); 1941*12720SWyllys.Ingersoll@Sun.COM free( io_stFilteredCluster->__ptr[j].KMANetworkAddressIPv6 ); 1942*12720SWyllys.Ingersoll@Sun.COM } 1943*12720SWyllys.Ingersoll@Sun.COM 1944*12720SWyllys.Ingersoll@Sun.COM free( io_stFilteredCluster->__ptr ); 1945*12720SWyllys.Ingersoll@Sun.COM } 1946*12720SWyllys.Ingersoll@Sun.COM 1947*12720SWyllys.Ingersoll@Sun.COM /** 1948*12720SWyllys.Ingersoll@Sun.COM * filters the discover cluster response to be less than or equal to KMS_MAX_CLUSTER_NUM KMAs. The heuristic used to filter 1949*12720SWyllys.Ingersoll@Sun.COM * the response is the same as used by CAgentLoadBalancer::KMSClient_SortClusterArray(), FIPS compatibility, then within site, 1950*12720SWyllys.Ingersoll@Sun.COM * then responding and enabled KMAs. 1951*12720SWyllys.Ingersoll@Sun.COM * @param i_stResponse pointer to gsoap discover cluster service response 1952*12720SWyllys.Ingersoll@Sun.COM * @param io_stFilteredCluster pointer to gsoap discover cluster array to be populated with the filtered list of KMAs 1953*12720SWyllys.Ingersoll@Sun.COM * @return true on success and io_stFilteredCluster->__size less than or equal to KMS_MAX_CLUSTER_NUM, 1954*12720SWyllys.Ingersoll@Sun.COM * otherwise io_stFilteredCluster is undefined. io_stFilteredCluster->__ptr is populated with the array of elements 1955*12720SWyllys.Ingersoll@Sun.COM * malloc'd. 1956*12720SWyllys.Ingersoll@Sun.COM */ 1957*12720SWyllys.Ingersoll@Sun.COM static bool FilterCluster (struct KMS_Discovery::KMS_Discovery__DiscoverClusterResponse * const i_stResponse, 1958*12720SWyllys.Ingersoll@Sun.COM bool i_bFIPS, 1959*12720SWyllys.Ingersoll@Sun.COM struct KMS_Discovery::KMS_Discovery__ArrayOfClusterMembers * const io_stFilteredCluster) 1960*12720SWyllys.Ingersoll@Sun.COM { 1961*12720SWyllys.Ingersoll@Sun.COM /* 1962*12720SWyllys.Ingersoll@Sun.COM * do something like KMSAgentLoadBalancer:SortClusterArray() to the stResponse array 1963*12720SWyllys.Ingersoll@Sun.COM * return 1st KMS_MAX_CLUSTER_NUM entries and free the rest. 1964*12720SWyllys.Ingersoll@Sun.COM */ 1965*12720SWyllys.Ingersoll@Sun.COM 1966*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT(i_stResponse); 1967*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT(io_stFilteredCluster); 1968*12720SWyllys.Ingersoll@Sun.COM 1969*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__size = i_stResponse->ArrayOfClusterMembers.__size; 1970*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr = reinterpret_cast < struct KMS_Discovery::KMS_Discovery_ClusterMember * > 1971*12720SWyllys.Ingersoll@Sun.COM ( calloc( io_stFilteredCluster->__size, 1972*12720SWyllys.Ingersoll@Sun.COM sizeof (struct KMS_Discovery::KMS_Discovery_ClusterMember ) ) ); 1973*12720SWyllys.Ingersoll@Sun.COM 1974*12720SWyllys.Ingersoll@Sun.COM if (io_stFilteredCluster->__ptr == NULL) 1975*12720SWyllys.Ingersoll@Sun.COM { 1976*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_FILTER_CLUSTER_FAILED, 1977*12720SWyllys.Ingersoll@Sun.COM NULL, 1978*12720SWyllys.Ingersoll@Sun.COM NULL, 1979*12720SWyllys.Ingersoll@Sun.COM "calloc failed"); 1980*12720SWyllys.Ingersoll@Sun.COM return false; 1981*12720SWyllys.Ingersoll@Sun.COM } 1982*12720SWyllys.Ingersoll@Sun.COM 1983*12720SWyllys.Ingersoll@Sun.COM if (io_stFilteredCluster->__size <= 0) 1984*12720SWyllys.Ingersoll@Sun.COM { 1985*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_FILTER_CLUSTER_FAILED, 1986*12720SWyllys.Ingersoll@Sun.COM NULL, 1987*12720SWyllys.Ingersoll@Sun.COM NULL, 1988*12720SWyllys.Ingersoll@Sun.COM "returned cluster size is not positive"); 1989*12720SWyllys.Ingersoll@Sun.COM return false; 1990*12720SWyllys.Ingersoll@Sun.COM } 1991*12720SWyllys.Ingersoll@Sun.COM 1992*12720SWyllys.Ingersoll@Sun.COM // copy response cluster members 1993*12720SWyllys.Ingersoll@Sun.COM for (int i = 0; i < io_stFilteredCluster->__size; i++) 1994*12720SWyllys.Ingersoll@Sun.COM { 1995*12720SWyllys.Ingersoll@Sun.COM bool bSuccess = true; 1996*12720SWyllys.Ingersoll@Sun.COM 1997*12720SWyllys.Ingersoll@Sun.COM size_t iKMANameSize = 0, iKMASiteIDSize = 0, iKMAHostNameSize = 0, 1998*12720SWyllys.Ingersoll@Sun.COM iKMANetworkAddressSize = 0, iKMAVersionSize = 0, iKMAHostNameIPv6Size = 0, 1999*12720SWyllys.Ingersoll@Sun.COM iKMANetworkAddressIPv6Size = 0; 2000*12720SWyllys.Ingersoll@Sun.COM 2001*12720SWyllys.Ingersoll@Sun.COM // allocate storage for the various struct member's arrays 2002*12720SWyllys.Ingersoll@Sun.COM iKMANameSize = strlen(i_stResponse->ArrayOfClusterMembers.__ptr[i].KMAName)+1; 2003*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMAName = reinterpret_cast <char *> (malloc(iKMANameSize)); 2004*12720SWyllys.Ingersoll@Sun.COM 2005*12720SWyllys.Ingersoll@Sun.COM iKMASiteIDSize = strlen(i_stResponse->ArrayOfClusterMembers.__ptr[i].KMASiteID)+1; 2006*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMASiteID = reinterpret_cast <char *> (malloc(iKMASiteIDSize)); 2007*12720SWyllys.Ingersoll@Sun.COM 2008*12720SWyllys.Ingersoll@Sun.COM iKMAHostNameSize = strlen(i_stResponse->ArrayOfClusterMembers.__ptr[i].KMAHostName)+1; 2009*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMAHostName = reinterpret_cast <char *> (malloc(iKMAHostNameSize)); 2010*12720SWyllys.Ingersoll@Sun.COM 2011*12720SWyllys.Ingersoll@Sun.COM iKMANetworkAddressSize = strlen(i_stResponse->ArrayOfClusterMembers.__ptr[i].KMANetworkAddress)+1; 2012*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMANetworkAddress = reinterpret_cast <char *> (malloc(iKMANetworkAddressSize)); 2013*12720SWyllys.Ingersoll@Sun.COM 2014*12720SWyllys.Ingersoll@Sun.COM // KMAVersion is an optional field derived from an xml attribute in the soap interface that will not be present in 2.0 KMAs 2015*12720SWyllys.Ingersoll@Sun.COM if (i_stResponse->ArrayOfClusterMembers.__ptr[i].KMAVersion) 2016*12720SWyllys.Ingersoll@Sun.COM { 2017*12720SWyllys.Ingersoll@Sun.COM iKMAVersionSize = strlen(i_stResponse->ArrayOfClusterMembers.__ptr[i].KMAVersion)+1; 2018*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMAVersion = reinterpret_cast <char *> (malloc(iKMAVersionSize)); 2019*12720SWyllys.Ingersoll@Sun.COM if (io_stFilteredCluster->__ptr[i].KMAVersion == NULL) 2020*12720SWyllys.Ingersoll@Sun.COM { 2021*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 2022*12720SWyllys.Ingersoll@Sun.COM } 2023*12720SWyllys.Ingersoll@Sun.COM } 2024*12720SWyllys.Ingersoll@Sun.COM else 2025*12720SWyllys.Ingersoll@Sun.COM { 2026*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMAVersion = NULL; 2027*12720SWyllys.Ingersoll@Sun.COM } 2028*12720SWyllys.Ingersoll@Sun.COM 2029*12720SWyllys.Ingersoll@Sun.COM // KMAHostNameIPv6 is an optional field derived from an xml attribute in the soap interface that will not be present in 2.0 KMAs 2030*12720SWyllys.Ingersoll@Sun.COM if (i_stResponse->ArrayOfClusterMembers.__ptr[i].KMAHostNameIPv6) 2031*12720SWyllys.Ingersoll@Sun.COM { 2032*12720SWyllys.Ingersoll@Sun.COM iKMAHostNameIPv6Size = strlen(i_stResponse->ArrayOfClusterMembers.__ptr[i].KMAHostNameIPv6)+1; 2033*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMAHostNameIPv6 = reinterpret_cast <char *> (malloc(iKMAHostNameIPv6Size)); 2034*12720SWyllys.Ingersoll@Sun.COM if ( io_stFilteredCluster->__ptr[i].KMAHostNameIPv6 == NULL ) 2035*12720SWyllys.Ingersoll@Sun.COM { 2036*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 2037*12720SWyllys.Ingersoll@Sun.COM } 2038*12720SWyllys.Ingersoll@Sun.COM } 2039*12720SWyllys.Ingersoll@Sun.COM else 2040*12720SWyllys.Ingersoll@Sun.COM { 2041*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMAHostNameIPv6 = NULL; 2042*12720SWyllys.Ingersoll@Sun.COM } 2043*12720SWyllys.Ingersoll@Sun.COM 2044*12720SWyllys.Ingersoll@Sun.COM // KMANetworkAddressIPv6 is an optional field derived from an xml attribute in the soap interface that will not be present in 2.0 KMAs 2045*12720SWyllys.Ingersoll@Sun.COM if (i_stResponse->ArrayOfClusterMembers.__ptr[i].KMANetworkAddressIPv6) 2046*12720SWyllys.Ingersoll@Sun.COM { 2047*12720SWyllys.Ingersoll@Sun.COM iKMANetworkAddressIPv6Size = strlen(i_stResponse->ArrayOfClusterMembers.__ptr[i].KMANetworkAddressIPv6)+1; 2048*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMANetworkAddressIPv6 = reinterpret_cast <char *> (malloc(iKMANetworkAddressIPv6Size)); 2049*12720SWyllys.Ingersoll@Sun.COM if ( io_stFilteredCluster->__ptr[i].KMANetworkAddressIPv6 == NULL ) 2050*12720SWyllys.Ingersoll@Sun.COM { 2051*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 2052*12720SWyllys.Ingersoll@Sun.COM } 2053*12720SWyllys.Ingersoll@Sun.COM } 2054*12720SWyllys.Ingersoll@Sun.COM else 2055*12720SWyllys.Ingersoll@Sun.COM { 2056*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMANetworkAddressIPv6 = NULL; 2057*12720SWyllys.Ingersoll@Sun.COM } 2058*12720SWyllys.Ingersoll@Sun.COM 2059*12720SWyllys.Ingersoll@Sun.COM if ( io_stFilteredCluster->__ptr[i].KMAName == NULL || 2060*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMASiteID == NULL || 2061*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMAHostName == NULL || 2062*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMANetworkAddress == NULL || 2063*12720SWyllys.Ingersoll@Sun.COM !bSuccess ) 2064*12720SWyllys.Ingersoll@Sun.COM { 2065*12720SWyllys.Ingersoll@Sun.COM // cleanup and return 2066*12720SWyllys.Ingersoll@Sun.COM FreeFilteredCluster( io_stFilteredCluster, i+1 ); 2067*12720SWyllys.Ingersoll@Sun.COM Log( AUDIT_CLIENT_FILTER_CLUSTER_FAILED, 2068*12720SWyllys.Ingersoll@Sun.COM NULL, 2069*12720SWyllys.Ingersoll@Sun.COM NULL, 2070*12720SWyllys.Ingersoll@Sun.COM "malloc failed" ); 2071*12720SWyllys.Ingersoll@Sun.COM return false; 2072*12720SWyllys.Ingersoll@Sun.COM } 2073*12720SWyllys.Ingersoll@Sun.COM 2074*12720SWyllys.Ingersoll@Sun.COM strncpy(io_stFilteredCluster->__ptr[i].KMAName, 2075*12720SWyllys.Ingersoll@Sun.COM i_stResponse->ArrayOfClusterMembers.__ptr[i].KMAName, 2076*12720SWyllys.Ingersoll@Sun.COM iKMANameSize); 2077*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMAName[iKMANameSize-1] = '\0'; 2078*12720SWyllys.Ingersoll@Sun.COM 2079*12720SWyllys.Ingersoll@Sun.COM strncpy(io_stFilteredCluster->__ptr[i].KMASiteID, 2080*12720SWyllys.Ingersoll@Sun.COM i_stResponse->ArrayOfClusterMembers.__ptr[i].KMASiteID, 2081*12720SWyllys.Ingersoll@Sun.COM iKMASiteIDSize); 2082*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMASiteID[iKMASiteIDSize-1] = '\0'; 2083*12720SWyllys.Ingersoll@Sun.COM 2084*12720SWyllys.Ingersoll@Sun.COM strncpy(io_stFilteredCluster->__ptr[i].KMAHostName, 2085*12720SWyllys.Ingersoll@Sun.COM i_stResponse->ArrayOfClusterMembers.__ptr[i].KMAHostName, 2086*12720SWyllys.Ingersoll@Sun.COM iKMAHostNameSize); 2087*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMAHostName[iKMAHostNameSize-1] = '\0'; 2088*12720SWyllys.Ingersoll@Sun.COM 2089*12720SWyllys.Ingersoll@Sun.COM strncpy(io_stFilteredCluster->__ptr[i].KMANetworkAddress, 2090*12720SWyllys.Ingersoll@Sun.COM i_stResponse->ArrayOfClusterMembers.__ptr[i].KMANetworkAddress, 2091*12720SWyllys.Ingersoll@Sun.COM iKMANetworkAddressSize); 2092*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMANetworkAddress[iKMANetworkAddressSize-1] = '\0'; 2093*12720SWyllys.Ingersoll@Sun.COM 2094*12720SWyllys.Ingersoll@Sun.COM if ( io_stFilteredCluster->__ptr[i].KMAVersion ) 2095*12720SWyllys.Ingersoll@Sun.COM { 2096*12720SWyllys.Ingersoll@Sun.COM strncpy( io_stFilteredCluster->__ptr[i].KMAVersion, 2097*12720SWyllys.Ingersoll@Sun.COM i_stResponse->ArrayOfClusterMembers.__ptr[i].KMAVersion, 2098*12720SWyllys.Ingersoll@Sun.COM iKMAVersionSize ); 2099*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMAVersion[iKMAVersionSize-1] = '\0'; 2100*12720SWyllys.Ingersoll@Sun.COM } 2101*12720SWyllys.Ingersoll@Sun.COM 2102*12720SWyllys.Ingersoll@Sun.COM if (io_stFilteredCluster->__ptr[i].KMAHostNameIPv6) 2103*12720SWyllys.Ingersoll@Sun.COM { 2104*12720SWyllys.Ingersoll@Sun.COM strncpy(io_stFilteredCluster->__ptr[i].KMAHostNameIPv6, 2105*12720SWyllys.Ingersoll@Sun.COM i_stResponse->ArrayOfClusterMembers.__ptr[i].KMAHostNameIPv6, 2106*12720SWyllys.Ingersoll@Sun.COM iKMAHostNameIPv6Size); 2107*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMAHostNameIPv6[iKMAHostNameIPv6Size-1] = '\0'; 2108*12720SWyllys.Ingersoll@Sun.COM } 2109*12720SWyllys.Ingersoll@Sun.COM 2110*12720SWyllys.Ingersoll@Sun.COM if ( io_stFilteredCluster->__ptr[i].KMANetworkAddressIPv6 ) 2111*12720SWyllys.Ingersoll@Sun.COM { 2112*12720SWyllys.Ingersoll@Sun.COM strncpy( io_stFilteredCluster->__ptr[i].KMANetworkAddressIPv6, 2113*12720SWyllys.Ingersoll@Sun.COM i_stResponse->ArrayOfClusterMembers.__ptr[i].KMANetworkAddressIPv6, 2114*12720SWyllys.Ingersoll@Sun.COM iKMANetworkAddressIPv6Size ); 2115*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMANetworkAddressIPv6[iKMANetworkAddressIPv6Size-1] = '\0'; 2116*12720SWyllys.Ingersoll@Sun.COM } 2117*12720SWyllys.Ingersoll@Sun.COM 2118*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMAID = i_stResponse->ArrayOfClusterMembers.__ptr[i].KMAID; 2119*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].Enabled = i_stResponse->ArrayOfClusterMembers.__ptr[i].Enabled; 2120*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMS_Discovery__Locked = i_stResponse->ArrayOfClusterMembers.__ptr[i].KMS_Discovery__Locked; 2121*12720SWyllys.Ingersoll@Sun.COM 2122*12720SWyllys.Ingersoll@Sun.COM // set load to zero, KMA with version <= Build600 don't initialize 2123*12720SWyllys.Ingersoll@Sun.COM // the load field from the service network 2124*12720SWyllys.Ingersoll@Sun.COM if ( ( io_stFilteredCluster->__ptr[i].KMAVersion && 2125*12720SWyllys.Ingersoll@Sun.COM strcmp( io_stFilteredCluster->__ptr[i].KMAVersion, "Build600" ) <= 0 ) || 2126*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].KMAVersion == NULL ) 2127*12720SWyllys.Ingersoll@Sun.COM { 2128*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].Load = 0; 2129*12720SWyllys.Ingersoll@Sun.COM } 2130*12720SWyllys.Ingersoll@Sun.COM else 2131*12720SWyllys.Ingersoll@Sun.COM { 2132*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].Load = i_stResponse->ArrayOfClusterMembers.__ptr[i].Load; 2133*12720SWyllys.Ingersoll@Sun.COM } 2134*12720SWyllys.Ingersoll@Sun.COM 2135*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].Responding = i_stResponse->ArrayOfClusterMembers.__ptr[i].Responding; 2136*12720SWyllys.Ingersoll@Sun.COM 2137*12720SWyllys.Ingersoll@Sun.COM if (!bSuccess) 2138*12720SWyllys.Ingersoll@Sun.COM { 2139*12720SWyllys.Ingersoll@Sun.COM FreeFilteredCluster( io_stFilteredCluster, i ); 2140*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_FILTER_CLUSTER_FAILED, 2141*12720SWyllys.Ingersoll@Sun.COM NULL, 2142*12720SWyllys.Ingersoll@Sun.COM NULL, 2143*12720SWyllys.Ingersoll@Sun.COM "cluster member copy failed"); 2144*12720SWyllys.Ingersoll@Sun.COM return false; 2145*12720SWyllys.Ingersoll@Sun.COM } 2146*12720SWyllys.Ingersoll@Sun.COM } 2147*12720SWyllys.Ingersoll@Sun.COM 2148*12720SWyllys.Ingersoll@Sun.COM // is filtering necessary? 2149*12720SWyllys.Ingersoll@Sun.COM if (io_stFilteredCluster->__size <= KMS_MAX_CLUSTER_NUM) 2150*12720SWyllys.Ingersoll@Sun.COM { 2151*12720SWyllys.Ingersoll@Sun.COM // no filtering required 2152*12720SWyllys.Ingersoll@Sun.COM return true; 2153*12720SWyllys.Ingersoll@Sun.COM } 2154*12720SWyllys.Ingersoll@Sun.COM else 2155*12720SWyllys.Ingersoll@Sun.COM { 2156*12720SWyllys.Ingersoll@Sun.COM char sMesg[100]; 2157*12720SWyllys.Ingersoll@Sun.COM K_snprintf(sMesg, sizeof (sMesg), "DiscoverCluster returned %d KMAs, filtering to %d ...", io_stFilteredCluster->__size, KMS_MAX_CLUSTER_NUM); 2158*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_FILTER_CLUSTER, 2159*12720SWyllys.Ingersoll@Sun.COM NULL, 2160*12720SWyllys.Ingersoll@Sun.COM NULL, 2161*12720SWyllys.Ingersoll@Sun.COM sMesg); 2162*12720SWyllys.Ingersoll@Sun.COM 2163*12720SWyllys.Ingersoll@Sun.COM } 2164*12720SWyllys.Ingersoll@Sun.COM 2165*12720SWyllys.Ingersoll@Sun.COM // adjust loads according to availability, site and FIPS compatibility 2166*12720SWyllys.Ingersoll@Sun.COM { 2167*12720SWyllys.Ingersoll@Sun.COM int i = 0; 2168*12720SWyllys.Ingersoll@Sun.COM for (; i < io_stFilteredCluster->__size; i++) 2169*12720SWyllys.Ingersoll@Sun.COM { 2170*12720SWyllys.Ingersoll@Sun.COM if (io_stFilteredCluster->__ptr[i].Enabled == false 2171*12720SWyllys.Ingersoll@Sun.COM || io_stFilteredCluster->__ptr[i].Responding == false 2172*12720SWyllys.Ingersoll@Sun.COM || io_stFilteredCluster->__ptr[i].KMS_Discovery__Locked == true) 2173*12720SWyllys.Ingersoll@Sun.COM { 2174*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].Load += 0x40; 2175*12720SWyllys.Ingersoll@Sun.COM } 2176*12720SWyllys.Ingersoll@Sun.COM 2177*12720SWyllys.Ingersoll@Sun.COM if (strcmp(io_stFilteredCluster->__ptr[i].KMASiteID, 2178*12720SWyllys.Ingersoll@Sun.COM i_stResponse->EntitySiteID) != 0) 2179*12720SWyllys.Ingersoll@Sun.COM { 2180*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].Load += 0x20; 2181*12720SWyllys.Ingersoll@Sun.COM 2182*12720SWyllys.Ingersoll@Sun.COM } 2183*12720SWyllys.Ingersoll@Sun.COM 2184*12720SWyllys.Ingersoll@Sun.COM if ( i_bFIPS && 2185*12720SWyllys.Ingersoll@Sun.COM !FIPScompatibleKMA(io_stFilteredCluster->__ptr[i].KMAVersion)) 2186*12720SWyllys.Ingersoll@Sun.COM { 2187*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i].Load += 0x80; 2188*12720SWyllys.Ingersoll@Sun.COM } 2189*12720SWyllys.Ingersoll@Sun.COM } 2190*12720SWyllys.Ingersoll@Sun.COM } 2191*12720SWyllys.Ingersoll@Sun.COM 2192*12720SWyllys.Ingersoll@Sun.COM // sort ascending by load 2193*12720SWyllys.Ingersoll@Sun.COM 2194*12720SWyllys.Ingersoll@Sun.COM // gnome sort: the simplest sort algoritm 2195*12720SWyllys.Ingersoll@Sun.COM { 2196*12720SWyllys.Ingersoll@Sun.COM int i = 0; 2197*12720SWyllys.Ingersoll@Sun.COM while (i < io_stFilteredCluster->__size) 2198*12720SWyllys.Ingersoll@Sun.COM { 2199*12720SWyllys.Ingersoll@Sun.COM if (i == 0 || io_stFilteredCluster->__ptr[i - 1].Load <= io_stFilteredCluster->__ptr[i].Load) 2200*12720SWyllys.Ingersoll@Sun.COM { 2201*12720SWyllys.Ingersoll@Sun.COM i++; 2202*12720SWyllys.Ingersoll@Sun.COM } 2203*12720SWyllys.Ingersoll@Sun.COM else 2204*12720SWyllys.Ingersoll@Sun.COM { 2205*12720SWyllys.Ingersoll@Sun.COM struct KMS_Discovery::KMS_Discovery_ClusterMember tmp = io_stFilteredCluster->__ptr[i]; 2206*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[i] = io_stFilteredCluster->__ptr[i - 1]; 2207*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__ptr[--i] = tmp; 2208*12720SWyllys.Ingersoll@Sun.COM } 2209*12720SWyllys.Ingersoll@Sun.COM } 2210*12720SWyllys.Ingersoll@Sun.COM } 2211*12720SWyllys.Ingersoll@Sun.COM 2212*12720SWyllys.Ingersoll@Sun.COM // now filter the list, freeing memory allocated for copied elements that are not being retained 2213*12720SWyllys.Ingersoll@Sun.COM { 2214*12720SWyllys.Ingersoll@Sun.COM int i=KMS_MAX_CLUSTER_NUM; 2215*12720SWyllys.Ingersoll@Sun.COM for (; i < io_stFilteredCluster->__size; i++) 2216*12720SWyllys.Ingersoll@Sun.COM { 2217*12720SWyllys.Ingersoll@Sun.COM free(io_stFilteredCluster->__ptr[i].KMAName); 2218*12720SWyllys.Ingersoll@Sun.COM free(io_stFilteredCluster->__ptr[i].KMASiteID); 2219*12720SWyllys.Ingersoll@Sun.COM free(io_stFilteredCluster->__ptr[i].KMAHostName); 2220*12720SWyllys.Ingersoll@Sun.COM free(io_stFilteredCluster->__ptr[i].KMANetworkAddress); 2221*12720SWyllys.Ingersoll@Sun.COM free(io_stFilteredCluster->__ptr[i].KMAVersion); 2222*12720SWyllys.Ingersoll@Sun.COM free(io_stFilteredCluster->__ptr[i].KMAHostNameIPv6); 2223*12720SWyllys.Ingersoll@Sun.COM free(io_stFilteredCluster->__ptr[i].KMANetworkAddressIPv6); 2224*12720SWyllys.Ingersoll@Sun.COM } 2225*12720SWyllys.Ingersoll@Sun.COM } 2226*12720SWyllys.Ingersoll@Sun.COM 2227*12720SWyllys.Ingersoll@Sun.COM io_stFilteredCluster->__size = KMS_MAX_CLUSTER_NUM; 2228*12720SWyllys.Ingersoll@Sun.COM 2229*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_FILTER_CLUSTER, 2230*12720SWyllys.Ingersoll@Sun.COM NULL, 2231*12720SWyllys.Ingersoll@Sun.COM NULL, 2232*12720SWyllys.Ingersoll@Sun.COM "success"); 2233*12720SWyllys.Ingersoll@Sun.COM 2234*12720SWyllys.Ingersoll@Sun.COM return true; 2235*12720SWyllys.Ingersoll@Sun.COM }; 2236*12720SWyllys.Ingersoll@Sun.COM 2237*12720SWyllys.Ingersoll@Sun.COM /*--------------------------------------------------------------------------- 2238*12720SWyllys.Ingersoll@Sun.COM * Function: KMSClient_GetClusterInformation 2239*12720SWyllys.Ingersoll@Sun.COM * 2240*12720SWyllys.Ingersoll@Sun.COM *--------------------------------------------------------------------------*/ 2241*12720SWyllys.Ingersoll@Sun.COM bool KMSClient_GetClusterInformation( 2242*12720SWyllys.Ingersoll@Sun.COM KMSClientProfile *i_pProfile, 2243*12720SWyllys.Ingersoll@Sun.COM utf8char *o_wsEntitySiteID, 2244*12720SWyllys.Ingersoll@Sun.COM int i_iEntitySiteIDSize, 2245*12720SWyllys.Ingersoll@Sun.COM int *o_pApplianceNum, 2246*12720SWyllys.Ingersoll@Sun.COM KMSClusterEntry *o_pClusterEntryArray, 2247*12720SWyllys.Ingersoll@Sun.COM int i_iClusterEntryArraySize) 2248*12720SWyllys.Ingersoll@Sun.COM { 2249*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT(i_pProfile); 2250*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( o_wsEntitySiteID ); 2251*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( o_pApplianceNum ); 2252*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( o_pClusterEntryArray ); 2253*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( i_iEntitySiteIDSize <= KMS_MAX_ENTITY_ID+1 ); 2254*12720SWyllys.Ingersoll@Sun.COM 2255*12720SWyllys.Ingersoll@Sun.COM CAutoMutex oAutoMutex( (K_MUTEX_HANDLE)i_pProfile->m_pLock ); 2256*12720SWyllys.Ingersoll@Sun.COM 2257*12720SWyllys.Ingersoll@Sun.COM bool bSuccess = true; 2258*12720SWyllys.Ingersoll@Sun.COM char sSoapFaultMsg[g_iMAX_SOAP_FAULT_MESSAGE_LENGTH]; 2259*12720SWyllys.Ingersoll@Sun.COM char sKmaAddress[g_iMAX_PEER_NETWORK_ADDRESS_LENGTH]; 2260*12720SWyllys.Ingersoll@Sun.COM 2261*12720SWyllys.Ingersoll@Sun.COM char sURL[KMS_MAX_URL+1]; 2262*12720SWyllys.Ingersoll@Sun.COM 2263*12720SWyllys.Ingersoll@Sun.COM // set URL from the initial appliance address 2264*12720SWyllys.Ingersoll@Sun.COM utf8cstr sApplianceAddress = i_pProfile->m_wsApplianceAddress; 2265*12720SWyllys.Ingersoll@Sun.COM 2266*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 2267*12720SWyllys.Ingersoll@Sun.COM log_printf("KMSClient_GetClusterInformation : entered"); 2268*12720SWyllys.Ingersoll@Sun.COM #endif 2269*12720SWyllys.Ingersoll@Sun.COM 2270*12720SWyllys.Ingersoll@Sun.COM K_snprintf(sURL, 2271*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_URL, 2272*12720SWyllys.Ingersoll@Sun.COM "https://%s:%d", 2273*12720SWyllys.Ingersoll@Sun.COM sApplianceAddress, 2274*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_iPortForDiscoveryService); 2275*12720SWyllys.Ingersoll@Sun.COM strncpy(i_pProfile->m_sURL, sURL, KMS_MAX_URL); 2276*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_sURL[KMS_MAX_URL] = 0; 2277*12720SWyllys.Ingersoll@Sun.COM 2278*12720SWyllys.Ingersoll@Sun.COM // allocate and initialize a new soap env for the cluster discovery call 2279*12720SWyllys.Ingersoll@Sun.COM struct soap *pstSoap = (struct soap*)i_pProfile->m_pvDiscoverySoap; 2280*12720SWyllys.Ingersoll@Sun.COM 2281*12720SWyllys.Ingersoll@Sun.COM if ( !i_pProfile->m_iEnrolled ) 2282*12720SWyllys.Ingersoll@Sun.COM { 2283*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 2284*12720SWyllys.Ingersoll@Sun.COM } 2285*12720SWyllys.Ingersoll@Sun.COM 2286*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 2287*12720SWyllys.Ingersoll@Sun.COM { 2288*12720SWyllys.Ingersoll@Sun.COM // allocate discovery soap runtime 2289*12720SWyllys.Ingersoll@Sun.COM if (pstSoap == NULL ) 2290*12720SWyllys.Ingersoll@Sun.COM { 2291*12720SWyllys.Ingersoll@Sun.COM pstSoap = soap_new(); 2292*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_pvDiscoverySoap = pstSoap; 2293*12720SWyllys.Ingersoll@Sun.COM /* soap_copy results in a segfault in sk_free() within libcrytpo.so 2294*12720SWyllys.Ingersoll@Sun.COM pstSoap = soap_copy( (soap*)i_pProfile->m_pvSoap ); 2295*12720SWyllys.Ingersoll@Sun.COM */ 2296*12720SWyllys.Ingersoll@Sun.COM if (pstSoap == NULL) 2297*12720SWyllys.Ingersoll@Sun.COM { 2298*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 2299*12720SWyllys.Ingersoll@Sun.COM } 2300*12720SWyllys.Ingersoll@Sun.COM else 2301*12720SWyllys.Ingersoll@Sun.COM { 2302*12720SWyllys.Ingersoll@Sun.COM pstSoap->connect_timeout = i_pProfile->m_iTransactionTimeout; 2303*12720SWyllys.Ingersoll@Sun.COM pstSoap->send_timeout = i_pProfile->m_iTransactionTimeout; 2304*12720SWyllys.Ingersoll@Sun.COM pstSoap->recv_timeout = i_pProfile->m_iTransactionTimeout; 2305*12720SWyllys.Ingersoll@Sun.COM 2306*12720SWyllys.Ingersoll@Sun.COM soap_set_imode( pstSoap, (SOAP_XML_STRICT | SOAP_C_UTFSTRING) ); 2307*12720SWyllys.Ingersoll@Sun.COM soap_set_omode( pstSoap, (SOAP_XML_STRICT | SOAP_C_UTFSTRING) ); 2308*12720SWyllys.Ingersoll@Sun.COM 2309*12720SWyllys.Ingersoll@Sun.COM soap_set_namespaces( pstSoap, KMS_Discovery_namespaces ); 2310*12720SWyllys.Ingersoll@Sun.COM bSuccess = K_soap_ssl_client_context( 2311*12720SWyllys.Ingersoll@Sun.COM i_pProfile, 2312*12720SWyllys.Ingersoll@Sun.COM pstSoap, 2313*12720SWyllys.Ingersoll@Sun.COM SOAP_SSL_REQUIRE_CLIENT_AUTHENTICATION 2314*12720SWyllys.Ingersoll@Sun.COM ) == SOAP_OK; 2315*12720SWyllys.Ingersoll@Sun.COM if ( !bSuccess ) 2316*12720SWyllys.Ingersoll@Sun.COM { 2317*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_GetClusterInformation, 2318*12720SWyllys.Ingersoll@Sun.COM NULL, 2319*12720SWyllys.Ingersoll@Sun.COM NULL, 2320*12720SWyllys.Ingersoll@Sun.COM "K_soap_ssl_client_context failed"); 2321*12720SWyllys.Ingersoll@Sun.COM soap_destroy(pstSoap); 2322*12720SWyllys.Ingersoll@Sun.COM soap_end(pstSoap); 2323*12720SWyllys.Ingersoll@Sun.COM soap_done(pstSoap); 2324*12720SWyllys.Ingersoll@Sun.COM } 2325*12720SWyllys.Ingersoll@Sun.COM } 2326*12720SWyllys.Ingersoll@Sun.COM } 2327*12720SWyllys.Ingersoll@Sun.COM } 2328*12720SWyllys.Ingersoll@Sun.COM 2329*12720SWyllys.Ingersoll@Sun.COM // Discovery 2330*12720SWyllys.Ingersoll@Sun.COM struct KMS_Discovery::KMS_Discovery__DiscoverClusterResponse stResponse; 2331*12720SWyllys.Ingersoll@Sun.COM 2332*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 2333*12720SWyllys.Ingersoll@Sun.COM log_printf("KMSClient_GetClusterInformation : call KMS_Discovery_DiscoverCluster"); 2334*12720SWyllys.Ingersoll@Sun.COM #endif 2335*12720SWyllys.Ingersoll@Sun.COM 2336*12720SWyllys.Ingersoll@Sun.COM // SOAP - discover cluster 2337*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 2338*12720SWyllys.Ingersoll@Sun.COM { 2339*12720SWyllys.Ingersoll@Sun.COM #ifdef DEBUG 2340*12720SWyllys.Ingersoll@Sun.COM int iStartTickCount = K_GetTickCount(); 2341*12720SWyllys.Ingersoll@Sun.COM int iEndTickCount; 2342*12720SWyllys.Ingersoll@Sun.COM char sDiscoverTimeMsg[100]; 2343*12720SWyllys.Ingersoll@Sun.COM #endif 2344*12720SWyllys.Ingersoll@Sun.COM bSuccess = 2345*12720SWyllys.Ingersoll@Sun.COM KMS_Discovery::soap_call_KMS_Discovery__DiscoverCluster( 2346*12720SWyllys.Ingersoll@Sun.COM pstSoap, 2347*12720SWyllys.Ingersoll@Sun.COM sURL, 2348*12720SWyllys.Ingersoll@Sun.COM NULL, 2349*12720SWyllys.Ingersoll@Sun.COM NULL, 2350*12720SWyllys.Ingersoll@Sun.COM stResponse ) == SOAP_OK; 2351*12720SWyllys.Ingersoll@Sun.COM #ifdef DEBUG 2352*12720SWyllys.Ingersoll@Sun.COM iEndTickCount = K_GetTickCount(); 2353*12720SWyllys.Ingersoll@Sun.COM sprintf(sDiscoverTimeMsg, "DiscoverCluster soapcall elapsed time=%u ms", 2354*12720SWyllys.Ingersoll@Sun.COM iEndTickCount-iStartTickCount); 2355*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_GetClusterInformation, 2356*12720SWyllys.Ingersoll@Sun.COM NULL, 2357*12720SWyllys.Ingersoll@Sun.COM sApplianceAddress, 2358*12720SWyllys.Ingersoll@Sun.COM sDiscoverTimeMsg); 2359*12720SWyllys.Ingersoll@Sun.COM #endif 2360*12720SWyllys.Ingersoll@Sun.COM 2361*12720SWyllys.Ingersoll@Sun.COM if ( !bSuccess ) 2362*12720SWyllys.Ingersoll@Sun.COM { 2363*12720SWyllys.Ingersoll@Sun.COM GetSoapFault(sSoapFaultMsg, (struct soap*)pstSoap); 2364*12720SWyllys.Ingersoll@Sun.COM GetPeerNetworkAddress(sKmaAddress, pstSoap); 2365*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile,AUDIT_CLIENT_GET_CLUSTER_INFORMATION_SOAP_ERROR, 2366*12720SWyllys.Ingersoll@Sun.COM NULL, 2367*12720SWyllys.Ingersoll@Sun.COM sKmaAddress, 2368*12720SWyllys.Ingersoll@Sun.COM sSoapFaultMsg ); 2369*12720SWyllys.Ingersoll@Sun.COM 2370*12720SWyllys.Ingersoll@Sun.COM if ( !ServerError( sSoapFaultMsg, pstSoap->errnum ) ) 2371*12720SWyllys.Ingersoll@Sun.COM { 2372*12720SWyllys.Ingersoll@Sun.COM // do not failover if error is client related 2373*12720SWyllys.Ingersoll@Sun.COM soap_destroy( pstSoap ); 2374*12720SWyllys.Ingersoll@Sun.COM soap_end( pstSoap ); 2375*12720SWyllys.Ingersoll@Sun.COM soap_free( pstSoap ); 2376*12720SWyllys.Ingersoll@Sun.COM return false; 2377*12720SWyllys.Ingersoll@Sun.COM } 2378*12720SWyllys.Ingersoll@Sun.COM } 2379*12720SWyllys.Ingersoll@Sun.COM 2380*12720SWyllys.Ingersoll@Sun.COM // If we did not succeed to Discover from the initial appliance, 2381*12720SWyllys.Ingersoll@Sun.COM // try to discover from other appliances that we know about that are enabled. 2382*12720SWyllys.Ingersoll@Sun.COM // Disabled Appliances are not attempted because they may have a stale view 2383*12720SWyllys.Ingersoll@Sun.COM // of the cluster. In particular, they themselves are not aware that they 2384*12720SWyllys.Ingersoll@Sun.COM // are disabled. 2385*12720SWyllys.Ingersoll@Sun.COM 2386*12720SWyllys.Ingersoll@Sun.COM if ( !bSuccess && i_pProfile->m_iClusterNum > 0 ) 2387*12720SWyllys.Ingersoll@Sun.COM { 2388*12720SWyllys.Ingersoll@Sun.COM // Copy the profile's cluster array so that we don't have to lock the 2389*12720SWyllys.Ingersoll@Sun.COM // profile around a SOAP call 2390*12720SWyllys.Ingersoll@Sun.COM 2391*12720SWyllys.Ingersoll@Sun.COM int j = 0; 2392*12720SWyllys.Ingersoll@Sun.COM int iClusterNum = 0; 2393*12720SWyllys.Ingersoll@Sun.COM KMSClusterEntry* aCluster = 2394*12720SWyllys.Ingersoll@Sun.COM (KMSClusterEntry*)malloc(sizeof(KMSClusterEntry) * KMS_MAX_CLUSTER_NUM); 2395*12720SWyllys.Ingersoll@Sun.COM 2396*12720SWyllys.Ingersoll@Sun.COM bSuccess = ( aCluster != 0 ); 2397*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 2398*12720SWyllys.Ingersoll@Sun.COM if (!bSuccess) 2399*12720SWyllys.Ingersoll@Sun.COM log_printf("Malloc %x aCluster returned null\n", 2400*12720SWyllys.Ingersoll@Sun.COM sizeof(KMSClusterEntry) * KMS_MAX_CLUSTER_NUM); 2401*12720SWyllys.Ingersoll@Sun.COM #endif 2402*12720SWyllys.Ingersoll@Sun.COM 2403*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 2404*12720SWyllys.Ingersoll@Sun.COM { 2405*12720SWyllys.Ingersoll@Sun.COM iClusterNum = i_pProfile->m_iClusterNum; 2406*12720SWyllys.Ingersoll@Sun.COM memcpy( aCluster, i_pProfile->m_aCluster, 2407*12720SWyllys.Ingersoll@Sun.COM sizeof(KMSClusterEntry) * iClusterNum ); 2408*12720SWyllys.Ingersoll@Sun.COM 2409*12720SWyllys.Ingersoll@Sun.COM // initialize to false since all KMAs could be disabled 2410*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 2411*12720SWyllys.Ingersoll@Sun.COM for ( j = 0; j < iClusterNum; j++ ) 2412*12720SWyllys.Ingersoll@Sun.COM { 2413*12720SWyllys.Ingersoll@Sun.COM if ( aCluster[j].m_iEnabled == FALSE ) 2414*12720SWyllys.Ingersoll@Sun.COM { 2415*12720SWyllys.Ingersoll@Sun.COM continue; 2416*12720SWyllys.Ingersoll@Sun.COM } 2417*12720SWyllys.Ingersoll@Sun.COM 2418*12720SWyllys.Ingersoll@Sun.COM sApplianceAddress = aCluster[j].m_wsApplianceNetworkAddress; 2419*12720SWyllys.Ingersoll@Sun.COM K_snprintf(sURL, 2420*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_URL, 2421*12720SWyllys.Ingersoll@Sun.COM "https://%s:%d", 2422*12720SWyllys.Ingersoll@Sun.COM sApplianceAddress, 2423*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_iPortForDiscoveryService); 2424*12720SWyllys.Ingersoll@Sun.COM 2425*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_GetClusterInformation, 2426*12720SWyllys.Ingersoll@Sun.COM NULL, 2427*12720SWyllys.Ingersoll@Sun.COM sApplianceAddress, 2428*12720SWyllys.Ingersoll@Sun.COM "Failing over and trying this appliance"); 2429*12720SWyllys.Ingersoll@Sun.COM 2430*12720SWyllys.Ingersoll@Sun.COM // SOAP - discover cluster 2431*12720SWyllys.Ingersoll@Sun.COM bSuccess = 2432*12720SWyllys.Ingersoll@Sun.COM KMS_Discovery::soap_call_KMS_Discovery__DiscoverCluster( 2433*12720SWyllys.Ingersoll@Sun.COM pstSoap, 2434*12720SWyllys.Ingersoll@Sun.COM sURL, 2435*12720SWyllys.Ingersoll@Sun.COM NULL, 2436*12720SWyllys.Ingersoll@Sun.COM NULL, 2437*12720SWyllys.Ingersoll@Sun.COM stResponse ) == SOAP_OK; 2438*12720SWyllys.Ingersoll@Sun.COM 2439*12720SWyllys.Ingersoll@Sun.COM if ( !bSuccess ) 2440*12720SWyllys.Ingersoll@Sun.COM { 2441*12720SWyllys.Ingersoll@Sun.COM GetSoapFault(sSoapFaultMsg, (struct soap*)pstSoap); 2442*12720SWyllys.Ingersoll@Sun.COM GetPeerNetworkAddress(sKmaAddress, pstSoap); 2443*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile,AUDIT_CLIENT_GET_CLUSTER_INFORMATION_SOAP_ERROR, 2444*12720SWyllys.Ingersoll@Sun.COM NULL, 2445*12720SWyllys.Ingersoll@Sun.COM sKmaAddress, 2446*12720SWyllys.Ingersoll@Sun.COM sSoapFaultMsg ); 2447*12720SWyllys.Ingersoll@Sun.COM } 2448*12720SWyllys.Ingersoll@Sun.COM else 2449*12720SWyllys.Ingersoll@Sun.COM { 2450*12720SWyllys.Ingersoll@Sun.COM // The discover succeeded 2451*12720SWyllys.Ingersoll@Sun.COM break; 2452*12720SWyllys.Ingersoll@Sun.COM } 2453*12720SWyllys.Ingersoll@Sun.COM } 2454*12720SWyllys.Ingersoll@Sun.COM } 2455*12720SWyllys.Ingersoll@Sun.COM 2456*12720SWyllys.Ingersoll@Sun.COM if ( aCluster != 0 ) 2457*12720SWyllys.Ingersoll@Sun.COM { 2458*12720SWyllys.Ingersoll@Sun.COM free(aCluster); 2459*12720SWyllys.Ingersoll@Sun.COM } 2460*12720SWyllys.Ingersoll@Sun.COM 2461*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 2462*12720SWyllys.Ingersoll@Sun.COM { 2463*12720SWyllys.Ingersoll@Sun.COM // Set the Profile's initial appliance to the Appliance 2464*12720SWyllys.Ingersoll@Sun.COM // that we just succeeded to Discover from. KMSClient_SelectAppliance() 2465*12720SWyllys.Ingersoll@Sun.COM // persists the updated config 2466*12720SWyllys.Ingersoll@Sun.COM KMSClient_SelectAppliance( i_pProfile, 2467*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[j].m_wsApplianceNetworkAddress ); 2468*12720SWyllys.Ingersoll@Sun.COM } 2469*12720SWyllys.Ingersoll@Sun.COM } 2470*12720SWyllys.Ingersoll@Sun.COM } 2471*12720SWyllys.Ingersoll@Sun.COM 2472*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 2473*12720SWyllys.Ingersoll@Sun.COM { 2474*12720SWyllys.Ingersoll@Sun.COM if (((int)strlen(stResponse.EntitySiteID) > i_iEntitySiteIDSize - 1)) 2475*12720SWyllys.Ingersoll@Sun.COM { 2476*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 2477*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile,AUDIT_CLIENT_GET_CLUSTER_INFORMATION, 2478*12720SWyllys.Ingersoll@Sun.COM NULL, 2479*12720SWyllys.Ingersoll@Sun.COM NULL, 2480*12720SWyllys.Ingersoll@Sun.COM "returned site id size too large" ); 2481*12720SWyllys.Ingersoll@Sun.COM } 2482*12720SWyllys.Ingersoll@Sun.COM } 2483*12720SWyllys.Ingersoll@Sun.COM 2484*12720SWyllys.Ingersoll@Sun.COM // copy returned cluster information into i_pProfile->m_aCluster after 2485*12720SWyllys.Ingersoll@Sun.COM // filtering the cluster members to a list with size <= KMS_MAX_CLUSTER_NUM 2486*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess ) 2487*12720SWyllys.Ingersoll@Sun.COM { 2488*12720SWyllys.Ingersoll@Sun.COM KMS_Discovery::KMS_Discovery__ArrayOfClusterMembers aFilteredCluster; 2489*12720SWyllys.Ingersoll@Sun.COM 2490*12720SWyllys.Ingersoll@Sun.COM bSuccess = FilterCluster(&stResponse, i_pProfile->m_eKMSmode == FIPS_MODE, &aFilteredCluster); 2491*12720SWyllys.Ingersoll@Sun.COM if (!bSuccess ) 2492*12720SWyllys.Ingersoll@Sun.COM { 2493*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile, AUDIT_CLIENT_GET_CLUSTER_INFORMATION, 2494*12720SWyllys.Ingersoll@Sun.COM NULL, 2495*12720SWyllys.Ingersoll@Sun.COM NULL, 2496*12720SWyllys.Ingersoll@Sun.COM "cluster response filtering failed" ); 2497*12720SWyllys.Ingersoll@Sun.COM } 2498*12720SWyllys.Ingersoll@Sun.COM 2499*12720SWyllys.Ingersoll@Sun.COM if(bSuccess) 2500*12720SWyllys.Ingersoll@Sun.COM { 2501*12720SWyllys.Ingersoll@Sun.COM int i; 2502*12720SWyllys.Ingersoll@Sun.COM bool bPersistClusterConfig = ClusterConfigChanged(i_pProfile, 2503*12720SWyllys.Ingersoll@Sun.COM stResponse.EntitySiteID, 2504*12720SWyllys.Ingersoll@Sun.COM &aFilteredCluster); 2505*12720SWyllys.Ingersoll@Sun.COM 2506*12720SWyllys.Ingersoll@Sun.COM strncpy(o_wsEntitySiteID,stResponse.EntitySiteID, i_iEntitySiteIDSize-1 ); 2507*12720SWyllys.Ingersoll@Sun.COM o_wsEntitySiteID[i_iEntitySiteIDSize-1] = '\0'; 2508*12720SWyllys.Ingersoll@Sun.COM 2509*12720SWyllys.Ingersoll@Sun.COM strncpy(i_pProfile->m_wsEntitySiteID, stResponse.EntitySiteID, i_iEntitySiteIDSize-1 ); 2510*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_wsEntitySiteID[i_iEntitySiteIDSize-1] = '\0'; 2511*12720SWyllys.Ingersoll@Sun.COM 2512*12720SWyllys.Ingersoll@Sun.COM // fill the aCluster array in the i_pProfile 2513*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_iClusterNum = aFilteredCluster.__size; 2514*12720SWyllys.Ingersoll@Sun.COM for (i = 0; i < i_pProfile->m_iClusterNum; i++) 2515*12720SWyllys.Ingersoll@Sun.COM { 2516*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_lApplianceID = 2517*12720SWyllys.Ingersoll@Sun.COM (aFilteredCluster.__ptr+i)->KMAID; 2518*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_iEnabled = 2519*12720SWyllys.Ingersoll@Sun.COM (aFilteredCluster.__ptr+i)->Enabled; 2520*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_iResponding = 2521*12720SWyllys.Ingersoll@Sun.COM (aFilteredCluster.__ptr+i)->Responding; 2522*12720SWyllys.Ingersoll@Sun.COM 2523*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_lLoad = (aFilteredCluster.__ptr+i)->Load; 2524*12720SWyllys.Ingersoll@Sun.COM strncpy(i_pProfile->m_aCluster[i].m_wsApplianceAlias, 2525*12720SWyllys.Ingersoll@Sun.COM (aFilteredCluster.__ptr+i)->KMAName, 2526*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ENTITY_ID); 2527*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_wsApplianceAlias[KMS_MAX_ENTITY_ID] = '\0'; 2528*12720SWyllys.Ingersoll@Sun.COM // if the m_wsApplianceAddress is IPv6 then we'll store 2529*12720SWyllys.Ingersoll@Sun.COM // KMA IPv6 addresses if they have one 2530*12720SWyllys.Ingersoll@Sun.COM if ( strchr( i_pProfile->m_wsApplianceAddress, ':') ) 2531*12720SWyllys.Ingersoll@Sun.COM { 2532*12720SWyllys.Ingersoll@Sun.COM // KMAs prior to 2.1, or 2.1 KMAs at rep schema < 10 2533*12720SWyllys.Ingersoll@Sun.COM // will not have IPv6 attributes in the soap response 2534*12720SWyllys.Ingersoll@Sun.COM if ( (aFilteredCluster.__ptr+i)->KMANetworkAddressIPv6 && 2535*12720SWyllys.Ingersoll@Sun.COM ValidIPv6KMAaddress((aFilteredCluster.__ptr+i)->KMANetworkAddressIPv6)) 2536*12720SWyllys.Ingersoll@Sun.COM { 2537*12720SWyllys.Ingersoll@Sun.COM strcpy(i_pProfile->m_aCluster[i].m_wsApplianceNetworkAddress, "["); 2538*12720SWyllys.Ingersoll@Sun.COM char * pLoc = strchr((aFilteredCluster.__ptr+i)->KMANetworkAddressIPv6, 2539*12720SWyllys.Ingersoll@Sun.COM '/'); 2540*12720SWyllys.Ingersoll@Sun.COM if ( pLoc != NULL ) 2541*12720SWyllys.Ingersoll@Sun.COM { 2542*12720SWyllys.Ingersoll@Sun.COM // remove prefix from address 2543*12720SWyllys.Ingersoll@Sun.COM *pLoc = '\0'; 2544*12720SWyllys.Ingersoll@Sun.COM strcat(i_pProfile->m_aCluster[i].m_wsApplianceNetworkAddress, 2545*12720SWyllys.Ingersoll@Sun.COM (aFilteredCluster.__ptr+i)->KMANetworkAddressIPv6 ); 2546*12720SWyllys.Ingersoll@Sun.COM } 2547*12720SWyllys.Ingersoll@Sun.COM else 2548*12720SWyllys.Ingersoll@Sun.COM { 2549*12720SWyllys.Ingersoll@Sun.COM strcat(i_pProfile->m_aCluster[i].m_wsApplianceNetworkAddress, 2550*12720SWyllys.Ingersoll@Sun.COM (aFilteredCluster.__ptr + i)->KMANetworkAddressIPv6); 2551*12720SWyllys.Ingersoll@Sun.COM } 2552*12720SWyllys.Ingersoll@Sun.COM strcat(i_pProfile->m_aCluster[i].m_wsApplianceNetworkAddress, "]"); 2553*12720SWyllys.Ingersoll@Sun.COM } 2554*12720SWyllys.Ingersoll@Sun.COM else 2555*12720SWyllys.Ingersoll@Sun.COM { 2556*12720SWyllys.Ingersoll@Sun.COM // use the IPv4 address 2557*12720SWyllys.Ingersoll@Sun.COM strncpy(i_pProfile->m_aCluster[i].m_wsApplianceNetworkAddress, 2558*12720SWyllys.Ingersoll@Sun.COM (aFilteredCluster.__ptr+i)->KMANetworkAddress, 2559*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_NETWORK_ADDRESS); 2560*12720SWyllys.Ingersoll@Sun.COM } 2561*12720SWyllys.Ingersoll@Sun.COM } 2562*12720SWyllys.Ingersoll@Sun.COM else 2563*12720SWyllys.Ingersoll@Sun.COM { 2564*12720SWyllys.Ingersoll@Sun.COM strncpy(i_pProfile->m_aCluster[i].m_wsApplianceNetworkAddress, 2565*12720SWyllys.Ingersoll@Sun.COM (aFilteredCluster.__ptr+i)->KMANetworkAddress, 2566*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_NETWORK_ADDRESS); 2567*12720SWyllys.Ingersoll@Sun.COM } 2568*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_wsApplianceNetworkAddress[KMS_MAX_NETWORK_ADDRESS] = '\0'; 2569*12720SWyllys.Ingersoll@Sun.COM strncpy(i_pProfile->m_aCluster[i].m_wsApplianceSiteID, 2570*12720SWyllys.Ingersoll@Sun.COM (aFilteredCluster.__ptr+i)->KMASiteID, 2571*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ENTITY_SITE_ID); 2572*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_wsApplianceSiteID[KMS_MAX_ENTITY_SITE_ID] = '\0'; 2573*12720SWyllys.Ingersoll@Sun.COM 2574*12720SWyllys.Ingersoll@Sun.COM if ((aFilteredCluster.__ptr + i)->KMAVersion) 2575*12720SWyllys.Ingersoll@Sun.COM { 2576*12720SWyllys.Ingersoll@Sun.COM strncpy(i_pProfile->m_aCluster[i].m_sKMAVersion, 2577*12720SWyllys.Ingersoll@Sun.COM (aFilteredCluster.__ptr + i)->KMAVersion, 2578*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_VERSION_LENGTH); 2579*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_sKMAVersion[KMS_MAX_VERSION_LENGTH] = '\0'; 2580*12720SWyllys.Ingersoll@Sun.COM } 2581*12720SWyllys.Ingersoll@Sun.COM else 2582*12720SWyllys.Ingersoll@Sun.COM { 2583*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_sKMAVersion[0] = '\0'; 2584*12720SWyllys.Ingersoll@Sun.COM } 2585*12720SWyllys.Ingersoll@Sun.COM 2586*12720SWyllys.Ingersoll@Sun.COM if ((aFilteredCluster.__ptr + i)->KMS_Discovery__Locked) 2587*12720SWyllys.Ingersoll@Sun.COM { 2588*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_iKMALocked = TRUE; 2589*12720SWyllys.Ingersoll@Sun.COM } 2590*12720SWyllys.Ingersoll@Sun.COM else 2591*12720SWyllys.Ingersoll@Sun.COM { 2592*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_iKMALocked = FALSE; 2593*12720SWyllys.Ingersoll@Sun.COM } 2594*12720SWyllys.Ingersoll@Sun.COM } 2595*12720SWyllys.Ingersoll@Sun.COM 2596*12720SWyllys.Ingersoll@Sun.COM // now release malloc'd storage from filtering the cluster response 2597*12720SWyllys.Ingersoll@Sun.COM FreeFilteredCluster( &aFilteredCluster, aFilteredCluster.__size ); 2598*12720SWyllys.Ingersoll@Sun.COM 2599*12720SWyllys.Ingersoll@Sun.COM // fill the array specified by the caller 2600*12720SWyllys.Ingersoll@Sun.COM *o_pApplianceNum = i_pProfile->m_iClusterNum; 2601*12720SWyllys.Ingersoll@Sun.COM for (i = 0; i < i_pProfile->m_iClusterNum; i++) 2602*12720SWyllys.Ingersoll@Sun.COM { 2603*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_lApplianceID = i_pProfile->m_aCluster[i].m_lApplianceID; 2604*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_iEnabled = i_pProfile->m_aCluster[i].m_iEnabled; 2605*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_iResponding = i_pProfile->m_aCluster[i].m_iResponding; 2606*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_lLoad = i_pProfile->m_aCluster[i].m_lLoad; 2607*12720SWyllys.Ingersoll@Sun.COM strncpy(o_pClusterEntryArray[i].m_wsApplianceAlias, 2608*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_wsApplianceAlias, 2609*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ENTITY_ID); 2610*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_wsApplianceAlias[KMS_MAX_ENTITY_ID] = '\0'; 2611*12720SWyllys.Ingersoll@Sun.COM strncpy(o_pClusterEntryArray[i].m_wsApplianceNetworkAddress, 2612*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_wsApplianceNetworkAddress, 2613*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_NETWORK_ADDRESS); 2614*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_wsApplianceNetworkAddress[KMS_MAX_NETWORK_ADDRESS] = '\0'; 2615*12720SWyllys.Ingersoll@Sun.COM strncpy(o_pClusterEntryArray[i].m_wsApplianceSiteID, 2616*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_wsApplianceSiteID, 2617*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ENTITY_SITE_ID); 2618*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_wsApplianceSiteID[KMS_MAX_ENTITY_SITE_ID] = '\0'; 2619*12720SWyllys.Ingersoll@Sun.COM strncpy(o_pClusterEntryArray[i].m_sKMAVersion, i_pProfile->m_aCluster[i].m_sKMAVersion, 2620*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_VERSION_LENGTH); 2621*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_sKMAVersion[KMS_MAX_VERSION_LENGTH] = '\0'; 2622*12720SWyllys.Ingersoll@Sun.COM } 2623*12720SWyllys.Ingersoll@Sun.COM 2624*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_iLastClusterDiscoveryTime = K_GetTickCount() / 1000; 2625*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_bIsClusterDiscoveryCalled = true; 2626*12720SWyllys.Ingersoll@Sun.COM 2627*12720SWyllys.Ingersoll@Sun.COM if ( bPersistClusterConfig ) 2628*12720SWyllys.Ingersoll@Sun.COM { 2629*12720SWyllys.Ingersoll@Sun.COM bSuccess = StoreCluster(i_pProfile); 2630*12720SWyllys.Ingersoll@Sun.COM if (!bSuccess) 2631*12720SWyllys.Ingersoll@Sun.COM { 2632*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_GetClusterInformation, 2633*12720SWyllys.Ingersoll@Sun.COM NULL, 2634*12720SWyllys.Ingersoll@Sun.COM NULL, 2635*12720SWyllys.Ingersoll@Sun.COM "Could not store cluster"); 2636*12720SWyllys.Ingersoll@Sun.COM } 2637*12720SWyllys.Ingersoll@Sun.COM } 2638*12720SWyllys.Ingersoll@Sun.COM } 2639*12720SWyllys.Ingersoll@Sun.COM } 2640*12720SWyllys.Ingersoll@Sun.COM 2641*12720SWyllys.Ingersoll@Sun.COM // cleanup 2642*12720SWyllys.Ingersoll@Sun.COM if (pstSoap) 2643*12720SWyllys.Ingersoll@Sun.COM { 2644*12720SWyllys.Ingersoll@Sun.COM soap_destroy(pstSoap); 2645*12720SWyllys.Ingersoll@Sun.COM soap_end(pstSoap); 2646*12720SWyllys.Ingersoll@Sun.COM if (!bSuccess) 2647*12720SWyllys.Ingersoll@Sun.COM { 2648*12720SWyllys.Ingersoll@Sun.COM soap_free(pstSoap); 2649*12720SWyllys.Ingersoll@Sun.COM } 2650*12720SWyllys.Ingersoll@Sun.COM else 2651*12720SWyllys.Ingersoll@Sun.COM { 2652*12720SWyllys.Ingersoll@Sun.COM // we want to persist discovery soap runtime to avoid ssl handshakes so soap_free() is not called 2653*12720SWyllys.Ingersoll@Sun.COM } 2654*12720SWyllys.Ingersoll@Sun.COM } 2655*12720SWyllys.Ingersoll@Sun.COM 2656*12720SWyllys.Ingersoll@Sun.COM // if we're enrolled but cannot get cluster information from an appliance, then we'll try to load 2657*12720SWyllys.Ingersoll@Sun.COM // it from the profile 2658*12720SWyllys.Ingersoll@Sun.COM if ( !bSuccess && i_pProfile->m_iEnrolled ) 2659*12720SWyllys.Ingersoll@Sun.COM { 2660*12720SWyllys.Ingersoll@Sun.COM int bClusterInformationFound = false; 2661*12720SWyllys.Ingersoll@Sun.COM 2662*12720SWyllys.Ingersoll@Sun.COM bSuccess = LoadClusterInformation( i_pProfile, bClusterInformationFound ); 2663*12720SWyllys.Ingersoll@Sun.COM 2664*12720SWyllys.Ingersoll@Sun.COM if ( bSuccess && bClusterInformationFound ) 2665*12720SWyllys.Ingersoll@Sun.COM { 2666*12720SWyllys.Ingersoll@Sun.COM Log(AUDIT_CLIENT_GetClusterInformation, 2667*12720SWyllys.Ingersoll@Sun.COM NULL, 2668*12720SWyllys.Ingersoll@Sun.COM NULL, 2669*12720SWyllys.Ingersoll@Sun.COM "Using persisted cluster information"); 2670*12720SWyllys.Ingersoll@Sun.COM 2671*12720SWyllys.Ingersoll@Sun.COM strncpy(o_wsEntitySiteID, i_pProfile->m_wsEntitySiteID, i_iEntitySiteIDSize-1); 2672*12720SWyllys.Ingersoll@Sun.COM o_wsEntitySiteID[i_iEntitySiteIDSize-1] = '\0'; 2673*12720SWyllys.Ingersoll@Sun.COM 2674*12720SWyllys.Ingersoll@Sun.COM // fill the array specified by the caller 2675*12720SWyllys.Ingersoll@Sun.COM *o_pApplianceNum = i_pProfile->m_iClusterNum; 2676*12720SWyllys.Ingersoll@Sun.COM for (int i = 0; i < i_pProfile->m_iClusterNum; i++) 2677*12720SWyllys.Ingersoll@Sun.COM { 2678*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_lApplianceID = i_pProfile->m_aCluster[i].m_lApplianceID; 2679*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_iEnabled = i_pProfile->m_aCluster[i].m_iEnabled; 2680*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_iResponding = TRUE; // since cluster info comes from a file, set it to TRUE 2681*12720SWyllys.Ingersoll@Sun.COM 2682*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_lLoad = i_pProfile->m_aCluster[i].m_lLoad; 2683*12720SWyllys.Ingersoll@Sun.COM strncpy(o_pClusterEntryArray[i].m_wsApplianceAlias, 2684*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_wsApplianceAlias, 2685*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ENTITY_ID); 2686*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_wsApplianceAlias[KMS_MAX_ENTITY_ID] = '\0'; 2687*12720SWyllys.Ingersoll@Sun.COM strncpy(o_pClusterEntryArray[i].m_wsApplianceNetworkAddress, 2688*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_wsApplianceNetworkAddress, 2689*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_NETWORK_ADDRESS); 2690*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_wsApplianceNetworkAddress[KMS_MAX_NETWORK_ADDRESS] = '\0'; 2691*12720SWyllys.Ingersoll@Sun.COM strncpy(o_pClusterEntryArray[i].m_wsApplianceSiteID, 2692*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_wsApplianceSiteID, 2693*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_ENTITY_SITE_ID); 2694*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_wsApplianceSiteID[KMS_MAX_ENTITY_SITE_ID] = '\0'; 2695*12720SWyllys.Ingersoll@Sun.COM strncpy(o_pClusterEntryArray[i].m_sKMAVersion, 2696*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_aCluster[i].m_sKMAVersion, 2697*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_VERSION_LENGTH); 2698*12720SWyllys.Ingersoll@Sun.COM o_pClusterEntryArray[i].m_sKMAVersion[KMS_MAX_VERSION_LENGTH] = '\0'; 2699*12720SWyllys.Ingersoll@Sun.COM } 2700*12720SWyllys.Ingersoll@Sun.COM 2701*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_iLastClusterDiscoveryTime = K_GetTickCount() / 1000; 2702*12720SWyllys.Ingersoll@Sun.COM } 2703*12720SWyllys.Ingersoll@Sun.COM else if ( bSuccess && !bClusterInformationFound ) 2704*12720SWyllys.Ingersoll@Sun.COM { 2705*12720SWyllys.Ingersoll@Sun.COM // if we're here, then we need to return an error 2706*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 2707*12720SWyllys.Ingersoll@Sun.COM } 2708*12720SWyllys.Ingersoll@Sun.COM } 2709*12720SWyllys.Ingersoll@Sun.COM 2710*12720SWyllys.Ingersoll@Sun.COM return bSuccess; 2711*12720SWyllys.Ingersoll@Sun.COM } 2712*12720SWyllys.Ingersoll@Sun.COM 2713*12720SWyllys.Ingersoll@Sun.COM bool KMSClient_NoFIPSCompatibleKMAs(const KMSClientProfile * const i_pProfile) 2714*12720SWyllys.Ingersoll@Sun.COM { 2715*12720SWyllys.Ingersoll@Sun.COM bool bNoFIPScompatibleKMA = true; 2716*12720SWyllys.Ingersoll@Sun.COM for (int i=0; i < i_pProfile->m_iClusterNum; i++) 2717*12720SWyllys.Ingersoll@Sun.COM { 2718*12720SWyllys.Ingersoll@Sun.COM if ( FIPScompatibleKMA(i_pProfile->m_aCluster[i].m_sKMAVersion)) 2719*12720SWyllys.Ingersoll@Sun.COM { 2720*12720SWyllys.Ingersoll@Sun.COM bNoFIPScompatibleKMA = false; 2721*12720SWyllys.Ingersoll@Sun.COM break; 2722*12720SWyllys.Ingersoll@Sun.COM } 2723*12720SWyllys.Ingersoll@Sun.COM } 2724*12720SWyllys.Ingersoll@Sun.COM return bNoFIPScompatibleKMA; 2725*12720SWyllys.Ingersoll@Sun.COM } 2726*12720SWyllys.Ingersoll@Sun.COM 2727*12720SWyllys.Ingersoll@Sun.COM /*--------------------------------------------------------------------------- 2728*12720SWyllys.Ingersoll@Sun.COM * Function: KMSClient_SelectAppliance 2729*12720SWyllys.Ingersoll@Sun.COM * 2730*12720SWyllys.Ingersoll@Sun.COM *--------------------------------------------------------------------------*/ 2731*12720SWyllys.Ingersoll@Sun.COM bool KMSClient_SelectAppliance(KMSClientProfile *i_pProfile, 2732*12720SWyllys.Ingersoll@Sun.COM utf8char *i_wsApplianceAddress) 2733*12720SWyllys.Ingersoll@Sun.COM { 2734*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT(i_pProfile); 2735*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT(i_wsApplianceAddress); 2736*12720SWyllys.Ingersoll@Sun.COM 2737*12720SWyllys.Ingersoll@Sun.COM CAutoMutex oAutoMutex( (K_MUTEX_HANDLE)i_pProfile->m_pLock ); 2738*12720SWyllys.Ingersoll@Sun.COM 2739*12720SWyllys.Ingersoll@Sun.COM bool bSuccess = true; 2740*12720SWyllys.Ingersoll@Sun.COM 2741*12720SWyllys.Ingersoll@Sun.COM if(strlen(i_wsApplianceAddress) >= KMS_MAX_NETWORK_ADDRESS) 2742*12720SWyllys.Ingersoll@Sun.COM { 2743*12720SWyllys.Ingersoll@Sun.COM LogError(i_pProfile,AUDIT_CLIENT_SELECT_APPLIANCE, 2744*12720SWyllys.Ingersoll@Sun.COM NULL, 2745*12720SWyllys.Ingersoll@Sun.COM NULL, 2746*12720SWyllys.Ingersoll@Sun.COM "Appliance Address too large" ); 2747*12720SWyllys.Ingersoll@Sun.COM bSuccess = false; 2748*12720SWyllys.Ingersoll@Sun.COM } 2749*12720SWyllys.Ingersoll@Sun.COM 2750*12720SWyllys.Ingersoll@Sun.COM if(bSuccess) 2751*12720SWyllys.Ingersoll@Sun.COM { 2752*12720SWyllys.Ingersoll@Sun.COM strncpy(i_pProfile->m_wsApplianceAddress, 2753*12720SWyllys.Ingersoll@Sun.COM i_wsApplianceAddress, 2754*12720SWyllys.Ingersoll@Sun.COM KMS_MAX_NETWORK_ADDRESS); 2755*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_wsApplianceAddress[KMS_MAX_NETWORK_ADDRESS] = 0; 2756*12720SWyllys.Ingersoll@Sun.COM } 2757*12720SWyllys.Ingersoll@Sun.COM 2758*12720SWyllys.Ingersoll@Sun.COM bSuccess = StoreConfig( i_pProfile ); 2759*12720SWyllys.Ingersoll@Sun.COM 2760*12720SWyllys.Ingersoll@Sun.COM return bSuccess; 2761*12720SWyllys.Ingersoll@Sun.COM } 2762*12720SWyllys.Ingersoll@Sun.COM 2763*12720SWyllys.Ingersoll@Sun.COM bool KMSClient_ProfileLoaded( KMSClientProfile *i_pProfile ) 2764*12720SWyllys.Ingersoll@Sun.COM { 2765*12720SWyllys.Ingersoll@Sun.COM 2766*12720SWyllys.Ingersoll@Sun.COM #if defined(DEBUG) && defined(METAWARE) 2767*12720SWyllys.Ingersoll@Sun.COM log_printf ("profile: %x", i_pProfile); 2768*12720SWyllys.Ingersoll@Sun.COM log_printf ("profile: enrolled %x", i_pProfile->m_iEnrolled); 2769*12720SWyllys.Ingersoll@Sun.COM log_printf ("profile: version %x", i_pProfile->m_iVersion); 2770*12720SWyllys.Ingersoll@Sun.COM #endif 2771*12720SWyllys.Ingersoll@Sun.COM 2772*12720SWyllys.Ingersoll@Sun.COM // more extensive tests could be performed but this should suffice 2773*12720SWyllys.Ingersoll@Sun.COM if ( i_pProfile && 2774*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_iEnrolled && 2775*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_iVersion == KMS_AGENT_VERSION ) 2776*12720SWyllys.Ingersoll@Sun.COM { 2777*12720SWyllys.Ingersoll@Sun.COM return true; 2778*12720SWyllys.Ingersoll@Sun.COM } 2779*12720SWyllys.Ingersoll@Sun.COM else 2780*12720SWyllys.Ingersoll@Sun.COM { 2781*12720SWyllys.Ingersoll@Sun.COM return false; 2782*12720SWyllys.Ingersoll@Sun.COM } 2783*12720SWyllys.Ingersoll@Sun.COM } 2784*12720SWyllys.Ingersoll@Sun.COM 2785*12720SWyllys.Ingersoll@Sun.COM /*--------------------------------------------------------------------------- 2786*12720SWyllys.Ingersoll@Sun.COM * Function: KMSClient_DeleteProfile 2787*12720SWyllys.Ingersoll@Sun.COM * 2788*12720SWyllys.Ingersoll@Sun.COM *--------------------------------------------------------------------------*/ 2789*12720SWyllys.Ingersoll@Sun.COM bool KMSClient_DeleteProfile(utf8char *i_wsProfileName) 2790*12720SWyllys.Ingersoll@Sun.COM { 2791*12720SWyllys.Ingersoll@Sun.COM FATAL_ASSERT( i_wsProfileName && (strlen(i_wsProfileName) > 0) ); 2792*12720SWyllys.Ingersoll@Sun.COM 2793*12720SWyllys.Ingersoll@Sun.COM bool bSuccess = true; 2794*12720SWyllys.Ingersoll@Sun.COM 2795*12720SWyllys.Ingersoll@Sun.COM if (ProfileExists(g_wsWorkingDirectory, /* pass in default */ 2796*12720SWyllys.Ingersoll@Sun.COM i_wsProfileName)) 2797*12720SWyllys.Ingersoll@Sun.COM { 2798*12720SWyllys.Ingersoll@Sun.COM bSuccess = DeleteStorageProfile(i_wsProfileName); 2799*12720SWyllys.Ingersoll@Sun.COM } 2800*12720SWyllys.Ingersoll@Sun.COM 2801*12720SWyllys.Ingersoll@Sun.COM return bSuccess; 2802*12720SWyllys.Ingersoll@Sun.COM } 2803*12720SWyllys.Ingersoll@Sun.COM 2804*12720SWyllys.Ingersoll@Sun.COM /*--------------------------------------------------------------------------- 2805*12720SWyllys.Ingersoll@Sun.COM * Function: KMSClient_UnloadProfile 2806*12720SWyllys.Ingersoll@Sun.COM * 2807*12720SWyllys.Ingersoll@Sun.COM *--------------------------------------------------------------------------*/ 2808*12720SWyllys.Ingersoll@Sun.COM bool KMSClient_UnloadProfile(KMSClientProfile *i_pProfile) 2809*12720SWyllys.Ingersoll@Sun.COM { 2810*12720SWyllys.Ingersoll@Sun.COM if(i_pProfile != NULL && i_pProfile->m_pLock != NULL ) 2811*12720SWyllys.Ingersoll@Sun.COM { 2812*12720SWyllys.Ingersoll@Sun.COM #ifdef KMSUSERPKCS12 2813*12720SWyllys.Ingersoll@Sun.COM /* Delete the private client key file if it's still around */ 2814*12720SWyllys.Ingersoll@Sun.COM CleanupPrivateKeyFile(i_pProfile); 2815*12720SWyllys.Ingersoll@Sun.COM #endif 2816*12720SWyllys.Ingersoll@Sun.COM if (i_pProfile->m_pAgentLoadBalancer != NULL) 2817*12720SWyllys.Ingersoll@Sun.COM { 2818*12720SWyllys.Ingersoll@Sun.COM delete reinterpret_cast 2819*12720SWyllys.Ingersoll@Sun.COM <CAgentLoadBalancer *> (i_pProfile->m_pAgentLoadBalancer); 2820*12720SWyllys.Ingersoll@Sun.COM } 2821*12720SWyllys.Ingersoll@Sun.COM if (i_pProfile->m_pDataUnitCache != NULL) 2822*12720SWyllys.Ingersoll@Sun.COM { 2823*12720SWyllys.Ingersoll@Sun.COM delete reinterpret_cast<CDataUnitCache *> (i_pProfile->m_pDataUnitCache); 2824*12720SWyllys.Ingersoll@Sun.COM } 2825*12720SWyllys.Ingersoll@Sun.COM K_DestroyMutex((K_MUTEX_HANDLE)i_pProfile->m_pLock); 2826*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_pLock = 0; 2827*12720SWyllys.Ingersoll@Sun.COM 2828*12720SWyllys.Ingersoll@Sun.COM if ( i_pProfile->m_pvSoap ) 2829*12720SWyllys.Ingersoll@Sun.COM { 2830*12720SWyllys.Ingersoll@Sun.COM soap_destroy( (struct soap*)i_pProfile->m_pvSoap ); 2831*12720SWyllys.Ingersoll@Sun.COM soap_end( (struct soap*)i_pProfile->m_pvSoap ); 2832*12720SWyllys.Ingersoll@Sun.COM soap_done( (struct soap*)i_pProfile->m_pvSoap ); 2833*12720SWyllys.Ingersoll@Sun.COM 2834*12720SWyllys.Ingersoll@Sun.COM free( (struct soap*)i_pProfile->m_pvSoap ); 2835*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_pvSoap = 0; 2836*12720SWyllys.Ingersoll@Sun.COM } 2837*12720SWyllys.Ingersoll@Sun.COM 2838*12720SWyllys.Ingersoll@Sun.COM if ( i_pProfile->m_pvDiscoverySoap) 2839*12720SWyllys.Ingersoll@Sun.COM { 2840*12720SWyllys.Ingersoll@Sun.COM soap_destroy( (struct soap*)i_pProfile->m_pvDiscoverySoap ); 2841*12720SWyllys.Ingersoll@Sun.COM soap_end( (struct soap*)i_pProfile->m_pvDiscoverySoap ); 2842*12720SWyllys.Ingersoll@Sun.COM soap_done( (struct soap*)i_pProfile->m_pvDiscoverySoap ); 2843*12720SWyllys.Ingersoll@Sun.COM 2844*12720SWyllys.Ingersoll@Sun.COM free( (struct soap*)i_pProfile->m_pvDiscoverySoap ); 2845*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_pvDiscoverySoap = 0; 2846*12720SWyllys.Ingersoll@Sun.COM } 2847*12720SWyllys.Ingersoll@Sun.COM } 2848*12720SWyllys.Ingersoll@Sun.COM 2849*12720SWyllys.Ingersoll@Sun.COM i_pProfile->m_iEnrolled = FALSE; 2850*12720SWyllys.Ingersoll@Sun.COM 2851*12720SWyllys.Ingersoll@Sun.COM return true; /* always return true, maybe there are cases which return false in the future */ 2852*12720SWyllys.Ingersoll@Sun.COM } 2853*12720SWyllys.Ingersoll@Sun.COM 2854*12720SWyllys.Ingersoll@Sun.COM bool FIPScompatibleKMA( 2855*12720SWyllys.Ingersoll@Sun.COM const char * const i_sKMAVersion) { 2856*12720SWyllys.Ingersoll@Sun.COM return (strcmp(i_sKMAVersion, 2857*12720SWyllys.Ingersoll@Sun.COM FIPS_COMPATIBLE_KMA_VERSION) >= 0); 2858*12720SWyllys.Ingersoll@Sun.COM } 2859*12720SWyllys.Ingersoll@Sun.COM 2860*12720SWyllys.Ingersoll@Sun.COM #ifdef KMSUSERPKCS12 2861*12720SWyllys.Ingersoll@Sun.COM extern "C" 2862*12720SWyllys.Ingersoll@Sun.COM KMS_AGENT_STATUS 2863*12720SWyllys.Ingersoll@Sun.COM KMSAgent_GetProfileStatus( 2864*12720SWyllys.Ingersoll@Sun.COM char* i_pProfileName, 2865*12720SWyllys.Ingersoll@Sun.COM KMSAGENT_PROFILE_FLAGS *flags) 2866*12720SWyllys.Ingersoll@Sun.COM { 2867*12720SWyllys.Ingersoll@Sun.COM /* 2868*12720SWyllys.Ingersoll@Sun.COM * Determine how "initialized" the KMS token is by checking for 2869*12720SWyllys.Ingersoll@Sun.COM * the profile config file and also the entity key container (pkcs#12). 2870*12720SWyllys.Ingersoll@Sun.COM */ 2871*12720SWyllys.Ingersoll@Sun.COM if (ProfileExists(g_wsWorkingDirectory, i_pProfileName)) { 2872*12720SWyllys.Ingersoll@Sun.COM *flags |= KMSAGENT_PROFILE_EXISTS_FLAG; 2873*12720SWyllys.Ingersoll@Sun.COM if (ClientKeyP12Exists(i_pProfileName)) 2874*12720SWyllys.Ingersoll@Sun.COM *flags |= KMSAGENT_CLIENTKEY_EXISTS_FLAG; 2875*12720SWyllys.Ingersoll@Sun.COM } 2876*12720SWyllys.Ingersoll@Sun.COM return (KMS_AGENT_STATUS_OK); 2877*12720SWyllys.Ingersoll@Sun.COM } 2878*12720SWyllys.Ingersoll@Sun.COM #endif 2879