absl::Status SignFinal()

in kmsp11/main/bridge.cc [755:791]


absl::Status SignFinal(CK_SESSION_HANDLE hSession, CK_BYTE_PTR pSignature,
                       CK_ULONG_PTR pulSignatureLen) {
  ASSIGN_OR_RETURN(std::shared_ptr<Session> session, GetSession(hSession));
  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->SignFinal(absl::MakeSpan(pSignature, *sig_length));
  session->ReleaseOperation();
  if (result.ok()) {
    *pulSignatureLen = *sig_length;
  }
  return result;
}