1 #include "randommod.h"
2 #include "byte.h"
3 #include "dns.h"
4 
swap(unsigned char * x,long long len,unsigned char * y)5 static void swap(unsigned char *x, long long len, unsigned char *y) {
6 
7     unsigned char t[33];
8 
9     byte_copy(t, len, x);
10     byte_copy(x, len, y);
11     byte_copy(y, len, t);
12 
13 }
14 
dns_sortip4(unsigned char * s,long long n)15 void dns_sortip4(unsigned char *s, long long n) {
16 
17     long long i;
18 
19     if (n < 0) return;
20 
21     n >>= 2;
22     while (n > 1) {
23         i = randommod(n);
24         --n;
25         swap(s + (i << 2), 4, s + (n << 2));
26     }
27 }
28 
dns_sortip(unsigned char * s,long long nn)29 void dns_sortip(unsigned char *s, long long nn) {
30 
31     long long i;
32     long long n = nn;
33 
34     if (nn < 0) return;
35 
36     n >>= 4;
37     while (n > 1) {
38         i = randommod(n);
39         --n;
40         swap(s + (i << 4), 16, s + (n << 4));
41     }
42 
43     for (i = 0; i + 16 <= nn; i += 16) {
44         if (!byte_isequal(s + i, 12, "\0\0\0\0\0\0\0\0\0\0\377\377")) {
45             swap(s + i, 16, s);
46             break;
47         }
48     }
49 }
50 
dns_sortipkey(unsigned char * s,unsigned char * t,long long nn)51 void dns_sortipkey(unsigned char *s, unsigned char *t, long long nn) {
52 
53     long long i, j, k;
54     long long n;
55     unsigned char *key;
56 
57     nn >>=4;
58     n = nn;
59 
60     while (n > 1) {
61         i = randommod(n);
62         --n;
63         swap(s + 16 * i, 16, s + 16 * n);
64         swap(t + 33 * i, 33, t + 33 * n);
65     }
66 
67     n = nn;
68     j = 0;
69     k = 0;
70     for (i = k; i < n; ++i) {
71         key = t + 33 * i;
72         if (key[0] == 1) {
73             swap(s + 16 * i, 16, s + 16 * j);
74             swap(t + 33 * i, 33, t + 33 * j);
75             ++j;
76         }
77     }
78     for (i = k; i < j; ++i) {
79         key = t + 33 * i;
80         if (key[0] != 1) continue;
81         if (!byte_isequal(s + 16 * i, 12, "\0\0\0\0\0\0\0\0\0\0\377\377")) {
82             swap(s + 16 * i, 16, s + 16 * k);
83             swap(t + 33 * i, 33, t + 33 * k);
84             break;
85         }
86     }
87 
88     k = j;
89     for (i = k; i < n; ++i) {
90         key = t + 33 * i;
91         if (key[0] == 2) {
92             swap(s + 16 * i, 16, s + 16 * j);
93             swap(t + 33 * i, 33, t + 33 * j);
94             ++j;
95         }
96     }
97     for (i = k; i < j; ++i) {
98         key = t + 33 * i;
99         if (key[0] != 2) continue;
100         if (!byte_isequal(s + 16 * i, 12, "\0\0\0\0\0\0\0\0\0\0\377\377")) {
101             swap(s + 16 * i, 16, s + 16 * k);
102             swap(t + 33 * i, 33, t + 33 * k);
103             break;
104         }
105     }
106 
107     k = j;
108     for (i = k; i < n; ++i) {
109         key = t + 33 * i;
110         if (!byte_isequal(s + 16 * i, 16, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")) {
111             swap(s + 16 * i, 16, s + 16 * j);
112             swap(t + 33 * i, 33, t + 33 * j);
113             ++j;
114         }
115     }
116     for (i = k; i < j; ++i) {
117         key = t + 33 * i;
118         if (key[0] != 0) continue;
119         if (!byte_isequal(s + 16 * i, 12, "\0\0\0\0\0\0\0\0\0\0\377\377")) {
120             swap(s + 16 * i, 16, s + 16 * k);
121             swap(t + 33 * i, 33, t + 33 * k);
122             break;
123         }
124     }
125 }
126