1*b077aed3SPierre Pronchery=pod 2*b077aed3SPierre Pronchery 3*b077aed3SPierre Pronchery=head1 NAME 4*b077aed3SPierre Pronchery 5*b077aed3SPierre Proncherylife_cycle-digest - The digest algorithm life-cycle 6*b077aed3SPierre Pronchery 7*b077aed3SPierre Pronchery=head1 DESCRIPTION 8*b077aed3SPierre Pronchery 9*b077aed3SPierre ProncheryAll message digests (MDs) go through a number of stages in their life-cycle: 10*b077aed3SPierre Pronchery 11*b077aed3SPierre Pronchery=over 4 12*b077aed3SPierre Pronchery 13*b077aed3SPierre Pronchery=item start 14*b077aed3SPierre Pronchery 15*b077aed3SPierre ProncheryThis state represents the MD before it has been allocated. It is the 16*b077aed3SPierre Proncherystarting state for any life-cycle transitions. 17*b077aed3SPierre Pronchery 18*b077aed3SPierre Pronchery=item newed 19*b077aed3SPierre Pronchery 20*b077aed3SPierre ProncheryThis state represents the MD after it has been allocated. 21*b077aed3SPierre Pronchery 22*b077aed3SPierre Pronchery=item initialised 23*b077aed3SPierre Pronchery 24*b077aed3SPierre ProncheryThis state represents the MD when it is set up and capable of processing 25*b077aed3SPierre Proncheryinput. 26*b077aed3SPierre Pronchery 27*b077aed3SPierre Pronchery=item updated 28*b077aed3SPierre Pronchery 29*b077aed3SPierre ProncheryThis state represents the MD when it is set up and capable of processing 30*b077aed3SPierre Proncheryadditional input or generating output. 31*b077aed3SPierre Pronchery 32*b077aed3SPierre Pronchery=item finaled 33*b077aed3SPierre Pronchery 34*b077aed3SPierre ProncheryThis state represents the MD when it has generated output. 35*b077aed3SPierre Pronchery 36*b077aed3SPierre Pronchery=item freed 37*b077aed3SPierre Pronchery 38*b077aed3SPierre ProncheryThis state is entered when the MD is freed. It is the terminal state 39*b077aed3SPierre Proncheryfor all life-cycle transitions. 40*b077aed3SPierre Pronchery 41*b077aed3SPierre Pronchery=back 42*b077aed3SPierre Pronchery 43*b077aed3SPierre Pronchery=head2 State Transition Diagram 44*b077aed3SPierre Pronchery 45*b077aed3SPierre ProncheryThe usual life-cycle of a MD is illustrated: 46*b077aed3SPierre Pronchery 47*b077aed3SPierre Pronchery=begin man 48*b077aed3SPierre Pronchery 49*b077aed3SPierre Pronchery +-------------------+ 50*b077aed3SPierre Pronchery | start | 51*b077aed3SPierre Pronchery +-------------------+ 52*b077aed3SPierre Pronchery | 53*b077aed3SPierre Pronchery | EVP_MD_CTX_new 54*b077aed3SPierre Pronchery v 55*b077aed3SPierre Pronchery +-------------------+ EVP_MD_CTX_reset 56*b077aed3SPierre Pronchery | newed | <------------------------------+ 57*b077aed3SPierre Pronchery +-------------------+ | 58*b077aed3SPierre Pronchery | | 59*b077aed3SPierre Pronchery | EVP_DigestInit | 60*b077aed3SPierre Pronchery v | 61*b077aed3SPierre Pronchery +-------------------+ | 62*b077aed3SPierre Pronchery +--> | initialised | <+ EVP_DigestInit | 63*b077aed3SPierre Pronchery | +-------------------+ | | 64*b077aed3SPierre Pronchery | | | EVP_DigestUpdate | 65*b077aed3SPierre Pronchery | | EVP_DigestUpdate | +------------------+ | 66*b077aed3SPierre Pronchery | v | v | | 67*b077aed3SPierre Pronchery | +------------------------------------------------+ | 68*b077aed3SPierre Pronchery EVP_DigestInit | | updated | --+ 69*b077aed3SPierre Pronchery | +------------------------------------------------+ | 70*b077aed3SPierre Pronchery | | | | 71*b077aed3SPierre Pronchery | | EVP_DigestFinal | EVP_DigestFinalXOF | 72*b077aed3SPierre Pronchery | v v | 73*b077aed3SPierre Pronchery | +------------------------------------------------+ | 74*b077aed3SPierre Pronchery +--- | finaled | --+ 75*b077aed3SPierre Pronchery +------------------------------------------------+ 76*b077aed3SPierre Pronchery | 77*b077aed3SPierre Pronchery | EVP_MD_CTX_free 78*b077aed3SPierre Pronchery v 79*b077aed3SPierre Pronchery +-------------------+ 80*b077aed3SPierre Pronchery | freed | 81*b077aed3SPierre Pronchery +-------------------+ 82*b077aed3SPierre Pronchery 83*b077aed3SPierre Pronchery=end man 84*b077aed3SPierre Pronchery 85*b077aed3SPierre Pronchery=for html <img src="img/digest.png"> 86*b077aed3SPierre Pronchery 87*b077aed3SPierre Pronchery=head2 Formal State Transitions 88*b077aed3SPierre Pronchery 89*b077aed3SPierre ProncheryThis section defines all of the legal state transitions. 90*b077aed3SPierre ProncheryThis is the canonical list. 91*b077aed3SPierre Pronchery 92*b077aed3SPierre Pronchery=begin man 93*b077aed3SPierre Pronchery 94*b077aed3SPierre Pronchery Function Call --------------------- Current State ---------------------- 95*b077aed3SPierre Pronchery start newed initialised updated finaled freed 96*b077aed3SPierre Pronchery EVP_MD_CTX_new newed 97*b077aed3SPierre Pronchery EVP_DigestInit initialised initialised initialised initialised 98*b077aed3SPierre Pronchery EVP_DigestUpdate updated updated 99*b077aed3SPierre Pronchery EVP_DigestFinal finaled 100*b077aed3SPierre Pronchery EVP_DigestFinalXOF finaled 101*b077aed3SPierre Pronchery EVP_MD_CTX_free freed freed freed freed freed 102*b077aed3SPierre Pronchery EVP_MD_CTX_reset newed newed newed newed 103*b077aed3SPierre Pronchery EVP_MD_CTX_get_params newed initialised updated 104*b077aed3SPierre Pronchery EVP_MD_CTX_set_params newed initialised updated 105*b077aed3SPierre Pronchery EVP_MD_CTX_gettable_params newed initialised updated 106*b077aed3SPierre Pronchery EVP_MD_CTX_settable_params newed initialised updated 107*b077aed3SPierre Pronchery 108*b077aed3SPierre Pronchery=end man 109*b077aed3SPierre Pronchery 110*b077aed3SPierre Pronchery=begin html 111*b077aed3SPierre Pronchery 112*b077aed3SPierre Pronchery<table style="border:1px solid; border-collapse:collapse"> 113*b077aed3SPierre Pronchery<tr><th style="border:1px solid" align="left">Function Call</th> 114*b077aed3SPierre Pronchery <th style="border:1px solid" colspan="6">Current State</th></tr> 115*b077aed3SPierre Pronchery<tr><th style="border:1px solid"></th> 116*b077aed3SPierre Pronchery <th style="border:1px solid" align="center">start</th> 117*b077aed3SPierre Pronchery <th style="border:1px solid" align="center">newed</th> 118*b077aed3SPierre Pronchery <th style="border:1px solid" align="center">initialised</th> 119*b077aed3SPierre Pronchery <th style="border:1px solid" align="center">updated</th> 120*b077aed3SPierre Pronchery <th style="border:1px solid" align="center">finaled</th> 121*b077aed3SPierre Pronchery <th style="border:1px solid" align="center">freed</th></tr> 122*b077aed3SPierre Pronchery<tr><th style="border:1px solid" align="left">EVP_MD_CTX_new</th> 123*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">newed</td> 124*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 125*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 126*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 127*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 128*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td></tr> 129*b077aed3SPierre Pronchery<tr><th style="border:1px solid" align="left">EVP_DigestInit</th> 130*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 131*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">initialised</td> 132*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">initialised</td> 133*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">initialised</td> 134*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">initialised</td> 135*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td></tr> 136*b077aed3SPierre Pronchery<tr><th style="border:1px solid" align="left">EVP_DigestUpdate</th> 137*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 138*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 139*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">updated</td> 140*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">updated</td> 141*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 142*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td></tr> 143*b077aed3SPierre Pronchery<tr><th style="border:1px solid" align="left">EVP_DigestFinal</th> 144*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 145*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 146*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 147*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">finaled</td> 148*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 149*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td></tr> 150*b077aed3SPierre Pronchery<tr><th style="border:1px solid" align="left">EVP_DigestFinalXOF</th> 151*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 152*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 153*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 154*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">finaled</td> 155*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 156*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td></tr> 157*b077aed3SPierre Pronchery<tr><th style="border:1px solid" align="left">EVP_MD_CTX_free</th> 158*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">freed</td> 159*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">freed</td> 160*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">freed</td> 161*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">freed</td> 162*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">freed</td> 163*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td></tr> 164*b077aed3SPierre Pronchery<tr><th style="border:1px solid" align="left">EVP_MD_CTX_reset</th> 165*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 166*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">newed</td> 167*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">newed</td> 168*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">newed</td> 169*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">newed</td> 170*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td></tr> 171*b077aed3SPierre Pronchery<tr><th style="border:1px solid" align="left">EVP_MD_CTX_get_params</th> 172*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 173*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">newed</td> 174*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">initialised</td> 175*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">updated</td> 176*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 177*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td></tr> 178*b077aed3SPierre Pronchery<tr><th style="border:1px solid" align="left">EVP_MD_CTX_set_params</th> 179*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 180*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">newed</td> 181*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">initialised</td> 182*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">updated</td> 183*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 184*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td></tr> 185*b077aed3SPierre Pronchery<tr><th style="border:1px solid" align="left">EVP_MD_CTX_gettable_params</th> 186*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 187*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">newed</td> 188*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">initialised</td> 189*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">updated</td> 190*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 191*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td></tr> 192*b077aed3SPierre Pronchery<tr><th style="border:1px solid" align="left">EVP_MD_CTX_settable_params</th> 193*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 194*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">newed</td> 195*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">initialised</td> 196*b077aed3SPierre Pronchery <td style="border:1px solid" align="center">updated</td> 197*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td> 198*b077aed3SPierre Pronchery <td style="border:1px solid" align="center"></td></tr> 199*b077aed3SPierre Pronchery</table> 200*b077aed3SPierre Pronchery 201*b077aed3SPierre Pronchery=end html 202*b077aed3SPierre Pronchery 203*b077aed3SPierre Pronchery=head1 NOTES 204*b077aed3SPierre Pronchery 205*b077aed3SPierre ProncheryAt some point the EVP layer will begin enforcing the transitions described 206*b077aed3SPierre Proncheryherein. 207*b077aed3SPierre Pronchery 208*b077aed3SPierre Pronchery=head1 SEE ALSO 209*b077aed3SPierre Pronchery 210*b077aed3SPierre ProncheryL<provider-digest(7)>, L<EVP_DigestInit(3)> 211*b077aed3SPierre Pronchery 212*b077aed3SPierre Pronchery=head1 COPYRIGHT 213*b077aed3SPierre Pronchery 214*b077aed3SPierre ProncheryCopyright 2021 The OpenSSL Project Authors. All Rights Reserved. 215*b077aed3SPierre Pronchery 216*b077aed3SPierre ProncheryLicensed under the Apache License 2.0 (the "License"). You may not use 217*b077aed3SPierre Proncherythis file except in compliance with the License. You can obtain a copy 218*b077aed3SPierre Proncheryin the file LICENSE in the source distribution or at 219*b077aed3SPierre ProncheryL<https://www.openssl.org/source/license.html>. 220*b077aed3SPierre Pronchery 221*b077aed3SPierre Pronchery=cut 222