Files
libaaruformat/docs/html/wii__crypto_8c_source.html

368 lines
52 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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.16.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>libaaruformat: src/ngcw/wii_crypto.c Source File</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="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">
<div id="projectname">libaaruformat<span id="projectnumber">&#160;1.0</span>
</div>
<div id="projectbrief">Aaru Data Preservation Suite - Format Library</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.16.1 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search/",'.html');
</script>
<script type="text/javascript">
$(function() { codefold.init(); });
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
</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">
$(function(){initNavTree('wii__crypto_8c_source.html','',''); });
</script>
<div id="container">
<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="headertitle"><div class="title">wii_crypto.c</div></div>
</div><!--header-->
<div class="contents">
<a href="wii__crypto_8c.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/*</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"> * This file is part of the Aaru Data Preservation Suite.</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment"> * Copyright (c) 2019-2026 Natalia Portillo.</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"> *</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment"> * This library is free software; you can redistribute it and/or modify</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"> * it under the terms of the GNU Lesser General Public License as</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment"> * published by the Free Software Foundation; version 2.1 of the License.</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"> *</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment"> * This library is distributed in the hope that it will be useful, but</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"> * WITHOUT ANY WARRANTY; without even the implied warranty of</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> * Lesser General Public License for more details.</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"> *</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment"> * You should have received a copy of the GNU Lesser General Public</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="comment"> * License along with this library; if not, see</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="comment"> * &lt;https://www.gnu.org/licenses/&gt;.</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="comment"> *</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="comment"> * Nintendo Wii disc encryption: partition key map, group encrypt/decrypt.</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="comment"> */</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> </div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#include &lt;stdint.h&gt;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#include &lt;stdlib.h&gt;</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#include &lt;string.h&gt;</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> </div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#include &lt;<a class="code" href="aaruformat_8h.html">aaruformat.h</a>&gt;</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#include &quot;<a class="code" href="aes128_8h.html">../lib/aes128.h</a>&quot;</span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="preprocessor">#include &quot;<a class="code" href="wii__crypto_8h.html">wii_crypto.h</a>&quot;</span></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> </div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="comment">/* ---- Little-endian helpers ---- */</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> </div>
<div class="foldopen" id="foldopen00032" data-start="{" data-end="}">
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"><a class="line" href="wii__crypto_8c.html#a2e85418928614df336b5df9f3c28cbc7"> 32</a></span><span class="keyword">static</span> uint32_t <a class="code hl_function" href="wii__crypto_8c.html#a2e85418928614df336b5df9f3c28cbc7">read_le32</a>(<span class="keyword">const</span> uint8_t *p)</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span>{ <span class="keywordflow">return</span> (uint32_t)p[0] | ((uint32_t)p[1] &lt;&lt; 8) | ((uint32_t)p[2] &lt;&lt; 16) | ((uint32_t)p[3] &lt;&lt; 24); }</div>
</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> </div>
<div class="foldopen" id="foldopen00035" data-start="{" data-end="}">
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"><a class="line" href="wii__crypto_8c.html#a4ed80664538efb908d3c161aec613612"> 35</a></span><span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code hl_function" href="wii__crypto_8c.html#a4ed80664538efb908d3c161aec613612">write_le32</a>(uint8_t *p, uint32_t v)</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span>{</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> p[0] = (uint8_t)(v &amp; 0xFF);</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> p[1] = (uint8_t)((v &gt;&gt; 8) &amp; 0xFF);</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> p[2] = (uint8_t)((v &gt;&gt; 16) &amp; 0xFF);</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> p[3] = (uint8_t)((v &gt;&gt; 24) &amp; 0xFF);</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span>}</div>
</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> </div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="comment">/* ---- Key lookup ---- */</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> </div>
<div class="foldopen" id="foldopen00045" data-start="{" data-end="}">
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"><a class="line" href="wii__crypto_8c.html#a1ce70cb0d83e9893accd7f06f218146a"> 45</a></span><span class="keyword">const</span> uint8_t *<a class="code hl_function" href="wii__crypto_8c.html#a1ce70cb0d83e9893accd7f06f218146a">wii_get_sector_key</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structWiiPartitionRegion.html">WiiPartitionRegion</a> *regions, uint32_t region_count, uint64_t logical_sector)</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span>{</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> <span class="keywordflow">if</span>(regions == NULL || region_count == 0) <span class="keywordflow">return</span> NULL;</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> </div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> <span class="comment">/* Convert logical (2048-byte) sector to physical (0x8000-byte) group */</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> uint64_t phys_group = logical_sector / <a class="code hl_define" href="wii__crypto_8h.html#af6ed59742196c351932ad0f0e5e43566">WII_LOGICAL_PER_GROUP</a>;</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> </div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; region_count; i++)</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> {</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> <span class="keywordflow">if</span>(phys_group &gt;= regions[i].start_sector &amp;&amp; phys_group &lt; regions[i].end_sector)</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> {</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <span class="comment">/* For Wii, data_offset already skips the partition header.</span></div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span><span class="comment"> * ALL groups in [start_sector, end_sector) are encrypted. */</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <span class="keywordflow">return</span> regions[i].<a class="code hl_variable" href="structWiiPartitionRegion.html#a13965236bc19addfba3c0e7d089783bf">key</a>;</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> }</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> }</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> </div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="comment">/* Outside any known partition — plaintext */</span></div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <span class="keywordflow">return</span> NULL;</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span>}</div>
</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> </div>
<div class="foldopen" id="foldopen00066" data-start="{" data-end="}">
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"><a class="line" href="wii__crypto_8c.html#a96843770fc0189beeae56cbab35c1d79"> 66</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="wii__crypto_8c.html#a96843770fc0189beeae56cbab35c1d79">wii_is_sector_encrypted</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structWiiPartitionRegion.html">WiiPartitionRegion</a> *regions, uint32_t region_count, uint64_t logical_sector)</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span>{ <span class="keywordflow">return</span> <a class="code hl_function" href="wii__crypto_8c.html#a1ce70cb0d83e9893accd7f06f218146a">wii_get_sector_key</a>(regions, region_count, logical_sector) != NULL; }</div>
</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> </div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span><span class="comment">/* ---- Group encrypt/decrypt ---- */</span></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> </div>
<div class="foldopen" id="foldopen00071" data-start="{" data-end="}">
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"><a class="line" href="wii__crypto_8c.html#a95d508bfdafd91552793ad54a677d511"> 71</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="wii__crypto_8c.html#a95d508bfdafd91552793ad54a677d511">wii_encrypt_group</a>(<span class="keyword">const</span> uint8_t key[16], <span class="keyword">const</span> uint8_t *hash_block, <span class="keyword">const</span> uint8_t *data_in, uint8_t *out)</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span>{</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> <span class="comment">/* Hash block: first 0x400 bytes, IV = all zeros */</span></div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> uint8_t iv[16];</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> memset(iv, 0, <span class="keyword">sizeof</span>(iv));</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> memcpy(out, hash_block, <a class="code hl_define" href="wii__crypto_8h.html#ac673ea3e31315ae51d390d06df7340cb">WII_GROUP_HASH_SIZE</a>);</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <a class="code hl_function" href="aes128_8c.html#ae5b59a027bc443c26cc5626455d77eb9">aes128_cbc_encrypt</a>(key, iv, out, <a class="code hl_define" href="wii__crypto_8h.html#ac673ea3e31315ae51d390d06df7340cb">WII_GROUP_HASH_SIZE</a>);</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> </div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="comment">/* Data block: next 0x7C00 bytes.</span></div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span><span class="comment"> * IV = bytes 0x3D0..0x3DF of the ENCRYPTED hash output (just written to out). */</span></div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> uint8_t data_iv[16];</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> memcpy(data_iv, out + 0x3D0, 16);</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> memcpy(out + <a class="code hl_define" href="wii__crypto_8h.html#ac673ea3e31315ae51d390d06df7340cb">WII_GROUP_HASH_SIZE</a>, data_in, <a class="code hl_define" href="wii__crypto_8h.html#ab21867411a4f988431fc692baa0389d6">WII_GROUP_DATA_SIZE</a>);</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <a class="code hl_function" href="aes128_8c.html#ae5b59a027bc443c26cc5626455d77eb9">aes128_cbc_encrypt</a>(key, data_iv, out + <a class="code hl_define" href="wii__crypto_8h.html#ac673ea3e31315ae51d390d06df7340cb">WII_GROUP_HASH_SIZE</a>, <a class="code hl_define" href="wii__crypto_8h.html#ab21867411a4f988431fc692baa0389d6">WII_GROUP_DATA_SIZE</a>);</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span>}</div>
</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> </div>
<div class="foldopen" id="foldopen00087" data-start="{" data-end="}">
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"><a class="line" href="wii__crypto_8c.html#aaf605c039a65fc8507d97ef47b6641ee"> 87</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="wii__crypto_8c.html#aaf605c039a65fc8507d97ef47b6641ee">wii_decrypt_group</a>(<span class="keyword">const</span> uint8_t key[16], <span class="keyword">const</span> uint8_t *in, uint8_t *hash_block, uint8_t *data_out)</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span>{</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <span class="comment">/* Hash block: first 0x400 bytes, IV = all zeros */</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> uint8_t iv[16];</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> memset(iv, 0, <span class="keyword">sizeof</span>(iv));</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> memcpy(hash_block, in, <a class="code hl_define" href="wii__crypto_8h.html#ac673ea3e31315ae51d390d06df7340cb">WII_GROUP_HASH_SIZE</a>);</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <a class="code hl_function" href="aes128_8c.html#a86c652b61efa48d45729e9eea1bab8b1">aes128_cbc_decrypt</a>(key, iv, hash_block, <a class="code hl_define" href="wii__crypto_8h.html#ac673ea3e31315ae51d390d06df7340cb">WII_GROUP_HASH_SIZE</a>);</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> </div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="comment">/* Data block: next 0x7C00 bytes.</span></div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span><span class="comment"> * IV = bytes 0x3D0..0x3DF of the ENCRYPTED input (not the decrypted hash block). */</span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> uint8_t data_iv[16];</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> memcpy(data_iv, in + 0x3D0, 16);</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> memcpy(data_out, in + <a class="code hl_define" href="wii__crypto_8h.html#ac673ea3e31315ae51d390d06df7340cb">WII_GROUP_HASH_SIZE</a>, <a class="code hl_define" href="wii__crypto_8h.html#ab21867411a4f988431fc692baa0389d6">WII_GROUP_DATA_SIZE</a>);</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> <a class="code hl_function" href="aes128_8c.html#a86c652b61efa48d45729e9eea1bab8b1">aes128_cbc_decrypt</a>(key, data_iv, data_out, <a class="code hl_define" href="wii__crypto_8h.html#ab21867411a4f988431fc692baa0389d6">WII_GROUP_DATA_SIZE</a>);</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span>}</div>
</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> </div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span><span class="comment">/* ---- Serialization (same format as Wii U) ---- */</span></div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> </div>
<div class="foldopen" id="foldopen00105" data-start="{" data-end="}">
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"><a class="line" href="wii__crypto_8c.html#a6bf12a89fe7f2d5be3fa99dc69e19979"> 105</a></span>int32_t <a class="code hl_function" href="wii__crypto_8c.html#a6bf12a89fe7f2d5be3fa99dc69e19979">wii_serialize_partition_key_map</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structWiiPartitionRegion.html">WiiPartitionRegion</a> *regions, uint32_t count, uint8_t **out_data,</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> uint32_t *out_len)</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span>{</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> <span class="keywordflow">if</span>(out_data == NULL || out_len == NULL) <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> </div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> <span class="keywordflow">if</span>(count &gt; <a class="code hl_define" href="wii__crypto_8h.html#aad4c6376c0653f8b2836fa3a703a97ad">WII_MAX_PARTITIONS</a>) <span class="keywordflow">return</span> -3;</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> </div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> uint32_t size = 4 + count * 24;</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> uint8_t *buf = (uint8_t *)malloc(size);</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> </div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <span class="keywordflow">if</span>(buf == NULL) <span class="keywordflow">return</span> -4;</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> </div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> <a class="code hl_function" href="wii__crypto_8c.html#a4ed80664538efb908d3c161aec613612">write_le32</a>(buf, count);</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> </div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; count; i++)</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> {</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> uint32_t offset = 4 + i * 24;</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> <a class="code hl_function" href="wii__crypto_8c.html#a4ed80664538efb908d3c161aec613612">write_le32</a>(buf + offset, regions[i].start_sector);</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> <a class="code hl_function" href="wii__crypto_8c.html#a4ed80664538efb908d3c161aec613612">write_le32</a>(buf + offset + 4, regions[i].end_sector);</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> memcpy(buf + offset + 8, regions[i].key, 16);</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> }</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> </div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> *out_data = buf;</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> *out_len = size;</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span>}</div>
</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> </div>
<div class="foldopen" id="foldopen00132" data-start="{" data-end="}">
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"><a class="line" href="wii__crypto_8c.html#a2b7a0d75fbfe5563b03a6e83d528402a"> 132</a></span>int32_t <a class="code hl_function" href="wii__crypto_8c.html#a2b7a0d75fbfe5563b03a6e83d528402a">wii_deserialize_partition_key_map</a>(<span class="keyword">const</span> uint8_t *data, uint32_t data_len, <a class="code hl_struct" href="structWiiPartitionRegion.html">WiiPartitionRegion</a> **regions,</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> uint32_t *count)</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span>{</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="keywordflow">if</span>(data == NULL || regions == NULL || count == NULL) <span class="keywordflow">return</span> -1;</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> </div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> <span class="keywordflow">if</span>(data_len &lt; 4) <span class="keywordflow">return</span> -2;</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> </div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> uint32_t region_count = <a class="code hl_function" href="wii__crypto_8c.html#a2e85418928614df336b5df9f3c28cbc7">read_le32</a>(data);</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> </div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <span class="keywordflow">if</span>(region_count &gt; <a class="code hl_define" href="wii__crypto_8h.html#aad4c6376c0653f8b2836fa3a703a97ad">WII_MAX_PARTITIONS</a>) <span class="keywordflow">return</span> -3;</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> </div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <span class="keywordflow">if</span>(region_count == 0)</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> {</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> *regions = NULL;</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> *count = 0;</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> }</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> </div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> uint32_t required = 4 + region_count * 24;</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> </div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="keywordflow">if</span>(data_len &lt; required) <span class="keywordflow">return</span> -2;</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> </div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <a class="code hl_struct" href="structWiiPartitionRegion.html">WiiPartitionRegion</a> *r = (<a class="code hl_struct" href="structWiiPartitionRegion.html">WiiPartitionRegion</a> *)malloc(region_count * <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structWiiPartitionRegion.html">WiiPartitionRegion</a>));</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> </div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keywordflow">if</span>(r == NULL) <span class="keywordflow">return</span> -4;</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> </div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <span class="keywordflow">for</span>(uint32_t i = 0; i &lt; region_count; i++)</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> {</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> uint32_t offset = 4 + i * 24;</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> r[i].<a class="code hl_variable" href="structWiiPartitionRegion.html#a06eb8901b0a0b652c573d3879024efbb">start_sector</a> = <a class="code hl_function" href="wii__crypto_8c.html#a2e85418928614df336b5df9f3c28cbc7">read_le32</a>(data + offset);</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> r[i].<a class="code hl_variable" href="structWiiPartitionRegion.html#a99f8cd96b1258c9174988fcb3db1c92d">end_sector</a> = <a class="code hl_function" href="wii__crypto_8c.html#a2e85418928614df336b5df9f3c28cbc7">read_le32</a>(data + offset + 4);</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> memcpy(r[i].key, data + offset + 8, 16);</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> </div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> <span class="keywordflow">if</span>(r[i].start_sector &gt;= r[i].end_sector)</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> {</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> memset(r, 0, region_count * <span class="keyword">sizeof</span>(<a class="code hl_struct" href="structWiiPartitionRegion.html">WiiPartitionRegion</a>));</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> free(r);</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> <span class="keywordflow">return</span> -5;</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> }</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> }</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> </div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> *regions = r;</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> *count = region_count;</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span>}</div>
</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> </div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span><span class="comment">/* ---- Lazy initialization ---- */</span></div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> </div>
<div class="foldopen" id="foldopen00180" data-start="{" data-end="}">
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"><a class="line" href="wii__crypto_8c.html#aee93568d673177b4ed369b0032c6c68b"> 180</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="wii__crypto_8c.html#aee93568d673177b4ed369b0032c6c68b">wii_lazy_init</a>(<a class="code hl_struct" href="structaaruformat__context.html">aaruformat_context</a> *ctx)</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span>{</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> <span class="keywordflow">if</span>(ctx == NULL) <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> </div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> <span class="comment">/* Read and deserialize partition key map from media tags */</span></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aaf475c0a1941563a9e1598f02ac48b66">wii_partition_regions</a> == NULL)</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> {</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> <a class="code hl_struct" href="structmediaTagEntry.html">mediaTagEntry</a> *item = NULL;</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> int32_t tag = <a class="code hl_enumvalue" href="group__MediaTags.html#ggabdd09c559df8f34ae68fcb2ff1892ebea9c9957b78c45e90f0a74b53452b510ea">kMediaTagWiiPartitionKeyMap</a>;</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> HASH_FIND_INT(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#a8b769e9fb9467aa11d4a2936cf5cf5ed">mediaTags</a>, &amp;tag, item);</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> </div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <span class="keywordflow">if</span>(item != NULL &amp;&amp; item-&gt;<a class="code hl_variable" href="structmediaTagEntry.html#aa96c6684fd98145d0089d72957d2afa7">length</a> &gt;= 4)</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> {</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> <a class="code hl_struct" href="structWiiPartitionRegion.html">WiiPartitionRegion</a> *regions = NULL;</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> uint32_t count = 0;</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> </div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> <span class="keywordflow">if</span>(<a class="code hl_function" href="wii__crypto_8c.html#a2b7a0d75fbfe5563b03a6e83d528402a">wii_deserialize_partition_key_map</a>(item-&gt;<a class="code hl_variable" href="structmediaTagEntry.html#a334fc65b37efdfb624e804e98c398927">data</a>, item-&gt;<a class="code hl_variable" href="structmediaTagEntry.html#aa96c6684fd98145d0089d72957d2afa7">length</a>, &amp;regions, &amp;count) == 0)</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> {</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aaf475c0a1941563a9e1598f02ac48b66">wii_partition_regions</a> = regions;</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#aa3dd955c7f01ecb619b3862fecce7110">wii_partition_region_count</a> = count;</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> }</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> }</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> }</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> </div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="comment">/* Allocate the encrypted group cache if needed */</span></div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> <span class="keywordflow">if</span>(ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ae1b2a0044c769c469ae161df9ed6de50">wii_encrypted_group_cache</a> == NULL)</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> {</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ae1b2a0044c769c469ae161df9ed6de50">wii_encrypted_group_cache</a> = (uint8_t *)malloc(<a class="code hl_define" href="wii__crypto_8h.html#a938e4b044436cfa7be47752ae7b58956">WII_GROUP_SIZE</a>);</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> ctx-&gt;<a class="code hl_variable" href="structaaruformat__context.html#ac9f970fc840120793cb8edb909a664f8">wii_cache_valid</a> = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> }</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span>}</div>
</div>
<div class="ttc" id="aaaruformat_8h_html"><div class="ttname"><a href="aaruformat_8h.html">aaruformat.h</a></div></div>
<div class="ttc" id="aaes128_8c_html_a86c652b61efa48d45729e9eea1bab8b1"><div class="ttname"><a href="aes128_8c.html#a86c652b61efa48d45729e9eea1bab8b1">aes128_cbc_decrypt</a></div><div class="ttdeci">void aes128_cbc_decrypt(const uint8_t key[16], const uint8_t iv[16], uint8_t *data, uint32_t length)</div><div class="ttdoc">AES-128 CBC decrypt data in-place.</div><div class="ttdef"><b>Definition</b> <a href="aes128_8c_source.html#l00290">aes128.c:290</a></div></div>
<div class="ttc" id="aaes128_8c_html_ae5b59a027bc443c26cc5626455d77eb9"><div class="ttname"><a href="aes128_8c.html#ae5b59a027bc443c26cc5626455d77eb9">aes128_cbc_encrypt</a></div><div class="ttdeci">void aes128_cbc_encrypt(const uint8_t key[16], const uint8_t iv[16], uint8_t *data, uint32_t length)</div><div class="ttdoc">AES-128 CBC encrypt data in-place.</div><div class="ttdef"><b>Definition</b> <a href="aes128_8c_source.html#l00274">aes128.c:274</a></div></div>
<div class="ttc" id="aaes128_8h_html"><div class="ttname"><a href="aes128_8h.html">aes128.h</a></div></div>
<div class="ttc" id="agroup__MediaTags_html_ggabdd09c559df8f34ae68fcb2ff1892ebea9c9957b78c45e90f0a74b53452b510ea"><div class="ttname"><a href="group__MediaTags.html#ggabdd09c559df8f34ae68fcb2ff1892ebea9c9957b78c45e90f0a74b53452b510ea">kMediaTagWiiPartitionKeyMap</a></div><div class="ttdeci">@ kMediaTagWiiPartitionKeyMap</div><div class="ttdoc">Nintendo Wii partition-to-key mapping with regions.</div><div class="ttdef"><b>Definition</b> <a href="aaru_8h_source.html#l01086">aaru.h:1086</a></div></div>
<div class="ttc" id="astructWiiPartitionRegion_html"><div class="ttname"><a href="structWiiPartitionRegion.html">WiiPartitionRegion</a></div><div class="ttdoc">A Wii partition region entry (in-memory representation).</div><div class="ttdef"><b>Definition</b> <a href="wii__crypto_8h_source.html#l00051">wii_crypto.h:52</a></div></div>
<div class="ttc" id="astructWiiPartitionRegion_html_a06eb8901b0a0b652c573d3879024efbb"><div class="ttname"><a href="structWiiPartitionRegion.html#a06eb8901b0a0b652c573d3879024efbb">WiiPartitionRegion::start_sector</a></div><div class="ttdeci">uint32_t start_sector</div><div class="ttdoc">First physical sector of partition.</div><div class="ttdef"><b>Definition</b> <a href="wii__crypto_8h_source.html#l00053">wii_crypto.h:53</a></div></div>
<div class="ttc" id="astructWiiPartitionRegion_html_a13965236bc19addfba3c0e7d089783bf"><div class="ttname"><a href="structWiiPartitionRegion.html#a13965236bc19addfba3c0e7d089783bf">WiiPartitionRegion::key</a></div><div class="ttdeci">uint8_t key[16]</div><div class="ttdoc">AES-128 partition key.</div><div class="ttdef"><b>Definition</b> <a href="wii__crypto_8h_source.html#l00055">wii_crypto.h:55</a></div></div>
<div class="ttc" id="astructWiiPartitionRegion_html_a99f8cd96b1258c9174988fcb3db1c92d"><div class="ttname"><a href="structWiiPartitionRegion.html#a99f8cd96b1258c9174988fcb3db1c92d">WiiPartitionRegion::end_sector</a></div><div class="ttdeci">uint32_t end_sector</div><div class="ttdoc">End physical sector (exclusive).</div><div class="ttdef"><b>Definition</b> <a href="wii__crypto_8h_source.html#l00054">wii_crypto.h:54</a></div></div>
<div class="ttc" id="astructaaruformat__context_html"><div class="ttname"><a href="structaaruformat__context.html">aaruformat_context</a></div><div class="ttdoc">Master context representing an open or increation Aaru image.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00174">context.h:175</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_a8b769e9fb9467aa11d4a2936cf5cf5ed"><div class="ttname"><a href="structaaruformat__context.html#a8b769e9fb9467aa11d4a2936cf5cf5ed">aaruformat_context::mediaTags</a></div><div class="ttdeci">mediaTagEntry * mediaTags</div><div class="ttdoc">Hash table of extra media tags (uthash root).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00267">context.h:267</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_aa3dd955c7f01ecb619b3862fecce7110"><div class="ttname"><a href="structaaruformat__context.html#aa3dd955c7f01ecb619b3862fecce7110">aaruformat_context::wii_partition_region_count</a></div><div class="ttdeci">uint32_t wii_partition_region_count</div><div class="ttdoc">Number of partition regions.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00371">context.h:371</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_aaf475c0a1941563a9e1598f02ac48b66"><div class="ttname"><a href="structaaruformat__context.html#aaf475c0a1941563a9e1598f02ac48b66">aaruformat_context::wii_partition_regions</a></div><div class="ttdeci">void * wii_partition_regions</div><div class="ttdoc">Parsed WiiPartitionRegion array, NULL if not loaded.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00370">context.h:370</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_ac9f970fc840120793cb8edb909a664f8"><div class="ttname"><a href="structaaruformat__context.html#ac9f970fc840120793cb8edb909a664f8">aaruformat_context::wii_cache_valid</a></div><div class="ttdeci">bool wii_cache_valid</div><div class="ttdoc">Whether the encrypted group cache is valid.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00375">context.h:375</a></div></div>
<div class="ttc" id="astructaaruformat__context_html_ae1b2a0044c769c469ae161df9ed6de50"><div class="ttname"><a href="structaaruformat__context.html#ae1b2a0044c769c469ae161df9ed6de50">aaruformat_context::wii_encrypted_group_cache</a></div><div class="ttdeci">uint8_t * wii_encrypted_group_cache</div><div class="ttdoc">Cached re-encrypted 0x8000-byte group.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00373">context.h:373</a></div></div>
<div class="ttc" id="astructmediaTagEntry_html"><div class="ttname"><a href="structmediaTagEntry.html">mediaTagEntry</a></div><div class="ttdoc">Hash table entry for an arbitrary media tag (e.g., proprietary drive/medium descriptor).</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00121">context.h:122</a></div></div>
<div class="ttc" id="astructmediaTagEntry_html_a334fc65b37efdfb624e804e98c398927"><div class="ttname"><a href="structmediaTagEntry.html#a334fc65b37efdfb624e804e98c398927">mediaTagEntry::data</a></div><div class="ttdeci">uint8_t * data</div><div class="ttdoc">Tag data blob (opaque to library core); length bytes long.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00123">context.h:123</a></div></div>
<div class="ttc" id="astructmediaTagEntry_html_aa96c6684fd98145d0089d72957d2afa7"><div class="ttname"><a href="structmediaTagEntry.html#aa96c6684fd98145d0089d72957d2afa7">mediaTagEntry::length</a></div><div class="ttdeci">uint32_t length</div><div class="ttdoc">Length in bytes of data.</div><div class="ttdef"><b>Definition</b> <a href="context_8h_source.html#l00125">context.h:125</a></div></div>
<div class="ttc" id="awii__crypto_8c_html_a1ce70cb0d83e9893accd7f06f218146a"><div class="ttname"><a href="wii__crypto_8c.html#a1ce70cb0d83e9893accd7f06f218146a">wii_get_sector_key</a></div><div class="ttdeci">const uint8_t * wii_get_sector_key(const WiiPartitionRegion *regions, uint32_t region_count, uint64_t logical_sector)</div><div class="ttdoc">Get the encryption key for a given logical sector (2048-byte).</div><div class="ttdef"><b>Definition</b> <a href="#l00045">wii_crypto.c:45</a></div></div>
<div class="ttc" id="awii__crypto_8c_html_a2b7a0d75fbfe5563b03a6e83d528402a"><div class="ttname"><a href="wii__crypto_8c.html#a2b7a0d75fbfe5563b03a6e83d528402a">wii_deserialize_partition_key_map</a></div><div class="ttdeci">int32_t wii_deserialize_partition_key_map(const uint8_t *data, uint32_t data_len, WiiPartitionRegion **regions, uint32_t *count)</div><div class="ttdoc">Deserialize a Wii partition key map from a media tag buffer.</div><div class="ttdef"><b>Definition</b> <a href="#l00132">wii_crypto.c:132</a></div></div>
<div class="ttc" id="awii__crypto_8c_html_a2e85418928614df336b5df9f3c28cbc7"><div class="ttname"><a href="wii__crypto_8c.html#a2e85418928614df336b5df9f3c28cbc7">read_le32</a></div><div class="ttdeci">static uint32_t read_le32(const uint8_t *p)</div><div class="ttdef"><b>Definition</b> <a href="#l00032">wii_crypto.c:32</a></div></div>
<div class="ttc" id="awii__crypto_8c_html_a4ed80664538efb908d3c161aec613612"><div class="ttname"><a href="wii__crypto_8c.html#a4ed80664538efb908d3c161aec613612">write_le32</a></div><div class="ttdeci">static void write_le32(uint8_t *p, uint32_t v)</div><div class="ttdef"><b>Definition</b> <a href="#l00035">wii_crypto.c:35</a></div></div>
<div class="ttc" id="awii__crypto_8c_html_a6bf12a89fe7f2d5be3fa99dc69e19979"><div class="ttname"><a href="wii__crypto_8c.html#a6bf12a89fe7f2d5be3fa99dc69e19979">wii_serialize_partition_key_map</a></div><div class="ttdeci">int32_t wii_serialize_partition_key_map(const WiiPartitionRegion *regions, uint32_t count, uint8_t **out_data, uint32_t *out_len)</div><div class="ttdoc">Serialize a Wii partition key map for storage as a media tag.</div><div class="ttdef"><b>Definition</b> <a href="#l00105">wii_crypto.c:105</a></div></div>
<div class="ttc" id="awii__crypto_8c_html_a95d508bfdafd91552793ad54a677d511"><div class="ttname"><a href="wii__crypto_8c.html#a95d508bfdafd91552793ad54a677d511">wii_encrypt_group</a></div><div class="ttdeci">void wii_encrypt_group(const uint8_t key[16], const uint8_t *hash_block, const uint8_t *data_in, uint8_t *out)</div><div class="ttdoc">Encrypt a Wii group (0x8000 bytes) from separate hash_block + data.</div><div class="ttdef"><b>Definition</b> <a href="#l00071">wii_crypto.c:71</a></div></div>
<div class="ttc" id="awii__crypto_8c_html_a96843770fc0189beeae56cbab35c1d79"><div class="ttname"><a href="wii__crypto_8c.html#a96843770fc0189beeae56cbab35c1d79">wii_is_sector_encrypted</a></div><div class="ttdeci">bool wii_is_sector_encrypted(const WiiPartitionRegion *regions, uint32_t region_count, uint64_t logical_sector)</div><div class="ttdoc">Check if a logical sector is in an encrypted region.</div><div class="ttdef"><b>Definition</b> <a href="#l00066">wii_crypto.c:66</a></div></div>
<div class="ttc" id="awii__crypto_8c_html_aaf605c039a65fc8507d97ef47b6641ee"><div class="ttname"><a href="wii__crypto_8c.html#aaf605c039a65fc8507d97ef47b6641ee">wii_decrypt_group</a></div><div class="ttdeci">void wii_decrypt_group(const uint8_t key[16], const uint8_t *in, uint8_t *hash_block, uint8_t *data_out)</div><div class="ttdoc">Decrypt a Wii group (0x8000 bytes) into separate hash_block + data.</div><div class="ttdef"><b>Definition</b> <a href="#l00087">wii_crypto.c:87</a></div></div>
<div class="ttc" id="awii__crypto_8c_html_aee93568d673177b4ed369b0032c6c68b"><div class="ttname"><a href="wii__crypto_8c.html#aee93568d673177b4ed369b0032c6c68b">wii_lazy_init</a></div><div class="ttdeci">void wii_lazy_init(aaruformat_context *ctx)</div><div class="ttdoc">Lazy initialization: load partition key map from media tags.</div><div class="ttdef"><b>Definition</b> <a href="#l00180">wii_crypto.c:180</a></div></div>
<div class="ttc" id="awii__crypto_8h_html"><div class="ttname"><a href="wii__crypto_8h.html">wii_crypto.h</a></div></div>
<div class="ttc" id="awii__crypto_8h_html_a938e4b044436cfa7be47752ae7b58956"><div class="ttname"><a href="wii__crypto_8h.html#a938e4b044436cfa7be47752ae7b58956">WII_GROUP_SIZE</a></div><div class="ttdeci">#define WII_GROUP_SIZE</div><div class="ttdoc">Wii physical group size (32 KiB).</div><div class="ttdef"><b>Definition</b> <a href="wii__crypto_8h_source.html#l00038">wii_crypto.h:38</a></div></div>
<div class="ttc" id="awii__crypto_8h_html_aad4c6376c0653f8b2836fa3a703a97ad"><div class="ttname"><a href="wii__crypto_8h.html#aad4c6376c0653f8b2836fa3a703a97ad">WII_MAX_PARTITIONS</a></div><div class="ttdeci">#define WII_MAX_PARTITIONS</div><div class="ttdoc">Maximum number of partitions supported.</div><div class="ttdef"><b>Definition</b> <a href="wii__crypto_8h_source.html#l00043">wii_crypto.h:43</a></div></div>
<div class="ttc" id="awii__crypto_8h_html_ab21867411a4f988431fc692baa0389d6"><div class="ttname"><a href="wii__crypto_8h.html#ab21867411a4f988431fc692baa0389d6">WII_GROUP_DATA_SIZE</a></div><div class="ttdeci">#define WII_GROUP_DATA_SIZE</div><div class="ttdoc">User data size within a group (31 KiB).</div><div class="ttdef"><b>Definition</b> <a href="wii__crypto_8h_source.html#l00040">wii_crypto.h:40</a></div></div>
<div class="ttc" id="awii__crypto_8h_html_ac673ea3e31315ae51d390d06df7340cb"><div class="ttname"><a href="wii__crypto_8h.html#ac673ea3e31315ae51d390d06df7340cb">WII_GROUP_HASH_SIZE</a></div><div class="ttdeci">#define WII_GROUP_HASH_SIZE</div><div class="ttdoc">Hash block size within a group (1 KiB).</div><div class="ttdef"><b>Definition</b> <a href="wii__crypto_8h_source.html#l00039">wii_crypto.h:39</a></div></div>
<div class="ttc" id="awii__crypto_8h_html_af6ed59742196c351932ad0f0e5e43566"><div class="ttname"><a href="wii__crypto_8h.html#af6ed59742196c351932ad0f0e5e43566">WII_LOGICAL_PER_GROUP</a></div><div class="ttdeci">#define WII_LOGICAL_PER_GROUP</div><div class="ttdoc">Number of 2048-byte logical sectors per group.</div><div class="ttdef"><b>Definition</b> <a href="wii__crypto_8h_source.html#l00041">wii_crypto.h:41</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
</div><!-- container -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a href="dir_366d6a3889b2c1ca7d50351540a67e4b.html">ngcw</a></li><li class="navelem"><a href="wii__crypto_8c.html">wii_crypto.c</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.16.1 </li>
</ul>
</div>
</body>
</html>