in kmsp11/main/bridge.cc [440:480]
absl::Status Decrypt(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pEncryptedData,
CK_ULONG ulEncryptedDataLen, CK_BYTE_PTR pData,
CK_ULONG_PTR pulDataLen) {
ASSIGN_OR_RETURN(std::shared_ptr<Session> session, GetSession(hSession));
if (!pEncryptedData) {
session->ReleaseOperation();
return NullArgumentError("pEncryptedData", SOURCE_LOCATION);
}
if (!pulDataLen) {
session->ReleaseOperation();
return NullArgumentError("pulDataLen", SOURCE_LOCATION);
}
absl::StatusOr<absl::Span<const uint8_t>> plaintext =
session->Decrypt(absl::MakeConstSpan(pEncryptedData, ulEncryptedDataLen));
if (!plaintext.ok()) {
session->ReleaseOperation();
return plaintext.status();
}
if (!pData) {
*pulDataLen = plaintext->size();
return absl::OkStatus();
}
if (*pulDataLen < plaintext->size()) {
absl::Status result = OutOfRangeError(
absl::StrFormat(
"plaintext of length %d cannot fit in buffer of length %d",
plaintext->size(), *pulDataLen),
SOURCE_LOCATION);
*pulDataLen = plaintext->size();
return result;
}
std::copy(plaintext->begin(), plaintext->end(), pData);
*pulDataLen = plaintext->size();
session->ReleaseOperation();
return absl::OkStatus();
}