home *** CD-ROM | disk | FTP | other *** search
- // DESCtl.cpp : Implementation of the CDESCtrl ActiveX Control class.
-
- #include "stdafx.h"
- #include "DES.h"
- #include "DESCtl.h"
- #include "DESPpg.h"
-
-
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
-
- IMPLEMENT_DYNCREATE(CDESCtrl, COleControl)
-
-
- /////////////////////////////////////////////////////////////////////////////
- // Message map
-
- BEGIN_MESSAGE_MAP(CDESCtrl, COleControl)
- //{{AFX_MSG_MAP(CDESCtrl)
- // NOTE - ClassWizard will add and remove message map entries
- // DO NOT EDIT what you see in these blocks of generated code !
- //}}AFX_MSG_MAP
- ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
- END_MESSAGE_MAP()
-
-
- /////////////////////////////////////////////////////////////////////////////
- // Dispatch map
-
- BEGIN_DISPATCH_MAP(CDESCtrl, COleControl)
- //{{AFX_DISPATCH_MAP(CDESCtrl)
- DISP_PROPERTY_EX(CDESCtrl, "Key", GetKey, SetKey, VT_VARIANT)
- DISP_FUNCTION(CDESCtrl, "EncryptFile", EncryptFile, VT_EMPTY, VTS_BSTR VTS_BSTR VTS_VARIANT)
- DISP_FUNCTION(CDESCtrl, "EncryptString", EncryptString, VT_BSTR, VTS_VARIANT)
- DISP_FUNCTION(CDESCtrl, "DecryptString", DecryptString, VT_BSTR, VTS_VARIANT)
- DISP_FUNCTION(CDESCtrl, "DecryptFile", DecryptFile, VT_EMPTY, VTS_BSTR VTS_BSTR VTS_VARIANT)
- //}}AFX_DISPATCH_MAP
- DISP_FUNCTION_ID(CDESCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
- END_DISPATCH_MAP()
-
-
- /////////////////////////////////////////////////////////////////////////////
- // Event map
-
- BEGIN_EVENT_MAP(CDESCtrl, COleControl)
- //{{AFX_EVENT_MAP(CDESCtrl)
- // NOTE - ClassWizard will add and remove event map entries
- // DO NOT EDIT what you see in these blocks of generated code !
- //}}AFX_EVENT_MAP
- END_EVENT_MAP()
-
-
- /////////////////////////////////////////////////////////////////////////////
- // Property pages
-
- // TODO: Add more property pages as needed. Remember to increase the count!
- BEGIN_PROPPAGEIDS(CDESCtrl, 1)
- PROPPAGEID(CDESPropPage::guid)
- END_PROPPAGEIDS(CDESCtrl)
-
-
- /////////////////////////////////////////////////////////////////////////////
- // Initialize class factory and guid
-
- IMPLEMENT_OLECREATE_EX(CDESCtrl, "DES.DESCtrl.1",
- 0x7d7c6e7, 0xae76, 0x11d0, 0x9a, 0x6f, 0, 0x1, 0, 0, 0, 0)
-
-
- /////////////////////////////////////////////////////////////////////////////
- // Type library ID and version
-
- IMPLEMENT_OLETYPELIB(CDESCtrl, _tlid, _wVerMajor, _wVerMinor)
-
-
- /////////////////////////////////////////////////////////////////////////////
- // Interface IDs
-
- const IID BASED_CODE IID_DDES =
- { 0x7d7c6e5, 0xae76, 0x11d0, { 0x9a, 0x6f, 0, 0x1, 0, 0, 0, 0 } };
- const IID BASED_CODE IID_DDESEvents =
- { 0x7d7c6e6, 0xae76, 0x11d0, { 0x9a, 0x6f, 0, 0x1, 0, 0, 0, 0 } };
-
-
- /////////////////////////////////////////////////////////////////////////////
- // Control type information
-
- static const DWORD BASED_CODE _dwDESOleMisc =
- OLEMISC_INVISIBLEATRUNTIME |
- OLEMISC_ACTIVATEWHENVISIBLE |
- OLEMISC_SETCLIENTSITEFIRST |
- OLEMISC_INSIDEOUT |
- OLEMISC_CANTLINKINSIDE |
- OLEMISC_RECOMPOSEONRESIZE;
-
- IMPLEMENT_OLECTLTYPE(CDESCtrl, IDS_DES, _dwDESOleMisc)
-
-
- /////////////////////////////////////////////////////////////////////////////
- // CDESCtrl::CDESCtrlFactory::UpdateRegistry -
- // Adds or removes system registry entries for CDESCtrl
-
- BOOL CDESCtrl::CDESCtrlFactory::UpdateRegistry(BOOL bRegister)
- {
- // TODO: Verify that your control follows apartment-model threading rules.
- // Refer to MFC TechNote 64 for more information.
- // If your control does not conform to the apartment-model rules, then
- // you must modify the code below, changing the 6th parameter from
- // afxRegApartmentThreading to 0.
-
- if (bRegister)
- return AfxOleRegisterControlClass(
- AfxGetInstanceHandle(),
- m_clsid,
- m_lpszProgID,
- IDS_DES,
- IDB_DES,
- afxRegApartmentThreading,
- _dwDESOleMisc,
- _tlid,
- _wVerMajor,
- _wVerMinor);
- else
- return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
- }
-
-
- /////////////////////////////////////////////////////////////////////////////
- // Licensing strings
-
- static const TCHAR BASED_CODE _szLicFileName[] = _T("DES.lic");
-
- static const WCHAR BASED_CODE _szLicString[] =
- L"Copyright (c) 1997 unbekannt";
-
-
- /////////////////////////////////////////////////////////////////////////////
- // CDESCtrl::CDESCtrlFactory::VerifyUserLicense -
- // Checks for existence of a user license
-
- BOOL CDESCtrl::CDESCtrlFactory::VerifyUserLicense()
- {
- return AfxVerifyLicFile(AfxGetInstanceHandle(), _szLicFileName,
- _szLicString);
- }
-
-
- /////////////////////////////////////////////////////////////////////////////
- // CDESCtrl::CDESCtrlFactory::GetLicenseKey -
- // Returns a runtime licensing key
-
- BOOL CDESCtrl::CDESCtrlFactory::GetLicenseKey(DWORD dwReserved,
- BSTR FAR* pbstrKey)
- {
- if (pbstrKey == NULL)
- return FALSE;
-
- *pbstrKey = SysAllocString(_szLicString);
- return (*pbstrKey != NULL);
- }
-
-
- /////////////////////////////////////////////////////////////////////////////
- // CDESCtrl::CDESCtrl - Constructor
-
- CDESCtrl::CDESCtrl()
- {
- InitializeIIDs(&IID_DDES, &IID_DDESEvents);
-
- m_Key = "";
- bKeySet = FALSE;
- SetInitialSize( 28,28 );
- }
-
-
- /////////////////////////////////////////////////////////////////////////////
- // CDESCtrl::~CDESCtrl - Destructor
-
- CDESCtrl::~CDESCtrl()
- {
- // TODO: Cleanup your control's instance data here.
- }
-
-
- /////////////////////////////////////////////////////////////////////////////
- // CDESCtrl::OnDraw - Drawing function
-
- void CDESCtrl::OnDraw(
- CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
- {
- if( ( ( rcBounds.right - rcBounds.left ) <= 0 ) ||
- ( ( rcBounds.bottom - rcBounds.top ) <= 0 ) )
- return;
-
- CBitmap cbm;
- CSize cs;
- CBrush newBrush;
- CPen newPen, *oldPen;
- CRect r;
-
- if( cbm.LoadBitmap( IDB_CONTROLBITMAP ) )
- {
- r.left = rcBounds.left;
- r.top = rcBounds.top;
- r.right = rcBounds.left+28; // inklusive!
- r.bottom = rcBounds.top+28;
-
- if( newBrush.CreateSolidBrush( RGB(0,0,0) ) )
- {
- pdc->FrameRect( &r, &newBrush );
- r.InflateRect( -1,-1);
- if( newPen.CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNHILIGHT) ) )
- {
- oldPen = pdc->SelectObject( &newPen );
- pdc->MoveTo( r.right-1,r.top);
- pdc->LineTo( r.left,r.top);
- pdc->LineTo( r.left,r.bottom);
- pdc->SelectObject( oldPen );
- newPen.DeleteObject();
- }
- if( newPen.CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW) ) )
- {
- oldPen = pdc->SelectObject( &newPen );
- pdc->MoveTo( r.right-1,r.top);
- pdc->LineTo( r.right-1,r.bottom-1 );
- pdc->LineTo( r.left-1,r.bottom-1);
- r.InflateRect( -1,-1);
- pdc->MoveTo( r.right-1,r.top);
- pdc->LineTo( r.right-1,r.bottom-1 );
- pdc->LineTo( r.left-1,r.bottom-1);
- r.right--;
- r.bottom--;
- pdc->SelectObject( oldPen );
- newPen.DeleteObject();
- }
- CDC BackDC;
- if( BackDC.CreateCompatibleDC( pdc ) )
- {
- CBitmap *oldBitmap = BackDC.SelectObject( &cbm );
- pdc->BitBlt(r.left,r.top,23,23, &BackDC, 0,0, SRCCOPY );
- BackDC.SelectObject( oldBitmap );
-
- BackDC.DeleteDC();
- }
- newBrush.DeleteObject();
- }
- cbm.DeleteObject();
- }
- }
-
-
- /////////////////////////////////////////////////////////////////////////////
- // CDESCtrl::DoPropExchange - Persistence support
-
- void CDESCtrl::DoPropExchange(CPropExchange* pPX)
- {
- ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
- COleControl::DoPropExchange(pPX);
-
- // TODO: Call PX_ functions for each persistent custom property.
-
- }
-
-
- /////////////////////////////////////////////////////////////////////////////
- // CDESCtrl::OnResetState - Reset control to default state
-
- void CDESCtrl::OnResetState()
- {
- COleControl::OnResetState(); // Resets defaults found in DoPropExchange
-
- // TODO: Reset any other control state here.
- }
-
-
- /////////////////////////////////////////////////////////////////////////////
- // CDESCtrl::AboutBox - Display an "About" box to the user
-
- void CDESCtrl::AboutBox()
- {
- CDialog dlgAbout(IDD_ABOUTBOX_DES);
- dlgAbout.DoModal();
- }
-
-
- /////////////////////////////////////////////////////////////////////////////
- // CDESCtrl message handlers
-
- void CDESCtrl::DecryptFile(LPCTSTR CrypttextFile, LPCTSTR PlaintextFile, const VARIANT FAR& FailIfExists)
- {
- HANDLE hCrypt, hPlain;
- LONG lFailIfExists = FALSE;
- char InBuffer[512], OutBuffer[512];
-
- if( !bKeySet )
- ThrowError(0);
-
- if( !IsError( &FailIfExists ) )
- if( !GetBOOL( &FailIfExists, &lFailIfExists ) )
- ThrowError(0);
-
- hCrypt = CreateFile(CrypttextFile, GENERIC_READ, FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL );
- if( hCrypt == INVALID_HANDLE_VALUE )
- ThrowError( CUSTOM_CTL_SCODE(0), "Kann Cryptfile nicht ÷ffnen");
-
- hPlain = CreateFile(PlaintextFile, GENERIC_WRITE, 0,NULL, lFailIfExists ? CREATE_NEW : CREATE_ALWAYS,0,NULL );
- if( hPlain == INVALID_HANDLE_VALUE )
- {
- CloseHandle( hCrypt );
- ThrowError( CUSTOM_CTL_SCODE(0), "Kann Plainfile nicht ÷ffnen");
- }
- while( TRUE )
- {
- DWORD dwRead;
- DWORD dwWritten;
- if( !ReadFile( hCrypt, InBuffer, sizeof( InBuffer ),&dwRead, NULL ) )
- {
- CloseHandle( hCrypt );
- CloseHandle( hPlain );
- ThrowError( CUSTOM_CTL_SCODE(0), "Fehler beim Lesen");
- }
- if( dwRead )
- {
- DWORD i = 0;
- while( i + 8 < dwRead )
- {
- Decryptor.Codec( (DWORD*)&InBuffer[i], (DWORD*)&OutBuffer[i] );
- i+=8;
- }
- // Den Rest des Lesebuffers mit Nullen fⁿllen
-
- memset( &InBuffer[dwRead], 0, sizeof( InBuffer ) - dwRead );
-
- dwRead += 7;
- dwRead &= 0xFFFFFFF8;
-
- if( i < dwRead )
- Decryptor.Codec( (DWORD*)&InBuffer[i], (DWORD*)&OutBuffer[i] );
-
-
- if( !WriteFile( hPlain, OutBuffer, dwRead, &dwWritten, NULL ) )
- {
- CloseHandle( hCrypt );
- CloseHandle( hPlain );
- ThrowError( CUSTOM_CTL_SCODE(0), "Fehler beim Schreiben");
- }
- }
- else
- break;
- }
- CloseHandle( hCrypt );
- CloseHandle( hPlain );
- }
-
- void CDESCtrl::EncryptFile(LPCTSTR PlaintextFile, LPCTSTR CrypttextFile, const VARIANT FAR& FailIfExists)
- {
- HANDLE hCrypt, hPlain;
- LONG lFailIfExists = FALSE;
- char InBuffer[512], OutBuffer[512];
-
- if( !bKeySet )
- ThrowError(0);
-
- if( !IsError( &FailIfExists ) )
- if( !GetBOOL( &FailIfExists, &lFailIfExists ) )
- ThrowError(0);
- hPlain = CreateFile(PlaintextFile, GENERIC_READ, FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL );
- if( hPlain == INVALID_HANDLE_VALUE )
- ThrowError( CUSTOM_CTL_SCODE(0), "Kann Plaintextfile nicht ÷ffnen");
-
- hCrypt = CreateFile(CrypttextFile, GENERIC_WRITE, 0,NULL, lFailIfExists ? CREATE_NEW : CREATE_ALWAYS,0,NULL );
- if( hCrypt == INVALID_HANDLE_VALUE )
- {
- CloseHandle( hPlain );
- ThrowError( CUSTOM_CTL_SCODE(0), "Kann Cryptfile nicht ÷ffnen");
- }
- while( TRUE )
- {
- DWORD dwRead;
- DWORD dwWritten;
- if( !ReadFile( hPlain, InBuffer, sizeof( InBuffer ),&dwRead, NULL ) )
- {
- CloseHandle( hPlain );
- CloseHandle( hCrypt );
- ThrowError( CUSTOM_CTL_SCODE(0), "Fehler beim Lesen");
- }
- if( dwRead )
- {
- DWORD i = 0;
- while( i + 8 < dwRead )
- {
- Encryptor.Codec( (DWORD*)&InBuffer[i], (DWORD*)&OutBuffer[i] );
- i+=8;
- }
- // Den Rest des Lesebuffers mit Nullen fⁿllen
-
- memset( &InBuffer[dwRead], 0, sizeof( InBuffer ) - dwRead );
-
- dwRead += 7;
- dwRead &= 0xFFFFFFF8;
-
- if( i < dwRead )
- Encryptor.Codec( (DWORD*)&InBuffer[i], (DWORD*)&OutBuffer[i] );
-
-
- if( !WriteFile( hCrypt, OutBuffer, dwRead, &dwWritten, NULL ) )
- {
- CloseHandle( hPlain );
- CloseHandle( hCrypt );
- ThrowError( CUSTOM_CTL_SCODE(0), "Fehler beim Schreiben");
- }
- }
- else
- break;
- }
- CloseHandle( hPlain );
- CloseHandle( hCrypt );
-
- }
-
- BSTR CDESCtrl::EncryptString(const VARIANT FAR& Plaintext)
- {
- CString strResult;
- CString ansi;
- BSTR bstr;
- LPSTR lpResult;
- LPCTSTR lpAnsi;
- DWORD dwOrg[2];
- long l, i, lResult;
-
- if( !bKeySet )
- ThrowError(0);
-
- if( !GetString( &Plaintext, &bstr ) )
- ThrowError(0); //
- CopyBSTRToCString( bstr, &ansi );
-
- lResult = (ansi.GetLength() + 8) & 0xFFFFFFF8;
- lpResult = strResult.GetBufferSetLength( lResult );
- lpAnsi = (LPCTSTR)ansi;
-
- if( !lpResult )
- ThrowError( CTL_E_OUTOFMEMORY );
-
- l = ansi.GetLength();
- i = 0;
- while( i < l )
- {
- if( (l-i) >= 8 )
- {
- memcpy( dwOrg, &lpAnsi[i], 8);
- i+=8;
- }
- else
- {
- dwOrg[0]=0;
- dwOrg[1]=0;
- char *c = (char*)dwOrg;
- for( ; i < l; i++ )
- *(c++) = lpAnsi[i];
- }
-
- Encryptor.Codec( dwOrg, (DWORD*)lpResult );
- lpResult += 8;
- }
- strResult.ReleaseBuffer( lResult );
- return strResult.AllocSysString();
- }
-
- BSTR CDESCtrl::DecryptString(const VARIANT FAR& Crypttext)
- {
- CString strResult;
- CString ansi;
- BSTR bstr;
- LPSTR lpResult;
- LPCTSTR lpAnsi;
- DWORD dwOrg[2];
- long l, i, lResult;
-
- if( !bKeySet )
- ThrowError(0);
-
- if( !GetString( &Crypttext, &bstr ) )
- ThrowError(0); //
- CopyBSTRToCString( bstr, &ansi );
-
- lResult = (ansi.GetLength() + 8) & 0xFFFFFFF8;
- lpResult = strResult.GetBufferSetLength( lResult );
- lpAnsi = (LPCTSTR)ansi;
-
- if( !lpResult )
- ThrowError( CTL_E_OUTOFMEMORY );
-
- l = ansi.GetLength();
- i = 0;
- while( i < l )
- {
- if( (l-i) >= 8 )
- {
- memcpy( dwOrg, &lpAnsi[i], 8);
- i+=8;
- }
- else
- {
- dwOrg[0]=0;
- dwOrg[1]=0;
- char *c = (char*)dwOrg;
- for( ; i < l; i++ )
- *(c++) = lpAnsi[i];
- }
-
- Decryptor.Codec( dwOrg, (DWORD*)lpResult );
- lpResult += 8;
- }
- strResult.ReleaseBuffer( lResult );
- return strResult.AllocSysString();
- }
-
- VARIANT CDESCtrl::GetKey()
- {
- VARIANT vaResult;
- VariantInit(&vaResult);
- vaResult.vt = VT_BSTR;
- vaResult.bstrVal = m_Key.AllocSysString();
- return vaResult;
- }
-
- void CDESCtrl::SetKey(const VARIANT FAR& newValue)
- {
- BSTR bstr;
- CString cstr;
- DWORD dwKey[2];
- if( !GetString( &newValue, &bstr ) )
- ThrowError( CUSTOM_CTL_SCODE( 7000 ), "Key mu▀ als String angegeben werden!");
- CopyBSTRToCString( bstr, &cstr );
- if( cstr.GetLength() != 8 )
- ThrowError( CUSTOM_CTL_SCODE( 7000 ), "Key mu▀ aus genau 8 Zeichen bestehen");
-
- memcpy( dwKey, (LPCTSTR)cstr, 8 );
- Encryptor.BuildEncryptionKey( dwKey );
- Decryptor.BuildDecryptionKey( dwKey );
- m_Key = cstr;
- bKeySet = TRUE;
- SetModifiedFlag();
- }
-
- BOOL CDESCtrl::OnSetExtent( LPSIZEL lpSizeL )
- {
- SIZE s;
- CDC dc;
-
- if( dc.CreateCompatibleDC( NULL ) )
- {
- s.cx = lpSizeL->cx;
- s.cy = lpSizeL->cy;
- dc.HIMETRICtoDP( &s );
-
- if( ( s.cx != 28 ) || ( s.cy != 28 ) )
- {
- SetControlSize( 28, 28 );
- return FALSE;
- }
- dc.DeleteDC();
- }
- return TRUE;
- }
-