📄 oaep_8cpp-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++: oaep.cpp 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>oaep.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// oaep.cpp - written and placed in the public domain by Wei Dai</span>00002 00003 <span class="preprocessor">#include "pch.h"</span>00004 <span class="preprocessor">#include "oaep.h"</span>00005 00006 <span class="preprocessor">#include <functional></span>00007 00008 NAMESPACE_BEGIN(CryptoPP)00009 00010 <span class="comment">// ********************************************************</span>00011 00012 ANONYMOUS_NAMESPACE_BEGIN00013 <span class="keyword">template</span> <<span class="keyword">class</span> H, byte *P, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> PLen>00014 <span class="keyword">struct </span>PHashComputation00015 {00016 PHashComputation() {H().CalculateDigest(pHash, P, PLen);}00017 byte pHash[H::DIGESTSIZE];00018 };00019 00020 <span class="keyword">template</span> <<span class="keyword">class</span> H, byte *P, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> PLen>00021 <span class="keyword">const</span> byte *PHash()00022 {00023 <span class="keyword">static</span> PHashComputation<H,P,PLen> pHash;00024 <span class="keywordflow">return</span> pHash.pHash;00025 }00026 NAMESPACE_END00027 00028 <span class="keyword">template</span> <<span class="keyword">class</span> H, <span class="keyword">class</span> MGF, byte *P, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> PLen>00029 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_o_a_e_p.html">OAEP<H,MGF,P,PLen>::MaxUnpaddedLength</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> paddedLength)<span class="keyword"> const</span>00030 <span class="keyword"></span>{00031 <span class="keywordflow">return</span> paddedLength/8 > 1+2*H::DIGESTSIZE ? paddedLength/8-1-2*H::DIGESTSIZE : 0;00032 }00033 00034 <span class="keyword">template</span> <<span class="keyword">class</span> H, <span class="keyword">class</span> MGF, byte *P, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> PLen>00035 <span class="keywordtype">void</span> <a class="code" href="class_o_a_e_p.html">OAEP<H,MGF,P,PLen>::Pad</a>(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keyword">const</span> byte *input, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputLength, byte *oaepBlock, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oaepBlockLen)<span class="keyword"> const</span>00036 <span class="keyword"></span>{00037 assert (inputLength <= MaxUnpaddedLength(oaepBlockLen));00038 00039 <span class="comment">// convert from bit length to byte length</span>00040 <span class="keywordflow">if</span> (oaepBlockLen % 8 != 0)00041 {00042 oaepBlock[0] = 0;00043 oaepBlock++;00044 }00045 oaepBlockLen /= 8;00046 00047 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hLen = H::DIGESTSIZE;00048 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> seedLen = hLen, dbLen = oaepBlockLen-seedLen;00049 byte *<span class="keyword">const</span> maskedSeed = oaepBlock;00050 byte *<span class="keyword">const</span> maskedDB = oaepBlock+seedLen;00051 00052 <span class="comment">// DB = pHash || 00 ... || 01 || M</span>00053 memcpy(maskedDB, PHash<H,P,PLen>(), hLen);00054 memset(maskedDB+hLen, 0, dbLen-hLen-inputLength-1);00055 maskedDB[dbLen-inputLength-1] = 0x01;00056 memcpy(maskedDB+dbLen-inputLength, input, inputLength);00057 00058 rng.<a class="code" href="class_random_number_generator.html#_x917_r_n_ga4">GenerateBlock</a>(maskedSeed, seedLen);00059 MGF::GenerateAndMask(maskedDB, dbLen, maskedSeed, seedLen);00060 MGF::GenerateAndMask(maskedSeed, seedLen, maskedDB, dbLen);00061 }00062 00063 <span class="keyword">template</span> <<span class="keyword">class</span> H, <span class="keyword">class</span> MGF, byte *P, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> PLen>00064 <a class="code" href="struct_decoding_result.html">DecodingResult</a> <a class="code" href="class_o_a_e_p.html">OAEP<H,MGF,P,PLen>::Unpad</a>(<span class="keyword">const</span> byte *oaepBlock, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> oaepBlockLen, byte *output)<span class="keyword"> const</span>00065 <span class="keyword"></span>{00066 <span class="keywordtype">bool</span> invalid = <span class="keyword">false</span>;00067 00068 <span class="comment">// convert from bit length to byte length</span>00069 <span class="keywordflow">if</span> (oaepBlockLen % 8 != 0)00070 {00071 invalid = (oaepBlock[0] != 0) || invalid;00072 oaepBlock++;00073 }00074 oaepBlockLen /= 8;00075 00076 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> hLen = H::DIGESTSIZE;00077 <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> seedLen = hLen, dbLen = oaepBlockLen-seedLen;00078 00079 invalid = (oaepBlockLen < 2*hLen+1) || invalid;00080 00081 <a class="code" href="class_sec_block.html">SecByteBlock</a> t(oaepBlock, oaepBlockLen);00082 byte *<span class="keyword">const</span> maskedSeed = t;00083 byte *<span class="keyword">const</span> maskedDB = t+seedLen;00084 00085 MGF::GenerateAndMask(maskedSeed, seedLen, maskedDB, dbLen);00086 MGF::GenerateAndMask(maskedDB, dbLen, maskedSeed, seedLen);00087 00088 <span class="comment">// DB = pHash' || 00 ... || 01 || M</span>00089 00090 byte *M = std::find(maskedDB+hLen, maskedDB+dbLen, 0x01);00091 invalid = (M == maskedDB+dbLen) || invalid;00092 invalid = (std::find_if(maskedDB+hLen, M, std::bind2nd(std::not_equal_to<byte>(), 0)) != M) || invalid;00093 invalid = (memcmp(maskedDB, PHash<H,P,PLen>(), hLen) != 0) || invalid;00094 00095 <span class="keywordflow">if</span> (invalid)00096 <span class="keywordflow">return</span> <a class="code" href="struct_decoding_result.html">DecodingResult</a>();00097 00098 M++;00099 memcpy(output, M, maskedDB+dbLen-M);00100 <span class="keywordflow">return</span> <a class="code" href="struct_decoding_result.html">DecodingResult</a>(maskedDB+dbLen-M);00101 }00102 00103 NAMESPACE_END</pre></div><hr size="1"><address style="align: right;"><small>Generated on Tue Jul 8 23:34:21 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 + -