win95-initial-port-20010430
[openafs.git] / src / WINNT / win9xpanel / Encript.cpp
diff --git a/src/WINNT/win9xpanel/Encript.cpp b/src/WINNT/win9xpanel/Encript.cpp
new file mode 100644 (file)
index 0000000..b7a4249
--- /dev/null
@@ -0,0 +1,158 @@
+/* Copyright 2000, International Business Machines Corporation and others.
+       All Rights Reserved.
+       This software has been released under the terms of the IBM Public
+       License.  For details, see the LICENSE file in the top-level source
+       directory or online at http://www.openafs.org/dl/license10.html
+*/
+// Encription Module
+#include "stdafx.h"
+#include "WinAfsLoad.h"
+#include "WinAfsLoadDlg.h"
+#include "encript.h"
+
+
+CEncript::CEncript(CWinAfsLoadDlg *pParent)
+{
+       m_pParent=pParent;
+       m_hLibrary=LoadLibrary("ADVAPI32.dll");
+       if (m_hLibrary)
+       {
+               m_pCryptAcquireContext=(PCRYPTACQUIRECONTEXT)GetProcAddress(m_hLibrary,"CryptAcquireContextA");
+               m_pCryptCreateHash=(PCRYPTCREATEHASH)GetProcAddress(m_hLibrary,"CryptCreateHash");
+               m_pCryptHashData=(PCRYPTHASHDATA)GetProcAddress(m_hLibrary,"CryptHashData");
+               m_pCryptDeriveKey=(PCRYPTDERIVEKEY)GetProcAddress(m_hLibrary,"CryptDeriveKey");
+               m_pCryptEncrypt=(PCRYPTENCRYPT)GetProcAddress(m_hLibrary,"CryptEncrypt");
+               m_pCryptDecrypt=(PCRYPTDECRYPT)GetProcAddress(m_hLibrary,"CryptDecrypt");
+               m_pCryptDestroyHash=(PCRYPTDESTROYHASH)GetProcAddress(m_hLibrary,"CryptDestroyHash");
+               m_pCryptDestroyKey=(PCRYPTDESTROYKEY)GetProcAddress(m_hLibrary,"CryptDestroyKey");
+               m_pCryptReleaseContext=(PCRYPTRELEASECONTEXT)GetProcAddress(m_hLibrary,"CryptReleaseContext");
+               
+               if ((m_pCryptAcquireContext==NULL)
+                       ||(m_pCryptCreateHash==NULL)
+                       ||(m_pCryptHashData==NULL)
+                       ||(m_pCryptDeriveKey==NULL)
+                       ||(m_pCryptEncrypt==NULL)
+                       ||(m_pCryptDecrypt==NULL)
+                       ||(m_pCryptDestroyHash==NULL)
+                       ||(m_pCryptDestroyKey==NULL)
+                       ||(m_pCryptReleaseContext==NULL)
+                       )
+               {
+                       LOG("Incorrect ADVAPI32.DLL, Load failure");
+                       FreeLibrary(m_hLibrary);
+                       m_hLibrary=NULL;
+               }
+       }
+}
+
+CEncript::~CEncript()
+{
+       if (m_hLibrary)
+               FreeLibrary(m_hLibrary);
+       m_hLibrary=NULL;
+}
+
+
+// Encript pPassword
+// if doEncript then encript else de encript
+// on doEncript (true) dwSize sets maxmium size of encription output and pPassword is string to encript 
+//             and output of encripted string with dwSize set to output size
+// on not doEncript(false) dwSize sets size of pPassword input and pPassword is returned string
+
+BOOL CEncript::Encript(LPCSTR pMachinename,LPCSTR pLoginName,LPCSTR pUsername,PBYTE pPassword,DWORD &dwSize,BOOL doEncript)
+{
+#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
+
+       BOOL bResult;
+       HCRYPTPROV hProv;
+       HCRYPTHASH hHash;
+       HCRYPTKEY hKey;
+       CString sKey;
+       if (m_hLibrary==NULL)
+       {
+               if (doEncript)
+                       dwSize=strlen((char *)pPassword);
+               return TRUE;
+       }
+       if(! (*m_pCryptAcquireContext)(
+          &hProv,               // Handle to the CSP
+          pLoginName,                  // Container name 
+          MS_DEF_PROV,               // Provider name
+          PROV_RSA_FULL,             // Provider type
+          0))                        // Flag values
+       { 
+       //--------------------------------------------------------------------
+       // Some sort of error occurred in acquiring the context. 
+       // Create a new default key container. 
+
+          if(!(*m_pCryptAcquireContext) (
+                 &hProv, 
+                 pLoginName, 
+                 MS_DEF_PROV, 
+                 PROV_RSA_FULL, 
+                 CRYPT_NEWKEYSET)) 
+               {
+                 m_pParent->HandleError("Could not create a new key container.\n");
+               }
+       }       
+
+       // Obtain handle to hash object.
+       bResult = (*m_pCryptCreateHash)(
+                               hProv,             // Handle to CSP obtained earlier
+                               CALG_MD5,          // Hashing algorithm
+                               0,                 // Non-keyed hash
+                               0,                 // Should be zero
+                               &hHash);           // Variable to hold hash object handle 
+
+       if (!bResult) { m_pParent->HandleError("Password Encription Error!");return FALSE;}
+       // Hash data.
+       sKey.Format("AFS%s%s%s",pLoginName,pUsername,pMachinename);
+       bResult = (*m_pCryptHashData)(
+                               hHash,             // Handle to hash object
+                               (PBYTE)(const char *)sKey,         // Pointer to password
+                               dwSize,  // Length of data
+                               0);                // No special flags
+
+       if (!bResult) { m_pParent->HandleError("Password Encription Error!");return FALSE;}
+
+       // Create key from specified password.
+       bResult = (*m_pCryptDeriveKey)(
+                               hProv,               // Handle to CSP obtained earlier.
+                               CALG_RC4,            // Use a stream cipher.
+                               hHash,               // Handle to hashed password.
+                               CRYPT_EXPORTABLE,    // Make key exportable.
+                               &hKey);              // Variable to hold handle of key.
+       if (!bResult) { m_pParent->HandleError("Password Encription Error!");return FALSE;}
+
+// Now encrypt data.
+       if (doEncript)
+       {
+               bResult = (*m_pCryptEncrypt)(
+                                       hKey,            // Key obtained earlier
+                                       0,               // No hashing of data
+                                       TRUE,            // Final or only buffer of data
+                                       0,               // Must be zero
+                                       pPassword,         // Data buffer
+                                       &dwSize,         // Size of data
+                                       dwSize);         // Size of block
+               if (!bResult) { m_pParent->HandleError("Password Encription Error!");return FALSE;}
+
+               // save password in encription area
+       } else {
+               bResult = (*m_pCryptDecrypt)(
+                                       hKey,            // Key obtained earlier
+                                       0,               // No hashing of data
+                                       TRUE,            // Final or only buffer of data
+                                       0,               // Must be zero
+                                       pPassword,         // Data buffer
+                                       &dwSize);         // Size of data
+               if (!bResult) { m_pParent->HandleError("Password Encription Error!");return FALSE;}
+       }
+// Release hash object.
+       (*m_pCryptDestroyHash)(hHash);
+       (*m_pCryptDestroyKey)(hKey);
+       (*m_pCryptReleaseContext)(hProv,0);
+       return TRUE;
+}
+