summaryrefslogtreecommitdiff
path: root/lib/crypto/CipherDescription.h
blob: 813df2cea805db01e4c8fad6262aba6c0d4711e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// --------------------------------------------------------------------------
//
// File
//		Name:    CipherDescription.h
//		Purpose: Pure virtual base class for describing ciphers
//		Created: 1/12/03
//
// --------------------------------------------------------------------------

#ifndef CIPHERDESCRIPTION__H
#define CIPHERDESCRIPTION__H

#ifndef BOX_LIB_CRYPTO_OPENSSL_HEADERS_INCLUDED_TRUE
	#define BOX_LIB_CRYPTO_OPENSSL_HEADERS_INCLUDED_FALSE
	class EVP_CIPHER;
	class EVP_CIPHER_CTX;
#endif

// --------------------------------------------------------------------------
//
// Class
//		Name:    CipherDescription
//		Purpose: Describes a cipher
//		Created: 1/12/03
//
// --------------------------------------------------------------------------
class CipherDescription
{
public:
	CipherDescription();
	CipherDescription(const CipherDescription &rToCopy);
	virtual ~CipherDescription();
	CipherDescription &operator=(const CipherDescription &rToCopy);
	
	// Return OpenSSL cipher object
	virtual const EVP_CIPHER *GetCipher() const = 0;

	// Setup any other parameters
	virtual void SetupParameters(EVP_CIPHER_CTX *pCipherContext) const = 0;
	
	// Mode parameter for cipher -- used in derived classes
	typedef enum
	{
		Mode_ECB = 0,
		Mode_CBC = 1,
		Mode_CFB = 2,
		Mode_OFB = 3
	} CipherMode;

	virtual std::string GetCipherName() const = 0;
	virtual CipherMode GetCipherMode() const = 0;
	virtual std::string GetFullName() const
	{
		std::ostringstream out;
		out << GetCipherName() << "-";
		switch (GetCipherMode())
		{
		case Mode_ECB: out << "ECB"; break;
		case Mode_CBC: out << "CBC"; break;
		case Mode_CFB: out << "CFB"; break;
		case Mode_OFB: out << "OFB"; break;
		default: out << "unknown";
		}
		return out.str();
	}
	
#ifdef HAVE_OLD_SSL
	// For the old version of OpenSSL, we need to be able to store cipher descriptions.
	virtual CipherDescription *Clone() const = 0;
	// And to be able to store new IVs
	virtual void SetIV(const void *pIV) = 0;
#endif
};

#endif // CIPHERDESCRIPTION__H