Stroika Library 3.0d18
 
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
24
25/*
26 ********************************************************************************
27 ************************** OpenSSL::DigestAlgorithm ****************************
28 ********************************************************************************
29 */
30DigestAlgorithm::DigestAlgorithm (const ::EVP_MD* digester)
31 : name{[qStroika_Foundation_Common_Property_ExtraCaptureStuff] ([[maybe_unused]] const auto* property) -> String {
32 const DigestAlgorithm* thisObj = qStroika_Foundation_Common_Property_OuterObjPtr (property, &DigestAlgorithm::name);
33 AssertNotNull (EVP_MD_name (thisObj->fDigester_));
34 return String{EVP_MD_name (thisObj->fDigester_)};
35 }}
36 , fDigester_{digester}
37{
38 RequireNotNull (digester);
39}
40
41DigestAlgorithm DigestAlgorithm::GetByName (const String& digestName)
42{
43 static const Execution::RuntimeErrorException kErr_{"No such digest"sv};
44 auto p = ::EVP_get_digestbyname (digestName.AsNarrowSDKString ().c_str ());
45 Execution::ThrowIfNull (p, kErr_);
46 return p;
47}
48
49optional<DigestAlgorithm> DigestAlgorithm::GetByNameQuietly (const String& digestName)
50{
51 auto tmp = ::EVP_get_digestbyname (digestName.AsNarrowSDKString ().c_str ());
52 return tmp == nullptr ? optional<DigestAlgorithm>{} : tmp;
53}
54
55/*
56 ********************************************************************************
57 *********** Cryptography::Providers::OpenSSL::DigestAlgorithms *****************
58 ********************************************************************************
59 */
60const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kMD5{[] () { return ::EVP_md5 (); }};
61const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA1{[] () { return ::EVP_sha1 (); }};
62const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA1_224{[] () { return ::EVP_sha224 (); }};
63const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA1_256{[] () { return ::EVP_sha256 (); }};
64const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA1_384{[] () { return ::EVP_sha384 (); }};
65const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA1_512{[] () { return ::EVP_sha512 (); }};
66const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA3_224{[] () { return ::EVP_sha3_224 (); }};
67const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA3_256{[] () { return ::EVP_sha3_256 (); }};
68const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA3_384{[] () { return ::EVP_sha3_384 (); }};
69const Execution::LazyInitialized<DigestAlgorithm> DigestAlgorithms::kSHA3_512{[] () { return ::EVP_sha3_512 (); }};
70#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:834
value-object, where the value construction is delayed until first needed (can be handy to avoid c++ i...