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

📄 asn_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<!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++: asn.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&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>asn.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// asn.cpp - written and placed in the public domain by Wei Dai</span>00002 00003 <span class="preprocessor">#include "pch.h"</span>00004 00005 <span class="preprocessor">#ifndef CRYPTOPP_IMPORTS</span>00006 <span class="preprocessor"></span>00007 <span class="preprocessor">#include "asn.h"</span>00008 00009 <span class="preprocessor">#include &lt;iomanip&gt;</span>00010 <span class="preprocessor">#include &lt;time.h&gt;</span>00011 00012 NAMESPACE_BEGIN(CryptoPP)00013 USING_NAMESPACE(std)00014 00015 <span class="comment">/// DER Length</span>00016 <span class="comment"></span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DERLengthEncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00017 {00018         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0;00019         <span class="keywordflow">if</span> (length &lt;= 0x7f)00020         {00021                 bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(byte(length));00022                 i++;00023         }00024         <span class="keywordflow">else</span>00025         {00026                 bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(byte(BytePrecision(length) | 0x80));00027                 i++;00028                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j=BytePrecision(length); j; --j)00029                 {00030                         bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(byte(length &gt;&gt; (j-1)*8));00031                         i++;00032                 }00033         }00034         <span class="keywordflow">return</span> i;00035 }00036 00037 <span class="keywordtype">bool</span> BERLengthDecode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &amp;length, <span class="keywordtype">bool</span> &amp;definiteLength)00038 {00039         byte b;00040 00041         <span class="keywordflow">if</span> (!bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(b))00042                 <span class="keywordflow">return</span> <span class="keyword">false</span>;00043 00044         <span class="keywordflow">if</span> (!(b &amp; 0x80))00045         {00046                 definiteLength = <span class="keyword">true</span>;00047                 length = b;00048         }00049         <span class="keywordflow">else</span>00050         {00051                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lengthBytes = b &amp; 0x7f;00052 00053                 <span class="keywordflow">if</span> (lengthBytes == 0)00054                 {00055                         definiteLength = <span class="keyword">false</span>;00056                         <span class="keywordflow">return</span> <span class="keyword">true</span>;00057                 }00058 00059                 definiteLength = <span class="keyword">true</span>;00060                 length = 0;00061                 <span class="keywordflow">while</span> (lengthBytes--)00062                 {00063                         <span class="keywordflow">if</span> (length &gt;&gt; (8*(<span class="keyword">sizeof</span>(length)-1)))00064                                 BERDecodeError();       <span class="comment">// length about to overflow</span>00065 00066                         <span class="keywordflow">if</span> (!bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(b))00067                                 <span class="keywordflow">return</span> <span class="keyword">false</span>;00068 00069                         length = (length &lt;&lt; 8) | b;00070                 }00071         }00072         <span class="keywordflow">return</span> <span class="keyword">true</span>;00073 }00074 00075 <span class="keywordtype">bool</span> BERLengthDecode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &amp;length)00076 {00077         <span class="keywordtype">bool</span> definiteLength;00078         <span class="keywordflow">if</span> (!BERLengthDecode(bt, length, definiteLength))00079                 BERDecodeError();00080         <span class="keywordflow">return</span> definiteLength;00081 }00082 00083 <span class="keywordtype">void</span> DEREncodeNull(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;out)00084 {00085         out.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(TAG_NULL);00086         out.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(0);00087 }00088 00089 <span class="keywordtype">void</span> BERDecodeNull(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;in)00090 {00091         byte b;00092         <span class="keywordflow">if</span> (!in.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(b) || b != TAG_NULL)00093                 BERDecodeError();00094         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length;00095         <span class="keywordflow">if</span> (!BERLengthDecode(in, length) || length != 0)00096                 BERDecodeError();00097 }00098 <span class="comment"></span>00099 <span class="comment">/// ASN Strings</span>00100 <span class="comment"></span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DEREncodeOctetString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keyword">const</span> byte *str, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> strLen)00101 {00102         bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(OCTET_STRING);00103         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lengthBytes = DERLengthEncode(bt, strLen);00104         bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(str, strLen);00105         <span class="keywordflow">return</span> 1+lengthBytes+strLen;00106 }00107 00108 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DEREncodeOctetString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keyword">const</span> <a class="code" href="class_sec_block.html">SecByteBlock</a> &amp;str)00109 {00110         <span class="keywordflow">return</span> DEREncodeOctetString(bt, str.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), str.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00111 }00112 00113 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BERDecodeOctetString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <a class="code" href="class_sec_block.html">SecByteBlock</a> &amp;str)00114 {00115         byte b;00116         <span class="keywordflow">if</span> (!bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(b) || b != OCTET_STRING)00117                 BERDecodeError();00118 00119         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bc;00120         <span class="keywordflow">if</span> (!BERLengthDecode(bt, bc))00121                 BERDecodeError();00122 00123         str.<a class="code" href="class_sec_block.html#_sec_block_with_hinta23">resize</a>(bc);00124         <span class="keywordflow">if</span> (bc != bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(str, bc))00125                 BERDecodeError();00126         <span class="keywordflow">return</span> bc;00127 }00128 00129 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BERDecodeOctetString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;str)00130 {00131         byte b;00132         <span class="keywordflow">if</span> (!bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(b) || b != OCTET_STRING)00133                 BERDecodeError();00134 00135         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bc;00136         <span class="keywordflow">if</span> (!BERLengthDecode(bt, bc))00137                 BERDecodeError();00138 00139         bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_10">TransferTo</a>(str, bc);00140         <span class="keywordflow">return</span> bc;00141 }00142 00143 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DEREncodeTextString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keyword">const</span> std::string &amp;str, byte asnTag)00144 {00145         bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(asnTag);00146         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lengthBytes = DERLengthEncode(bt, str.size());00147         bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>((<span class="keyword">const</span> byte *)str.data(), str.size());00148         <span class="keywordflow">return</span> 1+lengthBytes+str.size();00149 }00150 00151 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BERDecodeTextString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, std::string &amp;str, byte asnTag)00152 {00153         byte b;00154         <span class="keywordflow">if</span> (!bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(b) || b != asnTag)00155                 BERDecodeError();00156 00157         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bc;00158         <span class="keywordflow">if</span> (!BERLengthDecode(bt, bc))00159                 BERDecodeError();00160 00161         <a class="code" href="class_sec_block.html">SecByteBlock</a> temp(bc);00162         <span class="keywordflow">if</span> (bc != bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(temp, bc))00163                 BERDecodeError();00164         str.assign((<span class="keywordtype">char</span> *)temp.<a class="code" href="class_sec_block.html#_sec_block_with_hinta7">begin</a>(), bc);00165         <span class="keywordflow">return</span> bc;00166 }00167 <span class="comment"></span>00168 <span class="comment">/// ASN BitString</span>00169 <span class="comment"></span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DEREncodeBitString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <span class="keyword">const</span> byte *str, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> strLen, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> unusedBits)00170 {00171         bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(BIT_STRING);00172         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lengthBytes = DERLengthEncode(bt, strLen+1);00173         bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>((byte)unusedBits);00174         bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(str, strLen);00175         <span class="keywordflow">return</span> 2+lengthBytes+strLen;00176 }00177 00178 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BERDecodeBitString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;bt, <a class="code" href="class_sec_block.html">SecByteBlock</a> &amp;str, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &amp;unusedBits)00179 {00180         byte b;00181         <span class="keywordflow">if</span> (!bt.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(b) || b != BIT_STRING)00182                 BERDecodeError();00183 00184         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bc;00185         <span class="keywordflow">if</span> (!BERLengthDecode(bt, bc))

⌨️ 快捷键说明

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