173 lines
3.7 KiB
C++
173 lines
3.7 KiB
C++
//+-----------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (c) Microsoft Corporation 1992 - 1992
|
|
//
|
|
// File: secret.cxx
|
|
//
|
|
// Contents: test program to check the setup of a Cairo installation
|
|
//
|
|
//
|
|
// History: 22-Dec-92 Created MikeSw
|
|
//
|
|
//------------------------------------------------------------------------
|
|
|
|
|
|
extern "C"
|
|
{
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <ntlsa.h>
|
|
#include <stdio.h>
|
|
#include <windef.h>
|
|
#include <winbase.h>
|
|
#include <winreg.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
}
|
|
|
|
void _cdecl
|
|
main(int argc, char *argv[])
|
|
{
|
|
LPSTR KeyName;
|
|
LPSTR ValueName;
|
|
FILE * File;
|
|
DWORD RegStatus;
|
|
HKEY Key = NULL;
|
|
PBYTE Buffer = NULL;
|
|
ULONG Size;
|
|
ULONG Type;
|
|
CHAR FileName[20];
|
|
ULONG Index;
|
|
ULONG CertCount;
|
|
CHAR NameBuffer[10];
|
|
ULONG NameBufferSize;
|
|
BYTE VerisignCert[] = {
|
|
0x30, 0x82, 0x02, 0x79, 0x30, 0x82, 0x01, 0xE2,
|
|
0xA0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x35,
|
|
0x11, 0xA5, 0x52, 0x90, 0x6F, 0xE7, 0xD0, 0x29,
|
|
0xA4, 0x40, 0x19, 0xD4, 0x11, 0xFC, 0x3E, 0x30
|
|
};
|
|
|
|
|
|
//
|
|
// Open the key with the list of certificates
|
|
//
|
|
|
|
|
|
RegStatus = RegOpenKeyExA(
|
|
HKEY_CURRENT_USER,
|
|
"Software\\Microsoft\\Cryptography\\PersonalCertificates\\ClientAuth\\Certificates",
|
|
0,
|
|
KEY_QUERY_VALUE,
|
|
&Key
|
|
);
|
|
if (RegStatus != ERROR_SUCCESS)
|
|
{
|
|
printf("No certificates found\n");
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Enumerate throught the values
|
|
//
|
|
|
|
CertCount = 1;
|
|
for (Index = 0; ; Index++ )
|
|
{
|
|
|
|
NameBufferSize = sizeof(NameBuffer);
|
|
RegStatus = RegEnumValueA(
|
|
Key,
|
|
Index,
|
|
NameBuffer,
|
|
&NameBufferSize,
|
|
0,
|
|
&Type,
|
|
NULL,
|
|
&Size );
|
|
if ((RegStatus != STATUS_SUCCESS) &&
|
|
(RegStatus != ERROR_MORE_DATA))
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
// We only want binary values
|
|
//
|
|
|
|
if (Type != REG_BINARY)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
Buffer = (PBYTE) LocalAlloc(LMEM_ZEROINIT, Size);
|
|
if (Buffer == NULL)
|
|
{
|
|
goto Cleanup;
|
|
}
|
|
|
|
NameBufferSize = sizeof(NameBuffer);
|
|
|
|
RegStatus = RegEnumValueA(
|
|
Key,
|
|
Index,
|
|
NameBuffer,
|
|
&NameBufferSize,
|
|
0,
|
|
&Type,
|
|
Buffer,
|
|
&Size );
|
|
|
|
if (RegStatus != ERROR_SUCCESS)
|
|
{
|
|
goto Cleanup;
|
|
}
|
|
|
|
//
|
|
// Skip the verisign certificate.
|
|
//
|
|
|
|
if (memcmp(Buffer,VerisignCert, sizeof(VerisignCert)) == 0)
|
|
{
|
|
LocalFree(Buffer);
|
|
Buffer = NULL;
|
|
continue;
|
|
}
|
|
if (CertCount == 1)
|
|
{
|
|
sprintf(FileName,"mycerts.cer");
|
|
}
|
|
else
|
|
{
|
|
sprintf(FileName,"mycerts%d.cer",CertCount);
|
|
}
|
|
File = fopen(FileName,"wb");
|
|
if (File == NULL)
|
|
{
|
|
printf("Error opening file %s\n",FileName);
|
|
goto Cleanup;
|
|
}
|
|
|
|
fwrite(Buffer, Size, 1, File);
|
|
fclose(File);
|
|
LocalFree(Buffer);
|
|
Buffer = NULL;
|
|
CertCount++;
|
|
}
|
|
|
|
Cleanup:
|
|
if (Key != NULL)
|
|
{
|
|
RegCloseKey(Key);
|
|
}
|
|
if (Buffer != NULL)
|
|
{
|
|
LocalFree(Buffer);
|
|
}
|
|
return;
|
|
}
|