Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
com.ccwangluo.accelerator
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
sheteng
com.ccwangluo.accelerator
Commits
3d0fb53b
Commit
3d0fb53b
authored
Apr 19, 2013
by
Max Lv
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
remove old shadowsockcs-libev
parent
5bc30e97
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
0 additions
and
1701 deletions
+0
-1701
jni/shadowsocks/android.h
jni/shadowsocks/android.h
+0
-10
jni/shadowsocks/encrypt.c
jni/shadowsocks/encrypt.c
+0
-182
jni/shadowsocks/encrypt.h
jni/shadowsocks/encrypt.h
+0
-39
jni/shadowsocks/local.c
jni/shadowsocks/local.c
+0
-723
jni/shadowsocks/local.h
jni/shadowsocks/local.h
+0
-61
jni/shadowsocks/md5.c
jni/shadowsocks/md5.c
+0
-392
jni/shadowsocks/md5.h
jni/shadowsocks/md5.h
+0
-94
jni/shadowsocks/rc4.c
jni/shadowsocks/rc4.c
+0
-103
jni/shadowsocks/rc4.h
jni/shadowsocks/rc4.h
+0
-55
jni/shadowsocks/socks5.h
jni/shadowsocks/socks5.h
+0
-42
No files found.
jni/shadowsocks/android.h
deleted
100644 → 0
View file @
5bc30e97
#ifndef _ANDROID_H
#define _ANDROID_H
#include <android/log.h>
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, "shadowsocks", __VA_ARGS__))
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "shadowsocks", __VA_ARGS__))
#define perror(a) (LOGE("%s: %s", a, strerror(errno)))
#endif // _ANDROID_H
jni/shadowsocks/encrypt.c
deleted
100755 → 0
View file @
5bc30e97
#include "encrypt.h"
#include "android.h"
#define OFFSET_ROL(p, o) ((u_int64_t)(*(p + o)) << (8 * o))
static
int
random_compare
(
const
void
*
_x
,
const
void
*
_y
)
{
uint32_t
i
=
_i
;
uint64_t
a
=
_a
;
uint8_t
x
=
*
((
uint8_t
*
)
_x
);
uint8_t
y
=
*
((
uint8_t
*
)
_y
);
return
(
a
%
(
x
+
i
)
-
a
%
(
y
+
i
));
}
static
void
md5
(
const
uint8_t
*
text
,
uint8_t
*
digest
)
{
md5_state_t
state
;
md5_init
(
&
state
);
md5_append
(
&
state
,
text
,
strlen
((
char
*
)
text
));
md5_finish
(
&
state
,
digest
);
}
static
void
merge
(
uint8_t
*
left
,
int
llength
,
uint8_t
*
right
,
int
rlength
)
{
/* Temporary memory locations for the 2 segments of the array to merge. */
uint8_t
*
ltmp
=
(
uint8_t
*
)
malloc
(
llength
*
sizeof
(
uint8_t
));
uint8_t
*
rtmp
=
(
uint8_t
*
)
malloc
(
rlength
*
sizeof
(
uint8_t
));
/*
* Pointers to the elements being sorted in the temporary memory locations.
*/
uint8_t
*
ll
=
ltmp
;
uint8_t
*
rr
=
rtmp
;
uint8_t
*
result
=
left
;
/*
* Copy the segment of the array to be merged into the temporary memory
* locations.
*/
memcpy
(
ltmp
,
left
,
llength
*
sizeof
(
uint8_t
));
memcpy
(
rtmp
,
right
,
rlength
*
sizeof
(
uint8_t
));
while
(
llength
>
0
&&
rlength
>
0
)
{
if
(
random_compare
(
ll
,
rr
)
<=
0
)
{
/*
* Merge the first element from the left back into the main array
* if it is smaller or equal to the one on the right.
*/
*
result
=
*
ll
;
++
ll
;
--
llength
;
}
else
{
/*
* Merge the first element from the right back into the main array
* if it is smaller than the one on the left.
*/
*
result
=
*
rr
;
++
rr
;
--
rlength
;
}
++
result
;
}
/*
* All the elements from either the left or the right temporary array
* segment have been merged back into the main array. Append the remaining
* elements from the other temporary array back into the main array.
*/
if
(
llength
>
0
)
while
(
llength
>
0
)
{
/* Appending the rest of the left temporary array. */
*
result
=
*
ll
;
++
result
;
++
ll
;
--
llength
;
}
else
while
(
rlength
>
0
)
{
/* Appending the rest of the right temporary array. */
*
result
=
*
rr
;
++
result
;
++
rr
;
--
rlength
;
}
/* Release the memory used for the temporary arrays. */
free
(
ltmp
);
free
(
rtmp
);
}
static
void
merge_sort
(
uint8_t
array
[],
int
length
)
{
/* This is the middle index and also the length of the right array. */
uint8_t
middle
;
/*
* Pointers to the beginning of the left and right segment of the array
* to be merged.
*/
uint8_t
*
left
,
*
right
;
/* Length of the left segment of the array to be merged. */
int
llength
;
if
(
length
<=
1
)
return
;
/* Let integer division truncate the value. */
middle
=
length
/
2
;
llength
=
length
-
middle
;
/*
* Set the pointers to the appropriate segments of the array to be merged.
*/
left
=
array
;
right
=
array
+
llength
;
merge_sort
(
left
,
llength
);
merge_sort
(
right
,
middle
);
merge
(
left
,
llength
,
right
,
middle
);
}
void
encrypt
(
char
*
buf
,
int
len
,
struct
rc4_state
*
ctx
)
{
if
(
ctx
!=
NULL
)
{
rc4_crypt
(
ctx
,
(
uint8_t
*
)
buf
,
(
uint8_t
*
)
buf
,
len
);
}
else
{
char
*
end
=
buf
+
len
;
while
(
buf
<
end
)
{
*
buf
=
(
char
)
enc_ctx
.
table
.
encrypt_table
[(
uint8_t
)
*
buf
];
buf
++
;
}
}
}
void
decrypt
(
char
*
buf
,
int
len
,
struct
rc4_state
*
ctx
)
{
if
(
ctx
!=
NULL
)
{
rc4_crypt
(
ctx
,
(
uint8_t
*
)
buf
,
(
uint8_t
*
)
buf
,
len
);
}
else
{
char
*
end
=
buf
+
len
;
while
(
buf
<
end
)
{
*
buf
=
(
char
)
enc_ctx
.
table
.
decrypt_table
[(
uint8_t
)
*
buf
];
buf
++
;
}
}
}
void
enc_ctx_init
(
struct
rc4_state
*
ctx
,
int
enc
)
{
uint8_t
*
key
=
enc_ctx
.
rc4
.
key
;
int
key_len
=
enc_ctx
.
rc4
.
key_len
;
rc4_init
(
ctx
,
key
,
key_len
);
}
void
enc_key_init
(
const
char
*
pass
)
{
enc_ctx
.
rc4
.
key_len
=
16
;
enc_ctx
.
rc4
.
key
=
malloc
(
16
);
md5
((
const
uint8_t
*
)
pass
,
enc_ctx
.
rc4
.
key
);
}
void
get_table
(
const
char
*
pass
)
{
uint8_t
*
enc_table
=
malloc
(
256
);
uint8_t
*
dec_table
=
malloc
(
256
);
uint8_t
digest
[
16
];
uint32_t
i
;
md5
((
const
uint8_t
*
)
pass
,
digest
);
for
(
i
=
0
;
i
<
8
;
i
++
)
{
_a
+=
OFFSET_ROL
(
digest
,
i
);
}
for
(
i
=
0
;
i
<
256
;
++
i
)
{
enc_table
[
i
]
=
i
;
}
for
(
i
=
1
;
i
<
1024
;
++
i
)
{
_i
=
i
;
merge_sort
(
enc_table
,
256
);
}
for
(
i
=
0
;
i
<
256
;
++
i
)
{
// gen decrypt table from encrypt table
dec_table
[
enc_table
[
i
]]
=
i
;
}
enc_ctx
.
table
.
encrypt_table
=
enc_table
;
enc_ctx
.
table
.
decrypt_table
=
dec_table
;
}
jni/shadowsocks/encrypt.h
deleted
100755 → 0
View file @
5bc30e97
#ifndef _ENCRYPT_H
#define _ENCRYPT_H
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "md5.h"
#include "rc4.h"
#define BUF_SIZE 4096
#define TABLE 0
#define RC4 1
union
{
struct
{
uint8_t
*
encrypt_table
;
uint8_t
*
decrypt_table
;
}
table
;
struct
{
uint8_t
*
key
;
int
key_len
;
}
rc4
;
}
enc_ctx
;
void
get_table
(
const
char
*
key
);
void
encrypt
(
char
*
buf
,
int
len
,
struct
rc4_state
*
ctx
);
void
decrypt
(
char
*
buf
,
int
len
,
struct
rc4_state
*
ctx
);
void
enc_ctx_init
(
struct
rc4_state
*
ctx
,
int
enc
);
void
enc_key_init
(
const
char
*
pass
);
unsigned
int
_i
;
unsigned
long
long
_a
;
int
_method
;
#endif // _ENCRYPT_H
jni/shadowsocks/local.c
deleted
100644 → 0
View file @
5bc30e97
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <locale.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <time.h>
#include <unistd.h>
#include <assert.h>
#include <linux/limits.h>
#include "local.h"
#include "socks5.h"
#include "android.h"
#define min(a,b) (((a)<(b))?(a):(b))
static
char
*
_server
;
static
char
*
_remote_port
;
static
int
_timeout
;
int
setnonblocking
(
int
fd
)
{
int
flags
;
if
(
-
1
==
(
flags
=
fcntl
(
fd
,
F_GETFL
,
0
)))
flags
=
0
;
return
fcntl
(
fd
,
F_SETFL
,
flags
|
O_NONBLOCK
);
}
int
create_and_bind
(
const
char
*
port
)
{
struct
addrinfo
hints
;
struct
addrinfo
*
result
,
*
rp
;
int
s
,
listen_sock
;
memset
(
&
hints
,
0
,
sizeof
(
struct
addrinfo
));
hints
.
ai_family
=
AF_UNSPEC
;
/* Return IPv4 and IPv6 choices */
hints
.
ai_socktype
=
SOCK_STREAM
;
/* We want a TCP socket */
s
=
getaddrinfo
(
"0.0.0.0"
,
port
,
&
hints
,
&
result
);
if
(
s
!=
0
)
{
LOGD
(
"getaddrinfo: %s"
,
gai_strerror
(
s
));
return
-
1
;
}
for
(
rp
=
result
;
rp
!=
NULL
;
rp
=
rp
->
ai_next
)
{
listen_sock
=
socket
(
rp
->
ai_family
,
rp
->
ai_socktype
,
rp
->
ai_protocol
);
if
(
listen_sock
<
0
)
continue
;
int
opt
=
1
;
int
err
=
setsockopt
(
listen_sock
,
SOL_SOCKET
,
SO_REUSEADDR
,
&
opt
,
sizeof
(
opt
));
if
(
err
)
{
perror
(
"setsocket"
);
}
s
=
bind
(
listen_sock
,
rp
->
ai_addr
,
rp
->
ai_addrlen
);
if
(
s
==
0
)
{
/* We managed to bind successfully! */
break
;
}
else
{
perror
(
"bind"
);
}
close
(
listen_sock
);
}
if
(
rp
==
NULL
)
{
LOGE
(
"Could not bind"
);
return
-
1
;
}
freeaddrinfo
(
result
);
return
listen_sock
;
}
void
server_recv_cb
(
EV_P_
ev_io
*
w
,
int
revents
)
{
struct
server_ctx
*
server_recv_ctx
=
(
struct
server_ctx
*
)
w
;
struct
server
*
server
=
server_recv_ctx
->
server
;
struct
remote
*
remote
=
server
->
remote
;
if
(
remote
==
NULL
)
{
close_and_free_server
(
EV_A_
server
);
return
;
}
while
(
1
)
{
char
*
buf
=
remote
->
buf
;
int
*
buf_len
=
&
remote
->
buf_len
;
if
(
server
->
stage
!=
5
)
{
buf
=
server
->
buf
;
buf_len
=
&
server
->
buf_len
;
}
ssize_t
r
=
recv
(
server
->
fd
,
buf
,
BUF_SIZE
,
0
);
if
(
r
==
0
)
{
// connection closed
*
buf_len
=
0
;
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
return
;
}
else
if
(
r
<
0
)
{
if
(
errno
==
EAGAIN
)
{
// no data
// continue to wait for recv
break
;
}
else
{
perror
(
"server recv"
);
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
return
;
}
}
// local socks5 server
if
(
server
->
stage
==
5
)
{
encrypt
(
remote
->
buf
,
r
,
server
->
e_ctx
);
int
w
=
send
(
remote
->
fd
,
remote
->
buf
,
r
,
0
);
if
(
w
<
0
)
{
if
(
errno
==
EAGAIN
)
{
// no data, wait for send
remote
->
buf_len
=
r
;
ev_io_stop
(
EV_A_
&
server_recv_ctx
->
io
);
ev_io_start
(
EV_A_
&
remote
->
send_ctx
->
io
);
break
;
}
else
{
perror
(
"send"
);
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
return
;
}
}
else
if
(
w
<
r
)
{
char
*
pt
=
remote
->
buf
;
char
*
et
=
pt
+
r
;
while
(
pt
+
w
<
et
)
{
*
pt
=
*
(
pt
+
w
);
pt
++
;
}
remote
->
buf_len
=
r
-
w
;
assert
(
remote
->
buf_len
>=
0
);
ev_io_stop
(
EV_A_
&
server_recv_ctx
->
io
);
ev_io_start
(
EV_A_
&
remote
->
send_ctx
->
io
);
break
;
}
}
else
if
(
server
->
stage
==
0
)
{
struct
method_select_response
response
;
response
.
ver
=
VERSION
;
response
.
method
=
0
;
char
*
send_buf
=
(
char
*
)
&
response
;
send
(
server
->
fd
,
send_buf
,
sizeof
(
response
),
0
);
server
->
stage
=
1
;
return
;
}
else
if
(
server
->
stage
==
1
)
{
struct
socks5_request
*
request
=
(
struct
socks5_request
*
)
server
->
buf
;
if
(
request
->
cmd
!=
1
)
{
LOGE
(
"unsupported cmd: %d
\n
"
,
request
->
cmd
);
struct
socks5_response
response
;
response
.
ver
=
VERSION
;
response
.
rep
=
CMD_NOT_SUPPORTED
;
response
.
rsv
=
0
;
response
.
atyp
=
1
;
char
*
send_buf
=
(
char
*
)
&
response
;
send
(
server
->
fd
,
send_buf
,
4
,
0
);
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
return
;
}
char
addr_to_send
[
256
];
uint8_t
addr_len
=
0
;
addr_to_send
[
addr_len
++
]
=
request
->
atyp
;
// get remote addr and port
if
(
request
->
atyp
==
1
)
{
// IP V4
size_t
in_addr_len
=
sizeof
(
struct
in_addr
);
memcpy
(
addr_to_send
+
addr_len
,
server
->
buf
+
4
,
in_addr_len
+
2
);
addr_len
+=
in_addr_len
+
2
;
}
else
if
(
request
->
atyp
==
3
)
{
// Domain name
uint8_t
name_len
=
*
(
uint8_t
*
)(
server
->
buf
+
4
);
addr_to_send
[
addr_len
++
]
=
name_len
;
memcpy
(
addr_to_send
+
addr_len
,
server
->
buf
+
4
+
1
,
name_len
);
addr_len
+=
name_len
;
// get port
addr_to_send
[
addr_len
++
]
=
*
(
uint8_t
*
)(
server
->
buf
+
4
+
1
+
name_len
);
addr_to_send
[
addr_len
++
]
=
*
(
uint8_t
*
)(
server
->
buf
+
4
+
1
+
name_len
+
1
);
}
else
{
LOGE
(
"unsupported addrtype: %d
\n
"
,
request
->
atyp
);
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
return
;
}
encrypt
(
addr_to_send
,
addr_len
,
server
->
e_ctx
);
send
(
remote
->
fd
,
addr_to_send
,
addr_len
,
0
);
// Fake reply
struct
socks5_response
response
;
response
.
ver
=
VERSION
;
response
.
rep
=
0
;
response
.
rsv
=
0
;
response
.
atyp
=
1
;
struct
in_addr
sin_addr
;
inet_aton
(
"0.0.0.0"
,
&
sin_addr
);
memcpy
(
server
->
buf
,
&
response
,
4
);
memcpy
(
server
->
buf
+
4
,
&
sin_addr
,
sizeof
(
struct
in_addr
));
*
((
unsigned
short
*
)(
server
->
buf
+
4
+
sizeof
(
struct
in_addr
)))
=
(
unsigned
short
)
htons
(
atoi
(
_remote_port
));
int
reply_size
=
4
+
sizeof
(
struct
in_addr
)
+
sizeof
(
unsigned
short
);
int
r
=
send
(
server
->
fd
,
server
->
buf
,
reply_size
,
0
);
if
(
r
<
reply_size
)
{
LOGE
(
"header not complete sent
\n
"
);
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
return
;
}
server
->
stage
=
5
;
}
}
}
void
server_send_cb
(
EV_P_
ev_io
*
w
,
int
revents
)
{
struct
server_ctx
*
server_send_ctx
=
(
struct
server_ctx
*
)
w
;
struct
server
*
server
=
server_send_ctx
->
server
;
struct
remote
*
remote
=
server
->
remote
;
if
(
server
->
buf_len
==
0
)
{
// close and free
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
return
;
}
else
{
// has data to send
ssize_t
r
=
send
(
server
->
fd
,
server
->
buf
,
server
->
buf_len
,
0
);
if
(
r
<
0
)
{
if
(
errno
!=
EAGAIN
)
{
perror
(
"send"
);
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
}
return
;
}
if
(
r
<
server
->
buf_len
)
{
// partly sent, move memory, wait for the next time to send
char
*
pt
=
server
->
buf
;
char
*
et
=
pt
+
server
->
buf_len
;
while
(
pt
+
r
<
et
)
{
*
pt
=
*
(
pt
+
r
);
pt
++
;
}
server
->
buf_len
-=
r
;
assert
(
server
->
buf_len
>=
0
);
return
;
}
else
{
// all sent out, wait for reading
ev_io_stop
(
EV_A_
&
server_send_ctx
->
io
);
if
(
remote
!=
NULL
)
{
ev_io_start
(
EV_A_
&
remote
->
recv_ctx
->
io
);
}
else
{
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
return
;
}
}
}
}
void
remote_timeout_cb
(
EV_P_
ev_timer
*
watcher
,
int
revents
)
{
struct
remote_ctx
*
remote_ctx
=
(
struct
remote_ctx
*
)
(((
void
*
)
watcher
)
-
sizeof
(
ev_io
));
struct
remote
*
remote
=
remote_ctx
->
remote
;
struct
server
*
server
=
remote
->
server
;
LOGD
(
"remote timeout"
);
ev_timer_stop
(
EV_A_
watcher
);
if
(
server
==
NULL
)
{
close_and_free_remote
(
EV_A_
remote
);
return
;
}
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
}
void
remote_recv_cb
(
EV_P_
ev_io
*
w
,
int
revents
)
{
struct
remote_ctx
*
remote_recv_ctx
=
(
struct
remote_ctx
*
)
w
;
struct
remote
*
remote
=
remote_recv_ctx
->
remote
;
struct
server
*
server
=
remote
->
server
;
if
(
server
==
NULL
)
{
close_and_free_remote
(
EV_A_
remote
);
return
;
}
while
(
1
)
{
ssize_t
r
=
recv
(
remote
->
fd
,
server
->
buf
,
BUF_SIZE
,
0
);
if
(
r
==
0
)
{
// connection closed
server
->
buf_len
=
0
;
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
return
;
}
else
if
(
r
<
0
)
{
if
(
errno
==
EAGAIN
)
{
// no data
// continue to wait for recv
break
;
}
else
{
perror
(
"remote recv"
);
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
return
;
}
}
decrypt
(
server
->
buf
,
r
,
server
->
d_ctx
);
int
w
=
send
(
server
->
fd
,
server
->
buf
,
r
,
0
);
if
(
w
<
0
)
{
if
(
errno
==
EAGAIN
)
{
// no data, wait for send
server
->
buf_len
=
r
;
ev_io_stop
(
EV_A_
&
remote_recv_ctx
->
io
);
ev_io_start
(
EV_A_
&
server
->
send_ctx
->
io
);
break
;
}
else
{
perror
(
"send"
);
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
return
;
}
}
else
if
(
w
<
r
)
{
char
*
pt
=
server
->
buf
;
char
*
et
=
pt
+
r
;
while
(
pt
+
w
<
et
)
{
*
pt
=
*
(
pt
+
w
);
pt
++
;
}
server
->
buf_len
=
r
-
w
;
assert
(
server
->
buf_len
>=
0
);
ev_io_stop
(
EV_A_
&
remote_recv_ctx
->
io
);
ev_io_start
(
EV_A_
&
server
->
send_ctx
->
io
);
break
;
}
}
}
void
remote_send_cb
(
EV_P_
ev_io
*
w
,
int
revents
)
{
struct
remote_ctx
*
remote_send_ctx
=
(
struct
remote_ctx
*
)
w
;
struct
remote
*
remote
=
remote_send_ctx
->
remote
;
struct
server
*
server
=
remote
->
server
;
if
(
!
remote_send_ctx
->
connected
)
{
struct
sockaddr_storage
addr
;
socklen_t
len
=
sizeof
addr
;
int
r
=
getpeername
(
remote
->
fd
,
(
struct
sockaddr
*
)
&
addr
,
&
len
);
if
(
r
==
0
)
{
remote_send_ctx
->
connected
=
1
;
ev_io_stop
(
EV_A_
&
remote_send_ctx
->
io
);
ev_timer_stop
(
EV_A_
&
remote_send_ctx
->
watcher
);
ev_io_start
(
EV_A_
&
server
->
recv_ctx
->
io
);
ev_io_start
(
EV_A_
&
remote
->
recv_ctx
->
io
);
return
;
}
else
{
perror
(
"getpeername"
);
// not connected
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
return
;
}
}
else
{
if
(
remote
->
buf_len
==
0
)
{
// close and free
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
return
;
}
else
{
// has data to send
ssize_t
r
=
send
(
remote
->
fd
,
remote
->
buf
,
remote
->
buf_len
,
0
);
if
(
r
<
0
)
{
if
(
errno
!=
EAGAIN
)
{
perror
(
"send"
);
// close and free
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
}
return
;
}
if
(
r
<
remote
->
buf_len
)
{
// partly sent, move memory, wait for the next time to send
char
*
pt
=
remote
->
buf
;
char
*
et
=
pt
+
remote
->
buf_len
;
while
(
pt
+
r
<
et
)
{
*
pt
=
*
(
pt
+
r
);
pt
++
;
}
remote
->
buf_len
-=
r
;
assert
(
remote
->
buf_len
>=
0
);
return
;
}
else
{
// all sent out, wait for reading
ev_io_stop
(
EV_A_
&
remote_send_ctx
->
io
);
if
(
server
!=
NULL
)
{
ev_io_start
(
EV_A_
&
server
->
recv_ctx
->
io
);
}
else
{
close_and_free_remote
(
EV_A_
remote
);
close_and_free_server
(
EV_A_
server
);
return
;
}
}
}
}
}
struct
remote
*
new_remote
(
int
fd
)
{
struct
remote
*
remote
;
remote
=
malloc
(
sizeof
(
struct
remote
));
remote
->
recv_ctx
=
malloc
(
sizeof
(
struct
remote_ctx
));
remote
->
send_ctx
=
malloc
(
sizeof
(
struct
remote_ctx
));
remote
->
fd
=
fd
;
ev_io_init
(
&
remote
->
recv_ctx
->
io
,
remote_recv_cb
,
fd
,
EV_READ
);
ev_io_init
(
&
remote
->
send_ctx
->
io
,
remote_send_cb
,
fd
,
EV_WRITE
);
ev_timer_init
(
&
remote
->
send_ctx
->
watcher
,
remote_timeout_cb
,
_timeout
,
0
);
remote
->
recv_ctx
->
remote
=
remote
;
remote
->
recv_ctx
->
connected
=
0
;
remote
->
send_ctx
->
remote
=
remote
;
remote
->
send_ctx
->
connected
=
0
;
remote
->
buf_len
=
0
;
return
remote
;
}
void
free_remote
(
struct
remote
*
remote
)
{
if
(
remote
!=
NULL
)
{
if
(
remote
->
server
!=
NULL
)
{
remote
->
server
->
remote
=
NULL
;
}
free
(
remote
->
recv_ctx
);
free
(
remote
->
send_ctx
);
free
(
remote
);
}
}
void
close_and_free_remote
(
EV_P_
struct
remote
*
remote
)
{
if
(
remote
!=
NULL
)
{
ev_timer_stop
(
EV_A_
&
remote
->
send_ctx
->
watcher
);
ev_io_stop
(
EV_A_
&
remote
->
send_ctx
->
io
);
ev_io_stop
(
EV_A_
&
remote
->
recv_ctx
->
io
);
close
(
remote
->
fd
);
free_remote
(
remote
);
}
}
struct
server
*
new_server
(
int
fd
)
{
struct
server
*
server
;
server
=
malloc
(
sizeof
(
struct
server
));
server
->
recv_ctx
=
malloc
(
sizeof
(
struct
server_ctx
));
server
->
send_ctx
=
malloc
(
sizeof
(
struct
server_ctx
));
server
->
fd
=
fd
;
ev_io_init
(
&
server
->
recv_ctx
->
io
,
server_recv_cb
,
fd
,
EV_READ
);
ev_io_init
(
&
server
->
send_ctx
->
io
,
server_send_cb
,
fd
,
EV_WRITE
);
server
->
recv_ctx
->
server
=
server
;
server
->
recv_ctx
->
connected
=
0
;
server
->
send_ctx
->
server
=
server
;
server
->
send_ctx
->
connected
=
0
;
server
->
stage
=
0
;
if
(
_method
==
RC4
)
{
server
->
e_ctx
=
malloc
(
sizeof
(
struct
rc4_state
));
server
->
d_ctx
=
malloc
(
sizeof
(
struct
rc4_state
));
enc_ctx_init
(
server
->
e_ctx
,
1
);
enc_ctx_init
(
server
->
d_ctx
,
0
);
}
else
{
server
->
e_ctx
=
NULL
;
server
->
d_ctx
=
NULL
;
}
server
->
buf_len
=
0
;
return
server
;
}
void
free_server
(
struct
server
*
server
)
{
if
(
server
!=
NULL
)
{
if
(
server
->
remote
!=
NULL
)
{
server
->
remote
->
server
=
NULL
;
}
if
(
_method
==
RC4
)
{
free
(
server
->
e_ctx
);
free
(
server
->
d_ctx
);
}
free
(
server
->
recv_ctx
);
free
(
server
->
send_ctx
);
free
(
server
);
}
}
void
close_and_free_server
(
EV_P_
struct
server
*
server
)
{
if
(
server
!=
NULL
)
{
ev_io_stop
(
EV_A_
&
server
->
send_ctx
->
io
);
ev_io_stop
(
EV_A_
&
server
->
recv_ctx
->
io
);
close
(
server
->
fd
);
free_server
(
server
);
}
}
void
accept_cb
(
EV_P_
ev_io
*
w
,
int
revents
)
{
struct
listen_ctx
*
listener
=
(
struct
listen_ctx
*
)
w
;
int
serverfd
;
serverfd
=
accept
(
listener
->
fd
,
NULL
,
NULL
);
if
(
serverfd
<
0
)
{
perror
(
"accept"
);
return
;
}
setnonblocking
(
serverfd
);
struct
addrinfo
hints
,
*
res
;
int
sockfd
;
memset
(
&
hints
,
0
,
sizeof
hints
);
hints
.
ai_family
=
AF_UNSPEC
;
hints
.
ai_socktype
=
SOCK_STREAM
;
int
err
=
getaddrinfo
(
_server
,
_remote_port
,
&
hints
,
&
res
);
if
(
err
)
{
perror
(
"getaddrinfo"
);
return
;
}
sockfd
=
socket
(
res
->
ai_family
,
res
->
ai_socktype
,
res
->
ai_protocol
);
if
(
sockfd
<
0
)
{
perror
(
"socket"
);
close
(
sockfd
);
freeaddrinfo
(
res
);
return
;
}
struct
timeval
timeout
;
timeout
.
tv_sec
=
_timeout
;
timeout
.
tv_usec
=
0
;
err
=
setsockopt
(
sockfd
,
SOL_SOCKET
,
SO_RCVTIMEO
,
(
char
*
)
&
timeout
,
sizeof
(
timeout
));
if
(
err
)
perror
(
"setsockopt"
);
err
=
setsockopt
(
sockfd
,
SOL_SOCKET
,
SO_SNDTIMEO
,
(
char
*
)
&
timeout
,
sizeof
(
timeout
));
if
(
err
)
perror
(
"setsockopt"
);
setnonblocking
(
sockfd
);
struct
server
*
server
=
new_server
(
serverfd
);
struct
remote
*
remote
=
new_remote
(
sockfd
);
server
->
remote
=
remote
;
remote
->
server
=
server
;
connect
(
sockfd
,
res
->
ai_addr
,
res
->
ai_addrlen
);
freeaddrinfo
(
res
);
// listen to remote connected event
ev_io_start
(
EV_A_
&
remote
->
send_ctx
->
io
);
ev_timer_start
(
EV_A_
&
remote
->
send_ctx
->
watcher
);
}
static
void
print_usage
()
{
printf
(
"usage: ss -s server_host -p server_port -l local_port
\n
"
);
printf
(
" -k password [-m encrypt_method] [-f pid_file]
\n
"
);
printf
(
"
\n
"
);
printf
(
"info:
\n
"
);
printf
(
" encrypt_method: table, rc4
\n
"
);
printf
(
" pid_file: valid path to the pid file
\n
"
);
}
int
main
(
int
argc
,
char
**
argv
)
{
char
*
server
=
NULL
;
char
*
remote_port
=
NULL
;
char
*
port
=
NULL
;
char
*
key
=
NULL
;
char
*
timeout
=
"10"
;
char
*
method
=
NULL
;
int
c
;
int
f_flags
=
0
;
opterr
=
0
;
while
((
c
=
getopt
(
argc
,
argv
,
"fs:p:l:k:t:m:"
))
!=
-
1
)
{
switch
(
c
)
{
case
's'
:
server
=
optarg
;
break
;
case
'p'
:
remote_port
=
optarg
;
break
;
case
'l'
:
port
=
optarg
;
break
;
case
'k'
:
key
=
optarg
;
break
;
case
'f'
:
f_flags
=
1
;
break
;
case
't'
:
timeout
=
optarg
;
break
;
case
'm'
:
method
=
optarg
;
break
;
}
}
if
(
server
==
NULL
||
remote_port
==
NULL
||
port
==
NULL
||
key
==
NULL
)
{
print_usage
();
exit
(
EXIT_FAILURE
);
}
if
(
f_flags
)
{
/* Our process ID and Session ID */
pid_t
pid
,
sid
;
/* Fork off the parent process */
pid
=
fork
();
if
(
pid
<
0
)
{
exit
(
EXIT_FAILURE
);
}
/* If we got a good PID, then
we can exit the parent process. */
if
(
pid
>
0
)
{
FILE
*
file
=
fopen
(
"/data/data/com.github.shadowsocks/shadowsocks.pid"
,
"w"
);
fprintf
(
file
,
"%d"
,
pid
);
fclose
(
file
);
exit
(
EXIT_SUCCESS
);
}
/* Change the file mode mask */
umask
(
0
);
/* Open any logs here */
/* Create a new SID for the child process */
sid
=
setsid
();
if
(
sid
<
0
)
{
/* Log the failure */
exit
(
EXIT_FAILURE
);
}
/* Change the current working directory */
if
((
chdir
(
"/"
))
<
0
)
{
/* Log the failure */
exit
(
EXIT_FAILURE
);
}
/* Close out the standard file descriptors */
close
(
STDIN_FILENO
);
close
(
STDOUT_FILENO
);
close
(
STDERR_FILENO
);
}
else
{
pid_t
pid
=
getpid
();
FILE
*
file
=
fopen
(
"/data/data/com.github.shadowsocks/shadowsocks.pid"
,
"w"
);
fprintf
(
file
,
"%d"
,
pid
);
fclose
(
file
);
}
signal
(
SIGPIPE
,
SIG_IGN
);
// init global variables
_server
=
strdup
(
server
);
_remote_port
=
strdup
(
remote_port
);
_timeout
=
atoi
(
timeout
);
_method
=
TABLE
;
if
(
method
!=
NULL
)
{
if
(
strcmp
(
method
,
"rc4"
)
==
0
)
{
_method
=
RC4
;
}
}
LOGD
(
"calculating ciphers %d"
,
_method
);
if
(
_method
==
RC4
)
{
enc_key_init
(
key
);
}
else
{
get_table
(
key
);
}
int
listenfd
;
listenfd
=
create_and_bind
(
port
);
if
(
listenfd
<
0
)
{
LOGE
(
"bind() error.."
);
return
1
;
}
if
(
listen
(
listenfd
,
SOMAXCONN
)
<
0
)
{
LOGE
(
"listen() error."
);
return
1
;
}
LOGD
(
"server listening at port %s
\n
"
,
port
);
setnonblocking
(
listenfd
);
struct
listen_ctx
listen_ctx
;
listen_ctx
.
fd
=
listenfd
;
struct
ev_loop
*
loop
=
ev_default_loop
(
0
);
if
(
!
loop
)
{
LOGE
(
"no epoll found here, maybe it hides under your chair"
);
return
1
;
}
ev_io_init
(
&
listen_ctx
.
io
,
accept_cb
,
listenfd
,
EV_READ
);
ev_io_start
(
loop
,
&
listen_ctx
.
io
);
ev_run
(
loop
,
0
);
return
0
;
}
jni/shadowsocks/local.h
deleted
100644 → 0
View file @
5bc30e97
#ifndef _LOCAL_H
#define _LOCAL_H
#include <ev.h>
#include "encrypt.h"
struct
listen_ctx
{
ev_io
io
;
int
fd
;
struct
sockaddr
sock
;
};
struct
server_ctx
{
ev_io
io
;
int
connected
;
struct
server
*
server
;
};
struct
server
{
int
fd
;
char
buf
[
BUF_SIZE
];
// server send from, remote recv into
char
stage
;
int
buf_len
;
struct
rc4_state
*
e_ctx
;
struct
rc4_state
*
d_ctx
;
struct
server_ctx
*
recv_ctx
;
struct
server_ctx
*
send_ctx
;
struct
remote
*
remote
;
};
struct
remote_ctx
{
ev_io
io
;
ev_timer
watcher
;
int
connected
;
struct
remote
*
remote
;
};
struct
remote
{
int
fd
;
char
buf
[
BUF_SIZE
];
// remote send from, server recv into
int
buf_len
;
struct
remote_ctx
*
recv_ctx
;
struct
remote_ctx
*
send_ctx
;
struct
server
*
server
;
};
static
void
accept_cb
(
EV_P_
ev_io
*
w
,
int
revents
);
static
void
server_recv_cb
(
EV_P_
ev_io
*
w
,
int
revents
);
static
void
server_send_cb
(
EV_P_
ev_io
*
w
,
int
revents
);
static
void
remote_recv_cb
(
EV_P_
ev_io
*
w
,
int
revents
);
static
void
remote_send_cb
(
EV_P_
ev_io
*
w
,
int
revents
);
struct
remote
*
new_remote
(
int
fd
);
void
free_remote
(
struct
remote
*
remote
);
void
close_and_free_remote
(
EV_P_
struct
remote
*
remote
);
struct
server
*
new_server
(
int
fd
);
void
free_server
(
struct
server
*
server
);
void
close_and_free_server
(
EV_P_
struct
server
*
server
);
#endif // _LOCAL_H
jni/shadowsocks/md5.c
deleted
100644 → 0
View file @
5bc30e97
/*
Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
L. Peter Deutsch
ghost@aladdin.com
*/
/*$Id: md5.c,v 1.1.1.1 2001/10/18 22:50:24 jlovell Exp $ */
/*
Independent implementation of MD5 (RFC 1321).
This code implements the MD5 Algorithm defined in RFC 1321.
It is derived directly from the text of the RFC and not from the
reference implementation.
The original and principal author of md5.c is L. Peter Deutsch
<ghost@aladdin.com>. Other authors are noted in the change history
that follows (in reverse chronological order):
1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
1999-05-03 lpd Original version.
*/
#include "md5.h"
#include "string.h"
#ifdef TEST
/*
* Compile with -DTEST to create a self-contained executable test program.
* The test program should print out the same values as given in section
* A.5 of RFC 1321, reproduced below.
*/
main
()
{
static
const
char
*
const
test
[
7
]
=
{
""
,
/*d41d8cd98f00b204e9800998ecf8427e*/
"a"
,
/*0cc175b9c0f1b6a831c399e269772661*/
"abc"
,
/*900150983cd24fb0d6963f7d28e17f72*/
"message digest"
,
/*f96b697d7cb7938d525a2f31aaf161d0*/
"abcdefghijklmnopqrstuvwxyz"
,
/*c3fcd3d76192e4007dfb496cca67e13b*/
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
,
/*d174ab98d277d9f5a5611c2c9f419d9f*/
"12345678901234567890123456789012345678901234567890123456789012345678901234567890"
/*57edf4a22be3c955ac49da2e2107b67a*/
};
int
i
;
for
(
i
=
0
;
i
<
7
;
++
i
)
{
md5_state_t
state
;
md5_byte_t
digest
[
16
];
int
di
;
md5_init
(
&
state
);
md5_append
(
&
state
,
(
const
md5_byte_t
*
)
test
[
i
],
strlen
(
test
[
i
]));
md5_finish
(
&
state
,
digest
);
printf
(
"MD5 (
\"
%s
\"
) = "
,
test
[
i
]);
for
(
di
=
0
;
di
<
16
;
++
di
)
printf
(
"%02x"
,
digest
[
di
]);
printf
(
"
\n
"
);
}
return
0
;
}
#endif
/* TEST */
/*
* For reference, here is the program that computed the T values.
*/
#if 0
#include <math.h>
main()
{
int i;
for (i = 1; i <= 64; ++i) {
unsigned long v = (unsigned long)(4294967296.0 * fabs(sin((double)i)));
printf("#define T%d 0x%08lx\n", i, v);
}
return 0;
}
#endif
/*
* End of T computation program.
*/
#define T1 0xd76aa478
#define T2 0xe8c7b756
#define T3 0x242070db
#define T4 0xc1bdceee
#define T5 0xf57c0faf
#define T6 0x4787c62a
#define T7 0xa8304613
#define T8 0xfd469501
#define T9 0x698098d8
#define T10 0x8b44f7af
#define T11 0xffff5bb1
#define T12 0x895cd7be
#define T13 0x6b901122
#define T14 0xfd987193
#define T15 0xa679438e
#define T16 0x49b40821
#define T17 0xf61e2562
#define T18 0xc040b340
#define T19 0x265e5a51
#define T20 0xe9b6c7aa
#define T21 0xd62f105d
#define T22 0x02441453
#define T23 0xd8a1e681
#define T24 0xe7d3fbc8
#define T25 0x21e1cde6
#define T26 0xc33707d6
#define T27 0xf4d50d87
#define T28 0x455a14ed
#define T29 0xa9e3e905
#define T30 0xfcefa3f8
#define T31 0x676f02d9
#define T32 0x8d2a4c8a
#define T33 0xfffa3942
#define T34 0x8771f681
#define T35 0x6d9d6122
#define T36 0xfde5380c
#define T37 0xa4beea44
#define T38 0x4bdecfa9
#define T39 0xf6bb4b60
#define T40 0xbebfbc70
#define T41 0x289b7ec6
#define T42 0xeaa127fa
#define T43 0xd4ef3085
#define T44 0x04881d05
#define T45 0xd9d4d039
#define T46 0xe6db99e5
#define T47 0x1fa27cf8
#define T48 0xc4ac5665
#define T49 0xf4292244
#define T50 0x432aff97
#define T51 0xab9423a7
#define T52 0xfc93a039
#define T53 0x655b59c3
#define T54 0x8f0ccc92
#define T55 0xffeff47d
#define T56 0x85845dd1
#define T57 0x6fa87e4f
#define T58 0xfe2ce6e0
#define T59 0xa3014314
#define T60 0x4e0811a1
#define T61 0xf7537e82
#define T62 0xbd3af235
#define T63 0x2ad7d2bb
#define T64 0xeb86d391
static
void
md5_process
(
md5_state_t
*
pms
,
const
md5_byte_t
*
data
/*[64]*/
)
{
md5_word_t
a
=
pms
->
abcd
[
0
],
b
=
pms
->
abcd
[
1
],
c
=
pms
->
abcd
[
2
],
d
=
pms
->
abcd
[
3
];
md5_word_t
t
;
#ifndef ARCH_IS_BIG_ENDIAN
# define ARCH_IS_BIG_ENDIAN 1
/* slower, default implementation */
#endif
#if ARCH_IS_BIG_ENDIAN
/*
* On big-endian machines, we must arrange the bytes in the right
* order. (This also works on machines of unknown byte order.)
*/
md5_word_t
X
[
16
];
const
md5_byte_t
*
xp
=
data
;
int
i
;
for
(
i
=
0
;
i
<
16
;
++
i
,
xp
+=
4
)
X
[
i
]
=
xp
[
0
]
+
(
xp
[
1
]
<<
8
)
+
(
xp
[
2
]
<<
16
)
+
(
xp
[
3
]
<<
24
);
#else
/* !ARCH_IS_BIG_ENDIAN */
/*
* On little-endian machines, we can process properly aligned data
* without copying it.
*/
md5_word_t
xbuf
[
16
];
const
md5_word_t
*
X
;
if
(
!
((
data
-
(
const
md5_byte_t
*
)
0
)
&
3
))
{
/* data are properly aligned */
X
=
(
const
md5_word_t
*
)
data
;
}
else
{
/* not aligned */
memcpy
(
xbuf
,
data
,
64
);
X
=
xbuf
;
}
#endif
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
/* Round 1. */
/* Let [abcd k s i] denote the operation
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
#define SET(a, b, c, d, k, s, Ti)\
t = a + F(b,c,d) + X[k] + Ti;\
a = ROTATE_LEFT(t, s) + b
/* Do the following 16 operations. */
SET
(
a
,
b
,
c
,
d
,
0
,
7
,
T1
);
SET
(
d
,
a
,
b
,
c
,
1
,
12
,
T2
);
SET
(
c
,
d
,
a
,
b
,
2
,
17
,
T3
);
SET
(
b
,
c
,
d
,
a
,
3
,
22
,
T4
);
SET
(
a
,
b
,
c
,
d
,
4
,
7
,
T5
);
SET
(
d
,
a
,
b
,
c
,
5
,
12
,
T6
);
SET
(
c
,
d
,
a
,
b
,
6
,
17
,
T7
);
SET
(
b
,
c
,
d
,
a
,
7
,
22
,
T8
);
SET
(
a
,
b
,
c
,
d
,
8
,
7
,
T9
);
SET
(
d
,
a
,
b
,
c
,
9
,
12
,
T10
);
SET
(
c
,
d
,
a
,
b
,
10
,
17
,
T11
);
SET
(
b
,
c
,
d
,
a
,
11
,
22
,
T12
);
SET
(
a
,
b
,
c
,
d
,
12
,
7
,
T13
);
SET
(
d
,
a
,
b
,
c
,
13
,
12
,
T14
);
SET
(
c
,
d
,
a
,
b
,
14
,
17
,
T15
);
SET
(
b
,
c
,
d
,
a
,
15
,
22
,
T16
);
#undef SET
/* Round 2. */
/* Let [abcd k s i] denote the operation
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
#define SET(a, b, c, d, k, s, Ti)\
t = a + G(b,c,d) + X[k] + Ti;\
a = ROTATE_LEFT(t, s) + b
/* Do the following 16 operations. */
SET
(
a
,
b
,
c
,
d
,
1
,
5
,
T17
);
SET
(
d
,
a
,
b
,
c
,
6
,
9
,
T18
);
SET
(
c
,
d
,
a
,
b
,
11
,
14
,
T19
);
SET
(
b
,
c
,
d
,
a
,
0
,
20
,
T20
);
SET
(
a
,
b
,
c
,
d
,
5
,
5
,
T21
);
SET
(
d
,
a
,
b
,
c
,
10
,
9
,
T22
);
SET
(
c
,
d
,
a
,
b
,
15
,
14
,
T23
);
SET
(
b
,
c
,
d
,
a
,
4
,
20
,
T24
);
SET
(
a
,
b
,
c
,
d
,
9
,
5
,
T25
);
SET
(
d
,
a
,
b
,
c
,
14
,
9
,
T26
);
SET
(
c
,
d
,
a
,
b
,
3
,
14
,
T27
);
SET
(
b
,
c
,
d
,
a
,
8
,
20
,
T28
);
SET
(
a
,
b
,
c
,
d
,
13
,
5
,
T29
);
SET
(
d
,
a
,
b
,
c
,
2
,
9
,
T30
);
SET
(
c
,
d
,
a
,
b
,
7
,
14
,
T31
);
SET
(
b
,
c
,
d
,
a
,
12
,
20
,
T32
);
#undef SET
/* Round 3. */
/* Let [abcd k s t] denote the operation
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define SET(a, b, c, d, k, s, Ti)\
t = a + H(b,c,d) + X[k] + Ti;\
a = ROTATE_LEFT(t, s) + b
/* Do the following 16 operations. */
SET
(
a
,
b
,
c
,
d
,
5
,
4
,
T33
);
SET
(
d
,
a
,
b
,
c
,
8
,
11
,
T34
);
SET
(
c
,
d
,
a
,
b
,
11
,
16
,
T35
);
SET
(
b
,
c
,
d
,
a
,
14
,
23
,
T36
);
SET
(
a
,
b
,
c
,
d
,
1
,
4
,
T37
);
SET
(
d
,
a
,
b
,
c
,
4
,
11
,
T38
);
SET
(
c
,
d
,
a
,
b
,
7
,
16
,
T39
);
SET
(
b
,
c
,
d
,
a
,
10
,
23
,
T40
);
SET
(
a
,
b
,
c
,
d
,
13
,
4
,
T41
);
SET
(
d
,
a
,
b
,
c
,
0
,
11
,
T42
);
SET
(
c
,
d
,
a
,
b
,
3
,
16
,
T43
);
SET
(
b
,
c
,
d
,
a
,
6
,
23
,
T44
);
SET
(
a
,
b
,
c
,
d
,
9
,
4
,
T45
);
SET
(
d
,
a
,
b
,
c
,
12
,
11
,
T46
);
SET
(
c
,
d
,
a
,
b
,
15
,
16
,
T47
);
SET
(
b
,
c
,
d
,
a
,
2
,
23
,
T48
);
#undef SET
/* Round 4. */
/* Let [abcd k s t] denote the operation
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
#define I(x, y, z) ((y) ^ ((x) | ~(z)))
#define SET(a, b, c, d, k, s, Ti)\
t = a + I(b,c,d) + X[k] + Ti;\
a = ROTATE_LEFT(t, s) + b
/* Do the following 16 operations. */
SET
(
a
,
b
,
c
,
d
,
0
,
6
,
T49
);
SET
(
d
,
a
,
b
,
c
,
7
,
10
,
T50
);
SET
(
c
,
d
,
a
,
b
,
14
,
15
,
T51
);
SET
(
b
,
c
,
d
,
a
,
5
,
21
,
T52
);
SET
(
a
,
b
,
c
,
d
,
12
,
6
,
T53
);
SET
(
d
,
a
,
b
,
c
,
3
,
10
,
T54
);
SET
(
c
,
d
,
a
,
b
,
10
,
15
,
T55
);
SET
(
b
,
c
,
d
,
a
,
1
,
21
,
T56
);
SET
(
a
,
b
,
c
,
d
,
8
,
6
,
T57
);
SET
(
d
,
a
,
b
,
c
,
15
,
10
,
T58
);
SET
(
c
,
d
,
a
,
b
,
6
,
15
,
T59
);
SET
(
b
,
c
,
d
,
a
,
13
,
21
,
T60
);
SET
(
a
,
b
,
c
,
d
,
4
,
6
,
T61
);
SET
(
d
,
a
,
b
,
c
,
11
,
10
,
T62
);
SET
(
c
,
d
,
a
,
b
,
2
,
15
,
T63
);
SET
(
b
,
c
,
d
,
a
,
9
,
21
,
T64
);
#undef SET
/* Then perform the following additions. (That is increment each
of the four registers by the value it had before this block
was started.) */
pms
->
abcd
[
0
]
+=
a
;
pms
->
abcd
[
1
]
+=
b
;
pms
->
abcd
[
2
]
+=
c
;
pms
->
abcd
[
3
]
+=
d
;
}
void
md5_init
(
md5_state_t
*
pms
)
{
pms
->
count
[
0
]
=
pms
->
count
[
1
]
=
0
;
pms
->
abcd
[
0
]
=
0x67452301
;
pms
->
abcd
[
1
]
=
0xefcdab89
;
pms
->
abcd
[
2
]
=
0x98badcfe
;
pms
->
abcd
[
3
]
=
0x10325476
;
}
void
md5_append
(
md5_state_t
*
pms
,
const
md5_byte_t
*
data
,
int
nbytes
)
{
const
md5_byte_t
*
p
=
data
;
int
left
=
nbytes
;
int
offset
=
(
pms
->
count
[
0
]
>>
3
)
&
63
;
md5_word_t
nbits
=
(
md5_word_t
)(
nbytes
<<
3
);
if
(
nbytes
<=
0
)
return
;
/* Update the message length. */
pms
->
count
[
1
]
+=
nbytes
>>
29
;
pms
->
count
[
0
]
+=
nbits
;
if
(
pms
->
count
[
0
]
<
nbits
)
pms
->
count
[
1
]
++
;
/* Process an initial partial block. */
if
(
offset
)
{
int
copy
=
(
offset
+
nbytes
>
64
?
64
-
offset
:
nbytes
);
memcpy
(
pms
->
buf
+
offset
,
p
,
copy
);
if
(
offset
+
copy
<
64
)
return
;
p
+=
copy
;
left
-=
copy
;
md5_process
(
pms
,
pms
->
buf
);
}
/* Process full blocks. */
for
(;
left
>=
64
;
p
+=
64
,
left
-=
64
)
md5_process
(
pms
,
p
);
/* Process a final partial block. */
if
(
left
)
memcpy
(
pms
->
buf
,
p
,
left
);
}
void
md5_finish
(
md5_state_t
*
pms
,
md5_byte_t
digest
[
16
])
{
static
const
md5_byte_t
pad
[
64
]
=
{
0x80
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
};
md5_byte_t
data
[
8
];
int
i
;
/* Save the length before padding. */
for
(
i
=
0
;
i
<
8
;
++
i
)
data
[
i
]
=
(
md5_byte_t
)(
pms
->
count
[
i
>>
2
]
>>
((
i
&
3
)
<<
3
));
/* Pad to 56 bytes mod 64. */
md5_append
(
pms
,
pad
,
((
55
-
(
pms
->
count
[
0
]
>>
3
))
&
63
)
+
1
);
/* Append the length. */
md5_append
(
pms
,
data
,
8
);
for
(
i
=
0
;
i
<
16
;
++
i
)
digest
[
i
]
=
(
md5_byte_t
)(
pms
->
abcd
[
i
>>
2
]
>>
((
i
&
3
)
<<
3
));
}
jni/shadowsocks/md5.h
deleted
100644 → 0
View file @
5bc30e97
/*
Copyright (C) 1999 Aladdin Enterprises. All rights reserved.
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
L. Peter Deutsch
ghost@aladdin.com
*/
/*$Id: md5.h,v 1.1.1.1 2001/10/18 22:50:24 jlovell Exp $ */
/*
Independent implementation of MD5 (RFC 1321).
This code implements the MD5 Algorithm defined in RFC 1321.
It is derived directly from the text of the RFC and not from the
reference implementation.
The original and principal author of md5.h is L. Peter Deutsch
<ghost@aladdin.com>. Other authors are noted in the change history
that follows (in reverse chronological order):
1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5);
added conditionalization for C++ compilation from Martin
Purschke <purschke@bnl.gov>.
1999-05-03 lpd Original version.
*/
#ifndef md5_INCLUDED
# define md5_INCLUDED
/*
* This code has some adaptations for the Ghostscript environment, but it
* will compile and run correctly in any environment with 8-bit chars and
* 32-bit ints. Specifically, it assumes that if the following are
* defined, they have the same meaning as in Ghostscript: P1, P2, P3,
* ARCH_IS_BIG_ENDIAN.
*/
typedef
unsigned
char
md5_byte_t
;
/* 8-bit byte */
typedef
unsigned
int
md5_word_t
;
/* 32-bit word */
/* Define the state of the MD5 Algorithm. */
typedef
struct
md5_state_s
{
md5_word_t
count
[
2
];
/* message length in bits, lsw first */
md5_word_t
abcd
[
4
];
/* digest buffer */
md5_byte_t
buf
[
64
];
/* accumulate block */
}
md5_state_t
;
#ifdef __cplusplus
extern
"C"
{
#endif
/* Initialize the algorithm. */
#ifdef P1
void
md5_init
(
P1
(
md5_state_t
*
pms
));
#else
void
md5_init
(
md5_state_t
*
pms
);
#endif
/* Append a string to the message. */
#ifdef P3
void
md5_append
(
P3
(
md5_state_t
*
pms
,
const
md5_byte_t
*
data
,
int
nbytes
));
#else
void
md5_append
(
md5_state_t
*
pms
,
const
md5_byte_t
*
data
,
int
nbytes
);
#endif
/* Finish the message and return the digest. */
#ifdef P2
void
md5_finish
(
P2
(
md5_state_t
*
pms
,
md5_byte_t
digest
[
16
]));
#else
void
md5_finish
(
md5_state_t
*
pms
,
md5_byte_t
digest
[
16
]);
#endif
#ifdef __cplusplus
}
/* end extern "C" */
#endif
#endif
/* md5_INCLUDED */
jni/shadowsocks/rc4.c
deleted
100644 → 0
View file @
5bc30e97
/*
* rc4.c
*
* Copyright (c) 1996-2000 Whistle Communications, Inc.
* All rights reserved.
*
* Subject to the following obligations and disclaimer of warranty, use and
* redistribution of this software, in source or object code forms, with or
* without modifications are expressly permitted by Whistle Communications;
* provided, however, that:
* 1. Any and all reproductions of the source or object code must include the
* copyright notice above and the following disclaimer of warranties; and
* 2. No rights are granted, in any manner or form, to use Whistle
* Communications, Inc. trademarks, including the mark "WHISTLE
* COMMUNICATIONS" on advertising, endorsements, or otherwise except as
* such appears in the above copyright notice or in the software.
*
* THIS SOFTWARE IS BEING PROVIDED BY WHISTLE COMMUNICATIONS "AS IS", AND
* TO THE MAXIMUM EXTENT PERMITTED BY LAW, WHISTLE COMMUNICATIONS MAKES NO
* REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE,
* INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
* WHISTLE COMMUNICATIONS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY
* REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS
* SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE.
* IN NO EVENT SHALL WHISTLE COMMUNICATIONS BE LIABLE FOR ANY DAMAGES
* RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING
* WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
*
* $FreeBSD: src/sys/crypto/rc4/rc4.c,v 1.2.2.1 2000/04/18 04:48:31 archie Exp $
*/
#include <stdint.h>
#include "rc4.h"
static
inline
void
swap_bytes
(
u_char
*
a
,
u_char
*
b
)
{
u_char
temp
;
temp
=
*
a
;
*
a
=
*
b
;
*
b
=
temp
;
}
/*
* Initialize an RC4 state buffer using the supplied key,
* which can have arbitrary length.
*/
void
rc4_init
(
struct
rc4_state
*
const
state
,
const
u_char
*
key
,
int
keylen
)
{
u_char
j
;
int
i
;
/* Initialize state with identity permutation */
for
(
i
=
0
;
i
<
256
;
i
++
)
state
->
perm
[
i
]
=
(
u_char
)
i
;
state
->
index1
=
0
;
state
->
index2
=
0
;
/* Randomize the permutation using key data */
for
(
j
=
i
=
0
;
i
<
256
;
i
++
)
{
j
+=
state
->
perm
[
i
]
+
key
[
i
%
keylen
];
swap_bytes
(
&
state
->
perm
[
i
],
&
state
->
perm
[
j
]);
}
}
/*
* Encrypt some data using the supplied RC4 state buffer.
* The input and output buffers may be the same buffer.
* Since RC4 is a stream cypher, this function is used
* for both encryption and decryption.
*/
void
rc4_crypt
(
struct
rc4_state
*
const
state
,
const
u_char
*
inbuf
,
u_char
*
outbuf
,
int
buflen
)
{
int
i
;
u_char
j
;
for
(
i
=
0
;
i
<
buflen
;
i
++
)
{
/* Update modification indicies */
state
->
index1
++
;
state
->
index2
+=
state
->
perm
[
state
->
index1
];
/* Modify permutation */
swap_bytes
(
&
state
->
perm
[
state
->
index1
],
&
state
->
perm
[
state
->
index2
]);
/* Encrypt/decrypt next byte */
j
=
state
->
perm
[
state
->
index1
]
+
state
->
perm
[
state
->
index2
];
outbuf
[
i
]
=
inbuf
[
i
]
^
state
->
perm
[
j
];
}
}
jni/shadowsocks/rc4.h
deleted
100644 → 0
View file @
5bc30e97
/*
* rc4.h
*
* Copyright (c) 1996-2000 Whistle Communications, Inc.
* All rights reserved.
*
* Subject to the following obligations and disclaimer of warranty, use and
* redistribution of this software, in source or object code forms, with or
* without modifications are expressly permitted by Whistle Communications;
* provided, however, that:
* 1. Any and all reproductions of the source or object code must include the
* copyright notice above and the following disclaimer of warranties; and
* 2. No rights are granted, in any manner or form, to use Whistle
* Communications, Inc. trademarks, including the mark "WHISTLE
* COMMUNICATIONS" on advertising, endorsements, or otherwise except as
* such appears in the above copyright notice or in the software.
*
* THIS SOFTWARE IS BEING PROVIDED BY WHISTLE COMMUNICATIONS "AS IS", AND
* TO THE MAXIMUM EXTENT PERMITTED BY LAW, WHISTLE COMMUNICATIONS MAKES NO
* REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE,
* INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
* WHISTLE COMMUNICATIONS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY
* REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS
* SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE.
* IN NO EVENT SHALL WHISTLE COMMUNICATIONS BE LIABLE FOR ANY DAMAGES
* RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING
* WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
*
* $FreeBSD: src/sys/crypto/rc4/rc4.h,v 1.2.2.1 2000/04/18 04:48:32 archie Exp $
*/
#ifndef RC4_H_
#define RC4_H_
typedef
uint8_t
u_char
;
struct
rc4_state
{
u_char
perm
[
256
];
u_char
index1
;
u_char
index2
;
};
void
rc4_init
(
struct
rc4_state
*
state
,
const
u_char
*
key
,
int
keylen
);
void
rc4_crypt
(
struct
rc4_state
*
state
,
const
u_char
*
inbuf
,
u_char
*
outbuf
,
int
buflen
);
#endif
jni/shadowsocks/socks5.h
deleted
100755 → 0
View file @
5bc30e97
#pragma once
#define VERSION 0x05
#define CONNECT 0x01
#define IPV4 0x01
#define DOMAIN 0x03
#define IPV6 0x04
#define CMD_NOT_SUPPORTED 0x07
#pragma pack(1)
struct
method_select_request
{
char
ver
;
char
nmethods
;
char
methods
[
255
];
};
struct
method_select_response
{
char
ver
;
char
method
;
};
struct
socks5_request
{
char
ver
;
char
cmd
;
char
rsv
;
char
atyp
;
};
struct
socks5_response
{
char
ver
;
char
rep
;
char
rsv
;
char
atyp
;
};
#pragma pack()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment