2026-04-14 06:36:43 +00:00
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" lang = "en-US" >
< head >
< meta http-equiv = "Content-Type" content = "text/xhtml;charset=UTF-8" />
< meta http-equiv = "X-UA-Compatible" content = "IE=11" />
< meta name = "generator" content = "Doxygen 1.11.0" />
< meta name = "viewport" content = "width=device-width, initial-scale=1" />
< title > M5Unit-NFC: src/nfc/crypto/aes.cpp File Reference</ title >
< link href = "tabs.css" rel = "stylesheet" type = "text/css" />
< script type = "text/javascript" src = "jquery.js" ></ script >
< script type = "text/javascript" src = "dynsections.js" ></ script >
< script type = "text/javascript" src = "clipboard.js" ></ script >
< link href = "navtree.css" rel = "stylesheet" type = "text/css" />
< script type = "text/javascript" src = "navtreedata.js" ></ script >
< script type = "text/javascript" src = "navtree.js" ></ script >
< script type = "text/javascript" src = "resize.js" ></ script >
< script type = "text/javascript" src = "cookie.js" ></ script >
< link href = "search/search.css" rel = "stylesheet" type = "text/css" />
< script type = "text/javascript" src = "search/searchdata.js" ></ script >
< script type = "text/javascript" src = "search/search.js" ></ script >
< link href = "doxygen.css" rel = "stylesheet" type = "text/css" />
</ head >
< body >
< div id = "top" > <!-- do not remove this div, it is closed by doxygen! -->
< div id = "titlearea" >
< table cellspacing = "0" cellpadding = "0" >
< tbody >
< tr id = "projectrow" >
< td id = "projectalign" >
2026-05-14 06:32:28 +00:00
< div id = "projectname" > M5Unit-NFC< span id = "projectnumber" >   0.0.3 git rev:59f5362</ span >
2026-04-14 06:36:43 +00:00
</ div >
</ td >
</ tr >
</ tbody >
</ table >
</ div >
<!-- end header part -->
<!-- Generated by Doxygen 1.11.0 -->
< script type = "text/javascript" >
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
var searchBox = new SearchBox ( "searchBox" , "search/" , '.html' );
/* @license-end */
</ script >
< script type = "text/javascript" >
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
$ ( function () { codefold . init ( 0 ); });
/* @license-end */
</ script >
< script type = "text/javascript" src = "menudata.js" ></ script >
< script type = "text/javascript" src = "menu.js" ></ script >
< script type = "text/javascript" >
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
$ ( function () {
initMenu ( '' , true , false , 'search.php' , 'Search' , true );
$ ( function () { init_search (); });
});
/* @license-end */
</ script >
< div id = "main-nav" ></ div >
</ div > <!-- top -->
< div id = "side-nav" class = "ui-resizable side-nav-resizable" >
< div id = "nav-tree" >
< div id = "nav-tree-contents" >
< div id = "nav-sync" class = "sync" ></ div >
</ div >
</ div >
< div id = "splitbar" style = "-moz-user-select:none;"
class = "ui-resizable-handle" >
</ div >
</ div >
< script type = "text/javascript" >
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
$ ( function (){ initNavTree ( 'aes_8cpp.html' , '' ); initResizable ( true ); });
/* @license-end */
</ script >
< div id = "doc-content" >
<!-- window showing the filter options -->
< div id = "MSearchSelectWindow"
onmouseover = "return searchBox.OnSearchSelectShow()"
onmouseout = "return searchBox.OnSearchSelectHide()"
onkeydown = "return searchBox.OnSearchSelectKey(event)" >
</ div >
<!-- iframe showing the search results (closed by default) -->
< div id = "MSearchResultsWindow" >
< div id = "MSearchResults" >
< div class = "SRPage" >
< div id = "SRIndex" >
< div id = "SRResults" ></ div >
< div class = "SRStatus" id = "Loading" > Loading...</ div >
< div class = "SRStatus" id = "Searching" > Searching...</ div >
< div class = "SRStatus" id = "NoMatches" > No Matches</ div >
</ div >
</ div >
</ div >
</ div >
< div class = "header" >
< div class = "summary" >
< a href = "#namespaces" > Namespaces</ a > |
< a href = "#func-members" > Functions</ a > </ div >
< div class = "headertitle" >< div class = "title" > aes.cpp File Reference</ div ></ div >
</ div > <!--header-->
< div class = "contents" >
< p > AES/CMAC helpers.
< a href = "#details" > More...</ a ></ p >
< div class = "textblock" >< code > #include " < a class = "el" href = "aes_8hpp_source.html" > nfc/crypto/aes.hpp</ a > " </ code >< br />
< code > #include < M5Utility.hpp> </ code >< br />
< code > #include < cstring> </ code >< br />
< code > #include < mbedtls/aes.h> </ code >< br />
</ div >< table class = "memberdecls" >
< tr class = "heading" >< td colspan = "2" >< h2 class = "groupheader" >< a id = "namespaces" name = "namespaces" ></ a >
Namespaces</ h2 ></ td ></ tr >
< tr class = "memitem:" >< td class = "memItemLeft" align = "right" valign = "top" > namespace   </ td >< td class = "memItemRight" valign = "bottom" >< a class = "el" href = "namespacem5.html" > m5</ a ></ td ></ tr >
< tr class = "memdesc:namespacem5" >< td class = "mdescLeft" >   </ td >< td class = "mdescRight" > Top level namespace of M5stack. < br /></ td ></ tr >
< tr class = "separator:" >< td class = "memSeparator" colspan = "2" >   </ td ></ tr >
</ table >< table class = "memberdecls" >
< tr class = "heading" >< td colspan = "2" >< h2 class = "groupheader" >< a id = "func-members" name = "func-members" ></ a >
Functions</ h2 ></ td ></ tr >
< tr class = "memitem:a3be0738c24fac6d2216486db30bb064c" id = "r_a3be0738c24fac6d2216486db30bb064c" >< td class = "memItemLeft" align = "right" valign = "top" > bool  </ td >< td class = "memItemRight" valign = "bottom" >< a class = "el" href = "#a3be0738c24fac6d2216486db30bb064c" > m5::nfc::crypto::aes_ecb_encrypt</ a > (uint8_t out[16], const uint8_t key[16], const uint8_t in[16])</ td ></ tr >
< tr class = "memdesc:a3be0738c24fac6d2216486db30bb064c" >< td class = "mdescLeft" >   </ td >< td class = "mdescRight" > AES-128 ECB encryption of a single 16-byte block. < br /></ td ></ tr >
< tr class = "separator:a3be0738c24fac6d2216486db30bb064c" >< td class = "memSeparator" colspan = "2" >   </ td ></ tr >
< tr class = "memitem:ad26d67e84a0c1c2ae9d4c027d8c2d66a" id = "r_ad26d67e84a0c1c2ae9d4c027d8c2d66a" >< td class = "memItemLeft" align = "right" valign = "top" > bool  </ td >< td class = "memItemRight" valign = "bottom" >< a class = "el" href = "#ad26d67e84a0c1c2ae9d4c027d8c2d66a" > m5::nfc::crypto::aes_cbc_crypt</ a > (uint8_t *out, const uint8_t key[16], const uint8_t iv_in[16], const uint8_t *in, size_t len, bool encrypt)</ td ></ tr >
< tr class = "memdesc:ad26d67e84a0c1c2ae9d4c027d8c2d66a" >< td class = "mdescLeft" >   </ td >< td class = "mdescRight" > AES-128 CBC encrypt or decrypt. < br /></ td ></ tr >
< tr class = "separator:ad26d67e84a0c1c2ae9d4c027d8c2d66a" >< td class = "memSeparator" colspan = "2" >   </ td ></ tr >
< tr class = "memitem:a66b0e9249a6eb7b35e20d249ead7c9bf" id = "r_a66b0e9249a6eb7b35e20d249ead7c9bf" >< td class = "memItemLeft" align = "right" valign = "top" > bool  </ td >< td class = "memItemRight" valign = "bottom" >< a class = "el" href = "#a66b0e9249a6eb7b35e20d249ead7c9bf" > m5::nfc::crypto::cmac_subkeys</ a > (uint8_t k1[16], uint8_t k2[16], const uint8_t key[16])</ td ></ tr >
< tr class = "memdesc:a66b0e9249a6eb7b35e20d249ead7c9bf" >< td class = "mdescLeft" >   </ td >< td class = "mdescRight" > Generate AES-CMAC subkeys K1 and K2. < br /></ td ></ tr >
< tr class = "separator:a66b0e9249a6eb7b35e20d249ead7c9bf" >< td class = "memSeparator" colspan = "2" >   </ td ></ tr >
< tr class = "memitem:a5431d20eb1034f57fe7aecefc43c30ce" id = "r_a5431d20eb1034f57fe7aecefc43c30ce" >< td class = "memItemLeft" align = "right" valign = "top" > bool  </ td >< td class = "memItemRight" valign = "bottom" >< a class = "el" href = "#a5431d20eb1034f57fe7aecefc43c30ce" > m5::nfc::crypto::cmac_aes_128</ a > (uint8_t out[16], const uint8_t key[16], const uint8_t *msg, size_t msg_len)</ td ></ tr >
< tr class = "memdesc:a5431d20eb1034f57fe7aecefc43c30ce" >< td class = "mdescLeft" >   </ td >< td class = "mdescRight" > Calculate AES-CMAC (RFC 4493) < br /></ td ></ tr >
< tr class = "separator:a5431d20eb1034f57fe7aecefc43c30ce" >< td class = "memSeparator" colspan = "2" >   </ td ></ tr >
</ table >
< a name = "details" id = "details" ></ a >< h2 class = "groupheader" > Detailed Description</ h2 >
< div class = "textblock" >< p > AES/CMAC helpers. </ p >
</ div >< h2 class = "groupheader" > Function Documentation</ h2 >
< a id = "ad26d67e84a0c1c2ae9d4c027d8c2d66a" name = "ad26d67e84a0c1c2ae9d4c027d8c2d66a" ></ a >
< h2 class = "memtitle" >< span class = "permalink" >< a href = "#ad26d67e84a0c1c2ae9d4c027d8c2d66a" > ◆  </ a ></ span > aes_cbc_crypt()</ h2 >
< div class = "memitem" >
< div class = "memproto" >
< table class = "memname" >
< tr >
< td class = "memname" > bool m5::nfc::crypto::aes_cbc_crypt </ td >
< td > (</ td >
< td class = "paramtype" > uint8_t *</ td > < td class = "paramname" >< span class = "paramname" >< em > out</ em ></ span > , </ td >
</ tr >
< tr >
< td class = "paramkey" ></ td >
< td ></ td >
< td class = "paramtype" > const uint8_t</ td > < td class = "paramname" >< span class = "paramname" >< em > key</ em ></ span > [16], </ td >
</ tr >
< tr >
< td class = "paramkey" ></ td >
< td ></ td >
< td class = "paramtype" > const uint8_t</ td > < td class = "paramname" >< span class = "paramname" >< em > iv_in</ em ></ span > [16], </ td >
</ tr >
< tr >
< td class = "paramkey" ></ td >
< td ></ td >
< td class = "paramtype" > const uint8_t *</ td > < td class = "paramname" >< span class = "paramname" >< em > in</ em ></ span > , </ td >
</ tr >
< tr >
< td class = "paramkey" ></ td >
< td ></ td >
< td class = "paramtype" > size_t</ td > < td class = "paramname" >< span class = "paramname" >< em > len</ em ></ span > , </ td >
</ tr >
< tr >
< td class = "paramkey" ></ td >
< td ></ td >
< td class = "paramtype" > bool</ td > < td class = "paramname" >< span class = "paramname" >< em > encrypt</ em ></ span >   )</ td >
</ tr >
</ table >
</ div >< div class = "memdoc" >
< p > AES-128 CBC encrypt or decrypt. </ p >
< dl class = "params" >< dt > Parameters</ dt >< dd >
< table class = "params" >
< tr >< td class = "paramdir" > [out]</ td >< td class = "paramname" > out</ td >< td > Output buffer (same size as in) </ td ></ tr >
< tr >< td class = "paramdir" ></ td >< td class = "paramname" > key</ td >< td > AES-128 key (16 bytes) </ td ></ tr >
< tr >< td class = "paramdir" ></ td >< td class = "paramname" > iv_in</ td >< td > Initialization vector (16 bytes) </ td ></ tr >
< tr >< td class = "paramdir" ></ td >< td class = "paramname" > in</ td >< td > Input buffer </ td ></ tr >
< tr >< td class = "paramdir" ></ td >< td class = "paramname" > len</ td >< td > Input buffer length (must be multiple of 16) </ td ></ tr >
< tr >< td class = "paramdir" ></ td >< td class = "paramname" > encrypt</ td >< td > True for encrypt, false for decrypt </ td ></ tr >
</ table >
</ dd >
</ dl >
< dl class = "section return" >< dt > Returns</ dt >< dd > True if successful </ dd ></ dl >
</ div >
</ div >
< a id = "a3be0738c24fac6d2216486db30bb064c" name = "a3be0738c24fac6d2216486db30bb064c" ></ a >
< h2 class = "memtitle" >< span class = "permalink" >< a href = "#a3be0738c24fac6d2216486db30bb064c" > ◆  </ a ></ span > aes_ecb_encrypt()</ h2 >
< div class = "memitem" >
< div class = "memproto" >
< table class = "memname" >
< tr >
< td class = "memname" > bool m5::nfc::crypto::aes_ecb_encrypt </ td >
< td > (</ td >
< td class = "paramtype" > uint8_t</ td > < td class = "paramname" >< span class = "paramname" >< em > out</ em ></ span > [16], </ td >
</ tr >
< tr >
< td class = "paramkey" ></ td >
< td ></ td >
< td class = "paramtype" > const uint8_t</ td > < td class = "paramname" >< span class = "paramname" >< em > key</ em ></ span > [16], </ td >
</ tr >
< tr >
< td class = "paramkey" ></ td >
< td ></ td >
< td class = "paramtype" > const uint8_t</ td > < td class = "paramname" >< span class = "paramname" >< em > in</ em ></ span > [16]  )</ td >
</ tr >
</ table >
</ div >< div class = "memdoc" >
< p > AES-128 ECB encryption of a single 16-byte block. </ p >
< dl class = "params" >< dt > Parameters</ dt >< dd >
< table class = "params" >
< tr >< td class = "paramdir" > [out]</ td >< td class = "paramname" > out</ td >< td > Encrypted output (16 bytes) </ td ></ tr >
< tr >< td class = "paramdir" ></ td >< td class = "paramname" > key</ td >< td > AES-128 key (16 bytes) </ td ></ tr >
< tr >< td class = "paramdir" ></ td >< td class = "paramname" > in</ td >< td > Plaintext input (16 bytes) </ td ></ tr >
</ table >
</ dd >
</ dl >
< dl class = "section return" >< dt > Returns</ dt >< dd > True if successful </ dd ></ dl >
</ div >
</ div >
< a id = "a5431d20eb1034f57fe7aecefc43c30ce" name = "a5431d20eb1034f57fe7aecefc43c30ce" ></ a >
< h2 class = "memtitle" >< span class = "permalink" >< a href = "#a5431d20eb1034f57fe7aecefc43c30ce" > ◆  </ a ></ span > cmac_aes_128()</ h2 >
< div class = "memitem" >
< div class = "memproto" >
< table class = "memname" >
< tr >
< td class = "memname" > bool m5::nfc::crypto::cmac_aes_128 </ td >
< td > (</ td >
< td class = "paramtype" > uint8_t</ td > < td class = "paramname" >< span class = "paramname" >< em > out</ em ></ span > [16], </ td >
</ tr >
< tr >
< td class = "paramkey" ></ td >
< td ></ td >
< td class = "paramtype" > const uint8_t</ td > < td class = "paramname" >< span class = "paramname" >< em > key</ em ></ span > [16], </ td >
</ tr >
< tr >
< td class = "paramkey" ></ td >
< td ></ td >
< td class = "paramtype" > const uint8_t *</ td > < td class = "paramname" >< span class = "paramname" >< em > msg</ em ></ span > , </ td >
</ tr >
< tr >
< td class = "paramkey" ></ td >
< td ></ td >
< td class = "paramtype" > size_t</ td > < td class = "paramname" >< span class = "paramname" >< em > msg_len</ em ></ span >   )</ td >
</ tr >
</ table >
</ div >< div class = "memdoc" >
< p > Calculate AES-CMAC (RFC 4493) </ p >
< dl class = "params" >< dt > Parameters</ dt >< dd >
< table class = "params" >
< tr >< td class = "paramdir" > [out]</ td >< td class = "paramname" > out</ td >< td > CMAC output (16 bytes) </ td ></ tr >
< tr >< td class = "paramdir" ></ td >< td class = "paramname" > key</ td >< td > AES-128 key (16 bytes) </ td ></ tr >
< tr >< td class = "paramdir" ></ td >< td class = "paramname" > msg</ td >< td > Message buffer </ td ></ tr >
< tr >< td class = "paramdir" ></ td >< td class = "paramname" > msg_len</ td >< td > Message length </ td ></ tr >
</ table >
</ dd >
</ dl >
< dl class = "section return" >< dt > Returns</ dt >< dd > True if successful </ dd ></ dl >
</ div >
</ div >
< a id = "a66b0e9249a6eb7b35e20d249ead7c9bf" name = "a66b0e9249a6eb7b35e20d249ead7c9bf" ></ a >
< h2 class = "memtitle" >< span class = "permalink" >< a href = "#a66b0e9249a6eb7b35e20d249ead7c9bf" > ◆  </ a ></ span > cmac_subkeys()</ h2 >
< div class = "memitem" >
< div class = "memproto" >
< table class = "memname" >
< tr >
< td class = "memname" > bool m5::nfc::crypto::cmac_subkeys </ td >
< td > (</ td >
< td class = "paramtype" > uint8_t</ td > < td class = "paramname" >< span class = "paramname" >< em > k1</ em ></ span > [16], </ td >
</ tr >
< tr >
< td class = "paramkey" ></ td >
< td ></ td >
< td class = "paramtype" > uint8_t</ td > < td class = "paramname" >< span class = "paramname" >< em > k2</ em ></ span > [16], </ td >
</ tr >
< tr >
< td class = "paramkey" ></ td >
< td ></ td >
< td class = "paramtype" > const uint8_t</ td > < td class = "paramname" >< span class = "paramname" >< em > key</ em ></ span > [16]  )</ td >
</ tr >
</ table >
</ div >< div class = "memdoc" >
< p > Generate AES-CMAC subkeys K1 and K2. </ p >
< dl class = "params" >< dt > Parameters</ dt >< dd >
< table class = "params" >
< tr >< td class = "paramdir" > [out]</ td >< td class = "paramname" > k1</ td >< td > Subkey K1 (16 bytes) </ td ></ tr >
< tr >< td class = "paramdir" > [out]</ td >< td class = "paramname" > k2</ td >< td > Subkey K2 (16 bytes) </ td ></ tr >
< tr >< td class = "paramdir" ></ td >< td class = "paramname" > key</ td >< td > AES-128 key (16 bytes) </ td ></ tr >
</ table >
</ dd >
</ dl >
< dl class = "section return" >< dt > Returns</ dt >< dd > True if successful </ dd ></ dl >
</ div >
</ div >
</ div > <!-- contents -->
</ div > <!-- doc-content -->
<!-- start footer part -->
< div id = "nav-path" class = "navpath" > <!-- id is needed for treeview function! -->
< ul >
< li class = "navelem" >< a class = "el" href = "dir_68267d1309a1af8e8297ef4c3efbcdba.html" > src</ a ></ li >< li class = "navelem" >< a class = "el" href = "dir_59410e1461a4f8107dcbc9b19538c327.html" > nfc</ a ></ li >< li class = "navelem" >< a class = "el" href = "dir_ffdbe2113e5d91887eca457e1e994882.html" > crypto</ a ></ li >< li class = "navelem" >< a class = "el" href = "aes_8cpp.html" > aes.cpp</ a ></ li >
< li class = "footer" > Generated by < a href = "https://www.doxygen.org/index.html" >< img class = "footer" src = "doxygen.svg" width = "104" height = "31" alt = "doxygen" /></ a > 1.11.0 </ li >
</ ul >
</ div >
</ body >
</ html >