gss: add oid/buffer storage helpers to mechglue

The functions for storing and retrieving GSS OIDs and buffers from
krb5_storage, added in 6554dc69, are generally useful. Move those into private
_gss_mg_XXX() API and update gss_{export,import}_{cred,sec_context} to use them
where appropriate.
This commit is contained in:
Luke Howard
2021-08-10 10:15:08 +10:00
parent 490173b417
commit 43858eaf9b
7 changed files with 210 additions and 218 deletions

View File

@@ -236,3 +236,89 @@ _gss_mg_decode_be_uint16(const void *ptr, uint16_t *n)
const uint8_t *p = ptr;
*n = (p[0] << 24) | (p[1] << 16);
}
OM_uint32
_gss_mg_ret_oid(OM_uint32 *minor,
krb5_storage *sp,
gss_OID *oidp)
{
krb5_data data;
gss_OID_desc oid;
OM_uint32 major;
*minor = 0;
*oidp = GSS_C_NO_OID;
*minor = krb5_ret_data(sp, &data);
if (*minor)
return GSS_S_FAILURE;
if (data.length) {
oid.length = data.length;
oid.elements = data.data;
major = _gss_intern_oid(minor, &oid, oidp);
} else
major = GSS_S_COMPLETE;
krb5_data_free(&data);
return major;
}
OM_uint32
_gss_mg_store_oid(OM_uint32 *minor,
krb5_storage *sp,
gss_const_OID oid)
{
krb5_data data;
if (oid) {
data.length = oid->length;
data.data = oid->elements;
} else
krb5_data_zero(&data);
*minor = krb5_store_data(sp, data);
return *minor ? GSS_S_FAILURE : GSS_S_COMPLETE;
}
OM_uint32
_gss_mg_ret_buffer(OM_uint32 *minor,
krb5_storage *sp,
gss_buffer_t buffer)
{
krb5_data data;
_mg_buffer_zero(buffer);
*minor = krb5_ret_data(sp, &data);
if (*minor == 0) {
if (data.length) {
buffer->length = data.length;
buffer->value = data.data;
} else
krb5_data_free(&data);
}
return *minor ? GSS_S_FAILURE : GSS_S_COMPLETE;
}
OM_uint32
_gss_mg_store_buffer(OM_uint32 *minor,
krb5_storage *sp,
gss_const_buffer_t buffer)
{
krb5_data data;
if (buffer) {
data.length = buffer->length;
data.data = buffer->value;
} else
krb5_data_zero(&data);
*minor = krb5_store_data(sp, data);
return *minor ? GSS_S_FAILURE : GSS_S_COMPLETE;
}