#include <string.h>
#include <openssl/params.h>
#include "internal/thread_once.h"
+#include "internal/numbers.h"
OSSL_PARAM *OSSL_PARAM_locate(OSSL_PARAM *p, const char *key)
{
p->return_size = 0;
if (p->data_type == OSSL_PARAM_INTEGER) {
p->return_size = sizeof(int32_t); /* Minimum expected size */
+ if (p->data == NULL)
+ return 1;
switch (p->data_size) {
case sizeof(int32_t):
*(int32_t *)p->data = val;
}
} else if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER && val >= 0) {
p->return_size = sizeof(uint32_t); /* Minimum expected size */
+ if (p->data == NULL)
+ return 1;
switch (p->data_size) {
case sizeof(uint32_t):
*(uint32_t *)p->data = (uint32_t)val;
}
} else if (p->data_type == OSSL_PARAM_REAL) {
p->return_size = sizeof(double);
+ if (p->data == NULL)
+ return 1;
switch (p->data_size) {
case sizeof(double):
*(double *)p->data = (double)val;
if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER) {
p->return_size = sizeof(uint32_t); /* Minimum expected size */
+ if (p->data == NULL)
+ return 1;
switch (p->data_size) {
case sizeof(uint32_t):
*(uint32_t *)p->data = val;
}
} else if (p->data_type == OSSL_PARAM_INTEGER) {
p->return_size = sizeof(int32_t); /* Minimum expected size */
+ if (p->data == NULL)
+ return 1;
switch (p->data_size) {
case sizeof(int32_t):
if (val <= INT32_MAX) {
}
} else if (p->data_type == OSSL_PARAM_REAL) {
p->return_size = sizeof(double);
+ if (p->data == NULL)
+ return 1;
switch (p->data_size) {
case sizeof(double):
*(double *)p->data = (double)val;
p->return_size = 0;
if (p->data_type == OSSL_PARAM_INTEGER) {
p->return_size = sizeof(int64_t); /* Expected size */
+ if (p->data == NULL)
+ return 1;
switch (p->data_size) {
case sizeof(int32_t):
if (val >= INT32_MIN && val <= INT32_MAX) {
}
} else if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER && val >= 0) {
p->return_size = sizeof(uint64_t); /* Expected size */
+ if (p->data == NULL)
+ return 1;
switch (p->data_size) {
case sizeof(uint32_t):
if (val <= UINT32_MAX) {
}
} else if (p->data_type == OSSL_PARAM_REAL) {
p->return_size = sizeof(double);
+ if (p->data == NULL)
+ return 1;
switch (p->data_size) {
case sizeof(double):
u64 = val < 0 ? -val : val;
if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER) {
p->return_size = sizeof(uint64_t); /* Expected size */
+ if (p->data == NULL)
+ return 1;
switch (p->data_size) {
case sizeof(uint32_t):
if (val <= UINT32_MAX) {
}
} else if (p->data_type == OSSL_PARAM_INTEGER) {
p->return_size = sizeof(int64_t); /* Expected size */
+ if (p->data == NULL)
+ return 1;
switch (p->data_size) {
case sizeof(int32_t):
if (val <= INT32_MAX) {
bytes = (size_t)BN_num_bytes(val);
p->return_size = bytes;
- return p->data_size >= bytes
- && BN_bn2nativepad(val, p->data, bytes) >= 0;
+ if (p->data == NULL)
+ return 1;
+ if (p->data_size >= bytes) {
+ p->return_size = p->data_size;
+ return BN_bn2nativepad(val, p->data, p->data_size) >= 0;
+ }
+ return 0;
}
OSSL_PARAM OSSL_PARAM_construct_BN(const char *key, unsigned char *buf,
if (p->data_type == OSSL_PARAM_REAL) {
p->return_size = sizeof(double);
+ if (p->data == NULL)
+ return 1;
switch (p->data_size) {
case sizeof(double):
*(double *)p->data = val;
return 1;
}
} else if (p->data_type == OSSL_PARAM_UNSIGNED_INTEGER
- && val == (uintmax_t)val) {
+ && val == (ossl_uintmax_t)val) {
p->return_size = sizeof(double);
+ if (p->data == NULL)
+ return 1;
switch (p->data_size) {
case sizeof(uint32_t):
if (val >= 0 && val <= UINT32_MAX) {
return 1;
}
break; }
- } else if (p->data_type == OSSL_PARAM_INTEGER && val == (intmax_t)val) {
+ } else if (p->data_type == OSSL_PARAM_INTEGER && val == (ossl_intmax_t)val) {
p->return_size = sizeof(double);
+ if (p->data == NULL)
+ return 1;
switch (p->data_size) {
case sizeof(int32_t):
if (val >= INT32_MIN && val <= INT32_MAX) {
if (used_len != NULL)
*used_len = sz;
+ if (sz == 0)
+ return 1;
+ if (p->data == NULL)
+ return 0;
+
if (*val == NULL) {
char *const q = OPENSSL_malloc(sz);
unsigned int type)
{
p->return_size = len;
+ if (p->data == NULL)
+ return 1;
if (p->data_type != type || p->data_size < len)
return 0;
OSSL_PARAM OSSL_PARAM_construct_utf8_string(const char *key, char *buf,
size_t bsize)
{
+ if (buf != NULL && bsize == 0)
+ bsize = strlen(buf) + 1;
return ossl_param_construct(key, OSSL_PARAM_UTF8_STRING, buf, bsize);
}
p->return_size = len;
if (p->data_type != type)
return 0;
- *(const void **)p->data = val;
+ if (p->data != NULL)
+ *(const void **)p->data = val;
return 1;
}
if (p == NULL)
return 0;
p->return_size = 0;
- if (val == NULL)
- return 0;
- return set_ptr_internal(p, val, OSSL_PARAM_UTF8_PTR, strlen(val) + 1);
+ return set_ptr_internal(p, val, OSSL_PARAM_UTF8_PTR,
+ val == NULL ? 0 : strlen(val) + 1);
}
int OSSL_PARAM_set_octet_ptr(OSSL_PARAM *p, const void *val,
if (p == NULL)
return 0;
p->return_size = 0;
- if (val == NULL)
- return 0;
return set_ptr_internal(p, val, OSSL_PARAM_OCTET_PTR, used_len);
}