absl::Status EncryptFinal()

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();
}