1 /**
2 * EME Classes
3 *
4 * Copyright:
5 * (C) 1999-2007 Jack Lloyd
6 * (C) 2014-2015 Etienne Cimon
7 *
8 * License:
9 * Botan is released under the Simplified BSD License (see LICENSE.md)
10 */
11 module botan.pk_pad.eme;
12
13 import memutils.vector;
14 public import botan.rng.rng;
15 /**
16 * Encoding Method for Encryption
17 */
18 class EME
19 {
20 public:
21 /**
22 * Return the maximum input size in bytes we can support
23 * Params:
24 * keybits = the size of the key in bits
25 * Returns: upper bound of input in bytes
26 */
27 abstract size_t maximumInputSize(size_t keybits) const;
28
29 /**
30 * Encode an input
31 * Params:
32 * msg = the plaintext
33 * msg_len = length of plaintext in bytes
34 * key_bits = length of the key in bits
35 * rng = a random number generator
36 * Returns: encoded plaintext
37 */
38 final SecureVector!ubyte encode(const(ubyte)* msg, size_t msg_len,
39 size_t key_bits,
40 RandomNumberGenerator rng) const
41 {
42 return pad(msg, msg_len, key_bits, rng);
43 }
44
45 /**
46 * Encode an input
47 * Params:
48 * msg = the plaintext
49 * key_bits = length of the key in bits
50 * rng = a random number generator
51 * Returns: encoded plaintext
52 */
53 final SecureVector!ubyte encode(const ref SecureVector!ubyte msg, size_t key_bits, RandomNumberGenerator rng) const
54 {
55 return pad(msg.ptr, msg.length, key_bits, rng);
56 }
57
58 /**
59 * Decode an input
60 * Params:
61 * msg = the encoded plaintext
62 * msg_len = length of encoded plaintext in bytes
63 * key_bits = length of the key in bits
64 * Returns: plaintext
65 */
66 final SecureVector!ubyte decode(const(ubyte)* msg, size_t msg_len, size_t key_bits) const
67 {
68 return unpad(msg, msg_len, key_bits);
69 }
70
71
72 /**
73 * Decode an input
74 * Params:
75 * msg = the encoded plaintext
76 * key_bits = length of the key in bits
77 * Returns: plaintext
78 */
79 final SecureVector!ubyte decode(const ref SecureVector!ubyte msg, size_t key_bits) const
80 {
81 return unpad(msg.ptr, msg.length, key_bits);
82 }
83
84 ~this() {}
85 protected:
86 /**
87 * Encode an input
88 * Params:
89 * input = the plaintext
90 * in_length = length of plaintext in bytes
91 * key_length = length of the key in bits
92 * rng = a random number generator
93 * Returns: encoded plaintext
94 */
95 abstract SecureVector!ubyte pad(const(ubyte)* input,
96 size_t in_length,
97 size_t key_length,
98 RandomNumberGenerator rng) const;
99
100 /**
101 * Decode an input
102 * Params:
103 * input = the encoded plaintext
104 * in_length = length of encoded plaintext in bytes
105 * key_length = length of the key in bits
106 * Returns: plaintext
107 */
108 abstract SecureVector!ubyte unpad(const(ubyte)* input, size_t in_length, size_t key_length) const;
109 }