Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
DigestAlgorithm.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include "Stroika/Foundation/StroikaPreComp.h"
5
6#if qStroika_HasComponent_OpenSSL
7#include <openssl/evp.h>
8#endif
9
10#include "Stroika/Foundation/Containers/Common.h"
12#include "Stroika/Foundation/Execution/Common.h"
14
15#include "DigestAlgorithm.h"
16
17using namespace Stroika::Foundation;
19using namespace Stroika::Foundation::Cryptography;
20using namespace Stroika::Foundation::Cryptography::Providers::OpenSSL;
21using namespace Stroika::Foundation::Memory;
22
23#if qStroika_HasComponent_OpenSSL && defined(_MSC_VER)
24// Use #pragma comment lib instead of explicit entry in the lib entry of the project file
25#if OPENSSL_VERSION_NUMBER < 0x1010000fL
26#pragma comment(lib, "libeay32.lib")
27#pragma comment(lib, "ssleay32.lib")
28#else
29#pragma comment(lib, "libcrypto.lib")
30#pragma comment(lib, "libssl.lib")
31#pragma comment(lib, "ws2_32.lib")
32#pragma comment(lib, "crypt32.lib")
33#endif
34#endif
35
36#if qStroika_HasComponent_OpenSSL
37
38/*
39 ********************************************************************************
40 ************************** OpenSSL::DigestAlgorithm ****************************
41 ********************************************************************************
42 */
43DigestAlgorithm::DigestAlgorithm (const ::EVP_MD* digester)
44 : name{[qStroika_Foundation_Common_Property_ExtraCaptureStuff] ([[maybe_unused]] const auto* property) -> String {
45 const DigestAlgorithm* thisObj = qStroika_Foundation_Common_Property_OuterObjPtr (property, &DigestAlgorithm::name);
46 AssertNotNull (EVP_MD_name (thisObj->fDigester_));
47 return String{EVP_MD_name (thisObj->fDigester_)};
48 }}
49 , fDigester_{digester}
50{
51 RequireNotNull (digester);
52}
53
54DigestAlgorithm DigestAlgorithm::GetByName (const String& digestName)
55{
56 static const Execution::RuntimeErrorException kErr_{"No such digest"sv};
57 auto p = ::EVP_get_digestbyname (digestName.AsNarrowSDKString ().c_str ());
58 Execution::ThrowIfNull (p, kErr_);
59 return p;
60}
61
62optional<DigestAlgorithm> DigestAlgorithm::GetByNameQuietly (const String& digestName)
63{
64 auto tmp = ::EVP_get_digestbyname (digestName.AsNarrowSDKString ().c_str ());
65 return tmp == nullptr ? optional<DigestAlgorithm>{} : tmp;
66}
67
68/*
69 ********************************************************************************
70 *********** Cryptography::Providers::OpenSSL::DigestAlgorithms *****************
71 ********************************************************************************
72 */
73const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kMD5{[] () { return ::EVP_md5 (); }};
74const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA1{[] () { return ::EVP_sha1 (); }};
75const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA1_224{[] () { return ::EVP_sha224 (); }};
76const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA1_256{[] () { return ::EVP_sha256 (); }};
77const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA1_384{[] () { return ::EVP_sha384 (); }};
78const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA1_512{[] () { return ::EVP_sha512 (); }};
79const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA3_224{[] () { return ::EVP_sha3_224 (); }};
80const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA3_256{[] () { return ::EVP_sha3_256 (); }};
81const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA3_384{[] () { return ::EVP_sha3_384 (); }};
82const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA3_512{[] () { return ::EVP_sha3_512 (); }};
83#endif
#define AssertNotNull(p)
Definition Assertions.h:333
#define RequireNotNull(p)
Definition Assertions.h:347
String is like std::u32string, except it is much easier to use, often much more space efficient,...
Definition String.h:201
nonvirtual string AsNarrowSDKString() const
Definition String.inl:830
value-object, where the value construction is delayed until first needed (can be handy to avoid c++ i...
void ThrowIfNull(const Private_::ConstVoidStar &p, const HRESULT &hr)
Template specialization for ThrowIfNull (), for thing being thrown HRESULT - really throw HRESULTErro...