digraph cipher { bgcolor="transparent"; begin [label=start, color="#deeaee", style="filled"]; newed [fontcolor="#c94c4c", style="solid"]; initialised [fontcolor="#c94c4c"]; updated [fontcolor="#c94c4c"]; finaled [fontcolor="#c94c4c"]; end [label="freed", color="#deeaee", style="filled"]; d_initialised [label="initialised\n(decryption)", fontcolor="#c94c4c"]; d_updated [label="updated\n(decryption)", fontcolor="#c94c4c"]; e_initialised [label="initialised\n(encryption)", fontcolor="#c94c4c"]; e_updated [label="updated\n(encryption)", fontcolor="#c94c4c"]; begin -> newed [label="EVP_CIPHER_CTX_new"]; newed -> initialised [label="EVP_CipherInit"]; initialised -> initialised [label="EVP_CipherInit\n(not required but allowed)", style=dashed]; initialised -> updated [label="EVP_CipherUpdate", weight=2]; updated -> updated [label="EVP_CipherUpdate"]; updated -> finaled [label="EVP_CipherFinal"]; finaled -> finaled [label="EVP_CIPHER_CTX_get_params\n(AEAD encryption)", style=dashed]; finaled -> end [label="EVP_CIPHER_CTX_free"]; newed -> d_initialised [label="EVP_DecryptInit"]; d_initialised -> d_initialised [label="EVP_DecryptInit\n(not required but allowed)", style=dashed]; d_initialised -> d_updated [label="EVP_DecryptUpdate", weight=2]; d_updated -> d_updated [label="EVP_DecryptUpdate"]; d_updated -> finaled [label="EVP_DecryptFinal"]; newed -> e_initialised [label="EVP_EncryptInit"]; e_initialised -> e_initialised [label="EVP_EncryptInit\n(not required but allowed)", style=dashed]; e_initialised -> e_updated [label="EVP_EncryptUpdate", weight=2]; e_updated -> e_updated [label="EVP_EncryptUpdate"]; e_updated -> finaled [label="EVP_EncryptFinal"]; most -> newed [label="EVP_CIPHER_CTX_reset", style=dashed, color="#034f84", fontcolor="#034f84"]; most [label="any of the initialised\nupdated or finaled states", style=dashed, color="#034f84", fontcolor="#034f84"]; } /* This is a version with a single flavour which is easier to comprehend digraph cipher { bgcolor="transparent"; begin [label=start, color="#deeaee", style="filled"]; newed [fontcolor="#c94c4c", style="solid"]; initialised [fontcolor="#c94c4c"]; updated [fontcolor="#c94c4c"]; finaled [fontcolor="#c94c4c"]; end [label="freed", color="#deeaee", style="filled"]; begin -> newed [label="EVP_CIPHER_CTX_new"]; newed -> initialised [label="EVP_CipherInit"]; initialised -> initialised [label="EVP_CipherInit\n(not required but allowed)", style=dashed]; initialised -> updated [label="EVP_CipherUpdate", weight=2]; updated -> updated [label="EVP_CipherUpdate"]; updated -> finaled [label="EVP_CipherFinal"]; finaled -> finaled [label="EVP_CIPHER_CTX_get_params\n(AEAD encryption)", style=dashed]; finaled -> end [label="EVP_CIPHER_CTX_free"]; finaled -> newed [label="EVP_CIPHER_CTX_reset", style=dashed, color="#034f84", fontcolor="#034f84"]; updated -> newed [label="EVP_CIPHER_CTX_reset", style=dashed, color="#034f84", fontcolor="#034f84"]; } */