<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>Crypto++: asn.h Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.3.7 --> <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">Class 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">Class Members</a> | <a class="qindex" href="globals.html">File Members</a></div> <h1>asn.h</h1><pre class="fragment"><div>00001 <span class="preprocessor">#ifndef CRYPTOPP_ASN_H</span> 00002 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_ASN_H</span> 00003 <span class="preprocessor"></span> 00004 <span class="preprocessor">#include "filters.h"</span> 00005 <span class="preprocessor">#include "queue.h"</span> 00006 <span class="preprocessor">#include <vector></span> 00007 00008 NAMESPACE_BEGIN(CryptoPP) 00009 00010 <span class="comment">// these tags and flags are not complete</span> 00011 enum ASNTag 00012 { 00013 BOOLEAN = 0x01, 00014 INTEGER = 0x02, 00015 BIT_STRING = 0x03, 00016 OCTET_STRING = 0x04, 00017 TAG_NULL = 0x05, 00018 OBJECT_IDENTIFIER = 0x06, 00019 OBJECT_DESCRIPTOR = 0x07, 00020 EXTERNAL = 0x08, 00021 REAL = 0x09, 00022 ENUMERATED = 0x0a, 00023 UTF8_STRING = 0x0c, 00024 SEQUENCE = 0x10, 00025 SET = 0x11, 00026 NUMERIC_STRING = 0x12, 00027 PRINTABLE_STRING = 0x13, 00028 T61_STRING = 0x14, 00029 VIDEOTEXT_STRING = 0x15, 00030 IA5_STRING = 0x16, 00031 UTC_TIME = 0x17, 00032 GENERALIZED_TIME = 0x18, 00033 GRAPHIC_STRING = 0x19, 00034 VISIBLE_STRING = 0x1a, 00035 GENERAL_STRING = 0x1b 00036 }; 00037 00038 <span class="keyword">enum</span> ASNIdFlag 00039 { 00040 UNIVERSAL = 0x00, 00041 <span class="comment">// DATA = 0x01,</span> 00042 <span class="comment">// HEADER = 0x02,</span> 00043 CONSTRUCTED = 0x20, 00044 APPLICATION = 0x40, 00045 CONTEXT_SPECIFIC = 0x80, 00046 PRIVATE = 0xc0 00047 }; 00048 00049 <span class="keyword">inline</span> <span class="keywordtype">void</span> BERDecodeError() {<span class="keywordflow">throw</span> <a class="code" href="class_b_e_r_decode_err.html">BERDecodeErr</a>();} 00050 00051 <span class="keyword">class </span>CRYPTOPP_DLL UnknownOID : <span class="keyword">public</span> <a class="code" href="class_b_e_r_decode_err.html">BERDecodeErr</a> 00052 { 00053 <span class="keyword">public</span>: 00054 UnknownOID() : <a class="code" href="class_b_e_r_decode_err.html">BERDecodeErr</a>("BER decode error: unknown object identifier") {} 00055 UnknownOID(<span class="keyword">const</span> <span class="keywordtype">char</span> *err) : <a class="code" href="class_b_e_r_decode_err.html">BERDecodeErr</a>(err) {} 00056 }; 00057 00058 <span class="comment">// unsigned int DERLengthEncode(unsigned int length, byte *output=0);</span> 00059 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DERLengthEncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &out, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length); 00060 <span class="comment">// returns false if indefinite length</span> 00061 CRYPTOPP_DLL <span class="keywordtype">bool</span> BERLengthDecode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &in, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &length); 00062 00063 CRYPTOPP_DLL <span class="keywordtype">void</span> DEREncodeNull(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &out); 00064 CRYPTOPP_DLL <span class="keywordtype">void</span> BERDecodeNull(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &in); 00065 00066 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DEREncodeOctetString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &out, <span class="keyword">const</span> byte *str, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> strLen); 00067 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DEREncodeOctetString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &out, <span class="keyword">const</span> <a class="code" href="class_sec_block.html">SecByteBlock</a> &str); 00068 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BERDecodeOctetString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &in, <a class="code" href="class_sec_block.html">SecByteBlock</a> &str); 00069 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BERDecodeOctetString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &in, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &str); 00070 00071 <span class="comment">// for UTF8_STRING, PRINTABLE_STRING, and IA5_STRING</span> 00072 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DEREncodeTextString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &out, <span class="keyword">const</span> std::string &str, byte asnTag); 00073 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BERDecodeTextString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &in, std::string &str, byte asnTag); 00074 00075 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DEREncodeBitString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &out, <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=0); 00076 CRYPTOPP_DLL <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BERDecodeBitString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &in, <a class="code" href="class_sec_block.html">SecByteBlock</a> &str, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &unusedBits); 00077 00078 <span class="comment">// BER decode from source and DER reencode into dest</span> 00079 CRYPTOPP_DLL <span class="keywordtype">void</span> DERReencode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &source, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &dest); 00080 <span class="comment"></span> 00081 <span class="comment">//! Object Identifier</span> <a name="l00082"></a><a class="code" href="class_o_i_d.html">00082</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL OID 00083 { 00084 <span class="keyword">public</span>: 00085 OID() {} 00086 OID(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> v) : m_values(1, v) {} 00087 OID(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) {BERDecode(bt);} 00088 00089 <span class="keyword">inline</span> OID & operator+=(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> rhs) {m_values.push_back(rhs); <span class="keywordflow">return</span> *<span class="keyword">this</span>;} 00090 00091 <span class="keywordtype">void</span> DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) <span class="keyword">const</span>; 00092 <span class="keywordtype">void</span> BERDecode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt); 00093 00094 <span class="comment">// throw BERDecodeErr() if decoded value doesn't equal this OID</span> 00095 <span class="keywordtype">void</span> BERDecodeAndCheck(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) <span class="keyword">const</span>; 00096 00097 std::vector<unsigned long> m_values; 00098 00099 <span class="keyword">private</span>: 00100 <span class="keyword">static</span> <span class="keywordtype">void</span> EncodeValue(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> v); 00101 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DecodeValue(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> &v); 00102 }; 00103 00104 <span class="keyword">class </span>EncodedObjectFilter : <span class="keyword">public</span> <a class="code" href="class_filter.html">Filter</a> 00105 { 00106 <span class="keyword">public</span>: 00107 <span class="keyword">enum</span> Flag {PUT_OBJECTS=1, PUT_MESSANGE_END_AFTER_EACH_OBJECT=2, PUT_MESSANGE_END_AFTER_ALL_OBJECTS=4, PUT_MESSANGE_SERIES_END_AFTER_ALL_OBJECTS=8}; 00108 EncodedObjectFilter(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> *attachment = NULL, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nObjects = 1, word32 flags = 0); 00109 00110 <span class="keywordtype">void</span> <a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(<span class="keyword">const</span> byte *inString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length); 00111 00112 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetNumberOfCompletedObjects()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_nCurrentObject;} 00113 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> GetPositionOfObject(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i)<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_positions[i];} 00114 00115 <span class="keyword">private</span>: 00116 <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> & CurrentTarget(); 00117 00118 word32 m_flags; 00119 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_nObjects, m_nCurrentObject, m_level; 00120 std::vector<unsigned int> m_positions; 00121 <a class="code" href="class_byte_queue.html">ByteQueue</a> m_queue; 00122 <span class="keyword">enum</span> State {IDENTIFIER, LENGTH, BODY, TAIL, ALL_DONE} m_state; 00123 byte m_id; 00124 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_lengthRemaining; 00125 }; 00126 <span class="comment"></span> 00127 <span class="comment">//! BER General Decoder</span> <a name="l00128"></a><a class="code" href="class_b_e_r_general_decoder.html">00128</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL BERGeneralDecoder : <span class="keyword">public</span> <a class="code" href="class_store.html">Store</a> 00129 { 00130 <span class="keyword">public</span>: 00131 <span class="keyword">explicit</span> BERGeneralDecoder(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &inQueue, byte asnTag); 00132 <span class="keyword">explicit</span> BERGeneralDecoder(BERGeneralDecoder &inQueue, byte asnTag); 00133 ~BERGeneralDecoder(); 00134 00135 <span class="keywordtype">bool</span> IsDefiniteLength()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_definiteLength;} 00136 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> RemainingLength()<span class="keyword"> const </span>{assert(m_definiteLength); <span class="keywordflow">return</span> m_length;} 00137 <span class="keywordtype">bool</span> EndReached() <span class="keyword">const</span>; 00138 byte PeekByte() <span class="keyword">const</span>; 00139 <span class="keywordtype">void</span> CheckByte(byte b); 00140 00141 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> TransferTo2(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &target, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> &transferBytes, <span class="keyword">const</span> std::string &channel=NULL_CHANNEL, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>); 00142 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> CopyRangeTo2(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &target, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> &begin, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> end=ULONG_MAX, <span class="keyword">const</span> std::string &channel=NULL_CHANNEL, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>) <span class="keyword">const</span>; 00143 00144 <span class="comment">// call this to denote end of sequence</span> 00145 <span class="keywordtype">void</span> MessageEnd(); 00146 00147 <span class="keyword">protected</span>: 00148 <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &m_inQueue; 00149 <span class="keywordtype">bool</span> m_finished, m_definiteLength; 00150 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_length; 00151 00152 <span class="keyword">private</span>: 00153 <span class="keywordtype">void</span> Init(byte asnTag); 00154 <span class="keywordtype">void</span> StoreInitialize(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &parameters) {assert(<span class="keyword">false</span>);} 00155 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ReduceLength(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> delta); 00156 }; 00157 <span class="comment"></span> 00158 <span class="comment">//! DER General Encoder</span> <a name="l00159"></a><a class="code" href="class_d_e_r_general_encoder.html">00159</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL DERGeneralEncoder : <span class="keyword">public</span> <a class="code" href="class_byte_queue.html">ByteQueue</a> 00160 { 00161 <span class="keyword">public</span>: 00162 <span class="keyword">explicit</span> DERGeneralEncoder(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &outQueue, byte asnTag = SEQUENCE | CONSTRUCTED); 00163 <span class="keyword">explicit</span> DERGeneralEncoder(DERGeneralEncoder &outQueue, byte asnTag = SEQUENCE | CONSTRUCTED); 00164 ~DERGeneralEncoder(); 00165 00166 <span class="comment">// call this to denote end of sequence</span> 00167 <span class="keywordtype">void</span> MessageEnd(); 00168 00169 <span class="keyword">private</span>: 00170 <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &m_outQueue; 00171 <span class="keywordtype">bool</span> m_finished; 00172 00173 byte m_asnTag; 00174 }; 00175 <span class="comment"></span> 00176 <span class="comment">//! BER Sequence Decoder</span> <a name="l00177"></a><a class="code" href="class_b_e_r_sequence_decoder.html">00177</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL BERSequenceDecoder : <span class="keyword">public</span> BERGeneralDecoder 00178 { 00179 <span class="keyword">public</span>: 00180 <span class="keyword">explicit</span> BERSequenceDecoder(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &inQueue, byte asnTag = SEQUENCE | CONSTRUCTED) 00181 : BERGeneralDecoder(inQueue, asnTag) {} 00182 <span class="keyword">explicit</span> BERSequenceDecoder(BERSequenceDecoder &inQueue, byte asnTag = SEQUENCE | CONSTRUCTED) 00183 : BERGeneralDecoder(inQueue, asnTag) {} 00184 }; 00185 <span class="comment"></span> 00186 <span class="comment">//! DER Sequence Encoder</span> <a name="l00187"></a><a class="code" href="class_d_e_r_sequence_encoder.html">00187</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL DERSequenceEncoder : <span class="keyword">public</span> DERGeneralEncoder 00188 { 00189 <span class="keyword">public</span>: 00190 <span class="keyword">explicit</span> DERSequenceEncoder(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &outQueue, byte asnTag = SEQUENCE | CONSTRUCTED) 00191 : DERGeneralEncoder(outQueue, asnTag) {} 00192 <span class="keyword">explicit</span> DERSequenceEncoder(DERSequenceEncoder &outQueue, byte asnTag = SEQUENCE | CONSTRUCTED) 00193 : DERGeneralEncoder(outQueue, asnTag) {} 00194 }; 00195 <span class="comment"></span> 00196 <span class="comment">//! BER Set Decoder</span> <a name="l00197"></a><a class="code" href="class_b_e_r_set_decoder.html">00197</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL BERSetDecoder : <span class="keyword">public</span> BERGeneralDecoder 00198 { 00199 <span class="keyword">public</span>: 00200 <span class="keyword">explicit</span> BERSetDecoder(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &inQueue, byte asnTag = SET | CONSTRUCTED) 00201 : BERGeneralDecoder(inQueue, asnTag) {} 00202 <span class="keyword">explicit</span> BERSetDecoder(BERSetDecoder &inQueue, byte asnTag = SET | CONSTRUCTED) 00203 : BERGeneralDecoder(inQueue, asnTag) {} 00204 }; 00205 <span class="comment"></span> 00206 <span class="comment">//! DER Set Encoder</span> <a name="l00207"></a><a class="code" href="class_d_e_r_set_encoder.html">00207</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL DERSetEncoder : <span class="keyword">public</span> DERGeneralEncoder 00208 { 00209 <span class="keyword">public</span>: 00210 <span class="keyword">explicit</span> DERSetEncoder(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &outQueue, byte asnTag = SET | CONSTRUCTED) 00211 : DERGeneralEncoder(outQueue, asnTag) {} 00212 <span class="keyword">explicit</span> DERSetEncoder(DERSetEncoder &outQueue, byte asnTag = SET | CONSTRUCTED) 00213 : DERGeneralEncoder(outQueue, asnTag) {} 00214 }; 00215 00216 <span class="keyword">template</span> <<span class="keyword">class</span> T> 00217 <span class="keyword">class </span>ASNOptional : <span class="keyword">public</span> member_ptr<T> 00218 { 00219 <span class="keyword">public</span>: 00220 <span class="keywordtype">void</span> BERDecode(BERSequenceDecoder &seqDecoder, byte tag, byte mask = ~CONSTRUCTED) 00221 { 00222 byte b; 00223 <span class="keywordflow">if</span> (seqDecoder.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_4">Peek</a>(b) && (b & mask) == tag) 00224 reset(<span class="keyword">new</span> T(seqDecoder)); 00225 } 00226 <span class="keywordtype">void</span> DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &out) 00227 { 00228 <span class="keywordflow">if</span> (this->get() != NULL) 00229 this->get()->DEREncode(out); 00230 } 00231 }; 00232 <span class="comment"></span> 00233 <span class="comment">//! key that can be ASN.1 encoded</span> 00234 <span class="comment"></span><span class="comment">/** derived class should override either BERDecodeKey or BERDecodeKey2 */</span> <a name="l00235"></a><a class="code" href="class_a_s_n1_key.html">00235</a> <span class="keyword">class </span>CRYPTOPP_DLL ASN1Key : <span class="keyword">public</span> <a class="code" href="class_a_s_n1_crypto_material.html">ASN1CryptoMaterial</a> 00236 { 00237 <span class="keyword">public</span>: 00238 <span class="keyword">virtual</span> OID GetAlgorithmID() <span class="keyword">const</span> =0; 00239 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> BERDecodeAlgorithmParameters(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) 00240 {BERDecodeNull(bt); <span class="keywordflow">return</span> <span class="keyword">false</span>;} 00241 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> DEREncodeAlgorithmParameters(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)<span class="keyword"> const</span> 00242 <span class="keyword"> </span>{DEREncodeNull(bt); <span class="keywordflow">return</span> <span class="keyword">false</span>;} <span class="comment">// see RFC 2459, section 7.3.1</span><span class="comment"></span> 00243 <span class="comment"> //! decode subjectPublicKey part of subjectPublicKeyInfo, or privateKey part of privateKeyInfo, without the BIT STRING or OCTET STRING header</span> <a name="l00244"></a><a class="code" href="class_a_s_n1_key.html#_x509_public_keya5">00244</a> <span class="comment"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> BERDecodeKey(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) {assert(<span class="keyword">false</span>);} 00245 <span class="keyword">virtual</span> <span class="keywordtype">void</span> BERDecodeKey2(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">bool</span> parametersPresent, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size) 00246 {BERDecodeKey(bt);}<span class="comment"></span> 00247 <span class="comment"> //! encode subjectPublicKey part of subjectPublicKeyInfo, or privateKey part of privateKeyInfo, without the BIT STRING or OCTET STRING header</span> 00248 <span class="comment"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> DEREncodeKey(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) <span class="keyword">const</span> =0; 00249 }; 00250 <span class="comment"></span> 00251 <span class="comment">//! encodes/decodes subjectPublicKeyInfo</span> <a name="l00252"></a><a class="code" href="class_x509_public_key.html">00252</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL X509PublicKey : <span class="keyword">virtual</span> <span class="keyword">public</span> ASN1Key, <span class="keyword">public</span> <a class="code" href="class_public_key.html">PublicKey</a> 00253 { 00254 <span class="keyword">public</span>: 00255 <span class="keywordtype">void</span> BERDecode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt); 00256 <span class="keywordtype">void</span> DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) <span class="keyword">const</span>; 00257 }; 00258 <span class="comment"></span> 00259 <span class="comment">//! encodes/decodes privateKeyInfo</span> <a name="l00260"></a><a class="code" href="class_p_k_c_s8_private_key.html">00260</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL PKCS8PrivateKey : <span class="keyword">virtual</span> <span class="keyword">public</span> ASN1Key, <span class="keyword">public</span> <a class="code" href="class_private_key.html">PrivateKey</a> 00261 { 00262 <span class="keyword">public</span>: 00263 <span class="keywordtype">void</span> BERDecode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt); 00264 <span class="keywordtype">void</span> DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) <span class="keyword">const</span>; 00265 <span class="comment"></span> 00266 <span class="comment"> //! decode optional attributes including context-specific tag</span> 00267 <span class="comment"></span><span class="comment"> /*! /note default implementation stores attributes to be output in DEREncodeOptionalAttributes */</span> 00268 <span class="keyword">virtual</span> <span class="keywordtype">void</span> BERDecodeOptionalAttributes(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt);<span class="comment"></span> 00269 <span class="comment"> //! encode optional attributes including context-specific tag</span> 00270 <span class="comment"></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> DEREncodeOptionalAttributes(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) <span class="keyword">const</span>; 00271 00272 <span class="keyword">private</span>: 00273 <a class="code" href="class_byte_queue.html">ByteQueue</a> m_optionalAttributes; 00274 }; 00275 00276 <span class="comment">// ********************************************************</span> 00277 <span class="comment"></span> 00278 <span class="comment">//! DER Encode Unsigned</span> 00279 <span class="comment"></span><span class="comment">/*! for INTEGER, BOOLEAN, and ENUM */</span> 00280 <span class="keyword">template</span> <<span class="keyword">class</span> T> 00281 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DEREncodeUnsigned(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &out, T w, byte asnTag = INTEGER) 00282 { 00283 byte buf[<span class="keyword">sizeof</span>(w)+1]; 00284 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bc; 00285 <span class="keywordflow">if</span> (asnTag == BOOLEAN) 00286 { 00287 buf[<span class="keyword">sizeof</span>(w)] = w ? 0xff : 0; 00288 bc = 1; 00289 } 00290 <span class="keywordflow">else</span> 00291 { 00292 buf[0] = 0; 00293 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<<span class="keyword">sizeof</span>(w); i++) 00294 buf[i+1] = byte(w >> (<span class="keyword">sizeof</span>(w)-1-i)*8); 00295 bc = <span class="keyword">sizeof</span>(w); 00296 <span class="keywordflow">while</span> (bc > 1 && buf[<span class="keyword">sizeof</span>(w)+1-bc] == 0) 00297 --bc; 00298 <span class="keywordflow">if</span> (buf[<span class="keyword">sizeof</span>(w)+1-bc] & 0x80) 00299 ++bc; 00300 } 00301 out.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(asnTag); 00302 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> lengthBytes = DERLengthEncode(out, bc); 00303 out.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(buf+<span class="keyword">sizeof</span>(w)+1-bc, bc); 00304 <span class="keywordflow">return</span> 1+lengthBytes+bc; 00305 } 00306 <span class="comment"></span> 00307 <span class="comment">//! BER Decode Unsigned</span> 00308 <span class="comment"></span><span class="comment">// VC60 workaround: std::numeric_limits<T>::max conflicts with MFC max macro</span> 00309 <span class="comment">// CW41 workaround: std::numeric_limits<T>::max causes a template error</span> 00310 <span class="keyword">template</span> <<span class="keyword">class</span> T> 00311 <span class="keywordtype">void</span> BERDecodeUnsigned(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &in, T &w, byte asnTag = INTEGER, 00312 T minValue = 0, T maxValue = 0xffffffff) 00313 { 00314 byte b; 00315 <span class="keywordflow">if</span> (!in.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(b) || b != asnTag) 00316 BERDecodeError(); 00317 00318 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bc; 00319 BERLengthDecode(in, bc); 00320 00321 <a class="code" href="class_sec_block.html">SecByteBlock</a> buf(bc); 00322 00323 <span class="keywordflow">if</span> (bc != in.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_2">Get</a>(buf, bc)) 00324 BERDecodeError(); 00325 00326 <span class="keyword">const</span> byte *ptr = buf; 00327 <span class="keywordflow">while</span> (bc > <span class="keyword">sizeof</span>(w) && *ptr == 0) 00328 { 00329 bc--; 00330 ptr++; 00331 } 00332 <span class="keywordflow">if</span> (bc > <span class="keyword">sizeof</span>(w)) 00333 BERDecodeError(); 00334 00335 w = 0; 00336 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<bc; i++) 00337 w = (w << 8) | ptr[i]; 00338 00339 <span class="keywordflow">if</span> (w < minValue || w > maxValue) 00340 BERDecodeError(); 00341 } 00342 00343 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> ::CryptoPP::OID &lhs, <span class="keyword">const</span> ::CryptoPP::OID &rhs) 00344 {<span class="keywordflow">return</span> lhs.m_values == rhs.m_values;} 00345 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> ::CryptoPP::OID &lhs, <span class="keyword">const</span> ::CryptoPP::OID &rhs) 00346 {<span class="keywordflow">return</span> lhs.m_values != rhs.m_values;} 00347 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator<(<span class="keyword">const</span> ::CryptoPP::OID &lhs, <span class="keyword">const</span> ::CryptoPP::OID &rhs) 00348 {<span class="keywordflow">return</span> std::lexicographical_compare(lhs.m_values.begin(), lhs.m_values.end(), rhs.m_values.begin(), rhs.m_values.end());} 00349 inline ::CryptoPP::OID operator+(<span class="keyword">const</span> ::CryptoPP::OID &lhs, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> rhs) 00350 {return ::CryptoPP::OID(lhs)+=rhs;} 00351 00352 NAMESPACE_END 00353 00354 <span class="preprocessor">#endif</span> </div></pre><hr size="1"><address style="align: right;"><small>Generated on Sun Nov 7 08:23:56 2004 for Crypto++ by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0 ></a> 1.3.7 </small></address> </body> </html>