/* Zlib test */ int main(int argc, char **argv) { unsigned long int ret, srcsize, dstsize = 2010; char dst[2048]; char dst2[2048]; memset(dst, 0, 2048); memset(dst2, 0, 2048); if (argc < 2) { printf("%s: string\n", argv[0]); exit(1); } srcsize = strlen(argv[1]); if (srcsize > 2000) { printf("%s: string too large\n", argv[0]); exit(1); } if ((ret = os_zlib_compress(argv[1], dst, srcsize, dstsize))) { printf("Compressed, from %lu->%lu\n", srcsize, ret); } else { printf("FAILED compressing.\n"); exit(1); } /* Set new srcsize for decompression */ srcsize = ret; if ((ret = os_zlib_uncompress(dst, dst2, srcsize, dstsize))) { printf("Uncompressed ok. String: '%s', size %lu->%lu\n", dst2, srcsize, ret); } else { printf("FAILED uncompressing.\n"); exit(1); } return (0); }
/* ReadSecMSG v0.2: 2005/02/10 */ char *ReadSecMSG(keystore *keys, char *buffer, char *cleartext, int id, unsigned int buffer_size) { unsigned int msg_global = 0; unsigned int msg_local = 0; char *f_msg; if(*buffer == ':') { buffer++; } else { merror(ENCFORMAT_ERROR, __local_name, keys->keyentries[id]->ip->ip); return(NULL); } /* Decrypting message */ if(!OS_BF_Str(buffer, cleartext, keys->keyentries[id]->key, buffer_size, OS_DECRYPT)) { merror(ENCKEY_ERROR, __local_name, keys->keyentries[id]->ip->ip); return(NULL); } /* Compressed */ else if(cleartext[0] == '!') { cleartext[buffer_size] = '\0'; cleartext++; buffer_size--; /* Removing padding */ while(*cleartext == '!') { cleartext++; buffer_size--; } /* Uncompressing */ if(!os_zlib_uncompress(cleartext, buffer, buffer_size, OS_MAXSTR)) { merror(UNCOMPRESS_ERR, __local_name); return(NULL); } /* Checking checksum */ f_msg = CheckSum(buffer); if(f_msg == NULL) { merror(ENCSUM_ERROR, __local_name, keys->keyentries[id]->ip->ip); return(NULL); } /* Removing random */ f_msg+=5; /* Checking count -- protecting against replay attacks */ msg_global = (unsigned int) atoi(f_msg); f_msg+=10; /* Checking for the right message format */ if(*f_msg != ':') { merror(ENCFORMAT_ERROR, __local_name,keys->keyentries[id]->ip->ip); return(NULL); } f_msg++; msg_local = (unsigned int) atoi(f_msg); f_msg+=5; /* Returning the message if we don't need to verify the counbter. */ if(!_s_verify_counter) { /* Updating currently counts */ keys->keyentries[id]->global = msg_global; keys->keyentries[id]->local = msg_local; if(rcv_count >= _s_recv_flush) { StoreCounter(keys, id, msg_global, msg_local); rcv_count = 0; } rcv_count++; return(f_msg); } if((msg_global > keys->keyentries[id]->global)|| ((msg_global == keys->keyentries[id]->global) && (msg_local > keys->keyentries[id]->local))) { /* Updating currently counts */ keys->keyentries[id]->global = msg_global; keys->keyentries[id]->local = msg_local; if(rcv_count >= _s_recv_flush) { StoreCounter(keys, id, msg_global, msg_local); rcv_count = 0; } rcv_count++; return(f_msg); } /* Checking if it is a duplicated message */ if(msg_global == keys->keyentries[id]->global) { return(NULL); } /* Warn about duplicated messages */ merror("%s: WARN: Duplicate error: global: %u, local: %u, " "saved global: %u, saved local:%u", __local_name, msg_global, msg_local, keys->keyentries[id]->global, keys->keyentries[id]->local); merror(ENCTIME_ERROR, __local_name, keys->keyentries[id]->name); return(NULL); } /* Old format */ else if(cleartext[0] == ':') { unsigned int msg_count; unsigned int msg_time; /* Closing string */ cleartext[buffer_size] = '\0'; /* Checking checksum */ cleartext++; f_msg = CheckSum(cleartext); if(f_msg == NULL) { merror(ENCSUM_ERROR, __local_name, keys->keyentries[id]->ip->ip); return(NULL); } /* Checking time -- protecting against replay attacks */ msg_time = (unsigned int) atoi(f_msg); f_msg+=11; msg_count = (unsigned int) atoi(f_msg); f_msg+=5; /* Returning the message if we don't need to verify the counbter. */ if(!_s_verify_counter) { /* Updating currently counts */ keys->keyentries[id]->global = msg_time; keys->keyentries[id]->local = msg_local; f_msg = strchr(f_msg, ':'); if(f_msg) { f_msg++; return(f_msg); } else { merror(ENCFORMAT_ERROR, __local_name,keys->keyentries[id]->ip->ip); return (NULL); } } if((msg_time > keys->keyentries[id]->global) || ((msg_time == keys->keyentries[id]->global)&& (msg_count > keys->keyentries[id]->local))) { /* Updating currently time and count */ keys->keyentries[id]->global = msg_time; keys->keyentries[id]->local = msg_count; f_msg = strchr(f_msg, ':'); if(f_msg) { f_msg++; return(f_msg); } else { merror(ENCFORMAT_ERROR, __local_name,keys->keyentries[id]->ip->ip); return (NULL); } } /* Checking if it is a duplicated message */ if((msg_count == keys->keyentries[id]->local) && (msg_time == keys->keyentries[id]->global)) { return(NULL); } /* Warn about duplicated message */ merror("%s: WARN: Duplicate error: msg_count: %u, time: %u, " "saved count: %u, saved_time:%u", __local_name, msg_count, msg_time, keys->keyentries[id]->local, keys->keyentries[id]->global); merror(ENCTIME_ERROR, __local_name, keys->keyentries[id]->name); return(NULL); } merror(ENCFORMAT_ERROR, __local_name, keys->keyentries[id]->ip->ip); return(NULL); }