| 266 | } |
| 267 | |
| 268 | StringRef PrivateKey::sign(Arena& arena, StringRef data, const EVP_MD& digest) const { |
| 269 | auto key = nativeHandle(); |
| 270 | ASSERT(key); |
| 271 | auto mdctx = AutoCPointer(::EVP_MD_CTX_create(), &::EVP_MD_CTX_free); |
| 272 | if (!mdctx) |
| 273 | traceAndThrowDsa("PKeySignInitError"); |
| 274 | if (1 != ::EVP_DigestSignInit(mdctx, nullptr, &digest, nullptr, nativeHandle())) |
| 275 | traceAndThrowDsa("PKeySignInitError"); |
| 276 | if (1 != ::EVP_DigestSignUpdate(mdctx, data.begin(), data.size())) |
| 277 | traceAndThrowDsa("PKeySignUpdateError"); |
| 278 | auto sigLen = size_t{}; |
| 279 | if (1 != ::EVP_DigestSignFinal(mdctx, nullptr, &sigLen)) // assess the length first |
| 280 | traceAndThrowDsa("PKeySignFinalGetLengthError"); |
| 281 | auto sigBuf = new (arena) uint8_t[sigLen]; |
| 282 | if (1 != ::EVP_DigestSignFinal(mdctx, sigBuf, &sigLen)) |
| 283 | traceAndThrowDsa("SignTokenFinalError"); |
| 284 | return StringRef(sigBuf, sigLen); |
| 285 | } |
| 286 | |
| 287 | bool PrivateKey::verify(StringRef data, StringRef signature, const EVP_MD& digest) const { |
| 288 | return doVerifyStringSignature(data, signature, digest, nativeHandle()); |
no test coverage detected