5 life_cycle-cipher - The cipher algorithm life-cycle
9 All symmetric ciphers (CIPHERs) go through a number of stages in their
16 This state represents the CIPHER before it has been allocated. It is the
17 starting state for any life-cycle transitions.
21 This state represents the CIPHER after it has been allocated.
25 These states represent the CIPHER when it is set up and capable of processing
26 input. There are three possible initialised states:
30 =item initialised using EVP_CipherInit
32 =item initialised for decryption using EVP_DecryptInit
34 =item initialised for encryption using EVP_EncryptInit
40 These states represent the CIPHER when it is set up and capable of processing
41 additional input or generating output. The three possible states directly
42 correspond to those for initialised above. The three different streams should
47 This state represents the CIPHER when it has generated output.
51 This state is entered when the CIPHER is freed. It is the terminal state
52 for all life-cycle transitions.
56 =head2 State Transition Diagram
58 The usual life-cycle of a CIPHER is illustrated:
62 +---------------------------+
66 +---------------------------+ + - - - - - - - - - - - - - +
67 | ' any of the initialised '
68 | EVP_CIPHER_CTX_new ' updated or finaled states '
70 +---------------------------+ + - - - - - - - - - - - - - +
72 | newed | | EVP_CIPHER_CTX_reset
74 +---------------------------+
76 +---------+ | +---------+
77 EVP_DecryptInit | | EVP_CipherInit | EVP_EncryptInit
79 +---------------------------+ +---------------------------+ +---------------------------+
81 | initialised | | initialised | | initialised |
82 | for decryption | | | | for encryption |
83 +---------------------------+ +---------------------------+ +---------------------------+
85 | EVP_DecryptUpdate | EVP_CipherUpdate EVP_EncryptUpdate |
87 | +---------------------------+ |
88 | | |--------------------+ |
89 | | updated | EVP_CipherUpdate | |
90 | | | <------------------+ |
91 v +---------------------------+ v
92 +---------------------------+ | +---------------------------+
93 | |---------------------+ | | |
94 | updated | EVP_DecryptUpdate | | | updated |------+
95 | for decryption | <-------------------+ | | for encryption | |
96 +---------------------------+ | +---------------------------+ |
97 | EVP_CipherFinal | | ^ |
98 +-------+ | +--------+ | |
99 EVP_DecryptFinal | | | EVP_EncryptFinal +-------------------+
100 v v v EVP_EncryptUpdate
101 +---------------------------+
102 | |-----------------------------+
104 | | <---------------------------+
105 +---------------------------+ EVP_CIPHER_CTX_get_params
107 | EVP_CIPHER_CTX_free
109 +---------------------------+
113 +---------------------------+
117 =for html <img src="img/cipher.png">
119 =head2 Formal State Transitions
121 This section defines all of the legal state transitions.
122 This is the canonical list.
126 Function Call ---------------------------------------------- Current State -----------------------------------------------
127 start newed initialised updated finaled initialised updated initialised updated freed
128 decryption decryption encryption encryption
129 EVP_CIPHER_CTX_new newed
130 EVP_CipherInit initialised initialised initialised initialised initialised initialised initialised initialised
131 EVP_DecryptInit initialised initialised initialised initialised initialised initialised initialised initialised
132 decryption decryption decryption decryption decryption decryption decryption decryption
133 EVP_EncryptInit initialised initialised initialised initialised initialised initialised initialised initialised
134 encryption encryption encryption encryption encryption encryption encryption encryption
135 EVP_CipherUpdate updated updated
136 EVP_DecryptUpdate updated updated
137 decryption decryption
138 EVP_EncryptUpdate updated updated
139 encryption encryption
140 EVP_CipherFinal finaled
141 EVP_DecryptFinal finaled
142 EVP_EncryptFinal finaled
143 EVP_CIPHER_CTX_free freed freed freed freed freed freed freed freed freed
144 EVP_CIPHER_CTX_reset newed newed newed newed newed newed newed newed
145 EVP_CIPHER_CTX_get_params newed initialised updated initialised updated initialised updated
146 decryption decryption encryption encryption
147 EVP_CIPHER_CTX_set_params newed initialised updated initialised updated initialised updated
148 decryption decryption encryption encryption
149 EVP_CIPHER_CTX_gettable_params newed initialised updated initialised updated initialised updated
150 decryption decryption encryption encryption
151 EVP_CIPHER_CTX_settable_params newed initialised updated initialised updated initialised updated
152 decryption decryption encryption encryption
158 <table style="border:1px solid; border-collapse:collapse">
159 <tr><th style="border:1px solid" align="left">Function Call</th>
160 <th style="border:1px solid" colspan="10">Current State</th></tr>
161 <tr><th style="border:1px solid"></th>
162 <th style="border:1px solid" align="center">start</th>
163 <th style="border:1px solid" align="center">newed</th>
164 <th style="border:1px solid" align="center">initialised</th>
165 <th style="border:1px solid" align="center">updated</th>
166 <th style="border:1px solid" align="center">finaled</th>
167 <th style="border:1px solid" align="center">initialised<br>decryption</th>
168 <th style="border:1px solid" align="center">updated<br>decryption</th>
169 <th style="border:1px solid" align="center">initialised<br>encryption</th>
170 <th style="border:1px solid" align="center">updated<br>encryption</th>
171 <th style="border:1px solid" align="center">freed</th></tr>
172 <tr><th style="border:1px solid" align="left">EVP_CIPHER_CTX_new</th>
173 <td style="border:1px solid" align="center">newed</td>
174 <td style="border:1px solid" align="center"></td>
175 <td style="border:1px solid" align="center"></td>
176 <td style="border:1px solid" align="center"></td>
177 <td style="border:1px solid" align="center"></td>
178 <td style="border:1px solid" align="center"></td>
179 <td style="border:1px solid" align="center"></td>
180 <td style="border:1px solid" align="center"></td>
181 <td style="border:1px solid" align="center"></td>
182 <td style="border:1px solid" align="center"></td></tr>
183 <tr><th style="border:1px solid" align="left">EVP_CipherInit</th>
184 <td style="border:1px solid" align="center"></td>
185 <td style="border:1px solid" align="center">initialised</td>
186 <td style="border:1px solid" align="center">initialised</td>
187 <td style="border:1px solid" align="center">initialised</td>
188 <td style="border:1px solid" align="center">initialised</td>
189 <td style="border:1px solid" align="center">initialised</td>
190 <td style="border:1px solid" align="center">initialised</td>
191 <td style="border:1px solid" align="center">initialised</td>
192 <td style="border:1px solid" align="center">initialised</td>
193 <td style="border:1px solid" align="center"></td></tr>
194 <tr><th style="border:1px solid" align="left">EVP_DecryptInit</th>
195 <td style="border:1px solid" align="center"></td>
196 <td style="border:1px solid" align="center">initialised<br>decryption</td>
197 <td style="border:1px solid" align="center">initialised<br>decryption</td>
198 <td style="border:1px solid" align="center">initialised<br>decryption</td>
199 <td style="border:1px solid" align="center">initialised<br>decryption</td>
200 <td style="border:1px solid" align="center">initialised<br>decryption</td>
201 <td style="border:1px solid" align="center">initialised<br>decryption</td>
202 <td style="border:1px solid" align="center">initialised<br>decryption</td>
203 <td style="border:1px solid" align="center">initialised<br>decryption</td>
204 <td style="border:1px solid" align="center"></td></tr>
205 <tr><th style="border:1px solid" align="left">EVP_EncryptInit</th>
206 <td style="border:1px solid" align="center"></td>
207 <td style="border:1px solid" align="center">initialised<br>encryption</td>
208 <td style="border:1px solid" align="center">initialised<br>encryption</td>
209 <td style="border:1px solid" align="center">initialised<br>encryption</td>
210 <td style="border:1px solid" align="center">initialised<br>encryption</td>
211 <td style="border:1px solid" align="center">initialised<br>encryption</td>
212 <td style="border:1px solid" align="center">initialised<br>encryption</td>
213 <td style="border:1px solid" align="center">initialised<br>encryption</td>
214 <td style="border:1px solid" align="center">initialised<br>encryption</td>
215 <td style="border:1px solid" align="center"></td></tr>
216 <tr><th style="border:1px solid" align="left">EVP_CipherUpdate</th>
217 <td style="border:1px solid" align="center"></td>
218 <td style="border:1px solid" align="center"></td>
219 <td style="border:1px solid" align="center">updated</td>
220 <td style="border:1px solid" align="center">updated</td>
221 <td style="border:1px solid" align="center"></td>
222 <td style="border:1px solid" align="center"></td>
223 <td style="border:1px solid" align="center"></td>
224 <td style="border:1px solid" align="center"></td>
225 <td style="border:1px solid" align="center"></td>
226 <td style="border:1px solid" align="center"></td></tr>
227 <tr><th style="border:1px solid" align="left">EVP_DecryptUpdate</th>
228 <td style="border:1px solid" align="center"></td>
229 <td style="border:1px solid" align="center"></td>
230 <td style="border:1px solid" align="center"></td>
231 <td style="border:1px solid" align="center"></td>
232 <td style="border:1px solid" align="center"></td>
233 <td style="border:1px solid" align="center">updated<br>decryption</td>
234 <td style="border:1px solid" align="center">updated<br>decryption</td>
235 <td style="border:1px solid" align="center"></td>
236 <td style="border:1px solid" align="center"></td>
237 <td style="border:1px solid" align="center"></td></tr>
238 <tr><th style="border:1px solid" align="left">EVP_EncryptUpdate</th>
239 <td style="border:1px solid" align="center"></td>
240 <td style="border:1px solid" align="center"></td>
241 <td style="border:1px solid" align="center"></td>
242 <td style="border:1px solid" align="center"></td>
243 <td style="border:1px solid" align="center"></td>
244 <td style="border:1px solid" align="center"></td>
245 <td style="border:1px solid" align="center"></td>
246 <td style="border:1px solid" align="center">updated<br>encryption</td>
247 <td style="border:1px solid" align="center">updated<br>encryption</td>
248 <td style="border:1px solid" align="center"></td></tr>
249 <tr><th style="border:1px solid" align="left">EVP_CipherFinal</th>
250 <td style="border:1px solid" align="center"></td>
251 <td style="border:1px solid" align="center"></td>
252 <td style="border:1px solid" align="center"></td>
253 <td style="border:1px solid" align="center">finaled</td>
254 <td style="border:1px solid" align="center"></td>
255 <td style="border:1px solid" align="center"></td>
256 <td style="border:1px solid" align="center"></td>
257 <td style="border:1px solid" align="center"></td>
258 <td style="border:1px solid" align="center"></td>
259 <td style="border:1px solid" align="center"></td></tr>
260 <tr><th style="border:1px solid" align="left">EVP_DecryptFinal</th>
261 <td style="border:1px solid" align="center"></td>
262 <td style="border:1px solid" align="center"></td>
263 <td style="border:1px solid" align="center"></td>
264 <td style="border:1px solid" align="center"></td>
265 <td style="border:1px solid" align="center"></td>
266 <td style="border:1px solid" align="center"></td>
267 <td style="border:1px solid" align="center">finaled<br>decryption</td>
268 <td style="border:1px solid" align="center"></td>
269 <td style="border:1px solid" align="center"></td>
270 <td style="border:1px solid" align="center"></td></tr>
271 <tr><th style="border:1px solid" align="left">EVP_EncryptFinal</th>
272 <td style="border:1px solid" align="center"></td>
273 <td style="border:1px solid" align="center"></td>
274 <td style="border:1px solid" align="center"></td>
275 <td style="border:1px solid" align="center"></td>
276 <td style="border:1px solid" align="center"></td>
277 <td style="border:1px solid" align="center"></td>
278 <td style="border:1px solid" align="center"></td>
279 <td style="border:1px solid" align="center"></td>
280 <td style="border:1px solid" align="center">finaled<br>decryption</td>
281 <td style="border:1px solid" align="center"></td></tr>
282 <tr><th style="border:1px solid" align="left">EVP_CIPHER_CTX_free</th>
283 <td style="border:1px solid" align="center">freed</td>
284 <td style="border:1px solid" align="center">freed</td>
285 <td style="border:1px solid" align="center">freed</td>
286 <td style="border:1px solid" align="center">freed</td>
287 <td style="border:1px solid" align="center">freed</td>
288 <td style="border:1px solid" align="center">freed</td>
289 <td style="border:1px solid" align="center">freed</td>
290 <td style="border:1px solid" align="center">freed</td>
291 <td style="border:1px solid" align="center">freed</td>
292 <td style="border:1px solid" align="center"></td></tr>
293 <tr><th style="border:1px solid" align="left">EVP_CIPHER_CTX_reset</th>
294 <td style="border:1px solid" align="center"></td>
295 <td style="border:1px solid" align="center"></td>
296 <td style="border:1px solid" align="center">newed</td>
297 <td style="border:1px solid" align="center">newed</td>
298 <td style="border:1px solid" align="center">newed</td>
299 <td style="border:1px solid" align="center">newed</td>
300 <td style="border:1px solid" align="center">newed</td>
301 <td style="border:1px solid" align="center">newed</td>
302 <td style="border:1px solid" align="center">newed</td>
303 <td style="border:1px solid" align="center"></td></tr>
304 <tr><th style="border:1px solid" align="left">EVP_CIPHER_CTX_get_params</th>
305 <td style="border:1px solid" align="center"></td>
306 <td style="border:1px solid" align="center">newed</td>
307 <td style="border:1px solid" align="center">initialised</td>
308 <td style="border:1px solid" align="center">updated</td>
309 <td style="border:1px solid" align="center"></td>
310 <td style="border:1px solid" align="center">initialised<br>decryption</td>
311 <td style="border:1px solid" align="center">updated<br>decryption</td>
312 <td style="border:1px solid" align="center">initialised<br>encryption</td>
313 <td style="border:1px solid" align="center">updated<br>encryption</td>
314 <td style="border:1px solid" align="center"></td></tr>
315 <tr><th style="border:1px solid" align="left">EVP_CIPHER_CTX_set_params</th>
316 <td style="border:1px solid" align="center"></td>
317 <td style="border:1px solid" align="center">newed</td>
318 <td style="border:1px solid" align="center">initialised</td>
319 <td style="border:1px solid" align="center">updated</td>
320 <td style="border:1px solid" align="center"></td>
321 <td style="border:1px solid" align="center">initialised<br>decryption</td>
322 <td style="border:1px solid" align="center">updated<br>decryption</td>
323 <td style="border:1px solid" align="center">initialised<br>encryption</td>
324 <td style="border:1px solid" align="center">updated<br>encryption</td>
325 <td style="border:1px solid" align="center"></td></tr>
326 <tr><th style="border:1px solid" align="left">EVP_CIPHER_CTX_gettable_params</th>
327 <td style="border:1px solid" align="center"></td>
328 <td style="border:1px solid" align="center">newed</td>
329 <td style="border:1px solid" align="center">initialised</td>
330 <td style="border:1px solid" align="center">updated</td>
331 <td style="border:1px solid" align="center"></td>
332 <td style="border:1px solid" align="center">initialised<br>decryption</td>
333 <td style="border:1px solid" align="center">updated<br>decryption</td>
334 <td style="border:1px solid" align="center">initialised<br>encryption</td>
335 <td style="border:1px solid" align="center">updated<br>encryption</td>
336 <td style="border:1px solid" align="center"></td></tr>
337 <tr><th style="border:1px solid" align="left">EVP_CIPHER_CTX_settable_params</th>
338 <td style="border:1px solid" align="center"></td>
339 <td style="border:1px solid" align="center">newed</td>
340 <td style="border:1px solid" align="center">initialised</td>
341 <td style="border:1px solid" align="center">updated</td>
342 <td style="border:1px solid" align="center"></td>
343 <td style="border:1px solid" align="center">initialised<br>decryption</td>
344 <td style="border:1px solid" align="center">updated<br>decryption</td>
345 <td style="border:1px solid" align="center">initialised<br>encryption</td>
346 <td style="border:1px solid" align="center">updated<br>encryption</td>
347 <td style="border:1px solid" align="center"></td></tr>
354 At some point the EVP layer will begin enforcing the transitions described
359 L<provider-cipher(7)>, L<EVP_EncryptInit(3)>
363 Copyright 2021 The OpenSSL Project Authors. All Rights Reserved.
365 Licensed under the Apache License 2.0 (the "License"). You may not use
366 this file except in compliance with the License. You can obtain a copy
367 in the file LICENSE in the source distribution or at
368 L<https://www.openssl.org/source/license.html>.