{
int r = 0;
- p->return_size = val_size; /* Expected size */
- if (p->data == NULL)
+ if (p->data == NULL) {
+ p->return_size = val_size; /* Expected size */
return 1;
+ }
if (p->data_type == OSSL_PARAM_INTEGER)
r = signed_from_signed(p->data, p->data_size, val, val_size);
else if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER)
{
int r = 0;
- p->return_size = val_size; /* Expected size */
- if (p->data == NULL)
+ if (p->data == NULL) {
+ p->return_size = val_size; /* Expected size */
return 1;
+ }
if (p->data_type == OSSL_PARAM_INTEGER)
r = signed_from_unsigned(p->data, p->data_size, val, val_size);
else if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER)
#ifndef OPENSSL_SYS_UEFI
unsigned int shift;
- p->return_size = sizeof(double);
- if (p->data == NULL)
+ if (p->data == NULL) {
+ p->return_size = sizeof(double);
return 1;
+ }
switch (p->data_size) {
case sizeof(double):
shift = real_shift();
return 0;
}
*(double *)p->data = (double)val;
+ p->return_size = sizeof(double);
return 1;
}
err_unsupported_real;
p->return_size = 0;
if (p->data_type == OSSL_PARAM_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
- p->return_size = sizeof(int64_t); /* Expected size */
- if (p->data == NULL)
+ if (p->data == NULL) {
+ p->return_size = sizeof(int64_t); /* Expected size */
return 1;
+ }
switch (p->data_size) {
case sizeof(int32_t):
if (val >= INT32_MIN && val <= INT32_MAX) {
err_out_of_range;
return 0;
case sizeof(int64_t):
+ p->return_size = sizeof(int64_t);
*(int64_t *)p->data = val;
return 1;
}
return general_set_int(p, &val, sizeof(val));
} else if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER && val >= 0) {
#ifndef OPENSSL_SMALL_FOOTPRINT
- p->return_size = sizeof(uint64_t); /* Expected size */
- if (p->data == NULL)
+ if (p->data == NULL) {
+ p->return_size = sizeof(uint64_t); /* Expected size */
return 1;
+ }
switch (p->data_size) {
case sizeof(uint32_t):
if (val <= UINT32_MAX) {
err_out_of_range;
return 0;
case sizeof(uint64_t):
+ p->return_size = sizeof(uint64_t);
*(uint64_t *)p->data = (uint64_t)val;
return 1;
}
#ifndef OPENSSL_SYS_UEFI
uint64_t u64;
- p->return_size = sizeof(double);
- if (p->data == NULL)
+ if (p->data == NULL) {
+ p->return_size = sizeof(double);
return 1;
+ }
switch (p->data_size) {
case sizeof(double):
u64 = val < 0 ? -val : val;
if ((u64 >> real_shift()) == 0) {
+ p->return_size = sizeof(double);
*(double *)p->data = (double)val;
return 1;
}
if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
- p->return_size = sizeof(uint64_t); /* Expected size */
- if (p->data == NULL)
+ if (p->data == NULL) {
+ p->return_size = sizeof(uint64_t); /* Expected size */
return 1;
+ }
switch (p->data_size) {
case sizeof(uint32_t):
if (val <= UINT32_MAX) {
err_out_of_range;
return 0;
case sizeof(uint64_t):
+ p->return_size = sizeof(uint64_t);
*(uint64_t *)p->data = val;
return 1;
}
return general_set_uint(p, &val, sizeof(val));
} else if (p->data_type == OSSL_PARAM_INTEGER) {
#ifndef OPENSSL_SMALL_FOOTPRINT
- p->return_size = sizeof(int64_t); /* Expected size */
- if (p->data == NULL)
+ if (p->data == NULL) {
+ p->return_size = sizeof(int64_t); /* Expected size */
return 1;
+ }
switch (p->data_size) {
case sizeof(int32_t):
if (val <= INT32_MAX) {
return 0;
case sizeof(int64_t):
if (val <= INT64_MAX) {
+ p->return_size = sizeof(int64_t);
*(int64_t *)p->data = (int64_t)val;
return 1;
}
return general_set_uint(p, &val, sizeof(val));
} else if (p->data_type == OSSL_PARAM_REAL) {
#ifndef OPENSSL_SYS_UEFI
- p->return_size = sizeof(double);
switch (p->data_size) {
case sizeof(double):
if ((val >> real_shift()) == 0) {
+ p->return_size = sizeof(double);
*(double *)p->data = (double)val;
return 1;
}
if (bytes == 0)
bytes++;
- p->return_size = bytes;
- if (p->data == NULL)
+ if (p->data == NULL) {
+ p->return_size = bytes;
return 1;
+ }
if (p->data_size >= bytes) {
- p->return_size = p->data_size;
switch (p->data_type) {
case OSSL_PARAM_UNSIGNED_INTEGER:
- if (BN_bn2nativepad(val, p->data, p->data_size) >= 0)
- return 1;
- ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_INTEGER_OVERFLOW);
+ if (BN_bn2nativepad(val, p->data, p->data_size) < 0) {
+ ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_INTEGER_OVERFLOW);
+ return 0;
+ }
break;
case OSSL_PARAM_INTEGER:
- if (BN_signed_bn2native(val, p->data, p->data_size) >= 0)
- return 1;
- ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_INTEGER_OVERFLOW);
+ if (BN_signed_bn2native(val, p->data, p->data_size) < 0) {
+ ERR_raise(ERR_LIB_CRYPTO, CRYPTO_R_INTEGER_OVERFLOW);
+ return 0;
+ }
break;
default:
err_bad_type;
- break;
+ return 0;
}
- return 0;
+ p->return_size = p->data_size;
+ return 1;
}
+ p->return_size = bytes;
err_too_small;
return 0;
}
int OSSL_PARAM_set_double(OSSL_PARAM *p, double val)
{
+# define D_POW_31 ((double) (((uint32_t) 1) << 31))
+ const double d_pow_31 = D_POW_31;
+ const double d_pow_32 = 2.0 * D_POW_31;
+ const double d_pow_63 = 2.0 * D_POW_31 * D_POW_31;
+ const double d_pow_64 = 4.0 * D_POW_31 * D_POW_31;
+
if (p == NULL) {
err_null_argument;
return 0;
p->return_size = 0;
if (p->data_type == OSSL_PARAM_REAL) {
- p->return_size = sizeof(double);
- if (p->data == NULL)
+ if (p->data == NULL) {
+ p->return_size = sizeof(double);
return 1;
+ }
switch (p->data_size) {
case sizeof(double):
+ p->return_size = sizeof(double);
*(double *)p->data = val;
return 1;
}
err_unsupported_real;
return 0;
} else if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER) {
- p->return_size = sizeof(double);
- if (p->data == NULL)
+ if (p->data == NULL) {
+ /*
+ * Unclear how this is usable, the parameter's type is integral.
+ * Its size should be the size of some integral type.
+ */
+ p->return_size = sizeof(double);
return 1;
+ }
if (val != (uint64_t)val) {
err_inexact;
return 0;
}
switch (p->data_size) {
case sizeof(uint32_t):
- if (val >= 0 && val <= UINT32_MAX) {
+ if (val >= 0 && val < d_pow_32) {
p->return_size = sizeof(uint32_t);
*(uint32_t *)p->data = (uint32_t)val;
return 1;
err_out_of_range;
return 0;
case sizeof(uint64_t):
- if (val >= 0
- /*
- * By subtracting 65535 (2^16-1) we cancel the low order
- * 15 bits of UINT64_MAX to avoid using imprecise floating
- * point values.
- */
- && val < (double)(UINT64_MAX - 65535) + 65536.0) {
+ if (val >= 0 && val < d_pow_64) {
p->return_size = sizeof(uint64_t);
*(uint64_t *)p->data = (uint64_t)val;
return 1;
return 0;
}
} else if (p->data_type == OSSL_PARAM_INTEGER) {
- p->return_size = sizeof(double);
- if (p->data == NULL)
+ if (p->data == NULL) {
+ /*
+ * Unclear how this is usable, the parameter's type is integral.
+ * Its size should be the size of some integral type.
+ */
+ p->return_size = sizeof(double);
return 1;
+ }
if (val != (int64_t)val) {
err_inexact;
return 0;
}
switch (p->data_size) {
case sizeof(int32_t):
- if (val >= INT32_MIN && val <= INT32_MAX) {
+ if (val >= -d_pow_31 && val < d_pow_31) {
p->return_size = sizeof(int32_t);
*(int32_t *)p->data = (int32_t)val;
return 1;
err_out_of_range;
return 0;
case sizeof(int64_t):
- if (val >= INT64_MIN
- /*
- * By subtracting 65535 (2^16-1) we cancel the low order
- * 15 bits of INT64_MAX to avoid using imprecise floating
- * point values.
- */
- && val < (double)(INT64_MAX - 65535) + 65536.0) {
+ if (val >= -d_pow_63 && val < d_pow_63) {
p->return_size = sizeof(int64_t);
*(int64_t *)p->data = (int64_t)val;
return 1;
static int set_string_internal(OSSL_PARAM *p, const void *val, size_t len,
unsigned int type)
{
- p->return_size = len;
- if (p->data == NULL)
- return 1;
if (p->data_type != type) {
err_bad_type;
return 0;
}
+ p->return_size = len;
+ if (p->data == NULL)
+ return 1;
if (p->data_size < len) {
err_too_small;
return 0;
int OSSL_PARAM_set_utf8_string(OSSL_PARAM *p, const char *val)
{
- if (p == NULL) {
+ if (p == NULL || val == NULL) {
err_null_argument;
return 0;
}
-
p->return_size = 0;
- if (val == NULL) {
- err_null_argument;
- return 0;
- }
return set_string_internal(p, val, strlen(val), OSSL_PARAM_UTF8_STRING);
}
int OSSL_PARAM_set_octet_string(OSSL_PARAM *p, const void *val,
size_t len)
{
- if (p == NULL) {
+ if (p == NULL || val == NULL) {
err_null_argument;
return 0;
}
-
p->return_size = 0;
- if (val == NULL) {
- err_null_argument;
- return 0;
- }
return set_string_internal(p, val, len, OSSL_PARAM_OCTET_STRING);
}
static int set_ptr_internal(OSSL_PARAM *p, const void *val,
unsigned int type, size_t len)
{
- p->return_size = len;
if (p->data_type != type) {
err_bad_type;
return 0;
}
+ p->return_size = len;
if (p->data != NULL)
*(const void **)p->data = val;
return 1;