encrypt.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include <aes.h>
  2. #include <md5.h>
  3. #include <string.h>
  4. #include <stdint.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. //static uint64_t seq=1;
  8. 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
  9. static const int disable_all=0;
  10. static const int disable_aes=0;
  11. int my_encrypt(uint8_t *data,uint8_t *output,int &len,uint8_t * key)
  12. {
  13. if(disable_all)
  14. {
  15. memcpy(output,data,len);
  16. return 0;
  17. }
  18. int ori_len=len;
  19. len=len+16;//md5
  20. len+=2;//length
  21. if(len%16!=0)
  22. {
  23. len= (len/16)*16+16;
  24. }
  25. if(len>65535) return -1;
  26. data[len-16-2]=(uint16_t(ori_len))>>8;
  27. data[len-16-1]=((uint16_t(ori_len))<<8)>>8;
  28. //printf("%d %d\n",data[len-16-2],data[len-16-1]);
  29. md5(data,len-16,data+len-16);
  30. //memcpy(buf,data,len); //not thread safe
  31. if(disable_aes)
  32. {
  33. memcpy(output,data,len);
  34. }
  35. else
  36. {
  37. AES_CBC_encrypt_buffer((unsigned char *)output,(unsigned char *)data,len,(unsigned char *)key,(unsigned char *)zero_iv);
  38. //it doesnt allow over lap
  39. }
  40. return 0;
  41. }
  42. int my_decrypt(uint8_t *data,uint8_t *output,int &len,uint8_t * key)
  43. {
  44. if(disable_all)
  45. {
  46. memcpy(output,data,len);
  47. return 0;
  48. }
  49. uint8_t md5_res[16];
  50. if(len>65535) return -1;
  51. if(len<32) return -1;
  52. if(len%16 !=0) return -1;
  53. if(disable_aes)
  54. {
  55. memcpy(output,data,len);
  56. }
  57. else
  58. {
  59. AES_CBC_decrypt_buffer((unsigned char *)output,(unsigned char *)data,len,(unsigned char *)key,(unsigned char *)zero_iv);
  60. }
  61. //printf("%d %d\n",data[len-16-2],data[len-16-1]);
  62. //printf("<<%d>>",len);
  63. md5(output,len-16,md5_res);
  64. if(memcmp(output+len-16,md5_res,16)!=0)
  65. {
  66. return -2;
  67. }
  68. len=output[len-16-2]*256u+output[len-16-1];
  69. return 0;
  70. }
  71. int my_encrypt_pesudo_header(uint8_t *data,uint8_t *output,int &len,uint8_t * key,uint8_t *header,int hlen)
  72. {
  73. return 0;
  74. }
  75. int my_decrypt_pesudo_header(uint8_t *data,uint8_t *output,int &len,uint8_t * key,uint8_t *header,int hlen)
  76. {
  77. return 0;
  78. }