#include "stdafx.h" #ifndef _CHICAGO_ // this file is always compile UNICODE in the library - so the conversions work out right // //Local includes // #include "certupgr.h" #define BACKUP_ID 'KRBK' //------------------------------------------------------------------------------ void ReadWriteDWORD( HANDLE hFile, DWORD *pDword, BOOL fRead ); void ReadWriteString( HANDLE hFile, LPTSTR* ppsz, BOOL fRead ); void ReadWriteBlob( HANDLE hFile, PVOID pBlob, DWORD cbBlob, BOOL fRead ); //------------------------------------------------------------------------- PCCERT_CONTEXT ImportKRBackupToCAPIStore_A( PCHAR pszFileName, // path of the file PCHAR pszPassword, // ANSI password PCHAR pszCAPIStore, // name of the capi store BOOL bOverWrite ) { PCCERT_CONTEXT pCert = NULL; // prep the wide strings PWCHAR pszwFileName = NULL; PWCHAR pszwCAPIStore = NULL; DWORD lenFile = (strlen(pszFileName)+1) * sizeof(TCHAR); DWORD lenStore = (strlen(pszCAPIStore)+1) * sizeof(TCHAR); pszwFileName = (PWCHAR)GlobalAlloc( GPTR, lenFile ); pszwCAPIStore = (PWCHAR)GlobalAlloc( GPTR, lenStore ); if ( !pszwFileName || !pszwCAPIStore ) goto cleanup; // convert the strings MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, pszFileName, -1, pszwFileName, lenFile ); MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, pszCAPIStore, -1, pszwCAPIStore, lenStore ); // do the real call pCert = ImportKRBackupToCAPIStore_W( pszwFileName, pszPassword, pszwCAPIStore, bOverWrite); cleanup: // preserve the last error state DWORD err = GetLastError(); // clean up the strings if ( pszwFileName ) GlobalFree( pszwFileName ); if ( pszwCAPIStore ) GlobalFree( pszwCAPIStore ); // reset the last error state SetLastError( err ); // return the cert return pCert; } //------------------------------------------------------------------------- // Import old-style keyring backup file PCCERT_CONTEXT ImportKRBackupToCAPIStore_W( PWCHAR ptszFileName, // path of the file PCHAR pszPassword, // ANSI password PWCHAR pszCAPIStore, // name of the capi store BOOL bOverWrite ) { PCCERT_CONTEXT pCertContext = NULL; DWORD dword; LPTSTR psz = NULL; // prep the file name HANDLE hFile = NULL; // This code is originally from KeyRing. The fImport controlled whether it was reading // or writing the file. In this case, we are always and only reading it. so.... const BOOL fImport = TRUE; // also, this was a method on a class. The appropriate member variables are now here PVOID pPrivateKey = NULL; DWORD cbPrivateKey; PVOID pCertificate = NULL; DWORD cbCertificate; PVOID pRequest = NULL; DWORD cbRequest = 0; CString szName; // open the file hFile = CreateFile( ptszFileName, // pointer to name of the file GENERIC_READ, // access (read-write) mode FILE_SHARE_READ, // share mode NULL, // pointer to security attributes OPEN_EXISTING, // how to create FILE_ATTRIBUTE_NORMAL, // file attributes NULL // handle to file with attributes to copy ); if ( hFile == INVALID_HANDLE_VALUE ) return NULL; // do the backup id dword = BACKUP_ID; ReadWriteDWORD( hFile, &dword, fImport ); // check the backup id if ( dword != BACKUP_ID ) { goto cleanup; } // start with the name of the key ReadWriteString( hFile, &psz, fImport ); // we aren't using the name for now, so throw it away..... if ( psz ) GlobalFree( psz ); psz = NULL; // now the private key data size ReadWriteDWORD( hFile, &cbPrivateKey, fImport ); // make a private key data pointer if necessary if ( fImport && cbPrivateKey ) { pPrivateKey = GlobalAlloc( GPTR, cbPrivateKey ); if ( !pPrivateKey ) { goto cleanup; } } // use the private key pointer if ( cbPrivateKey ) ReadWriteBlob( hFile, pPrivateKey, cbPrivateKey, fImport ); // now the certificate ReadWriteDWORD( hFile, &cbCertificate, fImport ); // make a data pointer if necessary if ( fImport && cbCertificate ) { pCertificate = GlobalAlloc( GPTR, cbCertificate ); if ( !pCertificate ) { goto cleanup; } } // use the public key pointer if ( cbCertificate ) ReadWriteBlob( hFile, pCertificate, cbCertificate, fImport ); // now the request - if there is one ReadWriteDWORD( hFile, &cbRequest, fImport ); // make a data pointer if necessary if ( fImport && cbRequest ) { pRequest = GlobalAlloc( GPTR, cbRequest ); if ( !pRequest ) { goto cleanup; } } // use the request pointer if ( cbRequest ) ReadWriteBlob( hFile, pRequest, cbRequest, fImport ); // finally, do the CAPI conversion here pCertContext = CopyKRCertToCAPIStore( pPrivateKey, cbPrivateKey, pCertificate, cbCertificate, pRequest, cbRequest, pszPassword, pszCAPIStore, bOverWrite); // clean up cleanup: if ( hFile ) CloseHandle( hFile ); if ( pPrivateKey ) GlobalFree( pPrivateKey ); if ( pCertificate ) GlobalFree( pCertificate ); if ( pRequest ) GlobalFree( pRequest ); // return the context return pCertContext; } // file utilities //--------------------------------------------------------------------------- void ReadWriteDWORD( HANDLE hFile, DWORD *pDword, BOOL fRead ) { // read it or write it ReadWriteBlob( hFile, pDword, sizeof(DWORD), fRead ); } //--------------------------------------------------------------------------- // remember - we are only and always reading - never writing....... void ReadWriteString( HANDLE hFile, LPTSTR* ppsz, BOOL fRead ) { // get the length of the string DWORD cbLength = 0; ReadWriteDWORD(hFile,&cbLength,fRead ); // allocate the buffer for the new string - it is the responsibility // of the caller to ensure that ppsz is not pointing to something that // needs to be freed. if ( fRead ) { *ppsz = (LPTSTR)GlobalAlloc( GPTR, cbLength+1 ); ASSERT( *ppsz ); if ( !*ppsz ) AfxThrowMemoryException(); } // read or write the string ReadWriteBlob(hFile, *ppsz, cbLength+1, fRead); } /* #pragma INTRINSA suppress=all */ //--------------------------------------------------------------------------- void ReadWriteBlob( HANDLE hFile, PVOID pBlob, DWORD cbBlob, BOOL fRead ) { // read it or write it // - always read it here this isn't keyring anymore ReadFile( hFile, // handle of file to read pBlob, // address of buffer that receives data cbBlob, // number of bytes to read &cbBlob, // address of number of bytes read NULL // address of structure for data ); } #endif //_CHICAGO_