📄 pwdbased_8h-source.html
字号:
00082 hmac.<a class="code" href="class_hash_transformation.html#_x_m_a_c_ca5">Update</a>(salt, saltLen);00083 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j;00084 <span class="keywordflow">for</span> (j=0; j<4; j++)00085 {00086 byte b = i >> ((3-j)*8);00087 hmac.<a class="code" href="class_hash_transformation.html#_x_m_a_c_ca5">Update</a>(&b, 1);00088 }00089 hmac.<a class="code" href="class_hash_transformation.html#_x_m_a_c_c___basea13">Final</a>(buffer);00090 00091 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> segmentLen = STDMIN(derivedLen, (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)buffer.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00092 memcpy(derived, buffer, segmentLen);00093 00094 <span class="keywordflow">for</span> (j=1; j<iterations; j++)00095 {00096 hmac.<a class="code" href="class_hash_transformation.html#_x_m_a_c_c___basea14">CalculateDigest</a>(buffer, buffer, buffer.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00097 xorbuf(derived, buffer, segmentLen);00098 }00099 00100 derived += segmentLen;00101 derivedLen -= segmentLen;00102 i++;00103 }00104 }00105 <span class="comment"></span>00106 <span class="comment">//! PBKDF from PKCS #12, appendix B, T should be a HashTransformation class</span>00107 <span class="comment"></span><span class="keyword">template</span> <<span class="keyword">class</span> T><a name="l00108"></a><a class="code" href="class_p_k_c_s12___p_b_k_d_f.html">00108</a> <span class="keyword">class </span><a class="code" href="class_p_k_c_s12___p_b_k_d_f.html">PKCS12_PBKDF</a> : <span class="keyword">public</span> PasswordBasedKeyDerivationFunction00109 {00110 <span class="keyword">public</span>:00111 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> MaxDerivedKeyLength()<span class="keyword"> const </span>{<span class="keywordflow">return</span> UINT_MAX;}00112 <span class="keywordtype">void</span> GeneralDeriveKey(byte *derived, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> derivedLen, byte purpose, <span class="keyword">const</span> byte *password, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> passwordLen, <span class="keyword">const</span> byte *salt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> saltLen, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iterations)<span class="keyword"> const</span>00113 <span class="keyword"> </span>{DeriveKey(derived, derivedLen, purpose, password, passwordLen, salt, saltLen, iterations);}00114 <span class="keywordtype">void</span> DeriveKey(byte *derived, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> derivedLen, byte ID, <span class="keyword">const</span> byte *password, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> passwordLen, <span class="keyword">const</span> byte *salt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> saltLen, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iterations=1000) <span class="keyword">const</span>;00115 };00116 00117 <span class="keyword">template</span> <<span class="keyword">class</span> T>00118 <span class="keywordtype">void</span> <a class="code" href="class_p_k_c_s12___p_b_k_d_f.html">PKCS12_PBKDF<T>::DeriveKey</a>(byte *derived, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> derivedLen, byte ID, <span class="keyword">const</span> byte *password, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> passwordLen, <span class="keyword">const</span> byte *salt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> saltLen, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iterations)<span class="keyword"> const</span>00119 <span class="keyword"></span>{00120 assert(derivedLen <= MaxDerivedKeyLength());00121 assert(iterations > 0);00122 00123 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> v = T::BLOCKSIZE; <span class="comment">// v is in bytes rather than bits as in PKCS #12</span>00124 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DLen = v, SLen = RoundUpToMultipleOf(saltLen, v);00125 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> PLen = RoundUpToMultipleOf(passwordLen, v), ILen = SLen + PLen;00126 <a class="code" href="class_sec_block.html">SecByteBlock</a> buffer(DLen + SLen + PLen);00127 byte *D = buffer, *S = buffer+DLen, *P = buffer+DLen+SLen, *I = S;00128 00129 memset(D, ID, DLen);00130 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;00131 <span class="keywordflow">for</span> (i=0; i<SLen; i++)00132 S[i] = salt[i % saltLen];00133 <span class="keywordflow">for</span> (i=0; i<PLen; i++)00134 P[i] = password[i % passwordLen];00135 00136 00137 T hash;00138 <a class="code" href="class_sec_block.html">SecByteBlock</a> Ai(T::DIGESTSIZE), B(v);00139 00140 <span class="keywordflow">while</span> (derivedLen > 0)00141 {00142 hash.CalculateDigest(Ai, buffer, buffer.size());00143 <span class="keywordflow">for</span> (i=1; i<iterations; i++)00144 hash.CalculateDigest(Ai, Ai, Ai.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00145 <span class="keywordflow">for</span> (i=0; i<B.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>(); i++)00146 B[i] = Ai[i % Ai.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>()];00147 00148 <a class="code" href="class_integer.html">Integer</a> B1(B, B.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00149 ++B1;00150 <span class="keywordflow">for</span> (i=0; i<ILen; i+=v)00151 (<a class="code" href="class_integer.html">Integer</a>(I+i, v) + B1).Encode(I+i, v);00152 00153 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> segmentLen = STDMIN(derivedLen, (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)Ai.size());00154 memcpy(derived, Ai, segmentLen);00155 derived += segmentLen;00156 derivedLen -= segmentLen;00157 }00158 }00159 00160 NAMESPACE_END00161 00162 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:22 2003 for Crypto++ by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.2 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -