lib/gssapi/krb5: split out a arcfour_mic_cksum_iov() function

Signed-off-by: Stefan Metzmacher <metze@samba.org>
This commit is contained in:
Stefan Metzmacher
2015-06-18 14:07:43 +02:00
committed by Andrew Bartlett
parent ef0059b8b6
commit bafefad87f

View File

@@ -112,30 +112,73 @@ arcfour_mic_key(krb5_context context, krb5_keyblock *key,
static krb5_error_code static krb5_error_code
arcfour_mic_cksum(krb5_context context, arcfour_mic_cksum_iov(krb5_context context,
krb5_keyblock *key, unsigned usage, krb5_keyblock *key, unsigned usage,
u_char *sgn_cksum, size_t sgn_cksum_sz, u_char *sgn_cksum, size_t sgn_cksum_sz,
const u_char *v1, size_t l1, const u_char *v1, size_t l1,
const void *v2, size_t l2, const void *v2, size_t l2,
const void *v3, size_t l3) const gss_iov_buffer_desc *iov,
int iov_count,
const gss_iov_buffer_desc *padding)
{ {
Checksum CKSUM; Checksum CKSUM;
u_char *ptr; u_char *ptr;
size_t len; size_t len;
size_t ofs = 0;
int i;
krb5_crypto crypto; krb5_crypto crypto;
krb5_error_code ret; krb5_error_code ret;
assert(sgn_cksum_sz == 8); assert(sgn_cksum_sz == 8);
len = l1 + l2 + l3; len = l1 + l2;
for (i=0; i < iov_count; i++) {
switch (GSS_IOV_BUFFER_TYPE(iov[i].type)) {
case GSS_IOV_BUFFER_TYPE_DATA:
case GSS_IOV_BUFFER_TYPE_SIGN_ONLY:
break;
default:
continue;
}
len += iov[i].buffer.length;
}
if (padding) {
len += padding->buffer.length;
}
ptr = malloc(len); ptr = malloc(len);
if (ptr == NULL) if (ptr == NULL)
return ENOMEM; return ENOMEM;
memcpy(ptr, v1, l1); memcpy(ptr + ofs, v1, l1);
memcpy(ptr + l1, v2, l2); ofs += l1;
memcpy(ptr + l1 + l2, v3, l3); memcpy(ptr + ofs, v2, l2);
ofs += l2;
for (i=0; i < iov_count; i++) {
switch (GSS_IOV_BUFFER_TYPE(iov[i].type)) {
case GSS_IOV_BUFFER_TYPE_DATA:
case GSS_IOV_BUFFER_TYPE_SIGN_ONLY:
break;
default:
continue;
}
memcpy(ptr + ofs,
iov[i].buffer.value,
iov[i].buffer.length);
ofs += iov[i].buffer.length;
}
if (padding) {
memcpy(ptr + ofs,
padding->buffer.value,
padding->buffer.length);
ofs += padding->buffer.length;
}
ret = krb5_crypto_init(context, key, 0, &crypto); ret = krb5_crypto_init(context, key, 0, &crypto);
if (ret) { if (ret) {
@@ -160,6 +203,26 @@ arcfour_mic_cksum(krb5_context context,
return ret; return ret;
} }
static krb5_error_code
arcfour_mic_cksum(krb5_context context,
krb5_keyblock *key, unsigned usage,
u_char *sgn_cksum, size_t sgn_cksum_sz,
const u_char *v1, size_t l1,
const void *v2, size_t l2,
const void *v3, size_t l3)
{
gss_iov_buffer_desc iov;
iov.type = GSS_IOV_BUFFER_TYPE_SIGN_ONLY;
iov.buffer.value = rk_UNCONST(v3);
iov.buffer.length = l3;
return arcfour_mic_cksum_iov(context, key, usage,
sgn_cksum, sgn_cksum_sz,
v1, l1, v2, l2,
&iov, 1, NULL);
}
OM_uint32 OM_uint32
_gssapi_get_mic_arcfour(OM_uint32 * minor_status, _gssapi_get_mic_arcfour(OM_uint32 * minor_status,