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