login: do not try to "emulate" the libgcrypt API
Implement a more generic wrapper API for message digests, so that it is easier to also include gnutls as an option. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
64
lib/login.c
64
lib/login.c
@@ -681,41 +681,48 @@ i2h(int i)
|
|||||||
return i + '0';
|
return i + '0';
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef HAVE_LIBGCRYPT
|
#ifdef HAVE_LIBGCRYPT
|
||||||
typedef struct MD5Context *gcry_md_hd_t;
|
typedef gcry_md_hd_t md5_context_t;
|
||||||
#define gcry_md_write MD5Update
|
#define md5_open(hd) gcry_md_open(hd, GCRY_MD_MD5, 0)
|
||||||
#define GCRY_MD_MD5 1
|
#define md5_write gcry_md_write
|
||||||
|
#define md5_close gcry_md_close
|
||||||
|
|
||||||
static void gcry_md_open(gcry_md_hd_t *hd, int algo, unsigned int flags)
|
static void md5_read(md5_context_t h, uint8_t *result)
|
||||||
|
{
|
||||||
|
memcpy(result, gcry_md_read(h, 0), 16);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
typedef struct MD5Context *md5_context_t;
|
||||||
|
#define md5_write MD5Update
|
||||||
|
|
||||||
|
static void md5_open(md5_context_t *hd)
|
||||||
{
|
{
|
||||||
assert(algo == GCRY_MD_MD5 && flags == 0);
|
|
||||||
*hd = malloc(sizeof(struct MD5Context));
|
*hd = malloc(sizeof(struct MD5Context));
|
||||||
if (*hd) {
|
if (*hd) {
|
||||||
MD5Init(*hd);
|
MD5Init(*hd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gcry_md_putc(gcry_md_hd_t h, unsigned char c)
|
static void md5_read(md5_context_t h, uint8_t *result)
|
||||||
{
|
|
||||||
MD5Update(h, &c, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *gcry_md_read(gcry_md_hd_t h, int algo)
|
|
||||||
{
|
{
|
||||||
unsigned char digest[16];
|
unsigned char digest[16];
|
||||||
assert(algo == 0 || algo == GCRY_MD_MD5);
|
|
||||||
|
|
||||||
MD5Final(digest, h);
|
MD5Final(digest, h);
|
||||||
return memcpy(h->buf, digest, sizeof(digest));
|
memcpy(result, digest, sizeof(digest));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gcry_md_close(gcry_md_hd_t h)
|
static void md5_close(md5_context_t h)
|
||||||
{
|
{
|
||||||
memset(h, 0, sizeof(*h));
|
memset(h, 0, sizeof(*h));
|
||||||
free(h);
|
free(h);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static inline void md5_putc(md5_context_t h, unsigned char c)
|
||||||
|
{
|
||||||
|
md5_write(h, &c, 1);
|
||||||
|
}
|
||||||
|
|
||||||
/* size of the challenge used for bidirectional chap */
|
/* size of the challenge used for bidirectional chap */
|
||||||
#define TARGET_CHAP_C_SIZE 32
|
#define TARGET_CHAP_C_SIZE 32
|
||||||
|
|
||||||
@@ -726,7 +733,7 @@ iscsi_login_add_chap_response(struct iscsi_context *iscsi, struct iscsi_pdu *pdu
|
|||||||
char * strp;
|
char * strp;
|
||||||
unsigned char c, cc[2];
|
unsigned char c, cc[2];
|
||||||
unsigned char digest[CHAP_R_SIZE];
|
unsigned char digest[CHAP_R_SIZE];
|
||||||
gcry_md_hd_t ctx;
|
md5_context_t ctx;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (iscsi->current_phase != ISCSI_PDU_LOGIN_CSG_SECNEG
|
if (iscsi->current_phase != ISCSI_PDU_LOGIN_CSG_SECNEG
|
||||||
@@ -739,22 +746,22 @@ iscsi_login_add_chap_response(struct iscsi_context *iscsi, struct iscsi_pdu *pdu
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
gcry_md_open(&ctx, GCRY_MD_MD5, 0);
|
md5_open(&ctx);
|
||||||
if (ctx == NULL) {
|
if (ctx == NULL) {
|
||||||
iscsi_set_error(iscsi, "Cannot create MD5 algorithm");
|
iscsi_set_error(iscsi, "Cannot create MD5 algorithm");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
gcry_md_putc(ctx, iscsi->chap_i);
|
md5_putc(ctx, iscsi->chap_i);
|
||||||
gcry_md_write(ctx, (unsigned char *)iscsi->passwd, strlen(iscsi->passwd));
|
md5_write(ctx, (unsigned char *)iscsi->passwd, strlen(iscsi->passwd));
|
||||||
|
|
||||||
strp = iscsi->chap_c;
|
strp = iscsi->chap_c;
|
||||||
while (*strp != 0) {
|
while (*strp != 0) {
|
||||||
c = (h2i(strp[0]) << 4) | h2i(strp[1]);
|
c = (h2i(strp[0]) << 4) | h2i(strp[1]);
|
||||||
strp += 2;
|
strp += 2;
|
||||||
gcry_md_putc(ctx, c);
|
md5_putc(ctx, c);
|
||||||
}
|
}
|
||||||
memcpy(digest, gcry_md_read(ctx, 0), sizeof(digest));
|
md5_read(ctx, digest);
|
||||||
gcry_md_close(ctx);
|
md5_close(ctx);
|
||||||
|
|
||||||
strncpy(str,"CHAP_R=0x",MAX_STRING_SIZE);
|
strncpy(str,"CHAP_R=0x",MAX_STRING_SIZE);
|
||||||
if (iscsi_pdu_add_data(iscsi, pdu, (unsigned char *)str, strlen(str))
|
if (iscsi_pdu_add_data(iscsi, pdu, (unsigned char *)str, strlen(str))
|
||||||
@@ -822,20 +829,19 @@ iscsi_login_add_chap_response(struct iscsi_context *iscsi, struct iscsi_pdu *pdu
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
gcry_md_open(&ctx, GCRY_MD_MD5, 0);
|
md5_open(&ctx);
|
||||||
if (ctx == NULL) {
|
if (ctx == NULL) {
|
||||||
iscsi_set_error(iscsi, "Cannot create MD5 algorithm");
|
iscsi_set_error(iscsi, "Cannot create MD5 algorithm");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
gcry_md_putc(ctx, iscsi->target_chap_i);
|
md5_putc(ctx, iscsi->target_chap_i);
|
||||||
gcry_md_write(ctx, (unsigned char *)iscsi->target_passwd,
|
md5_write(ctx, (unsigned char *)iscsi->target_passwd,
|
||||||
strlen(iscsi->target_passwd));
|
strlen(iscsi->target_passwd));
|
||||||
gcry_md_write(ctx, (unsigned char *)target_chap_c,
|
md5_write(ctx, (unsigned char *)target_chap_c,
|
||||||
TARGET_CHAP_C_SIZE);
|
TARGET_CHAP_C_SIZE);
|
||||||
|
|
||||||
memcpy(iscsi->target_chap_r, gcry_md_read(ctx, 0),
|
md5_read(ctx, iscsi->target_chap_r);
|
||||||
sizeof(iscsi->target_chap_r));
|
md5_close(ctx);
|
||||||
gcry_md_close(ctx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user