| 256 | { |
| 257 | public: |
| 258 | std::vector<uint8_t> SignData(const RsaKey& key, const void* data, size_t dataLen) override |
| 259 | { |
| 260 | auto evpKey = static_cast<const OpenSSLRsaKey&>(key).GetEvpKey(); |
| 261 | EVP_MD_CTX* mdctx{}; |
| 262 | try |
| 263 | { |
| 264 | mdctx = EVP_MD_CTX_create(); |
| 265 | if (mdctx == nullptr) |
| 266 | { |
| 267 | throw std::runtime_error("EVP_MD_CTX_create failed"); |
| 268 | } |
| 269 | |
| 270 | auto status = EVP_DigestSignInit(mdctx, nullptr, EVP_sha256(), nullptr, evpKey); |
| 271 | OpenSSLThrowOnBadStatus("EVP_DigestSignInit failed", status); |
| 272 | |
| 273 | status = EVP_DigestSignUpdate(mdctx, data, dataLen); |
| 274 | OpenSSLThrowOnBadStatus("EVP_DigestSignUpdate failed", status); |
| 275 | |
| 276 | // Get required length of signature |
| 277 | size_t sigLen{}; |
| 278 | status = EVP_DigestSignFinal(mdctx, nullptr, &sigLen); |
| 279 | OpenSSLThrowOnBadStatus("EVP_DigestSignFinal failed", status); |
| 280 | |
| 281 | // Get signature |
| 282 | std::vector<uint8_t> signature(sigLen); |
| 283 | status = EVP_DigestSignFinal(mdctx, signature.data(), &sigLen); |
| 284 | OpenSSLThrowOnBadStatus("EVP_DigestSignFinal failed", status); |
| 285 | |
| 286 | EVP_MD_CTX_destroy(mdctx); |
| 287 | return signature; |
| 288 | } |
| 289 | catch (const std::exception&) |
| 290 | { |
| 291 | EVP_MD_CTX_destroy(mdctx); |
| 292 | throw; |
| 293 | } |
| 294 | } |
| 295 | |
| 296 | bool VerifyData(const RsaKey& key, const void* data, size_t dataLen, const void* sig, size_t sigLen) override |
| 297 | { |
nothing calls this directly
no test coverage detected