return rv || get_string_ptr_internal(p, val, used_len,
OSSL_PARAM_OCTET_STRING);
}
+
+int OSSL_PARAM_set_octet_string_or_ptr(OSSL_PARAM *p, const void *val,
+ size_t len)
+{
+ if (p == NULL) {
+ err_null_argument;
+ return 0;
+ }
+
+ if (p->data_type == OSSL_PARAM_OCTET_STRING)
+ return OSSL_PARAM_set_octet_string(p, val, len);
+ else if (p->data_type == OSSL_PARAM_OCTET_PTR)
+ return OSSL_PARAM_set_octet_ptr(p, val, len);
+
+ err_bad_type;
+ return 0;
+}
OSSL_PARAM_set_uint64, OSSL_PARAM_set_ulong, OSSL_PARAM_set_BN,
OSSL_PARAM_set_utf8_string, OSSL_PARAM_set_octet_string,
OSSL_PARAM_set_utf8_ptr, OSSL_PARAM_set_octet_ptr,
+OSSL_PARAM_set_octet_string_or_ptr,
OSSL_PARAM_UNMODIFIED, OSSL_PARAM_modified, OSSL_PARAM_set_all_unmodified
- OSSL_PARAM helpers
int OSSL_PARAM_modified(const OSSL_PARAM *param);
void OSSL_PARAM_set_all_unmodified(OSSL_PARAM *params);
+int OSSL_PARAM_set_octet_string_or_ptr(OSSL_PARAM *p, const void *val,
+ size_t len);
+
=head1 DESCRIPTION
A collection of utility functions that simplify and add type safety to the
OSSL_PARAM_set_all_unmodified() resets the unused indicator for all parameters
in the array I<params>.
+OSSL_PARAM_set_octet_string_or_ptr() sets an OCTET string or string pointer
+from the parameter pointed to by I<p> to the value referenced by I<val>. If
+I<p> is an OCTET string and the parameter's I<data> field is NULL, then only
+its I<return_size> field will be assigned the size the parameter's I<data>
+buffer should have. The length of the OCTET string is provided by I<len>.
+
=head1 RETURN VALUES
OSSL_PARAM_construct_TYPE(), OSSL_PARAM_construct_BN(),
These APIs were introduced in OpenSSL 3.0.
+OSSL_PARAM_set_octet_string_or_ptr was added in OpenSSL 3.6.
+
=head1 COPYRIGHT
Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved.
OSSL_PARAM *OSSL_PARAM_merge(const OSSL_PARAM *p1, const OSSL_PARAM *p2);
void OSSL_PARAM_free(OSSL_PARAM *p);
+int OSSL_PARAM_set_octet_string_or_ptr(OSSL_PARAM *p, const void *val,
+ size_t len);
+
# ifdef __cplusplus
}
# endif
}
p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IV);
if (p != NULL
- && !OSSL_PARAM_set_octet_string(p, ctx->base.oiv, ctx->base.ivlen)
- && !OSSL_PARAM_set_octet_ptr(p, &ctx->base.oiv, ctx->base.ivlen)) {
+ && !OSSL_PARAM_set_octet_string_or_ptr(p, ctx->base.oiv, ctx->base.ivlen)) {
ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
return 0;
}
p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_UPDATED_IV);
if (p != NULL
- && !OSSL_PARAM_set_octet_string(p, ctx->base.iv, ctx->base.ivlen)
- && !OSSL_PARAM_set_octet_ptr(p, &ctx->base.iv, ctx->base.ivlen)) {
+ && !OSSL_PARAM_set_octet_string_or_ptr(p, ctx->base.iv, ctx->base.ivlen)) {
ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
return 0;
}
ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
return 0;
}
- if (!OSSL_PARAM_set_octet_string(p, ctx->base.oiv, ctx->base.ivlen)
- && !OSSL_PARAM_set_octet_ptr(p, &ctx->base.oiv, ctx->base.ivlen)) {
+ if (!OSSL_PARAM_set_octet_string_or_ptr(p, ctx->base.oiv, ctx->base.ivlen)) {
ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
return 0;
}
ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
return 0;
}
- if (!OSSL_PARAM_set_octet_string(p, ctx->base.iv, ctx->base.ivlen)
- && !OSSL_PARAM_set_octet_ptr(p, &ctx->base.iv, ctx->base.ivlen)) {
+ if (!OSSL_PARAM_set_octet_string_or_ptr(p, ctx->base.iv, ctx->base.ivlen)) {
ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
return 0;
}
}
p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IV);
if (p != NULL
- && !OSSL_PARAM_set_octet_ptr(p, &ctx->oiv, ctx->ivlen)
- && !OSSL_PARAM_set_octet_string(p, &ctx->oiv, ctx->ivlen)) {
+ && !OSSL_PARAM_set_octet_string_or_ptr(p, ctx->oiv, ctx->ivlen)) {
ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
return 0;
}
p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_UPDATED_IV);
if (p != NULL
- && !OSSL_PARAM_set_octet_ptr(p, &ctx->iv, ctx->ivlen)
- && !OSSL_PARAM_set_octet_string(p, &ctx->iv, ctx->ivlen)) {
+ && !OSSL_PARAM_set_octet_string_or_ptr(p, ctx->iv, ctx->ivlen)) {
ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
return 0;
}
ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
return 0;
}
- if (!OSSL_PARAM_set_octet_string(p, ctx->iv, p->data_size)
- && !OSSL_PARAM_set_octet_ptr(p, &ctx->iv, p->data_size)) {
+ if (!OSSL_PARAM_set_octet_string_or_ptr(p, ctx->iv, p->data_size)) {
ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
return 0;
}
ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
return 0;
}
- if (!OSSL_PARAM_set_octet_string(p, ctx->iv, p->data_size)
- && !OSSL_PARAM_set_octet_ptr(p, &ctx->iv, p->data_size)) {
+ if (!OSSL_PARAM_set_octet_string_or_ptr(p, ctx->iv, p->data_size)) {
ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
return 0;
}
ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
return 0;
}
- if (!OSSL_PARAM_set_octet_string(p, ctx->iv, ctx->ivlen)
- && !OSSL_PARAM_set_octet_ptr(p, &ctx->iv, ctx->ivlen)) {
+ if (!OSSL_PARAM_set_octet_string_or_ptr(p, ctx->iv, ctx->ivlen)) {
ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
return 0;
}
ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
return 0;
}
- if (!OSSL_PARAM_set_octet_string(p, ctx->iv, ctx->ivlen)
- && !OSSL_PARAM_set_octet_ptr(p, &ctx->iv, ctx->ivlen)) {
+ if (!OSSL_PARAM_set_octet_string_or_ptr(p, ctx->iv, ctx->ivlen)) {
ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
return 0;
}
OSSL_PARAM params[20];
char buf[100], buf2[100], *bufp, *bufp2;
unsigned char ubuf[100];
- void *vp, *vpn = NULL, *vp2;
+ void *vp, *vp2, *vpn = NULL, *vpn2 = NULL;
OSSL_PARAM *cp;
int i, n = 0, ret = 0;
unsigned int u;
params[n++] = OSSL_PARAM_construct_BN("bignum", ubuf, sizeof(ubuf));
params[n++] = OSSL_PARAM_construct_utf8_string("utf8str", buf, sizeof(buf));
params[n++] = OSSL_PARAM_construct_octet_string("octstr", buf, sizeof(buf));
+ params[n++] = OSSL_PARAM_construct_octet_string("octstr2", buf, sizeof(buf));
params[n++] = OSSL_PARAM_construct_utf8_ptr("utf8ptr", &bufp, 0);
params[n++] = OSSL_PARAM_construct_octet_ptr("octptr", &vp, 0);
+ params[n++] = OSSL_PARAM_construct_octet_ptr("octptr2", &vp, 0);
params[n] = OSSL_PARAM_construct_end();
switch (tstid) {
|| !TEST_mem_eq(vp, sizeof("abcdefghi"),
"abcdefghi", sizeof("abcdefghi")))
goto err;
+ /* OCTET string using OSSL_PARAM_set_octet_string_or_ptr */
+ if (!TEST_ptr(cp = OSSL_PARAM_locate(p, "octstr2"))
+ || !TEST_true(OSSL_PARAM_set_octet_string_or_ptr(cp, "jklmnopqr",
+ sizeof("jklmnopqr")))
+ || !TEST_size_t_eq(cp->return_size, sizeof("jklmnopqr")))
+ goto err;
+ /* Match the return size to avoid trailing garbage bytes */
+ cp->data_size = cp->return_size;
+ if (!TEST_true(OSSL_PARAM_get_octet_string(cp, &vpn2, 0, &s))
+ || !TEST_size_t_eq(s, sizeof("jklmnopqr"))
+ || !TEST_mem_eq(vpn2, sizeof("jklmnopqr"),
+ "jklmnopqr", sizeof("jklmnopqr")))
+ goto err;
+ vp = buf2;
+ if (!TEST_true(OSSL_PARAM_get_octet_string(cp, &vp, sizeof(buf2), &s))
+ || !TEST_size_t_eq(s, sizeof("jklmnopqr"))
+ || !TEST_mem_eq(vp, sizeof("jklmnopqr"),
+ "jklmnopqr", sizeof("jklmnopqr")))
+ goto err;
/* OCTET pointer */
vp = &l;
if (!TEST_ptr(cp = OSSL_PARAM_locate(p, "octptr"))
goto err;
/* Match the return size to avoid trailing garbage bytes */
cp->data_size = cp->return_size;
+ if (!TEST_true(OSSL_PARAM_get_octet_ptr(cp, (const void **)&vp2, &k))
+ || !TEST_size_t_eq(k, sizeof(ul))
+ || (tstid <= 1 && !TEST_ptr_eq(vp2, vp)))
+ goto err;
+ /* OCTET pointer using OSSL_PARAM_set_octet_string_or_ptr */
+ vp = &l;
+ vp2 = NULL;
+ k = 0;
+ if (!TEST_ptr(cp = OSSL_PARAM_locate(p, "octptr2"))
+ || !TEST_true(OSSL_PARAM_set_octet_string_or_ptr(cp, &ul, sizeof(ul)))
+ || !TEST_size_t_eq(cp->return_size, sizeof(ul))
+ || (tstid <= 1 && !TEST_ptr_eq(vp, &ul)))
+ goto err;
+ /* Match the return size to avoid trailing garbage bytes */
+ cp->data_size = cp->return_size;
if (!TEST_true(OSSL_PARAM_get_octet_ptr(cp, (const void **)&vp2, &k))
|| !TEST_size_t_eq(k, sizeof(ul))
|| (tstid <= 1 && !TEST_ptr_eq(vp2, vp)))
OPENSSL_free(p);
OPENSSL_free(p1);
OPENSSL_free(vpn);
+ OPENSSL_free(vpn2);
BN_free(bn);
BN_free(bn2);
return ret;
PEM_ASN1_write_bio_ctx ? 3_5_0 EXIST::FUNCTION:
OPENSSL_sk_set_thunks ? 3_6_0 EXIST::FUNCTION:
i2d_PKCS8PrivateKey ? 3_6_0 EXIST::FUNCTION:
+OSSL_PARAM_set_octet_string_or_ptr ? 3_6_0 EXIST::FUNCTION: