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