//Copyright (c) 1998 - 1999 Microsoft Corporation #include "precomp.h" #include "afxcoll.h" #if !defined(_WIN32_WINNT) #define _WIN32_WINNT 0x0400 #endif #include #include "tlsapip.h" #include "global.h" #include "utils.h" #include "assert.h" #include "lrwizapi.h" #include "lmcons.h" #include "lmerr.h" #include "lmserver.h" #include "trust.h" #include "chstruct.h" #include "lkplite.h" #include #define ACTIVATIONMETHOD_KEY "ACTIVATIONMETHOD" #define CSRNUMBER_KEY "CSRNUMBER" CGlobal::CGlobal() { m_hWndParent = NULL; m_hInstance = NULL; m_lpstrLSName = NULL; m_lpwstrLSName = NULL; m_lpstrCHServer = NULL; m_lpstrCHExtension = NULL; m_dwErrorCode = 0; m_pReqAttr = NULL; m_dwReqAttrCount = 0; m_pRegAttr = NULL; m_dwRegAttrCount = NULL; m_dwLSStatus = LSERVERSTATUS_UNREGISTER; m_ContactData.Initialize(); m_LicData.Initialize(); m_ActivationMethod = CONNECTION_INTERNET; m_dwExchangeCertificateLen = 0; m_pbExchangeCertificate = NULL; m_dwSignCertificateLen = 0; m_pbSignCertificate = NULL; m_dwExtenstionValueLen = 0; m_pbExtensionValue = NULL; m_lpstrPIN = NULL; m_dwRequestType = REQUEST_NULL; m_WizAction = WIZACTION_REGISTERLS; m_hOpenDirect = NULL; m_hConnect = NULL; m_hRequest = NULL; m_phLSContext = NULL; m_pRegistrationID[ 0] = m_pLicenseServerID[ 0] = 0; m_dwRefresh = 0; m_lpCSRNumber[ 0] = 0; m_lpWWWSite[0] = 0; m_pLSLKP[ 0] = m_pLSSPK[ 0] = 0; m_dwLastRetCode = 0; m_dwLangId = 0; m_fSupportConcurrent = FALSE; m_fSupportWhistlerCAL = FALSE; InitSPKList(); // // Initialize the Wizard Page stack // ClearWizStack(); } void CGlobal::FreeGlobal() { if (m_pbSignCertificate != NULL) { LocalFree(m_pbSignCertificate); m_pbSignCertificate = NULL; } if (m_pbExchangeCertificate != NULL) { LocalFree(m_pbExchangeCertificate); m_pbExchangeCertificate = NULL; } if (m_lpwstrLSName) { delete m_lpwstrLSName; m_lpwstrLSName = NULL; } if(m_lpstrCHServer) { delete m_lpstrCHServer; m_lpstrCHServer = NULL; } if (m_lpstrCHExtension) { delete m_lpstrCHExtension; m_lpstrCHExtension = NULL; } if(m_pbExtensionValue) { delete m_pbExtensionValue; m_pbExtensionValue = NULL; } if(m_lpstrPIN) { delete m_lpstrPIN; m_lpstrPIN = NULL; } m_csaCountryDesc.RemoveAll(); m_csaCountryCode.RemoveAll(); m_csaProductDesc.RemoveAll(); m_csaProductCode.RemoveAll(); m_csaDeactReasonCode.RemoveAll(); m_csaDeactReasonDesc.RemoveAll(); m_csaReactReasonCode.RemoveAll(); m_csaReactReasonDesc.RemoveAll(); } CGlobal::~CGlobal() { FreeGlobal(); } void CGlobal::ClearWizStack() { DWORD dwIndex; m_dwTop = 0; for(dwIndex = 0 ; dwIndex < NO_OF_PAGES ; dwIndex++) m_dwWizStack[dwIndex] = 0; } PCONTACTINFO CGlobal::GetContactDataObject() { return &m_ContactData; } PTSLICINFO CGlobal::GetLicDataObject() { return &m_LicData; } DWORD CGlobal::InitGlobal() { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwDataLen = 0; DWORD dwDisposition = 0; DWORD dwType = REG_SZ; HKEY hKey = NULL; LPTSTR lpszValue = NULL; LPTSTR lpszDelimiter = (LPTSTR)L"~"; CString sCountryDesc; LPTSTR lpTemp = NULL; TLSPrivateDataUnion getParm; PTLSPrivateDataUnion pRtn = NULL; error_status_t esRPC = ERROR_SUCCESS; DWORD dwRetDataType = 0; DWORD dwSupportFlags; TCHAR lpBuffer[ 1024]; m_ContactData.Initialize(); m_LicData.Initialize(); m_dwLSStatus = LSERVERSTATUS_UNREGISTER; m_phLSContext = NULL; // // Load Countries from the String Table // LoadCountries(); LoadReasons(); // // Get CH URL from the LS Registry // dwRetCode = ConnectToLSRegistry(); if(dwRetCode != ERROR_SUCCESS) { goto done; } dwRetCode = RegCreateKeyEx (m_hLSRegKey, REG_LRWIZ_PARAMS, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition); if(dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_REGCREATE_FAILED; goto done; } // //LR State // m_dwLRState = 0; dwType = REG_DWORD; dwDataLen = sizeof(m_dwLRState); RegQueryValueEx(hKey, REG_LRWIZ_STATE, 0, &dwType, (LPBYTE)&m_dwLRState, &dwDataLen ); lpBuffer[ 0] = 0; GetFromRegistery(ACTIVATIONMETHOD_KEY, lpBuffer, FALSE); if (_tcslen(lpBuffer) != 0) { m_ActivationMethod = (WIZCONNECTION) _ttoi(lpBuffer); } else { m_ActivationMethod = CONNECTION_DEFAULT; //Partially fix bug # 577 } if ((m_ActivationMethod != CONNECTION_DEFAULT) && (m_ActivationMethod != CONNECTION_INTERNET) && (m_ActivationMethod != CONNECTION_WWW) && (m_ActivationMethod != CONNECTION_PHONE)) { m_ActivationMethod = CONNECTION_DEFAULT; } GetFromRegistery(CSRNUMBER_KEY, m_lpCSRNumber, FALSE); // // LKP Request Count // m_dwLRCount = 0; dwType = REG_DWORD; dwDataLen = sizeof(m_dwLRCount); RegQueryValueEx(hKey, REG_LR_COUNT, 0, &dwType, (LPBYTE)&m_dwLRCount, &dwDataLen ); // dwDataLen includes the null terminating char. // So if the key is empty,dwDataLen is 2 bytes, not 0. // See raid bug id : 336. // //CH URL // dwType = REG_SZ; dwDataLen = 0; RegQueryValueEx(hKey, REG_CH_SERVER, 0, &dwType, NULL, &dwDataLen ); if(dwDataLen <= sizeof(TCHAR)) { dwRetCode = IDS_ERR_CHURLKEY_EMPTY; goto done; } m_lpstrCHServer = new TCHAR[dwDataLen+1]; memset(m_lpstrCHServer, 0, (dwDataLen+1)*sizeof(TCHAR) ); RegQueryValueEx(hKey, REG_CH_SERVER, 0, &dwType, (LPBYTE)m_lpstrCHServer, &dwDataLen ); // //CH Extension // dwType = REG_SZ; dwDataLen = 0; RegQueryValueEx(hKey, REG_CH_EXTENSION, 0, &dwType, NULL, &dwDataLen ); if(dwDataLen <= sizeof(TCHAR)) { dwRetCode = IDS_ERR_CHURLKEY_EMPTY; goto done; } m_lpstrCHExtension = new TCHAR[dwDataLen+1]; memset(m_lpstrCHExtension, 0, (dwDataLen+1)*sizeof(TCHAR) ); RegQueryValueEx(hKey, REG_CH_EXTENSION, 0, &dwType, (LPBYTE)m_lpstrCHExtension, &dwDataLen ); // // WWW site address // dwType = REG_SZ; dwDataLen = sizeof(m_lpWWWSite); dwRetCode = RegQueryValueEx(hKey, REG_WWW_SITE, 0, &dwType, (LPBYTE)m_lpWWWSite, &dwDataLen ); if(dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_CHURLKEY_EMPTY; goto done; } m_ContactData.sContactAddress = GetFromRegistery(szOID_STREET_ADDRESS, lpBuffer, FALSE); m_ContactData.sZip = GetFromRegistery(szOID_POSTAL_CODE, lpBuffer, FALSE); m_ContactData.sCity = GetFromRegistery(szOID_LOCALITY_NAME, lpBuffer, FALSE); m_ContactData.sCountryCode = GetFromRegistery(szOID_DESCRIPTION, lpBuffer, FALSE); m_ContactData.sCountryDesc = GetFromRegistery(szOID_COUNTRY_NAME, lpBuffer, FALSE); m_ContactData.sState = GetFromRegistery(szOID_STATE_OR_PROVINCE_NAME, lpBuffer, FALSE); m_ContactData.sCompanyName = GetFromRegistery(szOID_ORGANIZATION_NAME, lpBuffer, FALSE); m_ContactData.sOrgUnit = GetFromRegistery(szOID_ORGANIZATIONAL_UNIT_NAME, lpBuffer, FALSE); m_ContactData.sContactFax = GetFromRegistery(szOID_FACSIMILE_TELEPHONE_NUMBER, lpBuffer, FALSE); m_ContactData.sContactPhone = GetFromRegistery(szOID_TELEPHONE_NUMBER, lpBuffer, FALSE); m_ContactData.sContactLName = GetFromRegistery(szOID_SUR_NAME, lpBuffer, FALSE); m_ContactData.sContactFName = GetFromRegistery(szOID_COMMON_NAME, lpBuffer, FALSE); m_ContactData.sContactEmail = GetFromRegistery(szOID_RSA_emailAddr, lpBuffer, FALSE); m_ContactData.sProgramName = GetFromRegistery(szOID_BUSINESS_CATEGORY, lpBuffer, FALSE); m_ContactData.sCSRFaxRegion = GetFromRegistery(REG_LRWIZ_CSFAXREGION, lpBuffer, FALSE); m_ContactData.sCSRPhoneRegion = GetFromRegistery(REG_LRWIZ_CSPHONEREGION, lpBuffer, FALSE); InitSPKList(); SetLSLangId(GetUserDefaultUILanguage()); // // Get the info for the License Server. // dwRetCode = ConnectToLS(); if(dwRetCode != ERROR_SUCCESS) { goto done; } dwRetCode = TLSGetSupportFlags( m_phLSContext, &dwSupportFlags ); if (dwRetCode == RPC_S_OK) { if (dwSupportFlags & SUPPORT_CONCURRENT) { m_fSupportConcurrent = TRUE; } else { m_fSupportConcurrent = FALSE; } if (dwSupportFlags & SUPPORT_WHISTLER_CAL) { m_fSupportWhistlerCAL = TRUE; } else { m_fSupportWhistlerCAL = FALSE; } } else { m_fSupportConcurrent = FALSE; m_fSupportWhistlerCAL = FALSE; dwRetCode = RPC_S_OK; // OK if this fails } // // Load Products from the String Table // LoadProducts(); done: DisconnectLS(); if(pRtn) midl_user_free(pRtn); if(hKey) RegCloseKey(hKey); DisconnectLSRegistry(); return dwRetCode; } DWORD CGlobal::CheckRequieredFields() { DWORD dwRetCode = ERROR_SUCCESS; //Validate sProgramName (Partially fix bug # 577) if ( (m_ContactData.sProgramName != PROGRAM_SELECT && m_ContactData.sProgramName != PROGRAM_MOLP && m_ContactData.sProgramName != PROGRAM_RETAIL) || (m_ContactData.sCompanyName == "" || m_ContactData.sContactLName == "" || m_ContactData.sContactFName == "" || m_ContactData.sCountryCode == "" || m_ContactData.sCountryDesc == "") || (m_ContactData.sContactEmail == "" && GetActivationMethod() == CONNECTION_INTERNET) ) { dwRetCode = IDS_ERR_REQ_FIELD_EMPTY; } return dwRetCode; } void CGlobal::SetLSStatus(DWORD dwStatus) { m_dwLSStatus = dwStatus; } DWORD CGlobal::GetLSStatus(void) { return m_dwLSStatus; } void CGlobal::SetInstanceHandle(HINSTANCE hInst) { m_hInstance = hInst; } HINSTANCE CGlobal::GetInstanceHandle() { return m_hInstance; } void CGlobal::SetLSName(LPCTSTR lpstrLSName) { if(m_lpwstrLSName) { delete m_lpwstrLSName; m_lpwstrLSName = NULL; } if (lpstrLSName != NULL) { m_lpwstrLSName = new WCHAR[MAX_COMPUTERNAME_LENGTH + 1]; wcscpy(m_lpwstrLSName,(LPWSTR)lpstrLSName); m_lpstrLSName = (LPTSTR) lpstrLSName; } } WIZCONNECTION CGlobal::GetActivationMethod(void) { return m_ActivationMethod; } void CGlobal::SetActivationMethod(WIZCONNECTION conn) { TCHAR acBuf[ 32]; _stprintf(acBuf, _T("%d"), conn); SetInRegistery(ACTIVATIONMETHOD_KEY, acBuf); m_ActivationMethod = conn; } WIZCONNECTION CGlobal::GetLSProp_ActivationMethod(void) { return m_LSProp_ActivationMethod; } void CGlobal::SetLSProp_ActivationMethod(WIZCONNECTION conn) { m_LSProp_ActivationMethod = conn; } WIZACTION CGlobal::GetWizAction(void) { return m_WizAction; } void CGlobal::SetWizAction(WIZACTION act) { m_WizAction = act; } DWORD CGlobal::GetEntryPoint(void) { DWORD dwReturn = 0; switch (m_ActivationMethod) { case CONNECTION_INTERNET: switch (m_WizAction) { case WIZACTION_REGISTERLS: dwReturn = IDD_LICENSETYPE; break; case WIZACTION_CONTINUEREGISTERLS: dwReturn = IDD_CONTINUEREG; break; case WIZACTION_DOWNLOADLKP: if (m_ContactData.sProgramName == PROGRAM_SELECT) { dwReturn = IDD_CH_REGISTER_SELECT; } else if (m_ContactData.sProgramName == PROGRAM_MOLP) { dwReturn = IDD_CH_REGISTER_MOLP; } else { dwReturn = IDD_DLG_RETAILSPK; } break; case WIZACTION_UNREGISTERLS: case WIZACTION_REREGISTERLS: dwReturn = IDD_DLG_CERTLOG_INFO; break; case WIZACTION_SHOWPROPERTIES: dwReturn = IDD_WELCOME; break; } break; case CONNECTION_PHONE: switch (m_WizAction) { case WIZACTION_REGISTERLS: case WIZACTION_CONTINUEREGISTERLS: dwReturn = IDD_DLG_TELREG; break; case WIZACTION_DOWNLOADLASTLKP: case WIZACTION_DOWNLOADLKP: // Calls Authenticate dwReturn = IDD_DLG_TELLKP; break; case WIZACTION_UNREGISTERLS: dwReturn = IDD_DLG_CONFREVOKE; break; case WIZACTION_REREGISTERLS: dwReturn = IDD_DLG_TELREG_REISSUE; break; case WIZACTION_SHOWPROPERTIES: dwReturn = IDD_WELCOME; break; } break; case CONNECTION_WWW: switch (m_WizAction) { case WIZACTION_REGISTERLS: case WIZACTION_CONTINUEREGISTERLS: dwReturn = IDD_DLG_WWWREG; break; case WIZACTION_DOWNLOADLASTLKP: case WIZACTION_DOWNLOADLKP: // Calls Authenticate dwReturn = IDD_DLG_WWWLKP; break; case WIZACTION_UNREGISTERLS: case WIZACTION_REREGISTERLS: case WIZACTION_SHOWPROPERTIES: dwReturn = IDD_WELCOME; break; } break; default: break; } return dwReturn; } DWORD CGlobal::LRGetLastError() { DWORD dwRet; dwRet = m_dwErrorCode; m_dwErrorCode = 0; return dwRet; } void CGlobal::LRSetLastError(DWORD dwErrorCode) { m_dwErrorCode = dwErrorCode; } int CGlobal::LRMessageBox(HWND hWndParent,DWORD dwMsgId,DWORD dwErrorCode /*=0*/) { TCHAR szBuf[LR_MAX_MSG_TEXT]; TCHAR szMsg[LR_MAX_MSG_TEXT]; TCHAR szCaption[LR_MAX_MSG_CAPTION]; LoadString(GetInstanceHandle(),dwMsgId,szMsg,LR_MAX_MSG_TEXT); LoadString(GetInstanceHandle(),IDS_TITLE,szCaption,LR_MAX_MSG_CAPTION); if(dwErrorCode != 0) { DWORD dwRet = 0; LPTSTR lpszTemp = NULL; dwRet=FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwErrorCode, LANG_NEUTRAL, (LPTSTR)&lpszTemp, 0, NULL); _stprintf(szBuf,szMsg,dwErrorCode); if(dwRet != 0 && lpszTemp != NULL) { lstrcat(szBuf, _T(", ")); lstrcat(szBuf, lpszTemp); LocalFree(lpszTemp); } } else { _tcscpy(szBuf,szMsg); } return MessageBox(hWndParent,szBuf,szCaption,MB_OK|MB_ICONSTOP); } BOOL CGlobal::IsLSRunning() { DWORD dwRetCode = ERROR_SUCCESS; if (ConnectToLS() != ERROR_SUCCESS) { return FALSE; } DisconnectLS(); return TRUE; } DWORD CGlobal::ResetLSSPK(BOOL bGenKey) { DWORD dwRetCode; error_status_t esRPC = ERROR_SUCCESS; dwRetCode = ConnectToLS(); if(dwRetCode == ERROR_SUCCESS) { // Make LS Regen Key call HERE dwRetCode = TLSTriggerReGenKey(m_phLSContext, bGenKey, &esRPC); if(dwRetCode != RPC_S_OK || esRPC != ERROR_SUCCESS) { dwRetCode = IDS_ERR_RPC_FAILED; } else { dwRetCode = ERROR_SUCCESS; } } DisconnectLS(); LRSetLastError(dwRetCode); return dwRetCode; } DWORD CGlobal::GetLSCertificates(PDWORD pdwServerStatus) { DWORD dwRetCode = ERROR_SUCCESS; PCONTEXT_HANDLE phLSContext = NULL; error_status_t esRPC = ERROR_SUCCESS; error_status_t esTemp = ERROR_SUCCESS; PBYTE pCertBlob = NULL; PBYTE pSignCertBlob = NULL; DWORD dwCertBlobLen = 0; DWORD dwSignCertBlobLen = 0; DWORD dwCertSize = 0; DWORD dwRegIDLength = 0; DWORD dwLSIDLen = 0; HCRYPTPROV hCryptProvider = NULL; CRYPT_DATA_BLOB CertBlob; HCERTSTORE hCertStore = NULL; PCCERT_CONTEXT pcCertContext = NULL; PCERT_EXTENSION pCertExtension = NULL; BYTE * pByte = NULL; m_dwExchangeCertificateLen = 0; if (m_pbExchangeCertificate != NULL) { LocalFree(m_pbExchangeCertificate); } if (m_pbSignCertificate != NULL) { LocalFree(m_pbSignCertificate); } m_pbSignCertificate = NULL; m_pbExchangeCertificate = NULL; *pdwServerStatus = LSERVERSTATUS_UNREGISTER; m_pRegistrationID[0] = NULL; m_pLicenseServerID[0] = NULL; dwRetCode = ConnectToLS(); if (dwRetCode != ERROR_SUCCESS) { goto done; } // We need the License Server ID dwRetCode = TLSGetServerPID( m_phLSContext, &dwLSIDLen, &pByte, &esRPC ); if (dwRetCode != RPC_S_OK) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_RPC_FAILED; goto done; } if (esRPC == LSERVER_E_DATANOTFOUND || dwLSIDLen != sizeof(TCHAR)*(LR_LICENSESERVERID_LEN+1)) { if (pByte != NULL) { LocalFree(pByte); } dwRetCode = IDS_ERR_NOLSID; goto done; } assert(esRPC == ERROR_SUCCESS && pByte != NULL); memcpy(m_pLicenseServerID, pByte, sizeof(TCHAR)*(LR_LICENSESERVERID_LEN+1)); LocalFree(pByte); //Try and get the LSServerCertificate first dwRetCode = TLSGetServerCertificate ( m_phLSContext, FALSE, &pCertBlob, &dwCertBlobLen, &esRPC ); if(dwRetCode != RPC_S_OK) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_RPC_FAILED; goto done; } if (esRPC == LSERVER_I_TEMP_SELFSIGN_CERT ) { // Certificate is NOT signed & does not have the SPK dwRetCode = ERROR_SUCCESS; goto done; } else { // Certificate is either msft signed OR there is an SPK // in it. pByte = NULL; dwRetCode = TLSGetServerSPK( m_phLSContext, &dwRegIDLength, &pByte, &esTemp ); if (dwRetCode != RPC_S_OK) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_RPC_FAILED; goto done; } if (esTemp == LSERVER_E_DATANOTFOUND) { if (pByte != NULL) { LocalFree(pByte); } dwRetCode = ERROR_SUCCESS; goto done; } if (esTemp != ERROR_SUCCESS) { if (pByte != NULL) { LocalFree(pByte); } LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_RPC_FAILED; goto done; } if (dwRegIDLength != sizeof(TCHAR)*(LR_REGISTRATIONID_LEN+1)) { // What happened to the SPK's Length ?? if (pByte != NULL) { LocalFree(pByte); } dwRetCode = IDS_ERR_INVALIDLENGTH; LRSetLastError(dwRetCode); goto done; } assert(pByte != NULL); memcpy(m_pRegistrationID, pByte, sizeof(TCHAR)*(LR_REGISTRATIONID_LEN+1)); LocalFree(pByte); } if(esRPC != LSERVER_I_SELFSIGN_CERTIFICATE && esRPC != ERROR_SUCCESS ) { LRSetLastError(esRPC); dwRetCode = IDS_ERR_LS_ERROR; goto done; } m_pbExchangeCertificate = pCertBlob; m_dwExchangeCertificateLen = dwCertBlobLen; // Now that everything has succeded, let us get thesigning cert dwRetCode = TLSGetServerCertificate ( m_phLSContext, TRUE, &pSignCertBlob, &dwSignCertBlobLen, &esRPC ); if (dwRetCode == RPC_S_OK && esRPC == LSERVER_S_SUCCESS ) { m_pbSignCertificate = pSignCertBlob; m_dwSignCertificateLen = dwSignCertBlobLen; } else { dwRetCode = ERROR_SUCCESS; // Ignore this error; m_pbSignCertificate = NULL; m_dwSignCertificateLen = 0; } // //Get the Extensions from the Certificate // if ( esRPC != LSERVER_I_SELFSIGN_CERTIFICATE ) { CertBlob.cbData = m_dwExchangeCertificateLen; CertBlob.pbData = m_pbExchangeCertificate; //Create the PKCS7 store and get the first cert out of it! dwRetCode = GetTempCryptContext(&hCryptProvider); if( dwRetCode != ERROR_SUCCESS ) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_CRYPT_ERROR; goto done; } hCertStore = CertOpenStore( CERT_STORE_PROV_PKCS7, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, hCryptProvider, CERT_STORE_NO_CRYPT_RELEASE_FLAG, &CertBlob ); if( NULL == hCertStore ) { LRSetLastError(GetLastError()); dwRetCode = IDS_ERR_CRYPT_ERROR; goto done; } //Get the cert from the store pcCertContext = CertEnumCertificatesInStore ( hCertStore, NULL ); if ( !pcCertContext ) { LRSetLastError(GetLastError()); dwRetCode = IDS_ERR_CRYPT_ERROR; goto done; } //Get the extension and store the cert type in it pCertExtension = CertFindExtension ( szOID_NULL_EXT, pcCertContext->pCertInfo->cExtension, pcCertContext->pCertInfo->rgExtension ); if ( !pCertExtension ) { LRSetLastError(CRYPT_E_NOT_FOUND); dwRetCode = IDS_ERR_CRYPT_ERROR; goto done; } //Get the value and store it in the member function m_dwExtenstionValueLen = pCertExtension->Value.cbData; m_pbExtensionValue = new BYTE [m_dwExtenstionValueLen + 1 ]; memset ( m_pbExtensionValue, 0, m_dwExtenstionValueLen + 1 ); memcpy ( m_pbExtensionValue, pCertExtension->Value.pbData, m_dwExtenstionValueLen ); dwRetCode = ERROR_SUCCESS; *pdwServerStatus = LSERVERSTATUS_REGISTER_INTERNET; } else { // There is an SPK dwRetCode = ERROR_SUCCESS; *pdwServerStatus = LSERVERSTATUS_REGISTER_OTHER; } done: DisconnectLS(); if ( pcCertContext ) { CertFreeCertificateContext ( pcCertContext ); } if ( hCertStore ) { CertCloseStore (hCertStore,CERT_CLOSE_STORE_CHECK_FLAG); } DoneWithTempCryptContext(hCryptProvider); return dwRetCode; } DWORD CGlobal::IsLicenseServerRegistered(PDWORD pdwServerStatus) { DWORD dwRetCode = ERROR_SUCCESS; PCONTEXT_HANDLE phLSContext = NULL; error_status_t esRPC = ERROR_SUCCESS; PBYTE pCertBlob = NULL; DWORD dwCertBlobLen = 0; *pdwServerStatus = LSERVERSTATUS_UNREGISTER; dwRetCode = ConnectToLS(); if (dwRetCode != ERROR_SUCCESS) { goto done; } //Try and get the LSServerCertificate first dwRetCode = TLSGetServerCertificate ( m_phLSContext, FALSE, &pCertBlob, &dwCertBlobLen, &esRPC ); if(dwRetCode != RPC_S_OK) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_RPC_FAILED; goto done; } if ( esRPC == ERROR_SUCCESS) { *pdwServerStatus = LSERVERSTATUS_REGISTER_INTERNET; } else if ( esRPC == LSERVER_I_SELFSIGN_CERTIFICATE ) { *pdwServerStatus = LSERVERSTATUS_REGISTER_OTHER; } else if (esRPC == LSERVER_I_TEMP_SELFSIGN_CERT ) { *pdwServerStatus = LSERVERSTATUS_UNREGISTER; } else { LRSetLastError(esRPC); dwRetCode = IDS_ERR_LS_ERROR; } done: DisconnectLS(); if ( pCertBlob ) { LocalFree(pCertBlob); } return dwRetCode; } DWORD CGlobal::GetTempCryptContext(HCRYPTPROV * phCryptProv) { DWORD dwRetCode = ERROR_SUCCESS; *phCryptProv = NULL; if(!CryptAcquireContext( phCryptProv, // Address for handle to be returned. NULL, // Key Container Name. NULL, // Provider Name. PROV_RSA_FULL, // Need to do both encrypt & sign. 0 ) ) { if (!CryptAcquireContext( phCryptProv, // Address for handle to be returned. NULL, // Key Container Name. NULL, // Provider Name. PROV_RSA_FULL, // Need to do both encrypt & sign. CRYPT_VERIFYCONTEXT ) ) { dwRetCode = GetLastError(); } } return dwRetCode; } void CGlobal::DoneWithTempCryptContext(HCRYPTPROV hCryptProv) { if ( hCryptProv ) CryptReleaseContext ( hCryptProv, 0 ); } DWORD CGlobal::GetCHCert( LPTSTR lpstrRegKey , PBYTE * ppCert, DWORD * pdwLen ) { DWORD dwRetCode = ERROR_SUCCESS; HKEY hKey = NULL; DWORD dwDisposition = 0; DWORD dwType = REG_BINARY; dwRetCode = ConnectToLSRegistry(); if(dwRetCode != ERROR_SUCCESS) goto done; dwRetCode = RegCreateKeyEx (m_hLSRegKey, REG_LRWIZ_PARAMS, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition); if(dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_REGCREATE_FAILED; goto done; } RegQueryValueEx(hKey, lpstrRegKey, 0, &dwType, NULL, pdwLen ); if(*pdwLen == 0) { dwRetCode = IDS_ERR_CHCERTKEY_EMPTY; goto done; } *ppCert = new BYTE[*pdwLen]; memset(*ppCert,0,*pdwLen); RegQueryValueEx ( hKey, lpstrRegKey, 0, &dwType, *ppCert, pdwLen ); done: if (hKey != NULL) { RegCloseKey(hKey); } DisconnectLSRegistry(); return dwRetCode; } DWORD CGlobal::SetCHCert ( LPTSTR lpstrRegKey, PBYTE pCert, DWORD dwLen ) { DWORD dwRetCode = ERROR_SUCCESS; HKEY hKey = NULL; DWORD dwDisposition = 0; DWORD dwDecodedCertLen = 0; PBYTE pDecodedCert = NULL; /* //base 64 decode the blob LSBase64DecodeA( (const char *)pCert, dwLen, NULL, &dwDecodedCertLen); pDecodedCert = new BYTE[dwDecodedCertLen]; LSBase64DecodeA( (const char *)pCert, dwLen, pDecodedCert, &dwDecodedCertLen); */ dwRetCode = ConnectToLSRegistry(); if(dwRetCode != ERROR_SUCCESS) goto done; dwRetCode = RegCreateKeyEx (m_hLSRegKey, REG_LRWIZ_PARAMS, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition); if(dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_REGCREATE_FAILED; goto done; } RegSetValueEx ( hKey, lpstrRegKey, 0, REG_BINARY, pCert, dwLen ); done : if(pDecodedCert) delete pDecodedCert; if(hKey) RegCloseKey(hKey); DisconnectLSRegistry(); return dwRetCode; } // // This functions connects the LS Registry and stores the Reg Handle in // in the Member variable. // DWORD CGlobal::ConnectToLSRegistry() { DWORD dwRetCode = ERROR_SUCCESS; TCHAR szMachineName[MAX_COMPUTERNAME_LENGTH + 5]; _tcscpy(szMachineName,L"\\\\"); _tcscat(szMachineName,m_lpstrLSName); m_hLSRegKey = NULL; dwRetCode = RegConnectRegistry(szMachineName,HKEY_LOCAL_MACHINE,&m_hLSRegKey); if(dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_REGCONNECT_FAILD; return dwRetCode; } return dwRetCode; } void CGlobal::DisconnectLSRegistry() { if(m_hLSRegKey) RegCloseKey(m_hLSRegKey); } DWORD CGlobal::ConnectToLS() { DWORD dwRetCode = ERROR_SUCCESS; error_status_t esRPC = ERROR_SUCCESS; HCRYPTPROV hCryptProv; m_phLSContext = TLSConnectToLsServer((LPTSTR)m_lpwstrLSName); if (!m_phLSContext) { dwRetCode = IDS_ERR_LSCONNECT_FAILED; } else { GetTempCryptContext(&hCryptProv); dwRetCode = TLSEstablishTrustWithServer(m_phLSContext, hCryptProv, CLIENT_TYPE_LRWIZ, &esRPC); if ( dwRetCode != RPC_S_OK || esRPC != LSERVER_S_SUCCESS) { dwRetCode = IDS_ERR_LCONNECTTRUST_FAILED; TLSDisconnectFromServer(m_phLSContext); m_phLSContext = NULL; } DoneWithTempCryptContext(hCryptProv); } return dwRetCode; } void CGlobal::DisconnectLS() { if (m_phLSContext) { TLSDisconnectFromServer(m_phLSContext); m_phLSContext = NULL; } } // // bstrPKCS7 is LS Client Auth Cert with BASE64 Encoding whereas // bstrRootCert is plain X509_ASN_ENCODING // DWORD CGlobal::DepositLSCertificates(PBYTE pbExchangePKCS7, DWORD dwExchangePKCS7Len, PBYTE pbSignaturePKCS7, DWORD dwSignaturePKCS7Len, PBYTE pbRootCert, DWORD dwRootCertLen) { //LS CA Root Certificate BLOB in X509_ASN_ENCODING & BASE 64 Encoded PBYTE pbLSEncodedRootBLOB = pbRootCert; DWORD dwLSEncodedRootBLOBLen = dwRootCertLen; //LS CA Root Certificate BLOB in X509_ASN_ENCODING & BASE 64 Decoded PBYTE pbLSDecodedRootBLOB = NULL; DWORD dwLSDecodedRootBLOBLen = 0; //LS Exchange Certificate BLOB(BASE64 encoded) along with LS CA Non-Root Certificate PBYTE pbLSEncodedExchgBLOB = pbExchangePKCS7; DWORD dwLSEncodedExchgBLOBLen = dwExchangePKCS7Len; //LS Exchange Certificate BLOB(BASE64 decoded) along with LS CA Non-Root Certificate PBYTE pbLSDecodedExchgBLOB = NULL; DWORD dwLSDecodedExchgBLOBLen = 0; //LS Signature Certificate BLOB(BASE64 encoded) along with LS CA Non-Root Certificate PBYTE pbLSEncodedSigBLOB = pbSignaturePKCS7; DWORD dwLSEncodedSigBLOBLen = dwSignaturePKCS7Len; //LS Signature Certificate BLOB(BASE64 decoded) along with LS CA Non-Root Certificate PBYTE pbLSDecodedSigBLOB = NULL; DWORD dwLSDecodedSigBLOBLen = 0; //Data blobs Required by CryptoAPIs CRYPT_DATA_BLOB LSExchgCertBlob; CRYPT_DATA_BLOB LSExchgCertStore; CRYPT_DATA_BLOB LSSigCertBlob; CRYPT_DATA_BLOB LSSigCertStore; //Crypto Handles HCRYPTPROV hCryptProv = NULL; HCERTSTORE hExchgCertStore = NULL; HCERTSTORE hSigCertStore = NULL; DWORD dwRet = 0; PCCERT_CONTEXT pCertContext = NULL; error_status_t esRPC; //Decode LS Exchange Cert BLOB(BASE64 Encoded) LSBase64DecodeA((char *)pbLSEncodedExchgBLOB, dwLSEncodedExchgBLOBLen, NULL, &dwLSDecodedExchgBLOBLen); pbLSDecodedExchgBLOB = new BYTE[dwLSDecodedExchgBLOBLen]; LSBase64DecodeA((char *)pbLSEncodedExchgBLOB, dwLSEncodedExchgBLOBLen, pbLSDecodedExchgBLOB, &dwLSDecodedExchgBLOBLen); //Decode LS Signature Cert BLOB(BASE64 Encoded) LSBase64DecodeA((char *)pbLSEncodedSigBLOB, dwLSEncodedSigBLOBLen, NULL, &dwLSDecodedSigBLOBLen); pbLSDecodedSigBLOB = new BYTE[dwLSDecodedSigBLOBLen]; LSBase64DecodeA((char *)pbLSEncodedSigBLOB, dwLSEncodedSigBLOBLen, pbLSDecodedSigBLOB, &dwLSDecodedSigBLOBLen); //Decode LS Root Cert BLOB(BASE64 Encoded) LSBase64DecodeA((char *)pbLSEncodedRootBLOB, dwLSEncodedRootBLOBLen, NULL, &dwLSDecodedRootBLOBLen); pbLSDecodedRootBLOB = new BYTE[dwLSDecodedRootBLOBLen]; LSBase64DecodeA((char *)pbLSEncodedRootBLOB, dwLSEncodedRootBLOBLen, pbLSDecodedRootBLOB, &dwLSDecodedRootBLOBLen); LSExchgCertStore.cbData = 0; LSExchgCertStore.pbData = NULL; LSSigCertStore.cbData = 0; LSSigCertStore.pbData = NULL; if(!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) ) { dwRet = GetLastError(); LRSetLastError(dwRet); dwRet = IDS_ERR_CRYPT_ERROR; goto DepositExit; } //Create a new memory store for LS Exchange Certificate Chain LSExchgCertBlob.cbData = dwLSDecodedExchgBLOBLen; LSExchgCertBlob.pbData = pbLSDecodedExchgBLOB; hExchgCertStore = CertOpenStore( CERT_STORE_PROV_PKCS7, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, hCryptProv, CERT_STORE_NO_CRYPT_RELEASE_FLAG, (void *)&LSExchgCertBlob); if( hExchgCertStore == NULL ) { dwRet = GetLastError(); LRSetLastError(dwRet); dwRet = IDS_ERR_CRYPT_ERROR; goto DepositExit; } //Add Root Certificate to the Store if(!CertAddEncodedCertificateToStore( hExchgCertStore, X509_ASN_ENCODING, (const BYTE *)pbLSDecodedRootBLOB, dwLSDecodedRootBLOBLen, CERT_STORE_ADD_REPLACE_EXISTING, &pCertContext)) { dwRet = GetLastError(); LRSetLastError(dwRet); dwRet = IDS_ERR_CRYPT_ERROR; goto DepositExit; } //Save this store as PKCS7 //Get the Required Length CertSaveStore( hExchgCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, CERT_STORE_SAVE_AS_PKCS7, CERT_STORE_SAVE_TO_MEMORY, &LSExchgCertStore, 0); LSExchgCertStore.pbData = new BYTE[LSExchgCertStore.cbData]; //Save the Store if(!CertSaveStore( hExchgCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, CERT_STORE_SAVE_AS_PKCS7, CERT_STORE_SAVE_TO_MEMORY, &LSExchgCertStore, 0) ) { dwRet = GetLastError(); LRSetLastError(dwRet); dwRet = IDS_ERR_CRYPT_ERROR; goto DepositExit; } /******** Do the Same thing for the Signature Certificate ********/ //Create a new memory store for LS Signature Certificate Chain LSSigCertBlob.cbData = dwLSDecodedSigBLOBLen; LSSigCertBlob.pbData = pbLSDecodedSigBLOB; hSigCertStore = CertOpenStore( CERT_STORE_PROV_PKCS7, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, hCryptProv, CERT_STORE_NO_CRYPT_RELEASE_FLAG, (void *)&LSSigCertBlob); if( hSigCertStore == NULL ) { dwRet = GetLastError(); LRSetLastError(dwRet); dwRet = IDS_ERR_CRYPT_ERROR; goto DepositExit; } //Verify certificate //Add Root Certificate to the Store if(!CertAddEncodedCertificateToStore( hSigCertStore, X509_ASN_ENCODING, (const BYTE *)pbLSDecodedRootBLOB, dwLSDecodedRootBLOBLen, CERT_STORE_ADD_REPLACE_EXISTING, &pCertContext)) { dwRet = GetLastError(); LRSetLastError(dwRet); dwRet = IDS_ERR_CRYPT_ERROR; goto DepositExit; } //Save this store as PKCS7 //Get the Required Length CertSaveStore( hSigCertStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, CERT_STORE_SAVE_AS_PKCS7, CERT_STORE_SAVE_TO_MEMORY, &LSSigCertStore, 0); LSSigCertStore.pbData = new BYTE[LSSigCertStore.cbData]; //Save the Store if(!CertSaveStore( hSigCertStore, // in X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, CERT_STORE_SAVE_AS_PKCS7, CERT_STORE_SAVE_TO_MEMORY, &LSSigCertStore, 0)) { dwRet = GetLastError(); LRSetLastError(dwRet); dwRet = IDS_ERR_CRYPT_ERROR; goto DepositExit; } //Now verify the certificate chain for both exchange and //signature certificates. dwRet = VerifyCertChain ( hCryptProv, hExchgCertStore, pbLSDecodedRootBLOB, dwLSDecodedRootBLOBLen ); if ( dwRet != ERROR_SUCCESS ) { LRSetLastError(dwRet); goto DepositExit; } dwRet = VerifyCertChain ( hCryptProv, hSigCertStore, pbLSDecodedRootBLOB, dwLSDecodedRootBLOBLen ); if ( dwRet != ERROR_SUCCESS ) { LRSetLastError(dwRet); goto DepositExit; } //Now Send Both Signature & Exchange BLOBs to LS. dwRet = ConnectToLS(); if(dwRet != ERROR_SUCCESS) { goto DepositExit; } dwRet = TLSInstallCertificate( m_phLSContext, CERTIFICATE_CA_TYPE, 1, LSSigCertStore.cbData, LSSigCertStore.pbData, LSExchgCertStore.cbData, LSExchgCertStore.pbData, &esRPC ); if(dwRet != RPC_S_OK) { LRSetLastError(dwRet); dwRet = IDS_ERR_CERT_DEPOSIT_RPCERROR; goto DepositExit; } else if ( esRPC != ERROR_SUCCESS && ( esRPC < LSERVER_I_NO_MORE_DATA || esRPC > LSERVER_I_TEMP_SELFSIGN_CERT ) ) { dwRet = esRPC; LRSetLastError(dwRet); dwRet = IDS_ERR_CERT_DEPOSIT_RPCERROR; //IDS_ERR_CERT_DEPOSIT_LSERROR; goto DepositExit; } DepositExit : if(hCryptProv != NULL) CryptReleaseContext(hCryptProv,0); if(hExchgCertStore != NULL) CertCloseStore(hExchgCertStore,CERT_CLOSE_STORE_FORCE_FLAG); if(hSigCertStore != NULL) CertCloseStore(hSigCertStore,CERT_CLOSE_STORE_FORCE_FLAG); if(pbLSDecodedRootBLOB != NULL) delete pbLSDecodedRootBLOB; if(pbLSDecodedExchgBLOB != NULL) delete pbLSDecodedExchgBLOB; if(pbLSDecodedSigBLOB != NULL) delete pbLSDecodedSigBLOB; if(LSExchgCertStore.pbData != NULL) delete LSExchgCertStore.pbData; if(LSSigCertStore.pbData != NULL) delete LSSigCertStore.pbData; return dwRet; } DWORD CGlobal::GetCryptContextWithLSKeys(HCRYPTPROV * lphCryptProv ) { DWORD dwRetVal = ERROR_SUCCESS; DWORD esRPC = ERROR_SUCCESS; PBYTE pbExchKey = NULL; PBYTE pbSignKey = NULL; DWORD cbExchKey = 0; DWORD cbSignKey = 0; HCRYPTKEY hSignKey; HCRYPTKEY hExchKey; // //Create a new temp context // if (!CryptAcquireContext(lphCryptProv, LS_CRYPT_KEY_CONTAINER, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET|CRYPT_NEWKEYSET) ) { dwRetVal = GetLastError(); //If the key container exists , recreate it after deleting the existing one if(dwRetVal == NTE_EXISTS) { // Delete if(!CryptAcquireContext(lphCryptProv, LS_CRYPT_KEY_CONTAINER, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET|CRYPT_DELETEKEYSET)) { dwRetVal = GetLastError(); LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_CRYPT_ERROR; goto done; } // Recreate if(!CryptAcquireContext(lphCryptProv, LS_CRYPT_KEY_CONTAINER, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET|CRYPT_NEWKEYSET)) { dwRetVal = GetLastError(); LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_CRYPT_ERROR; goto done; } } else { LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_CRYPT_ERROR; goto done; } } dwRetVal = ConnectToLS(); if(dwRetVal != ERROR_SUCCESS) { goto done; } // //Now call retrieve keys and import them // dwRetVal = TLSGetLSPKCS10CertRequest ( m_phLSContext, TLSCERT_TYPE_EXCHANGE, &cbExchKey, &pbExchKey, &esRPC ); if ( dwRetVal != RPC_S_OK ) { LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_RPC_ERROR; goto done; } else if ( esRPC != ERROR_SUCCESS && esRPC != LSERVER_I_SELFSIGN_CERTIFICATE && esRPC != LSERVER_I_TEMP_SELFSIGN_CERT ) { dwRetVal = esRPC; LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_LSKEY_IMPORT_FAILED; goto done; } dwRetVal = TLSGetLSPKCS10CertRequest ( m_phLSContext, TLSCERT_TYPE_SIGNATURE, &cbSignKey, &pbSignKey, &esRPC ); if ( dwRetVal != RPC_S_OK ) { LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_RPC_ERROR; goto done; } else if ( esRPC != ERROR_SUCCESS && esRPC != LSERVER_I_SELFSIGN_CERTIFICATE && esRPC != LSERVER_I_TEMP_SELFSIGN_CERT ) { dwRetVal = esRPC; LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_LSKEY_IMPORT_FAILED; goto done; } if(!CryptImportKey(*lphCryptProv, pbSignKey, cbSignKey, NULL, 0, &hSignKey)) { dwRetVal = GetLastError(); LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_CRYPT_ERROR; goto done; } if(!CryptImportKey ( *lphCryptProv, pbExchKey, cbExchKey, NULL, 0, &hExchKey)) { dwRetVal = GetLastError(); LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_CRYPT_ERROR; goto done; } done: if ( pbExchKey ) LocalFree(pbExchKey); if ( pbSignKey ) LocalFree(pbSignKey); DisconnectLS(); return dwRetVal; } void CGlobal::DoneWithCryptContextWithLSKeys(HCRYPTPROV hProv) { if(hProv) { CryptReleaseContext (hProv, 0); } } DWORD CGlobal::CreateLSPKCS10(HCRYPTPROV hCryptProv,int nType,CHAR **lppszPKCS10) { DWORD dwRetVal = ERROR_SUCCESS; CERT_SIGNED_CONTENT_INFO SignatureInfo; CERT_REQUEST_INFO CertReqInfo; //HCRYPTPROV hCryptProv=NULL; CERT_EXTENSION rgExtension[MAX_NUM_EXTENSION]; int iExtCount=0; CERT_EXTENSIONS Extensions; CRYPT_ATTRIBUTE rgAttribute; CRYPT_ATTR_BLOB bAttr; CRYPT_BIT_BLOB bbKeyUsage; CERT_POLICIES_INFO CertPolicyInfo; CERT_POLICY_INFO CertPolicyOID; LPBYTE pbRequest=NULL; DWORD cbRequest=0; DWORD cch=0; CERT_RDN_ATTR * prgNameAttr = NULL; // clean out the PKCS 10 memset(rgExtension, 0, sizeof(rgExtension)); memset(&Extensions, 0, sizeof(CERT_EXTENSIONS)); memset(&rgAttribute, 0, sizeof(rgAttribute)); memset(&bbKeyUsage, 0, sizeof(bbKeyUsage)); memset(&bAttr, 0, sizeof(bAttr)); memset(&SignatureInfo, 0, sizeof(SignatureInfo)); memset(&CertPolicyInfo, 0, sizeof(CERT_POLICIES_INFO)); memset(&CertPolicyOID, 0, sizeof(CERT_POLICY_INFO)); memset(&CertReqInfo, 0, sizeof(CERT_REQUEST_INFO)); CertReqInfo.dwVersion = CERT_REQUEST_V1; PCERT_PUBLIC_KEY_INFO pPubKeyInfo=NULL; DWORD cbPubKeyInfo=0; do { // //This function will call the CryptAcquireContext and import the LS Keys // /* Moved out of this function if ( ( dwRetVal = GetCryptContextWithLSKeys (&hCryptProv ) )!= ERROR_SUCCESS ) { break; } */ // // always strore everything in ANSI // prgNameAttr = CreateRDNAttr(); if(prgNameAttr == NULL) { dwRetVal = IDS_ERR_OUTOFMEM; break; } CERT_RDN rgRDN[] = {m_dwReqAttrCount, prgNameAttr}; CERT_NAME_INFO Name = {1, rgRDN}; if(!CryptEncodeObject( CRYPT_ASN_ENCODING, X509_NAME, &Name, NULL, &CertReqInfo.Subject.cbData)) { dwRetVal = GetLastError(); LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_CRYPT_ERROR; break; } CertReqInfo.Subject.pbData=(BYTE *) new BYTE[CertReqInfo.Subject.cbData]; if ( !CertReqInfo.Subject.pbData ) { dwRetVal = IDS_ERR_OUTOFMEM; break; } if(!CryptEncodeObject( CRYPT_ASN_ENCODING, X509_NAME, &Name, CertReqInfo.Subject.pbData, &CertReqInfo.Subject.cbData)) { dwRetVal = GetLastError(); LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_CRYPT_ERROR; break; } // now get the public key out if(!CryptExportPublicKeyInfo(hCryptProv, nType, X509_ASN_ENCODING, NULL, &cbPubKeyInfo)) { dwRetVal = GetLastError(); LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_CRYPT_ERROR; break; } pPubKeyInfo=(PCERT_PUBLIC_KEY_INFO) new BYTE[cbPubKeyInfo]; if ( NULL == pPubKeyInfo ) { dwRetVal = IDS_ERR_OUTOFMEM; break; } if(!CryptExportPublicKeyInfo(hCryptProv, nType, X509_ASN_ENCODING, pPubKeyInfo, &cbPubKeyInfo)) { dwRetVal = GetLastError(); LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_CRYPT_ERROR; break; } CertReqInfo.SubjectPublicKeyInfo = *pPubKeyInfo; //no extensions here - we set them on the server side! //sign cert request ! SignatureInfo.SignatureAlgorithm.pszObjId = szOID_OIWSEC_sha1RSASign; memset(&SignatureInfo.SignatureAlgorithm.Parameters, 0, sizeof(SignatureInfo.SignatureAlgorithm.Parameters)); if(!CryptEncodeObject(CRYPT_ASN_ENCODING, X509_CERT_REQUEST_TO_BE_SIGNED, &CertReqInfo, NULL, &SignatureInfo.ToBeSigned.cbData)) { dwRetVal = GetLastError(); LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_CRYPT_ERROR; break; } SignatureInfo.ToBeSigned.pbData = (LPBYTE)new BYTE [SignatureInfo.ToBeSigned.cbData]; if (NULL == SignatureInfo.ToBeSigned.pbData ) { dwRetVal = IDS_ERR_OUTOFMEM; break; } if(!CryptEncodeObject(CRYPT_ASN_ENCODING, X509_CERT_REQUEST_TO_BE_SIGNED, &CertReqInfo, SignatureInfo.ToBeSigned.pbData, &SignatureInfo.ToBeSigned.cbData)) { dwRetVal = GetLastError(); LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_CRYPT_ERROR; break; } if(!CryptSignCertificate( hCryptProv, nType, CRYPT_ASN_ENCODING, SignatureInfo.ToBeSigned.pbData, SignatureInfo.ToBeSigned.cbData, &SignatureInfo.SignatureAlgorithm, NULL, NULL, &SignatureInfo.Signature.cbData)) { dwRetVal = GetLastError(); LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_CRYPT_ERROR; break; } SignatureInfo.Signature.pbData = new BYTE[SignatureInfo.Signature.cbData]; if ( NULL == SignatureInfo.Signature.pbData ) { dwRetVal = IDS_ERR_OUTOFMEM; break; } if(!CryptSignCertificate( hCryptProv, nType, CRYPT_ASN_ENCODING, SignatureInfo.ToBeSigned.pbData, SignatureInfo.ToBeSigned.cbData, &SignatureInfo.SignatureAlgorithm, NULL, SignatureInfo.Signature.pbData, &SignatureInfo.Signature.cbData)) { dwRetVal = GetLastError(); LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_CRYPT_ERROR; break; } // encode final signed request if(!CryptEncodeObject( CRYPT_ASN_ENCODING, X509_CERT, &SignatureInfo, NULL, &cbRequest)) { dwRetVal = GetLastError(); LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_CRYPT_ERROR; break; } pbRequest = new BYTE[cbRequest]; if ( NULL == pbRequest ) { dwRetVal = IDS_ERR_OUTOFMEM; break; } if(!CryptEncodeObject( CRYPT_ASN_ENCODING, X509_CERT, &SignatureInfo, pbRequest, &cbRequest)) { dwRetVal = GetLastError(); LRSetLastError(dwRetVal); dwRetVal = IDS_ERR_CRYPT_ERROR; break; } // // base64 encoding // LSBase64EncodeA ( pbRequest, cbRequest, NULL, &cch); *lppszPKCS10 = new CHAR [cch+1]; if(*lppszPKCS10 == NULL) { dwRetVal = IDS_ERR_OUTOFMEM; break; } memset ( *lppszPKCS10, 0, (cch+1)*sizeof(CHAR) ); LSBase64EncodeA ( pbRequest, cbRequest, *lppszPKCS10, &cch); } while(FALSE); // // free up all // if(pPubKeyInfo != NULL) delete pPubKeyInfo; if(CertReqInfo.Subject.pbData != NULL) delete CertReqInfo.Subject.pbData; if(rgAttribute.rgValue) delete rgAttribute.rgValue[0].pbData; if(SignatureInfo.ToBeSigned.pbData != NULL) delete SignatureInfo.ToBeSigned.pbData; if(SignatureInfo.Signature.pbData != NULL) delete SignatureInfo.Signature.pbData; if(pbRequest != NULL) delete pbRequest; if(prgNameAttr != NULL) delete prgNameAttr; /* Moved outside of this function if(hCryptProv) { DoneWithCryptContextWithLSKeys ( hCryptProv ); } */ return dwRetVal; } DWORD CGlobal::SetDNAttribute(LPCSTR lpszOID, LPSTR lpszValue) { //store the item in an array here //so that it is easy to populate the //cert request later //calling CreateLSPKCS10 will clear the array DWORD dwRet = ERROR_SUCCESS; if ( !m_pReqAttr ) { m_pReqAttr = (PREQ_ATTR)malloc (sizeof (REQ_ATTR ) ); } else { m_pReqAttr = (PREQ_ATTR)realloc ( m_pReqAttr, sizeof(REQ_ATTR) * (m_dwReqAttrCount + 1)); } if ( !m_pReqAttr ) { dwRet = IDS_ERR_OUTOFMEM; goto done; } ( m_pReqAttr + m_dwReqAttrCount)->lpszOID = lpszOID; ( m_pReqAttr + m_dwReqAttrCount)->lpszValue = new CHAR[lstrlenA(lpszValue) + 1]; lstrcpyA(( m_pReqAttr + m_dwReqAttrCount)->lpszValue,lpszValue); m_dwReqAttrCount++; done: return dwRet; } LPCTSTR CGlobal::GetFromRegistery(LPCSTR lpszOID, LPTSTR lpszBuffer, BOOL bConnect) { HKEY hKey = NULL; DWORD dwDisposition; DWORD dwRet = ERROR_SUCCESS; DWORD dwDataLen = 0; DWORD dwType = REG_SZ; _tcscpy(lpszBuffer, _T("")); if (bConnect) { dwRet = ConnectToLSRegistry(); if(dwRet != ERROR_SUCCESS) { goto done; } } else { assert(m_hLSRegKey != NULL); } dwRet = RegCreateKeyEx (m_hLSRegKey, REG_LRWIZ_PARAMS, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition); if (dwRet != ERROR_SUCCESS) { LRSetLastError(dwRet); dwRet = IDS_ERR_REGCREATE_FAILED; goto done; } dwRet = RegQueryValueExA ( hKey, lpszOID, 0, &dwType, NULL, &dwDataLen); if ( dwDataLen && dwRet == ERROR_SUCCESS ) { char * cpBuf = new char[dwDataLen + 2]; if (cpBuf == NULL) { goto done; } memset(cpBuf, 0, dwDataLen+2); RegQueryValueExA ( hKey, lpszOID, 0, &dwType, (LPBYTE) cpBuf, &dwDataLen); memset(lpszBuffer, 0, sizeof(TCHAR)*(dwDataLen+2)); LSBase64DecodeA (cpBuf, lstrlenA(cpBuf), (PBYTE) lpszBuffer, &dwDataLen); delete cpBuf; } done: if (hKey != NULL) { RegCloseKey(hKey); } if (bConnect) { DisconnectLSRegistry(); } return lpszBuffer; } DWORD CGlobal::SetInRegistery(LPCSTR lpszOID, LPCTSTR lpszValue) { HKEY hKey = NULL; DWORD dwDisposition; DWORD dwRet = ERROR_SUCCESS; DWORD dwLen = 0; char * cpOut; dwRet = ConnectToLSRegistry(); if(dwRet != ERROR_SUCCESS) { goto done; } dwRet = RegCreateKeyEx ( m_hLSRegKey, REG_LRWIZ_PARAMS, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition); if(dwRet != ERROR_SUCCESS) { LRSetLastError(dwRet); dwRet = IDS_ERR_REGCREATE_FAILED; goto done; } if (_tcslen(lpszValue) != 0) { LSBase64EncodeA ((PBYTE) lpszValue, _tcslen(lpszValue)*sizeof(TCHAR), NULL, &dwLen); cpOut = new char[dwLen+1]; if (cpOut == NULL) { dwRet = IDS_ERR_OUTOFMEM; goto done; } memset(cpOut, 0, dwLen+1); LSBase64EncodeA ((PBYTE) lpszValue, _tcslen(lpszValue)*sizeof(TCHAR), cpOut, &dwLen); } else { cpOut = new char[2]; memset(cpOut, 0, 2); } RegSetValueExA ( hKey, lpszOID, 0, REG_SZ, (PBYTE) cpOut, dwLen ); delete cpOut; done: if (hKey != NULL) { RegCloseKey(hKey); } DisconnectLSRegistry(); return dwRet; } CERT_RDN_ATTR * CGlobal::CreateRDNAttr() { CERT_RDN_ATTR * prgNameAttr = ( CERT_RDN_ATTR * )new BYTE [sizeof ( CERT_RDN_ATTR ) * m_dwReqAttrCount]; DWORD dw = 0; if ( !prgNameAttr ) goto done; for ( dw = 0; dw < m_dwReqAttrCount; dw ++ ) { ( prgNameAttr + dw )->pszObjId = (LPSTR)( m_pReqAttr + dw)->lpszOID; ( prgNameAttr + dw )->dwValueType = CERT_RDN_PRINTABLE_STRING; ( prgNameAttr + dw )->Value.cbData = lstrlenA(( m_pReqAttr + dw)->lpszValue); ( prgNameAttr + dw )->Value.pbData = (PBYTE)( m_pReqAttr + dw)->lpszValue; } done: return prgNameAttr; } TCHAR * CGlobal::GetRegistrationID(void) { return m_pRegistrationID; } TCHAR * CGlobal::GetLicenseServerID(void) { return m_pLicenseServerID; } DWORD CGlobal::GetRequestType() { return m_dwRequestType; } void CGlobal::SetRequestType(DWORD dwMode) { m_dwRequestType = dwMode; } BOOL CGlobal::IsOnlineCertRequestCreated() { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwLRState = 0; DWORD dwDataLen = 0; DWORD dwDisposition = 0; DWORD dwType = REG_SZ; HKEY hKey = NULL; dwRetCode = ConnectToLSRegistry(); if(dwRetCode != ERROR_SUCCESS) { goto done; } dwRetCode = RegCreateKeyEx (m_hLSRegKey, REG_LRWIZ_PARAMS, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition); if(dwRetCode != ERROR_SUCCESS) { goto done; } dwLRState = 0; dwType = REG_DWORD; dwDataLen = sizeof(dwLRState); RegQueryValueEx(hKey, REG_LRWIZ_STATE, 0, &dwType, (LPBYTE)&dwLRState, &dwDataLen ); done: if(hKey) RegCloseKey(hKey); DisconnectLSRegistry(); if(dwRetCode == ERROR_SUCCESS) return ( dwLRState == LRSTATE_ONLINE_CR_CREATED ) ? TRUE : FALSE; else return FALSE; } DWORD CGlobal::SetLRState(DWORD dwState) { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwDataLen = sizeof(dwState); DWORD dwDisposition = 0; DWORD dwType = REG_DWORD; HKEY hKey = NULL; dwRetCode = ConnectToLSRegistry(); if(dwRetCode != ERROR_SUCCESS) goto done; dwRetCode = RegCreateKeyEx (m_hLSRegKey, REG_LRWIZ_PARAMS, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition); if(dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_REGCREATE_FAILED; goto done; } // // Persist LRCount // dwType = REG_DWORD; dwDataLen = sizeof(m_dwLRCount); RegSetValueEx ( hKey, REG_LR_COUNT, 0, dwType, (LPBYTE)&m_dwLRCount, dwDataLen ); // // Persist LRState if it is not LRSTATE_OFFLINE_LR_INSTALLED // dwType = REG_DWORD; dwDataLen = sizeof(dwState); RegSetValueEx ( hKey, REG_LRWIZ_STATE, 0, dwType, (LPBYTE)&dwState, dwDataLen ); m_dwLRState = dwState; done: if(hKey) RegCloseKey(hKey); DisconnectLSRegistry(); return dwRetCode; } DWORD CGlobal::ProcessRequest() { DWORD dwRetCode = ERROR_SUCCESS; // // Before the processing the request, make sure LS is running // if(!IsLSRunning()) { dwRetCode = IDS_ERR_LSCONNECT_FAILED; goto done; } switch(GetActivationMethod()) { case CONNECTION_INTERNET: if (GetWizAction() == WIZACTION_REGISTERLS) { dwRetCode = ProcessIRegRequest(); } else if (GetWizAction() == WIZACTION_CONTINUEREGISTERLS) { dwRetCode = ProcessCertDownload(); } else if (GetWizAction() == WIZACTION_DOWNLOADLKP) { dwRetCode = ProcessDownloadLKP(); } else if (GetWizAction() == WIZACTION_UNREGISTERLS) { dwRetCode = ProcessCHRevokeCert(); } else if (GetWizAction() == WIZACTION_REREGISTERLS) { dwRetCode = ProcessCHReissueCert(); } else if (GetWizAction() == WIZACTION_DOWNLOADLASTLKP) { dwRetCode = ProcessCHReissueLKPRequest(); } break; case CONNECTION_PHONE: case CONNECTION_WWW: if (GetWizAction() == WIZACTION_REGISTERLS || GetWizAction() == WIZACTION_REREGISTERLS || GetWizAction() == WIZACTION_CONTINUEREGISTERLS) { dwRetCode = DepositLSSPK(); if (dwRetCode != ERROR_SUCCESS) { dwRetCode = IDS_ERR_DEPOSITSPK; } } else if (GetWizAction() == WIZACTION_DOWNLOADLKP) { dwRetCode = DepositLSLKP(); } else if (GetWizAction() == WIZACTION_UNREGISTERLS) { dwRetCode = ResetLSSPK(); } break; } done: LRSetLastRetCode(dwRetCode); return dwRetCode; } DWORD CGlobal::DepositLSSPK() { DWORD dwRetCode = ERROR_SUCCESS; error_status_t esRPC = ERROR_SUCCESS; CERT_EXTENSION certExtension; CRYPT_OBJID_BLOB oidValue; CERT_EXTENSIONS certExts; TCHAR awBuffer[ 1024]; dwRetCode = ConnectToLS(); if(dwRetCode != ERROR_SUCCESS) { goto done; } swprintf(awBuffer, szCertEXTENSION_VALUE_FMT, L"SELECT" /* "BASIC" */); assert(wcslen(awBuffer) < sizeof(awBuffer)); oidValue.cbData = (wcslen(awBuffer)+1)*sizeof(TCHAR); oidValue.pbData = (unsigned char *) awBuffer; certExtension.pszObjId = (char *) szCertEXTENSION_OID; certExtension.fCritical = TRUE; certExtension.Value = oidValue; certExts.cExtension = 1; certExts.rgExtension = &certExtension; // We need the License Server ID dwRetCode = TLSDepositeServerSPK( m_phLSContext, (wcslen(m_pLSSPK) + 1)*sizeof(TCHAR), (BYTE *) m_pLSSPK, &certExts, &esRPC ); if(dwRetCode != RPC_S_OK) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_RPC_FAILED; goto done; } if (esRPC != LSERVER_S_SUCCESS) { // Some error occurred in depositing the SPK LRSetLastError(esRPC); dwRetCode = IDS_ERR_DEPOSITSPK; } else { // Everything suceeded memcpy(m_pRegistrationID, m_pLSSPK, (wcslen(m_pLSSPK) + 1)*sizeof(TCHAR)); if (m_dwLRState == LRSTATE_ONLINE_CR_CREATED) { SetLRState(LRSTATE_NEUTRAL); } } done: DisconnectLS(); return dwRetCode; } DWORD CGlobal::SetLSLKP(TCHAR * tcLKP) { if (wcsspn(tcLKP, BASE24_CHARACTERS) != LR_REGISTRATIONID_LEN) { // Extraneous characters in the SPK string return IDS_ERR_INVALIDID; } lstrcpy(m_pLSLKP, tcLKP); return ERROR_SUCCESS; } DWORD CGlobal::SetLSSPK(TCHAR * tcLKP) { if (wcsspn(tcLKP, BASE24_CHARACTERS) != LR_REGISTRATIONID_LEN) { // Extraneous characters in the SPK string return IDS_ERR_INVALIDLSID; } if (lstrcmp(m_pRegistrationID, tcLKP) == 0) { return IDS_DUPLICATESPK; } lstrcpy(m_pLSSPK, tcLKP); return ERROR_SUCCESS; } DWORD CGlobal::DepositLSLKP(void) { DWORD dwRetCode = ERROR_SUCCESS; error_status_t esRPC = ERROR_SUCCESS; dwRetCode = ConnectToLS(); if(dwRetCode != ERROR_SUCCESS) { goto done; } // We need the License Server ID dwRetCode = TLSTelephoneRegisterLKP( m_phLSContext, (wcslen(m_pLSLKP))*sizeof(TCHAR), (BYTE *) m_pLSLKP, &esRPC ); if(dwRetCode != RPC_S_OK) { dwRetCode = IDS_ERR_RPC_FAILED; goto done; } if (esRPC != LSERVER_S_SUCCESS) { // Some error occurred in depositing the SPK if (esRPC == LSERVER_E_DUPLICATE) { dwRetCode = IDS_ERR_DUPLICATE_LKP; } else { dwRetCode = IDS_ERR_DEPOSITLKP; LRSetLastError(esRPC); } } done: DisconnectLS(); return dwRetCode; } DWORD CGlobal::SetCertificatePIN(LPTSTR lpszPIN) { m_lpstrPIN = new TCHAR[_tcslen(lpszPIN)+1]; if(m_lpstrPIN == NULL) return IDS_ERR_OUTOFMEM; _tcscpy(m_lpstrPIN,lpszPIN); return ERROR_SUCCESS; } void CGlobal::ClearCHRequestAttributes() { DWORD dwIndex = 0; if ( m_pRegAttr ) { for(dwIndex=0;dwIndexlpszAttribute) delete (m_pRegAttr + dwIndex)->lpszAttribute; if((m_pRegAttr + dwIndex)->lpszValue) delete (m_pRegAttr + dwIndex)->lpszValue; } free( m_pRegAttr ); m_pRegAttr = NULL; } m_dwRegAttrCount = 0; } void CGlobal::ClearCARequestAttributes() { DWORD dwIndex; if ( m_pReqAttr ) { for(dwIndex=0;dwIndexlpszValue) delete ( m_pReqAttr + dwIndex)->lpszValue; } free( m_pReqAttr ); m_pReqAttr = NULL; } m_dwReqAttrCount = 0; } DWORD CGlobal::SetRegistrationAttribute ( LPWSTR lpszAttribute, LPCWSTR lpszValue, DWORD dwLen ) { DWORD dwRet; if ( !m_pRegAttr ) { m_pRegAttr = (PREG_ATTR)malloc (sizeof (REG_ATTR ) ); } else { m_pRegAttr = (PREG_ATTR)realloc ( m_pRegAttr, sizeof(REG_ATTR) * (m_dwRegAttrCount + 1)); } if ( !m_pRegAttr ) { dwRet = IDS_ERR_OUTOFMEM; goto done; } ( m_pRegAttr + m_dwRegAttrCount)->lpszAttribute = new WCHAR[lstrlenW(lpszAttribute) + 1]; lstrcpyW(( m_pRegAttr + m_dwRegAttrCount)->lpszAttribute,lpszAttribute ); ( m_pRegAttr + m_dwRegAttrCount)->lpszValue = new WCHAR[dwLen]; memset(( m_pRegAttr + m_dwRegAttrCount)->lpszValue,0,dwLen * sizeof(WCHAR)); memcpy(( m_pRegAttr + m_dwRegAttrCount)->lpszValue,lpszValue,dwLen * sizeof(WCHAR)); ( m_pRegAttr + m_dwRegAttrCount)->dwValueLen = dwLen * sizeof(WCHAR); //byte length m_dwRegAttrCount++; done: return dwRet; } DWORD CGlobal::DepositLKPResponse(PBYTE pbResponseData, DWORD dwResponseLen) { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwLSRetCode = ERROR_SUCCESS; LPBYTE pCHCertBlob = NULL; DWORD dwCertBlobLen = 0; LPBYTE pCHRootCertBlob = NULL; DWORD dwRootCertBlobLen = 0; LPBYTE lpDecodedKeyPackBlob = NULL; DWORD dwDecodedKeyPackBlob = 0; LPBYTE lpKeyPackBlob = NULL; DWORD dwKeyPackBlobLen; lpDecodedKeyPackBlob = lpKeyPackBlob = pbResponseData; dwDecodedKeyPackBlob = dwKeyPackBlobLen = dwResponseLen; /* //Base64 decode the LKP! LSBase64DecodeA((const char *)lpKeyPackBlob, dwKeyPackBlobLen, NULL, &dwDecodedKeyPackBlob); lpDecodedKeyPackBlob = new BYTE[dwDecodedKeyPackBlob]; if(lpDecodedKeyPackBlob == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; goto done; } LSBase64DecodeA((const char *)lpKeyPackBlob, dwKeyPackBlobLen, lpDecodedKeyPackBlob, &dwDecodedKeyPackBlob); */ //Get the CH Cert BLOB and CH Root Cert BLOB dwRetCode = GetCHCert(REG_SIGN_CERT, &pCHCertBlob, &dwCertBlobLen ); if(dwRetCode != ERROR_SUCCESS) goto done; dwRetCode = GetCHCert(REG_ROOT_CERT, &pCHRootCertBlob, &dwRootCertBlobLen ); if(dwRetCode != ERROR_SUCCESS) goto done; dwRetCode = ConnectToLS(); if(dwRetCode != ERROR_SUCCESS) goto done; dwRetCode = TLSRegisterLicenseKeyPack( m_phLSContext, pCHCertBlob, dwCertBlobLen, pCHRootCertBlob, dwRootCertBlobLen, lpDecodedKeyPackBlob, dwDecodedKeyPackBlob, &dwLSRetCode); if(dwRetCode != RPC_S_OK) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_RPC_ERROR; goto done; } if(dwLSRetCode != ERROR_SUCCESS ) { LRSetLastError(dwLSRetCode); if ( dwLSRetCode != LSERVER_E_DUPLICATE ) { dwRetCode = IDS_ERR_DEPOSIT_LKP_FAILED; } else { dwRetCode = IDS_ERR_DUPLICATE_LKP; } goto done; } done: /* if ( lpDecodedKeyPackBlob ) delete lpDecodedKeyPackBlob; */ if (pCHCertBlob != NULL) { delete pCHCertBlob; } if (pCHRootCertBlob != NULL) { delete pCHRootCertBlob; } DisconnectLS(); return dwRetCode; } DWORD CGlobal:: EncryptBuffer ( PBYTE pBuffer, //Buffer to be encrypted DWORD dwcbBufLen, //buffer length DWORD dwKeyContainerType, //machine/user PBYTE pCertificate, //certificate blob DWORD cbCertificate, //number of bytes in the certificate PDWORD pcbEncryptedBlob, //number of bytes in the encrypted blob PBYTE *ppbEncryptedBlob //encrypted blob itself ) { DWORD dwRetCode = ERROR_SUCCESS; HCRYPTPROV hCryptProv = NULL; EnvData aEnvData; PCCERT_CONTEXT pCertContext = NULL; HCERTSTORE hCertStore = NULL; CRYPT_DATA_BLOB CertBlob; // // Acquire the Crypt Context with LS Keys // dwRetCode = GetCryptContextWithLSKeys(&hCryptProv); if ( dwRetCode != ERROR_SUCCESS ) goto done; // // Get the Certificate Context from the Certificate BLOB // CertBlob.pbData = pCertificate; CertBlob.cbData = cbCertificate; hCertStore = CertOpenStore( CERT_STORE_PROV_PKCS7, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, hCryptProv, CERT_STORE_NO_CRYPT_RELEASE_FLAG, &CertBlob ); if(hCertStore == NULL) { LRSetLastError(GetLastError()); dwRetCode = IDS_ERR_CRYPT_ERROR; goto done; } // // Get the first certificate from the store // pCertContext = CertEnumCertificatesInStore( hCertStore, NULL ); if( pCertContext == NULL) { LRSetLastError(GetLastError()); dwRetCode = IDS_ERR_CRYPT_ERROR; goto done; } //EnvelopeData memset ( &aEnvData, 0, sizeof(EnvData)); dwRetCode = EnvelopeData( pCertContext, dwcbBufLen, pBuffer, &aEnvData, hCryptProv, hCertStore ); if(dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_CRYPT_ERROR; goto done; } dwRetCode = PackEnvData( &aEnvData, pcbEncryptedBlob, ppbEncryptedBlob); if(dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_CRYPT_ERROR; goto done; } done: if( hCryptProv ) { DoneWithCryptContextWithLSKeys(hCryptProv); } return dwRetCode; } DWORD CGlobal::EnvelopeData( PCCERT_CONTEXT pCertContext, //Certificate context to use DWORD cbMessage, //BLOB size PBYTE pbMessage, //BLOB Pointer PEnvData pEnvelopedData, //enveloped data HCRYPTPROV hCryptProv, //crypt provider HCERTSTORE hCertStore //certificate store ) { HCRYPTKEY hEncryptKey = 0, hPubKey = 0; DWORD dwRetCode = ERROR_SUCCESS; DWORD cbBufSize = 0; // //import public key data from the Certificate Context // if( !CryptImportPublicKeyInfoEx( hCryptProv, X509_ASN_ENCODING, &pCertContext->pCertInfo->SubjectPublicKeyInfo, CALG_RSA_KEYX, 0, NULL, &hPubKey ) ) { goto ErrorReturn; } // // Generate a session key to encrypt the message // if( !CryptGenKey( hCryptProv, CALG_RC4, CRYPT_EXPORTABLE, &hEncryptKey ) ) { goto ErrorReturn; } // // allocate enough memory to contain the encrypted data. // // Note: // // we are using the RC4 stream cipher, so the encrypted output buffer size will be the same // as the plaintext input buffer size. If we change to block encryption algorithm, // then we need to determine the output buffer size which may be larger than the // input buffer size. // pEnvelopedData->cbEncryptedData = cbMessage; pEnvelopedData->pbEncryptedData = (PBYTE)LocalAlloc( GPTR, pEnvelopedData->cbEncryptedData ); if( NULL == pEnvelopedData->pbEncryptedData ) { goto ErrorReturn; } // // encrypt the message with the session key // memcpy( pEnvelopedData->pbEncryptedData, pbMessage, cbMessage ); if( !CryptEncrypt( hEncryptKey, 0, TRUE, 0, pEnvelopedData->pbEncryptedData, &pEnvelopedData->cbEncryptedData, cbMessage ) ) { goto ErrorReturn; } // // Determine the size of the buffer that we need to export the // encryption key and then export the key. // The exported encryption key is encrypted with the receipient's // public key. // if( !CryptExportKey( hEncryptKey, hPubKey, SIMPLEBLOB, 0, NULL, &pEnvelopedData->cbEncryptedKey ) ) { goto ErrorReturn; } pEnvelopedData->pbEncryptedKey = (PBYTE)LocalAlloc( GPTR, pEnvelopedData->cbEncryptedKey ); if( NULL == pEnvelopedData->pbEncryptedKey ) { goto ErrorReturn; } if( !CryptExportKey( hEncryptKey, hPubKey, SIMPLEBLOB, 0, pEnvelopedData->pbEncryptedKey, &pEnvelopedData->cbEncryptedKey ) ) { goto ErrorReturn; } done: if( hPubKey ) { CryptDestroyKey( hPubKey ); } if( hEncryptKey ) { CryptDestroyKey( hEncryptKey ); } if( pCertContext ) { CertFreeCertificateContext( pCertContext ); } if( hCertStore ) { CertCloseStore( hCertStore, CERT_CLOSE_STORE_FORCE_FLAG ); } if( hCryptProv ) { CryptReleaseContext( hCryptProv, 0 ); } return( dwRetCode ); ErrorReturn: dwRetCode = GetLastError(); goto done; } DWORD CGlobal::PackEnvData( PEnvData pEnvelopedData, PDWORD pcbPacked, PBYTE *ppbPacked ) { DWORD dwRetCode = ERROR_SUCCESS; PBYTE pCopyPos; // // determine the size of the buffer to allocate // *pcbPacked = pEnvelopedData->cbEncryptedData + pEnvelopedData->cbEncryptedKey + ( sizeof( DWORD ) * 2 ); *ppbPacked = (PBYTE)LocalAlloc( GPTR, *pcbPacked ); if( NULL == ( *ppbPacked ) ) { goto ErrorReturn; } pCopyPos = *ppbPacked; memcpy( pCopyPos, &pEnvelopedData->cbEncryptedKey, sizeof( DWORD ) ); pCopyPos += sizeof( DWORD ); memcpy( pCopyPos, pEnvelopedData->pbEncryptedKey, pEnvelopedData->cbEncryptedKey ); pCopyPos += pEnvelopedData->cbEncryptedKey; memcpy( pCopyPos, &pEnvelopedData->cbEncryptedData, sizeof( DWORD ) ); pCopyPos += sizeof( DWORD ); memcpy( pCopyPos, pEnvelopedData->pbEncryptedData, pEnvelopedData->cbEncryptedData ); done: return( dwRetCode ); ErrorReturn: dwRetCode = GetLastError(); goto done; } DWORD CGlobal::SetCARequestAttributes() { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwDisposition = 0; CString sDelimiter = "~"; TCHAR chDelimiter= '~'; CString sPhoneLabel; CString sFaxLabel; CString sEmailLabel; CString sLSNameLabel; CString sName; CString sAddress; LPTSTR lpVal = NULL; //Clear previous data if any ClearCARequestAttributes(); lpVal = sPhoneLabel.GetBuffer(CA_PHONE_LEN+1); LoadString(GetInstanceHandle(),IDS_PHONE,lpVal,CA_PHONE_LEN+1); sPhoneLabel.ReleaseBuffer(-1); lpVal = sFaxLabel.GetBuffer(CA_PHONE_LEN+1); LoadString(GetInstanceHandle(),IDS_FAX, lpVal, CA_FAX_LEN+1); sFaxLabel.ReleaseBuffer(-1); lpVal = sEmailLabel.GetBuffer(CA_EMAIL_LEN+1); LoadString(GetInstanceHandle(),IDS_EMAIL,lpVal,CA_EMAIL_LEN+1); sEmailLabel.ReleaseBuffer(-1); lpVal = sLSNameLabel.GetBuffer(CA_EMAIL_LEN+1); LoadString(GetInstanceHandle(),IDS_LSNAME,lpVal,CA_EMAIL_LEN+1); sLSNameLabel.ReleaseBuffer(-1); sName = m_ContactData.sContactLName + sDelimiter + m_ContactData.sContactFName; sAddress = m_ContactData.sContactAddress; LPSTR lpszTemp; lpszTemp = UnicodeToAnsi((LPTSTR)(LPCTSTR)sName); SetDNAttribute(szOID_GIVEN_NAME, lpszTemp); delete lpszTemp; lpszTemp = UnicodeToAnsi((LPTSTR)(LPCTSTR)m_ContactData.sCompanyName); SetDNAttribute(szOID_COMMON_NAME, lpszTemp); delete lpszTemp; lpszTemp = UnicodeToAnsi((LPTSTR)(LPCTSTR)m_ContactData.sOrgUnit); SetDNAttribute(szOID_ORGANIZATIONAL_UNIT_NAME, lpszTemp); delete lpszTemp; lpszTemp = UnicodeToAnsi((LPTSTR)(LPCTSTR)m_ContactData.sContactEmail ); SetDNAttribute(szOID_RSA_emailAddr, lpszTemp); delete lpszTemp; lpszTemp = UnicodeToAnsi((LPTSTR)(LPCTSTR)m_ContactData.sCertType ); SetDNAttribute(szOID_TITLE, lpszTemp); delete lpszTemp; lpszTemp = UnicodeToAnsi((LPTSTR)(LPCTSTR)m_ContactData.sContactPhone ); SetDNAttribute(szOID_TELEPHONE_NUMBER, lpszTemp); delete lpszTemp; lpszTemp = UnicodeToAnsi((LPTSTR)(LPCTSTR)m_ContactData.sContactFax ); SetDNAttribute(szOID_FACSIMILE_TELEPHONE_NUMBER, lpszTemp); delete lpszTemp; lpszTemp = UnicodeToAnsi((LPTSTR)(LPCTSTR)m_ContactData.sCity ); SetDNAttribute(szOID_LOCALITY_NAME , lpszTemp); delete lpszTemp; lpszTemp = UnicodeToAnsi((LPTSTR)(LPCTSTR)m_ContactData.sState); SetDNAttribute(szOID_STATE_OR_PROVINCE_NAME, lpszTemp); delete lpszTemp; lpszTemp = UnicodeToAnsi((LPTSTR)(LPCTSTR)m_ContactData.sCountryCode); SetDNAttribute(szOID_COUNTRY_NAME, lpszTemp); delete lpszTemp; lpszTemp = UnicodeToAnsi((LPTSTR)(LPCTSTR)m_ContactData.sZip); SetDNAttribute(szOID_POSTAL_CODE, lpszTemp); delete lpszTemp; lpszTemp = UnicodeToAnsi((LPTSTR)(LPCTSTR)m_ContactData.sCertType); SetDNAttribute(szOID_DESCRIPTION, lpszTemp); delete lpszTemp; lpszTemp = UnicodeToAnsi((LPTSTR)(LPCTSTR)m_lpstrLSName); SetDNAttribute(szOID_SUR_NAME, lpszTemp); delete lpszTemp; return dwRetCode; } DWORD CGlobal::SetCHRequestAttributes() { //Clear previous data if any ClearCHRequestAttributes(); // //Program information // SetRegistrationAttribute ( _PROGRAMNAMETAG, (LPCTSTR)m_ContactData.sProgramName, m_ContactData.sProgramName.GetLength() ); // //Contact information // SetRegistrationAttribute ( _CONTACTLNAMETAG, (LPCTSTR)m_ContactData.sContactLName, m_ContactData.sContactLName.GetLength()); SetRegistrationAttribute ( _CONTACTFNAMETAG, (LPCTSTR)m_ContactData.sContactFName, m_ContactData.sContactFName.GetLength()); SetRegistrationAttribute ( _CONTACTADDRESSTAG, (LPCTSTR)m_ContactData.sContactAddress, m_ContactData.sContactAddress.GetLength()); SetRegistrationAttribute ( _CONTACTPHONETAG, (LPCTSTR)m_ContactData.sContactPhone, m_ContactData.sContactPhone.GetLength()); SetRegistrationAttribute ( _CONTACTFAXTAG, (LPCTSTR)m_ContactData.sContactFax, m_ContactData.sContactFax.GetLength()); SetRegistrationAttribute ( _CONTACTEMAILTAG, (LPCTSTR)m_ContactData.sContactEmail, m_ContactData.sContactEmail.GetLength()); SetRegistrationAttribute ( _CONTACTCITYTAG, (LPCTSTR)m_ContactData.sCity, m_ContactData.sCity.GetLength()); SetRegistrationAttribute ( _CONTACTCOUNTRYTAG, (LPCTSTR)m_ContactData.sCountryCode, m_ContactData.sCountryCode.GetLength()); SetRegistrationAttribute ( _CONTACTSTATE, (LPCTSTR)m_ContactData.sState, m_ContactData.sState.GetLength()); SetRegistrationAttribute ( _CONTACTZIP, (LPCTSTR)m_ContactData.sZip, m_ContactData.sZip.GetLength()); // //customer information // SetRegistrationAttribute ( _CUSTOMERNAMETAG, (LPCTSTR)m_ContactData.sCompanyName, m_ContactData.sCompanyName.GetLength()); //Program related information if ( m_ContactData.sProgramName == PROGRAM_SELECT ) { //Select SetRegistrationAttribute ( _SELMASTERAGRNUMBERTAG, (LPCTSTR)m_LicData.sSelMastAgrNumber, m_LicData.sSelMastAgrNumber.GetLength() ); SetRegistrationAttribute ( _SELENROLLNUMBERTAG, (LPCTSTR)m_LicData.sSelEnrollmentNumber, m_LicData.sSelEnrollmentNumber.GetLength()); SetRegistrationAttribute ( _SELPRODUCTTYPETAG, (LPCTSTR)m_LicData.sSelProductType, m_LicData.sSelProductType.GetLength()); SetRegistrationAttribute ( _SELQTYTAG, (LPCTSTR)m_LicData.sSelQty, m_LicData.sSelQty.GetLength()); } else if ( m_ContactData.sProgramName == PROGRAM_MOLP ) { //MOLP SetRegistrationAttribute ( _MOLPAUTHNUMBERTAG, (LPCTSTR)m_LicData.sMOLPAuthNumber, m_LicData.sMOLPAuthNumber.GetLength()); SetRegistrationAttribute ( _MOLPAGREEMENTNUMBERTAG, (LPCTSTR)m_LicData.sMOLPAgreementNumber, m_LicData.sMOLPAgreementNumber.GetLength()); SetRegistrationAttribute ( _MOLPPRODUCTTYPETAG, (LPCTSTR)m_LicData.sMOLPProductType, m_LicData.sMOLPProductType.GetLength()); SetRegistrationAttribute ( _MOLPQTYTAG, (LPCTSTR)m_LicData.sMOLPQty, m_LicData.sMOLPQty.GetLength()); } else if ( m_ContactData.sProgramName == PROGRAM_RETAIL ) { //Retail //SetRegistrationAttribute ( _MFGINFOTAG, (LPCTSTR)m_CHData.sOthARBlob, m_CHData.sOthARBlob.GetLength(), FALSE ); } //Shipping address information //For Offline , always put the shipping address info //for Online , no need to put the shipping address. return ERROR_SUCCESS; } DWORD CGlobal::LoadCountries() { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwIndex = 0; CString sCountry; LPTSTR lpVal = NULL; DWORD dwSize = LR_COUNTRY_DESC_LEN+LR_COUNTRY_CODE_LEN+128; LPTSTR szDelimiter = (LPTSTR)L":"; m_csaCountryDesc.SetSize(IDS_COUNTRY_END - IDS_COUNTRY_START + 1); m_csaCountryCode.SetSize(IDS_COUNTRY_END - IDS_COUNTRY_START + 1); for(dwIndex = IDS_COUNTRY_START;dwIndex <= IDS_COUNTRY_END;dwIndex++) { lpVal = sCountry.GetBuffer(dwSize); LoadString(GetInstanceHandle(),dwIndex,lpVal,dwSize); m_csaCountryDesc[dwIndex-IDS_COUNTRY_START] = _tcstok(lpVal,szDelimiter); m_csaCountryCode[dwIndex-IDS_COUNTRY_START] = _tcstok(NULL,szDelimiter); sCountry.ReleaseBuffer(-1); } return dwRetCode; } DWORD CGlobal::PopulateCountryComboBox(HWND hWndCmb) { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwIndex = 0; CString sDesc; LPTSTR lpVal = NULL; for(dwIndex=0;dwIndex <= IDS_COUNTRY_END - IDS_COUNTRY_START;dwIndex++) { sDesc = m_csaCountryDesc[dwIndex]; lpVal = sDesc.GetBuffer(LR_COUNTRY_DESC_LEN); ComboBox_AddString(hWndCmb,lpVal); sDesc.ReleaseBuffer(-1); } return dwRetCode; } DWORD CGlobal::GetCountryCode(CString sDesc,LPTSTR szCode) { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwIndex = 0; for(dwIndex=0;dwIndex <= IDS_COUNTRY_END - IDS_COUNTRY_START;dwIndex++) { if(m_csaCountryDesc[dwIndex] == sDesc) break; } if(dwIndex > IDS_COUNTRY_END - IDS_COUNTRY_START) _tcscpy(szCode,CString("")); //Not found else _tcscpy(szCode,m_csaCountryCode[dwIndex]); return dwRetCode; } DWORD CGlobal::GetCountryDesc(CString sCode,LPTSTR szDesc) { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwIndex = 0; for(dwIndex=0;dwIndex <= IDS_COUNTRY_END - IDS_COUNTRY_START;dwIndex++) { if(m_csaCountryCode[dwIndex] == sCode) break; } if(dwIndex > IDS_COUNTRY_END - IDS_COUNTRY_START) _tcscpy(szDesc,CString("")); //Not found else _tcscpy(szDesc,m_csaCountryDesc[dwIndex]); return dwRetCode; } DWORD CGlobal::LoadProducts() { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwIndex = 0; CString sProduct; LPTSTR lpVal = NULL; DWORD dwSize = LR_PRODUCT_DESC_LEN+LR_PRODUCT_CODE_LEN+128; BOOL fWin2000 = !m_fSupportConcurrent; DWORD dwNumProducts = 0; if ((!m_fSupportWhistlerCAL) && (!m_fSupportConcurrent)) { dwNumProducts = IDS_PRODUCT_CONCURRENT - IDS_PRODUCT_START; } else if(m_fSupportConcurrent && !(m_fSupportWhistlerCAL)) { dwNumProducts = (IDS_PRODUCT_CONCURRENT - IDS_PRODUCT_START) + 1; } else if((!m_fSupportConcurrent) && m_fSupportWhistlerCAL) { dwNumProducts = (IDS_PRODUCT_CONCURRENT - IDS_PRODUCT_START) + 1; } else if(m_fSupportConcurrent && m_fSupportWhistlerCAL) { dwNumProducts = (IDS_PRODUCT_CONCURRENT - IDS_PRODUCT_START) + 2; } DWORD dwArray = 0; LPTSTR szDelimiter = (LPTSTR)L":"; m_csaProductDesc.SetSize(dwNumProducts); m_csaProductCode.SetSize(dwNumProducts); for(dwIndex = IDS_PRODUCT_START; dwIndex < (IDS_PRODUCT_START + dwNumProducts) ; dwIndex++) { if ( !m_fSupportConcurrent && dwIndex == IDS_PRODUCT_CONCURRENT) continue; if( !m_fSupportWhistlerCAL && dwIndex == IDS_PRODUCT_WHISTLER) continue; lpVal = sProduct.GetBuffer(dwSize); LoadString(GetInstanceHandle(),dwIndex,lpVal,dwSize); m_csaProductDesc[dwArray] = _tcstok(lpVal,szDelimiter); m_csaProductCode[dwArray] = _tcstok(NULL,szDelimiter); dwArray++; sProduct.ReleaseBuffer(-1); } return dwRetCode; } DWORD CGlobal::PopulateProductComboBox(HWND hWndCmb) { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwIndex = 0; CString sDesc; LPTSTR lpVal = NULL; DWORD dwNumProducts = 0; if ((!m_fSupportWhistlerCAL) && (!m_fSupportConcurrent)) { dwNumProducts = IDS_PRODUCT_CONCURRENT - IDS_PRODUCT_START; } else if(m_fSupportConcurrent && !(m_fSupportWhistlerCAL)) { dwNumProducts = (IDS_PRODUCT_CONCURRENT - IDS_PRODUCT_START) + 1; } else if((!m_fSupportConcurrent) && m_fSupportWhistlerCAL) { dwNumProducts = (IDS_PRODUCT_CONCURRENT - IDS_PRODUCT_START) + 1; } else if(m_fSupportConcurrent && m_fSupportWhistlerCAL) { dwNumProducts = (IDS_PRODUCT_CONCURRENT - IDS_PRODUCT_START) + 2; } for(dwIndex=0; dwIndex < dwNumProducts; dwIndex++) { sDesc = m_csaProductDesc[dwIndex]; lpVal = sDesc.GetBuffer(LR_PRODUCT_DESC_LEN); ComboBox_AddString(hWndCmb,lpVal); sDesc.ReleaseBuffer(-1); } return dwRetCode; } DWORD CGlobal::GetProductCode(CString sDesc,LPTSTR szCode) { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwIndex = 0; DWORD dwNumProducts = 0; if ((!m_fSupportWhistlerCAL) && (!m_fSupportConcurrent)) { dwNumProducts = IDS_PRODUCT_CONCURRENT - IDS_PRODUCT_START; } else if(m_fSupportConcurrent && !(m_fSupportWhistlerCAL)) { dwNumProducts = (IDS_PRODUCT_CONCURRENT - IDS_PRODUCT_START) + 1; } else if((!m_fSupportConcurrent) && m_fSupportWhistlerCAL) { dwNumProducts = (IDS_PRODUCT_CONCURRENT - IDS_PRODUCT_START) + 1; } else if(m_fSupportConcurrent && m_fSupportWhistlerCAL) { dwNumProducts = (IDS_PRODUCT_CONCURRENT - IDS_PRODUCT_START) + 2; } for(dwIndex=0; dwIndex < dwNumProducts; dwIndex++) { if(m_csaProductDesc[dwIndex] == sDesc) break; } if(dwIndex >= dwNumProducts ) _tcscpy(szCode,CString("")); //Not found else _tcscpy(szCode,m_csaProductCode[dwIndex]); return dwRetCode; } //Load all react and deact reasons DWORD CGlobal::LoadReasons() { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwIndex = 0; CString sReason; LPTSTR lpVal = NULL; DWORD dwSize = LR_REASON_CODE_LEN+LR_REASON_DESC_LEN+128; LPTSTR szDelimiter = (LPTSTR)L":"; m_csaReactReasonDesc.SetSize( IDS_REACT_REASONS_END - IDS_REACT_REASONS_START + 1); m_csaReactReasonCode.SetSize( IDS_REACT_REASONS_END - IDS_REACT_REASONS_START + 1); m_csaDeactReasonDesc.SetSize(IDS_DEACT_REASONS_END - IDS_DEACT_REASONS_START + 1); m_csaDeactReasonCode.SetSize(IDS_DEACT_REASONS_END - IDS_DEACT_REASONS_START + 1); //load the reacr for(dwIndex = IDS_REACT_REASONS_START;dwIndex <= IDS_REACT_REASONS_END; dwIndex++) { lpVal = sReason.GetBuffer(dwSize); LoadString(GetInstanceHandle(),dwIndex,lpVal,dwSize); m_csaReactReasonDesc[dwIndex-IDS_REACT_REASONS_START] = _tcstok(lpVal,szDelimiter); m_csaReactReasonCode[dwIndex-IDS_REACT_REASONS_START] = _tcstok(NULL,szDelimiter); sReason.ReleaseBuffer(-1); } for ( dwIndex = IDS_DEACT_REASONS_START; dwIndex <= IDS_DEACT_REASONS_END; dwIndex ++ ) { lpVal = sReason.GetBuffer(dwSize); LoadString(GetInstanceHandle(),dwIndex,lpVal,dwSize); m_csaDeactReasonDesc[dwIndex-IDS_DEACT_REASONS_START] = _tcstok(lpVal,szDelimiter); m_csaDeactReasonCode[dwIndex-IDS_DEACT_REASONS_START] = _tcstok(NULL,szDelimiter); sReason.ReleaseBuffer(-1); } return dwRetCode; } DWORD CGlobal::PopulateReasonComboBox(HWND hWndCmb, DWORD dwType) { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwIndex = 0; CString sDesc; LPTSTR lpVal = NULL; DWORD dwNumItems = 0; //If combo box is already populated,just return success if(ComboBox_GetCount(hWndCmb) > 0) return dwRetCode; ComboBox_ResetContent( hWndCmb); if ( dwType == CODE_TYPE_REACT ) { dwNumItems = IDS_REACT_REASONS_END - IDS_REACT_REASONS_START ; } else if ( dwType == CODE_TYPE_DEACT ) { dwNumItems = IDS_DEACT_REASONS_END - IDS_DEACT_REASONS_START ; } else { dwRetCode = ERROR_INVALID_PARAMETER; goto done; } for(dwIndex=0;dwIndex <= dwNumItems;dwIndex++) { if ( dwType == CODE_TYPE_REACT ) { sDesc = m_csaReactReasonDesc[dwIndex]; } else if ( dwType == CODE_TYPE_DEACT ) { sDesc = m_csaDeactReasonDesc[dwIndex]; } lpVal = sDesc.GetBuffer(LR_REASON_DESC_LEN); ComboBox_AddString(hWndCmb,lpVal); sDesc.ReleaseBuffer(-1); } done: return dwRetCode; } DWORD CGlobal::GetReasonCode(CString sDesc,LPTSTR szCode, DWORD dwType) { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwIndex = 0; DWORD dwNumItems = 0; if ( dwType == CODE_TYPE_REACT ) { dwNumItems = IDS_REACT_REASONS_END - IDS_REACT_REASONS_START ; } else if ( dwType == CODE_TYPE_DEACT ) { dwNumItems = IDS_DEACT_REASONS_END - IDS_DEACT_REASONS_START ; } for(dwIndex=0;dwIndex <= dwNumItems;dwIndex++) { if ( dwType == CODE_TYPE_REACT ) { if ( m_csaReactReasonDesc[dwIndex] == sDesc ) break; } else if ( dwType == CODE_TYPE_DEACT ) { if ( m_csaDeactReasonDesc[dwIndex] == sDesc ) break; } } if(dwIndex > dwNumItems) _tcscpy(szCode,CString("")); //Not found else { if ( dwType == CODE_TYPE_REACT ) { _tcscpy(szCode,m_csaReactReasonCode[dwIndex]); } else if ( dwType == CODE_TYPE_DEACT ) { _tcscpy(szCode,m_csaDeactReasonCode[dwIndex]); } } return dwRetCode; } DWORD CGlobal::GetReasonDesc(CString sCode,LPTSTR szDesc, DWORD dwType) { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwIndex = 0; DWORD dwNumItems = 0; if ( dwType == CODE_TYPE_REACT ) { dwNumItems = IDS_REACT_REASONS_END - IDS_REACT_REASONS_START ; } else if ( dwType == CODE_TYPE_DEACT ) { dwNumItems = IDS_DEACT_REASONS_END - IDS_DEACT_REASONS_START ; } for(dwIndex=0;dwIndex <= dwNumItems;dwIndex++) { if ( dwType == CODE_TYPE_REACT ) { if ( m_csaReactReasonCode[dwIndex] == sCode ) break; } else if ( dwType == CODE_TYPE_DEACT ) { if ( m_csaDeactReasonCode[dwIndex] == sCode ) break; } } if(dwIndex > dwNumItems) _tcscpy(szDesc,CString("")); //Not found else { if ( dwType == CODE_TYPE_REACT ) { _tcscpy(szDesc,m_csaReactReasonDesc[dwIndex]); } else if ( dwType == CODE_TYPE_DEACT ) { _tcscpy(szDesc,m_csaDeactReasonDesc[dwIndex]); } } return dwRetCode; } DWORD CGlobal::CheckRegistryForPhoneNumbers() { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwIndex = 0; HKEY hKey = NULL; DWORD dwDisposition = 0; DWORD dwType = REG_SZ; DWORD dwValName; DWORD dwCS_Number; TCHAR lpValueName[ 128]; TCHAR lpCS_Number[ 128]; // // Try to open the required registry key // dwRetCode = ConnectToLSRegistry(); if (dwRetCode != ERROR_SUCCESS) { goto done; } dwRetCode = RegCreateKeyEx (m_hLSRegKey, REG_LRWIZ_CSNUMBERS, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition); if (dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_REGCREATE_FAILED; goto done; } do { dwValName = sizeof(lpValueName)/sizeof(TCHAR); dwCS_Number = sizeof(lpCS_Number); dwRetCode = RegEnumValue(hKey, dwIndex, lpValueName, &dwValName, NULL, &dwType, (BYTE *) lpCS_Number, &dwCS_Number); if (dwRetCode == ERROR_NO_MORE_ITEMS) { dwRetCode = ERROR_SUCCESS; break; } else if (dwRetCode != ERROR_SUCCESS ) { break; } if(dwType != REG_SZ) continue; dwIndex++; } while (1); if (dwIndex <= 0) { dwRetCode = IDS_ERR_REGERROR; } done: if (hKey) { RegCloseKey(hKey); } DisconnectLSRegistry(); return dwRetCode; } DWORD CGlobal::PopulateCountryRegionComboBox(HWND hWndCmb) { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwIndex = 0; HKEY hKey = NULL; DWORD dwDisposition = 0; DWORD dwType = REG_SZ; DWORD dwValName; DWORD dwCS_Number; LVITEM lvItem; DWORD nItem; TCHAR lpValueName[ 128]; TCHAR lpCS_Number[ 128]; // // Get CSR Numbers from the Reqgistry // dwRetCode = ConnectToLSRegistry(); if (dwRetCode != ERROR_SUCCESS) { goto done; } dwRetCode = RegCreateKeyEx (m_hLSRegKey, REG_LRWIZ_CSNUMBERS, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition); if (dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_REGCREATE_FAILED; goto done; } //Clear the List first ListView_DeleteAllItems(hWndCmb); do { dwValName = sizeof(lpValueName)/sizeof(TCHAR); dwCS_Number = sizeof(lpCS_Number); dwRetCode = RegEnumValue(hKey, dwIndex, lpValueName, &dwValName, NULL, &dwType, (BYTE *) lpCS_Number, &dwCS_Number); if (dwRetCode == ERROR_NO_MORE_ITEMS) { dwRetCode = ERROR_SUCCESS; break; } else if (dwRetCode != ERROR_SUCCESS ) { break; } dwIndex++; if(dwType != REG_SZ) continue; lvItem.mask = LVIF_TEXT; lvItem.iItem = 0; lvItem.iSubItem = 0; lvItem.pszText = lpValueName; lvItem.cchTextMax = lstrlen(lpValueName); nItem = ListView_InsertItem(hWndCmb, &lvItem); lvItem.iSubItem = 1; lvItem.iItem = nItem; lvItem.pszText = lpCS_Number; lvItem.cchTextMax = lstrlen(lpCS_Number); ListView_SetItem(hWndCmb, &lvItem); // ComboBox_AddString(hWndCmb,lpVal); } while (1); if (dwIndex <= 0) { dwRetCode = IDS_ERR_REGERROR; } done: if (hKey) { RegCloseKey(hKey); } DisconnectLSRegistry(); return dwRetCode; } void CGlobal::LRSetLastRetCode(DWORD dwCode) { m_dwLastRetCode = dwCode; } DWORD CGlobal::LRGetLastRetCode() { return m_dwLastRetCode; } LPWSTR CGlobal::AnsiToUnicode ( LPSTR lpszBuf ) { LPWSTR lpwszRetBuf = NULL; long lBufLen = ::lstrlenA(lpszBuf) + 1; lpwszRetBuf = new WCHAR[ lBufLen ]; memset ( lpwszRetBuf, 0, lBufLen * sizeof(TCHAR)); MultiByteToWideChar ( GetACP(), MB_PRECOMPOSED, lpszBuf, -1, lpwszRetBuf, lBufLen ); return lpwszRetBuf; } LPSTR CGlobal::UnicodeToAnsi( LPWSTR lpwszBuf, DWORD dwLength ) { LPSTR lpszRetBuf = NULL; lpszRetBuf = new char[dwLength+1]; memset ( lpszRetBuf,0,dwLength+1); WideCharToMultiByte(GetACP(), // code page 0, // performance and mapping flags lpwszBuf, // address of wide-character string dwLength, // number of characters in string lpszRetBuf, // address of buffer for new string //dwLength+1, //BUG # 585 // size of buffer (dwLength+1) * sizeof(TCHAR), // size of buffer in bytes NULL, // address of default for unmappable characters NULL // address of flag set when default char. used ); return lpszRetBuf; } LPSTR CGlobal::UnicodeToAnsi( LPWSTR lpwszBuf) { LPSTR lpszRetBuf = NULL; long lBufLen = ::lstrlenW(lpwszBuf)+1; lpszRetBuf = new char[lBufLen]; WideCharToMultiByte(GetACP(), // code page 0, // performance and mapping flags lpwszBuf, // address of wide-character string -1, // number of characters in string lpszRetBuf, // address of buffer for new string //lBufLen, //BUG # 585 // size of buffer lBufLen * sizeof(TCHAR), // size of buffer in bytes NULL, // address of default for unmappable characters NULL // address of flag set when default char. used ); return lpszRetBuf; } void CGlobal::LRPush(DWORD dwPageId) { assert(m_dwTop < NO_OF_PAGES - 1); m_dwWizStack[m_dwTop++] = dwPageId; } DWORD CGlobal::LRPop() { assert(m_dwTop > 0); return m_dwWizStack[--m_dwTop]; } BOOL CGlobal::ValidateEmailId(CString sEmailId) { BOOL bValid = FALSE; int dwLen = 0; dwLen = sEmailId.GetLength(); do { // Check the length if(dwLen < EMAIL_MIN_LEN) break; // Make sure it does not have spaces if(sEmailId.Find(EMAIL_SPACE_CHAR) != -1) break; // Make sure it has '@' & '.' in it if(sEmailId.Find(EMAIL_AT_CHAR) == -1 || sEmailId.Find(EMAIL_DOT_CHAR) == -1) break; // Make sure first char is not either EMAIL_AT_CHAR or EMAIL_DOT_CHAR if(sEmailId[0] == EMAIL_AT_CHAR || sEmailId[0] == EMAIL_DOT_CHAR) break; // Make sure last char is not either EMAIL_AT_CHAR or EMAIL_DOT_CHAR if(sEmailId[dwLen-1] == EMAIL_AT_CHAR || sEmailId[dwLen-1] == EMAIL_DOT_CHAR) break; // EMAIL_AT_CHAR should come only once if(sEmailId.Find(EMAIL_AT_CHAR) != sEmailId.ReverseFind(EMAIL_AT_CHAR)) break; //It should not have these string "@." or ".@" if(sEmailId.Find(EMAIL_AT_DOT_STR) != -1 || sEmailId.Find(EMAIL_DOT_AT_STR) != -1) break; bValid = TRUE; } while(FALSE); return bValid; } BOOL CGlobal::CheckProgramValidity (CString sProgramName ) { BOOL bRetCode = FALSE; // if(sProgramName == PROGRAM_SELECT) // { // //select // if(strstr ( (const char *)m_pbExtensionValue+3, CA_CERT_TYPE_SELECT ) ) // { // bRetCode = TRUE; // } // } // else if ( sProgramName == PROGRAM_MOLP || sProgramName == PROGRAM_RETAIL ) // { //retail or MOLP // if (strstr ( (const char *)m_pbExtensionValue+3, CA_CERT_TYPE_SELECT ) || // strstr ( (const char *)m_pbExtensionValue+3, CA_CERT_TYPE_OTHER ) // ) // { bRetCode = TRUE; // } // } // return bRetCode; } // // This function searches for Single quote (') and replaces it will two single quotes ('') // This is because , SQL server gives error if the string contains single quote // void CGlobal::PrepareLRString(CString &sStr) { CString sTemp; int nIndex = 0; for(nIndex=0;nIndex < sStr.GetLength();nIndex++) { if(sStr[nIndex] == LR_SINGLE_QUOTE) { sTemp += LR_SINGLE_QUOTE; sTemp += LR_SINGLE_QUOTE; } else sTemp += sStr[nIndex]; } sStr = sTemp; } // // This functions checks for any invalid chars in the string // BOOL CGlobal::ValidateLRString(CString sStr) { CString sInvalidChars = LR_INVALID_CHARS; if(sStr.FindOneOf(sInvalidChars) != -1) return FALSE; else return TRUE; } // //Validate the certificate chain for a given store. This is an overkill but //will make it more robust! // DWORD CGlobal::VerifyCertChain ( HCRYPTPROV hCryptProvider, //handle to crypt prov HCERTSTORE hCertStore, //HAndle to store for verification PBYTE pbRootCert, //Root cert DWORD dwcbRootCert ) { DWORD dwRetVal = ERROR_SUCCESS; PCCERT_CONTEXT pRootCertContext = NULL; PCCERT_CONTEXT pCertContext = NULL; PCCERT_CONTEXT pIssuerCertContext = NULL; DWORD dwFlags = CERT_STORE_SIGNATURE_FLAG; if ( NULL == hCryptProvider || NULL == hCertStore || NULL == pbRootCert || dwcbRootCert <= 0 ) { LRSetLastError (ERROR_INVALID_PARAMETER); dwRetVal = IDS_ERR_CRYPT_ERROR; goto done; } //Create a Root certificate context pRootCertContext = CertCreateCertificateContext ( X509_ASN_ENCODING, pbRootCert, dwcbRootCert ); if ( pRootCertContext == NULL ) { LRSetLastError (GetLastError()); dwRetVal = IDS_ERR_CRYPT_ERROR; goto done; } //check to see if there is a certificate with our extension in the store. Then use that as the //starting point dwRetVal = GetCertforExtension (hCryptProvider, hCertStore, szOID_NULL_EXT, &pCertContext); if ( dwRetVal != ERROR_SUCCESS ) { LRSetLastError(dwRetVal ); dwRetVal = IDS_ERR_CRYPT_ERROR; goto done; } //Walk the chain here do { pIssuerCertContext = CertGetIssuerCertificateFromStore( hCertStore, pCertContext, NULL, // pIssuerCertContext, &dwFlags ); if ( pIssuerCertContext ) { //check to see the result. if ( dwFlags & CERT_STORE_SIGNATURE_FLAG ) { LRSetLastError(GetLastError()); dwRetVal = IDS_ERR_INVALID_CERT_CHAIN; break; } dwFlags = CERT_STORE_SIGNATURE_FLAG; CertFreeCertificateContext (pCertContext); pCertContext = pIssuerCertContext; } } while ( pIssuerCertContext ); if ( dwRetVal != ERROR_SUCCESS ) { goto done; } //Verify the last issuer against the root passed in dwFlags = CERT_STORE_REVOCATION_FLAG | CERT_STORE_SIGNATURE_FLAG | CERT_STORE_TIME_VALIDITY_FLAG; if ( !CertVerifySubjectCertificateContext( pCertContext, pRootCertContext, &dwFlags ) ) { dwRetVal = GetLastError(); goto done; } //check to see the result. if ( dwFlags & CERT_STORE_SIGNATURE_FLAG ) { LRSetLastError(GetLastError()); dwRetVal = IDS_ERR_INVALID_CERT_CHAIN; } done: if (pCertContext != NULL) { CertFreeCertificateContext(pCertContext); } if (pRootCertContext != NULL) { CertFreeCertificateContext(pRootCertContext); } return dwRetVal; } DWORD CGlobal::GetCertforExtension (HCRYPTPROV hCryptProv, HCERTSTORE hCertStore, LPSTR szOID_EXT, PCCERT_CONTEXT * ppCertContext) { DWORD dwRetVal = ERROR_SUCCESS; PCCERT_CONTEXT pCurrentContext = NULL; PCCERT_CONTEXT pPrevContext = NULL; PCERT_EXTENSION pCertExtension = NULL; if ( hCryptProv == NULL || hCertStore == NULL || ppCertContext == NULL ) { dwRetVal = ERROR_INVALID_PARAMETER; goto done; } *ppCertContext = NULL; do { //Get the cert context pCurrentContext = CertEnumCertificatesInStore ( hCertStore, pPrevContext ); if ( pCurrentContext ) { //Check to see if the Extension is present in the cert context pCertExtension = CertFindExtension ( szOID_NULL_EXT, pCurrentContext->pCertInfo->cExtension, pCurrentContext->pCertInfo->rgExtension ); if ( pCertExtension ) { *ppCertContext = pCurrentContext; goto done; } pPrevContext = pCurrentContext; } } while ( pCurrentContext ); dwRetVal = CRYPT_E_NOT_FOUND; //CErt not found done: // if ( pPrevContext ) // { // CertFreeCertificateContext (pPrevContext); // } if ( !*ppCertContext && pCurrentContext ) { CertFreeCertificateContext (pCurrentContext); } return dwRetVal; } DWORD CGlobal::FetchResponse(BYTE * bpResponse, DWORD dwMaxLength, PDWORD dwpDataLength) { DWORD dwCHRC = ERROR_SUCCESS; DWORD dwBytesRead = 0; BOOL bRC = FALSE; BYTE * bpCurrent = bpResponse; *dwpDataLength = 0; assert(m_hOpenDirect != NULL); assert(m_hRequest != NULL); assert(m_hConnect != NULL); while ( dwMaxLength > 0 && (bRC = InternetReadFile ( m_hRequest, bpResponse, dwMaxLength, &dwBytesRead )) && dwBytesRead) { dwMaxLength -= dwBytesRead; (*dwpDataLength) += dwBytesRead; } if (!bRC) { // dwCHRC = GetLastError(); dwCHRC = IDS_ERR_CHFETCHRESPONSE; } return dwCHRC; } DWORD CGlobal::InitCHRequest(void) { DWORD dwRetCode = ERROR_SUCCESS; const char *pszAcceptedTypes[] = {"*/*",NULL}; LPSTR lpszCHName = UnicodeToAnsi((LPTSTR)(LPCTSTR) m_lpstrCHServer); LPSTR lpszExtension = UnicodeToAnsi((LPTSTR)(LPCTSTR) m_lpstrCHExtension); assert(m_hOpenDirect == NULL); assert(m_hConnect == NULL); assert(m_hRequest == NULL); //m_hOpenDirect = InternetOpenA ( "LRWizDLL", NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, 0 ); //Bug # 526 m_hOpenDirect = InternetOpenA ( "LRWizDLL", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 ); if (m_hOpenDirect == NULL) { dwRetCode = GetLastError(); goto done; } m_hConnect = InternetConnectA (m_hOpenDirect, lpszCHName, INTERNET_DEFAULT_HTTPS_PORT , NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0) ; if ( !m_hConnect ) { dwRetCode = GetLastError(); goto done; } m_hRequest = HttpOpenRequestA ( m_hConnect, "POST", lpszExtension, "HTTP/1.0", NULL, pszAcceptedTypes, INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID, NULL ); //(DWORD)this); if ( !m_hRequest ) { dwRetCode = GetLastError(); goto done; } done: if (lpszCHName) { delete lpszCHName; } if (lpszExtension) { delete lpszExtension; } if (dwRetCode != ERROR_SUCCESS) { CloseCHRequest(); } return dwRetCode; } DWORD CGlobal::CloseCHRequest(void) { if (m_hRequest) { InternetCloseHandle(m_hRequest); m_hRequest = NULL; } if (m_hConnect) { InternetCloseHandle(m_hConnect); m_hConnect = NULL; } if (m_hOpenDirect) { InternetCloseHandle(m_hOpenDirect); m_hOpenDirect = NULL; } return ERROR_SUCCESS; } DWORD CGlobal::Dispatch(BYTE * bpData, DWORD dwLen) { DWORD dwCHRC = ERROR_SUCCESS;; DWORD dwPostStatus = 0; DWORD dwPostStatusSize = sizeof(dwPostStatus); DWORD dwFlags; DWORD dwBufLen = sizeof(dwFlags); assert(m_hOpenDirect != NULL); assert(m_hRequest != NULL); assert(m_hConnect != NULL); try { BOOL bRC = TRUE; char szContentType[] = "Content-Type: application/octet-stream\r\n"; if ( !HttpAddRequestHeadersA ( m_hRequest, szContentType, -1L, HTTP_ADDREQ_FLAG_ADD|HTTP_ADDREQ_FLAG_REPLACE ) ) { DWORD dwError = GetLastError(); } bRC = HttpSendRequestA( m_hRequest, NULL, 0, bpData, //binary data dwLen //length of the data ); if (!bRC) { if (GetLastError() == ERROR_INTERNET_INVALID_CA) { InternetQueryOptionA(m_hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID) &dwFlags, &dwBufLen); dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA; InternetSetOptionA(m_hRequest, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID) &dwFlags, sizeof(dwFlags)); bRC = HttpSendRequestA( m_hRequest, NULL, 0, bpData, //binary data dwLen); //length of the data } } if (bRC) { if ( HttpQueryInfoA( m_hRequest, HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_STATUS_CODE, (LPVOID)&dwPostStatus, &dwPostStatusSize, NULL ) ) { if ( dwPostStatus != 200 ) { dwCHRC = CH_ERROR_HTTPQRY_FAILED; throw dwCHRC; } } else { dwCHRC = GetLastError(); throw dwCHRC; } } else { dwCHRC = GetLastError(); dwCHRC = CH_ERROR_SEND_FAILED; throw dwCHRC; } } catch (DWORD dwRC) { dwCHRC = dwRC; } catch (...) { assert("Exception in Dispatch() !"); dwCHRC = CH_ERROR_EXCEPTION; } if (dwCHRC != ERROR_SUCCESS) { dwCHRC = IDS_ERR_SEND_FAILED; } return dwCHRC; } DWORD CGlobal::PingCH(void) { DWORD dwRetCode = ERROR_SUCCESS; Ping_Request pingData; Ping_Response pingResp; BYTE bResponse[ 1024]; DWORD dwDataLength; // // Set Language Id // pingData.RequestHeader.SetLanguageId(GetLSLangId()); dwRetCode = InitCHRequest(); if (dwRetCode != ERROR_SUCCESS) { goto done; } dwRetCode = Dispatch((BYTE *) &pingData, sizeof(Ping_Request)); if (dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); goto done; } dwRetCode = FetchResponse(bResponse, sizeof(bResponse), &dwDataLength); if (dwRetCode != ERROR_SUCCESS) { goto done; } // Now let us ensure that we are getting the expected byte stream back // AND if we are, we are good to go. memcpy(&pingResp, bResponse, sizeof(Ping_Response)); if (lstrcmp(pingResp.tszPingResponse, L"Beam'er up Scottie!") != 0) { // Expected Response dwRetCode = IDS_ERR_CHBAD_DATA; goto done; } done: CloseCHRequest(); return dwRetCode; } DWORD CGlobal::ProcessIRegRequest() { DWORD dwRetCode = ERROR_SUCCESS; NewCert_Request certRequest; NewCert_Response certResponse; Certificate_AckRequest certackRequest; Certificate_AckResponse certackResponse; HCRYPTPROV hCryptProv = NULL; LPWSTR lpwszExchgPKCS10 = NULL; LPWSTR lpwszSignPKCS10 = NULL; LPBYTE lpszReqData = NULL; LPBYTE lpszNextCopyPos = NULL; LPSTR lpszExchgPKCS10 = NULL; LPSTR lpszSigPKCS10 = NULL; DWORD dwExchangeLen = 0; DWORD dwSignLen = 0; DWORD dwResponseLength = 0; PBYTE lpszResData = NULL; DWORD dwExchgCertLen = 0; DWORD dwSigCertLen = 0; DWORD dwRootCertLen = 0; LPSTR lpszExchCert = NULL; LPSTR lpszSignCert = NULL; LPSTR lpszRootCert = NULL; bool bToSendAck = false; // // Set the LangId // certRequest.RequestHeader.SetLanguageId(GetLSLangId()); dwRetCode = InitCHRequest(); if (dwRetCode != ERROR_SUCCESS) { return dwRetCode; } try { swprintf(certRequest.stCertInfo.OrgName, L"%.*s", CA_CUSTMER_NAME_LEN, (LPCTSTR) m_ContactData.sCompanyName); swprintf(certRequest.stCertInfo.OrgUnit, L"%.*s", CA_ORG_UNIT_LEN, (LPCTSTR) m_ContactData.sOrgUnit); swprintf(certRequest.stCertInfo.Address, L"%.*s", CA_ADDRESS_LEN, (LPCTSTR) m_ContactData.sContactAddress); swprintf(certRequest.stCertInfo.City, L"%.*s", CA_CITY_LEN, (LPCTSTR) m_ContactData.sCity); swprintf(certRequest.stCertInfo.State, L"%.*s", CA_STATE_LEN, (LPCTSTR) m_ContactData.sState); swprintf(certRequest.stCertInfo.Country, L"%.*s", CA_COUNTRY_LEN, (LPCTSTR) m_ContactData.sCountryCode); swprintf(certRequest.stCertInfo.Zip, L"%.*s", CA_ZIP_LEN, (LPCTSTR) m_ContactData.sZip); swprintf(certRequest.stCertInfo.LName, L"%.*s", CA_NAME_LEN, (LPCTSTR) m_ContactData.sContactLName); swprintf(certRequest.stCertInfo.FName, L"%.*s", CA_NAME_LEN, (LPCTSTR) m_ContactData.sContactFName); swprintf(certRequest.stCertInfo.Phone, L"%.*s", CA_PHONE_LEN, (LPCTSTR) m_ContactData.sContactPhone); swprintf(certRequest.stCertInfo.Fax, L"%.*s", CA_FAX_LEN, (LPCTSTR) m_ContactData.sContactFax); swprintf(certRequest.stCertInfo.Email, L"%.*s", CA_EMAIL_LEN, (LPCTSTR) m_ContactData.sContactEmail); swprintf(certRequest.stCertInfo.LSID, L"%.*s", CA_LSERVERID_LEN, (LPCTSTR) m_pLicenseServerID ); swprintf(certRequest.stCertInfo.ProgramName, L"%.*s", 63, (GetGlobalContext()->GetContactDataObject()->sProgramName == PROGRAM_SELECT ? L"SELECT" : L"BASIC")); // // GetGlobalContext()->GetContactDataObject()->sCertType is not set anywhere but is passed // to the back end as part of the PKCS10 Request.Not sure what it is used for in the back end // Anyway set it to proper value here. Arvind 06/28/99. // if(GetGlobalContext()->GetContactDataObject()->sProgramName == PROGRAM_SELECT) GetGlobalContext()->GetContactDataObject()->sCertType = CA_CERT_TYPE_SELECT; else GetGlobalContext()->GetContactDataObject()->sCertType = CA_CERT_TYPE_OTHER; do { // //Set the attributes required for creating PKCS10 // SetCARequestAttributes(); // //This function will call the CryptAcquireContext and import the LS Keys // if ( ( dwRetCode = GetCryptContextWithLSKeys (&hCryptProv ) )!= ERROR_SUCCESS ) { break; } dwRetCode = CreateLSPKCS10(hCryptProv,AT_KEYEXCHANGE, &lpszExchgPKCS10); if(dwRetCode != ERROR_SUCCESS) break; dwRetCode = CreateLSPKCS10(hCryptProv,AT_SIGNATURE, &lpszSigPKCS10); if(dwRetCode != ERROR_SUCCESS) break; // Release the context if(hCryptProv) { DoneWithCryptContextWithLSKeys ( hCryptProv ); } // //Certificate Type // //Convert from multibyte to unicode lpwszExchgPKCS10 = AnsiToUnicode(lpszExchgPKCS10); lpwszSignPKCS10 = AnsiToUnicode(lpszSigPKCS10); dwExchangeLen = lstrlen(lpwszExchgPKCS10) * sizeof(WCHAR); dwSignLen = lstrlen(lpwszSignPKCS10) * sizeof(WCHAR); certRequest.SetExchgPKCS10Length(dwExchangeLen); certRequest.SetSignPKCS10Length(dwSignLen); certRequest.SetDataLen(dwExchangeLen+dwSignLen); certRequest.SetServerName(m_lpstrLSName); //Allocate buffer for the request lpszReqData = (LPBYTE) LocalAlloc( GPTR, dwExchangeLen+dwSignLen+sizeof(certRequest) ); if(lpszReqData == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; break; } lpszNextCopyPos = lpszReqData; memcpy(lpszNextCopyPos, &certRequest, sizeof(certRequest)); lpszNextCopyPos += sizeof(certRequest); memcpy ( lpszNextCopyPos, lpwszExchgPKCS10, dwExchangeLen); lpszNextCopyPos += dwExchangeLen; memcpy ( lpszNextCopyPos, lpwszSignPKCS10, dwSignLen); dwRetCode = Dispatch(lpszReqData, dwExchangeLen+dwSignLen+sizeof(certRequest)); if ( lpszReqData ) { LocalFree(lpszReqData); } if (dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); break; } dwRetCode = FetchResponse((BYTE *) &certResponse, sizeof(NewCert_Response), &dwResponseLength); if (dwRetCode != ERROR_SUCCESS) { break; } if (dwResponseLength != sizeof(NewCert_Response)) { // Got an invalid response back dwRetCode = IDS_ERR_CHBAD_DATA; break; } switch(certResponse.RequestHeader.GetResponseType()) { case Response_Success: dwRetCode = ERROR_SUCCESS; break; case Response_Failure: dwRetCode = IDS_ERR_CHFAILURE; break; case Response_InvalidData: dwRetCode = IDS_ERR_CHINVALID_DATA; break; case Response_NotYetImplemented: dwRetCode = IDS_ERR_CHNOT_IMPLEMENTED; break; case Response_ServerError: dwRetCode = IDS_ERR_CHSERVER_PROBLEM; break; case Response_Invalid_Response: default: dwRetCode = IDS_ERR_CHBAD_DATA; break; } if (dwRetCode != ERROR_SUCCESS) { break; } dwRetCode = SetLRState(LRSTATE_ONLINE_CR_CREATED); /* lpszResData = (PBYTE) LocalAlloc(GPTR, certResponse.GetDataLen() + 1); if(lpszResData == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; break; } dwRetCode = FetchResponse(lpszResData, certResponse.GetDataLen() + 1, &dwResponseLength); if (dwRetCode != ERROR_SUCCESS) { break; } if (dwResponseLength != certResponse.GetDataLen()) { // Didn't get the expected number of Bytes, also a problem dwRetCode = IDS_ERR_CHBAD_DATA; break; } bToSendAck = true; dwExchgCertLen = certResponse.GetExchgPKCS7Length(); dwSigCertLen = certResponse.GetSignPKCS7Length(); dwRootCertLen = certResponse.GetRootCertLength(); if(dwRootCertLen == 0 || dwExchgCertLen == 0 || dwSigCertLen == 0 ) { dwRetCode = IDS_ERR_CHBAD_DATA; //IDS_ERR_INVALID_PIN; break; } // // Exchange Certificate // lpszExchCert = UnicodeToAnsi((LPWSTR)lpszResData, dwExchgCertLen/sizeof(WCHAR)); if ( lpszExchCert == NULL ) { dwRetCode = IDS_ERR_OUTOFMEM; break; } // // Signature Certificate // lpszSignCert = UnicodeToAnsi((LPWSTR)(lpszResData + dwExchgCertLen), dwSigCertLen/sizeof(WCHAR)); if(lpszSignCert == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; break; } // // Root Certificate // lpszRootCert = UnicodeToAnsi ((LPWSTR)(lpszResData+dwExchgCertLen+dwSigCertLen), dwRootCertLen/sizeof(WCHAR)); if(lpszRootCert == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; break; } dwRetCode = DepositLSSPK(certResponse.GetSPK()); if (dwRetCode != ERROR_SUCCESS) { //if (dwRetCode == IDS_ERR_DEPOSITSPK) //{ // dwRetCode = IDS_ERR_CERT_DEPOSIT_LSERROR; //} break; } // //Deposit the Certs // dwRetCode = DepositLSCertificates( (PBYTE)lpszExchCert, lstrlenA(lpszExchCert), (PBYTE)lpszSignCert, lstrlenA(lpszSignCert), (PBYTE)lpszRootCert, lstrlenA(lpszRootCert) ); if ( dwRetCode != ERROR_SUCCESS ) { break; } //dwRetCode = SetLRState(LRSTATE_NEUTRAL); //if the response comming back is SUCCESS, check for certificates //in the response structure. If there is response //perform the deposit LS Certificates routine if (dwRetCode != ERROR_SUCCESS) { break; } // // Now save the State in the Registry // //dwRetCode = SetLRState(LRSTATE_ONLINE_CR_CREATED); */ } while(false); } catch(...) { dwRetCode = IDS_ERR_EXCEPTION; } CloseCHRequest(); if (bToSendAck == true) { if (InitCHRequest() == ERROR_SUCCESS) { // Everything deposited OK // Time to send the Ack certackRequest.SetRegRequestId((BYTE *) certResponse.GetRegRequestId(), (lstrlen(certResponse.GetRegRequestId())+1)*sizeof(TCHAR)); certackRequest.SetAckType((dwRetCode == ERROR_SUCCESS)); Dispatch((BYTE *) &certackRequest, sizeof(certackRequest)); // Ignore the Return value --- So what if the Ack gets lost // Read the response FetchResponse((BYTE *) &certackResponse, sizeof(certackResponse), &dwResponseLength); // Ignore the Return value --- So what if the Ack gets lost CloseCHRequest(); } } // //Free up Mem // ClearCARequestAttributes(); if(lpszExchgPKCS10) { delete lpszExchgPKCS10; } if(lpszSigPKCS10) { delete lpszSigPKCS10; } if ( lpwszExchgPKCS10 ) { delete lpwszExchgPKCS10; } if (lpwszSignPKCS10) { delete lpwszSignPKCS10; } if ( lpszExchCert ) { delete lpszExchCert; } if ( lpszSignCert ) { delete lpszSignCert; } if ( lpszRootCert ) { delete lpszRootCert; } if (lpszResData) { LocalFree(lpszResData); } return dwRetCode; } DWORD CGlobal::ProcessCertDownload() { DWORD dwRetCode = ERROR_SUCCESS; CertificateDownload_Request certdownloadRequest; CertificateDownload_Response certdownloadResponse; Certificate_AckRequest certackRequest; Certificate_AckResponse certackResponse; PBYTE lpszResData = NULL; DWORD dwExchgCertLen = 0; DWORD dwSigCertLen = 0; DWORD dwRootCertLen = 0; LPSTR lpszExchCert = NULL; LPSTR lpszSignCert = NULL; LPSTR lpszRootCert = NULL; DWORD dwResponseLength; bool bToSendAck = false; // // Set the Language Id // certdownloadRequest.RequestHeader.SetLanguageId(GetLSLangId()); dwRetCode = InitCHRequest(); if (dwRetCode != ERROR_SUCCESS) { return dwRetCode; } try { do { // // Create CHRequest for Certificate Download // certdownloadRequest.SetPIN((BYTE *) m_lpstrPIN, (lstrlenW(m_lpstrPIN)+1) * sizeof(WCHAR)); dwRetCode = Dispatch((BYTE *) &certdownloadRequest, sizeof(CertificateDownload_Request)); if(dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); break; } // Let us first Fetch the certdownloadResponse dwRetCode = FetchResponse((BYTE *) &certdownloadResponse, sizeof(CertificateDownload_Response), &dwResponseLength); if (dwRetCode != ERROR_SUCCESS) { break; } if (dwResponseLength != sizeof(CertificateDownload_Response)) { // Didn't get the expected number of Bytes, also a problem dwRetCode = IDS_ERR_CHBAD_DATA; break; } switch(certdownloadResponse.RequestHeader.GetResponseType()) { case Response_Success: dwRetCode = ERROR_SUCCESS; break; case Response_Failure: // dwRetCode = IDS_ERR_CHFAILURE; //dwRetCode = IDS_ERR_CERT_DEPOSIT_LSERROR; dwRetCode = IDS_ERR_INVALID_PIN; break; case Response_InvalidData: dwRetCode = IDS_ERR_CHINVALID_DATA; break; case Response_NotYetImplemented: dwRetCode = IDS_ERR_CHNOT_IMPLEMENTED; break; case Response_ServerError: dwRetCode = IDS_ERR_CHSERVER_PROBLEM; break; case Response_Invalid_Response: default: dwRetCode = IDS_ERR_CHBAD_DATA; break; } if (dwRetCode != ERROR_SUCCESS) { break; } // OK, allocate enough memory to read the rest fo the data lpszResData = (PBYTE) LocalAlloc(GPTR, certdownloadResponse.GetDataLen() + 1); if(lpszResData == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; break; } dwRetCode = FetchResponse(lpszResData, certdownloadResponse.GetDataLen() + 1, &dwResponseLength); if (dwRetCode != ERROR_SUCCESS) { break; } if (dwResponseLength != certdownloadResponse.GetDataLen()) { // Didn't get the expected number of Bytes, also a problem dwRetCode = IDS_ERR_CHBAD_DATA; break; } bToSendAck = true; dwExchgCertLen = certdownloadResponse.GetExchgPKCS7Length(); dwSigCertLen = certdownloadResponse.GetSignPKCS7Length(); dwRootCertLen = certdownloadResponse.GetRootCertLength(); if(dwRootCertLen == 0 || dwExchgCertLen == 0 || dwSigCertLen == 0 ) { dwRetCode = IDS_ERR_INVALID_PIN; break; } // // Exchange Certificate // lpszExchCert = UnicodeToAnsi((LPWSTR)lpszResData, dwExchgCertLen/sizeof(WCHAR)); if ( lpszExchCert == NULL ) { dwRetCode = IDS_ERR_OUTOFMEM; break; } // // Signature Certificate // lpszSignCert = UnicodeToAnsi((LPWSTR)(lpszResData + dwExchgCertLen), dwSigCertLen/sizeof(WCHAR)); if(lpszSignCert == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; break; } // // Root Certificate // lpszRootCert = UnicodeToAnsi ((LPWSTR)(lpszResData+dwExchgCertLen+dwSigCertLen), dwRootCertLen/sizeof(WCHAR)); if(lpszRootCert == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; break; } dwRetCode = SetLSSPK(certdownloadResponse.GetSPK()); if (dwRetCode != ERROR_SUCCESS) { break; } dwRetCode = DepositLSSPK(); if (dwRetCode != ERROR_SUCCESS) { if (dwRetCode == IDS_ERR_DEPOSITSPK) { dwRetCode = IDS_ERR_CERT_DEPOSIT_LSERROR; } break; } // //Deposit the Certs // dwRetCode = DepositLSCertificates( (PBYTE)lpszExchCert, lstrlenA(lpszExchCert), (PBYTE)lpszSignCert, lstrlenA(lpszSignCert), (PBYTE)lpszRootCert, lstrlenA(lpszRootCert) ); if ( dwRetCode != ERROR_SUCCESS ) { // If this happened and the SPK deposit succeeded, we have an // inconsistent state, now DWORD dwReturn; DWORD dwOriginal = LRGetLastError(); dwReturn = ResetLSSPK(FALSE); if (dwReturn != ERROR_SUCCESS) { // what to do, if even this failed. OUCH OUCH dwRetCode = dwReturn; } LRSetLastError(dwOriginal); m_pRegistrationID[ 0] = 0; break; } else { dwRetCode = SetLRState(LRSTATE_NEUTRAL); } } while(false); } catch(...) { dwRetCode = IDS_ERR_EXCEPTION; } CloseCHRequest(); // Now to send the Ack if (bToSendAck == true) { if (InitCHRequest() == ERROR_SUCCESS) { // Everything deposited OK // Time to send the Ack certackRequest.SetRegRequestId((BYTE *) certdownloadResponse.GetRegRequestId(), (lstrlen(certdownloadResponse.GetRegRequestId())+1)*sizeof(TCHAR)); certackRequest.SetAckType((dwRetCode == ERROR_SUCCESS)); Dispatch((BYTE *) &certackRequest, sizeof(certackRequest)); // Ignore the Return value --- So what if the Ack gets lost // Read the response FetchResponse((BYTE *) &certackResponse, sizeof(certackResponse), &dwResponseLength); // Ignore the Return value --- So what if the Ack gets lost CloseCHRequest(); } } if ( lpszExchCert ) { delete lpszExchCert; } if ( lpszSignCert ) { delete lpszSignCert; } if ( lpszRootCert ) { delete lpszRootCert; } if (lpszResData) { LocalFree(lpszResData); } return dwRetCode; } DWORD CGlobal::AuthenticateLS() { DWORD dwRetCode = ERROR_SUCCESS; DWORD dwResponseLength; BYTE * lpszReqData = NULL; BYTE * lpszResData = NULL; Validate_Response valResponse; Validate_Request valRequest; if (GetLSStatus() == LSERVERSTATUS_REGISTER_OTHER) { DWORD dwStatus; // This LS was registered on the phone. First perform SignOnly, Then read the certs into memory dwRetCode = ProcessCASignOnlyRequest(); if (dwRetCode != ERROR_SUCCESS) { goto done; } dwRetCode = GetLSCertificates(&dwStatus); if (dwRetCode != ERROR_SUCCESS) { goto done; } assert(dwStatus == LSERVERSTATUS_REGISTER_INTERNET); } // // Set Language Id // valRequest.RequestHeader.SetLanguageId(GetLSLangId()); dwRetCode = InitCHRequest(); if (dwRetCode != ERROR_SUCCESS) { goto done; } lpszReqData = (PBYTE) LocalAlloc(GPTR, sizeof(Validate_Request)+m_dwExchangeCertificateLen); if(lpszReqData == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; goto done; } valRequest.SetDataLen(m_dwExchangeCertificateLen); valRequest.SetCertBlobLen(m_dwExchangeCertificateLen); valRequest.SetSPK((BYTE *) m_pRegistrationID, (lstrlen(m_pRegistrationID)+1)*sizeof(TCHAR)); memcpy(lpszReqData, &valRequest, sizeof(Validate_Request)); memcpy(lpszReqData+sizeof(Validate_Request), m_pbExchangeCertificate, m_dwExchangeCertificateLen); dwRetCode = Dispatch(lpszReqData, sizeof(Validate_Request)+m_dwExchangeCertificateLen); if(dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); goto done; } // Let us read the response dwRetCode = FetchResponse((BYTE *) &valResponse, sizeof(Validate_Response), &dwResponseLength); if (dwRetCode != ERROR_SUCCESS) { goto done; } if (dwResponseLength != sizeof(Validate_Response)) { // Didn't get the expected number of Bytes, also a problem dwRetCode = IDS_ERR_CHBAD_DATA; goto done; } // if (valResponse.m_dwRetCode != ERROR_SUCCESS) // { // dwRetCode = valResponse.m_dwRetCode; // goto done; // } switch(valResponse.RequestHeader.GetResponseType()) { case Response_Success: dwRetCode = ERROR_SUCCESS; break; case Response_Failure: // dwRetCode = IDS_ERR_CHFAILURE; dwRetCode = IDS_ERR_AUTH_FAILED; break; case Response_Reg_Bad_SPK: dwRetCode = IDS_ERR_SPKBAD; break; case Response_Reg_Bad_Cert: dwRetCode = IDS_ERR_CERTBAD; break; case Response_Reg_Expired: dwRetCode = IDS_ERR_CERTEXPIRED; break; case Response_Reg_Revoked: dwRetCode = IDS_ERR_CERTREVOKED; break; case Response_InvalidData: dwRetCode = IDS_ERR_CHINVALID_DATA; break; case Response_NotYetImplemented: dwRetCode = IDS_ERR_CHNOT_IMPLEMENTED; break; case Response_ServerError: dwRetCode = IDS_ERR_CHSERVER_PROBLEM; break; case Response_Invalid_Response: default: dwRetCode = IDS_ERR_CHBAD_DATA; break; } if (dwRetCode != ERROR_SUCCESS) { goto done; } // OK, allocate enough memory to read the rest fo the data lpszResData = (PBYTE) LocalAlloc(GPTR, valResponse.GetDataLen() + 1); if(lpszResData == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; goto done; } dwRetCode = FetchResponse(lpszResData, valResponse.GetDataLen() + 1, &dwResponseLength); if (dwRetCode != ERROR_SUCCESS) { goto done; } if (dwResponseLength != valResponse.GetDataLen()) { // Didn't get the expected number of Bytes, also a problem dwRetCode = IDS_ERR_CHBAD_DATA; goto done; } dwRetCode = SetCHCert ( REG_ROOT_CERT, lpszResData, valResponse.GetCHRootCertLen()); if(dwRetCode != ERROR_SUCCESS) { goto done; } dwRetCode = SetCHCert ( REG_EXCHG_CERT, lpszResData+valResponse.GetCHRootCertLen(), valResponse.GetCHExchCertLen() ); if(dwRetCode != ERROR_SUCCESS) goto done; dwRetCode = SetCHCert ( REG_SIGN_CERT, lpszResData+valResponse.GetCHRootCertLen()+valResponse.GetCHExchCertLen(), valResponse.GetCHSignCertLen() ); done: CloseCHRequest(); if (lpszReqData) { LocalFree(lpszReqData); } if (lpszResData) { LocalFree(lpszResData); } return dwRetCode; } DWORD CGlobal::ProcessDownloadLKP() { DWORD dwRetCode = ERROR_SUCCESS; NewLKP_Request lkpRequest; NewLKP_Response lkpResponse; NewLKP_AckRequest lkpAckRequest; NewLKP_AckResponse lkpAckResponse; PBYTE pbLKPRequest = NULL; PBYTE lpszResData = NULL; DWORD dwReqLen = 0; DWORD dwResponseLen; bool bToSendAck = false; // // Set Language ID // lkpRequest.RequestHeader.SetLanguageId(GetLSLangId()); dwRetCode = InitCHRequest(); if (dwRetCode != ERROR_SUCCESS) { goto done; } // // Set LKP Request Attributes // SetCHRequestAttributes(); lkpRequest.SetSPK((BYTE *) m_pRegistrationID, (lstrlen(m_pRegistrationID)+1)*sizeof(TCHAR)); // // Create LKP Request // dwRetCode = CreateLKPRequest(&pbLKPRequest, &lkpRequest, dwReqLen); if(dwRetCode != ERROR_SUCCESS) { goto done; } dwRetCode = Dispatch(pbLKPRequest, dwReqLen); if(dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); goto done; } // Let us first Fetch the certdownloadResponse dwRetCode = FetchResponse((BYTE *) &lkpResponse, sizeof(NewLKP_Response), &dwResponseLen); if (dwRetCode != ERROR_SUCCESS) { goto done; } if (dwResponseLen != sizeof(NewLKP_Response)) { // Didn't get the expected number of Bytes, also a problem dwRetCode = IDS_ERR_CHBAD_DATA; goto done; } bToSendAck = true; // OK, allocate enough memory to read the rest fo the data lpszResData = (PBYTE) LocalAlloc(GPTR, lkpResponse.GetDataLen() + 1); if(lpszResData == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; goto done; } dwRetCode = FetchResponse(lpszResData, lkpResponse.GetDataLen() + 1, &dwResponseLen); if (dwRetCode != ERROR_SUCCESS) { goto done; } if (dwResponseLen != lkpResponse.GetDataLen()) { // Didn't get the expected number of Bytes, also a problem dwRetCode = IDS_ERR_CHBAD_DATA; goto done; } switch(lkpResponse.RequestHeader.GetResponseType()) { case Response_Success: dwRetCode = ERROR_SUCCESS; break; case Response_Failure: dwRetCode = IDS_ERR_CHFAILURE; break; case Response_SelectMloLicense_NotValid: dwRetCode = IDS_ERR_INVALID_PROGINFO; break; case Response_InvalidData: if (GetGlobalContext()->GetContactDataObject()->sProgramName == PROGRAM_RETAIL) { // For retail, if all the LKP were not approved, show the list // to the user for (register unsigned int i = 0; i < m_dwRetailSPKEntered; i++) { m_listRetailSPK[ i].tcStatus = lkpResponse.m_dwRetailSPKStatus[ i]; } bToSendAck = false; dwRetCode = IDS_ERR_SPKERRORS; } else { dwRetCode = IDS_ERR_CHINVALID_DATA; } break; case Response_NotYetImplemented: dwRetCode = IDS_ERR_CHNOT_IMPLEMENTED; break; case Response_ServerError: dwRetCode = IDS_ERR_CHSERVER_PROBLEM; break; case Response_Invalid_Response: default: dwRetCode = IDS_ERR_CHBAD_DATA; break; } if (dwRetCode != ERROR_SUCCESS) { goto done; } dwRetCode = DepositLKPResponse(lpszResData, lkpResponse.GetLKPLength()); if (dwRetCode == ERROR_SUCCESS && GetGlobalContext()->GetContactDataObject()->sProgramName == PROGRAM_RETAIL) { InitSPKList(); } done: ClearCHRequestAttributes(); CloseCHRequest(); // Now to send the Ack if (bToSendAck == true) { if (InitCHRequest() == ERROR_SUCCESS) { // Everything deposited OK // Time to send the Ack lkpAckRequest.SetRegRequestId((BYTE *) lkpResponse.GetRegRequestId(), (lstrlen(lkpResponse.GetRegRequestId())+1)*sizeof(TCHAR)); lkpAckRequest.SetLicenseReqId((BYTE *) lkpResponse.GetLicenseReqId(), (lstrlen(lkpResponse.GetLicenseReqId())+1)*sizeof(TCHAR)); lkpAckRequest.SetAckType((dwRetCode == ERROR_SUCCESS)); Dispatch((BYTE *) &lkpAckRequest, sizeof(NewLKP_AckRequest)); // Ignore the Return value --- So what if the Ack gets lost // Read the response FetchResponse((BYTE *) &lkpAckResponse, sizeof(NewLKP_AckResponse), &dwResponseLen); // Ignore the Return value --- So what if the Ack gets lost CloseCHRequest(); } } if ( pbLKPRequest ) { free(pbLKPRequest); } if (lpszResData) { LocalFree(lpszResData); } return dwRetCode; } DWORD CGlobal::CreateLKPRequest(PBYTE * ppRequest, NewLKP_Request * nlkppRequest, DWORD &dwDataLen) { DWORD dwRetCode = ERROR_SUCCESS; STREAM_HDR aStreamHdr; BLOCK_HDR aBlkHdr; DWORD dwBufSize = 0; BYTE * pBuf = NULL; PBYTE pbCHCert = NULL; DWORD dwCHCert = 0; PBYTE pbEncryptedBuf = NULL; PBYTE pbEncodedBlob = NULL; DWORD dwEncodedBlob = 0; DWORD dwBufLen = 0; DWORD i =0; dwDataLen = 0; //DWORD dwDecodeLen = 0; //PBYTE pbDecode = NULL; HANDLE hFile = INVALID_HANDLE_VALUE; DWORD dwRetSize = 0; // //Create the stream header // _tcscpy ( aStreamHdr.m_szTitle, STREAM_HDR_TITLE ); aStreamHdr.SetHeader(STREAM_HDR_TYPE); aStreamHdr.SetItemCount(0); dwBufSize = sizeof(STREAM_HDR); if ( ( pBuf = (BYTE *)malloc ( dwBufSize ) ) ) { memcpy ( pBuf, &aStreamHdr, dwBufSize ); } else { dwRetCode = IDS_ERR_OUTOFMEM; goto done; } for ( i = 0; i < m_dwRegAttrCount; i++ ) { //Setup the header here - put name/value pair into a data buffer aBlkHdr.m_wType = BLOCK_TYPE_PROP_PAIR; aBlkHdr.SetNameSize(lstrlenW( ( m_pRegAttr + i)->lpszAttribute ) * sizeof(WCHAR) ); aBlkHdr.SetValueSize(( m_pRegAttr + i)->dwValueLen ); if ( ( pBuf = (BYTE *)realloc (pBuf, dwBufSize + sizeof(BLOCK_HDR) + aBlkHdr.GetNameSize() + aBlkHdr.GetValueSize()) ) ) { memcpy ( pBuf + dwBufSize, &aBlkHdr, sizeof ( BLOCK_HDR ) ); memcpy ( pBuf + dwBufSize + sizeof(BLOCK_HDR) , ( m_pRegAttr + i)->lpszAttribute , aBlkHdr.GetNameSize()); memcpy ( pBuf + dwBufSize + sizeof (BLOCK_HDR ) + aBlkHdr.GetNameSize() , ( m_pRegAttr + i)->lpszValue , aBlkHdr.GetValueSize() ); dwBufSize += sizeof(BLOCK_HDR) + aBlkHdr.GetNameSize()+ aBlkHdr.GetValueSize(); ((STREAM_HDR*)pBuf)->SetItemCount(((STREAM_HDR*)pBuf)->GetItemCount() + 1 ); } else { dwRetCode = IDS_ERR_OUTOFMEM; goto done; } } /* Since the channel is secure , we need not encrypt the LKP Request. //Encrypt using the public key of the CH Cert. dwRetCode = GetCHCert( REG_EXCHG_CERT , &pbCHCert, &dwCHCert ); if(dwRetCode != ERROR_SUCCESS) goto done; dwRetCode = EncryptBuffer ( pBuf, //Buffer to be encrypted dwBufSize, //buffer length CRYPT_MACHINE_KEYSET, //machine/user pbCHCert, //certificate blob dwCHCert, //number of bytes in the certificate &dwDataLen, //number of bytes in the encrypted blob &pbEncryptedBuf //encrypted blob itself ); if(dwRetCode != ERROR_SUCCESS) { goto done; } */ dwBufLen = dwBufSize + m_dwExchangeCertificateLen; //dwDataLen + m_dwExchangeCertificateLen; // Also need to allocate the extra memory to hold the retail stuff if (GetGlobalContext()->GetContactDataObject()->sProgramName == PROGRAM_RETAIL) { dwBufLen += (m_dwRetailSPKEntered*LR_RETAILSPK_LEN*sizeof(TCHAR)); } nlkppRequest->RequestHeader.SetLanguageId(GetLSLangId()); nlkppRequest->SetDataLen(dwBufLen); nlkppRequest->SetNewLKPRequestLen(dwBufSize); //(dwDataLen); nlkppRequest->SetCertBlobLen(m_dwExchangeCertificateLen); nlkppRequest->SetRetailSPKCount(m_dwRetailSPKEntered); *ppRequest = (PBYTE) malloc ( dwBufLen + sizeof(NewLKP_Request)); if ( NULL == *ppRequest ) { dwRetCode = IDS_ERR_OUTOFMEM; goto done; } memset ( *ppRequest, 0, dwBufLen + sizeof(NewLKP_Request)); memcpy((*ppRequest), nlkppRequest, sizeof(NewLKP_Request)); memcpy ( ( *ppRequest )+sizeof(NewLKP_Request), m_pbExchangeCertificate, m_dwExchangeCertificateLen ); //memcpy ( ( *ppRequest )+sizeof(NewLKP_Request)+m_dwExchangeCertificateLen, pbEncryptedBuf, dwDataLen); memcpy ( ( *ppRequest )+sizeof(NewLKP_Request)+m_dwExchangeCertificateLen, pBuf, dwBufSize); if (GetGlobalContext()->GetContactDataObject()->sProgramName == PROGRAM_RETAIL) { PBYTE pbCur = (*ppRequest)+sizeof(NewLKP_Request)+m_dwExchangeCertificateLen+dwBufSize; //dwDataLen; for (register unsigned int i = 0; i < m_dwRetailSPKEntered; i++) { memcpy(pbCur, m_listRetailSPK[ i].lpszSPK, LR_RETAILSPK_LEN*sizeof(TCHAR)); pbCur += LR_RETAILSPK_LEN*sizeof(TCHAR); } //dwDataLen += (m_dwRetailSPKEntered*LR_RETAILSPK_LEN*sizeof(TCHAR)); } //dwDataLen += (sizeof(NewLKP_Request) + m_dwExchangeCertificateLen); dwDataLen = sizeof(NewLKP_Request) + dwBufLen; done: if ( pbEncryptedBuf ) { LocalFree(pbEncryptedBuf); } if ( pBuf ) { free ( pBuf ); } if ( dwRetCode != ERROR_SUCCESS ) { if (*ppRequest != NULL) { free ( *ppRequest ); } dwBufLen = 0; *ppRequest = NULL; } return dwRetCode; } DWORD CGlobal::SetConfirmationNumber(TCHAR * tcConf) { DWORD dwRetCode = ERROR_SUCCESS; if (wcsspn(tcConf, BASE24_CHARACTERS) != LR_CONFIRMATION_LEN) { // Extraneous characters in the SPK string dwRetCode = IDS_ERR_INVALID_CONFIRMATION_NUMBER; } else if (LKPLiteValConfNumber(m_pRegistrationID, m_pLicenseServerID, tcConf) != ERROR_SUCCESS) { dwRetCode = IDS_ERR_INVALID_CONFIRMATION_NUMBER; } return dwRetCode; } DWORD CGlobal::InitSPKList(void) { for (register int i = 0; i < MAX_RETAILSPKS_IN_BATCH; i++) { m_listRetailSPK[ i].lpszSPK[ 0] = 0; m_listRetailSPK[ i].tcStatus = RETAIL_SPK_NULL; } m_dwRetailSPKEntered = 0; return ERROR_SUCCESS; } void CGlobal::DeleteRetailSPKFromList(TCHAR * lpszRetailSPK) { bool bFound = false; for (register unsigned int i = 0; i < m_dwRetailSPKEntered; i++) { if (lstrcmp(m_listRetailSPK[ i].lpszSPK, lpszRetailSPK) == 0) { if (i < MAX_RETAILSPKS_IN_BATCH-1) { memcpy(m_listRetailSPK + i, m_listRetailSPK + i + 1, sizeof(RETAILSPK)*(MAX_RETAILSPKS_IN_BATCH-i)); } m_listRetailSPK[ MAX_RETAILSPKS_IN_BATCH-1].lpszSPK[ 0] = 0; m_listRetailSPK[ MAX_RETAILSPKS_IN_BATCH-1].tcStatus = RETAIL_SPK_NULL; bFound = true; m_dwRetailSPKEntered--; break; } } assert(bFound == true); return; } void CGlobal::ModifyRetailSPKFromList(TCHAR * lpszOldSPK,TCHAR * lpszNewSPK) { bool bFound = false; for (register unsigned int i = 0; i < m_dwRetailSPKEntered; i++) { if (lstrcmp(m_listRetailSPK[ i].lpszSPK, lpszOldSPK) == 0) { if (i < MAX_RETAILSPKS_IN_BATCH-1) { _tcscpy(m_listRetailSPK[i].lpszSPK,lpszNewSPK); m_listRetailSPK[i].tcStatus = RETAIL_SPK_NULL; } bFound = true; break; } } assert(bFound == true); return; } void CGlobal::LoadFromList(HWND hListView) { for (register unsigned int i = 0; i < m_dwRetailSPKEntered; i++) { InsertIntoSPKDisplayList(hListView, m_listRetailSPK[ i].lpszSPK, m_listRetailSPK[ i].tcStatus); } return; } void CGlobal::UpdateSPKStatus(TCHAR * lpszRetailSPK, TCHAR tcStatus) { bool bFound = false; for (register unsigned int i = 0; i < m_dwRetailSPKEntered; i++) { if (lstrcmp(m_listRetailSPK[ i].lpszSPK, lpszRetailSPK) == 0) { m_listRetailSPK[ i].tcStatus = tcStatus; bFound = true; break; } } assert(bFound == true); return; } void CGlobal::InsertIntoSPKDisplayList(HWND hListView, TCHAR * lpszRetailSPK, TCHAR tcStatus) { LVITEM lvItem; TCHAR lpszBuffer[ 128]; DWORD dwStringToLoad = IDS_RETAILSPKSTATUS_UNKNOWN; DWORD nItem; lvItem.mask = LVIF_TEXT; lvItem.iItem = 0; lvItem.iSubItem = 0; lvItem.pszText = lpszRetailSPK; lvItem.cchTextMax = lstrlen(lpszRetailSPK); nItem = ListView_InsertItem(hListView, &lvItem); lvItem.iSubItem = 1; lvItem.iItem = nItem; switch(tcStatus) { case RETAIL_SPK_NULL: dwStringToLoad = IDS_RETAILSPKSTATUS_PENDING; break; case RETAIL_SPK_OK: dwStringToLoad = IDS_RETAILSPKSTATUS_OK; break; case RETAIL_SPK_INVALID_SIGNATURE: dwStringToLoad = IDS_RETAILSPKSTATUS_INVALID_SIGNATURE; break; case RETAIL_SPK_INVALID_PRODUCT_TYPE: dwStringToLoad = IDS_RETAILSPKSTATUS_INVALID_PRODUCT_TYPE; break; case RETAIL_SPK_INVALID_SERIAL_NUMBER: dwStringToLoad = IDS_RETAILSPKSTATUS_INVALID_SERIAL_NUMBER; break; case RETAIL_SPK_ALREADY_REGISTERED: dwStringToLoad = IDS_RETAILSPKSTATUS_ALREADY_REGISTERED; break; } LoadString(GetInstanceHandle(), dwStringToLoad, lpszBuffer, sizeof(lpszBuffer)/sizeof(TCHAR)); lvItem.pszText = lpszBuffer; lvItem.cchTextMax = lstrlen(lpszBuffer); ListView_SetItem(hListView, &lvItem); return; } DWORD CGlobal::AddRetailSPKToList(HWND hListView, TCHAR * lpszRetailSPK) { if (m_dwRetailSPKEntered == MAX_RETAILSPKS_IN_BATCH) { return IDS_ERR_TOOMANYSPK; } assert(m_listRetailSPK[ m_dwRetailSPKEntered].lpszSPK[ 0] == 0); assert(m_listRetailSPK[ m_dwRetailSPKEntered].tcStatus == RETAIL_SPK_NULL); DWORD dwRetCode = ERROR_SUCCESS; if (_tcsspn(lpszRetailSPK, BASE24_CHARACTERS) != LR_RETAILSPK_LEN) { // Extraneous characters in the SPK string dwRetCode = IDS_ERR_INVALIDSPK; } // Now check for duplication for (register unsigned int i = 0; dwRetCode == ERROR_SUCCESS && i < m_dwRetailSPKEntered; i++) { if (lstrcmp(m_listRetailSPK[ i].lpszSPK, lpszRetailSPK) == 0) { dwRetCode = IDS_ERR_DUPLICATESPK; } } if (dwRetCode == ERROR_SUCCESS) { lstrcpy(m_listRetailSPK[ m_dwRetailSPKEntered].lpszSPK, lpszRetailSPK); m_listRetailSPK[ m_dwRetailSPKEntered].tcStatus = RETAIL_SPK_NULL; InsertIntoSPKDisplayList(hListView, lpszRetailSPK, m_listRetailSPK[ m_dwRetailSPKEntered].tcStatus); m_dwRetailSPKEntered++; } return dwRetCode; } DWORD CGlobal::ValidateRetailSPK(TCHAR * lpszRetailSPK) { DWORD dwRetCode = ERROR_SUCCESS; if (_tcsspn(lpszRetailSPK, BASE24_CHARACTERS) != LR_RETAILSPK_LEN) { // Extraneous characters in the SPK string dwRetCode = IDS_ERR_INVALIDSPK; } // Now check for duplication for (register unsigned int i = 0; dwRetCode == ERROR_SUCCESS && i < m_dwRetailSPKEntered; i++) { if (lstrcmp(m_listRetailSPK[ i].lpszSPK, lpszRetailSPK) == 0) { dwRetCode = IDS_ERR_DUPLICATESPK; } } return dwRetCode; } DWORD CGlobal::ProcessCASignOnlyRequest() { DWORD dwRetCode = ERROR_SUCCESS; CertificateSignOnly_Request certsoRequest; CertificateSignOnly_Response certsoResponse; HCRYPTPROV hCryptProv = NULL; LPWSTR lpwszExchgPKCS10 = NULL; LPWSTR lpwszSignPKCS10 = NULL; LPBYTE lpszReqData = NULL; LPBYTE lpszResData = NULL; LPBYTE lpszNextCopyPos = NULL; LPSTR lpszExchgPKCS10 = NULL; LPSTR lpszSigPKCS10 = NULL; DWORD dwExchangeLen = 0; DWORD dwSignLen = 0; DWORD dwRootLen = 0; DWORD dwResponseLength = 0; LPSTR lpszExchCert = NULL; LPSTR lpszSignCert = NULL; LPSTR lpszRootCert = NULL; // // Set Language Id // certsoRequest.RequestHeader.SetLanguageId(GetLSLangId()); dwRetCode = InitCHRequest(); if (dwRetCode != ERROR_SUCCESS) { return dwRetCode; } SetCARequestAttributes(); // //This function will call the CryptAcquireContext and import the LS Keys // if ( ( dwRetCode = GetCryptContextWithLSKeys (&hCryptProv ) )!= ERROR_SUCCESS ) { goto done; } dwRetCode = CreateLSPKCS10(hCryptProv,AT_KEYEXCHANGE, &lpszExchgPKCS10); if(dwRetCode != ERROR_SUCCESS) { goto done; } dwRetCode = CreateLSPKCS10(hCryptProv,AT_SIGNATURE, &lpszSigPKCS10); if(dwRetCode != ERROR_SUCCESS) { goto done; } // Release the context if(hCryptProv) { DoneWithCryptContextWithLSKeys ( hCryptProv ); } // //Certificate Type // //Convert from multibyte to unicode lpwszExchgPKCS10 = AnsiToUnicode(lpszExchgPKCS10); lpwszSignPKCS10 = AnsiToUnicode(lpszSigPKCS10); dwExchangeLen = lstrlen(lpwszExchgPKCS10) * sizeof(WCHAR); dwSignLen = lstrlen(lpwszSignPKCS10) * sizeof(WCHAR); certsoRequest.SetExchgPKCS10Length(dwExchangeLen); certsoRequest.SetSignPKCS10Length(dwSignLen); certsoRequest.SetSPK((BYTE *) m_pRegistrationID, (lstrlen(m_pRegistrationID)+1)*sizeof(TCHAR)); certsoRequest.SetDataLen(dwExchangeLen+dwSignLen); certsoRequest.SetServerName(m_lpstrLSName); //Allocate buffer for the request lpszReqData = (LPBYTE) LocalAlloc( GPTR, dwExchangeLen+dwSignLen+sizeof(certsoRequest) ); if(lpszReqData == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; goto done; } lpszNextCopyPos = lpszReqData; memcpy(lpszNextCopyPos, &certsoRequest, sizeof(certsoRequest)); lpszNextCopyPos += sizeof(certsoRequest); memcpy ( lpszNextCopyPos, lpwszExchgPKCS10, dwExchangeLen); lpszNextCopyPos += dwExchangeLen; memcpy ( lpszNextCopyPos, lpwszSignPKCS10, dwSignLen); dwRetCode = Dispatch(lpszReqData, dwExchangeLen+dwSignLen+sizeof(certsoRequest)); if ( lpszReqData ) { LocalFree(lpszReqData); } if (dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); goto done; } dwRetCode = FetchResponse((BYTE *) &certsoResponse, sizeof(CertificateSignOnly_Response), &dwResponseLength); if (dwRetCode != ERROR_SUCCESS) { goto done; } if (dwResponseLength != sizeof(CertificateSignOnly_Response)) { // Got an invalid response back dwRetCode = IDS_ERR_CHBAD_DATA; goto done; } switch(certsoResponse.RequestHeader.GetResponseType()) { case Response_Success: dwRetCode = ERROR_SUCCESS; break; case Response_Failure: // dwRetCode = IDS_ERR_CHFAILURE; dwRetCode = IDS_ERR_AUTH_FAILED; break; case Response_Reg_Bad_SPK: dwRetCode = IDS_ERR_SPKBAD; break; case Response_Reg_Expired: dwRetCode = IDS_ERR_CERTEXPIRED; break; case Response_Reg_Revoked: dwRetCode = IDS_ERR_CERTREVOKED; break; case Response_InvalidData: dwRetCode = IDS_ERR_CHINVALID_DATA; break; case Response_NotYetImplemented: dwRetCode = IDS_ERR_CHNOT_IMPLEMENTED; break; case Response_ServerError: dwRetCode = IDS_ERR_CHSERVER_PROBLEM; break; case Response_Invalid_Response: default: dwRetCode = IDS_ERR_CHBAD_DATA; break; } if (dwRetCode != ERROR_SUCCESS) { goto done; } // OK, allocate enough memory to read the rest fo the data lpszResData = (PBYTE) LocalAlloc(GPTR, certsoResponse.GetDataLen() + 1); if(lpszResData == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; goto done; } dwRetCode = FetchResponse(lpszResData, certsoResponse.GetDataLen() + 1, &dwResponseLength); if (dwRetCode != ERROR_SUCCESS) { goto done; } if (dwResponseLength != certsoResponse.GetDataLen() || dwResponseLength <= 0) { // Didn't get the expected number of Bytes, also a problem dwRetCode = IDS_ERR_CHBAD_DATA; goto done; } dwExchangeLen = certsoResponse.GetExchgPKCS7Length(); dwSignLen = certsoResponse.GetSignPKCS7Length(); dwRootLen = certsoResponse.GetRootCertLength(); if(dwRootLen == 0 || dwExchangeLen == 0 || dwSignLen == 0 ) { dwRetCode = IDS_ERR_CHBAD_DATA; goto done; } // // Exchange Certificate // lpszExchCert = UnicodeToAnsi((LPWSTR)lpszResData, dwExchangeLen/sizeof(WCHAR)); if ( lpszExchCert == NULL ) { dwRetCode = IDS_ERR_OUTOFMEM; goto done; } // // Signature Certificate // lpszSignCert = UnicodeToAnsi((LPWSTR)(lpszResData + dwExchangeLen), dwSignLen/sizeof(WCHAR)); if(lpszSignCert == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; goto done; } // // Root Certificate // lpszRootCert = UnicodeToAnsi ((LPWSTR)(lpszResData+dwExchangeLen+dwSignLen), dwRootLen/sizeof(WCHAR)); if(lpszRootCert == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; goto done; } // //Deposit the Certs // dwRetCode = DepositLSCertificates( (PBYTE)lpszExchCert, lstrlenA(lpszExchCert), (PBYTE)lpszSignCert, lstrlenA(lpszSignCert), (PBYTE)lpszRootCert, lstrlenA(lpszRootCert) ); if ( dwRetCode != ERROR_SUCCESS ) { goto done; } done: ClearCARequestAttributes(); CloseCHRequest(); // //Free up Certificate Mem // if(lpszExchgPKCS10) { delete lpszExchgPKCS10; } if(lpszSigPKCS10) { delete lpszSigPKCS10; } if ( lpwszExchgPKCS10 ) { delete lpwszExchgPKCS10; } if (lpwszSignPKCS10) { delete lpwszSignPKCS10; } if ( lpszExchCert ) { delete lpszExchCert; } if ( lpszSignCert ) { delete lpszSignCert; } if ( lpszRootCert ) { delete lpszRootCert; } if (lpszResData) { LocalFree(lpszResData); } return dwRetCode; } DWORD CGlobal::ProcessCHReissueLKPRequest() { DWORD dwRetCode = ERROR_SUCCESS; ReissueLKP_Request lkpRequest; ReissueLKP_Response lkpResponse; PBYTE lpszReqData = NULL; PBYTE lpszResData = NULL; DWORD dwResponseLen; // // Set Language Id // lkpRequest.RequestHeader.SetLanguageId(GetLSLangId()); dwRetCode = InitCHRequest(); if (dwRetCode != ERROR_SUCCESS) { goto done; } // // Set LKP Request Attributes // lkpRequest.SetSPK((BYTE *) m_pRegistrationID, (lstrlen(m_pRegistrationID)+1)*sizeof(TCHAR)); lkpRequest.SetCertBlobLen(m_dwExchangeCertificateLen); lkpRequest.SetDataLen(m_dwExchangeCertificateLen); // OK, allocate enough memory to read the rest fo the data lpszReqData = (PBYTE) LocalAlloc(GPTR, sizeof(ReissueLKP_Request)+m_dwExchangeCertificateLen); if(lpszReqData == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; goto done; } memcpy(lpszReqData, &lkpRequest, sizeof(ReissueLKP_Request)); memcpy(lpszReqData+sizeof(ReissueLKP_Request), m_pbExchangeCertificate, m_dwExchangeCertificateLen ); dwRetCode = Dispatch(lpszReqData, sizeof(ReissueLKP_Request)+m_dwExchangeCertificateLen); if(dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); goto done; } // Let us first Fetch the certdownloadResponse dwRetCode = FetchResponse((BYTE *) &lkpResponse, sizeof(ReissueLKP_Response), &dwResponseLen); if (dwRetCode != ERROR_SUCCESS) { goto done; } if (dwResponseLen != sizeof(ReissueLKP_Response)) { // Didn't get the expected number of Bytes, also a problem dwRetCode = IDS_ERR_CHBAD_DATA; goto done; } switch(lkpResponse.RequestHeader.GetResponseType()) { case Response_Success: dwRetCode = ERROR_SUCCESS; break; case Response_Failure: dwRetCode = IDS_ERR_CHFAILURE; break; case Response_InvalidData: dwRetCode = IDS_ERR_CHINVALID_DATA; break; case Response_NotYetImplemented: dwRetCode = IDS_ERR_CHNOT_IMPLEMENTED; break; case Response_ServerError: dwRetCode = IDS_ERR_CHSERVER_PROBLEM; break; case Response_Invalid_Response: default: dwRetCode = IDS_ERR_CHBAD_DATA; break; } if (dwRetCode != ERROR_SUCCESS) { goto done; } // OK, allocate enough memory to read the rest fo the data lpszResData = (PBYTE) LocalAlloc(GPTR, lkpResponse.GetDataLen() + 1); if(lpszResData == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; goto done; } dwRetCode = FetchResponse(lpszResData, lkpResponse.GetDataLen() + 1, &dwResponseLen); if (dwRetCode != ERROR_SUCCESS) { goto done; } if (dwResponseLen != lkpResponse.GetDataLen() || dwResponseLen <= 0) { // Didn't get the expected number of Bytes, also a problem dwRetCode = IDS_ERR_CHBAD_DATA; goto done; } dwRetCode = DepositLKPResponse(lpszResData, lkpResponse.GetLKPLength()); done: CloseCHRequest(); if (lpszReqData) { LocalFree(lpszReqData); } if (lpszResData) { LocalFree(lpszResData); } return dwRetCode; } DWORD CGlobal::ProcessCHRevokeCert() { DWORD dwRetCode = ERROR_SUCCESS; CertRevoke_Request crRequest; CertRevoke_Response crResponse; PBYTE lpszReqData = NULL; DWORD dwResponseLen; error_status_t esRPC = ERROR_SUCCESS; // // Set Language Id // crRequest.RequestHeader.SetLanguageId(GetLSLangId()); dwRetCode = ConnectToLS(); if(dwRetCode != ERROR_SUCCESS) { goto done; } dwRetCode = InitCHRequest(); if (dwRetCode != ERROR_SUCCESS) { goto done; } // // Set CR Request Attributes // crRequest.SetSPK((BYTE *) m_pRegistrationID, (lstrlen(m_pRegistrationID)+1)*sizeof(TCHAR)); crRequest.SetLName((BYTE *) (LPCTSTR) m_ContactData.sContactLName, (wcslen(m_ContactData.sContactLName)+1)*sizeof(TCHAR)); crRequest.SetFName((BYTE *) (LPCTSTR) m_ContactData.sContactFName, (wcslen(m_ContactData.sContactFName)+1)*sizeof(TCHAR)); crRequest.SetPhone((BYTE *) (LPCTSTR) m_ContactData.sContactPhone, (wcslen(m_ContactData.sContactPhone)+1)*sizeof(TCHAR)); crRequest.SetFax((BYTE *) (LPCTSTR) m_ContactData.sContactFax, (wcslen(m_ContactData.sContactFax)+1)*sizeof(TCHAR)); crRequest.SetEMail((BYTE *) (LPCTSTR) m_ContactData.sContactEmail, (wcslen(m_ContactData.sContactEmail)+1)*sizeof(TCHAR)); crRequest.SetReasonCode((BYTE *) (LPCTSTR) m_ContactData.sReasonCode, (wcslen(m_ContactData.sReasonCode)+1)*sizeof(TCHAR)); crRequest.SetExchgCertLen(m_dwExchangeCertificateLen); crRequest.SetSignCertLen(m_dwSignCertificateLen); crRequest.SetDataLen(m_dwExchangeCertificateLen+m_dwSignCertificateLen); // OK, allocate enough memory to read the rest fo the data lpszReqData = (PBYTE) LocalAlloc(GPTR, sizeof(CertRevoke_Request)+m_dwExchangeCertificateLen+m_dwSignCertificateLen); if(lpszReqData == NULL) { dwRetCode = IDS_ERR_OUTOFMEM; goto done; } memcpy(lpszReqData, &crRequest, sizeof(CertRevoke_Request)); memcpy(lpszReqData+sizeof(CertRevoke_Request), m_pbExchangeCertificate, m_dwExchangeCertificateLen ); memcpy(lpszReqData+sizeof(CertRevoke_Request)+m_dwExchangeCertificateLen, m_pbSignCertificate, m_dwSignCertificateLen ); dwRetCode = Dispatch(lpszReqData, sizeof(CertRevoke_Request)+m_dwExchangeCertificateLen+m_dwSignCertificateLen); if(dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); goto done; } dwRetCode = FetchResponse((BYTE *) &crResponse, sizeof(CertRevoke_Response), &dwResponseLen); if (dwRetCode != ERROR_SUCCESS) { goto done; } if (dwResponseLen != sizeof(CertRevoke_Response)) { // Didn't get the expected number of Bytes, also a problem dwRetCode = IDS_ERR_CHBAD_DATA; goto done; } switch(crResponse.RequestHeader.GetResponseType()) { case Response_Success: dwRetCode = ERROR_SUCCESS; break; case Response_Failure: dwRetCode = IDS_ERR_CHFAILURE; break; case Response_InvalidData: dwRetCode = IDS_ERR_CHINVALID_DATA; break; case Response_NotYetImplemented: dwRetCode = IDS_ERR_CHNOT_IMPLEMENTED; break; case Response_ServerError: dwRetCode = IDS_ERR_CHSERVER_PROBLEM; break; case Response_Invalid_Response: default: dwRetCode = IDS_ERR_CHBAD_DATA; break; } if (dwRetCode != ERROR_SUCCESS) { goto done; } // Make LS Regen Key call HERE dwRetCode = TLSTriggerReGenKey(m_phLSContext, TRUE, &esRPC); if(dwRetCode != RPC_S_OK || esRPC != ERROR_SUCCESS) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_RPC_FAILED; goto done; } done: CloseCHRequest(); DisconnectLS(); if (lpszReqData) { LocalFree(lpszReqData); } return dwRetCode; } DWORD CGlobal::ProcessCHReissueCert() { HKEY hKey = NULL; DWORD dwDisposition = 0; CString sName = m_ContactData.sContactLName + "~" + m_ContactData.sContactFName; CString sPhone = m_ContactData.sContactPhone; CString sFax = m_ContactData.sContactFax; CString sEmail = m_ContactData.sContactEmail; DWORD dwRetCode = ERROR_SUCCESS; CertReissue_Request crRequest; CertReissue_Response crResponse; DWORD dwResponseLen; error_status_t esRPC = ERROR_SUCCESS; // // Set Language Id // crRequest.RequestHeader.SetLanguageId(GetLSLangId()); dwRetCode = ConnectToLS(); if(dwRetCode != ERROR_SUCCESS) { goto done; } dwRetCode = InitCHRequest(); if (dwRetCode != ERROR_SUCCESS) { goto done; } // // Set CR Request Attributes // crRequest.SetSPK((BYTE *) m_pRegistrationID, (lstrlen(m_pRegistrationID)+1)*sizeof(TCHAR)); crRequest.SetLName((BYTE *) (LPCTSTR) m_ContactData.sContactLName, (wcslen(m_ContactData.sContactLName)+1)*sizeof(TCHAR)); crRequest.SetFName((BYTE *) (LPCTSTR) m_ContactData.sContactFName, (wcslen(m_ContactData.sContactFName)+1)*sizeof(TCHAR)); crRequest.SetPhone((BYTE *) (LPCTSTR) m_ContactData.sContactPhone, (wcslen(m_ContactData.sContactPhone)+1)*sizeof(TCHAR)); crRequest.SetFax((BYTE *) (LPCTSTR) m_ContactData.sContactFax, (wcslen(m_ContactData.sContactFax)+1)*sizeof(TCHAR)); crRequest.SetEMail((BYTE *) (LPCTSTR) m_ContactData.sContactEmail, (wcslen(m_ContactData.sContactEmail)+1)*sizeof(TCHAR)); crRequest.SetReasonCode((BYTE *) (LPCTSTR) m_ContactData.sReasonCode, (wcslen(m_ContactData.sReasonCode)+1)*sizeof(TCHAR)); dwRetCode = Dispatch((BYTE *) &crRequest, sizeof(CertReissue_Request)); if(dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); goto done; } dwRetCode = FetchResponse((BYTE *) &crResponse, sizeof(CertReissue_Response), &dwResponseLen); if (dwRetCode != ERROR_SUCCESS) { goto done; } if (dwResponseLen != sizeof(CertReissue_Response)) { // Didn't get the expected number of Bytes, also a problem dwRetCode = IDS_ERR_CHBAD_DATA; goto done; } switch(crResponse.RequestHeader.GetResponseType()) { case Response_Success: dwRetCode = ERROR_SUCCESS; break; case Response_Failure: dwRetCode = IDS_ERR_CHFAILURE; break; case Response_InvalidData: dwRetCode = IDS_ERR_CHINVALID_DATA; break; case Response_NotYetImplemented: dwRetCode = IDS_ERR_CHNOT_IMPLEMENTED; break; case Response_ServerError: dwRetCode = IDS_ERR_CHSERVER_PROBLEM; break; case Response_Invalid_Response: default: dwRetCode = IDS_ERR_CHBAD_DATA; break; } if (dwRetCode != ERROR_SUCCESS) { goto done; } // Make LS Regen Key call HERE dwRetCode = TLSTriggerReGenKey(m_phLSContext, TRUE, &esRPC); if(dwRetCode != RPC_S_OK || esRPC != ERROR_SUCCESS) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_RPC_FAILED; goto done; } DisconnectLS(); // Deposit the New SPK dwRetCode = SetLSSPK(crResponse.GetSPK()); if (dwRetCode != ERROR_SUCCESS) { goto done; } dwRetCode = DepositLSSPK(); if(dwRetCode != ERROR_SUCCESS) goto done; // Set the new values in the Registry. dwRetCode = ConnectToLSRegistry(); if(dwRetCode != ERROR_SUCCESS) { goto done; } dwRetCode = RegCreateKeyEx ( m_hLSRegKey, REG_LRWIZ_PARAMS, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition); if(dwRetCode != ERROR_SUCCESS) { LRSetLastError(dwRetCode); dwRetCode = IDS_ERR_REGCREATE_FAILED; goto done; } /* //Name RegSetValueEx ( hKey, szOID_GIVEN_NAME_W, 0, REG_SZ, (CONST BYTE *)(LPCTSTR)sName, sName.GetLength() * sizeof(TCHAR) ); //Phone RegSetValueEx ( hKey, szOID_TELEPHONE_NUMBER_W, 0, REG_SZ, (CONST BYTE *)(LPCTSTR)sPhone, sPhone.GetLength() * sizeof(TCHAR) ); //Email Address RegSetValueEx ( hKey, szOID_RSA_emailAddr_W, 0, REG_SZ, (CONST BYTE *)(LPCTSTR)sEmail, sEmail.GetLength() * sizeof(TCHAR) ); */ done: if(hKey) RegCloseKey(hKey); DisconnectLSRegistry(); CloseCHRequest(); DisconnectLS(); return dwRetCode; } void CGlobal::SetCSRNumber(TCHAR * tcp) { SetInRegistery(CSRNUMBER_KEY, tcp); lstrcpy(m_lpCSRNumber, tcp); return; } TCHAR * CGlobal::GetCSRNumber(void) { return m_lpCSRNumber; } void CGlobal::SetWWWSite(TCHAR * tcp) { lstrcpy(m_lpWWWSite, tcp); return; } TCHAR * CGlobal::GetWWWSite(void) { return m_lpWWWSite; } void CGlobal::SetModifiedRetailSPK(CString sRetailSPK) { m_sModifiedRetailsSPK = sRetailSPK; } void CGlobal::GetModifiedRetailSPK(CString &sRetailSPK) { sRetailSPK = m_sModifiedRetailsSPK; } DWORD CGlobal::GetLSLangId() { return m_dwLangId; } void CGlobal::SetLSLangId(DWORD dwLangId) { m_dwLangId = dwLangId; } int CALLBACK EnumFontFamExProc( CONST LOGFONTW *lpelfe, // pointer to logical-font data CONST TEXTMETRICW *lpntme, // pointer to physical-font data DWORD FontType, // type of font LPARAM lParam // application-defined data ) { LOCALESIGNATURE ls; CHARSETINFO cs; BOOL rc ; DWORD dwLCID = LOCALE_USER_DEFAULT ; rc = GetLocaleInfo(dwLCID, LOCALE_FONTSIGNATURE, (LPWSTR)& ls, sizeof(ls) / sizeof(TCHAR)); rc = TranslateCharsetInfo((ULONG *)lpelfe->lfCharSet, &cs, TCI_SRCCHARSET); if (rc != 0) rc = GetLastError(); if (cs.fs.fsCsb[0] & ls.lsCsbSupported[0]){ // return fontname _tcscpy((TCHAR *)lParam, lpelfe->lfFaceName); return(0); // return 0 to finish the enumeration } return(1); // return 1 to continue } void GetDefaultFont(TCHAR *szFontName, HDC hdc) { //retrieve the list of installed fonts LOGFONT lf ; //to enumerate all styles and charsets of all fonts: lf.lfFaceName[0] = '\0'; lf.lfCharSet = DEFAULT_CHARSET; lf.lfWeight = FW_BOLD; EnumFontFamiliesEx( hdc, // handle to device context &lf, // pointer to LOGFONT structure EnumFontFamExProc, // pointer to callback function (LPARAM) szFontName, // application-supplied data 0// reserved; must be zero ); } #define MARGINX 25//50 // X Margin in 100th of an inch #define MARGINY 25//50 // Y Margin in 100th of an inch //#define MAX_LABEL 30 // Max Number of chars in a label #define MAX_PRINT_CHARS 32 int WordWrapAndPrint(HDC hdc, LPCTSTR lpcText, HFONT hBoldFont, long lCharHt, int iValueStartPosX, int iLineStartPosY) { TCHAR szBuffer[1024]; TCHAR *lpTemp = NULL; if (NULL == lpcText) { return 0; } _tcscpy(szBuffer, lpcText); lpTemp = _tcstok(szBuffer,L"\r\n"); // If no data , just go to the next line if(lpTemp == NULL) iLineStartPosY -= lCharHt; while(lpTemp) { while (_tcslen(lpTemp) > MAX_PRINT_CHARS){ SelectObject(hdc, hBoldFont); TextOut(hdc,iValueStartPosX,iLineStartPosY,lpTemp,MAX_PRINT_CHARS); iLineStartPosY -= lCharHt; lpTemp += MAX_PRINT_CHARS ; } if (_tcslen(lpTemp) > 0){ SelectObject(hdc, hBoldFont); TextOut(hdc,iValueStartPosX,iLineStartPosY,lpTemp,_tcslen(lpTemp)); iLineStartPosY -= lCharHt; lpTemp = _tcstok(NULL,L"\r\n"); } } return iLineStartPosY ; } UINT GetMaxLabelLength(HDC hdc, HFONT m_hNormalFont, HINSTANCE hInstance) { TCHAR tcLabel[512] = {0}; int iTextExtent; int iLen; SIZE size; LoadString(hInstance, IDS_FAX, tcLabel, 512); iLen = _tcslen(tcLabel); SelectObject(hdc, m_hNormalFont); GetTextExtentPoint32( hdc, tcLabel, iLen, &size ); iTextExtent = size.cx; LoadString(hInstance, IDS_RETURN_FAX, tcLabel, 512); iLen = _tcslen(tcLabel); GetTextExtentPoint32( hdc, tcLabel, iLen, &size ); if (size.cx > iTextExtent) //if (size.cy > iTextExtent) iTextExtent = size.cx; return(iTextExtent ) ; }