WinStd
Windows Win32 API using Standard C++
Loading...
Searching...
No Matches
Crypt.h
1/*
2 SPDX-License-Identifier: MIT
3 Copyright © 1991-2023 Amebis
4 Copyright © 2016 GÉANT
5*/
6
8
9#pragma once
10
11#include "Common.h"
12#include <assert.h>
13#include <WinCrypt.h>
14#include <algorithm>
15#include <string>
16#include <vector>
17
20
22template<class _Traits, class _Ax>
23static DWORD CertGetNameStringA(_In_ PCCERT_CONTEXT pCertContext, _In_ DWORD dwType, _In_ DWORD dwFlags, _In_opt_ void *pvTypePara, _Out_ std::basic_string<char, _Traits, _Ax> &sNameString)
24{
25 // Query the final string length first.
26 DWORD dwSize = ::CertGetNameStringA(pCertContext, dwType, dwFlags, pvTypePara, NULL, 0);
27
28 // Allocate buffer on heap to format the string data into and read it.
29 std::unique_ptr<char[]> szBuffer(new char[dwSize]);
30 dwSize = ::CertGetNameStringA(pCertContext, dwType, dwFlags, pvTypePara, szBuffer.get(), dwSize);
31 sNameString.assign(szBuffer.get(), dwSize - 1);
32 return dwSize;
33}
34
40template<class _Traits, class _Ax>
41static DWORD CertGetNameStringW(_In_ PCCERT_CONTEXT pCertContext, _In_ DWORD dwType, _In_ DWORD dwFlags, _In_opt_ void *pvTypePara, _Out_ std::basic_string<wchar_t, _Traits, _Ax> &sNameString)
42{
43 // Query the final string length first.
44 DWORD dwSize = ::CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara, NULL, 0);
45
46 // Allocate buffer on heap to format the string data into and read it.
47 std::unique_ptr<wchar_t[]> szBuffer(new wchar_t[dwSize]);
48 dwSize = ::CertGetNameStringW(pCertContext, dwType, dwFlags, pvTypePara, szBuffer.get(), dwSize);
49 sNameString.assign(szBuffer.get(), dwSize - 1);
50 return dwSize;
51}
52
58template<class _Ty, class _Ax>
59static _Success_(return != 0) BOOL WINAPI CertGetCertificateContextProperty(_In_ PCCERT_CONTEXT pCertContext, _In_ DWORD dwPropId, _Out_ std::vector<_Ty, _Ax> &aData)
60{
62 DWORD dwSize = WINSTD_STACK_BUFFER_BYTES;
63
64 // Try with the stack buffer first.
65 if (CertGetCertificateContextProperty(pCertContext, dwPropId, buf, &dwSize)) {
66 // Copy from stack.
67 aData.assign((const _Ty*)buf, (const _Ty*)buf + (dwSize + sizeof(_Ty) - 1) / sizeof(_Ty));
68 return TRUE;
69 } else if (GetLastError() == ERROR_MORE_DATA) {
70 aData.resize((dwSize + sizeof(_Ty) - 1) / sizeof(_Ty));
71 if (CertGetCertificateContextProperty(pCertContext, dwPropId, aData.data(), &dwSize))
72 return TRUE;
73 }
74
75 return FALSE;
76}
77
83template<class _Ty, class _Ax>
84static _Success_(return != 0) BOOL CryptGetHashParam(_In_ HCRYPTHASH hHash, _In_ DWORD dwParam, _Out_ std::vector<_Ty, _Ax> &aData, _In_ DWORD dwFlags)
85{
87 DWORD dwSize = WINSTD_STACK_BUFFER_BYTES;
88
89 // Try with the stack buffer first.
90 if (CryptGetHashParam(hHash, dwParam, buf, &dwSize, dwFlags)) {
91 // Copy from stack.
92 aData.assign((const _Ty*)buf, (const _Ty*)buf + (dwSize + sizeof(_Ty) - 1) / sizeof(_Ty));
93 return TRUE;
94 } else if (GetLastError() == ERROR_MORE_DATA) {
95 aData.resize((dwSize + sizeof(_Ty) - 1) / sizeof(_Ty));
96 if (CryptGetHashParam(hHash, dwParam, reinterpret_cast<BYTE*>(aData.data()), &dwSize, dwFlags))
97 return TRUE;
98 }
99
100 return FALSE;
101}
102
108template<class T>
109static _Success_(return != 0) BOOL CryptGetHashParam(_In_ HCRYPTHASH hHash, _In_ DWORD dwParam, _Out_ T &data, _In_ DWORD dwFlags)
110{
111 DWORD dwSize = sizeof(T);
112 return CryptGetHashParam(hHash, dwParam, (BYTE*)&data, &dwSize, dwFlags);
113}
114
120template<class _Ty, class _Ax>
121static _Success_(return != 0) BOOL CryptGetKeyParam(_In_ HCRYPTKEY hKey, _In_ DWORD dwParam, _Out_ std::vector<_Ty, _Ax> &aData, _In_ DWORD dwFlags)
122{
124 DWORD dwSize = WINSTD_STACK_BUFFER_BYTES;
125
126 // Try with the stack buffer first.
127 if (CryptGetKeyParam(hKey, dwParam, buf, &dwSize, dwFlags)) {
128 // Copy from stack.
129 aData.assign((const _Ty*)buf, (const _Ty*)buf + (dwSize + sizeof(_Ty) - 1) / sizeof(_Ty));
130 return TRUE;
131 } else if (GetLastError() == ERROR_MORE_DATA) {
132 aData.resize((dwSize + sizeof(_Ty) - 1) / sizeof(_Ty));
133 if (CryptGetKeyParam(hKey, dwParam, reinterpret_cast<BYTE*>(aData.data()), &dwSize, dwFlags))
134 return TRUE;
135 }
136
137 return FALSE;
138}
139
145template<class T>
146static BOOL CryptGetKeyParam(_In_ HCRYPTKEY hKey, _In_ DWORD dwParam, _Out_ T &data, _In_ DWORD dwFlags)
147{
148 DWORD dwSize = sizeof(T);
149 return CryptGetKeyParam(hKey, dwParam, (BYTE*)&data, &dwSize, dwFlags);
150}
151
157template<class _Ty, class _Ax>
158static _Success_(return != 0) BOOL CryptExportKey(_In_ HCRYPTKEY hKey, _In_ HCRYPTKEY hExpKey, _In_ DWORD dwBlobType, _In_ DWORD dwFlags, _Out_ std::vector<_Ty, _Ax> &aData)
159{
160 DWORD dwKeyBLOBSize = 0;
161
162 if (CryptExportKey(hKey, hExpKey, dwBlobType, dwFlags, NULL, &dwKeyBLOBSize)) {
163 aData.resize((dwKeyBLOBSize + sizeof(_Ty) - 1) / sizeof(_Ty));
164 if (CryptExportKey(hKey, hExpKey, dwBlobType, dwFlags, reinterpret_cast<BYTE*>(aData.data()), &dwKeyBLOBSize))
165 return TRUE;
166 }
167
168 return FALSE;
169}
170
176template<class _Ty, class _Ax>
177static _Success_(return != 0) BOOL CryptEncrypt(_In_ HCRYPTKEY hKey, _In_opt_ HCRYPTHASH hHash, _In_ BOOL Final, _In_ DWORD dwFlags, _Inout_ std::vector<_Ty, _Ax> &aData)
178{
179 SIZE_T
180 sDataLen = SIZETMult(aData.size(), sizeof(_Ty)),
181 sBufLen = SIZETMult(aData.capacity(), sizeof(_Ty));
182 if (sDataLen > DWORD_MAX || sBufLen > DWORD_MAX)
183 throw std::invalid_argument("Data too big");
184 DWORD
185 dwDataLen = static_cast<DWORD>(sDataLen),
186 dwBufLen = static_cast<DWORD>(sBufLen),
187 dwEncLen = dwDataLen,
188 dwResult;
189
190 if (dwBufLen) {
191 aData.resize(dwBufLen);
192 if (CryptEncrypt(hKey, hHash, Final, dwFlags, reinterpret_cast<BYTE*>(aData.data()), &dwEncLen, dwBufLen)) {
193 // Encryption succeeded.
194 assert(dwEncLen <= dwBufLen);
195 if (dwEncLen < dwBufLen)
196 aData.resize((dwEncLen + sizeof(_Ty) - 1) / sizeof(_Ty));
197 return TRUE;
198 } else
199 dwResult = GetLastError();
200 } else if (CryptEncrypt(hKey, NULL, Final, dwFlags, NULL, &dwEncLen, 0)) {
201 // CryptEncrypt() always succeeds for output data size queries.
202 // dwEncLen contains required output data size. Continue as if the buffer was to small. Actually, the output buffer _was_ too small!
203 dwResult = ERROR_MORE_DATA;
204 } else
205 dwResult = GetLastError();
206
207 if (dwResult == ERROR_MORE_DATA) {
208 // Encrypted data will be longer. Reserve more space and retry.
209 aData.resize(((dwBufLen = dwEncLen) + sizeof(_Ty) - 1) / sizeof(_Ty));
210 dwEncLen = dwDataLen;
211 if (CryptEncrypt(hKey, hHash, Final, dwFlags, reinterpret_cast<BYTE*>(aData.data()), &dwEncLen, dwBufLen)) {
212 // Encryption succeeded.
213 assert(dwEncLen <= dwBufLen);
214 if (dwEncLen < dwBufLen)
215 aData.resize((dwEncLen + sizeof(_Ty) - 1) / sizeof(_Ty));
216 return TRUE;
217 }
218 } else {
219 // Resize back to data length.
220 aData.resize((dwDataLen + sizeof(_Ty) - 1) / sizeof(_Ty));
221 }
222
223 return FALSE;
224}
225
231template<class _Ty, class _Ax>
232static _Success_(return != 0) BOOL CryptDecrypt(_In_ HCRYPTKEY hKey, _In_opt_ HCRYPTHASH hHash, _In_ BOOL Final, _In_ DWORD dwFlags, _Inout_ std::vector<_Ty, _Ax> &aData)
233{
234 SIZE_T sDataLen = SIZETMult(aData.size(), sizeof(_Ty));
235 if (sDataLen > DWORD_MAX)
236 throw std::invalid_argument("Data too big");
237 DWORD dwDataLen = static_cast<DWORD>(sDataLen);
238
239 if (CryptDecrypt(hKey, hHash, Final, dwFlags, reinterpret_cast<BYTE*>(aData.data()), &dwDataLen)) {
240 // Decryption succeeded.
241 aData.resize((dwDataLen + sizeof(_Ty) - 1) / sizeof(_Ty));
242 return TRUE;
243 }
244
245 return FALSE;
246}
247
249
250namespace winstd
251{
254
260 class cert_context : public dplhandle<PCCERT_CONTEXT, NULL>
261 {
263
264 public:
271 {
272 if (m_h != invalid)
274 }
275
284 bool operator==(_In_ const handle_type &other) const noexcept
285 {
286 // TODO: [Crypto] Make constant time.
287 return
288 m_h == other ||
289 m_h->cbCertEncoded == other->cbCertEncoded && memcmp(m_h->pbCertEncoded, other->pbCertEncoded, m_h->cbCertEncoded) == 0;
290 }
291
300 bool operator!=(_In_ const handle_type &other) const noexcept
301 {
302 return !operator==(other);
303 }
304
313 bool operator<(_In_ const handle_type &other) const noexcept
314 {
315 // TODO: [Crypto] Make constant time.
316 const int r = memcmp(m_h->pbCertEncoded, other->pbCertEncoded, std::min<DWORD>(m_h->cbCertEncoded, other->cbCertEncoded));
317 return r < 0 || r == 0 && m_h->cbCertEncoded < other->cbCertEncoded;
318 }
319
328 bool operator>(_In_ const handle_type &other) const noexcept
329 {
330 // TODO: [Crypto] Make constant time.
331 const int r = memcmp(m_h->pbCertEncoded, other->pbCertEncoded, std::min<DWORD>(m_h->cbCertEncoded, other->cbCertEncoded));
332 return r > 0 || r == 0 && m_h->cbCertEncoded > other->cbCertEncoded;
333 }
334
343 bool operator<=(_In_ const handle_type &other) const noexcept
344 {
345 return !operator>(other);
346 }
347
356 bool operator>=(_In_ const handle_type &other) const noexcept
357 {
358 return !operator<(other);
359 }
360
361 protected:
367 void free_internal() noexcept override
368 {
369 CertFreeCertificateContext(m_h);
370 }
371
382 {
383 // As per doc, this only increases refcounter. Should never fail.
384 return CertDuplicateCertificateContext(h);
385 }
386 };
387
393 class cert_chain_context : public dplhandle<PCCERT_CHAIN_CONTEXT, NULL>
394 {
396
397 public:
404 {
405 if (m_h != invalid)
407 }
408
409 protected:
415 void free_internal() noexcept override
416 {
417 CertFreeCertificateChain(m_h);
418 }
419
430 {
431 // As per doc, this only increases refcounter. Should never fail.
432 return CertDuplicateCertificateChain(h);
433 }
434 };
435
442 class cert_store : public handle<HCERTSTORE, NULL>
443 {
445
446 public:
452 virtual ~cert_store()
453 {
454 if (m_h != invalid)
456 }
457
458 protected:
464 void free_internal() noexcept override
465 {
466 CertCloseStore(m_h, 0);
467 }
468 };
469
475 class crypt_prov : public handle<HCRYPTPROV, NULL>
476 {
478
479 public:
485 virtual ~crypt_prov()
486 {
487 if (m_h != invalid)
489 }
490
491 protected:
497 void free_internal() noexcept override
498 {
499 CryptReleaseContext(m_h, 0);
500 }
501 };
502
508 class crypt_hash : public dplhandle<HCRYPTHASH, NULL>
509 {
511
512 public:
518 virtual ~crypt_hash()
519 {
520 if (m_h != invalid)
522 }
523
524 protected:
530 void free_internal() noexcept override
531 {
532 CryptDestroyHash(m_h);
533 }
534
545 {
546 handle_type hNew;
547 if (CryptDuplicateHash(h, NULL, 0, &hNew))
548 return hNew;
549 throw win_runtime_error("CryptDuplicateHash failed");
550 }
551 };
552
561 class crypt_key : public dplhandle<HCRYPTKEY, NULL>
562 {
564
565 public:
571 virtual ~crypt_key()
572 {
573 if (m_h != invalid)
575 }
576
585 bool create_exp1(_In_ HCRYPTPROV hProv, _In_ DWORD dwKeySpec)
586 {
587 if (dwKeySpec != AT_KEYEXCHANGE && dwKeySpec != AT_SIGNATURE) {
588 SetLastError(ERROR_INVALID_PARAMETER);
589 return false;
590 }
591
592 // Generate the private key.
593 handle_type h;
594 if (CryptGenKey(hProv, dwKeySpec, CRYPT_EXPORTABLE, &h)) {
595 // Export the private key, we'll convert it to a private exponent of one key.
596 std::vector<BYTE, sanitizing_allocator<BYTE>> key_blob;
597 if (CryptExportKey(h, 0, PRIVATEKEYBLOB, 0, key_blob)) {
598 CryptDestroyKey(h);
599
600 // Get the byte length of the key.
601 size_t
602 size_key = *reinterpret_cast<DWORD*>(&key_blob[12])/8,
603 size_prime = size_key/2;
604
605 // Modify the Exponent in Key BLOB format
606 // Key BLOB format is documented in SDK
607
608 // Convert pubexp in rsapubkey to 1
609 LPBYTE ptr = &key_blob[16];
610 *reinterpret_cast<DWORD*>(ptr) = 1;
611 ptr += sizeof(DWORD);
612
613 // Skip modulus, prime1, prime2
614 ptr += size_key;
615 ptr += size_prime;
616 ptr += size_prime;
617
618 // Convert exponent1 to 1
619 ptr[0] = 1;
620 memset(ptr + 1, 0, size_prime - 1);
621 ptr += size_prime;
622
623 // Convert exponent2 to 1
624 ptr[0] = 1;
625 memset(ptr + 1, 0, size_prime - 1);
626 ptr += size_prime;
627
628 // Skip coefficient
629 ptr += size_prime;
630
631 // Convert privateExponent to 1
632 ptr[0] = 1;
633 memset(ptr + 1, 0, size_key - 1);
634
635 // Import the exponent-of-one private key.
636 if (CryptImportKey(hProv, key_blob.data(), static_cast<DWORD>(key_blob.size()), 0, 0, &h)) {
637 attach(h);
638 return true;
639 }
640 } else
641 CryptDestroyKey(h);
642 }
643
644 return false;
645 }
646
647 protected:
653 void free_internal() noexcept override
654 {
655 CryptDestroyKey(m_h);
656 }
657
668 {
669 handle_type hNew;
670 if (CryptDuplicateKey(h, NULL, 0, &hNew))
671 return hNew;
672 throw win_runtime_error("CryptDuplicateKey failed");
673 }
674 };
675
679 #pragma warning(push)
680 #pragma warning(disable: 26432) // Copy constructor and assignment operator are also present, but not detected by code analysis as they are using base type source object reference.
681 class data_blob : public DATA_BLOB
682 {
683 public:
687 data_blob() noexcept
688 {
689 cbData = 0;
690 pbData = NULL;
691 }
692
696 data_blob(_In_count_(size) BYTE *data, _In_ DWORD size) noexcept
697 {
698 cbData = size;
699 pbData = data;
700 }
701
705 data_blob(_In_ const DATA_BLOB &other)
706 {
707 cbData = other.cbData;
708 if (cbData) {
709 pbData = static_cast<BYTE*>(LocalAlloc(LMEM_FIXED, other.cbData));
710 if (!pbData) throw win_runtime_error("LocalAlloc failed");
711 memcpy(pbData, other.pbData, other.cbData);
712 } else
713 pbData = NULL;
714 }
715
719 data_blob(_Inout_ data_blob &&other) noexcept
720 {
721 cbData = other.cbData;
722 pbData = other.pbData;
723 other.cbData = 0;
724 other.pbData = NULL;
725 }
726
730 virtual ~data_blob()
731 {
732 if (pbData != NULL)
733 LocalFree(pbData);
734 }
735
739 data_blob& operator=(_In_ const DATA_BLOB &other)
740 {
741 if (this != &other) {
742 cbData = other.cbData;
743 if (pbData)
744 LocalFree(pbData);
745 if (cbData) {
746 pbData = static_cast<BYTE*>(LocalAlloc(LMEM_FIXED, other.cbData));
747 if (!pbData) throw win_runtime_error("LocalAlloc failed");
748 memcpy(pbData, other.pbData, other.cbData);
749 } else
750 pbData = NULL;
751 }
752
753 return *this;
754 }
755
759 data_blob& operator=(_Inout_ data_blob &&other) noexcept
760 {
761 if (this != &other) {
762 cbData = other.cbData;
763 if (pbData)
764 LocalFree(pbData);
765 pbData = other.pbData;
766 other.cbData = 0;
767 other.pbData = NULL;
768 }
769
770 return *this;
771 }
772
776 DWORD size() const noexcept
777 {
778 return cbData;
779 }
780
784 const BYTE* data() const noexcept
785 {
786 return pbData;
787 }
788
792 BYTE* data() noexcept
793 {
794 return pbData;
795 }
796 };
797 #pragma warning(pop)
798
800}
801
804
805#pragma warning(push)
806#pragma warning(disable: 4505) // Don't warn on unused code
807
813static BOOL CertGetCertificateChain(_In_opt_ HCERTCHAINENGINE hChainEngine, _In_ PCCERT_CONTEXT pCertContext, _In_opt_ LPFILETIME pTime, _In_opt_ HCERTSTORE hAdditionalStore, _In_ PCERT_CHAIN_PARA pChainPara, _In_ DWORD dwFlags, _Reserved_ LPVOID pvReserved, _Inout_ winstd::cert_chain_context &ctx)
814{
815 PCCERT_CHAIN_CONTEXT pChainContext;
816 BOOL bResult = CertGetCertificateChain(hChainEngine, pCertContext, pTime, hAdditionalStore, pChainPara, dwFlags, pvReserved, &pChainContext);
817 if (bResult)
818 ctx.attach(pChainContext);
819 return bResult;
820}
821
823static BOOL CryptAcquireContextA(_Inout_ winstd::crypt_prov &prov, _In_opt_ LPCSTR szContainer, _In_opt_ LPCSTR szProvider, _In_ DWORD dwProvType, _In_ DWORD dwFlags)
824{
825 HCRYPTPROV h;
826 BOOL bResult = CryptAcquireContextA(&h, szContainer, szProvider, dwProvType, dwFlags);
827 if (bResult)
828 prov.attach(h);
829 return bResult;
830}
831
837static BOOL CryptAcquireContextW(_Inout_ winstd::crypt_prov &prov, _In_opt_ LPCWSTR szContainer, _In_opt_ LPCWSTR szProvider, _In_ DWORD dwProvType, _In_ DWORD dwFlags)
838{
839 HCRYPTPROV h;
840 BOOL bResult = CryptAcquireContextW(&h, szContainer, szProvider, dwProvType, dwFlags);
841 if (bResult)
842 prov.attach(h);
843 return bResult;
844}
845
851static BOOL CryptCreateHash(_In_ HCRYPTPROV hProv, _In_ ALG_ID Algid, _In_ HCRYPTKEY hKey, _In_ DWORD dwFlags, _Inout_ winstd::crypt_hash &hash)
852{
853 HCRYPTHASH h;
854 BOOL bResult = CryptCreateHash(hProv, Algid, hKey, dwFlags, &h);
855 if (bResult)
856 hash.attach(h);
857 return bResult;
858}
859
865static BOOL CryptGenKey(_In_ HCRYPTPROV hProv, _In_ ALG_ID Algid, _In_ DWORD dwFlags, _Inout_ winstd::crypt_key &key)
866{
867 HCRYPTKEY h;
868 BOOL bResult = CryptGenKey(hProv, Algid, dwFlags, &h);
869 if (bResult)
870 key.attach(h);
871 return bResult;
872}
873
879static bool CryptImportKey(_In_ HCRYPTPROV hProv, __in_bcount(dwDataLen) LPCBYTE pbData, _In_ DWORD dwDataLen, _In_ HCRYPTKEY hPubKey, _In_ DWORD dwFlags, _Inout_ winstd::crypt_key &key)
880{
881 HCRYPTKEY h;
882 BOOL bResult = CryptImportKey(hProv, pbData, dwDataLen, hPubKey, dwFlags, &h);
883 if (bResult)
884 key.attach(h);
885 return bResult;
886}
887
893static bool CryptImportPublicKeyInfo(_In_ HCRYPTPROV hCryptProv, _In_ DWORD dwCertEncodingType, _In_ PCERT_PUBLIC_KEY_INFO pInfo, _Inout_ winstd::crypt_key &key)
894{
895 HCRYPTKEY h;
896 BOOL bResult = CryptImportPublicKeyInfo(hCryptProv, dwCertEncodingType, pInfo, &h);
897 if (bResult)
898 key.attach(h);
899 return bResult;
900}
901
907static bool CryptDeriveKey(_In_ HCRYPTPROV hProv, _In_ ALG_ID Algid, _In_ HCRYPTHASH hBaseData, _In_ DWORD dwFlags, _Inout_ winstd::crypt_key &key)
908{
909 HCRYPTKEY h;
910 BOOL bResult = CryptDeriveKey(hProv, Algid, hBaseData, dwFlags, &h);
911 if (bResult)
912 key.attach(h);
913 return bResult;
914}
915
916#pragma warning(pop)
917
PCCERT_CHAIN_CONTEXT wrapper class.
Definition Crypt.h:394
virtual ~cert_chain_context()
Destroys the certificate chain context.
Definition Crypt.h:403
void free_internal() noexcept override
Destroys the certificate chain context.
Definition Crypt.h:415
handle_type duplicate_internal(handle_type h) const override
Duplicates the certificate chain context.
Definition Crypt.h:429
PCCERT_CONTEXT wrapper class.
Definition Crypt.h:261
bool operator<=(const handle_type &other) const noexcept
Is certificate less than or equal?
Definition Crypt.h:343
void free_internal() noexcept override
Destroys the certificate context.
Definition Crypt.h:367
bool operator==(const handle_type &other) const noexcept
Is certificate equal to?
Definition Crypt.h:284
bool operator>=(const handle_type &other) const noexcept
Is certificate greater than or equal?
Definition Crypt.h:356
bool operator>(const handle_type &other) const noexcept
Is certificate greater than?
Definition Crypt.h:328
bool operator<(const handle_type &other) const noexcept
Is certificate less than?
Definition Crypt.h:313
bool operator!=(const handle_type &other) const noexcept
Is certificate not equal to?
Definition Crypt.h:300
handle_type duplicate_internal(handle_type h) const override
Duplicates the certificate context.
Definition Crypt.h:381
virtual ~cert_context()
Destroys the certificate context.
Definition Crypt.h:270
HCERTSTORE wrapper class.
Definition Crypt.h:443
virtual ~cert_store()
Closes the certificate store.
Definition Crypt.h:452
void free_internal() noexcept override
Closes the certificate store.
Definition Crypt.h:464
HCRYPTHASH wrapper class.
Definition Crypt.h:509
void free_internal() noexcept override
Destroys the hash context.
Definition Crypt.h:530
virtual ~crypt_hash()
Destroys the hash context.
Definition Crypt.h:518
handle_type duplicate_internal(handle_type h) const override
Duplicates the hash context.
Definition Crypt.h:544
HCRYPTKEY wrapper class.
Definition Crypt.h:562
handle_type duplicate_internal(handle_type h) const override
Duplicates the key.
Definition Crypt.h:667
virtual ~crypt_key()
Destroys the key.
Definition Crypt.h:571
bool create_exp1(HCRYPTPROV hProv, DWORD dwKeySpec)
Creates Exponent-of-one key.
Definition Crypt.h:585
void free_internal() noexcept override
Destroys the key.
Definition Crypt.h:653
HCRYPTPROV wrapper class.
Definition Crypt.h:476
virtual ~crypt_prov()
Releases the cryptographic context.
Definition Crypt.h:485
void free_internal() noexcept override
Releases the cryptographic context.
Definition Crypt.h:497
DATA_BLOB wrapper class.
Definition Crypt.h:682
data_blob(const DATA_BLOB &other)
Duplicate an existing BLOB.
Definition Crypt.h:705
virtual ~data_blob()
Destroys the BLOB.
Definition Crypt.h:730
BYTE * data() noexcept
Get BLOB buffer.
Definition Crypt.h:792
const BYTE * data() const noexcept
Get BLOB buffer.
Definition Crypt.h:784
data_blob() noexcept
Initializes an empty BLOB.
Definition Crypt.h:687
data_blob(data_blob &&other) noexcept
Move an existing BLOB.
Definition Crypt.h:719
data_blob & operator=(data_blob &&other) noexcept
Move an existing BLOB.
Definition Crypt.h:759
data_blob(BYTE *data, DWORD size) noexcept
Initializes a BLOB from existing data.
Definition Crypt.h:696
DWORD size() const noexcept
Get BLOB size.
Definition Crypt.h:776
data_blob & operator=(const DATA_BLOB &other)
Copy an existing BLOB.
Definition Crypt.h:739
Base abstract template class to support object handle keeping for objects that support trivial handle...
Definition Common.h:1285
Base abstract template class to support generic object handle keeping.
Definition Common.h:1020
T handle_type
Datatype of the object handle this template class handles.
Definition Common.h:1025
handle_type m_h
Object handle.
Definition Common.h:1274
void attach(handle_type h) noexcept
Sets a new object handle for the class.
Definition Common.h:1237
Windows runtime error.
Definition Common.h:1528
static bool CryptImportPublicKeyInfo(HCRYPTPROV hCryptProv, DWORD dwCertEncodingType, PCERT_PUBLIC_KEY_INFO pInfo, winstd::crypt_key &key)
Imports the public key.
Definition Crypt.h:893
static BOOL WINAPI CertGetCertificateContextProperty(PCCERT_CONTEXT pCertContext, DWORD dwPropId, std::vector< _Ty, _Ax > &aData)
Retrieves the information contained in an extended property of a certificate context.
Definition Crypt.h:59
static BOOL CertGetCertificateChain(HCERTCHAINENGINE hChainEngine, PCCERT_CONTEXT pCertContext, LPFILETIME pTime, HCERTSTORE hAdditionalStore, PCERT_CHAIN_PARA pChainPara, DWORD dwFlags, LPVOID pvReserved, winstd::cert_chain_context &ctx)
The CertGetCertificateChain function builds a certificate chain context starting from an end certific...
Definition Crypt.h:813
static BOOL CryptGetHashParam(HCRYPTHASH hHash, DWORD dwParam, std::vector< _Ty, _Ax > &aData, DWORD dwFlags)
Retrieves data that governs the operations of a hash object. The actual hash value can be retrieved b...
Definition Crypt.h:84
static DWORD CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType, DWORD dwFlags, void *pvTypePara, std::basic_string< wchar_t, _Traits, _Ax > &sNameString)
Obtains the subject or issuer name from a certificate CERT_CONTEXT structure and stores it in a std::...
Definition Crypt.h:41
static BOOL CryptAcquireContextA(winstd::crypt_prov &prov, LPCSTR szContainer, LPCSTR szProvider, DWORD dwProvType, DWORD dwFlags)
Acquires the cryptographic context.
Definition Crypt.h:823
static DWORD CertGetNameStringA(PCCERT_CONTEXT pCertContext, DWORD dwType, DWORD dwFlags, void *pvTypePara, std::basic_string< char, _Traits, _Ax > &sNameString)
Obtains the subject or issuer name from a certificate CERT_CONTEXT structure and stores it in a std::...
Definition Crypt.h:23
static BOOL CryptGenKey(HCRYPTPROV hProv, ALG_ID Algid, DWORD dwFlags, winstd::crypt_key &key)
Generates the key.
Definition Crypt.h:865
static BOOL CryptExportKey(HCRYPTKEY hKey, HCRYPTKEY hExpKey, DWORD dwBlobType, DWORD dwFlags, std::vector< _Ty, _Ax > &aData)
Exports a cryptographic key or a key pair from a cryptographic service provider (CSP) in a secure man...
Definition Crypt.h:158
static BOOL CryptGetKeyParam(HCRYPTKEY hKey, DWORD dwParam, std::vector< _Ty, _Ax > &aData, DWORD dwFlags)
Retrieves data that governs the operations of a key.
Definition Crypt.h:121
static BOOL CryptCreateHash(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey, DWORD dwFlags, winstd::crypt_hash &hash)
Creates the hash context.
Definition Crypt.h:851
static BOOL CryptAcquireContextW(winstd::crypt_prov &prov, LPCWSTR szContainer, LPCWSTR szProvider, DWORD dwProvType, DWORD dwFlags)
Acquires the cryptographic context.
Definition Crypt.h:837
static BOOL CryptEncrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, std::vector< _Ty, _Ax > &aData)
Encrypts data.
Definition Crypt.h:177
static bool CryptDeriveKey(HCRYPTPROV hProv, ALG_ID Algid, HCRYPTHASH hBaseData, DWORD dwFlags, winstd::crypt_key &key)
Generates cryptographic session keys derived from a base data value.
Definition Crypt.h:907
static BOOL CryptDecrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, std::vector< _Ty, _Ax > &aData)
Decrypts data previously encrypted by using the CryptEncrypt function.
Definition Crypt.h:232
static bool CryptImportKey(HCRYPTPROV hProv, __in_bcount(dwDataLen) LPCBYTE pbData, DWORD dwDataLen, HCRYPTKEY hPubKey, DWORD dwFlags, winstd::crypt_key &key)
Imports the key.
Definition Crypt.h:879
#define WINSTD_STACK_BUFFER_BYTES
Size of the stack buffer in bytes used for initial system function call.
Definition Common.h:94
#define WINSTD_DPLHANDLE_IMPL(C, INVAL)
Implements default constructors and operators to prevent their auto-generation by compiler.
Definition Common.h:176
#define WINSTD_HANDLE_IMPL(C, INVAL)
Implements default constructors and operators to prevent their auto-generation by compiler.
Definition Common.h:164
static const T invalid
Invalid handle value.
Definition Common.h:1030