]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[http] Remove knowledge of MD5 digest context internal structure master
authorMichael Brown <mcb30@ipxe.org>
Tue, 23 Jun 2026 08:50:37 +0000 (09:50 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 23 Jun 2026 09:28:37 +0000 (10:28 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/net/tcp/httpdigest.c

index 8ff6dbfa5a4cce8c32d750a4ac865cf396b54991..5a65352f4b0f7e1b2ec0d704908453f2e8487955 100644 (file)
@@ -46,6 +46,14 @@ FILE_SECBOOT ( PERMITTED );
        __einfo_uniqify ( EINFO_EACCES, 0x01,                           \
                          "No username available for Digest authentication" )
 
+/** An HTTP Digest algorithm context */
+struct http_digest_context {
+       /** MD5 context */
+       uint8_t md5[MD5_CTX_SIZE];
+       /** Length of colon field separator before next field */
+       size_t colon_len;
+};
+
 /** An HTTP Digest "WWW-Authenticate" response field */
 struct http_digest_field {
        /** Name */
@@ -125,10 +133,13 @@ static int http_parse_digest_auth ( struct http_transaction *http,
  * @v ctx              Digest context
  * @v string           Initial string
  */
-static void http_digest_init ( struct md5_context *ctx ) {
+static void http_digest_init ( struct http_digest_context *ctx ) {
 
        /* Initialise MD5 digest */
-       digest_init ( &md5_algorithm, ctx );
+       digest_init ( &md5_algorithm, ctx->md5 );
+
+       /* Omit colon before first field */
+       ctx->colon_len = 0;
 }
 
 /**
@@ -137,13 +148,16 @@ static void http_digest_init ( struct md5_context *ctx ) {
  * @v ctx              Digest context
  * @v string           String to append
  */
-static void http_digest_update ( struct md5_context *ctx, const char *string ) {
+static void http_digest_update ( struct http_digest_context *ctx,
+                                const char *string ) {
        static const char colon = ':';
 
        /* Add (possibly colon-separated) field to MD5 digest */
-       if ( ctx->len )
-               digest_update ( &md5_algorithm, ctx, &colon, sizeof ( colon ) );
-       digest_update ( &md5_algorithm, ctx, string, strlen ( string ) );
+       digest_update ( &md5_algorithm, ctx->md5, &colon, ctx->colon_len );
+       digest_update ( &md5_algorithm, ctx->md5, string, strlen ( string ) );
+
+       /* Include colon before any subsequent fields */
+       ctx->colon_len = sizeof ( colon );
 }
 
 /**
@@ -153,12 +167,12 @@ static void http_digest_update ( struct md5_context *ctx, const char *string ) {
  * @v out              Buffer for digest output
  * @v len              Buffer length
  */
-static void http_digest_final ( struct md5_context *ctx, char *out,
+static void http_digest_final ( struct http_digest_context *ctx, char *out,
                                size_t len ) {
        uint8_t digest[MD5_DIGEST_SIZE];
 
        /* Finalise and base16-encode MD5 digest */
-       digest_final ( &md5_algorithm, ctx, digest );
+       digest_final ( &md5_algorithm, ctx->md5, digest );
        base16_encode ( digest, sizeof ( digest ), out, len );
 }
 
@@ -175,7 +189,7 @@ static int http_digest_authenticate ( struct http_transaction *http ) {
        char ha2[ base16_encoded_len ( MD5_DIGEST_SIZE ) + 1 /* NUL */ ];
        static const char md5sess[] = "MD5-sess";
        static const char md5[] = "MD5";
-       struct md5_context ctx;
+       struct http_digest_context ctx;
        const char *password;
 
        /* Check for required response parameters */