ipcloak 1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ext/ipcloak/extconf.rb +4 -0
- data/ext/ipcloak/ipcloak.c +157 -0
- metadata +59 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 564d9c1f985c90eb0157cff65e71032ab5e830c3
|
4
|
+
data.tar.gz: 663317070aed89a580ebf3f5bad415b71e5e9c0a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9985d473e2e0c784b82dfe082d8fa36804f7f26457b9323b75fe3c89aca6ca481f857d94cb8c784d09b1a6b2baa99790a3ca1d3e5dace28bbe01e8029ddfc70c
|
7
|
+
data.tar.gz: 64f1aec5a4b6e75aeb0814138ebcf8691ae33d51bf9b0bc671946fb34a9d3d9d804757f5420f8bdc89cf69449657119858e885272e79192e229049212928d480
|
@@ -0,0 +1,157 @@
|
|
1
|
+
/*
|
2
|
+
* Charybdis: an advanced ircd
|
3
|
+
* ip_cloaking.c: provide user hostname cloaking
|
4
|
+
*
|
5
|
+
* Written originally by nenolod, altered to use FNV by Elizabeth in 2008
|
6
|
+
* Altered to be a ruby module by Xe in 2017
|
7
|
+
*/
|
8
|
+
|
9
|
+
#include <ctype.h>
|
10
|
+
#include <ruby.h>
|
11
|
+
|
12
|
+
#define HOSTLEN 50
|
13
|
+
|
14
|
+
static void do_host_cloak_ip(const char *inbuf, char *outbuf);
|
15
|
+
static void do_host_cloak_host(const char *inbuf, char *outbuf);
|
16
|
+
|
17
|
+
VALUE Ipcloak = Qnil;
|
18
|
+
|
19
|
+
void Init_ipcloak();
|
20
|
+
VALUE method_ipcloak_ip(VALUE self, VALUE ipaddr);
|
21
|
+
VALUE method_ipcloak_host(VALUE self, VALUE host);
|
22
|
+
|
23
|
+
void Init_ipcloak() {
|
24
|
+
Ipcloak = rb_define_module("IPCloak");
|
25
|
+
rb_define_singleton_method(Ipcloak, "ip", method_ipcloak_ip, 1);
|
26
|
+
rb_define_singleton_method(Ipcloak, "host", method_ipcloak_host, 1);
|
27
|
+
}
|
28
|
+
|
29
|
+
/* Magic value for FNV hash functions */
|
30
|
+
#define FNV1_32_INIT 0x811c9dc5UL
|
31
|
+
|
32
|
+
u_int32_t
|
33
|
+
fnv_hash(const unsigned char *s, int bits)
|
34
|
+
{
|
35
|
+
u_int32_t h = FNV1_32_INIT;
|
36
|
+
|
37
|
+
while (*s) {
|
38
|
+
h ^= *s++;
|
39
|
+
h += (h<<1) + (h<<4) + (h<<7) + (h << 8) + (h << 24);
|
40
|
+
}
|
41
|
+
if (bits < 32)
|
42
|
+
h = ((h >> bits) ^ h) & ((1<<bits)-1);
|
43
|
+
return h;
|
44
|
+
}
|
45
|
+
|
46
|
+
static void
|
47
|
+
do_host_cloak_ip(const char *inbuf, char *outbuf)
|
48
|
+
{
|
49
|
+
/* None of the characters in this table can be valid in an IP */
|
50
|
+
char chartable[] = "ghijklmnopqrstuvwxyz";
|
51
|
+
char *tptr;
|
52
|
+
uint32_t accum = fnv_hash((const unsigned char*) inbuf, 32);
|
53
|
+
int sepcount = 0;
|
54
|
+
int totalcount = 0;
|
55
|
+
int ipv6 = 0;
|
56
|
+
|
57
|
+
strlcpy(outbuf, inbuf, HOSTLEN + 1);
|
58
|
+
|
59
|
+
if (strchr(outbuf, ':')) {
|
60
|
+
ipv6 = 1;
|
61
|
+
|
62
|
+
/* Damn you IPv6...
|
63
|
+
* We count the number of colons so we can calculate how much
|
64
|
+
* of the host to cloak. This is because some hostmasks may not
|
65
|
+
* have as many octets as we'd like.
|
66
|
+
*
|
67
|
+
* We have to do this ahead of time because doing this during
|
68
|
+
* the actual cloaking would get ugly
|
69
|
+
*/
|
70
|
+
for (tptr = outbuf; *tptr != '\0'; tptr++)
|
71
|
+
if (*tptr == ':')
|
72
|
+
totalcount++;
|
73
|
+
} else if (!strchr(outbuf, '.'))
|
74
|
+
return;
|
75
|
+
|
76
|
+
for (tptr = outbuf; *tptr != '\0'; tptr++) {
|
77
|
+
if (*tptr == ':' || *tptr == '.') {
|
78
|
+
sepcount++;
|
79
|
+
continue;
|
80
|
+
}
|
81
|
+
|
82
|
+
if (ipv6 && sepcount < totalcount / 2)
|
83
|
+
continue;
|
84
|
+
|
85
|
+
if (!ipv6 && sepcount < 2)
|
86
|
+
continue;
|
87
|
+
|
88
|
+
*tptr = chartable[(*tptr + accum) % 20];
|
89
|
+
accum = (accum << 1) | (accum >> 31);
|
90
|
+
}
|
91
|
+
}
|
92
|
+
|
93
|
+
static void
|
94
|
+
do_host_cloak_host(const char *inbuf, char *outbuf)
|
95
|
+
{
|
96
|
+
char b26_alphabet[] = "abcdefghijklmnopqrstuvwxyz";
|
97
|
+
char *tptr;
|
98
|
+
uint32_t accum = fnv_hash((const unsigned char*) inbuf, 32);
|
99
|
+
|
100
|
+
strlcpy(outbuf, inbuf, HOSTLEN + 1);
|
101
|
+
|
102
|
+
/* pass 1: scramble first section of hostname using base26
|
103
|
+
* alphabet toasted against the FNV hash of the string.
|
104
|
+
*
|
105
|
+
* numbers are not changed at this time, only letters.
|
106
|
+
*/
|
107
|
+
for (tptr = outbuf; *tptr != '\0'; tptr++) {
|
108
|
+
if (*tptr == '.')
|
109
|
+
break;
|
110
|
+
|
111
|
+
if (isdigit(*tptr) || *tptr == '-')
|
112
|
+
continue;
|
113
|
+
|
114
|
+
*tptr = b26_alphabet[(*tptr + accum) % 26];
|
115
|
+
|
116
|
+
/* Rotate one bit to avoid all digits being turned odd or even */
|
117
|
+
accum = (accum << 1) | (accum >> 31);
|
118
|
+
}
|
119
|
+
|
120
|
+
/* pass 2: scramble each number in the address */
|
121
|
+
for (tptr = outbuf; *tptr != '\0'; tptr++) {
|
122
|
+
if (isdigit(*tptr))
|
123
|
+
*tptr = '0' + (*tptr + accum) % 10;
|
124
|
+
|
125
|
+
accum = (accum << 1) | (accum >> 31);
|
126
|
+
}
|
127
|
+
}
|
128
|
+
|
129
|
+
VALUE method_ipcloak_ip(VALUE self, VALUE ip) {
|
130
|
+
char *data;
|
131
|
+
char res[HOSTLEN];
|
132
|
+
|
133
|
+
data = StringValueCStr(ip);
|
134
|
+
if (data == NULL) {
|
135
|
+
rb_raise(rb_eTypeError, "argument must be a string");
|
136
|
+
return Qnil;
|
137
|
+
}
|
138
|
+
|
139
|
+
do_host_cloak_ip(data, res);
|
140
|
+
|
141
|
+
return rb_str_new2(res);
|
142
|
+
}
|
143
|
+
|
144
|
+
VALUE method_ipcloak_host(VALUE self, VALUE host) {
|
145
|
+
char *data;
|
146
|
+
char res[HOSTLEN];
|
147
|
+
|
148
|
+
data = StringValueCStr(host);
|
149
|
+
if (data == NULL) {
|
150
|
+
rb_raise(rb_eTypeError, "argument must be a string");
|
151
|
+
return Qnil;
|
152
|
+
}
|
153
|
+
|
154
|
+
do_host_cloak_host(data, res);
|
155
|
+
|
156
|
+
return rb_str_new2(res);
|
157
|
+
}
|
metadata
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ipcloak
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '1.0'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Christine Dodrill
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-11-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake-compiler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description:
|
28
|
+
email:
|
29
|
+
executables: []
|
30
|
+
extensions:
|
31
|
+
- ext/ipcloak/extconf.rb
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ext/ipcloak/extconf.rb
|
35
|
+
- ext/ipcloak/ipcloak.c
|
36
|
+
homepage:
|
37
|
+
licenses: []
|
38
|
+
metadata: {}
|
39
|
+
post_install_message:
|
40
|
+
rdoc_options: []
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
requirements: []
|
54
|
+
rubyforge_project:
|
55
|
+
rubygems_version: 2.4.8
|
56
|
+
signing_key:
|
57
|
+
specification_version: 4
|
58
|
+
summary: IP scrambling for ruby developers
|
59
|
+
test_files: []
|