--- /dev/null
+/* 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;
+}
+