Fix calculation of response authenticator
authorAlan T. DeKok <aland@freeradius.org>
Mon, 27 Jun 2011 11:04:46 +0000 (13:04 +0200)
committerAlan T. DeKok <aland@freeradius.org>
Mon, 27 Jun 2011 11:04:46 +0000 (13:04 +0200)
The Status-Server packet can get an Accounting-Response
packet in return.  Since the Status-Server has a random
authentication vector, the response needs to be calculated
using that.  We can't use the normal Accounting-Response
calculation.

Oops.  No one found this in RFC 5997.

src/lib/radius.c

index ef3abbd..8388ccd 100644 (file)
@@ -1,4 +1,4 @@
-/*
+>/*
  * radius.c    Functions to send/receive radius packets.
  *
  * Version:    $Id$
@@ -1365,8 +1365,12 @@ int rad_sign(RADIUS_PACKET *packet, const RADIUS_PACKET *original,
                uint8_t calc_auth_vector[AUTH_VECTOR_LEN];
 
                switch (packet->code) {
-               case PW_ACCOUNTING_REQUEST:
                case PW_ACCOUNTING_RESPONSE:
+                       if (original && original->code == PW_STATUS_SERVER) {
+                               goto do_ack;
+                       }
+
+               case PW_ACCOUNTING_REQUEST:
                case PW_DISCONNECT_REQUEST:
                case PW_DISCONNECT_ACK:
                case PW_DISCONNECT_NAK:
@@ -1376,6 +1380,7 @@ int rad_sign(RADIUS_PACKET *packet, const RADIUS_PACKET *original,
                        memset(hdr->vector, 0, AUTH_VECTOR_LEN);
                        break;
 
+               do_ack:
                case PW_AUTHENTICATION_ACK:
                case PW_AUTHENTICATION_REJECT:
                case PW_ACCESS_CHALLENGE:
@@ -2075,8 +2080,13 @@ int rad_verify(RADIUS_PACKET *packet, RADIUS_PACKET *original,
                        default:
                                break;
 
-                       case PW_ACCOUNTING_REQUEST:
                        case PW_ACCOUNTING_RESPONSE:
+                               if (original &&
+                                   (original->code == PW_STATUS_SERVER)) {
+                                       goto do_ack;
+                               }
+
+                       case PW_ACCOUNTING_REQUEST:
                        case PW_DISCONNECT_REQUEST:
                        case PW_DISCONNECT_ACK:
                        case PW_DISCONNECT_NAK:
@@ -2086,6 +2096,7 @@ int rad_verify(RADIUS_PACKET *packet, RADIUS_PACKET *original,
                                memset(packet->data + 4, 0, AUTH_VECTOR_LEN);
                                break;
 
+                       do_ack:
                        case PW_AUTHENTICATION_ACK:
                        case PW_AUTHENTICATION_REJECT:
                        case PW_ACCESS_CHALLENGE: