1 /**
2 * Engine
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.engine.engine;
12 
13 import botan.constants;
14 public import botan.algo_base.scan_token;
15 public import botan.block.block_cipher;
16 public import botan.stream.stream_cipher;
17 public import botan.hash.hash;
18 public import botan.mac.mac;
19 public import botan.pbkdf.pbkdf;
20 public import botan.math.numbertheory.pow_mod;
21 public import botan.pubkey.pk_keys;
22 public import botan.pubkey.pk_ops;
23 public import botan.rng.rng;
24 public import botan.math.bigint.bigint;
25 public import botan.filters.key_filt;
26 public import botan.algo_factory.algo_factory;
27 public import botan.utils.types;
28 
29 /**
30 * Base class for all engines. All non-pure abstract functions simply
31 * return NULL, indicating the algorithm in question is not
32 * supported. Subclasses can reimplement whichever function(s)
33 * they want to hook in a particular type.
34 */
35 interface Engine
36 {
37 public:
38     /**
39     * Returns: name of this engine
40     */
41     string providerName() const;
42 
43     /**
44     * Params:
45     *  algo_spec = the algorithm name/specification
46     *  af = an algorithm factory object
47     * Returns: newly allocated object, or NULL
48     */
49     BlockCipher findBlockCipher(in SCANToken algo_spec, AlgorithmFactory af) const;
50 
51 
52     /**
53     * Params:
54     *  algo_spec = the algorithm name/specification
55     *  af = an algorithm factory object
56     * Returns: newly allocated object, or NULL
57     */
58     StreamCipher findStreamCipher(in SCANToken algo_spec, AlgorithmFactory af) const;
59 
60     /**
61     * Params:
62     *  algo_spec = the algorithm name/specification
63     *  af = an algorithm factory object
64     * Returns: newly allocated object, or NULL
65     */
66     HashFunction findHash(in SCANToken algo_spec, AlgorithmFactory af) const;
67 
68 
69     /**
70     * Params:
71     *  algo_spec = the algorithm name/specification
72     *  af = an algorithm factory object
73     * Returns: newly allocated object, or NULL
74     */
75     MessageAuthenticationCode findMac(in SCANToken algo_spec, AlgorithmFactory af) const;
76 
77     /**
78     * Params:
79     *  algo_spec = the algorithm name/specification
80     *  af = an algorithm factory object
81     * Returns: newly allocated object, or NULL
82     */
83     PBKDF findPbkdf(in SCANToken algo_spec, AlgorithmFactory af) const;
84 
85     /**
86     * Return a new cipher object
87     * Params:
88     *  algo_spec = the algorithm name/specification
89     *  dir = specifies if encryption or decryption is desired
90     *  af = an algorithm factory object
91     * Returns: newly allocated object, or NULL
92     */
93     KeyedFilter getCipher(in string algo_spec, CipherDir dir, AlgorithmFactory af) const;
94 
95     static if (BOTAN_HAS_PUBLIC_KEY_CRYPTO):
96 
97     /**
98     * Params:
99     *  n = the modulus
100     *  hints = any use hints
101     * Returns: newly allocated object, or NULL
102     */
103     ModularExponentiator modExp(const(BigInt)* n, PowerMod.UsageHints hints) const;
104 
105 
106     /**
107     * Return a new operator object for this key, if possible
108     * Params:
109     *  key = the key we want an operator for
110     *  rng = a random number generator
111     * Returns: newly allocated operator object, or NULL
112     */
113     KeyAgreement getKeyAgreementOp(in PrivateKey key, RandomNumberGenerator rng) const;
114 
115     /**
116     * Return a new operator object for this key, if possible
117     * Params:
118     *  key = the key we want an operator for
119     *  rng = a random number generator
120     * Returns: newly allocated operator object, or NULL
121     */
122     Signature getSignatureOp(in PrivateKey key, RandomNumberGenerator rng) const;
123 
124     /**
125     * Return a new operator object for this key, if possible
126     * Params:
127     *  key = the key we want an operator for
128     *  rng = a random number generator
129     * Returns: newly allocated operator object, or NULL
130     */
131     Verification getVerifyOp(in PublicKey key, RandomNumberGenerator rng) const;
132 
133     /**
134     * Return a new operator object for this key, if possible
135     * Params:
136     *  key = the key we want an operator for
137     *  rng = a random number generator
138     * Returns: newly allocated operator object, or NULL
139     */
140     Encryption getEncryptionOp(in PublicKey key, RandomNumberGenerator rng) const;
141 
142     /**
143     * Return a new operator object for this key, if possible
144     * Params:
145     *  key = the key we want an operator for
146     *  rng = a random number generator
147     * Returns: newly allocated operator object, or NULL
148     */
149     Decryption getDecryptionOp(in PrivateKey key, RandomNumberGenerator rng) const;
150 }