39 |
return Val_unit; |
return Val_unit; |
40 |
} |
} |
41 |
|
|
42 |
value ml_init_cipher(value cipher_v, value seed_v, value encode_v) |
value ml_init_cipher(value cipher_v) |
43 |
{ |
{ |
44 |
FSTCipher* cipher = (FSTCipher*) cipher_v; |
FSTCipher* cipher = (FSTCipher*) cipher_v; |
45 |
unsigned int seed = Int32_val(seed_v); |
fst_cipher_init(cipher, cipher->seed, cipher->enc_type); |
|
unsigned int encode = Int_val(encode_v); |
|
|
|
|
|
fst_cipher_init(cipher, seed, encode); |
|
46 |
|
|
47 |
return Val_unit; |
return Val_unit; |
48 |
} |
} |
61 |
return Val_unit; |
return Val_unit; |
62 |
} |
} |
63 |
|
|
64 |
value ml_cipher_packet_get(value s_v, value pos_v, |
value ml_cipher_packet_get(value s_v, value pos_v, value in_cipher_v) |
|
value in_cipher_v, value out_cipher_v) |
|
65 |
{ |
{ |
66 |
FSTCipher* in_cipher = (FSTCipher*) in_cipher_v; |
FSTCipher* in_cipher = (FSTCipher*) in_cipher_v; |
|
FSTCipher* out_cipher = (FSTCipher*) out_cipher_v; |
|
67 |
char *s = String_val(s_v); |
char *s = String_val(s_v); |
68 |
int pos = Int_val(pos_v); |
int pos = Int_val(pos_v); |
69 |
unsigned int seed; |
unsigned int seed; |
79 |
enc_type = htonl (((unsigned int*)(s+pos+4))[0]); |
enc_type = htonl (((unsigned int*)(s+pos+4))[0]); |
80 |
enc_type = fst_cipher_decode_enc_type (seed, enc_type); |
enc_type = fst_cipher_decode_enc_type (seed, enc_type); |
81 |
|
|
82 |
|
in_cipher->seed = seed; |
83 |
|
in_cipher->enc_type = enc_type; |
84 |
/* printf("in seed:%X enc_type: %X\n", seed, out_cipher->enc_type); */ |
/* printf("in seed:%X enc_type: %X\n", seed, out_cipher->enc_type); */ |
85 |
|
|
86 |
if(enc_type > 0x29) failwith ("ERROR: unsupported encryption"); |
/* if(enc_type > 0x29) failwith ("ERROR: unsupported encryption"); */ |
87 |
|
|
88 |
|
return Val_unit; |
89 |
|
} |
90 |
|
|
91 |
|
value ml_xor_ciphers(value out_cipher_v, value in_cipher_v){ |
92 |
|
FSTCipher* in_cipher = (FSTCipher*) in_cipher_v; |
93 |
|
FSTCipher* out_cipher = (FSTCipher*) out_cipher_v; |
94 |
|
|
95 |
|
out_cipher->seed ^= in_cipher->seed; /* xor send cipher with received seed */ |
96 |
|
|
97 |
|
return Val_unit; |
98 |
|
} |
99 |
|
|
100 |
out_cipher->seed ^= seed; /* xor send cipher with received seed */ |
value ml_xor_ciphers2(value out_cipher_v, value in_cipher_v){ |
101 |
|
FSTCipher* in_cipher = (FSTCipher*) in_cipher_v; |
102 |
|
FSTCipher* out_cipher = (FSTCipher*) out_cipher_v; |
103 |
|
unsigned int seed = out_cipher->seed; |
104 |
|
|
105 |
|
out_cipher->seed ^= in_cipher->seed; /* xor send cipher with received seed */ |
106 |
|
in_cipher->seed ^= seed; |
107 |
fst_cipher_init(out_cipher, out_cipher->seed, out_cipher->enc_type); |
fst_cipher_init(out_cipher, out_cipher->seed, out_cipher->enc_type); |
|
fst_cipher_init(in_cipher, seed, enc_type); |
|
108 |
|
|
109 |
return Val_unit; |
return Val_unit; |
110 |
} |
} |
111 |
|
|
112 |
|
|
113 |
value ml_cipher_packet_set(value cipher_v, value s_v, value pos_v) |
value ml_cipher_packet_set(value cipher_v, value s_v, value pos_v) |
114 |
{ |
{ |
115 |
FSTCipher* cipher = (FSTCipher*) cipher_v; |
FSTCipher* cipher = (FSTCipher*) cipher_v; |
116 |
char *s = String_val(s_v); |
char *s = String_val(s_v); |
117 |
int pos = Int_val(pos_v); |
int pos = Int_val(pos_v); |
118 |
|
|
119 |
/* |
((unsigned int*)(s+pos))[0] = htonl(cipher->seed); |
120 |
printf("ml_cipher_packet_set %X seed:%X enc_type:%X\n", cipher, |
((unsigned int*)(s+pos+4))[0] = htonl( |
121 |
cipher->seed, cipher->enc_type |
fst_cipher_encode_enc_type(cipher->seed, cipher->enc_type)); |
122 |
); |
|
123 |
*/ |
return Val_unit; |
124 |
|
} |
125 |
|
|
126 |
|
value ml_cipher_enc_type(value cipher_v) |
127 |
|
{ |
128 |
|
FSTCipher* cipher = (FSTCipher*) cipher_v; |
129 |
|
|
130 |
/* in OCAML: "\250\000\182\043" */ |
return Val_int(cipher->enc_type); |
131 |
/* ((unsigned int*)(s+pos))[0] = 0x02BB600FA; random number? */ |
} |
132 |
s[pos] = 250; |
|
133 |
s[pos+1] = 0; |
value ml_cipher_packet_set_xored(value cipher_v, value s_v, value pos_v, value xor_cipher_v) |
134 |
s[pos+2] = 182; |
{ |
135 |
s[pos+3] = 43; |
FSTCipher* cipher = (FSTCipher*) cipher_v; |
136 |
((unsigned int*)(s+pos+4))[0] = htonl(cipher->seed); |
FSTCipher* xor_cipher = (FSTCipher*) xor_cipher_v; |
137 |
((unsigned int*)(s+pos+8))[0] = htonl( |
char *s = String_val(s_v); |
138 |
|
int pos = Int_val(pos_v); |
139 |
|
unsigned int seed = cipher->seed; |
140 |
|
|
141 |
|
seed ^= xor_cipher->seed; |
142 |
|
((unsigned int*)(s+pos))[0] = htonl(seed); |
143 |
|
((unsigned int*)(s+pos+4))[0] = htonl( |
144 |
fst_cipher_encode_enc_type(cipher->seed, cipher->enc_type)); |
fst_cipher_encode_enc_type(cipher->seed, cipher->enc_type)); |
145 |
|
|
146 |
return Val_unit; |
return Val_unit; |
147 |
} |
} |
148 |
|
|
149 |
|
|
150 |
value ml_cipher_free(value cipher_v) |
value ml_cipher_free(value cipher_v) |
151 |
{ |
{ |
152 |
FSTCipher* cipher = (FSTCipher*) cipher_v; |
FSTCipher* cipher = (FSTCipher*) cipher_v; |