16 #define ENCRYPT_NEW // new, better encryption scheme
23 #if BYTE_ORDER == BIG_ENDIAN
35 void encrypt_new(
char *text,
int text_len,
char *scrambled_text,
int *scrambled_len);
36 void unencrypt_new(
char *scrambled_text,
int scrambled_len,
char *text,
int *text_len);
42 unsigned int sum1,sum2;
44 sum1 = sum2 = (
int)(seed);
48 if (sum1 >= 255 ) sum1 -= 255;
53 return (
unsigned short)((sum1<<8)+ sum2);
64 void encrypt(
char *text,
int text_len,
char *scrambled_text,
int *scrambled_len,
int use_8bit,
bool new_encrypt)
69 if (new_encrypt ==
true) {
70 encrypt_new(text, text_len, scrambled_text, scrambled_len);
90 for ( i =0; i < text_len; i++ ) {
93 if ( (
unsigned char)text[i] == 0x92 ) {
98 scrambled_text[byte_offset++] = text[
i];
102 scrambled_text[byte_offset] = (char)((text[i] << 1) & 0xfe);
106 scrambled_text[byte_offset] &= 0x80;
107 scrambled_text[byte_offset] |= (text[
i] & 0x7F);
112 scrambled_text[byte_offset] &= 0xc0;
113 scrambled_text[byte_offset] |= ((text[
i] >> 1) & 0x3F);
115 scrambled_text[byte_offset] = (char)((text[i] << 7) & 0x80);
119 scrambled_text[byte_offset] &= 0xe0;
120 scrambled_text[byte_offset] |= ((text[
i] >> 2) & 0x1F);
122 scrambled_text[byte_offset] = (char)((text[i] << 6) & 0xc0);
126 scrambled_text[byte_offset] &= 0xf0;
127 scrambled_text[byte_offset] |= ((text[
i] >> 3) & 0x0F);
129 scrambled_text[byte_offset] = (char)((text[i] << 5) & 0xe0);
133 scrambled_text[byte_offset] &= 0xf8;
134 scrambled_text[byte_offset] |= ((text[
i] >> 4) & 0x07);
136 scrambled_text[byte_offset] = (char)((text[i] << 4) & 0xf0);
140 scrambled_text[byte_offset] &= 0xfc;
141 scrambled_text[byte_offset] |= ((text[
i] >> 5) & 0x03);
143 scrambled_text[byte_offset] = (char)((text[i] << 3) & 0xf8);
147 scrambled_text[byte_offset] &= 0xfe;
148 scrambled_text[byte_offset] |= ((text[
i] >> 6) & 0x01);
150 scrambled_text[byte_offset] = (char)((text[i] << 2) & 0xfc);
159 if ( bit_offset > 0 ) {
163 *scrambled_len = byte_offset;
167 int len = *scrambled_len - 4;
168 for ( i =0; i <
len; i++ ) {
169 scrambled_text[
i] ^=
i;
177 void unencrypt(
char *scrambled_text,
int scrambled_len,
char *text,
int *text_len)
182 unencrypt_new(scrambled_text, scrambled_len, text, text_len);
188 int scramble_offset = 0;
195 memcpy(&encrypt_id, scrambled_text, 4);
198 memcpy(text, scrambled_text, scrambled_len);
199 *text_len = scrambled_len;
207 for ( i =0; i < scrambled_len; i++ ) {
208 scrambled_text[
i] ^=
i;
212 memcpy(text, scrambled_text, scrambled_len);
213 *text_len = scrambled_len;
218 num_runs = (
int) (scrambled_len / 7.0
f );
219 if ( scrambled_len % 7 ) {
223 for ( i =0; i < num_runs; i++ ) {
226 text[byte_offset] = (char)((scrambled_text[scramble_offset] >> 1) & 0x7f);
230 if ( scramble_offset >= scrambled_len ) {
234 text[byte_offset] = (char)((scrambled_text[scramble_offset] >> 2) & 0x3f);
235 text[byte_offset] |= ( (scrambled_text[scramble_offset-1] << 6) & 0x40 );
239 if ( scramble_offset >= scrambled_len ) {
243 text[byte_offset] = (char)((scrambled_text[scramble_offset] >> 3) & 0x1f);
244 text[byte_offset] |= ( (scrambled_text[scramble_offset-1] << 5) & 0x60 );
248 if ( scramble_offset >= scrambled_len ) {
252 text[byte_offset] = (char)((scrambled_text[scramble_offset] >> 4) & 0x0f);
253 text[byte_offset] |= ( (scrambled_text[scramble_offset-1] << 4) & 0x70 );
257 if ( scramble_offset >= scrambled_len ) {
261 text[byte_offset] = (char)((scrambled_text[scramble_offset] >> 5) & 0x07);
262 text[byte_offset] |= ( (scrambled_text[scramble_offset-1] << 3) & 0x78 );
266 if ( scramble_offset >= scrambled_len ) {
270 text[byte_offset] = (char)((scrambled_text[scramble_offset] >> 6) & 0x03);
271 text[byte_offset] |= ( (scrambled_text[scramble_offset-1] << 2) & 0x7c );
275 if ( scramble_offset >= scrambled_len ) {
279 text[byte_offset] = (char)((scrambled_text[scramble_offset] >> 7) & 0x01);
280 text[byte_offset] |= ( (scrambled_text[scramble_offset-1] << 1) & 0x7e );
283 maybe_last = (char)(scrambled_text[scramble_offset] & 0x7f);
284 if ( maybe_last > 0 ) {
285 text[byte_offset] = maybe_last;
291 *text_len = byte_offset;
294 #define NUM_LVL1_KEYS 11
310 void encrypt_new(
char *text,
int text_len,
char *scrambled_text,
int *scrambled_len)
320 block_checksum = 0xffff;
322 while(*scrambled_len < text_len){
325 memcpy(lvl1_block, text + *scrambled_len, text_len - *scrambled_len);
326 block_size = text_len - *scrambled_len;
330 memcpy(lvl1_block, text + *scrambled_len,
NUM_LVL1_KEYS * 2);
335 for(idx=0; idx<block_size/2; idx++){
341 block_checksum =
chksum_add_short(block_checksum, (
char*)lvl1_block, block_size);
344 memcpy(scrambled_text + *scrambled_len + 4, lvl1_block, block_size);
345 *scrambled_len += block_size;
357 void unencrypt_new(
char *scrambled_text,
int scrambled_len,
char *text,
int *text_len)
366 memcpy(&encrypt_id, scrambled_text, 4);
368 memcpy(text, scrambled_text, scrambled_len);
369 *text_len = scrambled_len;
377 block_checksum = 0xffff;
378 while(*text_len < scrambled_len){
381 memcpy(lvl1_block, scrambled_text + *text_len, scrambled_len - *text_len);
382 block_size = scrambled_len - *text_len;
386 memcpy(lvl1_block, scrambled_text + *text_len,
NUM_LVL1_KEYS * 2);
391 memcpy(lvl1_block_copy, lvl1_block, block_size);
393 for(idx=0; idx<block_size/2; idx++){
398 block_checksum =
chksum_add_short(block_checksum, (
char*)lvl1_block_copy, block_size);
401 memcpy(text + *text_len, lvl1_block, block_size);
402 *text_len += block_size;
411 memcpy(&encrypt_id, scrambled_text, 4);
425 memcpy(&encrypt_id, scrambled_text, 4);
439 memcpy(&encrypt_id, scrambled_text, 4);
442 return "FreeSpace 1 type encryption, 7-bit";
444 return "FreeSpace 1 type encryption, 8-bit";
446 return "FreeSpace 2 type encryption";
448 return "Not encrypted or unknown encryption type";
ushort chksum_add_short(ushort seed, char *buffer, int size)
void unencrypt(char *scrambled_text, int scrambled_len, char *text, int *text_len)
void unencrypt_new(char *scrambled_text, int scrambled_len, char *text, int *text_len)
const uint Encrypt_signature
const uint Encrypt_new_signature
const uint Encrypt_signature_8bit
void encrypt(char *text, int text_len, char *scrambled_text, int *scrambled_len, int use_8bit, bool new_encrypt)
typedef int(SCP_EXT_CALLCONV *SCPDLL_PFVERSION)(SCPDLL_Version *)
int is_old_encrypt(char *scrambled_text)
int is_encrypted(char *scrambled_text)
ushort Lvl1_keys[NUM_LVL1_KEYS]
void encrypt_new(char *text, int text_len, char *scrambled_text, int *scrambled_len)
const char * encrypt_type(char *scrambled_text)