📄 pwdbased_8h-source.html
字号:
<a name="l00100"></a>00100 hmac.<a class="code" href="class_h_m_a_c___base.html#efb8a1fb43ef8c9390ee89bbb41c83af" title="process more input">Update</a>(salt, saltLen);<a name="l00101"></a>00101 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> j;<a name="l00102"></a>00102 <span class="keywordflow">for</span> (j=0; j<4; j++)<a name="l00103"></a>00103 {<a name="l00104"></a>00104 byte b = byte(i >> ((3-j)*8));<a name="l00105"></a>00105 hmac.<a class="code" href="class_h_m_a_c___base.html#efb8a1fb43ef8c9390ee89bbb41c83af" title="process more input">Update</a>(&b, 1);<a name="l00106"></a>00106 }<a name="l00107"></a>00107 hmac.<a class="code" href="class_hash_transformation.html#a0b8c7a110d8968268fd02ec32b9a8e8" title="compute hash for current message, then restart for a new message">Final</a>(buffer);<a name="l00108"></a>00108 <a name="l00109"></a>00109 <span class="keywordtype">size_t</span> segmentLen = STDMIN(derivedLen, buffer.size());<a name="l00110"></a>00110 memcpy(derived, buffer, segmentLen);<a name="l00111"></a>00111 <a name="l00112"></a>00112 <span class="keywordflow">if</span> (timeInSeconds)<a name="l00113"></a>00113 {<a name="l00114"></a>00114 timeInSeconds = timeInSeconds / ((derivedLen + buffer.size() - 1) / buffer.size());<a name="l00115"></a>00115 timer.StartTimer();<a name="l00116"></a>00116 }<a name="l00117"></a>00117 <a name="l00118"></a>00118 <span class="keywordflow">for</span> (j=1; j<iterations || (timeInSeconds && (j%128!=0 || timer.ElapsedTimeAsDouble() < timeInSeconds)); j++)<a name="l00119"></a>00119 {<a name="l00120"></a>00120 hmac.<a class="code" href="class_hash_transformation.html#f8124c4fca23b74bbdc43660bdae692c" title="use this if your input is in one piece and you don't want to call Update() and Final()...">CalculateDigest</a>(buffer, buffer, buffer.size());<a name="l00121"></a>00121 xorbuf(derived, buffer, segmentLen);<a name="l00122"></a>00122 }<a name="l00123"></a>00123 <a name="l00124"></a>00124 <span class="keywordflow">if</span> (timeInSeconds)<a name="l00125"></a>00125 {<a name="l00126"></a>00126 iterations = j;<a name="l00127"></a>00127 timeInSeconds = 0;<a name="l00128"></a>00128 }<a name="l00129"></a>00129 <a name="l00130"></a>00130 derived += segmentLen;<a name="l00131"></a>00131 derivedLen -= segmentLen;<a name="l00132"></a>00132 i++;<a name="l00133"></a>00133 }<a name="l00134"></a>00134 <a name="l00135"></a>00135 <span class="keywordflow">return</span> iterations;<a name="l00136"></a>00136 }<a name="l00137"></a>00137 <span class="comment"></span><a name="l00138"></a>00138 <span class="comment">//! PBKDF from PKCS #12, appendix B, T should be a HashTransformation class</span><a name="l00139"></a>00139 <span class="comment"></span><span class="keyword">template</span> <<span class="keyword">class</span> T><a name="l00140"></a><a class="code" href="class_p_k_c_s12___p_b_k_d_f.html">00140</a> <span class="keyword">class </span><a class="code" href="class_p_k_c_s12___p_b_k_d_f.html" title="PBKDF from PKCS #12, appendix B, T should be a HashTransformation class.">PKCS12_PBKDF</a> : <span class="keyword">public</span> <a class="code" href="class_password_based_key_derivation_function.html" title="abstract base class for password based key derivation function">PasswordBasedKeyDerivationFunction</a><a name="l00141"></a>00141 {<a name="l00142"></a>00142 <span class="keyword">public</span>:<a name="l00143"></a><a class="code" href="class_p_k_c_s12___p_b_k_d_f.html#242a0896a4894b5439c1532e7efb570b">00143</a> <span class="keywordtype">size_t</span> <a class="code" href="class_p_k_c_s5___p_b_k_d_f2___h_m_a_c.html#28431120ba04fedfcf0b8fb53e826854">MaxDerivedKeyLength</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> size_t(0)-1;}<a name="l00144"></a><a class="code" href="class_p_k_c_s12___p_b_k_d_f.html#f57267aa37bf40969f3af917ca09eb9d">00144</a> <span class="keywordtype">bool</span> <a class="code" href="class_p_k_c_s5___p_b_k_d_f2___h_m_a_c.html#8e823e1fd1287aaab5d0f1519f94df45">UsesPurposeByte</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">true</span>;}<a name="l00145"></a>00145 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_p_k_c_s5___p_b_k_d_f2___h_m_a_c.html#570d711d2a840cdcca4b574b6c20f368" title="derive key from password">DeriveKey</a>(byte *derived, <span class="keywordtype">size_t</span> derivedLen, byte purpose, <span class="keyword">const</span> byte *password, <span class="keywordtype">size_t</span> passwordLen, <span class="keyword">const</span> byte *salt, <span class="keywordtype">size_t</span> saltLen, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iterations, <span class="keywordtype">double</span> timeInSeconds) <span class="keyword">const</span>;<a name="l00146"></a>00146 };<a name="l00147"></a>00147 <a name="l00148"></a>00148 <span class="keyword">template</span> <<span class="keyword">class</span> T><a name="l00149"></a><a class="code" href="class_p_k_c_s12___p_b_k_d_f.html#2e252ab8024d3aab6f8bb6f239ce1ce0">00149</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_p_k_c_s12___p_b_k_d_f.html#2e252ab8024d3aab6f8bb6f239ce1ce0" title="derive key from password">PKCS12_PBKDF<T>::DeriveKey</a>(byte *derived, <span class="keywordtype">size_t</span> derivedLen, byte purpose, <span class="keyword">const</span> byte *password, <span class="keywordtype">size_t</span> passwordLen, <span class="keyword">const</span> byte *salt, <span class="keywordtype">size_t</span> saltLen, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> iterations, <span class="keywordtype">double</span> timeInSeconds)<span class="keyword"> const</span><a name="l00150"></a>00150 <span class="keyword"></span>{<a name="l00151"></a>00151 assert(derivedLen <= <a class="code" href="class_p_k_c_s12___p_b_k_d_f.html#242a0896a4894b5439c1532e7efb570b">MaxDerivedKeyLength</a>());<a name="l00152"></a>00152 assert(iterations > 0 || timeInSeconds > 0);<a name="l00153"></a>00153 <a name="l00154"></a>00154 <span class="keywordflow">if</span> (!iterations)<a name="l00155"></a>00155 iterations = 1;<a name="l00156"></a>00156 <a name="l00157"></a>00157 <span class="keyword">const</span> <span class="keywordtype">size_t</span> v = T::BLOCKSIZE; <span class="comment">// v is in bytes rather than bits as in PKCS #12</span><a name="l00158"></a>00158 <span class="keyword">const</span> <span class="keywordtype">size_t</span> DLen = v, SLen = RoundUpToMultipleOf(saltLen, v);<a name="l00159"></a>00159 <span class="keyword">const</span> <span class="keywordtype">size_t</span> PLen = RoundUpToMultipleOf(passwordLen, v), ILen = SLen + PLen;<a name="l00160"></a>00160 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> buffer(DLen + SLen + PLen);<a name="l00161"></a>00161 byte *D = buffer, *S = buffer+DLen, *P = buffer+DLen+SLen, *I = S;<a name="l00162"></a>00162 <a name="l00163"></a>00163 memset(D, purpose, DLen);<a name="l00164"></a>00164 <span class="keywordtype">size_t</span> i;<a name="l00165"></a>00165 <span class="keywordflow">for</span> (i=0; i<SLen; i++)<a name="l00166"></a>00166 S[i] = salt[i % saltLen];<a name="l00167"></a>00167 <span class="keywordflow">for</span> (i=0; i<PLen; i++)<a name="l00168"></a>00168 P[i] = password[i % passwordLen];<a name="l00169"></a>00169 <a name="l00170"></a>00170 <a name="l00171"></a>00171 T hash;<a name="l00172"></a>00172 <a class="code" href="class_sec_block.html" title="a block of memory allocated using A">SecByteBlock</a> Ai(T::DIGESTSIZE), B(v);<a name="l00173"></a>00173 <a class="code" href="class_thread_user_timer.html" title="measure CPU time spent executing instructions of this thread (if supported by OS)...">ThreadUserTimer</a> timer;<a name="l00174"></a>00174 <a name="l00175"></a>00175 <span class="keywordflow">while</span> (derivedLen > 0)<a name="l00176"></a>00176 {<a name="l00177"></a>00177 hash.CalculateDigest(Ai, buffer, buffer.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>());<a name="l00178"></a>00178 <a name="l00179"></a>00179 <span class="keywordflow">if</span> (timeInSeconds)<a name="l00180"></a>00180 {<a name="l00181"></a>00181 timeInSeconds = timeInSeconds / ((derivedLen + Ai.size() - 1) / Ai.size());<a name="l00182"></a>00182 timer.<a class="code" href="class_timer_base.html#50804b61c4254f7289c6c67515d5d46d">StartTimer</a>();<a name="l00183"></a>00183 }<a name="l00184"></a>00184 <a name="l00185"></a>00185 <span class="keywordflow">for</span> (i=1; i<iterations || (timeInSeconds && (i%128!=0 || timer.<a class="code" href="class_timer_base.html#3262a9d0815f1899701ee83c3ef8cf43">ElapsedTimeAsDouble</a>() < timeInSeconds)); i++)<a name="l00186"></a>00186 hash.CalculateDigest(Ai, Ai, Ai.size());<a name="l00187"></a>00187 <a name="l00188"></a>00188 <span class="keywordflow">if</span> (timeInSeconds)<a name="l00189"></a>00189 {<a name="l00190"></a>00190 iterations = (<span class="keywordtype">unsigned</span> int)i;<a name="l00191"></a>00191 timeInSeconds = 0;<a name="l00192"></a>00192 }<a name="l00193"></a>00193 <a name="l00194"></a>00194 <span class="keywordflow">for</span> (i=0; i<B.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>(); i++)<a name="l00195"></a>00195 B[i] = Ai[i % Ai.size()];<a name="l00196"></a>00196 <a name="l00197"></a>00197 <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a> B1(B, B.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>());<a name="l00198"></a>00198 ++B1;<a name="l00199"></a>00199 <span class="keywordflow">for</span> (i=0; i<ILen; i+=v)<a name="l00200"></a>00200 (<a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a>(I+i, v) + B1).Encode(I+i, v);<a name="l00201"></a>00201 <a name="l00202"></a>00202 <span class="keywordtype">size_t</span> segmentLen = STDMIN(derivedLen, Ai.size());<a name="l00203"></a>00203 memcpy(derived, Ai, segmentLen);<a name="l00204"></a>00204 derived += segmentLen;<a name="l00205"></a>00205 derivedLen -= segmentLen;<a name="l00206"></a>00206 }<a name="l00207"></a>00207 <a name="l00208"></a>00208 <span class="keywordflow">return</span> iterations;<a name="l00209"></a>00209 }<a name="l00210"></a>00210 <a name="l00211"></a>00211 NAMESPACE_END<a name="l00212"></a>00212 <a name="l00213"></a>00213 <span class="preprocessor">#endif</span></pre></div><hr size="1"><address style="text-align: right;"><small>Generated on Fri Jun 1 11:11:23 2007 for Crypto++ by <a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.2 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -