⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 seckey_8h-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>Crypto++: seckey.h Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.3.2 --><div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Compound&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Compound&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a></div><h1>seckey.h</h1><div class="fragment"><pre>00001 <span class="comment">// seckey.h - written and placed in the public domain by Wei Dai</span>00002 00003 <span class="comment">// This file contains helper classes/functions for implementing secret key algorithms.</span>00004 00005 <span class="preprocessor">#ifndef CRYPTOPP_SECKEY_H</span>00006 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_SECKEY_H</span>00007 <span class="preprocessor"></span>00008 <span class="preprocessor">#include "<a class="code" href="cryptlib_8h.html">cryptlib.h</a>"</span>00009 <span class="preprocessor">#include "misc.h"</span>00010 <span class="preprocessor">#include "<a class="code" href="simple_8h.html">simple.h</a>"</span>00011 00012 NAMESPACE_BEGIN(CryptoPP)00013 00014 <span class="keyword">inline</span> <a class="code" href="cryptlib_8h.html#a11">CipherDir</a> ReverseCipherDir(CipherDir dir)00015 {00016         <span class="keywordflow">return</span> (dir == ENCRYPTION) ? DECRYPTION : ENCRYPTION;00017 }00018 <span class="comment"></span>00019 <span class="comment">//! .</span>00020 <span class="comment"></span><span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> N&gt;<a name="l00021"></a><a class="code" href="class_fixed_block_size.html">00021</a> <span class="keyword">class </span>CRYPTOPP_DLL FixedBlockSize00022 {00023 <span class="keyword">public</span>:00024         <span class="keyword">enum</span> {BLOCKSIZE = N};00025 };00026 00027 <span class="comment">// ************** rounds ***************</span>00028 <span class="comment"></span>00029 <span class="comment">//! .</span>00030 <span class="comment"></span><span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> R&gt;<a name="l00031"></a><a class="code" href="class_fixed_rounds.html">00031</a> <span class="keyword">class </span>CRYPTOPP_DLL FixedRounds00032 {00033 <span class="keyword">public</span>:00034         <span class="keyword">enum</span> {ROUNDS = R};00035 00036 <span class="keyword">protected</span>:00037         <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;00038         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> CheckedSetKey(T *obj, <a class="code" href="cryptlib_8h.html#a11">CipherDir</a> dir, <span class="keyword">const</span> byte *key, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;param)00039         {00040                 obj-&gt;ThrowIfInvalidKeyLength(length);00041                 <span class="keywordtype">int</span> rounds = param.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha43">GetIntValueWithDefault</a>(<span class="stringliteral">"Rounds"</span>, ROUNDS);00042                 <span class="keywordflow">if</span> (rounds != ROUNDS)00043                         <span class="keywordflow">throw</span> <a class="code" href="class_invalid_rounds.html">InvalidRounds</a>(obj-&gt;StaticAlgorithmName(), rounds);00044                 obj-&gt;UncheckedSetKey(dir, key, length);00045         }00046 };00047 <span class="comment"></span>00048 <span class="comment">//! .</span>00049 <span class="comment"></span><span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> D, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> N=1, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> M=INT_MAX&gt;             <span class="comment">// use INT_MAX here because enums are treated as signed ints</span><a name="l00050"></a><a class="code" href="class_variable_rounds.html">00050</a> <span class="keyword">class </span>CRYPTOPP_DLL VariableRounds00051 {00052 <span class="keyword">public</span>:00053         <span class="keyword">enum</span> {DEFAULT_ROUNDS = D, MIN_ROUNDS = N, MAX_ROUNDS = M};00054         <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> StaticGetDefaultRounds(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> keylength) {<span class="keywordflow">return</span> DEFAULT_ROUNDS;}00055 00056 <span class="keyword">protected</span>:00057         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> AssertValidRounds(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> rounds)00058         {00059                 assert(rounds &gt;= MIN_ROUNDS &amp;&amp; rounds &lt;= MAX_ROUNDS);00060         }00061 00062         <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;00063         <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span> CheckedSetKey(T *obj, <a class="code" href="cryptlib_8h.html#a11">CipherDir</a> dir, <span class="keyword">const</span> byte *key, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &amp;param)00064         {00065                 obj-&gt;ThrowIfInvalidKeyLength(length);00066                 <span class="keywordtype">int</span> rounds = param.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha43">GetIntValueWithDefault</a>(<span class="stringliteral">"Rounds"</span>, obj-&gt;StaticGetDefaultRounds(length));00067                 <span class="keywordflow">if</span> (rounds &lt; (unsigned int)MIN_ROUNDS || rounds &gt; (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)MAX_ROUNDS)00068                         <span class="keywordflow">throw</span> <a class="code" href="class_invalid_rounds.html">InvalidRounds</a>(obj-&gt;AlgorithmName(), rounds);00069                 obj-&gt;UncheckedSetKey(dir, key, length, rounds);00070         }00071 };00072 00073 <span class="comment">// ************** key length ***************</span>00074 <span class="comment"></span>00075 <span class="comment">//! .</span>00076 <span class="comment"></span><span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> N, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> IV_REQ = SimpleKeyingInterface::NOT_RESYNCHRONIZABLE&gt;<a name="l00077"></a><a class="code" href="class_fixed_key_length.html">00077</a> <span class="keyword">class </span>CRYPTOPP_DLL FixedKeyLength00078 {00079 <span class="keyword">public</span>:00080         <span class="keyword">enum</span> {KEYLENGTH=N, MIN_KEYLENGTH=N, MAX_KEYLENGTH=N, DEFAULT_KEYLENGTH=N};00081         <span class="keyword">enum</span> {IV_REQUIREMENT = IV_REQ};00082         <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> StaticGetValidKeyLength(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>) {<span class="keywordflow">return</span> KEYLENGTH;}00083 };00084 <span class="comment"></span>00085 <span class="comment">/// support query of variable key length, template parameters are default, min, max, multiple (default multiple 1)</span>00086 <span class="comment"></span><span class="keyword">template</span> &lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> D, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> N, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> M, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Q = 1, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> IV_REQ = SimpleKeyingInterface::NOT_RESYNCHRONIZABLE&gt;<a name="l00087"></a><a class="code" href="class_variable_key_length.html">00087</a> <span class="keyword">class </span>CRYPTOPP_DLL VariableKeyLength00088 {00089         <span class="comment">// make these private to avoid Doxygen documenting them in all derived classes</span>00090         CRYPTOPP_COMPILE_ASSERT(Q &gt; 0);00091         CRYPTOPP_COMPILE_ASSERT(N % Q == 0);00092         CRYPTOPP_COMPILE_ASSERT(M % Q == 0);00093         CRYPTOPP_COMPILE_ASSERT(N &lt; M);00094         CRYPTOPP_COMPILE_ASSERT(D &gt;= N &amp;&amp; M &gt;= D);00095 00096 <span class="keyword">public</span>:00097         <span class="keyword">enum</span> {MIN_KEYLENGTH=N, MAX_KEYLENGTH=M, DEFAULT_KEYLENGTH=D, KEYLENGTH_MULTIPLE=Q};00098         <span class="keyword">enum</span> {IV_REQUIREMENT = IV_REQ};00099         <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> StaticGetValidKeyLength(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n)00100         {00101                 <span class="keywordflow">if</span> (n &lt; (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)MIN_KEYLENGTH)00102                         <span class="keywordflow">return</span> MIN_KEYLENGTH;00103                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (n &gt; (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)MAX_KEYLENGTH)00104                         <span class="keywordflow">return</span> MAX_KEYLENGTH;00105                 <span class="keywordflow">else</span>00106                 {00107                         n += KEYLENGTH_MULTIPLE-1;00108                         <span class="keywordflow">return</span> n - n%KEYLENGTH_MULTIPLE;00109                 }00110         }00111 };00112 <span class="comment"></span>00113 <span class="comment">/// support query of key length that's the same as another class</span>00114 <span class="comment"></span><span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;<a name="l00115"></a><a class="code" href="class_same_key_length_as.html">00115</a> <span class="keyword">class </span>CRYPTOPP_DLL SameKeyLengthAs00116 {00117 <span class="keyword">public</span>:00118         <span class="keyword">enum</span> {MIN_KEYLENGTH=T::MIN_KEYLENGTH, MAX_KEYLENGTH=T::MAX_KEYLENGTH, DEFAULT_KEYLENGTH=T::DEFAULT_KEYLENGTH};00119         <span class="keyword">enum</span> {IV_REQUIREMENT = T::IV_REQUIREMENT};00120         <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> StaticGetValidKeyLength(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> keylength)00121                 {<span class="keywordflow">return</span> T::StaticGetValidKeyLength(keylength);}00122 };

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -