Changeset View
Changeset View
Standalone View
Standalone View
projects/openssl111/crypto/heimdal/lib/gssapi/krb5/unwrap.c
Show First 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | unwrap_des | ||||
gss_qop_t * qop_state, | gss_qop_t * qop_state, | ||||
krb5_keyblock *key | krb5_keyblock *key | ||||
) | ) | ||||
{ | { | ||||
u_char *p, *seq; | u_char *p, *seq; | ||||
size_t len; | size_t len; | ||||
EVP_MD_CTX *md5; | EVP_MD_CTX *md5; | ||||
u_char hash[16]; | u_char hash[16]; | ||||
EVP_CIPHER_CTX des_ctx; | EVP_CIPHER_CTX *des_ctx; | ||||
DES_key_schedule schedule; | DES_key_schedule schedule; | ||||
DES_cblock deskey; | DES_cblock deskey; | ||||
DES_cblock zero; | DES_cblock zero; | ||||
size_t i; | size_t i; | ||||
uint32_t seq_number; | uint32_t seq_number; | ||||
size_t padlength; | size_t padlength; | ||||
OM_uint32 ret; | OM_uint32 ret; | ||||
int cstate; | int cstate; | ||||
Show All 37 Lines | if(cstate) { | ||||
/* decrypt data */ | /* decrypt data */ | ||||
memcpy (&deskey, key->keyvalue.data, sizeof(deskey)); | memcpy (&deskey, key->keyvalue.data, sizeof(deskey)); | ||||
memset (&zero, 0, sizeof(zero)); | memset (&zero, 0, sizeof(zero)); | ||||
for (i = 0; i < sizeof(deskey); ++i) | for (i = 0; i < sizeof(deskey); ++i) | ||||
deskey[i] ^= 0xf0; | deskey[i] ^= 0xf0; | ||||
EVP_CIPHER_CTX_init(&des_ctx); | des_ctx = EVP_CIPHER_CTX_new(); | ||||
EVP_CipherInit_ex(&des_ctx, EVP_des_cbc(), NULL, deskey, zero, 0); | if (des_ctx == NULL) { | ||||
EVP_Cipher(&des_ctx, p, p, input_message_buffer->length - len); | memset (deskey, 0, sizeof(deskey)); | ||||
EVP_CIPHER_CTX_cleanup(&des_ctx); | *minor_status = ENOMEM; | ||||
return GSS_S_FAILURE; | |||||
} | |||||
EVP_CipherInit_ex(des_ctx, EVP_des_cbc(), NULL, deskey, zero, 0); | |||||
EVP_Cipher(des_ctx, p, p, input_message_buffer->length - len); | |||||
EVP_CIPHER_CTX_free(des_ctx); | |||||
memset (&schedule, 0, sizeof(schedule)); | memset (deskey, 0, sizeof(deskey)); | ||||
} | } | ||||
if (IS_DCE_STYLE(context_handle)) { | if (IS_DCE_STYLE(context_handle)) { | ||||
padlength = 0; | padlength = 0; | ||||
} else { | } else { | ||||
/* check pad */ | /* check pad */ | ||||
ret = _gssapi_verify_pad(input_message_buffer, | ret = _gssapi_verify_pad(input_message_buffer, | ||||
input_message_buffer->length - len, | input_message_buffer->length - len, | ||||
Show All 9 Lines | unwrap_des | ||||
EVP_DigestFinal_ex(md5, hash, NULL); | EVP_DigestFinal_ex(md5, hash, NULL); | ||||
EVP_MD_CTX_destroy(md5); | EVP_MD_CTX_destroy(md5); | ||||
memset (&zero, 0, sizeof(zero)); | memset (&zero, 0, sizeof(zero)); | ||||
memcpy (&deskey, key->keyvalue.data, sizeof(deskey)); | memcpy (&deskey, key->keyvalue.data, sizeof(deskey)); | ||||
DES_set_key_unchecked (&deskey, &schedule); | DES_set_key_unchecked (&deskey, &schedule); | ||||
DES_cbc_cksum ((void *)hash, (void *)hash, sizeof(hash), | DES_cbc_cksum ((void *)hash, (void *)hash, sizeof(hash), | ||||
&schedule, &zero); | &schedule, &zero); | ||||
if (ct_memcmp (p - 8, hash, 8) != 0) | if (ct_memcmp (p - 8, hash, 8) != 0) { | ||||
memset (deskey, 0, sizeof(deskey)); | |||||
memset (&schedule, 0, sizeof(schedule)); | |||||
return GSS_S_BAD_MIC; | return GSS_S_BAD_MIC; | ||||
} | |||||
/* verify sequence number */ | /* verify sequence number */ | ||||
des_ctx = EVP_CIPHER_CTX_new(); | |||||
if (des_ctx == NULL) { | |||||
memset (deskey, 0, sizeof(deskey)); | |||||
memset (&schedule, 0, sizeof(schedule)); | |||||
*minor_status = ENOMEM; | |||||
return GSS_S_FAILURE; | |||||
} | |||||
HEIMDAL_MUTEX_lock(&context_handle->ctx_id_mutex); | HEIMDAL_MUTEX_lock(&context_handle->ctx_id_mutex); | ||||
p -= 16; | p -= 16; | ||||
EVP_CIPHER_CTX_init(&des_ctx); | EVP_CipherInit_ex(des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, hash, 0); | ||||
EVP_CipherInit_ex(&des_ctx, EVP_des_cbc(), NULL, key->keyvalue.data, hash, 0); | EVP_Cipher(des_ctx, p, p, 8); | ||||
EVP_Cipher(&des_ctx, p, p, 8); | EVP_CIPHER_CTX_free(des_ctx); | ||||
EVP_CIPHER_CTX_cleanup(&des_ctx); | |||||
memset (deskey, 0, sizeof(deskey)); | memset (deskey, 0, sizeof(deskey)); | ||||
memset (&schedule, 0, sizeof(schedule)); | memset (&schedule, 0, sizeof(schedule)); | ||||
seq = p; | seq = p; | ||||
_gsskrb5_decode_om_uint32(seq, &seq_number); | _gsskrb5_decode_om_uint32(seq, &seq_number); | ||||
if (context_handle->more_flags & LOCAL) | if (context_handle->more_flags & LOCAL) | ||||
▲ Show 20 Lines • Show All 290 Lines • Show Last 20 Lines |