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