Skip to content

Commit

Permalink
Allow sign extension in OSSL_PARAM_allocate_from_text()
Browse files Browse the repository at this point in the history
This is done for the data type OSSL_PARAM_INTEGER by checking if the
most significant bit is set, and adding 8 to the number of buffer bits
if that is the case.  Everything else is already in place.

Fixes openssl#17103

Reviewed-by: Tomas Mraz <[email protected]>
Reviewed-by: Paul Dale <[email protected]>
(Merged from openssl#17104)
  • Loading branch information
levitte committed Nov 24, 2021
1 parent 8585b5b commit 946bc0e
Showing 1 changed file with 17 additions and 5 deletions.
22 changes: 17 additions & 5 deletions crypto/params_from_text.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ static int prepare_from_text(const OSSL_PARAM *paramdefs, const char *key,
}

/*
* 2s complement negate, part 1
* 2's complement negate, part 1
*
* BN_bn2nativepad puts the absolute value of the number in the
* buffer, i.e. if it's negative, we need to deal with it. We do
Expand All @@ -76,16 +76,28 @@ static int prepare_from_text(const OSSL_PARAM *paramdefs, const char *key,
}

buf_bits = (size_t)BN_num_bits(*tmpbn);

/*
* Compensate for cases where the most significant bit in
* the resulting OSSL_PARAM buffer will be set after the
* BN_bn2nativepad() call, as the implied sign may not be
* correct after the second part of the 2's complement
* negation has been performed.
* We fix these cases by extending the buffer by one byte
* (8 bits), which will give some padding. The second part
* of the 2's complement negation will do the rest.
*/
if (p->data_type == OSSL_PARAM_INTEGER && buf_bits % 8 == 0)
buf_bits += 8;

*buf_n = (buf_bits + 7) / 8;

/*
* A zero data size means "arbitrary size", so only do the
* range checking if a size is specified.
*/
if (p->data_size > 0) {
if (buf_bits > p->data_size * 8
|| (p->data_type == OSSL_PARAM_INTEGER
&& buf_bits == p->data_size * 8)) {
if (buf_bits > p->data_size * 8) {
ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_TOO_SMALL_BUFFER);
/* Since this is a different error, we don't break */
return 0;
Expand Down Expand Up @@ -135,7 +147,7 @@ static int construct_from_text(OSSL_PARAM *to, const OSSL_PARAM *paramdef,
BN_bn2nativepad(tmpbn, buf, buf_n);

/*
* 2s complement negate, part two.
* 2's complement negation, part two.
*
* Because we did the first part on the BIGNUM itself, we can just
* invert all the bytes here and be done with it.
Expand Down

0 comments on commit 946bc0e

Please sign in to comment.