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.
- data/.gitignore +8 -0
- data/MIT-LICENSE +22 -0
- data/README +7 -0
- data/Rakefile +42 -0
- data/cryptopp.gemspec +199 -0
- data/ext/.gitignore +5 -0
- data/ext/Rakefile +16 -0
- data/ext/ciphers.cpp +1402 -0
- data/ext/cryptopp.cpp +285 -0
- data/ext/cryptopp_ruby_api.h +139 -0
- data/ext/defs/block_modes.def +10 -0
- data/ext/defs/checksums.def +10 -0
- data/ext/defs/ciphers.def +136 -0
- data/ext/defs/hashes.def +78 -0
- data/ext/defs/hmacs.def +54 -0
- data/ext/defs/paddings.def +9 -0
- data/ext/defs/rngs.def +7 -0
- data/ext/digests.cpp +1120 -0
- data/ext/extconf.rb +39 -0
- data/ext/j3way.cpp +22 -0
- data/ext/j3way.h +29 -0
- data/ext/jadler32.h +32 -0
- data/ext/jaes.cpp +22 -0
- data/ext/jaes.h +31 -0
- data/ext/jarc4.cpp +22 -0
- data/ext/jarc4.h +37 -0
- data/ext/jbase.cpp +172 -0
- data/ext/jbase.h +92 -0
- data/ext/jbasiccipherinfo.h +74 -0
- data/ext/jblowfish.cpp +22 -0
- data/ext/jblowfish.h +29 -0
- data/ext/jcamellia.cpp +24 -0
- data/ext/jcamellia.h +33 -0
- data/ext/jcast128.cpp +22 -0
- data/ext/jcast128.h +31 -0
- data/ext/jcast256.cpp +22 -0
- data/ext/jcast256.h +31 -0
- data/ext/jcipher.cpp +112 -0
- data/ext/jcipher.h +42 -0
- data/ext/jcipher_t.h +469 -0
- data/ext/jconfig.h +127 -0
- data/ext/jconstants.h +189 -0
- data/ext/jcrc32.h +32 -0
- data/ext/jdes.cpp +22 -0
- data/ext/jdes.h +31 -0
- data/ext/jdes_ede2.cpp +22 -0
- data/ext/jdes_ede2.h +31 -0
- data/ext/jdes_ede3.cpp +22 -0
- data/ext/jdes_ede3.h +31 -0
- data/ext/jdes_xex3.cpp +22 -0
- data/ext/jdes_xex3.h +31 -0
- data/ext/jdiamond2.cpp +22 -0
- data/ext/jdiamond2.h +31 -0
- data/ext/jdiamond2lite.cpp +22 -0
- data/ext/jdiamond2lite.h +31 -0
- data/ext/jexception.h +20 -0
- data/ext/jgost.cpp +22 -0
- data/ext/jgost.h +31 -0
- data/ext/jhash.cpp +92 -0
- data/ext/jhash.h +54 -0
- data/ext/jhash_t.h +121 -0
- data/ext/jhaval.h +64 -0
- data/ext/jhelpers.cpp +90 -0
- data/ext/jhelpers.h +38 -0
- data/ext/jhmac.cpp +44 -0
- data/ext/jhmac.h +34 -0
- data/ext/jhmac_t.h +125 -0
- data/ext/jidea.cpp +22 -0
- data/ext/jidea.h +31 -0
- data/ext/jmarc4.cpp +22 -0
- data/ext/jmarc4.h +37 -0
- data/ext/jmars.cpp +22 -0
- data/ext/jmars.h +31 -0
- data/ext/jmd2.h +56 -0
- data/ext/jmd4.h +56 -0
- data/ext/jmd5.h +56 -0
- data/ext/jpanamacipher.cpp +32 -0
- data/ext/jpanamacipher.h +46 -0
- data/ext/jpanamahash.h +44 -0
- data/ext/jrc2.cpp +44 -0
- data/ext/jrc2.h +39 -0
- data/ext/jrc5.cpp +22 -0
- data/ext/jrc5.h +31 -0
- data/ext/jrc6.cpp +22 -0
- data/ext/jrc6.h +31 -0
- data/ext/jripemd160.h +113 -0
- data/ext/jsafer.cpp +32 -0
- data/ext/jsafer.h +42 -0
- data/ext/jseal.cpp +32 -0
- data/ext/jseal.h +42 -0
- data/ext/jserpent.cpp +22 -0
- data/ext/jserpent.h +31 -0
- data/ext/jsha.h +122 -0
- data/ext/jshacal2.cpp +22 -0
- data/ext/jshacal2.h +31 -0
- data/ext/jshark.cpp +24 -0
- data/ext/jshark.h +33 -0
- data/ext/jsink.cpp +90 -0
- data/ext/jsink.h +154 -0
- data/ext/jskipjack.cpp +22 -0
- data/ext/jskipjack.h +31 -0
- data/ext/jsquare.cpp +22 -0
- data/ext/jsquare.h +31 -0
- data/ext/jstream.cpp +8 -0
- data/ext/jstream.h +20 -0
- data/ext/jstream_t.h +175 -0
- data/ext/jtea.cpp +22 -0
- data/ext/jtea.h +31 -0
- data/ext/jtiger.h +52 -0
- data/ext/jtwofish.cpp +22 -0
- data/ext/jtwofish.h +31 -0
- data/ext/jwhirlpool.h +52 -0
- data/ext/utils.cpp +8 -0
- data/extras/parser_c.rb +114 -0
- data/test/ciphers_test.rb +37 -0
- data/test/data/ciphers/3desval.dat +7 -0
- data/test/data/ciphers/3wayval.dat +6 -0
- data/test/data/ciphers/arc4.dat +8 -0
- data/test/data/ciphers/blowfish.dat +5 -0
- data/test/data/ciphers/camellia.dat +7 -0
- data/test/data/ciphers/cast128v.dat +5 -0
- data/test/data/ciphers/cast256v.dat +5 -0
- data/test/data/ciphers/descert.dat +198 -0
- data/test/data/ciphers/diamond.dat +9 -0
- data/test/data/ciphers/gostval.dat +10 -0
- data/test/data/ciphers/ideaval.dat +13 -0
- data/test/data/ciphers/marsval.dat +11 -0
- data/test/data/ciphers/panamac.dat +7 -0
- data/test/data/ciphers/rc2val.dat +10 -0
- data/test/data/ciphers/rc5val.dat +7 -0
- data/test/data/ciphers/rc6val.dat +8 -0
- data/test/data/ciphers/rijndael.dat +11 -0
- data/test/data/ciphers/saferval.dat +27 -0
- data/test/data/ciphers/seal.dat +3 -0
- data/test/data/ciphers/serpentv.dat +11 -0
- data/test/data/ciphers/shacal2.dat +7 -0
- data/test/data/ciphers/sharkval.dat +9 -0
- data/test/data/ciphers/skipjack.dat +3 -0
- data/test/data/ciphers/squareva.dat +10 -0
- data/test/data/ciphers/twofishv.dat +11 -0
- data/test/data/digests/adler32.dat +8 -0
- data/test/data/digests/crc32.dat +10 -0
- data/test/data/digests/haval.dat +4 -0
- data/test/data/digests/havalcer.dat +23 -0
- data/test/data/digests/md2.dat +9 -0
- data/test/data/digests/md4.dat +9 -0
- data/test/data/digests/md5.dat +9 -0
- data/test/data/digests/panamah.dat +8 -0
- data/test/data/digests/ripemd.dat +43 -0
- data/test/data/digests/sha.dat +19 -0
- data/test/data/digests/tiger.dat +11 -0
- data/test/data/digests/whirlpool.dat +13 -0
- data/test/data/hmacs/hmac.dat +6 -0
- data/test/digests_test.rb +29 -0
- data/test/hmacs_test.rb +38 -0
- data/test/test_helper.rb +42 -0
- metadata +220 -0
data/ext/jserpent.cpp
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
#include "jserpent.h"
|
|
9
|
+
|
|
10
|
+
#if ENABLED_SERPENT_CIPHER
|
|
11
|
+
|
|
12
|
+
BlockCipher* JSerpent::getEncryptionObject()
|
|
13
|
+
{
|
|
14
|
+
return new SerpentEncryption((byte*) itsKey.data(), itsKeylength);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
BlockCipher* JSerpent::getDecryptionObject()
|
|
18
|
+
{
|
|
19
|
+
return new SerpentDecryption((byte*) itsKey.data(), itsKeylength);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
#endif
|
data/ext/jserpent.h
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
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 __JSERPENT_H__
|
|
9
|
+
#define __JSERPENT_H__
|
|
10
|
+
|
|
11
|
+
#include "jconfig.h"
|
|
12
|
+
|
|
13
|
+
#if ENABLED_SERPENT_CIPHER
|
|
14
|
+
|
|
15
|
+
#include "jcipher_t.h"
|
|
16
|
+
|
|
17
|
+
// Crypto++ headers...
|
|
18
|
+
|
|
19
|
+
#include "serpent.h"
|
|
20
|
+
|
|
21
|
+
using namespace CryptoPP;
|
|
22
|
+
|
|
23
|
+
class JSerpent : public JCipher_Template<Serpent_Info, SERPENT_CIPHER>
|
|
24
|
+
{
|
|
25
|
+
protected:
|
|
26
|
+
BlockCipher* getEncryptionObject();
|
|
27
|
+
BlockCipher* getDecryptionObject();
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
#endif
|
|
31
|
+
#endif
|
data/ext/jsha.h
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
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 __JSHA_H__
|
|
9
|
+
#define __JSHA_H__
|
|
10
|
+
|
|
11
|
+
#include "jconfig.h"
|
|
12
|
+
|
|
13
|
+
#if ENABLED_SHA1_HASH || ENABLED_SHA256_HASH || (defined(WORD64_AVAILABLE) && (ENABLED_SHA384_HASH || ENABLED_SHA512_HASH)) || \
|
|
14
|
+
ENABLED_SHA1_HMAC || ENABLED_SHA256_HMAC || (defined(WORD64_AVAILABLE) && (ENABLED_SHA384_HMAC || ENABLED_SHA512_HMAC))
|
|
15
|
+
|
|
16
|
+
#if ENABLED_SHA1_HASH || ENABLED_SHA256_HASH || (defined(WORD64_AVAILABLE) && (ENABLED_SHA384_HASH || ENABLED_SHA512_HASH))
|
|
17
|
+
#include "jhash_t.h"
|
|
18
|
+
#endif
|
|
19
|
+
|
|
20
|
+
#if ENABLED_SHA1_HMAC || ENABLED_SHA256_HMAC || (defined(WORD64_AVAILABLE) && (ENABLED_SHA384_HMAC || ENABLED_SHA512_HMAC))
|
|
21
|
+
#include "jhmac_t.h"
|
|
22
|
+
#endif
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
// Crypto++ headers...
|
|
26
|
+
|
|
27
|
+
#include "sha.h"
|
|
28
|
+
|
|
29
|
+
using namespace CryptoPP;
|
|
30
|
+
|
|
31
|
+
#if ENABLED_SHA1_HASH
|
|
32
|
+
class JSHA1 : public JHash_Template<SHA1, SHA1_HASH>
|
|
33
|
+
{
|
|
34
|
+
public:
|
|
35
|
+
JSHA1(string plaintext = "") : JHash_Template<SHA1, SHA1_HASH>(plaintext) { }
|
|
36
|
+
|
|
37
|
+
static string getHashName() { return "SHA1"; }
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
typedef JSHA1 JSHA;
|
|
41
|
+
#endif
|
|
42
|
+
|
|
43
|
+
#if ENABLED_SHA256_HASH
|
|
44
|
+
class JSHA256 : public JHash_Template<SHA256, SHA256_HASH>
|
|
45
|
+
{
|
|
46
|
+
public:
|
|
47
|
+
JSHA256(string plaintext = "") : JHash_Template<SHA256, SHA256_HASH>(plaintext) { }
|
|
48
|
+
|
|
49
|
+
static string getHashName() { return "SHA-256"; }
|
|
50
|
+
};
|
|
51
|
+
#endif
|
|
52
|
+
|
|
53
|
+
#ifdef WORD64_AVAILABLE
|
|
54
|
+
#if ENABLED_SHA384_HASH
|
|
55
|
+
class JSHA384 : public JHash_Template<SHA384, SHA384_HASH>
|
|
56
|
+
{
|
|
57
|
+
public:
|
|
58
|
+
JSHA384(string plaintext = "") : JHash_Template<SHA384, SHA384_HASH>(plaintext) { }
|
|
59
|
+
|
|
60
|
+
static string getHashName() { return "SHA-384"; }
|
|
61
|
+
};
|
|
62
|
+
#endif
|
|
63
|
+
|
|
64
|
+
#if ENABLED_SHA512_HASH
|
|
65
|
+
class JSHA512 : public JHash_Template<SHA512, SHA512_HASH>
|
|
66
|
+
{
|
|
67
|
+
public:
|
|
68
|
+
JSHA512(string plaintext = "") : JHash_Template<SHA512, SHA512_HASH>(plaintext) { }
|
|
69
|
+
|
|
70
|
+
static string getHashName() { return "SHA-512"; }
|
|
71
|
+
};
|
|
72
|
+
#endif
|
|
73
|
+
#endif
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
#if ENABLED_SHA1_HMAC
|
|
77
|
+
class JSHA1_HMAC : public JHMAC_Template<SHA1, SHA1_HMAC>
|
|
78
|
+
{
|
|
79
|
+
public:
|
|
80
|
+
JSHA1_HMAC(string plaintext = "") : JHMAC_Template<SHA1, SHA1_HMAC>(plaintext) { }
|
|
81
|
+
|
|
82
|
+
static string getHashName() { return "SHA1-HMAC"; }
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
typedef JSHA1_HMAC JSHA_HMAC;
|
|
86
|
+
#endif
|
|
87
|
+
|
|
88
|
+
#if ENABLED_SHA256_HMAC
|
|
89
|
+
class JSHA256_HMAC : public JHMAC_Template<SHA256, SHA256_HMAC>
|
|
90
|
+
{
|
|
91
|
+
public:
|
|
92
|
+
JSHA256_HMAC(string plaintext = "") : JHMAC_Template<SHA256, SHA256_HMAC>(plaintext) { }
|
|
93
|
+
|
|
94
|
+
static string getHashName() { return "SHA-256-HMAC"; }
|
|
95
|
+
};
|
|
96
|
+
#endif
|
|
97
|
+
|
|
98
|
+
#ifdef WORD64_AVAILABLE
|
|
99
|
+
#if ENABLED_SHA384_HMAC
|
|
100
|
+
class JSHA384_HMAC : public JHMAC_Template<SHA384, SHA384_HMAC>
|
|
101
|
+
{
|
|
102
|
+
public:
|
|
103
|
+
JSHA384_HMAC(string plaintext = "") : JHMAC_Template<SHA384, SHA384_HMAC>(plaintext) { }
|
|
104
|
+
|
|
105
|
+
static string getHashName() { return "SHA-384-HMAC"; }
|
|
106
|
+
};
|
|
107
|
+
#endif
|
|
108
|
+
|
|
109
|
+
#if ENABLED_SHA512_HMAC
|
|
110
|
+
class JSHA512_HMAC : public JHMAC_Template<SHA512, SHA512_HMAC>
|
|
111
|
+
{
|
|
112
|
+
public:
|
|
113
|
+
JSHA512_HMAC(string plaintext = "") : JHMAC_Template<SHA512, SHA512_HMAC>(plaintext) { }
|
|
114
|
+
|
|
115
|
+
static string getHashName() { return "SHA-512-HMAC"; }
|
|
116
|
+
};
|
|
117
|
+
#endif
|
|
118
|
+
#endif
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
#endif
|
|
122
|
+
#endif
|
data/ext/jshacal2.cpp
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
#include "jshacal2.h"
|
|
9
|
+
|
|
10
|
+
#if ENABLED_SHACAL2_CIPHER
|
|
11
|
+
|
|
12
|
+
BlockCipher* JSHACAL2::getEncryptionObject()
|
|
13
|
+
{
|
|
14
|
+
return new SHACAL2Encryption((byte*) itsKey.data(), itsKeylength);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
BlockCipher* JSHACAL2::getDecryptionObject()
|
|
18
|
+
{
|
|
19
|
+
return new SHACAL2Decryption((byte*) itsKey.data(), itsKeylength);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
#endif
|
data/ext/jshacal2.h
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
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 __JSHACAL2_H__
|
|
9
|
+
#define __JSHACAL2_H__
|
|
10
|
+
|
|
11
|
+
#include "jconfig.h"
|
|
12
|
+
|
|
13
|
+
#if ENABLED_SHACAL2_CIPHER
|
|
14
|
+
|
|
15
|
+
#include "jcipher_t.h"
|
|
16
|
+
|
|
17
|
+
// Crypto++ headers...
|
|
18
|
+
|
|
19
|
+
#include "shacal2.h"
|
|
20
|
+
|
|
21
|
+
using namespace CryptoPP;
|
|
22
|
+
|
|
23
|
+
class JSHACAL2 : public JCipher_Template<SHACAL2_Info, SHACAL2_CIPHER>
|
|
24
|
+
{
|
|
25
|
+
protected:
|
|
26
|
+
BlockCipher* getEncryptionObject();
|
|
27
|
+
BlockCipher* getDecryptionObject();
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
#endif
|
|
31
|
+
#endif
|
data/ext/jshark.cpp
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
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
|
+
#include "jshark.h"
|
|
9
|
+
|
|
10
|
+
#ifdef WORD64_AVAILABLE
|
|
11
|
+
#if ENABLED_SHARK_CIPHER
|
|
12
|
+
|
|
13
|
+
BlockCipher* JSHARK::getEncryptionObject()
|
|
14
|
+
{
|
|
15
|
+
return new SHARKEncryption((byte*) itsKey.data(), itsKeylength, itsRounds);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
BlockCipher* JSHARK::getDecryptionObject()
|
|
19
|
+
{
|
|
20
|
+
return new SHARKDecryption((byte*) itsKey.data(), itsKeylength, itsRounds);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
#endif
|
|
24
|
+
#endif
|
data/ext/jshark.h
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
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 __JSHARK_H__
|
|
9
|
+
#define __JSHARK_H__
|
|
10
|
+
|
|
11
|
+
#include "jconfig.h"
|
|
12
|
+
|
|
13
|
+
#ifdef WORD64_AVAILABLE
|
|
14
|
+
#if ENABLED_SHARK_CIPHER
|
|
15
|
+
|
|
16
|
+
#include "jcipher_t.h"
|
|
17
|
+
|
|
18
|
+
// Crypto++ headers...
|
|
19
|
+
|
|
20
|
+
#include "shark.h"
|
|
21
|
+
|
|
22
|
+
using namespace CryptoPP;
|
|
23
|
+
|
|
24
|
+
class JSHARK : public JCipher_Template<SHARK_Info, SHARK_CIPHER, 6, 2, INT_MAX>
|
|
25
|
+
{
|
|
26
|
+
protected:
|
|
27
|
+
BlockCipher* getEncryptionObject();
|
|
28
|
+
BlockCipher* getDecryptionObject();
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
#endif
|
|
32
|
+
#endif
|
|
33
|
+
#endif
|
data/ext/jsink.cpp
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
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
|
+
#include "jsink.h"
|
|
9
|
+
|
|
10
|
+
void RubyIOStore::StoreInitialize(const NameValuePairs& parameters)
|
|
11
|
+
{
|
|
12
|
+
m_stream = NULL;
|
|
13
|
+
parameters.GetValue(Name::InputStreamPointer(), m_stream);
|
|
14
|
+
m_waiting = false;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
size_t RubyIOStore::Peek(byte& outByte) const
|
|
18
|
+
{
|
|
19
|
+
if (!m_stream || rb_funcall(*m_stream, rb_intern("eof?"), 0)) {
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
return 1;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
size_t RubyIOStore::TransferTo2(BufferedTransformation& target, CryptoPP::lword& transferBytes, const std::string& channel, bool blocking)
|
|
29
|
+
{
|
|
30
|
+
if (!m_stream) {
|
|
31
|
+
transferBytes = 0;
|
|
32
|
+
return 0;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
lword size = transferBytes;
|
|
36
|
+
transferBytes = 0;
|
|
37
|
+
|
|
38
|
+
if (m_waiting) {
|
|
39
|
+
goto output;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
while (size && !RTEST(rb_funcall(*m_stream, rb_intern("eof?"), 0))) {
|
|
43
|
+
{
|
|
44
|
+
VALUE buffer;
|
|
45
|
+
size_t spaceSize = 1024;
|
|
46
|
+
m_space = HelpCreatePutSpace(target, channel, 1, UnsignedMin(size_t(0) - 1, size), spaceSize);
|
|
47
|
+
|
|
48
|
+
buffer = rb_funcall(*m_stream, rb_intern("read"), 1, UINT2NUM(STDMIN(size, (lword) spaceSize)));
|
|
49
|
+
if (TYPE(buffer) != T_STRING) {
|
|
50
|
+
throw ReadErr();
|
|
51
|
+
}
|
|
52
|
+
memcpy(m_space, StringValuePtr(buffer), RSTRING(buffer)->len);
|
|
53
|
+
m_len = RSTRING(buffer)->len;
|
|
54
|
+
}
|
|
55
|
+
size_t blockedBytes;
|
|
56
|
+
output:
|
|
57
|
+
blockedBytes = target.ChannelPutModifiable2(channel, m_space, m_len, 0, blocking);
|
|
58
|
+
m_waiting = blockedBytes > 0;
|
|
59
|
+
if (m_waiting) {
|
|
60
|
+
return blockedBytes;
|
|
61
|
+
}
|
|
62
|
+
size -= m_len;
|
|
63
|
+
transferBytes += m_len;
|
|
64
|
+
}
|
|
65
|
+
if (!RTEST(rb_funcall(*m_stream, rb_intern("eof?"), 0))) {
|
|
66
|
+
throw ReadErr();
|
|
67
|
+
}
|
|
68
|
+
return 0;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
void RubyIOSink::IsolatedInitialize(const NameValuePairs& parameters)
|
|
72
|
+
{
|
|
73
|
+
m_stream = NULL;
|
|
74
|
+
parameters.GetValue(Name::OutputStreamPointer(), m_stream);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
size_t RubyIOSink::Put2(const byte* inString, size_t length, int messageEnd, bool blocking)
|
|
78
|
+
{
|
|
79
|
+
if (!m_stream) {
|
|
80
|
+
throw Err("RubyIOSink: output stream not opened");
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
rb_funcall(*m_stream, rb_intern("write"), 1, rb_str_new((const char*) inString, length));
|
|
84
|
+
|
|
85
|
+
if (messageEnd) {
|
|
86
|
+
rb_funcall(*m_stream, rb_intern("flush"), 0);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
data/ext/jsink.h
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
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 __JSINK_H__
|
|
9
|
+
#define __JSINK_H__
|
|
10
|
+
|
|
11
|
+
#include "filters.h"
|
|
12
|
+
#include "argnames.h"
|
|
13
|
+
|
|
14
|
+
extern "C" {
|
|
15
|
+
#include "ruby.h"
|
|
16
|
+
#include "rubyio.h"
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
using namespace CryptoPP;
|
|
20
|
+
|
|
21
|
+
class RubyIOStore : public Store, private FilterPutSpaceHelper
|
|
22
|
+
{
|
|
23
|
+
public:
|
|
24
|
+
class Err : public Exception
|
|
25
|
+
{
|
|
26
|
+
public:
|
|
27
|
+
Err(const std::string& s) : Exception(IO_ERROR, s) {}
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
class OpenErr : public Err
|
|
31
|
+
{
|
|
32
|
+
public:
|
|
33
|
+
OpenErr(const std::string& filename) : Err("RubyIOStore: error opening IO stream for reading: " + filename) {}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
class ReadErr : public Err
|
|
37
|
+
{
|
|
38
|
+
public:
|
|
39
|
+
ReadErr() : Err("RubyIOStore: error reading IO stream") {}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
RubyIOStore() {}
|
|
43
|
+
|
|
44
|
+
RubyIOStore(VALUE** in)
|
|
45
|
+
{
|
|
46
|
+
StoreInitialize(MakeParameters(Name::InputStreamPointer(), *in));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
RubyIOStore(const char* filename)
|
|
50
|
+
{
|
|
51
|
+
StoreInitialize(MakeParameters(Name::InputFileName(), filename));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
VALUE* GetStream()
|
|
55
|
+
{
|
|
56
|
+
return m_stream;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
size_t Peek(byte &outByte) const;
|
|
60
|
+
size_t TransferTo2(BufferedTransformation &target, CryptoPP::lword &transferBytes, const std::string &channel = NULL_CHANNEL, bool blocking = true);
|
|
61
|
+
|
|
62
|
+
// These methods aren't actually used in the PHP extension, but we need to implement them anyway
|
|
63
|
+
// because they're abstract...
|
|
64
|
+
size_t CopyRangeTo2(BufferedTransformation& target, CryptoPP::lword& begin, CryptoPP::lword end = ULONG_MAX, const std::string& channel = NULL_CHANNEL, bool blocking = true) const { return 0; }
|
|
65
|
+
CryptoPP::lword MaxRetrievable() const { return 0L; }
|
|
66
|
+
|
|
67
|
+
private:
|
|
68
|
+
void StoreInitialize(const NameValuePairs ¶meters);
|
|
69
|
+
VALUE* m_stream;
|
|
70
|
+
|
|
71
|
+
byte* m_space;
|
|
72
|
+
unsigned int m_len;
|
|
73
|
+
bool m_waiting;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
class RubyIOSource : public SourceTemplate<RubyIOStore>
|
|
77
|
+
{
|
|
78
|
+
public:
|
|
79
|
+
typedef RubyIOStore::Err Err;
|
|
80
|
+
typedef RubyIOStore::OpenErr OpenErr;
|
|
81
|
+
typedef RubyIOStore::ReadErr ReadErr;
|
|
82
|
+
|
|
83
|
+
RubyIOSource(BufferedTransformation* attachment = NULL) : SourceTemplate<RubyIOStore>(attachment) {}
|
|
84
|
+
|
|
85
|
+
RubyIOSource(VALUE** in, bool pumpAll, BufferedTransformation* attachment = NULL) : SourceTemplate<RubyIOStore>(attachment)
|
|
86
|
+
{
|
|
87
|
+
SourceInitialize(pumpAll, MakeParameters(Name::InputStreamPointer(), *in));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
RubyIOSource(const char* filename, bool pumpAll, BufferedTransformation* attachment = NULL, bool binary = true) : SourceTemplate<RubyIOStore>(attachment)
|
|
91
|
+
{
|
|
92
|
+
SourceInitialize(pumpAll, MakeParameters(Name::InputFileName(), filename)(Name::InputBinaryMode(), binary));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
VALUE* GetStream()
|
|
96
|
+
{
|
|
97
|
+
return m_store.GetStream();
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
class RubyIOSink : public Sink
|
|
103
|
+
{
|
|
104
|
+
public:
|
|
105
|
+
class Err : public Exception
|
|
106
|
+
{
|
|
107
|
+
public:
|
|
108
|
+
Err(const std::string& s) : Exception(IO_ERROR, s) {}
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
class OpenErr : public Err
|
|
112
|
+
{
|
|
113
|
+
public:
|
|
114
|
+
OpenErr(const std::string &filename) : Err("RubyIOSink: error opening file for writing: " + filename) {}
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
class WriteErr : public Err
|
|
118
|
+
{
|
|
119
|
+
public:
|
|
120
|
+
WriteErr() : Err("RubyIOSink: error writing file") {}
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
RubyIOSink()
|
|
124
|
+
{
|
|
125
|
+
m_stream = NULL;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
RubyIOSink(VALUE** out)
|
|
129
|
+
{
|
|
130
|
+
IsolatedInitialize(MakeParameters(Name::OutputStreamPointer(), *out));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
RubyIOSink(const char* filename, bool binary = true)
|
|
134
|
+
{
|
|
135
|
+
IsolatedInitialize(MakeParameters(Name::OutputFileName(), filename)(Name::OutputBinaryMode(), binary));
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
VALUE* GetStream()
|
|
139
|
+
{
|
|
140
|
+
return m_stream;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
void IsolatedInitialize(const NameValuePairs& parameters);
|
|
144
|
+
size_t Put2(const byte* inString, size_t length, int messageEnd, bool blocking);
|
|
145
|
+
|
|
146
|
+
// IsolatedFlush isn't actually used, but needs to be implemented because
|
|
147
|
+
// it's abstract...
|
|
148
|
+
bool IsolatedFlush(bool hardFlush, bool blocking) { return false; };
|
|
149
|
+
|
|
150
|
+
private:
|
|
151
|
+
VALUE* m_stream;
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
#endif
|