absl::Status Encrypt()

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