absl::Status Sign()

in kmsp11/main/bridge.cc [691:732]


absl::Status Sign(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pData,
                  CK_ULONG ulDataLen, CK_BYTE_PTR pSignature,
                  CK_ULONG_PTR pulSignatureLen) {
  ASSIGN_OR_RETURN(std::shared_ptr<Session> session, GetSession(hSession));
  if (!pData) {
    session->ReleaseOperation();
    return NullArgumentError("pData", SOURCE_LOCATION);
  }
  if (!pulSignatureLen) {
    session->ReleaseOperation();
    return NullArgumentError("pulSignatureLen", SOURCE_LOCATION);
  }

  absl::StatusOr<size_t> sig_length = session->SignatureLength();
  if (!sig_length.ok()) {
    session->ReleaseOperation();
    return sig_length.status();
  }

  if (!pSignature) {
    *pulSignatureLen = *sig_length;
    return absl::OkStatus();
  }

  if (*pulSignatureLen < *sig_length) {
    absl::Status result = OutOfRangeError(
        absl::StrFormat(
            "signature of length %d cannot fit in buffer of length %d",
            *sig_length, *pulSignatureLen),
        SOURCE_LOCATION);
    *pulSignatureLen = *sig_length;
    return result;
  }

  absl::Status result = session->Sign(absl::MakeConstSpan(pData, ulDataLen),
                                      absl::MakeSpan(pSignature, *sig_length));
  session->ReleaseOperation();
  if (result.ok()) {
    *pulSignatureLen = *sig_length;
  }
  return result;
}