cryptopp 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. data/.gitignore +8 -0
  2. data/MIT-LICENSE +22 -0
  3. data/README +7 -0
  4. data/Rakefile +42 -0
  5. data/cryptopp.gemspec +199 -0
  6. data/ext/.gitignore +5 -0
  7. data/ext/Rakefile +16 -0
  8. data/ext/ciphers.cpp +1402 -0
  9. data/ext/cryptopp.cpp +285 -0
  10. data/ext/cryptopp_ruby_api.h +139 -0
  11. data/ext/defs/block_modes.def +10 -0
  12. data/ext/defs/checksums.def +10 -0
  13. data/ext/defs/ciphers.def +136 -0
  14. data/ext/defs/hashes.def +78 -0
  15. data/ext/defs/hmacs.def +54 -0
  16. data/ext/defs/paddings.def +9 -0
  17. data/ext/defs/rngs.def +7 -0
  18. data/ext/digests.cpp +1120 -0
  19. data/ext/extconf.rb +39 -0
  20. data/ext/j3way.cpp +22 -0
  21. data/ext/j3way.h +29 -0
  22. data/ext/jadler32.h +32 -0
  23. data/ext/jaes.cpp +22 -0
  24. data/ext/jaes.h +31 -0
  25. data/ext/jarc4.cpp +22 -0
  26. data/ext/jarc4.h +37 -0
  27. data/ext/jbase.cpp +172 -0
  28. data/ext/jbase.h +92 -0
  29. data/ext/jbasiccipherinfo.h +74 -0
  30. data/ext/jblowfish.cpp +22 -0
  31. data/ext/jblowfish.h +29 -0
  32. data/ext/jcamellia.cpp +24 -0
  33. data/ext/jcamellia.h +33 -0
  34. data/ext/jcast128.cpp +22 -0
  35. data/ext/jcast128.h +31 -0
  36. data/ext/jcast256.cpp +22 -0
  37. data/ext/jcast256.h +31 -0
  38. data/ext/jcipher.cpp +112 -0
  39. data/ext/jcipher.h +42 -0
  40. data/ext/jcipher_t.h +469 -0
  41. data/ext/jconfig.h +127 -0
  42. data/ext/jconstants.h +189 -0
  43. data/ext/jcrc32.h +32 -0
  44. data/ext/jdes.cpp +22 -0
  45. data/ext/jdes.h +31 -0
  46. data/ext/jdes_ede2.cpp +22 -0
  47. data/ext/jdes_ede2.h +31 -0
  48. data/ext/jdes_ede3.cpp +22 -0
  49. data/ext/jdes_ede3.h +31 -0
  50. data/ext/jdes_xex3.cpp +22 -0
  51. data/ext/jdes_xex3.h +31 -0
  52. data/ext/jdiamond2.cpp +22 -0
  53. data/ext/jdiamond2.h +31 -0
  54. data/ext/jdiamond2lite.cpp +22 -0
  55. data/ext/jdiamond2lite.h +31 -0
  56. data/ext/jexception.h +20 -0
  57. data/ext/jgost.cpp +22 -0
  58. data/ext/jgost.h +31 -0
  59. data/ext/jhash.cpp +92 -0
  60. data/ext/jhash.h +54 -0
  61. data/ext/jhash_t.h +121 -0
  62. data/ext/jhaval.h +64 -0
  63. data/ext/jhelpers.cpp +90 -0
  64. data/ext/jhelpers.h +38 -0
  65. data/ext/jhmac.cpp +44 -0
  66. data/ext/jhmac.h +34 -0
  67. data/ext/jhmac_t.h +125 -0
  68. data/ext/jidea.cpp +22 -0
  69. data/ext/jidea.h +31 -0
  70. data/ext/jmarc4.cpp +22 -0
  71. data/ext/jmarc4.h +37 -0
  72. data/ext/jmars.cpp +22 -0
  73. data/ext/jmars.h +31 -0
  74. data/ext/jmd2.h +56 -0
  75. data/ext/jmd4.h +56 -0
  76. data/ext/jmd5.h +56 -0
  77. data/ext/jpanamacipher.cpp +32 -0
  78. data/ext/jpanamacipher.h +46 -0
  79. data/ext/jpanamahash.h +44 -0
  80. data/ext/jrc2.cpp +44 -0
  81. data/ext/jrc2.h +39 -0
  82. data/ext/jrc5.cpp +22 -0
  83. data/ext/jrc5.h +31 -0
  84. data/ext/jrc6.cpp +22 -0
  85. data/ext/jrc6.h +31 -0
  86. data/ext/jripemd160.h +113 -0
  87. data/ext/jsafer.cpp +32 -0
  88. data/ext/jsafer.h +42 -0
  89. data/ext/jseal.cpp +32 -0
  90. data/ext/jseal.h +42 -0
  91. data/ext/jserpent.cpp +22 -0
  92. data/ext/jserpent.h +31 -0
  93. data/ext/jsha.h +122 -0
  94. data/ext/jshacal2.cpp +22 -0
  95. data/ext/jshacal2.h +31 -0
  96. data/ext/jshark.cpp +24 -0
  97. data/ext/jshark.h +33 -0
  98. data/ext/jsink.cpp +90 -0
  99. data/ext/jsink.h +154 -0
  100. data/ext/jskipjack.cpp +22 -0
  101. data/ext/jskipjack.h +31 -0
  102. data/ext/jsquare.cpp +22 -0
  103. data/ext/jsquare.h +31 -0
  104. data/ext/jstream.cpp +8 -0
  105. data/ext/jstream.h +20 -0
  106. data/ext/jstream_t.h +175 -0
  107. data/ext/jtea.cpp +22 -0
  108. data/ext/jtea.h +31 -0
  109. data/ext/jtiger.h +52 -0
  110. data/ext/jtwofish.cpp +22 -0
  111. data/ext/jtwofish.h +31 -0
  112. data/ext/jwhirlpool.h +52 -0
  113. data/ext/utils.cpp +8 -0
  114. data/extras/parser_c.rb +114 -0
  115. data/test/ciphers_test.rb +37 -0
  116. data/test/data/ciphers/3desval.dat +7 -0
  117. data/test/data/ciphers/3wayval.dat +6 -0
  118. data/test/data/ciphers/arc4.dat +8 -0
  119. data/test/data/ciphers/blowfish.dat +5 -0
  120. data/test/data/ciphers/camellia.dat +7 -0
  121. data/test/data/ciphers/cast128v.dat +5 -0
  122. data/test/data/ciphers/cast256v.dat +5 -0
  123. data/test/data/ciphers/descert.dat +198 -0
  124. data/test/data/ciphers/diamond.dat +9 -0
  125. data/test/data/ciphers/gostval.dat +10 -0
  126. data/test/data/ciphers/ideaval.dat +13 -0
  127. data/test/data/ciphers/marsval.dat +11 -0
  128. data/test/data/ciphers/panamac.dat +7 -0
  129. data/test/data/ciphers/rc2val.dat +10 -0
  130. data/test/data/ciphers/rc5val.dat +7 -0
  131. data/test/data/ciphers/rc6val.dat +8 -0
  132. data/test/data/ciphers/rijndael.dat +11 -0
  133. data/test/data/ciphers/saferval.dat +27 -0
  134. data/test/data/ciphers/seal.dat +3 -0
  135. data/test/data/ciphers/serpentv.dat +11 -0
  136. data/test/data/ciphers/shacal2.dat +7 -0
  137. data/test/data/ciphers/sharkval.dat +9 -0
  138. data/test/data/ciphers/skipjack.dat +3 -0
  139. data/test/data/ciphers/squareva.dat +10 -0
  140. data/test/data/ciphers/twofishv.dat +11 -0
  141. data/test/data/digests/adler32.dat +8 -0
  142. data/test/data/digests/crc32.dat +10 -0
  143. data/test/data/digests/haval.dat +4 -0
  144. data/test/data/digests/havalcer.dat +23 -0
  145. data/test/data/digests/md2.dat +9 -0
  146. data/test/data/digests/md4.dat +9 -0
  147. data/test/data/digests/md5.dat +9 -0
  148. data/test/data/digests/panamah.dat +8 -0
  149. data/test/data/digests/ripemd.dat +43 -0
  150. data/test/data/digests/sha.dat +19 -0
  151. data/test/data/digests/tiger.dat +11 -0
  152. data/test/data/digests/whirlpool.dat +13 -0
  153. data/test/data/hmacs/hmac.dat +6 -0
  154. data/test/digests_test.rb +29 -0
  155. data/test/hmacs_test.rb +38 -0
  156. data/test/test_helper.rb +42 -0
  157. metadata +220 -0
