]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
add base fr_radius_decode()
authorAlan T. DeKok <aland@freeradius.org>
Sun, 6 Aug 2017 15:28:08 +0000 (17:28 +0200)
committerAlan T. DeKok <aland@freeradius.org>
Sun, 6 Aug 2017 15:28:08 +0000 (17:28 +0200)
src/protocols/radius/base.c
src/protocols/radius/radius.h

index eb9dbd111066d2f9a14e62b93d0b865e137a6166..f180f48a85b588e2816c977f8275ae36b778db4a 100644 (file)
@@ -984,3 +984,45 @@ ssize_t fr_radius_encode(uint8_t *packet, size_t packet_len, uint8_t const *orig
 
        return total_length;
 }
+
+/** Decode a raw RADIUS packet into VPs.
+ *
+ */
+ssize_t        fr_radius_decode(TALLOC_CTX *ctx, uint8_t *packet, size_t packet_len, uint8_t const *original,
+                        char const *secret, UNUSED size_t secret_len, VALUE_PAIR **vps)
+{
+       ssize_t                 slen;
+       vp_cursor_t             cursor;
+       uint8_t const           *attr, *end;
+       fr_radius_ctx_t         packet_ctx;
+
+       packet_ctx.secret = secret;
+       packet_ctx.vector = original + 4;
+
+       fr_pair_cursor_init(&cursor, vps);
+
+       attr = packet + 20;
+       end = packet + packet_len;
+
+       /*
+        *      The caller MUST have called fr_radius_ok() first.  If
+        *      he doesn't, all hell breaks loose.
+        */
+       while (attr < end) {
+               slen = fr_radius_decode_pair(ctx, &cursor, fr_dict_root(fr_dict_internal),
+                                            attr, (end - attr), &packet_ctx);
+               if (slen < 0) return slen;
+
+               /*
+                *      Here be dragons.
+                */
+                if (!fr_cond_assert((end - attr) <= slen)) return -1;
+
+               attr += slen;
+       }
+
+       /*
+        *      We've parsed the whole packet, return that.
+        */
+       return packet_len;
+}
index 56aa7c62e540904fa1cef94340cebaf54678d78d..e4991e9a8e3eb6600946952933f87dc6ea63961e 100644 (file)
@@ -86,6 +86,9 @@ ssize_t               fr_radius_recv_header(int sockfd, fr_ipaddr_t *src_ipaddr, uint16_t *sr
 ssize_t                fr_radius_encode(uint8_t *packet, size_t packet_len, uint8_t const *original,
                                 char const *secret, UNUSED size_t secret_len, int code, int id, VALUE_PAIR *vps);
 
+ssize_t                fr_radius_decode(TALLOC_CTX *ctx, uint8_t *packet, size_t packet_len, uint8_t const *original,
+                                char const *secret, UNUSED size_t secret_len, VALUE_PAIR **vps) CC_HINT(nonnull);
+
 
 /*
  *     protocols/radius/packet.c