📄 asn_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++: 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 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>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 <iomanip></span>00010 <span class="preprocessor">#include <time.h></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> &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 <= 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 >> (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> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &length, <span class="keywordtype">bool</span> &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 & 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 & 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 >> (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 << 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> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &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> &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> &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> &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> &bt, <span class="keyword">const</span> <a class="code" href="class_sec_block.html">SecByteBlock</a> &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> &bt, <a class="code" href="class_sec_block.html">SecByteBlock</a> &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> &bt, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &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> &bt, <span class="keyword">const</span> std::string &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> &bt, std::string &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> &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> &bt, <a class="code" href="class_sec_block.html">SecByteBlock</a> &str, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &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 + -