// PageEncryption.cpp : implementation file // #include "stdafx.h" #include "mgrnve.h" #include "ConnectionManager.h" #include "PageEncryption.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define AES_KEY_SIZE 16 extern "C" void base64Encode(unsigned char *out, const unsigned char *in, int inlen); ///////////////////////////////////////////////////////////////////////////// // CPageEncryption dialog CPageEncryption::CPageEncryption(CWnd* pParent, CMgrNVE* pMgrCM, CConnectionManager *pConnMgr) : CParamDlg(CPageEncryption::IDD, pParent, pMgrCM, pConnMgr) { //{{AFX_DATA_INIT(CPageEncryption) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT m_pNet5Api = NULL; m_pMsgMgr = NULL; } void CPageEncryption::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPageEncryption) DDX_Control(pDX, IDC_EDIT_VIDEO_ENC_KEY_DLL, m_edtVideoEncKeyDll); DDX_Control(pDX, IDC_EDIT_VIDEO_ENC_KEY, m_edtVideoEncKey); DDX_Control(pDX, IDC_EDIT_AUDIO_ENC_KEY_DLL, m_edtAudioEncKeyDll); DDX_Control(pDX, IDC_EDIT_AUDIO_ENC_KEY, m_edtAudioEncKey); DDX_Control(pDX, IDC_CB_VIDEO_ENC_TYPE, m_cbVideoEncType); DDX_Control(pDX, IDC_CB_VIDEO_ENC_MODE, m_cbVideoEncMode); DDX_Control(pDX, IDC_CB_AUDIO_ENC_MODE, m_cbAudioEncMode); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPageEncryption, CDialog) //{{AFX_MSG_MAP(CPageEncryption) ON_BN_CLICKED(IDC_BTN_APPLY_ENC, OnBtnApplyEnc) ON_WM_DESTROY() ON_BN_CLICKED(IDC_BTN_APPLY_ENC_DLL, OnBtnApplyEncDll) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPageEncryption message handlers void CPageEncryption::OnBtnApplyEnc() { // TODO: Add your control notification handler code here char szCmd[NVE_SHORT_EXT_CMD_LENGTH]; char szVidEncMode[NVE_SHORT_STR_LENGTH], szVidEncType[NVE_SHORT_STR_LENGTH], szAudEncMode[NVE_SHORT_STR_LENGTH]; int iVideoSize, iAudioSize; UCHAR szEncVideoKey[NVE_MAX_STR_LENGTH], szEncAudioKey[NVE_MAX_STR_LENGTH]; UCHAR pVideoKey[AES_KEY_SIZE], pAudioKey[AES_KEY_SIZE]; ULONG uMediaType; switch(m_cbVideoEncMode.GetCurSel()) { case 0: strncpy(szVidEncMode, "none", sizeof(szVidEncMode)); break; case 1: strncpy(szVidEncMode, "aes_cbc", sizeof(szVidEncMode)); break; } switch(m_cbVideoEncType.GetCurSel()) { case 0: strncpy(szVidEncType, "i_only", sizeof(szVidEncType)); break; case 1: strncpy(szVidEncType, "p_only", sizeof(szVidEncType)); break; case 2: strncpy(szVidEncType, "all", sizeof(szVidEncType)); break; } iVideoSize = GetDlgItemInt(IDC_EDIT_VIDEO_ENC_SIZE); switch(m_cbAudioEncMode.GetCurSel()) { case 0: strncpy(szAudEncMode, "none", sizeof(szAudEncMode)); break; case 1: strncpy(szAudEncMode, "aes_cbc", sizeof(szAudEncMode)); break; } iAudioSize = GetDlgItemInt(IDC_EDIT_AUDIO_ENC_SIZE); GetEncryptionKey(TRUE, pVideoKey, pAudioKey); base64Encode(szEncVideoKey, pVideoKey, sizeof(pVideoKey)); uMediaType = NET5_EMT_VIDEO; m_pNet5Api->Net5Command(NET5_NC_SET_ENCRYPTION_KEY, &uMediaType, (ULONG*)pVideoKey, NULL, NULL); base64Encode(szEncAudioKey, pAudioKey, sizeof(pAudioKey)); uMediaType = NET5_EMT_AUDIO; m_pNet5Api->Net5Command(NET5_NC_SET_ENCRYPTION_KEY, &uMediaType, (ULONG*)pAudioKey, NULL, NULL); _snprintf(szCmd, sizeof(szCmd), "EXT_SUBSESSION_CMD %s/track6 RTSP/1.0\r\n" "CSeq: 1\r\n" "CmdCount: 1\r\n" "SET ENCRYPTION video_encrypt_mode=\"%s\", video_encrypt_key=\"%s\", video_encrypt_type=\"%s\", video_encrypt_size=%d, " "audio_encrypt_mode=\"%s\", audio_encrypt_key=\"%s\", audio_encrypt_size=%d\r\n\r\n", m_pConnection->GetServerAddr(), szVidEncMode, szEncVideoKey, szVidEncType, iVideoSize, szAudEncMode, szEncAudioKey, iAudioSize); TRACE(szCmd); CHECK_AND_RETURN(m_pNet5Api->Net5Command(NET5_NC_SEND_RTSP_REQUEST, (ULONG*)szCmd, NULL, NULL, NULL), "Cannot set encryption information"); CHECK_AND_RETURN(m_pNet5Api->Net5Command(NET5_NC_RECV_RTSP_RESPONSE, (ULONG*)szCmd, NULL, NULL, NULL), "Cannot receive response(encryption)"); } BOOL CPageEncryption::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_pNet5Api = m_pConnection->GetNet5Api(); m_pMsgMgr = m_pMgrNVE->GetMsgManager(); m_cbVideoEncMode.AddString("NONE"); m_cbVideoEncMode.AddString("AES_CBC"); m_cbVideoEncType.AddString("I_ONLY"); m_cbVideoEncType.AddString("P_ONLY");+ m_cbVideoEncType.AddString("ALL"); m_cbAudioEncMode.AddString("NONE"); m_cbAudioEncMode.AddString("AES_CBC"); m_edtAudioEncKey.SetLimitText(AES_KEY_SIZE); m_edtAudioEncKeyDll.SetLimitText(AES_KEY_SIZE); m_edtVideoEncKey.SetLimitText(AES_KEY_SIZE); m_edtVideoEncKeyDll.SetLimitText(AES_KEY_SIZE); char szCmd[NVE_SHORT_EXT_CMD_LENGTH]; _snprintf(szCmd, sizeof(szCmd), "EXT_SUBSESSION_CMD %s/track6 RTSP/1.0\r\n" "CSeq: 1\r\n" "CmdCount: 1\r\n" "GET ENCRYPTION video_encrypt_mode, video_encrypt_type, video_encrypt_size, audio_encrypt_mode, audio_encrypt_size\r\n\r\n", m_pConnection->GetServerAddr()); CHECK_AND_RETURN_FALSE(m_pNet5Api->Net5Command(NET5_NC_SEND_RTSP_REQUEST, (ULONG*)szCmd, NULL, NULL, NULL), "Cannot get encryption information"); CHECK_AND_RETURN_FALSE(m_pNet5Api->Net5Command(NET5_NC_RECV_RTSP_RESPONSE, (ULONG*)szCmd, NULL, NULL, NULL), "Cannot receive response(encryption)"); char szEncMode[NVE_SHORT_STR_LENGTH], szEncType[NVE_SHORT_STR_LENGTH]; ULONG uSize; ParseRTSPResponse(szCmd, m_RtspValue, NVE_MAX_RTSP_VALUE); FindRTSPValue(m_RtspValue, "video_encrypt_mode", szEncMode, NVE_RTSP_VALUE_STR); FindRTSPValue(m_RtspValue, "video_encrypt_type", szEncType, NVE_RTSP_VALUE_STR); FindRTSPValue(m_RtspValue, "video_encrypt_size", &uSize, NVE_RTSP_VALUE_INT); if (strcmp("none", szEncMode) == 0) { m_cbVideoEncMode.SetCurSel(0); } else if (strcmp("aes_cbc", szEncMode) == 0) { m_cbVideoEncMode.SetCurSel(1); } if (strcmp("i_only", szEncType) == 0) { m_cbVideoEncType.SetCurSel(0); } else if (strcmp("p_only", szEncType) == 0) { m_cbVideoEncType.SetCurSel(1); } else if (strcmp("all", szEncType) == 0) { m_cbVideoEncType.SetCurSel(2); } SetDlgItemInt(IDC_EDIT_VIDEO_ENC_SIZE, uSize); FindRTSPValue(m_RtspValue, "audio_encrypt_mode", szEncMode, NVE_RTSP_VALUE_STR); FindRTSPValue(m_RtspValue, "audio_encrypt_size", &uSize, NVE_RTSP_VALUE_INT); if (strcmp("none", szEncMode) == 0) { m_cbAudioEncMode.SetCurSel(0); } else if (strcmp("aes_cbc", szEncMode) == 0) { m_cbAudioEncMode.SetCurSel(1); } SetDlgItemInt(IDC_EDIT_AUDIO_ENC_SIZE, uSize); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CPageEncryption::OnDestroy() { CDialog::OnDestroy(); // TODO: Add your message handler code here } void CPageEncryption::OnBtnApplyEncDll() { // TODO: Add your control notification handler code here ULONG uMediaType; UCHAR pVideoKey[AES_KEY_SIZE], pAudioKey[AES_KEY_SIZE]; GetEncryptionKey(FALSE, pVideoKey, pAudioKey); uMediaType = NET5_EMT_VIDEO; m_pNet5Api->Net5Command(NET5_NC_SET_ENCRYPTION_KEY, &uMediaType, (ULONG*)pVideoKey, NULL, NULL); uMediaType = NET5_EMT_AUDIO; m_pNet5Api->Net5Command(NET5_NC_SET_ENCRYPTION_KEY, &uMediaType, (ULONG*)pAudioKey, NULL, NULL); } void CPageEncryption::GetEncryptionKey(BOOL bDevice, UCHAR *pVideoKey, UCHAR *pAudioKey) { CString strVideoEncKey, strAudioEncKey; char szVideoKey[NVE_MAX_STR_LENGTH], szAudioKey[NVE_MAX_STR_LENGTH]; //char pValue[3]; if (bDevice) { GetDlgItemText(IDC_EDIT_VIDEO_ENC_KEY, strVideoEncKey); GetDlgItemText(IDC_EDIT_AUDIO_ENC_KEY, strAudioEncKey); } else { GetDlgItemText(IDC_EDIT_VIDEO_ENC_KEY_DLL, strVideoEncKey); GetDlgItemText(IDC_EDIT_AUDIO_ENC_KEY_DLL, strAudioEncKey); } if (strVideoEncKey.Compare("") == 0) { for (UCHAR i=0; i