(nbits - 1)/8 should have been rounded up. Fix and move it to
an inlined function for reuse in pkcs11_openssl.c (used in the
next commit).
Note: The error is not triggered in normal use as OpenSSL
always seems to use saltlen="digest" for signing.
Signed-off-by: Selva Nair <selva.nair@gmail.com>
Acked-by: Arne Schwabe <arne@rfc2549.org>
Message-Id: <
20220125025128.2117-2-selva.nair@gmail.com>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg23648.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
int saltlen = tbslen; /* digest size by default */
if (!strcmp(sigalg.saltlen, "max"))
{
- saltlen = (EVP_PKEY_bits(cd->pubkey) - 1)/8 - tbslen - 2;
+ saltlen = xkey_max_saltlen(EVP_PKEY_bits(cd->pubkey), tbslen);
if (saltlen < 0)
{
msg(M_NONFATAL, "Error in cryptoapicert: invalid salt length (%d)", saltlen);
extern OSSL_LIB_CTX *tls_libctx; /* Global */
+/**
+ * Maximum salt length for PSS signature.
+ *
+ * @param modBits Number of bits in RSA modulus
+ * @param hLen Length of digest to be signed
+ * @returns the maximum allowed salt length. Caller must check it's not < 0.
+ */
+static inline int
+xkey_max_saltlen(int modBits, int hLen)
+{
+ int emLen = (modBits - 1 + 7)/8; /* ceil((modBits - 1)/8) */
+
+ return emLen - hLen - 2;
+}
#endif /* HAVE_XKEY_PROVIDER */
#endif /* XKEY_COMMON_H_ */