const WCHAR *TimeHelper::GetCurrentStrTime2() { static WCHAR strTime[64] = {0}; memset(strTime, 0, sizeof(strTime)); SYSTEMTIME time; GetLocalTime(&time); const WCHAR * strTimeTmp = GetStrTime2(time); wcsncpy_s(strTime, PARRAYSIZE(strTime), strTimeTmp, PARRAYSIZE(strTime)-1); return strTime; }
int TimeHelper::GetWeekDayValue(const E_WeekDay&eWeekDay) { struct ST_WeekDayAndValue { E_WeekDay m_eWeekDay; int m_iWeekDayValue; }; struct ST_WeekDayAndValue st_aWeekDayAndValue[] = { {e_Monday, 1}, {e_Tuesday, 2}, {e_Wednesday, 3}, {e_Thursday, 4}, {e_Friday, 5}, {e_Saturday, 6}, {e_Sunday, 7}, }; int iWeekDayAndValueArraySize = PARRAYSIZE(st_aWeekDayAndValue); int iWeekDayValue = 1; for (int i = 0; i < iWeekDayAndValueArraySize; i++) { struct ST_WeekDayAndValue &st_WeekDayAndValue = st_aWeekDayAndValue[i]; if (eWeekDay == st_WeekDayAndValue.m_eWeekDay) { iWeekDayValue = st_WeekDayAndValue.m_iWeekDayValue; break; } } return iWeekDayValue; }
OpalRTPSession::SendReceiveStatus OpalDTLSSRTPSession::ExecuteHandshake(Channel channel) { { PWaitAndSignal mutex(m_dataMutex); if (m_remotePort[channel] == 0) return e_IgnorePacket; // Too early if (m_sslChannel[channel] == NULL) return e_ProcessPacket; // Too late (done) } SSLChannel & sslChannel = *m_sslChannel[channel]; if (!sslChannel.ExecuteHandshake()) return e_AbortTransport; const OpalMediaCryptoSuite* cryptoSuite = NULL; srtp_profile_t profile = srtp_profile_reserved; for (PINDEX i = 0; i < PARRAYSIZE(ProfileNames); ++i) { if (sslChannel.GetSelectedProfile() == ProfileNames[i].m_dtlsName) { profile = ProfileNames[i].m_profile; cryptoSuite = OpalMediaCryptoSuiteFactory::CreateInstance(ProfileNames[i].m_opalName); break; } } if (profile == srtp_profile_reserved || cryptoSuite == NULL) { PTRACE(2, "Error in SRTP profile."); return e_AbortTransport; } PINDEX masterKeyLength = srtp_profile_get_master_key_length(profile); PINDEX masterSaltLength = srtp_profile_get_master_salt_length(profile); PBYTEArray keyMaterial = sslChannel.GetKeyMaterial(((masterSaltLength + masterKeyLength) << 1), "EXTRACTOR-dtls_srtp"); if (keyMaterial.IsEmpty()) return e_AbortTransport; OpalSRTPKeyInfo * keyInfo = dynamic_cast<OpalSRTPKeyInfo*>(cryptoSuite->CreateKeyInfo()); PAssertNULL(keyInfo); keyInfo->SetCipherKey(PBYTEArray(keyMaterial, masterKeyLength)); keyInfo->SetAuthSalt(PBYTEArray(keyMaterial + masterKeyLength*2, masterSaltLength)); ApplyKeyToSRTP(*keyInfo, sslChannel.IsServer() ? e_Receiver : e_Sender); keyInfo->SetCipherKey(PBYTEArray(keyMaterial + masterKeyLength, masterKeyLength)); keyInfo->SetAuthSalt(PBYTEArray(keyMaterial + masterKeyLength*2 + masterSaltLength, masterSaltLength)); ApplyKeyToSRTP(*keyInfo, sslChannel.IsServer() ? e_Sender : e_Receiver); delete keyInfo; m_queueChannel[channel].Close(); sslChannel.Detach(PChannel::ShutdownWrite); // Do not close the socket! delete m_sslChannel[channel]; m_sslChannel[channel] = NULL; return e_ProcessPacket; }
DTLSContext() : PSSLContext(PSSLContext::DTLSv1) { PStringStream dn; dn << "/O=" << PProcess::Current().GetManufacturer() << "/CN=*"; PSSLPrivateKey pk(1024); if (!m_cert.CreateRoot(dn, pk)) { PTRACE(1, "Could not create certificate for DTLS."); return; } if (!UseCertificate(m_cert)) { PTRACE(1, "Could not use DTLS certificate."); return; } if (!UsePrivateKey(pk)) { PTRACE(1, "Could not use private key for DTLS."); return; } PStringStream ext; for (PINDEX i = 0; i < PARRAYSIZE(ProfileNames); ++i) { const OpalMediaCryptoSuite* cryptoSuite = OpalMediaCryptoSuiteFactory::CreateInstance(ProfileNames[i].m_opalName); if (cryptoSuite) { if (!ext.IsEmpty()) ext << ':'; ext << ProfileNames[i].m_dtlsName; } } if (!SetExtension(ext)) { PTRACE(1, "Could not set TLS extension for SSL context."); return; } }