(_gssapi_wrap_arcfour): set the correct padding
(_gssapi_unwrap_arcfour): verify and strip padding git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@12688 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -380,7 +380,7 @@ _gssapi_wrap_arcfour(OM_uint32 * minor_status,
|
|||||||
|
|
||||||
p += 24; /* skip SND_SEQ, SGN_CKSUM, and Confounder */
|
p += 24; /* skip SND_SEQ, SGN_CKSUM, and Confounder */
|
||||||
memcpy(p, input_message_buffer->value, input_message_buffer->length);
|
memcpy(p, input_message_buffer->value, input_message_buffer->length);
|
||||||
p[input_message_buffer->length] = 0; /* PADDING */
|
p[input_message_buffer->length] = 1; /* PADDING */
|
||||||
|
|
||||||
ret = arcfour_mic_cksum(key, KRB5_KU_USAGE_SEAL,
|
ret = arcfour_mic_cksum(key, KRB5_KU_USAGE_SEAL,
|
||||||
token->SGN_CKSUM, 8,
|
token->SGN_CKSUM, 8,
|
||||||
@@ -467,6 +467,7 @@ OM_uint32 _gssapi_unwrap_arcfour(OM_uint32 *minor_status,
|
|||||||
u_char *p;
|
u_char *p;
|
||||||
int cmp;
|
int cmp;
|
||||||
int conf_flag;
|
int conf_flag;
|
||||||
|
size_t padlen;
|
||||||
|
|
||||||
if (conf_state)
|
if (conf_state)
|
||||||
*conf_state = 0;
|
*conf_state = 0;
|
||||||
@@ -557,7 +558,7 @@ OM_uint32 _gssapi_unwrap_arcfour(OM_uint32 *minor_status,
|
|||||||
*minor_status = ENOMEM;
|
*minor_status = ENOMEM;
|
||||||
return GSS_S_FAILURE;
|
return GSS_S_FAILURE;
|
||||||
}
|
}
|
||||||
output_message_buffer->length = datalen - 1;
|
output_message_buffer->length = datalen;
|
||||||
|
|
||||||
if(conf_flag) {
|
if(conf_flag) {
|
||||||
RC4_KEY rc4_key;
|
RC4_KEY rc4_key;
|
||||||
@@ -573,14 +574,22 @@ OM_uint32 _gssapi_unwrap_arcfour(OM_uint32 *minor_status,
|
|||||||
}
|
}
|
||||||
memset(k6_data, 0, sizeof(k6_data));
|
memset(k6_data, 0, sizeof(k6_data));
|
||||||
|
|
||||||
|
ret = _gssapi_verify_pad(output_message_buffer, datalen, &padlen);
|
||||||
|
if (ret) {
|
||||||
|
gss_release_buffer(minor_status, output_message_buffer);
|
||||||
|
*minor_status = 0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
output_message_buffer->length -= padlen;
|
||||||
|
|
||||||
ret = arcfour_mic_cksum(key, KRB5_KU_USAGE_SEAL,
|
ret = arcfour_mic_cksum(key, KRB5_KU_USAGE_SEAL,
|
||||||
cksum_data, sizeof(cksum_data),
|
cksum_data, sizeof(cksum_data),
|
||||||
p - 8, 8,
|
p - 8, 8,
|
||||||
Confounder, sizeof(Confounder),
|
Confounder, sizeof(Confounder),
|
||||||
output_message_buffer->value,
|
output_message_buffer->value,
|
||||||
output_message_buffer->length + 1);
|
output_message_buffer->length + padlen);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
gss_release_buffer(minor_status, input_message_buffer);
|
gss_release_buffer(minor_status, output_message_buffer);
|
||||||
*minor_status = ret;
|
*minor_status = ret;
|
||||||
return GSS_S_FAILURE;
|
return GSS_S_FAILURE;
|
||||||
}
|
}
|
||||||
|
@@ -380,7 +380,7 @@ _gssapi_wrap_arcfour(OM_uint32 * minor_status,
|
|||||||
|
|
||||||
p += 24; /* skip SND_SEQ, SGN_CKSUM, and Confounder */
|
p += 24; /* skip SND_SEQ, SGN_CKSUM, and Confounder */
|
||||||
memcpy(p, input_message_buffer->value, input_message_buffer->length);
|
memcpy(p, input_message_buffer->value, input_message_buffer->length);
|
||||||
p[input_message_buffer->length] = 0; /* PADDING */
|
p[input_message_buffer->length] = 1; /* PADDING */
|
||||||
|
|
||||||
ret = arcfour_mic_cksum(key, KRB5_KU_USAGE_SEAL,
|
ret = arcfour_mic_cksum(key, KRB5_KU_USAGE_SEAL,
|
||||||
token->SGN_CKSUM, 8,
|
token->SGN_CKSUM, 8,
|
||||||
@@ -467,6 +467,7 @@ OM_uint32 _gssapi_unwrap_arcfour(OM_uint32 *minor_status,
|
|||||||
u_char *p;
|
u_char *p;
|
||||||
int cmp;
|
int cmp;
|
||||||
int conf_flag;
|
int conf_flag;
|
||||||
|
size_t padlen;
|
||||||
|
|
||||||
if (conf_state)
|
if (conf_state)
|
||||||
*conf_state = 0;
|
*conf_state = 0;
|
||||||
@@ -557,7 +558,7 @@ OM_uint32 _gssapi_unwrap_arcfour(OM_uint32 *minor_status,
|
|||||||
*minor_status = ENOMEM;
|
*minor_status = ENOMEM;
|
||||||
return GSS_S_FAILURE;
|
return GSS_S_FAILURE;
|
||||||
}
|
}
|
||||||
output_message_buffer->length = datalen - 1;
|
output_message_buffer->length = datalen;
|
||||||
|
|
||||||
if(conf_flag) {
|
if(conf_flag) {
|
||||||
RC4_KEY rc4_key;
|
RC4_KEY rc4_key;
|
||||||
@@ -573,14 +574,22 @@ OM_uint32 _gssapi_unwrap_arcfour(OM_uint32 *minor_status,
|
|||||||
}
|
}
|
||||||
memset(k6_data, 0, sizeof(k6_data));
|
memset(k6_data, 0, sizeof(k6_data));
|
||||||
|
|
||||||
|
ret = _gssapi_verify_pad(output_message_buffer, datalen, &padlen);
|
||||||
|
if (ret) {
|
||||||
|
gss_release_buffer(minor_status, output_message_buffer);
|
||||||
|
*minor_status = 0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
output_message_buffer->length -= padlen;
|
||||||
|
|
||||||
ret = arcfour_mic_cksum(key, KRB5_KU_USAGE_SEAL,
|
ret = arcfour_mic_cksum(key, KRB5_KU_USAGE_SEAL,
|
||||||
cksum_data, sizeof(cksum_data),
|
cksum_data, sizeof(cksum_data),
|
||||||
p - 8, 8,
|
p - 8, 8,
|
||||||
Confounder, sizeof(Confounder),
|
Confounder, sizeof(Confounder),
|
||||||
output_message_buffer->value,
|
output_message_buffer->value,
|
||||||
output_message_buffer->length + 1);
|
output_message_buffer->length + padlen);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
gss_release_buffer(minor_status, input_message_buffer);
|
gss_release_buffer(minor_status, output_message_buffer);
|
||||||
*minor_status = ret;
|
*minor_status = ret;
|
||||||
return GSS_S_FAILURE;
|
return GSS_S_FAILURE;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user