-/* $OpenBSD: bn_mod.c,v 1.20 2023/03/27 10:21:23 tb Exp $ */
+/* $OpenBSD: bn_mod.c,v 1.21 2023/06/13 09:28:13 tb Exp $ */
/* Includes code written by Lenka Fibikova <fibikova@exp-math.uni-essen.de>
* for the OpenSSL project. */
/* ====================================================================
int
BN_nnmod(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx)
{
+ if (r == m) {
+ BNerror(BN_R_INVALID_ARGUMENT);
+ return 0;
+ }
if (!BN_mod_ct(r, a, m, ctx))
return 0;
if (BN_is_negative(r))
BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m,
BN_CTX *ctx)
{
+ if (r == m) {
+ BNerror(BN_R_INVALID_ARGUMENT);
+ return 0;
+ }
if (!BN_add(r, a, b))
return 0;
return BN_nnmod(r, r, m, ctx);
int
BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m)
{
+ if (r == m) {
+ BNerror(BN_R_INVALID_ARGUMENT);
+ return 0;
+ }
if (!BN_uadd(r, a, b))
return 0;
if (BN_ucmp(r, m) >= 0)
BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m,
BN_CTX *ctx)
{
+ if (r == m) {
+ BNerror(BN_R_INVALID_ARGUMENT);
+ return 0;
+ }
if (!BN_sub(r, a, b))
return 0;
return BN_nnmod(r, r, m, ctx);
int
BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m)
{
+ if (r == m) {
+ BNerror(BN_R_INVALID_ARGUMENT);
+ return 0;
+ }
if (BN_ucmp(a, b) >= 0)
return BN_usub(r, a, b);
if (!BN_usub(r, b, a))
BN_CTX_start(ctx);
+ if (r == m) {
+ BNerror(BN_R_INVALID_ARGUMENT);
+ goto err;
+ }
+
rr = r;
if (rr == a || rr == b)
rr = BN_CTX_get(ctx);
int
BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx)
{
+ if (r == m) {
+ BNerror(BN_R_INVALID_ARGUMENT);
+ return 0;
+ }
if (!BN_lshift1(r, a))
return 0;
return BN_nnmod(r, r, m, ctx);
int
BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m)
{
+ if (r == m) {
+ BNerror(BN_R_INVALID_ARGUMENT);
+ return 0;
+ }
if (!BN_lshift1(r, a))
return 0;
if (BN_ucmp(r, m) >= 0)
BN_CTX_start(ctx);
+ if (r == m) {
+ BNerror(BN_R_INVALID_ARGUMENT);
+ goto err;
+ }
+
if (!BN_nnmod(r, a, m, ctx))
goto err;
{
int max_shift;
+ if (r == m) {
+ BNerror(BN_R_INVALID_ARGUMENT);
+ return 0;
+ }
+
if (!bn_copy(r, a))
return 0;