@@ -0,0 +1,469 @@
1
+
2
+ /*
3
+ * Copyright (c) 2002-2010 J Smith <dark.panda@gmail.com>
4
+ * Crypto++ copyright (c) 1995-2010 Wei Dai
5
+ * See COPYING for the extact license
6
+ */
7
+
8
+ #ifndef __JCIPHER_T_H__
9
+ #define __JCIPHER_T_H__
10
+
11
+ #include "jbasiccipherinfo.h"
12
+
13
+ template <typename INFO, enum CipherEnum TYPE, unsigned int DEFAULT_ROUNDS = 0, unsigned int MIN_ROUNDS = 0, unsigned int MAX_ROUNDS = 0>
14
+ class JCipher_Template : public JBasicCipherInfo<INFO, JCipher>
15
+ {
16
+ public:
17
+ JCipher_Template();
18
+
19
+ inline unsigned int getValidRounds(const unsigned int rounds) const;
20
+ inline enum CipherEnum getCipherType() const;
21
+ inline unsigned int getBlockSize() const;
22
+
23
+ bool encrypt();
24
+ bool decrypt();
25
+
26
+ bool encryptRubyIO(VALUE* in, VALUE* out);
27
+ bool decryptRubyIO(VALUE* in, VALUE* out);
28
+
29
+ /* These are deprecated. They were used before using RubyIO. Use them
30
+ if you're using this code in something other than the CryptoPP Ruby
31
+ extension... */
32
+ // bool encryptFile(const string in, const string out);
33
+ // bool decryptFile(const string in, const string out);
34
+
35
+ protected:
36
+ virtual BlockCipher* getEncryptionObject() = 0;
37
+ virtual BlockCipher* getDecryptionObject() = 0;
38
+ };
39
+
40
+ template <typename INFO, enum CipherEnum TYPE, unsigned int DEFAULT_ROUNDS, unsigned int MIN_ROUNDS, unsigned int MAX_ROUNDS>
41
+ JCipher_Template<INFO, TYPE, DEFAULT_ROUNDS, MIN_ROUNDS, MAX_ROUNDS>::JCipher_Template()
42
+ {
43
+ this->itsKeylength = INFO::DEFAULT_KEYLENGTH;
44
+ this->itsRounds = DEFAULT_ROUNDS;
45
+ }
46
+
47
+ template <typename INFO, enum CipherEnum TYPE, unsigned int DEFAULT_ROUNDS, unsigned int MIN_ROUNDS, unsigned int MAX_ROUNDS>
48
+ unsigned int JCipher_Template<INFO, TYPE, DEFAULT_ROUNDS, MIN_ROUNDS, MAX_ROUNDS>::getValidRounds(const unsigned int rounds) const
49
+ {
50
+ return checkBounds(rounds, MIN_ROUNDS, MAX_ROUNDS);
51
+ }
52
+
53
+ template <typename INFO, enum CipherEnum TYPE, unsigned int DEFAULT_ROUNDS, unsigned int MIN_ROUNDS, unsigned int MAX_ROUNDS>
54
+ CipherEnum JCipher_Template<INFO, TYPE, DEFAULT_ROUNDS, MIN_ROUNDS, MAX_ROUNDS>::getCipherType() const
55
+ {
56
+ return TYPE;
57
+ }
58
+
59
+ template <typename INFO, enum CipherEnum TYPE, unsigned int DEFAULT_ROUNDS, unsigned int MIN_ROUNDS, unsigned int MAX_ROUNDS>
60
+ unsigned int JCipher_Template<INFO, TYPE, DEFAULT_ROUNDS, MIN_ROUNDS, MAX_ROUNDS>::getBlockSize() const
61
+ {
62
+ return INFO::BLOCKSIZE;
63
+ }
64
+
65
+ template <typename INFO, enum CipherEnum TYPE, unsigned int DEFAULT_ROUNDS, unsigned int MIN_ROUNDS, unsigned int MAX_ROUNDS>
66
+ bool JCipher_Template<INFO, TYPE, DEFAULT_ROUNDS, MIN_ROUNDS, MAX_ROUNDS>::encrypt()
67
+ {
68
+ BlockCipher* bc = NULL;
69
+ CipherModeBase* cipher = NULL;
70
+
71
+ bc = getEncryptionObject();
72
+
73
+ if (bc != NULL) {
74
+ switch (this->itsMode) {
75
+ case ECB_MODE:
76
+ cipher = new ECB_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
77
+ break;
78
+
79
+ case CBC_MODE:
80
+ cipher = new CBC_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
81
+ break;
82
+
83
+ case CBC_CTS_MODE:
84
+ cipher = new CBC_CTS_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
85
+ break;
86
+
87
+ case CFB_MODE:
88
+ cipher = new CFB_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
89
+ break;
90
+
91
+ case CTR_MODE:
92
+ cipher = new CTR_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
93
+ break;
94
+
95
+ case OFB_MODE:
96
+ cipher = new OFB_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
97
+ break;
98
+
99
+ default:
100
+ return false;
101
+ }
102
+
103
+ this->itsCiphertext.erase();
104
+ StringSource(this->itsPlaintext, true, new StreamTransformationFilter(*cipher, new StringSink(this->itsCiphertext), (StreamTransformationFilter::BlockPaddingScheme) this->itsPadding));
105
+
106
+ delete bc;
107
+ }
108
+ else {
109
+ return false;
110
+ }
111
+
112
+ if (cipher != NULL) {
113
+ delete cipher;
114
+ }
115
+
116
+ return true;
117
+ }
118
+
119
+ template <typename INFO, enum CipherEnum TYPE, unsigned int DEFAULT_ROUNDS, unsigned int MIN_ROUNDS, unsigned int MAX_ROUNDS>
120
+ bool JCipher_Template<INFO, TYPE, DEFAULT_ROUNDS, MIN_ROUNDS, MAX_ROUNDS>::decrypt()
121
+ {
122
+ BlockCipher* bc = NULL;
123
+ CipherModeBase* cipher = NULL;
124
+
125
+ switch (this->itsMode) {
126
+ case ECB_MODE:
127
+ case CBC_MODE:
128
+ case CBC_CTS_MODE:
129
+ bc = getDecryptionObject();
130
+ break;
131
+
132
+ case CFB_MODE:
133
+ case CTR_MODE:
134
+ case OFB_MODE:
135
+ bc = getEncryptionObject();
136
+ break;
137
+
138
+ default:
139
+ return false;
140
+ }
141
+
142
+ if (bc != NULL) {
143
+ switch (this->itsMode) {
144
+ case ECB_MODE:
145
+ cipher = new ECB_Mode_ExternalCipher::Decryption(*bc);
146
+ break;
147
+
148
+ case CBC_MODE:
149
+ cipher = new CBC_Mode_ExternalCipher::Decryption(*bc, (const byte*) this->itsIV.data());
150
+ break;
151
+
152
+ case CBC_CTS_MODE:
153
+ cipher = new CBC_CTS_Mode_ExternalCipher::Decryption(*bc, (const byte*) this->itsIV.data());
154
+ break;
155
+
156
+ case CFB_MODE:
157
+ cipher = new CFB_Mode_ExternalCipher::Decryption(*bc, (const byte*) this->itsIV.data());
158
+ break;
159
+
160
+ case CTR_MODE:
161
+ cipher = new CTR_Mode_ExternalCipher::Decryption(*bc, (const byte*) this->itsIV.data());
162
+ break;
163
+
164
+ case OFB_MODE:
165
+ cipher = new OFB_Mode_ExternalCipher::Decryption(*bc, (const byte*) this->itsIV.data());
166
+ break;
167
+
168
+ default:
169
+ return false;
170
+ }
171
+
172
+ this->itsPlaintext.erase();
173
+ StringSource(this->itsCiphertext, true, new StreamTransformationFilter(*cipher, new StringSink(this->itsPlaintext), (StreamTransformationFilter::BlockPaddingScheme) this->itsPadding));
174
+
175
+ delete bc;
176
+ }
177
+ else {
178
+ return false;
179
+ }
180
+
181
+ if (cipher != NULL) {
182
+ delete cipher;
183
+ }
184
+
185
+ return true;
186
+ }
187
+
188
+ template <typename INFO, enum CipherEnum TYPE, unsigned int DEFAULT_ROUNDS, unsigned int MIN_ROUNDS, unsigned int MAX_ROUNDS>
189
+ bool JCipher_Template<INFO, TYPE, DEFAULT_ROUNDS, MIN_ROUNDS, MAX_ROUNDS>::encryptRubyIO(VALUE* in, VALUE* out)
190
+ {
191
+ BlockCipher* bc = NULL;
192
+ CipherModeBase* cipher = NULL;
193
+
194
+ bc = getEncryptionObject();
195
+
196
+ if (bc != NULL) {
197
+ switch (this->itsMode) {
198
+ case ECB_MODE:
199
+ cipher = new ECB_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
200
+ break;
201
+
202
+ case CBC_MODE:
203
+ cipher = new CBC_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
204
+ break;
205
+
206
+ case CBC_CTS_MODE:
207
+ cipher = new CBC_CTS_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
208
+ break;
209
+
210
+ case CFB_MODE:
211
+ cipher = new CFB_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
212
+ break;
213
+
214
+ case CTR_MODE:
215
+ cipher = new CTR_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
216
+ break;
217
+
218
+ case OFB_MODE:
219
+ cipher = new OFB_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
220
+ break;
221
+
222
+ default:
223
+ return false;
224
+ }
225
+
226
+ try {
227
+ RubyIOSource(&in, true, new StreamTransformationFilter(*cipher, new RubyIOSink(&out), (StreamTransformationFilter::BlockPaddingScheme) this->itsPadding));
228
+ }
229
+ catch (RubyIOStore::OpenErr e) {
230
+ delete bc;
231
+ if (cipher != NULL)
232
+ delete cipher;
233
+ throw e;
234
+ }
235
+
236
+ delete bc;
237
+ }
238
+ else {
239
+ return false;
240
+ }
241
+
242
+ if (cipher != NULL) {
243
+ delete cipher;
244
+ }
245
+
246
+ return true;
247
+ }
248
+
249
+ template <typename INFO, enum CipherEnum TYPE, unsigned int DEFAULT_ROUNDS, unsigned int MIN_ROUNDS, unsigned int MAX_ROUNDS>
250
+ bool JCipher_Template<INFO, TYPE, DEFAULT_ROUNDS, MIN_ROUNDS, MAX_ROUNDS>::decryptRubyIO(VALUE* in, VALUE* out)
251
+ {
252
+ BlockCipher* bc = NULL;
253
+ CipherModeBase* cipher = NULL;
254
+
255
+ switch (this->itsMode) {
256
+ case ECB_MODE:
257
+ case CBC_MODE:
258
+ case CBC_CTS_MODE:
259
+ bc = getDecryptionObject();
260
+ break;
261
+
262
+ case CFB_MODE:
263
+ case CTR_MODE:
264
+ case OFB_MODE:
265
+ bc = getEncryptionObject();
266
+ break;
267
+
268
+ default:
269
+ return false;
270
+ }
271
+
272
+ if (bc != NULL) {
273
+ switch (this->itsMode) {
274
+ case ECB_MODE:
275
+ cipher = new ECB_Mode_ExternalCipher::Decryption(*bc);
276
+ break;
277
+
278
+ case CBC_MODE:
279
+ cipher = new CBC_Mode_ExternalCipher::Decryption(*bc, (const byte*) this->itsIV.data());
280
+ break;
281
+
282
+ case CBC_CTS_MODE:
283
+ cipher = new CBC_CTS_Mode_ExternalCipher::Decryption(*bc, (const byte*) this->itsIV.data());
284
+ break;
285
+
286
+ case CFB_MODE:
287
+ cipher = new CFB_Mode_ExternalCipher::Decryption(*bc, (const byte*) this->itsIV.data());
288
+ break;
289
+
290
+ case CTR_MODE:
291
+ cipher = new CTR_Mode_ExternalCipher::Decryption(*bc, (const byte*) this->itsIV.data());
292
+ break;
293
+
294
+ case OFB_MODE:
295
+ cipher = new OFB_Mode_ExternalCipher::Decryption(*bc, (const byte*) this->itsIV.data());
296
+ break;
297
+
298
+ default:
299
+ return false;
300
+ }
301
+
302
+ try {
303
+ RubyIOSource(&in, true, new StreamTransformationFilter(*cipher, new RubyIOSink(&out), (StreamTransformationFilter::BlockPaddingScheme) this->itsPadding));
304
+ }
305
+ catch (RubyIOStore::OpenErr e) {
306
+ delete bc;
307
+ if (cipher != NULL)
308
+ delete cipher;
309
+ throw e;
310
+ }
311
+
312
+ delete bc;
313
+ }
314
+ else {
315
+ return false;
316
+ }
317
+
318
+ if (cipher != NULL) {
319
+ delete cipher;
320
+ }
321
+
322
+ return true;
323
+ }
324
+
325
+ /* These are deprecated. They were used before using RubyIO. Use them
326
+ if you're using this code in something other than the CryptoPP Ruby
327
+ extension... */
328
+ /*template <typename INFO, enum CipherEnum TYPE, unsigned int DEFAULT_ROUNDS, unsigned int MIN_ROUNDS, unsigned int MAX_ROUNDS>
329
+ bool JCipher_Template<INFO, TYPE, DEFAULT_ROUNDS, MIN_ROUNDS, MAX_ROUNDS>::encryptFile(const string in, const string out)
330
+ {
331
+ BlockCipher* bc = NULL;
332
+ CipherModeBase* cipher = NULL;
333
+
334
+ bc = getEncryptionObject();
335
+
336
+ if (bc != NULL) {
337
+ switch (this->itsMode) {
338
+ case ECB_MODE:
339
+ cipher = new ECB_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
340
+ break;
341
+
342
+ case CBC_MODE:
343
+ cipher = new CBC_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
344
+ break;
345
+
346
+ case CBC_CTS_MODE:
347
+ cipher = new CBC_CTS_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
348
+ break;
349
+
350
+ case CFB_MODE:
351
+ cipher = new CFB_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
352
+ break;
353
+
354
+ case CTR_MODE:
355
+ cipher = new CTR_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
356
+ break;
357
+
358
+ case OFB_MODE:
359
+ cipher = new OFB_Mode_ExternalCipher::Encryption(*bc, (const byte*) this->itsIV.data());
360
+ break;
361
+
362
+ default:
363
+ return false;
364
+ }
365
+
366
+ try {
367
+ FileSource(in.c_str(), true, new StreamTransformationFilter(*cipher, new FileSink(out.c_str()), (StreamTransformationFilter::BlockPaddingScheme) this->itsPadding));
368
+ }
369
+ catch (FileStore::OpenErr e) {
370
+ delete bc;
371
+ if (cipher != NULL) {
372
+ delete cipher;
373
+ }
374
+ throw e;
375
+ }
376
+
377
+ delete bc;
378
+ }
379
+ else {
380
+ return false;
381
+ }
382
+
383
+ if (cipher != NULL) {
384
+ delete cipher;
385
+ }
386
+
387
+ return true;
388
+ }
389
+
390
+ template <typename INFO, enum CipherEnum TYPE, unsigned int DEFAULT_ROUNDS, unsigned int MIN_ROUNDS, unsigned int MAX_ROUNDS>
391
+ bool JCipher_Template<INFO, TYPE, DEFAULT_ROUNDS, MIN_ROUNDS, MAX_ROUNDS>::decryptFile(const string in, const string out)
392
+ {
393
+ BlockCipher* bc = NULL;
394
+ CipherModeBase* cipher = NULL;
395
+
396
+ switch (this->itsMode) {
397
+ case ECB_MODE:
398
+ case CBC_MODE:
399
+ case CBC_CTS_MODE:
400
+ bc = getDecryptionObject();
401
+ break;
402
+
403
+ case CFB_MODE:
404
+ case CTR_MODE:
405
+ case OFB_MODE:
406
+ bc = getEncryptionObject();
407
+ break;
408
+
409
+ default:
410
+ return false;
411
+ }
412
+
413
+ if (bc != NULL) {
414
+ switch (this->itsMode) {
415
+ case ECB_MODE:
416
+ cipher = new ECB_Mode_ExternalCipher::Decryption(*bc);
417
+ break;
418
+
419
+ case CBC_MODE:
420
+ cipher = new CBC_Mode_ExternalCipher::Decryption(*bc, (const byte*) this->itsIV.data());
421
+ break;
422
+
423
+ case CBC_CTS_MODE:
424
+ cipher = new CBC_CTS_Mode_ExternalCipher::Decryption(*bc, (const byte*) this->itsIV.data());
425
+ break;
426
+
427
+ case CFB_MODE:
428
+ cipher = new CFB_Mode_ExternalCipher::Decryption(*bc, (const byte*) this->itsIV.data());
429
+ break;
430
+
431
+ case CTR_MODE:
432
+ cipher = new CTR_Mode_ExternalCipher::Decryption(*bc, (const byte*) this->itsIV.data());
433
+ break;
434
+
435
+ case OFB_MODE:
436
+ cipher = new OFB_Mode_ExternalCipher::Decryption(*bc, (const byte*) this->itsIV.data());
437
+ break;
438
+
439
+ default:
440
+ return false;
441
+ }
442
+
443
+ try {
444
+ FileSource(in.c_str(), true, new StreamTransformationFilter(*cipher, new FileSink(out.c_str()), (StreamTransformationFilter::BlockPaddingScheme) this->itsPadding));
445
+ }
446
+
447
+ catch (FileStore::OpenErr e) {
448
+ delete bc;
449
+ if (cipher != NULL) {
450
+ delete cipher;
451
+ }
452
+ throw e;
453
+ }
454
+
455
+ delete bc;
456
+ }
457
+ else {
458
+ return false;
459
+ }
460
+
461
+ if (cipher != NULL) {
462
+ delete cipher;
463
+ }
464
+
465
+ return true;
466
+ }
467
+ */
468
+
469
+ #endif