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