Sophie

Sophie

distrib > Mandriva > 10.2 > i586 > media > contrib > by-pkgid > 7457b841ac8136d3a1a9d3d960c5252e > files > 17

libcryptopp-doc-5.2.1-2mdk.i586.rpm

<!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&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">Class&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">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;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 &lt;vector&gt;</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> &amp;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> &amp;in, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &amp;length);
00062 
00063 CRYPTOPP_DLL <span class="keywordtype">void</span> DEREncodeNull(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;out);
00064 CRYPTOPP_DLL <span class="keywordtype">void</span> BERDecodeNull(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;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> &amp;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> &amp;out, <span class="keyword">const</span> <a class="code" href="class_sec_block.html">SecByteBlock</a> &amp;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> &amp;in, <a class="code" href="class_sec_block.html">SecByteBlock</a> &amp;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> &amp;in, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;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> &amp;out, <span class="keyword">const</span> std::string &amp;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> &amp;in, std::string &amp;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> &amp;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> &amp;in, <a class="code" href="class_sec_block.html">SecByteBlock</a> &amp;str, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &amp;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> &amp;source, <a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;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> &amp;bt) {BERDecode(bt);}
00088 
00089         <span class="keyword">inline</span> OID &amp; 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> &amp;bt) <span class="keyword">const</span>;
00092         <span class="keywordtype">void</span> BERDecode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;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> &amp;bt) <span class="keyword">const</span>;
00096 
00097         std::vector&lt;unsigned long&gt; 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> &amp;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> &amp;bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> &amp;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> &amp; 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&lt;unsigned int&gt; 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> &amp;inQueue, byte asnTag);
00132         <span class="keyword">explicit</span> BERGeneralDecoder(BERGeneralDecoder &amp;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> &amp;target, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> &amp;transferBytes, <span class="keyword">const</span> std::string &amp;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> &amp;target, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> &amp;begin, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> end=ULONG_MAX, <span class="keyword">const</span> std::string &amp;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> &amp;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> &amp;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> &amp;outQueue, byte asnTag = SEQUENCE | CONSTRUCTED);
00163         <span class="keyword">explicit</span> DERGeneralEncoder(DERGeneralEncoder &amp;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> &amp;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> &amp;inQueue, byte asnTag = SEQUENCE | CONSTRUCTED)
00181                 : BERGeneralDecoder(inQueue, asnTag) {}
00182         <span class="keyword">explicit</span> BERSequenceDecoder(BERSequenceDecoder &amp;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> &amp;outQueue, byte asnTag = SEQUENCE | CONSTRUCTED)
00191                 : DERGeneralEncoder(outQueue, asnTag) {}
00192         <span class="keyword">explicit</span> DERSequenceEncoder(DERSequenceEncoder &amp;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> &amp;inQueue, byte asnTag = SET | CONSTRUCTED)
00201                 : BERGeneralDecoder(inQueue, asnTag) {}
00202         <span class="keyword">explicit</span> BERSetDecoder(BERSetDecoder &amp;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> &amp;outQueue, byte asnTag = SET | CONSTRUCTED)
00211                 : DERGeneralEncoder(outQueue, asnTag) {}
00212         <span class="keyword">explicit</span> DERSetEncoder(DERSetEncoder &amp;outQueue, byte asnTag = SET | CONSTRUCTED)
00213                 : DERGeneralEncoder(outQueue, asnTag) {}
00214 };
00215 
00216 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
00217 <span class="keyword">class </span>ASNOptional : <span class="keyword">public</span> member_ptr&lt;T&gt;
00218 {
00219 <span class="keyword">public</span>:
00220         <span class="keywordtype">void</span> BERDecode(BERSequenceDecoder &amp;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) &amp;&amp; (b &amp; 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> &amp;out)
00227         {
00228                 <span class="keywordflow">if</span> (this-&gt;get() != NULL)
00229                         this-&gt;get()-&gt;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> &amp;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> &amp;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> &amp;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> &amp;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> &amp;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> &amp;bt);
00256         <span class="keywordtype">void</span> DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;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> &amp;bt);
00264         <span class="keywordtype">void</span> DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;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> &amp;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> &amp;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> &lt;<span class="keyword">class</span> T&gt;
00281 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DEREncodeUnsigned(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;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&lt;<span class="keyword">sizeof</span>(w); i++)
00294                         buf[i+1] = byte(w &gt;&gt; (<span class="keyword">sizeof</span>(w)-1-i)*8);
00295                 bc = <span class="keyword">sizeof</span>(w);
00296                 <span class="keywordflow">while</span> (bc &gt; 1 &amp;&amp; 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] &amp; 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&lt;T&gt;::max conflicts with MFC max macro</span>
00309 <span class="comment">// CW41 workaround: std::numeric_limits&lt;T&gt;::max causes a template error</span>
00310 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
00311 <span class="keywordtype">void</span> BERDecodeUnsigned(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &amp;in, T &amp;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 &gt; <span class="keyword">sizeof</span>(w) &amp;&amp; *ptr == 0)
00328         {
00329                 bc--;
00330                 ptr++;
00331         }
00332         <span class="keywordflow">if</span> (bc &gt; <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&lt;bc; i++)
00337                 w = (w &lt;&lt; 8) | ptr[i];
00338 
00339         <span class="keywordflow">if</span> (w &lt; minValue || w &gt; maxValue)
00340                 BERDecodeError();
00341 }
00342 
00343 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> ::CryptoPP::OID &amp;lhs, <span class="keyword">const</span> ::CryptoPP::OID &amp;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 &amp;lhs, <span class="keyword">const</span> ::CryptoPP::OID &amp;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&lt;(<span class="keyword">const</span> ::CryptoPP::OID &amp;lhs, <span class="keyword">const</span> ::CryptoPP::OID &amp;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 &amp;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>