Advertisement
Guest User

main.c

a guest
Mar 15th, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.54 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <CSP_WinDef.h>
  5. #include <CSP_WinCrypt.h>
  6. #include <reader/tchar.h>
  7. #include <WinCryptEx.h>
  8.  
  9. int main(void) {
  10.     BOOL result;
  11.  
  12.     HCERTSTORE hStore = CertOpenSystemStore(0, "MY");
  13.     // printf("hStore = %p\n", hStore);
  14.  
  15.     PCERT_CONTEXT pCertReceiver = CertFindCertificateInStore(
  16.         hStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0,
  17.         CERT_FIND_SUBJECT_STR_A, "CRYPTO-PRO", NULL
  18.     );
  19.     // printf("pCertReceiver = %p\n", pCertReceiver);
  20.     // printf("pCertReceiver.hStore = %p\n", pCertReceiver->hCertStore);
  21.  
  22.     PCERT_CONTEXT pCertSender = CertFindCertificateInStore(
  23.         hStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0,
  24.         CERT_FIND_SUBJECT_STR_A, "test@example.com", NULL
  25.     );
  26.     // printf("pCertSender = %p\n", pCertSender);
  27.     // printf("pCertSender.hStore = %p\n", pCertSender->hCertStore);
  28.  
  29.     HCRYPTPROV hSenderProv;
  30.     DWORD senderPrivKeySpec;
  31.     result = CryptAcquireCertificatePrivateKey(
  32.         pCertSender, 0, NULL,
  33.         &hSenderProv, &senderPrivKeySpec, NULL
  34.     );
  35.     printf("CryptAcquireCertificatePrivateKey = %d\n", result);
  36.     printf("hSenderProv = %llu\n", hSenderProv);
  37.     printf("senderPrivKeySpec = %d\n", senderPrivKeySpec);
  38.     printf("\n");
  39.  
  40.     HCRYPTKEY hSenderPrivKey;
  41.     result = CryptGetUserKey(hSenderProv, senderPrivKeySpec, &hSenderPrivKey);
  42.     printf("CryptGetUserKey = %d\n", result);
  43.     printf("hSenderPrivKey = %llu\n", hSenderPrivKey);
  44.     printf("\n");
  45.  
  46.     HCRYPTKEY hReceiverPubKey;
  47.     result = CryptImportPublicKeyInfoEx(
  48.         hSenderProv, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
  49.         &(pCertReceiver->pCertInfo->SubjectPublicKeyInfo), 0, 0, NULL, &hReceiverPubKey
  50.     );
  51.     printf("CryptImportPublicKeyInfoEx = %d\n", result);
  52.     printf("hReceiverPubKey = %llu\n", hReceiverPubKey);
  53.     printf("\n");
  54.  
  55.     DWORD recPubLen = 256;
  56.     BYTE *recPubBuffer = (BYTE*)malloc(recPubLen);
  57.     result = CryptExportKey(
  58.         hReceiverPubKey, 0, PUBLICKEYBLOB, 0, recPubBuffer, &recPubLen
  59.     );
  60.     printf("CryptExportKey = %d\n", result);
  61.     printf("recPubLen = %u\n", recPubLen);
  62.     printf("GetLastError = %x\n", GetLastError());
  63.     printf("\n");
  64.  
  65.     HCRYPTKEY hAgreeKey;
  66.     result = CryptImportKey(
  67.         hSenderProv, recPubBuffer, recPubLen,
  68.         hSenderPrivKey, 0, &hAgreeKey
  69.     );
  70.     printf("CryptImportKey = %d\n", result);
  71.     printf("hAgreeKey = %llu\n", hAgreeKey);
  72.     printf("GetLastError = %x\n", GetLastError());
  73.     printf("\n");
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement