DSA private keys cannot be zero. If they are, trying to sign an all zeros digest loops forever. Thanks to Guido Vranken who reported this in https://github.com/openssl/openssl/issues/20268 Along the way, because OpenSSL's bad API design made constructing DSA objects such a mess, just move all the consistency checks to dsa_check_parameters (now dsa_check_key) so it is consistently checked everywhere. Ideally we'd get a better handle on DSA state, like we hope to do for RSA state (though not there yet), so checks only happen once. But we consider DSA deprecated so it's not worth putting much effort into it. Update-Note: Some invalid DSA keys will be rejected by the parser and at use. Nothing should be using DSA anymore. Change-Id: I25d3faf145a85389c47abdd9db8e9b0056b37d8a Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/57227 Commit-Queue: David Benjamin <davidben@google.com> Reviewed-by: Adam Langley <agl@google.com>
35 lines
1.2 KiB
C
35 lines
1.2 KiB
C
/* Copyright (c) 2020, Google Inc.
|
|
*
|
|
* Permission to use, copy, modify, and/or distribute this software for any
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
* copyright notice and this permission notice appear in all copies.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
|
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
|
|
|
|
#ifndef OPENSSL_HEADER_DSA_INTERNAL_H
|
|
#define OPENSSL_HEADER_DSA_INTERNAL_H
|
|
|
|
#include <openssl/dsa.h>
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
// dsa_check_key performs cheap self-checks on |dsa|, and ensures it is within
|
|
// DoS bounds. It returns one on success and zero on error.
|
|
int dsa_check_key(const DSA *dsa);
|
|
|
|
|
|
#if defined(__cplusplus)
|
|
} // extern C
|
|
#endif
|
|
|
|
#endif // OPENSSL_HEADER_DSA_INTERNAL_H
|