Статус: Сотрудник
Группы готовые для захвата: Участники
Зарегистрирован: 13.03.2014(UTC) Сообщений: 1  Откуда: Москва
|
Вот код программы, которая ищет СНИЛС в файле сертификата c именем "cert.cer" и выводит его значение на экран. 1. кладем сертификат в папку с кодом. 2. собираем исполняемый файл: Код:eval `/opt/cprocsp/src/doxygen/setenv.sh --32`; g++ -DUNIX -DHAVE_LIMITS_H -DHAVE_STDINT_H -I/opt/cprocsp/include -I/opt/cprocsp/include/cpcsp -I/opt/cprocsp/include/asn1c/rtsrc -I/opt/cprocsp/include/asn1data -DSIZEOF_VOID_P=4 -L/opt/cprocsp/lib/ia32 -lasn1data -lssp -lcapi10 -lcapi20 -lpthread /tmp/snils.c
3../a.out - получаем строку со значением СНИЛСа код программы: Код:
#include <stdio.h>
#ifdef _WIN32
# include <windows.h>
# include <wincrypt.h>
#else
# include <stdlib.h>
# include <string.h>
# include <CSP_WinDef.h>
# include <CSP_WinCrypt.h>
#endif
#include <WinCryptEx.h>
#include <locale.h>
static void HandleError(char *s);
static PCCERT_CONTEXT ReadCertFromFile (const TCHAR *fname);
PCCERT_CONTEXT ReadCertFromFile (const TCHAR *infile)
{
BYTE *cert = NULL;
DWORD len = 0;
PCCERT_CONTEXT ret = NULL;
FILE *f = NULL;
size_t mem_len = 0;
int flag = 0;
unsigned char *mem_tbr = NULL;
//-------------------------------------------------------------------
// get file data pointer
//-------------------------------------------------------------------
// open file
if (infile == NULL)
{
fprintf (stderr, "No file specified\n");
goto err;
}
f = fopen (infile, "rb");
if (!f)
{
fprintf (stderr, "Cannot open input file\n");
goto err;
}
//-------------------------------------------------------------------
// read file
mem_len = 0;
mem_tbr = NULL;
if (fseek(f, 0, SEEK_END) == 0)
{
long fl_len = ftell(f);
if (fl_len == -1)
goto err;
mem_len = (size_t)fl_len;
if ((long)mem_len != fl_len)
goto err;
if (mem_len)
{
if ((mem_tbr = (unsigned char*)malloc(mem_len)) == NULL)
goto err;
if (fseek(f, 0, SEEK_SET))
goto err;
if (fread (mem_tbr, mem_len, 1, f) != 1)
if (ferror(f))
goto err;
}
}
len = mem_len;
cert = mem_tbr;
//-------------------------------------------------------------------
ret = CertCreateCertificateContext ( X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, cert, len);
if (!ret)
{
fprintf (stderr, "The public key can not be written to file.\n");
goto err;
}
//-------------------------------------------------------------------
// release file data pointer
if (cert) free (cert);
flag = 1;
err:
if (f) fclose (f);
f = NULL;
if (!flag)
{
if (mem_tbr) free(mem_tbr);
mem_tbr = NULL;
return NULL;
}
return ret;
}// End of ReadCertFromFile
int main()
{
char fname[] = "cert.cer"; // Имя файла c сертификатом
BYTE *DecodedSub = NULL;
DWORD DecodedSub_len = 0;
BYTE *DecodedSnils = NULL;
DWORD DecodedSnils_len = 0;
PCCERT_CONTEXT pCertContext = NULL;
PCERT_INFO pCertInfo;
CERT_NAME_INFO * pSubject;
CERT_NAME_BLOB Subject;
DWORD MY_ENCODING_TYPE = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
int i,j;
int flag = 0;
pCertContext = ReadCertFromFile (fname);
pCertInfo= (*pCertContext).pCertInfo ;
Subject = (*pCertInfo).Subject;
//-------------------------------------------------------------------
// Decode Subject
if (!CryptDecodeObject(MY_ENCODING_TYPE, X509_NAME, Subject.pbData, Subject.cbData, 0, NULL, &DecodedSub_len))
HandleError("CryptDecodeObject(X509_NAME, NULL) failed");
DecodedSub = malloc (DecodedSub_len);
if (! DecodedSub)
HandleError ("Memory allocation error.");
if (!CryptDecodeObject(MY_ENCODING_TYPE, X509_NAME, Subject.pbData, Subject.cbData, 0, DecodedSub, &DecodedSub_len))
{
free (DecodedSub);
HandleError("CryptDecodeObject(X509_NAME, DecodedSub) failed");
}
pSubject = (CERT_NAME_INFO*) DecodedSub;
//-------------------------------------------------------------------
// Decode SNILS
for (i = 0; (i < pSubject->cRDN) && (flag == 0) ; i++)
for (j = 0; (j < pSubject->rgRDN[i].cRDNAttr) && (flag == 0); j++)
{
if (strcmp(pSubject->rgRDN[i].rgRDNAttr[j].pszObjId, szOID_SNILS) == 0)
{
flag = 1;
DecodedSnils = (CHAR *)malloc(pSubject->rgRDN[i].rgRDNAttr[j].Value.cbData + 1);
if (! DecodedSnils)
{
free (DecodedSub);
HandleError ("Memory allocation error(DecodedSnils).");
}
if (!memcpy(DecodedSnils, pSubject->rgRDN[i].rgRDNAttr[j].Value.pbData,pSubject->rgRDN[i].rgRDNAttr[j].Value.cbData))
{
free (DecodedSub);
HandleError ("Memcpy error(DecodedSnils).");
}
DecodedSnils[pSubject->rgRDN[i].rgRDNAttr[j].Value.cbData] = 0;
printf("Decoded SNILS is: %s\n", DecodedSnils);
}
}
//-------------------------------------------------------------------
// Free memory.
if (DecodedSnils) free (DecodedSnils);
if (DecodedSub) free (DecodedSub);
return 0;
}// End of main
void HandleError(char *s)
{
DWORD err = GetLastError();
printf("Error number : 0x%x\n", err);
printf("Error description: %s\n", s);
if(!err) err = 1;
exit(err);
}// End of HandleError
Отредактировано пользователем 13 марта 2014 г. 17:42:20(UTC)
| Причина: Не указана
|