absl::Status Decrypt()

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