udp2raw/encrypt.cpp

126 lines
2.4 KiB
C++
Raw Normal View History

2017-07-18 16:52:33 +00:00
#include <aes.h>
#include <md5.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
//static uint64_t seq=1;
2017-07-22 15:39:35 +00:00
static int8_t zero_iv[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0};//this prog use zero iv,you should make sure first block of data contains a random/nonce data
2017-07-18 16:52:33 +00:00
static const int disable_all=0;
static const int disable_aes=0;
2017-07-18 16:52:33 +00:00
//int auth(uint8_t *data,)
/*
2017-07-18 16:52:33 +00:00
int my_encrypt(uint8_t *data,uint8_t *output,int &len,uint8_t * key)
{
return 0;
}
int my_decrypt(uint8_t *data,uint8_t *output,int &len,uint8_t * key)
{
return 0;
}
*/
int my_encrypt(const char *data0,char *output,int &len,char * key)
{
char data[65535+100];
memcpy(data,data0,len);
if(disable_all)
{
memcpy(output,data,len);
return 0;
}
2017-07-18 16:52:33 +00:00
int ori_len=len;
len=len+16;//md5
len+=2;//length
if(len%16!=0)
{
len= (len/16)*16+16;
}
if(len>65535) return -1;
2017-07-23 11:43:00 +00:00
data[len-16-2]= (unsigned char)( (uint16_t(ori_len))>>8);
data[len-16-1]=(unsigned char)( ((uint16_t(ori_len))<<8)>>8) ;
2017-07-18 16:52:33 +00:00
//printf("%d %d\n",data[len-16-2],data[len-16-1]);
md5((unsigned char *)data,len-16,(unsigned char *)(data+len-16));
2017-07-18 16:52:33 +00:00
//memcpy(buf,data,len); //not thread safe
if(disable_aes)
{
memcpy(output,data,len);
}
else
{
AES_CBC_encrypt_buffer((unsigned char *)output,(unsigned char *)data,len,(unsigned char *)key,(unsigned char *)zero_iv);
//it doesnt allow over lap
}
2017-07-18 16:52:33 +00:00
return 0;
}
int my_decrypt(const char *data0,char *output,int &len,char * key)
2017-07-18 16:52:33 +00:00
{
char data[65535+100];
memcpy(data,data0,len);
if(disable_all)
{
memcpy(output,data,len);
return 0;
}
2017-07-18 16:52:33 +00:00
uint8_t md5_res[16];
if(len>65535) return -1;
if(len<32) return -1;
if(len%16 !=0) return -1;
if(disable_aes)
{
memcpy(output,data,len);
}
else
{
AES_CBC_decrypt_buffer((unsigned char *)output,(unsigned char *)data,len,(unsigned char *)key,(unsigned char *)zero_iv);
}
2017-07-18 16:52:33 +00:00
//printf("%d %d\n",data[len-16-2],data[len-16-1]);
//printf("<<%d>>",len);
md5((unsigned char *)output,len-16,(unsigned char *)md5_res);
2017-07-18 16:52:33 +00:00
if(memcmp(output+len-16,md5_res,16)!=0)
{
return -2;
}
2017-07-23 11:43:00 +00:00
len=((unsigned char)output[len-16-2])*256u+((unsigned char)output[len-16-1]); //this may be broken because of sign
2017-07-18 16:52:33 +00:00
return 0;
}
2017-07-22 15:39:35 +00:00
int my_encrypt_pesudo_header(uint8_t *data,uint8_t *output,int &len,uint8_t * key,uint8_t *header,int hlen)
{
return 0;
}
int my_decrypt_pesudo_header(uint8_t *data,uint8_t *output,int &len,uint8_t * key,uint8_t *header,int hlen)
{
return 0;
}