jencrypt.hpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*##############################################################################
  2. HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems®.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing, software
  8. distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions and
  11. limitations under the License.
  12. ############################################################################## */
  13. #ifndef JENCRYPT_HPP
  14. #define JENCRYPT_HPP
  15. #include "platform.h"
  16. #include "jiface.hpp"
  17. #include "jbuff.hpp"
  18. #include "jexcept.hpp"
  19. //for AES, keylen must be 16, 24, or 32 Bytes
  20. namespace jlib
  21. {
  22. extern jlib_decl MemoryBuffer &aesEncrypt(const void *key, size_t keylen, const void *input, size_t inlen, MemoryBuffer &output);
  23. extern jlib_decl MemoryBuffer &aesDecrypt(const void *key, size_t keylen, const void *input, size_t inlen, MemoryBuffer &output);
  24. } // end of namespace jlib;
  25. // NB: these are wrappers to either the openssl versions (if USE_OPENSSL) or the jlib version.
  26. extern jlib_decl MemoryBuffer &aesEncrypt(const void *key, size_t keylen, const void *input, size_t inlen, MemoryBuffer &output);
  27. extern jlib_decl MemoryBuffer &aesDecrypt(const void *key, size_t keylen, const void *input, size_t inlen, MemoryBuffer &output);
  28. #define encrypt _LogProcessError12
  29. #define decrypt _LogProcessError15
  30. extern jlib_decl void encrypt(StringBuffer &ret, const char *in);
  31. extern jlib_decl void decrypt(StringBuffer &ret, const char *in);
  32. // simple inline block scrambler (shouldn't need jlib_decl)
  33. class Csimplecrypt
  34. {
  35. unsigned *r;
  36. unsigned n;
  37. size32_t blksize;
  38. public:
  39. Csimplecrypt(const byte *key, size32_t keysize, size32_t _blksize)
  40. {
  41. n = (unsigned)(_blksize/sizeof(unsigned));
  42. blksize = (size32_t)(n*sizeof(unsigned));
  43. r = (unsigned *)malloc(blksize);
  44. byte * z = (byte *)r;
  45. size32_t ks = keysize;
  46. const byte *k = key;
  47. for (size32_t i=0;i<blksize;i++) {
  48. z[i] = (byte)(*k+i);
  49. if (--ks==0) {
  50. k = key;
  51. ks = keysize;
  52. }
  53. else
  54. k++;
  55. }
  56. encrypt(z);
  57. encrypt(z);
  58. }
  59. ~Csimplecrypt()
  60. {
  61. free(r);
  62. }
  63. void encrypt( void * buffer )
  64. {
  65. unsigned * w = (unsigned *)buffer;
  66. unsigned i = 0;
  67. while (i<n) {
  68. unsigned mask = r[i];
  69. unsigned j = ((unsigned)mask) % n;
  70. unsigned wi = w[i];
  71. unsigned wj = w[j];
  72. w[j] = ( ( wj & mask ) | ( wi & ~mask ) ) + mask;
  73. w[i] = ( ( wi & mask ) | ( wj & ~mask ) ) + mask;
  74. i++;
  75. }
  76. }
  77. void decrypt( void * buffer )
  78. {
  79. unsigned * w = (unsigned*)buffer;
  80. unsigned i = n;
  81. while (i--) {
  82. unsigned mask = r[i];
  83. unsigned j = ((unsigned)mask) % n;
  84. unsigned wi = w[i] - mask;
  85. unsigned wj = w[j] - mask;
  86. w[i] = ( wi & mask ) | ( wj & ~mask );
  87. w[j] = ( wj & mask ) | ( wi & ~mask );
  88. }
  89. }
  90. };
  91. #endif //JENCRYPT_HPP