📄 seckey_8h-source.html
字号:
<!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 Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Compound List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Compound Members</a> | <a class="qindex" href="globals.html">File 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> <<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> N><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> <<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> R><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> <<span class="keyword">class</span> T>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> &param)00039 {00040 obj->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->StaticAlgorithmName(), rounds);00044 obj->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> <<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> <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 >= MIN_ROUNDS && rounds <= MAX_ROUNDS);00060 }00061 00062 <span class="keyword">template</span> <<span class="keyword">class</span> T>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> &param)00064 {00065 obj->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->StaticGetDefaultRounds(length));00067 <span class="keywordflow">if</span> (rounds < (unsigned int)MIN_ROUNDS || rounds > (<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->AlgorithmName(), rounds);00069 obj->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> <<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><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> <<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><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 > 0);00091 CRYPTOPP_COMPILE_ASSERT(N % Q == 0);00092 CRYPTOPP_COMPILE_ASSERT(M % Q == 0);00093 CRYPTOPP_COMPILE_ASSERT(N < M);00094 CRYPTOPP_COMPILE_ASSERT(D >= N && M >= 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 < (<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 > (<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> <<span class="keyword">class</span> T><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 + -