xref: /openbsd/regress/lib/libradius/test04.c (revision 274d7c50)
1 #include "incs.h"
2 
3 /*
4  * put/get cat attributes
5  */
6 
7 void test04(void)
8 {
9 	RADIUS_PACKET *packet;
10 	uint8_t buf[1024];
11 	size_t len;
12 	uint8_t *p;
13 
14 #define ATTRLEN (256 + 256 + 103)
15 	uint8_t data0[ATTRLEN];
16 	uint8_t data1[ATTRLEN];
17 	uint8_t data2[] = { 0x10, 0x20, 0x30, 0x40 };
18 	uint8_t data3[] = { 0x10, 0x20, 0x30, 0x40, 0x10, 0x20, 0x30, 0x40 };
19 	uint8_t attrs[2048];
20 
21 	packet = radius_new_request_packet(RADIUS_CODE_ACCESS_REQUEST);
22 
23 	for (int i = 0; i < ATTRLEN; i++)
24 		data0[i] = random();
25 	for (int i = 0; i < ATTRLEN; i++)
26 		data1[i] = random();
27 
28 	p = attrs;
29 	*p++ = 20; *p++ = 6;
30 	memcpy(p, data2, 4); p += 4;
31 
32 	*p++ = 10; *p++ = 255;
33 	memcpy(p, data0, 253); p += 253;
34 	*p++ = 10; *p++ = 255;
35 	memcpy(p, data0 + 253, 253); p += 253;
36 	*p++ = 10; *p++ = ATTRLEN-253*2+2;
37 	memcpy(p, data0 + 253*2, ATTRLEN-253*2); p += ATTRLEN-253*2;
38 
39 	*p++ = RADIUS_TYPE_VENDOR_SPECIFIC; *p++ = 255;
40 	*p++ = 0; *p++ = 0; *p++ = 0; *p++ = 20; *p++ = 30; *p++ = 249;
41 	memcpy(p, data1, 247); p += 247;
42 	*p++ = RADIUS_TYPE_VENDOR_SPECIFIC; *p++ = 255;
43 	*p++ = 0; *p++ = 0; *p++ = 0; *p++ = 20; *p++ = 30; *p++ = 249;
44 	memcpy(p, data1 + 247, 247); p += 247;
45 	*p++ = RADIUS_TYPE_VENDOR_SPECIFIC; *p++ = ATTRLEN-247*2+8;
46 	*p++ = 0; *p++ = 0; *p++ = 0; *p++ = 20; *p++ = 30; *p++ = ATTRLEN-247*2+2;
47 	memcpy(p, data1 + 247*2, ATTRLEN-247*2); p += ATTRLEN-247*2;
48 
49 	*p++ = 20; *p++ = 6;
50 	memcpy(p, data2, 4); p += 4;
51 
52 
53 	radius_put_raw_attr(packet, 20, data2, sizeof(data2));
54 	radius_put_raw_attr_cat(packet, 10, data0, ATTRLEN);
55 	radius_put_vs_raw_attr_cat(packet, 20, 30, data1, ATTRLEN);
56 	radius_put_raw_attr(packet, 20, data2, sizeof(data2));
57 
58 	CHECK(radius_get_length(packet) == 20 + (p-attrs));
59 	CHECK(memcmp(radius_get_data(packet) + 20, attrs, p-attrs) == 0);
60 
61 	len = sizeof(buf);
62 	CHECK(radius_get_raw_attr_cat(packet, 10, buf, &len) == 0);
63 	CHECK(len == ATTRLEN);
64 	CHECK(memcmp(buf, data0, len) == 0);
65 
66 	len = sizeof(buf);
67 	CHECK(radius_get_vs_raw_attr_cat(packet, 20, 30, buf, &len) == 0);
68 	CHECK(len == ATTRLEN);
69 	CHECK(memcmp(buf, data1, len) == 0);
70 
71 	len = sizeof(buf);
72 	CHECK(radius_get_raw_attr_cat(packet, 20,buf, &len) == 0);
73 	CHECK(len == sizeof(data3));
74 	CHECK(memcmp(buf, data3, len) == 0);
75 }
76 
77 ADD_TEST(test04)
78