lib/gssapi/krb5: split out a arcfour_mic_cksum_iov() function
Signed-off-by: Stefan Metzmacher <metze@samba.org>
This commit is contained in:

committed by
Andrew Bartlett

parent
ef0059b8b6
commit
bafefad87f
@@ -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,
|
||||||
|
Reference in New Issue
Block a user