From: James Jones Date: Thu, 20 Aug 2020 18:29:48 +0000 (-0500) Subject: Add fr_radius_ascend_secret_dbuff() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6e89c08d6488d79099bdc5cc185ff97f2f6ebddc;p=thirdparty%2Ffreeradius-server.git Add fr_radius_ascend_secret_dbuff() fr_radius_ascend_secret() is now a wrapper around fr_radius_ascend_secret_dbuff(), so the latter is exercised and the transition to (directly) use it needn't happen all at once. --- diff --git a/src/protocols/radius/base.c b/src/protocols/radius/base.c index 4a5770e78ea..ba9a0b858c8 100644 --- a/src/protocols/radius/base.c +++ b/src/protocols/radius/base.c @@ -242,31 +242,38 @@ size_t fr_radius_attr_len(VALUE_PAIR const *vp) */ ssize_t fr_radius_ascend_secret(uint8_t *out, size_t outlen, uint8_t const *in, size_t inlen, char const *secret, uint8_t const *vector) +{ + return fr_radius_ascend_secret_dbuff(&FR_DBUFF_TMP(out, outlen), in, inlen, secret, vector); +} + +ssize_t fr_radius_ascend_secret_dbuff(fr_dbuff_t *dbuff, uint8_t const *in, size_t inlen, + char const *secret, uint8_t const *vector) { fr_md5_ctx_t *md5_ctx; int i; uint8_t buff[RADIUS_AUTH_VECTOR_LENGTH]; + fr_dbuff_t work_dbuff = FR_DBUFF_NO_ADVANCE(dbuff); + fr_dbuff_marker_t start; - if (outlen < RADIUS_AUTH_VECTOR_LENGTH) return -(outlen - RADIUS_AUTH_VECTOR_LENGTH); + fr_dbuff_marker(&start, &work_dbuff); - /* - * Probably shouldn't happen, but deal with it gracefully if it does - */ - if (inlen < RADIUS_AUTH_VECTOR_LENGTH) { - memset(buff, 0, sizeof(buff)); - memcpy(buff, in, inlen); - in = buff; - } + if (inlen > RADIUS_AUTH_VECTOR_LENGTH) inlen = RADIUS_AUTH_VECTOR_LENGTH; + + FR_DBUFF_ADVANCE_RETURN(&work_dbuff, RADIUS_AUTH_VECTOR_LENGTH); + + fr_dbuff_set_to_start(&work_dbuff); + fr_dbuff_memcpy_in(&work_dbuff, in, inlen); + if (inlen < RADIUS_AUTH_VECTOR_LENGTH) fr_dbuff_memset(&work_dbuff, 0, RADIUS_AUTH_VECTOR_LENGTH - inlen); md5_ctx = fr_md5_ctx_alloc(true); fr_md5_update(md5_ctx, vector, RADIUS_AUTH_VECTOR_LENGTH); fr_md5_update(md5_ctx, (uint8_t const *) secret, talloc_array_length(secret) - 1); - fr_md5_final(out, md5_ctx); + fr_md5_final(buff, md5_ctx); fr_md5_ctx_free(&md5_ctx); - for (i = 0; i < RADIUS_AUTH_VECTOR_LENGTH; i++ ) out[i] ^= in[i]; + for (i = 0; i < RADIUS_AUTH_VECTOR_LENGTH; i++) fr_dbuff_marker_current(&start)[i] ^= buff[i]; - return RADIUS_AUTH_VECTOR_LENGTH; + return fr_dbuff_set(dbuff, &work_dbuff); } /** Basic validation of RADIUS packet header diff --git a/src/protocols/radius/radius.h b/src/protocols/radius/radius.h index d219a99dfd1..e3625ba7515 100644 --- a/src/protocols/radius/radius.h +++ b/src/protocols/radius/radius.h @@ -28,6 +28,7 @@ #include #include #include +#include #define RADIUS_AUTH_VECTOR_OFFSET 4 #define RADIUS_HEADER_LENGTH 20 @@ -104,6 +105,9 @@ bool fr_radius_ok(uint8_t const *packet, size_t *packet_len_p, ssize_t fr_radius_ascend_secret(uint8_t *out, size_t outlen, uint8_t const *in, size_t inlen, char const *secret, uint8_t const *vector); +ssize_t fr_radius_ascend_secret_dbuff(fr_dbuff_t *dbuff, uint8_t const *in, size_t inlen, + char const *secret, uint8_t const *vector); + ssize_t fr_radius_recv_header(int sockfd, fr_ipaddr_t *src_ipaddr, uint16_t *src_port, unsigned int *code); ssize_t fr_radius_encode(uint8_t *packet, size_t packet_len, uint8_t const *original,