Sophie

Sophie

distrib > Fedora > 13 > i386 > media > os > by-pkgid > 07dfcfe50d66c9a48a3c5e6c1693f12a > files > 1678

cryptopp-doc-5.6.1-0.1.svn479.fc13.i686.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Crypto++: cryptlib.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.6.1 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
    </ul>
  </div>
<h1>cryptlib.h</h1><a href="cryptlib_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// cryptlib.h - written and placed in the public domain by Wei Dai</span><span class="comment"></span>
<a name="l00002"></a>00002 <span class="comment">/*! \file</span>
<a name="l00003"></a>00003 <span class="comment">        This file contains the declarations for the abstract base</span>
<a name="l00004"></a>00004 <span class="comment">        classes that provide a uniform interface to this library.</span>
<a name="l00005"></a>00005 <span class="comment">*/</span>
<a name="l00006"></a>00006 <span class="comment"></span>
<a name="l00007"></a>00007 <span class="comment">/*!     \mainpage Crypto++ Library 5.6.0 API Reference</span>
<a name="l00008"></a>00008 <span class="comment">&lt;dl&gt;</span>
<a name="l00009"></a>00009 <span class="comment">&lt;dt&gt;Abstract Base Classes&lt;dd&gt;</span>
<a name="l00010"></a>00010 <span class="comment">        cryptlib.h</span>
<a name="l00011"></a>00011 <span class="comment">&lt;dt&gt;Authenticated Encryption&lt;dd&gt;</span>
<a name="l00012"></a>00012 <span class="comment">        AuthenticatedSymmetricCipherDocumentation</span>
<a name="l00013"></a>00013 <span class="comment">&lt;dt&gt;Symmetric Ciphers&lt;dd&gt;</span>
<a name="l00014"></a>00014 <span class="comment">        SymmetricCipherDocumentation</span>
<a name="l00015"></a>00015 <span class="comment">&lt;dt&gt;Hash Functions&lt;dd&gt;</span>
<a name="l00016"></a>00016 <span class="comment">        SHA1, SHA224, SHA256, SHA384, SHA512, Tiger, Whirlpool, RIPEMD160, RIPEMD320, RIPEMD128, RIPEMD256, Weak1::MD2, Weak1::MD4, Weak1::MD5</span>
<a name="l00017"></a>00017 <span class="comment">&lt;dt&gt;Non-Cryptographic Checksums&lt;dd&gt;</span>
<a name="l00018"></a>00018 <span class="comment">        CRC32, Adler32</span>
<a name="l00019"></a>00019 <span class="comment">&lt;dt&gt;Message Authentication Codes&lt;dd&gt;</span>
<a name="l00020"></a>00020 <span class="comment">        VMAC, HMAC, CBC_MAC, CMAC, DMAC, TTMAC, GCM (GMAC)</span>
<a name="l00021"></a>00021 <span class="comment">&lt;dt&gt;Random Number Generators&lt;dd&gt;</span>
<a name="l00022"></a>00022 <span class="comment">        NullRNG(), LC_RNG, RandomPool, BlockingRng, NonblockingRng, AutoSeededRandomPool, AutoSeededX917RNG, DefaultAutoSeededRNG</span>
<a name="l00023"></a>00023 <span class="comment">&lt;dt&gt;Password-based Cryptography&lt;dd&gt;</span>
<a name="l00024"></a>00024 <span class="comment">        PasswordBasedKeyDerivationFunction</span>
<a name="l00025"></a>00025 <span class="comment">&lt;dt&gt;Public Key Cryptosystems&lt;dd&gt;</span>
<a name="l00026"></a>00026 <span class="comment">        DLIES, ECIES, LUCES, RSAES, RabinES, LUC_IES</span>
<a name="l00027"></a>00027 <span class="comment">&lt;dt&gt;Public Key Signature Schemes&lt;dd&gt;</span>
<a name="l00028"></a>00028 <span class="comment">        DSA, GDSA, ECDSA, NR, ECNR, LUCSS, RSASS, RSASS_ISO, RabinSS, RWSS, ESIGN</span>
<a name="l00029"></a>00029 <span class="comment">&lt;dt&gt;Key Agreement&lt;dd&gt;</span>
<a name="l00030"></a>00030 <span class="comment">        #DH, DH2, #MQV, ECDH, ECMQV, XTR_DH</span>
<a name="l00031"></a>00031 <span class="comment">&lt;dt&gt;Algebraic Structures&lt;dd&gt;</span>
<a name="l00032"></a>00032 <span class="comment">        Integer, PolynomialMod2, PolynomialOver, RingOfPolynomialsOver,</span>
<a name="l00033"></a>00033 <span class="comment">        ModularArithmetic, MontgomeryRepresentation, GFP2_ONB,</span>
<a name="l00034"></a>00034 <span class="comment">        GF2NP, GF256, GF2_32, EC2N, ECP</span>
<a name="l00035"></a>00035 <span class="comment">&lt;dt&gt;Secret Sharing and Information Dispersal&lt;dd&gt;</span>
<a name="l00036"></a>00036 <span class="comment">        SecretSharing, SecretRecovery, InformationDispersal, InformationRecovery</span>
<a name="l00037"></a>00037 <span class="comment">&lt;dt&gt;Compression&lt;dd&gt;</span>
<a name="l00038"></a>00038 <span class="comment">        Deflator, Inflator, Gzip, Gunzip, ZlibCompressor, ZlibDecompressor</span>
<a name="l00039"></a>00039 <span class="comment">&lt;dt&gt;Input Source Classes&lt;dd&gt;</span>
<a name="l00040"></a>00040 <span class="comment">        StringSource, ArraySource, FileSource, SocketSource, WindowsPipeSource, RandomNumberSource</span>
<a name="l00041"></a>00041 <span class="comment">&lt;dt&gt;Output Sink Classes&lt;dd&gt;</span>
<a name="l00042"></a>00042 <span class="comment">        StringSinkTemplate, ArraySink, FileSink, SocketSink, WindowsPipeSink, RandomNumberSink</span>
<a name="l00043"></a>00043 <span class="comment">&lt;dt&gt;Filter Wrappers&lt;dd&gt;</span>
<a name="l00044"></a>00044 <span class="comment">        StreamTransformationFilter, HashFilter, HashVerificationFilter, SignerFilter, SignatureVerificationFilter</span>
<a name="l00045"></a>00045 <span class="comment">&lt;dt&gt;Binary to Text Encoders and Decoders&lt;dd&gt;</span>
<a name="l00046"></a>00046 <span class="comment">        HexEncoder, HexDecoder, Base64Encoder, Base64Decoder, Base32Encoder, Base32Decoder</span>
<a name="l00047"></a>00047 <span class="comment">&lt;dt&gt;Wrappers for OS features&lt;dd&gt;</span>
<a name="l00048"></a>00048 <span class="comment">        Timer, Socket, WindowsHandle, ThreadLocalStorage, ThreadUserTimer</span>
<a name="l00049"></a>00049 <span class="comment">&lt;dt&gt;FIPS 140 related&lt;dd&gt;</span>
<a name="l00050"></a>00050 <span class="comment">        fips140.h</span>
<a name="l00051"></a>00051 <span class="comment">&lt;/dl&gt;</span>
<a name="l00052"></a>00052 <span class="comment"></span>
<a name="l00053"></a>00053 <span class="comment">In the FIPS 140-2 validated DLL version of Crypto++, only the following implementation class are available.</span>
<a name="l00054"></a>00054 <span class="comment">&lt;dl&gt;</span>
<a name="l00055"></a>00055 <span class="comment">&lt;dt&gt;Block Ciphers&lt;dd&gt;</span>
<a name="l00056"></a>00056 <span class="comment">        AES, DES_EDE2, DES_EDE3, SKIPJACK</span>
<a name="l00057"></a>00057 <span class="comment">&lt;dt&gt;Cipher Modes (replace template parameter BC with one of the block ciphers above)&lt;dd&gt;</span>
<a name="l00058"></a>00058 <span class="comment">        ECB_Mode&lt;BC&gt;, CTR_Mode&lt;BC&gt;, CBC_Mode&lt;BC&gt;, CFB_FIPS_Mode&lt;BC&gt;, OFB_Mode&lt;BC&gt;</span>
<a name="l00059"></a>00059 <span class="comment">&lt;dt&gt;Hash Functions&lt;dd&gt;</span>
<a name="l00060"></a>00060 <span class="comment">        SHA1, SHA224, SHA256, SHA384, SHA512</span>
<a name="l00061"></a>00061 <span class="comment">&lt;dt&gt;Public Key Signature Schemes (replace template parameter H with one of the hash functions above)&lt;dd&gt;</span>
<a name="l00062"></a>00062 <span class="comment">        RSASS&lt;PKCS1v15, H&gt;, RSASS&lt;PSS, H&gt;, RSASS_ISO&lt;H&gt;, RWSS&lt;P1363_EMSA2, H&gt;, DSA, ECDSA&lt;ECP, H&gt;, ECDSA&lt;EC2N, H&gt;</span>
<a name="l00063"></a>00063 <span class="comment">&lt;dt&gt;Message Authentication Codes (replace template parameter H with one of the hash functions above)&lt;dd&gt;</span>
<a name="l00064"></a>00064 <span class="comment">        HMAC&lt;H&gt;, CBC_MAC&lt;DES_EDE2&gt;, CBC_MAC&lt;DES_EDE3&gt;</span>
<a name="l00065"></a>00065 <span class="comment">&lt;dt&gt;Random Number Generators&lt;dd&gt;</span>
<a name="l00066"></a>00066 <span class="comment">        DefaultAutoSeededRNG (AutoSeededX917RNG&lt;AES&gt;)</span>
<a name="l00067"></a>00067 <span class="comment">&lt;dt&gt;Key Agreement&lt;dd&gt;</span>
<a name="l00068"></a>00068 <span class="comment">        #DH</span>
<a name="l00069"></a>00069 <span class="comment">&lt;dt&gt;Public Key Cryptosystems&lt;dd&gt;</span>
<a name="l00070"></a>00070 <span class="comment">        RSAES&lt;OAEP&lt;SHA1&gt; &gt;</span>
<a name="l00071"></a>00071 <span class="comment">&lt;/dl&gt;</span>
<a name="l00072"></a>00072 <span class="comment"></span>
<a name="l00073"></a>00073 <span class="comment">&lt;p&gt;This reference manual is a work in progress. Some classes are still lacking detailed descriptions.</span>
<a name="l00074"></a>00074 <span class="comment">&lt;p&gt;Click &lt;a href=&quot;CryptoPPRef.zip&quot;&gt;here&lt;/a&gt; to download a zip archive containing this manual.</span>
<a name="l00075"></a>00075 <span class="comment">&lt;p&gt;Thanks to Ryan Phillips for providing the Doxygen configuration file</span>
<a name="l00076"></a>00076 <span class="comment">and getting me started with this manual.</span>
<a name="l00077"></a>00077 <span class="comment">*/</span>
<a name="l00078"></a>00078 
<a name="l00079"></a>00079 <span class="preprocessor">#ifndef CRYPTOPP_CRYPTLIB_H</span>
<a name="l00080"></a>00080 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_CRYPTLIB_H</span>
<a name="l00081"></a>00081 <span class="preprocessor"></span>
<a name="l00082"></a>00082 <span class="preprocessor">#include &quot;config.h&quot;</span>
<a name="l00083"></a>00083 <span class="preprocessor">#include &quot;stdcpp.h&quot;</span>
<a name="l00084"></a>00084 
<a name="l00085"></a>00085 NAMESPACE_BEGIN(CryptoPP)
<a name="l00086"></a>00086 
<a name="l00087"></a>00087 <span class="comment">// forward declarations</span>
<a name="l00088"></a>00088 class <a class="code" href="class_integer.html" title="multiple precision integer and basic arithmetics">Integer</a>;
<a name="l00089"></a>00089 class <a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a>;
<a name="l00090"></a>00090 class <a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a>;
<a name="l00091"></a>00091 <span class="comment"></span>
<a name="l00092"></a>00092 <span class="comment">//! used to specify a direction for a cipher to operate in (encrypt or decrypt)</span>
<a name="l00093"></a><a class="code" href="cryptlib_8h.html#a353ccabf5ddc119a6a33e92f7b9961c7">00093</a> <span class="comment"></span>enum <a class="code" href="cryptlib_8h.html#a353ccabf5ddc119a6a33e92f7b9961c7" title="used to specify a direction for a cipher to operate in (encrypt or decrypt)">CipherDir</a> {ENCRYPTION, DECRYPTION};
<a name="l00094"></a>00094 <span class="comment"></span>
<a name="l00095"></a>00095 <span class="comment">//! used to represent infinite time</span>
<a name="l00096"></a><a class="code" href="cryptlib_8h.html#a5dc7a255dd813433eeee3152544c2f1d">00096</a> <span class="comment"></span><span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="cryptlib_8h.html#a5dc7a255dd813433eeee3152544c2f1d" title="used to represent infinite time">INFINITE_TIME</a> = ULONG_MAX;
<a name="l00097"></a>00097 
<a name="l00098"></a>00098 <span class="comment">// VC60 workaround: using enums as template parameters causes problems</span>
<a name="l00099"></a>00099 <span class="keyword">template</span> &lt;<span class="keyword">typename</span> ENUM_TYPE, <span class="keywordtype">int</span> VALUE&gt;
<a name="l00100"></a><a class="code" href="struct_enum_to_type.html">00100</a> <span class="keyword">struct </span><a class="code" href="struct_enum_to_type.html">EnumToType</a>
<a name="l00101"></a>00101 {
<a name="l00102"></a>00102         <span class="keyword">static</span> ENUM_TYPE ToEnum() {<span class="keywordflow">return</span> (ENUM_TYPE)VALUE;}
<a name="l00103"></a>00103 };
<a name="l00104"></a>00104 
<a name="l00105"></a>00105 <span class="keyword">enum</span> ByteOrder {LITTLE_ENDIAN_ORDER = 0, BIG_ENDIAN_ORDER = 1};
<a name="l00106"></a>00106 <span class="keyword">typedef</span> <a class="code" href="struct_enum_to_type.html">EnumToType&lt;ByteOrder, LITTLE_ENDIAN_ORDER&gt;</a> <a class="code" href="struct_enum_to_type.html">LittleEndian</a>;
<a name="l00107"></a>00107 <span class="keyword">typedef</span> <a class="code" href="struct_enum_to_type.html">EnumToType&lt;ByteOrder, BIG_ENDIAN_ORDER&gt;</a> <a class="code" href="struct_enum_to_type.html">BigEndian</a>;
<a name="l00108"></a>00108 <span class="comment"></span>
<a name="l00109"></a>00109 <span class="comment">//! base class for all exceptions thrown by Crypto++</span>
<a name="l00110"></a><a class="code" href="class_exception.html">00110</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a> : <span class="keyword">public</span> std::exception
<a name="l00111"></a>00111 {
<a name="l00112"></a>00112 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00113"></a>00113 <span class="comment">        //! error types</span>
<a name="l00114"></a><a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0a">00114</a> <span class="comment"></span>        <span class="keyword">enum</span> <a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0a" title="error types">ErrorType</a> {<span class="comment"></span>
<a name="l00115"></a>00115 <span class="comment">                //! a method is not implemented</span>
<a name="l00116"></a><a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0aa1323c0f32eac2f9502b99c5c899ce629">00116</a> <span class="comment"></span>                NOT_IMPLEMENTED,<span class="comment"></span>
<a name="l00117"></a>00117 <span class="comment">                //! invalid function argument</span>
<a name="l00118"></a><a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0aab018a535e00d226178a71d2c5fa800d1">00118</a> <span class="comment"></span>                INVALID_ARGUMENT,<span class="comment"></span>
<a name="l00119"></a>00119 <span class="comment">                //! BufferedTransformation received a Flush(true) signal but can&apos;t flush buffers</span>
<a name="l00120"></a><a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0aa11a8912fe9ae87f7469705b6d5130a06">00120</a> <span class="comment"></span>                CANNOT_FLUSH,<span class="comment"></span>
<a name="l00121"></a>00121 <span class="comment">                //! data integerity check (such as CRC or MAC) failed</span>
<a name="l00122"></a><a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0aa77a639a803cf53052f9c76a0354247e6">00122</a> <span class="comment"></span>                DATA_INTEGRITY_CHECK_FAILED,<span class="comment"></span>
<a name="l00123"></a>00123 <span class="comment">                //! received input data that doesn&apos;t conform to expected format</span>
<a name="l00124"></a><a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0aa3a0352964781e7712b21dbb70ffbe646">00124</a> <span class="comment"></span>                INVALID_DATA_FORMAT,<span class="comment"></span>
<a name="l00125"></a>00125 <span class="comment">                //! error reading from input device or writing to output device</span>
<a name="l00126"></a><a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0aad51c7d0e0156bc1794b3b7f99599aba8">00126</a> <span class="comment"></span>                IO_ERROR,<span class="comment"></span>
<a name="l00127"></a>00127 <span class="comment">                //! some error not belong to any of the above categories</span>
<a name="l00128"></a><a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0aa27d9ee7704100a88e4ae4adcc4072015">00128</a> <span class="comment"></span>                OTHER_ERROR
<a name="l00129"></a>00129         };
<a name="l00130"></a>00130 
<a name="l00131"></a>00131         <span class="keyword">explicit</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(ErrorType errorType, <span class="keyword">const</span> std::string &amp;s) : m_errorType(errorType), m_what(s) {}
<a name="l00132"></a>00132         <span class="keyword">virtual</span> ~<a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>() throw() {}
<a name="l00133"></a>00133         <span class="keyword">const</span> <span class="keywordtype">char</span> *what() <span class="keyword">const</span> throw() {<span class="keywordflow">return</span> (m_what.c_str());}
<a name="l00134"></a>00134         <span class="keyword">const</span> std::string &amp;GetWhat()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_what;}
<a name="l00135"></a>00135         <span class="keywordtype">void</span> SetWhat(<span class="keyword">const</span> std::string &amp;s) {m_what = s;}
<a name="l00136"></a>00136         ErrorType GetErrorType()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_errorType;}
<a name="l00137"></a>00137         <span class="keywordtype">void</span> SetErrorType(ErrorType errorType) {m_errorType = errorType;}
<a name="l00138"></a>00138 
<a name="l00139"></a>00139 <span class="keyword">private</span>:
<a name="l00140"></a>00140         ErrorType m_errorType;
<a name="l00141"></a>00141         std::string m_what;
<a name="l00142"></a>00142 };
<a name="l00143"></a>00143 <span class="comment"></span>
<a name="l00144"></a>00144 <span class="comment">//! exception thrown when an invalid argument is detected</span>
<a name="l00145"></a><a class="code" href="class_invalid_argument.html">00145</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a> : <span class="keyword">public</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>
<a name="l00146"></a>00146 {
<a name="l00147"></a>00147 <span class="keyword">public</span>:
<a name="l00148"></a>00148         <span class="keyword">explicit</span> <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a>(<span class="keyword">const</span> std::string &amp;s) : <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(INVALID_ARGUMENT, s) {}
<a name="l00149"></a>00149 };
<a name="l00150"></a>00150 <span class="comment"></span>
<a name="l00151"></a>00151 <span class="comment">//! exception thrown when input data is received that doesn&apos;t conform to expected format</span>
<a name="l00152"></a><a class="code" href="class_invalid_data_format.html">00152</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL <a class="code" href="class_invalid_data_format.html" title="exception thrown when input data is received that doesn&amp;#39;t conform to expected...">InvalidDataFormat</a> : <span class="keyword">public</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>
<a name="l00153"></a>00153 {
<a name="l00154"></a>00154 <span class="keyword">public</span>:
<a name="l00155"></a>00155         <span class="keyword">explicit</span> <a class="code" href="class_invalid_data_format.html" title="exception thrown when input data is received that doesn&amp;#39;t conform to expected...">InvalidDataFormat</a>(<span class="keyword">const</span> std::string &amp;s) : <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(INVALID_DATA_FORMAT, s) {}
<a name="l00156"></a>00156 };
<a name="l00157"></a>00157 <span class="comment"></span>
<a name="l00158"></a>00158 <span class="comment">//! exception thrown by decryption filters when trying to decrypt an invalid ciphertext</span>
<a name="l00159"></a><a class="code" href="class_invalid_ciphertext.html">00159</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL <a class="code" href="class_invalid_ciphertext.html" title="exception thrown by decryption filters when trying to decrypt an invalid ciphertext...">InvalidCiphertext</a> : <span class="keyword">public</span> <a class="code" href="class_invalid_data_format.html" title="exception thrown when input data is received that doesn&amp;#39;t conform to expected...">InvalidDataFormat</a>
<a name="l00160"></a>00160 {
<a name="l00161"></a>00161 <span class="keyword">public</span>:
<a name="l00162"></a>00162         <span class="keyword">explicit</span> <a class="code" href="class_invalid_ciphertext.html" title="exception thrown by decryption filters when trying to decrypt an invalid ciphertext...">InvalidCiphertext</a>(<span class="keyword">const</span> std::string &amp;s) : <a class="code" href="class_invalid_data_format.html" title="exception thrown when input data is received that doesn&amp;#39;t conform to expected...">InvalidDataFormat</a>(s) {}
<a name="l00163"></a>00163 };
<a name="l00164"></a>00164 <span class="comment"></span>
<a name="l00165"></a>00165 <span class="comment">//! exception thrown by a class if a non-implemented method is called</span>
<a name="l00166"></a><a class="code" href="class_not_implemented.html">00166</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a> : <span class="keyword">public</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>
<a name="l00167"></a>00167 {
<a name="l00168"></a>00168 <span class="keyword">public</span>:
<a name="l00169"></a>00169         <span class="keyword">explicit</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="keyword">const</span> std::string &amp;s) : <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(NOT_IMPLEMENTED, s) {}
<a name="l00170"></a>00170 };
<a name="l00171"></a>00171 <span class="comment"></span>
<a name="l00172"></a>00172 <span class="comment">//! exception thrown by a class when Flush(true) is called but it can&apos;t completely flush its buffers</span>
<a name="l00173"></a><a class="code" href="class_cannot_flush.html">00173</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL <a class="code" href="class_cannot_flush.html" title="exception thrown by a class when Flush(true) is called but it can&amp;#39;t completely...">CannotFlush</a> : <span class="keyword">public</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>
<a name="l00174"></a>00174 {
<a name="l00175"></a>00175 <span class="keyword">public</span>:
<a name="l00176"></a>00176         <span class="keyword">explicit</span> <a class="code" href="class_cannot_flush.html" title="exception thrown by a class when Flush(true) is called but it can&amp;#39;t completely...">CannotFlush</a>(<span class="keyword">const</span> std::string &amp;s) : <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(CANNOT_FLUSH, s) {}
<a name="l00177"></a>00177 };
<a name="l00178"></a>00178 <span class="comment"></span>
<a name="l00179"></a>00179 <span class="comment">//! error reported by the operating system</span>
<a name="l00180"></a><a class="code" href="class_o_s___error.html">00180</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL <a class="code" href="class_o_s___error.html" title="error reported by the operating system">OS_Error</a> : <span class="keyword">public</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>
<a name="l00181"></a>00181 {
<a name="l00182"></a>00182 <span class="keyword">public</span>:
<a name="l00183"></a>00183         <a class="code" href="class_o_s___error.html" title="error reported by the operating system">OS_Error</a>(<a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0a" title="error types">ErrorType</a> errorType, <span class="keyword">const</span> std::string &amp;s, <span class="keyword">const</span> std::string&amp; operation, <span class="keywordtype">int</span> errorCode)
<a name="l00184"></a>00184                 : <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(errorType, s), m_operation(operation), m_errorCode(errorCode) {}
<a name="l00185"></a>00185         ~<a class="code" href="class_o_s___error.html" title="error reported by the operating system">OS_Error</a>() <span class="keywordflow">throw</span>() {}
<a name="l00186"></a>00186 
<a name="l00187"></a>00187         <span class="comment">// the operating system API that reported the error</span>
<a name="l00188"></a>00188         <span class="keyword">const</span> std::string &amp; GetOperation()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_operation;}
<a name="l00189"></a>00189         <span class="comment">// the error code return by the operating system</span>
<a name="l00190"></a>00190         <span class="keywordtype">int</span> GetErrorCode()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_errorCode;}
<a name="l00191"></a>00191 
<a name="l00192"></a>00192 <span class="keyword">protected</span>:
<a name="l00193"></a>00193         std::string m_operation;
<a name="l00194"></a>00194         <span class="keywordtype">int</span> m_errorCode;
<a name="l00195"></a>00195 };
<a name="l00196"></a>00196 <span class="comment"></span>
<a name="l00197"></a>00197 <span class="comment">//! used to return decoding results</span>
<a name="l00198"></a><a class="code" href="struct_decoding_result.html">00198</a> <span class="comment"></span><span class="keyword">struct </span>CRYPTOPP_DLL <a class="code" href="struct_decoding_result.html" title="used to return decoding results">DecodingResult</a>
<a name="l00199"></a>00199 {
<a name="l00200"></a>00200         <span class="keyword">explicit</span> <a class="code" href="struct_decoding_result.html" title="used to return decoding results">DecodingResult</a>() : isValidCoding(<span class="keyword">false</span>), messageLength(0) {}
<a name="l00201"></a>00201         <span class="keyword">explicit</span> DecodingResult(<span class="keywordtype">size_t</span> len) : isValidCoding(<span class="keyword">true</span>), messageLength(len) {}
<a name="l00202"></a>00202 
<a name="l00203"></a>00203         <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> DecodingResult &amp;rhs)<span class="keyword"> const </span>{<span class="keywordflow">return</span> isValidCoding == rhs.isValidCoding &amp;&amp; messageLength == rhs.messageLength;}
<a name="l00204"></a>00204         <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> DecodingResult &amp;rhs)<span class="keyword"> const </span>{<span class="keywordflow">return</span> !operator==(rhs);}
<a name="l00205"></a>00205 
<a name="l00206"></a>00206         <span class="keywordtype">bool</span> isValidCoding;
<a name="l00207"></a>00207         <span class="keywordtype">size_t</span> messageLength;
<a name="l00208"></a>00208 
<a name="l00209"></a>00209 <span class="preprocessor">#ifdef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY</span>
<a name="l00210"></a>00210 <span class="preprocessor"></span>        operator size_t()<span class="keyword"> const </span>{<span class="keywordflow">return</span> isValidCoding ? messageLength : 0;}
<a name="l00211"></a>00211 <span class="preprocessor">#endif</span>
<a name="l00212"></a>00212 <span class="preprocessor"></span>};
<a name="l00213"></a>00213 <span class="comment"></span>
<a name="l00214"></a>00214 <span class="comment">//! interface for retrieving values given their names</span>
<a name="l00215"></a>00215 <span class="comment"></span><span class="comment">/*! \note This class is used to safely pass a variable number of arbitrarily typed arguments to functions</span>
<a name="l00216"></a>00216 <span class="comment">        and to read values from keys and crypto parameters.</span>
<a name="l00217"></a>00217 <span class="comment">        \note To obtain an object that implements NameValuePairs for the purpose of parameter</span>
<a name="l00218"></a>00218 <span class="comment">        passing, use the MakeParameters() function.</span>
<a name="l00219"></a>00219 <span class="comment">        \note To get a value from NameValuePairs, you need to know the name and the type of the value. </span>
<a name="l00220"></a>00220 <span class="comment">        Call GetValueNames() on a NameValuePairs object to obtain a list of value names that it supports.</span>
<a name="l00221"></a>00221 <span class="comment">        Then look at the Name namespace documentation to see what the type of each value is, or</span>
<a name="l00222"></a>00222 <span class="comment">        alternatively, call GetIntValue() with the value name, and if the type is not int, a</span>
<a name="l00223"></a>00223 <span class="comment">        ValueTypeMismatch exception will be thrown and you can get the actual type from the exception object.</span>
<a name="l00224"></a>00224 <span class="comment">*/</span>
<a name="l00225"></a><a class="code" href="class_name_value_pairs.html">00225</a> <span class="keyword">class </span>CRYPTOPP_NO_VTABLE <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a>
<a name="l00226"></a>00226 {
<a name="l00227"></a>00227 <span class="keyword">public</span>:
<a name="l00228"></a>00228         <span class="keyword">virtual</span> ~<a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a>() {}
<a name="l00229"></a>00229 <span class="comment"></span>
<a name="l00230"></a>00230 <span class="comment">        //! exception thrown when trying to retrieve a value using a different type than expected</span>
<a name="l00231"></a><a class="code" href="class_name_value_pairs_1_1_value_type_mismatch.html">00231</a> <span class="comment"></span>        <span class="keyword">class </span>CRYPTOPP_DLL <a class="code" href="class_name_value_pairs_1_1_value_type_mismatch.html" title="exception thrown when trying to retrieve a value using a different type than expected...">ValueTypeMismatch</a> : <span class="keyword">public</span> <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a>
<a name="l00232"></a>00232         {
<a name="l00233"></a>00233         <span class="keyword">public</span>:
<a name="l00234"></a>00234                 <a class="code" href="class_name_value_pairs_1_1_value_type_mismatch.html" title="exception thrown when trying to retrieve a value using a different type than expected...">ValueTypeMismatch</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keyword">const</span> std::type_info &amp;stored, <span class="keyword">const</span> std::type_info &amp;retrieving)
<a name="l00235"></a>00235                         : <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a>(<span class="stringliteral">&quot;NameValuePairs: type mismatch for &apos;&quot;</span> + name + <span class="stringliteral">&quot;&apos;, stored &apos;&quot;</span> + stored.name() + <span class="stringliteral">&quot;&apos;, trying to retrieve &apos;&quot;</span> + retrieving.name() + <span class="stringliteral">&quot;&apos;&quot;</span>)
<a name="l00236"></a>00236                         , m_stored(stored), m_retrieving(retrieving) {}
<a name="l00237"></a>00237 
<a name="l00238"></a>00238                 <span class="keyword">const</span> std::type_info &amp; GetStoredTypeInfo()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_stored;}
<a name="l00239"></a>00239                 <span class="keyword">const</span> std::type_info &amp; GetRetrievingTypeInfo()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_retrieving;}
<a name="l00240"></a>00240 
<a name="l00241"></a>00241         <span class="keyword">private</span>:
<a name="l00242"></a>00242                 <span class="keyword">const</span> std::type_info &amp;m_stored;
<a name="l00243"></a>00243                 <span class="keyword">const</span> std::type_info &amp;m_retrieving;
<a name="l00244"></a>00244         };
<a name="l00245"></a>00245 <span class="comment"></span>
<a name="l00246"></a>00246 <span class="comment">        //! get a copy of this object or a subobject of it</span>
<a name="l00247"></a>00247 <span class="comment"></span>        <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
<a name="l00248"></a><a class="code" href="class_name_value_pairs.html#ab7afe4b5e1ced5cc8fa6f695bd7bd98c">00248</a>         <span class="keywordtype">bool</span> GetThisObject(T &amp;<span class="keywordtype">object</span>)<span class="keyword"> const</span>
<a name="l00249"></a>00249 <span class="keyword">        </span>{
<a name="l00250"></a>00250                 <span class="keywordflow">return</span> GetValue((std::string(<span class="stringliteral">&quot;ThisObject:&quot;</span>)+<span class="keyword">typeid</span>(T).name()).c_str(), <span class="keywordtype">object</span>);
<a name="l00251"></a>00251         }
<a name="l00252"></a>00252 <span class="comment"></span>
<a name="l00253"></a>00253 <span class="comment">        //! get a pointer to this object, as a pointer to T</span>
<a name="l00254"></a>00254 <span class="comment"></span>        <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
<a name="l00255"></a><a class="code" href="class_name_value_pairs.html#a01c64a1e0a5f667898b4c1968a853c0f">00255</a>         <span class="keywordtype">bool</span> GetThisPointer(T *&amp;p)<span class="keyword"> const</span>
<a name="l00256"></a>00256 <span class="keyword">        </span>{
<a name="l00257"></a>00257                 <span class="keywordflow">return</span> GetValue((std::string(<span class="stringliteral">&quot;ThisPointer:&quot;</span>)+<span class="keyword">typeid</span>(T).name()).c_str(), p);
<a name="l00258"></a>00258         }
<a name="l00259"></a>00259 <span class="comment"></span>
<a name="l00260"></a>00260 <span class="comment">        //! get a named value, returns true if the name exists</span>
<a name="l00261"></a>00261 <span class="comment"></span>        <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
<a name="l00262"></a><a class="code" href="class_name_value_pairs.html#a96686e9f8d6ce3ab870e516fb72b608e">00262</a>         <span class="keywordtype">bool</span> GetValue(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, T &amp;value)<span class="keyword"> const</span>
<a name="l00263"></a>00263 <span class="keyword">        </span>{
<a name="l00264"></a>00264                 <span class="keywordflow">return</span> GetVoidValue(name, <span class="keyword">typeid</span>(T), &amp;value);
<a name="l00265"></a>00265         }
<a name="l00266"></a>00266 <span class="comment"></span>
<a name="l00267"></a>00267 <span class="comment">        //! get a named value, returns the default if the name doesn&apos;t exist</span>
<a name="l00268"></a>00268 <span class="comment"></span>        <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
<a name="l00269"></a><a class="code" href="class_name_value_pairs.html#a943b2009297783f1c35bae46efc3b5f7">00269</a>         T GetValueWithDefault(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, T defaultValue)<span class="keyword"> const</span>
<a name="l00270"></a>00270 <span class="keyword">        </span>{
<a name="l00271"></a>00271                 GetValue(name, defaultValue);
<a name="l00272"></a>00272                 <span class="keywordflow">return</span> defaultValue;
<a name="l00273"></a>00273         }
<a name="l00274"></a>00274 <span class="comment"></span>
<a name="l00275"></a>00275 <span class="comment">        //! get a list of value names that can be retrieved</span>
<a name="l00276"></a><a class="code" href="class_name_value_pairs.html#a0db4ff40763578fb2013b18590f44037">00276</a> <span class="comment"></span>        CRYPTOPP_DLL std::string GetValueNames()<span class="keyword"> const</span>
<a name="l00277"></a>00277 <span class="keyword">                </span>{std::string result; GetValue(<span class="stringliteral">&quot;ValueNames&quot;</span>, result); <span class="keywordflow">return</span> result;}
<a name="l00278"></a>00278 <span class="comment"></span>
<a name="l00279"></a>00279 <span class="comment">        //! get a named value with type int</span>
<a name="l00280"></a>00280 <span class="comment"></span><span class="comment">        /*! used to ensure we don&apos;t accidentally try to get an unsigned int</span>
<a name="l00281"></a>00281 <span class="comment">                or some other type when we mean int (which is the most common case) */</span>
<a name="l00282"></a><a class="code" href="class_name_value_pairs.html#a39b6daefcabcdd07f5ae482a075e1728">00282</a>         CRYPTOPP_DLL <span class="keywordtype">bool</span> GetIntValue(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keywordtype">int</span> &amp;value)<span class="keyword"> const</span>
<a name="l00283"></a>00283 <span class="keyword">                </span>{<span class="keywordflow">return</span> GetValue(name, value);}
<a name="l00284"></a>00284 <span class="comment"></span>
<a name="l00285"></a>00285 <span class="comment">        //! get a named value with type int, with default</span>
<a name="l00286"></a><a class="code" href="class_name_value_pairs.html#ac269314685b737912d3499f4a9399618">00286</a> <span class="comment"></span>        CRYPTOPP_DLL <span class="keywordtype">int</span> GetIntValueWithDefault(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keywordtype">int</span> defaultValue)<span class="keyword"> const</span>
<a name="l00287"></a>00287 <span class="keyword">                </span>{<span class="keywordflow">return</span> GetValueWithDefault(name, defaultValue);}
<a name="l00288"></a>00288 <span class="comment"></span>
<a name="l00289"></a>00289 <span class="comment">        //! used by derived classes to check for type mismatch</span>
<a name="l00290"></a><a class="code" href="class_name_value_pairs.html#aa50a73b1705adb00ace9463b59696fb7">00290</a> <span class="comment"></span>        CRYPTOPP_DLL <span class="keyword">static</span> <span class="keywordtype">void</span> CRYPTOPP_API ThrowIfTypeMismatch(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> std::type_info &amp;stored, <span class="keyword">const</span> std::type_info &amp;retrieving)
<a name="l00291"></a>00291                 {<span class="keywordflow">if</span> (stored != retrieving) <span class="keywordflow">throw</span> <a class="code" href="class_name_value_pairs_1_1_value_type_mismatch.html" title="exception thrown when trying to retrieve a value using a different type than expected...">ValueTypeMismatch</a>(name, stored, retrieving);}
<a name="l00292"></a>00292 
<a name="l00293"></a>00293         <span class="keyword">template</span> &lt;<span class="keyword">class</span> T&gt;
<a name="l00294"></a>00294         <span class="keywordtype">void</span> GetRequiredParameter(<span class="keyword">const</span> <span class="keywordtype">char</span> *className, <span class="keyword">const</span> <span class="keywordtype">char</span> *name, T &amp;value)<span class="keyword"> const</span>
<a name="l00295"></a>00295 <span class="keyword">        </span>{
<a name="l00296"></a>00296                 <span class="keywordflow">if</span> (!GetValue(name, value))
<a name="l00297"></a>00297                         <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a>(std::string(className) + <span class="stringliteral">&quot;: missing required parameter &apos;&quot;</span> + name + <span class="stringliteral">&quot;&apos;&quot;</span>);
<a name="l00298"></a>00298         }
<a name="l00299"></a>00299 
<a name="l00300"></a>00300         CRYPTOPP_DLL <span class="keywordtype">void</span> GetRequiredIntParameter(<span class="keyword">const</span> <span class="keywordtype">char</span> *className, <span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keywordtype">int</span> &amp;value)<span class="keyword"> const</span>
<a name="l00301"></a>00301 <span class="keyword">        </span>{
<a name="l00302"></a>00302                 <span class="keywordflow">if</span> (!GetIntValue(name, value))
<a name="l00303"></a>00303                         <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a>(std::string(className) + <span class="stringliteral">&quot;: missing required parameter &apos;&quot;</span> + name + <span class="stringliteral">&quot;&apos;&quot;</span>);
<a name="l00304"></a>00304         }
<a name="l00305"></a>00305 <span class="comment"></span>
<a name="l00306"></a>00306 <span class="comment">        //! to be implemented by derived classes, users should use one of the above functions instead</span>
<a name="l00307"></a>00307 <span class="comment"></span>        CRYPTOPP_DLL <span class="keyword">virtual</span> <span class="keywordtype">bool</span> GetVoidValue(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> std::type_info &amp;valueType, <span class="keywordtype">void</span> *pValue) <span class="keyword">const</span> =0;
<a name="l00308"></a>00308 };
<a name="l00309"></a>00309 <span class="comment"></span>
<a name="l00310"></a>00310 <span class="comment">//! namespace containing value name definitions</span>
<a name="l00311"></a>00311 <span class="comment"></span><span class="comment">/*!     value names, types and semantics:</span>
<a name="l00312"></a>00312 <span class="comment"></span>
<a name="l00313"></a>00313 <span class="comment">        ThisObject:ClassName (ClassName, copy of this object or a subobject)</span>
<a name="l00314"></a>00314 <span class="comment">        ThisPointer:ClassName (const ClassName *, pointer to this object or a subobject)</span>
<a name="l00315"></a>00315 <span class="comment">*/</span>
<a name="l00316"></a><a class="code" href="namespace_name.html">00316</a> DOCUMENTED_NAMESPACE_BEGIN(Name)
<a name="l00317"></a>00317 <span class="comment">// more names defined in argnames.h</span>
<a name="l00318"></a>00318 DOCUMENTED_NAMESPACE_END
<a name="l00319"></a>00319 <span class="comment"></span>
<a name="l00320"></a>00320 <span class="comment">//! empty set of name-value pairs</span>
<a name="l00321"></a><a class="code" href="class_null_name_value_pairs.html">00321</a> <span class="comment"></span>class CRYPTOPP_DLL <a class="code" href="class_null_name_value_pairs.html" title="empty set of name-value pairs">NullNameValuePairs</a> : public <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a>
<a name="l00322"></a>00322 {
<a name="l00323"></a>00323 <span class="keyword">public</span>:
<a name="l00324"></a><a class="code" href="class_null_name_value_pairs.html#acf9413816ce2ada3ec085c2e30dfac2d">00324</a>         <span class="keywordtype">bool</span> <a class="code" href="class_null_name_value_pairs.html#acf9413816ce2ada3ec085c2e30dfac2d" title="to be implemented by derived classes, users should use one of the above functions...">GetVoidValue</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *name, <span class="keyword">const</span> std::type_info &amp;valueType, <span class="keywordtype">void</span> *pValue)<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">false</span>;}
<a name="l00325"></a>00325 };
<a name="l00326"></a>00326 <span class="comment"></span>
<a name="l00327"></a>00327 <span class="comment">//! _</span>
<a name="l00328"></a>00328 <span class="comment"></span><span class="keyword">extern</span> CRYPTOPP_DLL <span class="keyword">const</span> <a class="code" href="class_null_name_value_pairs.html" title="empty set of name-value pairs">NullNameValuePairs</a> g_nullNameValuePairs;
<a name="l00329"></a>00329 
<a name="l00330"></a>00330 <span class="comment">// ********************************************************</span>
<a name="l00331"></a>00331 <span class="comment"></span>
<a name="l00332"></a>00332 <span class="comment">//! interface for cloning objects, this is not implemented by most classes yet</span>
<a name="l00333"></a><a class="code" href="class_clonable.html">00333</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_clonable.html" title="interface for cloning objects, this is not implemented by most classes yet">Clonable</a>
<a name="l00334"></a>00334 {
<a name="l00335"></a>00335 <span class="keyword">public</span>:
<a name="l00336"></a>00336         <span class="keyword">virtual</span> ~<a class="code" href="class_clonable.html" title="interface for cloning objects, this is not implemented by most classes yet">Clonable</a>() {}<span class="comment"></span>
<a name="l00337"></a>00337 <span class="comment">        //! this is not implemented by most classes yet</span>
<a name="l00338"></a><a class="code" href="class_clonable.html#a24b43349a71e1f98508eeb10b31a0a62">00338</a> <span class="comment"></span>        <span class="keyword">virtual</span> <a class="code" href="class_clonable.html" title="interface for cloning objects, this is not implemented by most classes yet">Clonable</a>* <a class="code" href="class_clonable.html#a24b43349a71e1f98508eeb10b31a0a62" title="this is not implemented by most classes yet">Clone</a>()<span class="keyword"> const </span>{<span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">&quot;Clone() is not implemented yet.&quot;</span>);}      <span class="comment">// TODO: make this =0</span>
<a name="l00339"></a>00339 };
<a name="l00340"></a>00340 <span class="comment"></span>
<a name="l00341"></a>00341 <span class="comment">//! interface for all crypto algorithms</span>
<a name="l00342"></a>00342 <span class="comment"></span>
<a name="l00343"></a><a class="code" href="class_algorithm.html">00343</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_algorithm.html" title="interface for all crypto algorithms">Algorithm</a> : <span class="keyword">public</span> <a class="code" href="class_clonable.html" title="interface for cloning objects, this is not implemented by most classes yet">Clonable</a>
<a name="l00344"></a>00344 {
<a name="l00345"></a>00345 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00346"></a>00346 <span class="comment">        /*! When FIPS 140-2 compliance is enabled and checkSelfTestStatus == true,</span>
<a name="l00347"></a>00347 <span class="comment">                this constructor throws SelfTestFailure if the self test hasn&apos;t been run or fails. */</span>
<a name="l00348"></a>00348         <a class="code" href="class_algorithm.html" title="interface for all crypto algorithms">Algorithm</a>(<span class="keywordtype">bool</span> checkSelfTestStatus = <span class="keyword">true</span>);<span class="comment"></span>
<a name="l00349"></a>00349 <span class="comment">        //! returns name of this algorithm, not universally implemented yet</span>
<a name="l00350"></a><a class="code" href="class_algorithm.html#acd21c6715add4884fa043eaf51655039">00350</a> <span class="comment"></span>        <span class="keyword">virtual</span> std::string <a class="code" href="class_algorithm.html#acd21c6715add4884fa043eaf51655039" title="returns name of this algorithm, not universally implemented yet">AlgorithmName</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="stringliteral">&quot;unknown&quot;</span>;}
<a name="l00351"></a>00351 };
<a name="l00352"></a>00352 <span class="comment"></span>
<a name="l00353"></a>00353 <span class="comment">//! keying interface for crypto algorithms that take byte strings as keys</span>
<a name="l00354"></a><a class="code" href="class_simple_keying_interface.html">00354</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_simple_keying_interface.html" title="keying interface for crypto algorithms that take byte strings as keys">SimpleKeyingInterface</a>
<a name="l00355"></a>00355 {
<a name="l00356"></a>00356 <span class="keyword">public</span>:
<a name="l00357"></a>00357         <span class="keyword">virtual</span> ~<a class="code" href="class_simple_keying_interface.html" title="keying interface for crypto algorithms that take byte strings as keys">SimpleKeyingInterface</a>() {}
<a name="l00358"></a>00358 <span class="comment"></span>
<a name="l00359"></a>00359 <span class="comment">        //! returns smallest valid key length in bytes */</span>
<a name="l00360"></a>00360 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> MinKeyLength() <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l00361"></a>00361 <span class="comment">        //! returns largest valid key length in bytes */</span>
<a name="l00362"></a>00362 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> MaxKeyLength() <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l00363"></a>00363 <span class="comment">        //! returns default (recommended) key length in bytes */</span>
<a name="l00364"></a>00364 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> DefaultKeyLength() <span class="keyword">const</span> =0;
<a name="l00365"></a>00365 <span class="comment"></span>
<a name="l00366"></a>00366 <span class="comment">        //! returns the smallest valid key length in bytes that is &gt;= min(n, GetMaxKeyLength())</span>
<a name="l00367"></a>00367 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> GetValidKeyLength(<span class="keywordtype">size_t</span> n) <span class="keyword">const</span> =0;
<a name="l00368"></a>00368 <span class="comment"></span>
<a name="l00369"></a>00369 <span class="comment">        //! returns whether n is a valid key length</span>
<a name="l00370"></a><a class="code" href="class_simple_keying_interface.html#a024f23c0a094ee46094f69ffefb91d17">00370</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsValidKeyLength(<span class="keywordtype">size_t</span> n)<span class="keyword"> const</span>
<a name="l00371"></a>00371 <span class="keyword">                </span>{<span class="keywordflow">return</span> n == GetValidKeyLength(n);}
<a name="l00372"></a>00372 <span class="comment"></span>
<a name="l00373"></a>00373 <span class="comment">        //! set or reset the key of this object</span>
<a name="l00374"></a>00374 <span class="comment"></span><span class="comment">        /*! \param params is used to specify Rounds, BlockSize, etc. */</span>
<a name="l00375"></a>00375         <span class="keyword">virtual</span> <span class="keywordtype">void</span> SetKey(<span class="keyword">const</span> byte *key, <span class="keywordtype">size_t</span> length, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;params = g_nullNameValuePairs);
<a name="l00376"></a>00376 <span class="comment"></span>
<a name="l00377"></a>00377 <span class="comment">        //! calls SetKey() with an NameValuePairs object that just specifies &quot;Rounds&quot;</span>
<a name="l00378"></a>00378 <span class="comment"></span>        <span class="keywordtype">void</span> SetKeyWithRounds(<span class="keyword">const</span> byte *key, <span class="keywordtype">size_t</span> length, <span class="keywordtype">int</span> rounds);
<a name="l00379"></a>00379 <span class="comment"></span>
<a name="l00380"></a>00380 <span class="comment">        //! calls SetKey() with an NameValuePairs object that just specifies &quot;IV&quot;</span>
<a name="l00381"></a>00381 <span class="comment"></span>        <span class="keywordtype">void</span> SetKeyWithIV(<span class="keyword">const</span> byte *key, <span class="keywordtype">size_t</span> length, <span class="keyword">const</span> byte *iv, <span class="keywordtype">size_t</span> ivLength);
<a name="l00382"></a>00382 <span class="comment"></span>
<a name="l00383"></a>00383 <span class="comment">        //! calls SetKey() with an NameValuePairs object that just specifies &quot;IV&quot;</span>
<a name="l00384"></a><a class="code" href="class_simple_keying_interface.html#ac25e27eaeae2e909741c07de93caef49">00384</a> <span class="comment"></span>        <span class="keywordtype">void</span> SetKeyWithIV(<span class="keyword">const</span> byte *key, <span class="keywordtype">size_t</span> length, <span class="keyword">const</span> byte *iv)
<a name="l00385"></a>00385                 {<a class="code" href="class_simple_keying_interface.html#ac25e27eaeae2e909741c07de93caef49" title="calls SetKey() with an NameValuePairs object that just specifies &amp;quot;IV&amp;quot;">SetKeyWithIV</a>(key, length, iv, IVSize());}
<a name="l00386"></a>00386 
<a name="l00387"></a>00387         <span class="keyword">enum</span> IV_Requirement {UNIQUE_IV = 0, RANDOM_IV, UNPREDICTABLE_RANDOM_IV, INTERNALLY_GENERATED_IV, NOT_RESYNCHRONIZABLE};<span class="comment"></span>
<a name="l00388"></a>00388 <span class="comment">        //! returns the minimal requirement for secure IVs</span>
<a name="l00389"></a>00389 <span class="comment"></span>        <span class="keyword">virtual</span> IV_Requirement IVRequirement() <span class="keyword">const</span> =0;
<a name="l00390"></a>00390 <span class="comment"></span>
<a name="l00391"></a>00391 <span class="comment">        //! returns whether this object can be resynchronized (i.e. supports initialization vectors)</span>
<a name="l00392"></a>00392 <span class="comment"></span><span class="comment">        /*! If this function returns true, and no IV is passed to SetKey() and CanUseStructuredIVs()==true, an IV of all 0&apos;s will be assumed. */</span>
<a name="l00393"></a><a class="code" href="class_simple_keying_interface.html#ad263f4a96fa8b4e7d01fea8ccaae9d3b">00393</a>         <span class="keywordtype">bool</span> <a class="code" href="class_simple_keying_interface.html#ad263f4a96fa8b4e7d01fea8ccaae9d3b" title="returns whether this object can be resynchronized (i.e. supports initialization vectors)...">IsResynchronizable</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> IVRequirement() &lt; NOT_RESYNCHRONIZABLE;}<span class="comment"></span>
<a name="l00394"></a>00394 <span class="comment">        //! returns whether this object can use random IVs (in addition to ones returned by GetNextIV)</span>
<a name="l00395"></a><a class="code" href="class_simple_keying_interface.html#a26680fc02b91534a522b5754cdcdcb46">00395</a> <span class="comment"></span>        <span class="keywordtype">bool</span> <a class="code" href="class_simple_keying_interface.html#a26680fc02b91534a522b5754cdcdcb46" title="returns whether this object can use random IVs (in addition to ones returned by GetNextIV)...">CanUseRandomIVs</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> IVRequirement() &lt;= UNPREDICTABLE_RANDOM_IV;}<span class="comment"></span>
<a name="l00396"></a>00396 <span class="comment">        //! returns whether this object can use random but possibly predictable IVs (in addition to ones returned by GetNextIV)</span>
<a name="l00397"></a><a class="code" href="class_simple_keying_interface.html#a307463503d7a4400ffafe03a683e1dbb">00397</a> <span class="comment"></span>        <span class="keywordtype">bool</span> <a class="code" href="class_simple_keying_interface.html#a307463503d7a4400ffafe03a683e1dbb" title="returns whether this object can use random but possibly predictable IVs (in addition...">CanUsePredictableIVs</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> IVRequirement() &lt;= RANDOM_IV;}<span class="comment"></span>
<a name="l00398"></a>00398 <span class="comment">        //! returns whether this object can use structured IVs, for example a counter (in addition to ones returned by GetNextIV)</span>
<a name="l00399"></a><a class="code" href="class_simple_keying_interface.html#a9c47590ef06335b34bdaf272fd37ef4d">00399</a> <span class="comment"></span>        <span class="keywordtype">bool</span> <a class="code" href="class_simple_keying_interface.html#a9c47590ef06335b34bdaf272fd37ef4d" title="returns whether this object can use structured IVs, for example a counter (in addition...">CanUseStructuredIVs</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> IVRequirement() &lt;= UNIQUE_IV;}
<a name="l00400"></a>00400 
<a name="l00401"></a>00401         <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> IVSize()<span class="keyword"> const </span>{<span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(GetAlgorithm().AlgorithmName() + <span class="stringliteral">&quot;: this object doesn&apos;t support resynchronization&quot;</span>);}<span class="comment"></span>
<a name="l00402"></a>00402 <span class="comment">        //! returns default length of IVs accepted by this object</span>
<a name="l00403"></a><a class="code" href="class_simple_keying_interface.html#a5b2090b3c27540aa3db0281406fedb38">00403</a> <span class="comment"></span>        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_simple_keying_interface.html#a5b2090b3c27540aa3db0281406fedb38" title="returns default length of IVs accepted by this object">DefaultIVLength</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> IVSize();}<span class="comment"></span>
<a name="l00404"></a>00404 <span class="comment">        //! returns minimal length of IVs accepted by this object</span>
<a name="l00405"></a><a class="code" href="class_simple_keying_interface.html#a4450efa449a2e04a31b6371821e650f9">00405</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_simple_keying_interface.html#a4450efa449a2e04a31b6371821e650f9" title="returns minimal length of IVs accepted by this object">MinIVLength</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> IVSize();}<span class="comment"></span>
<a name="l00406"></a>00406 <span class="comment">        //! returns maximal length of IVs accepted by this object</span>
<a name="l00407"></a><a class="code" href="class_simple_keying_interface.html#a308799c135440e57a583defe3860f02e">00407</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_simple_keying_interface.html#a308799c135440e57a583defe3860f02e" title="returns maximal length of IVs accepted by this object">MaxIVLength</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> IVSize();}<span class="comment"></span>
<a name="l00408"></a>00408 <span class="comment">        //! resynchronize with an IV. ivLength=-1 means use IVSize()</span>
<a name="l00409"></a><a class="code" href="class_simple_keying_interface.html#ae576137a46ca56005e82f1505cf3cccc">00409</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="class_simple_keying_interface.html#ae576137a46ca56005e82f1505cf3cccc" title="resynchronize with an IV. ivLength=-1 means use IVSize()">Resynchronize</a>(<span class="keyword">const</span> byte *iv, <span class="keywordtype">int</span> ivLength=-1) {<span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(GetAlgorithm().AlgorithmName() + <span class="stringliteral">&quot;: this object doesn&apos;t support resynchronization&quot;</span>);}<span class="comment"></span>
<a name="l00410"></a>00410 <span class="comment">        //! get a secure IV for the next message</span>
<a name="l00411"></a>00411 <span class="comment"></span><span class="comment">        /*! This method should be called after you finish encrypting one message and are ready to start the next one.</span>
<a name="l00412"></a>00412 <span class="comment">                After calling it, you must call SetKey() or Resynchronize() before using this object again. </span>
<a name="l00413"></a>00413 <span class="comment">                This method is not implemented on decryption objects. */</span>
<a name="l00414"></a>00414         <span class="keyword">virtual</span> <span class="keywordtype">void</span> GetNextIV(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, byte *IV);
<a name="l00415"></a>00415 
<a name="l00416"></a>00416 <span class="keyword">protected</span>:
<a name="l00417"></a>00417         <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="class_algorithm.html" title="interface for all crypto algorithms">Algorithm</a> &amp; GetAlgorithm() <span class="keyword">const</span> =0;
<a name="l00418"></a>00418         <span class="keyword">virtual</span> <span class="keywordtype">void</span> UncheckedSetKey(<span class="keyword">const</span> byte *key, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;params) =0;
<a name="l00419"></a>00419 
<a name="l00420"></a>00420         <span class="keywordtype">void</span> ThrowIfInvalidKeyLength(<span class="keywordtype">size_t</span> length);
<a name="l00421"></a>00421         <span class="keywordtype">void</span> ThrowIfResynchronizable();                 <span class="comment">// to be called when no IV is passed</span>
<a name="l00422"></a>00422         <span class="keywordtype">void</span> ThrowIfInvalidIV(<span class="keyword">const</span> byte *iv);  <span class="comment">// check for NULL IV if it can&apos;t be used</span>
<a name="l00423"></a>00423         <span class="keywordtype">size_t</span> ThrowIfInvalidIVLength(<span class="keywordtype">int</span> size);
<a name="l00424"></a>00424         <span class="keyword">const</span> byte * GetIVAndThrowIfInvalid(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;params, <span class="keywordtype">size_t</span> &amp;size);
<a name="l00425"></a>00425         <span class="keyword">inline</span> <span class="keywordtype">void</span> AssertValidKeyLength(<span class="keywordtype">size_t</span> length)<span class="keyword"> const</span>
<a name="l00426"></a>00426 <span class="keyword">                </span>{assert(IsValidKeyLength(length));}
<a name="l00427"></a>00427 };
<a name="l00428"></a>00428 <span class="comment"></span>
<a name="l00429"></a>00429 <span class="comment">//! interface for the data processing part of block ciphers</span>
<a name="l00430"></a>00430 <span class="comment"></span><span class="comment"></span>
<a name="l00431"></a>00431 <span class="comment">/*! Classes derived from BlockTransformation are block ciphers</span>
<a name="l00432"></a>00432 <span class="comment">        in ECB mode (for example the DES::Encryption class), which are stateless.</span>
<a name="l00433"></a>00433 <span class="comment">        These classes should not be used directly, but only in combination with</span>
<a name="l00434"></a>00434 <span class="comment">        a mode class (see CipherModeDocumentation in modes.h).</span>
<a name="l00435"></a>00435 <span class="comment">*/</span>
<a name="l00436"></a><a class="code" href="class_block_transformation.html">00436</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_block_transformation.html" title="interface for the data processing part of block ciphers">BlockTransformation</a> : <span class="keyword">public</span> <a class="code" href="class_algorithm.html" title="interface for all crypto algorithms">Algorithm</a>
<a name="l00437"></a>00437 {
<a name="l00438"></a>00438 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00439"></a>00439 <span class="comment">        //! encrypt or decrypt inBlock, xor with xorBlock, and write to outBlock</span>
<a name="l00440"></a>00440 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> ProcessAndXorBlock(<span class="keyword">const</span> byte *inBlock, <span class="keyword">const</span> byte *xorBlock, byte *outBlock) <span class="keyword">const</span> =0;
<a name="l00441"></a>00441 <span class="comment"></span>
<a name="l00442"></a>00442 <span class="comment">        //! encrypt or decrypt one block</span>
<a name="l00443"></a>00443 <span class="comment"></span><span class="comment">        /*! \pre size of inBlock and outBlock == BlockSize() */</span>
<a name="l00444"></a><a class="code" href="class_block_transformation.html#a2fefb3f4c6c6297c0c91fcbba9e4f4f3">00444</a>         <span class="keywordtype">void</span> ProcessBlock(<span class="keyword">const</span> byte *inBlock, byte *outBlock)<span class="keyword"> const</span>
<a name="l00445"></a>00445 <span class="keyword">                </span>{ProcessAndXorBlock(inBlock, NULL, outBlock);}
<a name="l00446"></a>00446 <span class="comment"></span>
<a name="l00447"></a>00447 <span class="comment">        //! encrypt or decrypt one block in place</span>
<a name="l00448"></a><a class="code" href="class_block_transformation.html#a12cc1846de571557be0f82471e8904bf">00448</a> <span class="comment"></span>        <span class="keywordtype">void</span> ProcessBlock(byte *inoutBlock)<span class="keyword"> const</span>
<a name="l00449"></a>00449 <span class="keyword">                </span>{ProcessAndXorBlock(inoutBlock, NULL, inoutBlock);}
<a name="l00450"></a>00450 <span class="comment"></span>
<a name="l00451"></a>00451 <span class="comment">        //! block size of the cipher in bytes</span>
<a name="l00452"></a>00452 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BlockSize() <span class="keyword">const</span> =0;
<a name="l00453"></a>00453 <span class="comment"></span>
<a name="l00454"></a>00454 <span class="comment">        //! returns how inputs and outputs should be aligned for optimal performance</span>
<a name="l00455"></a>00455 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> OptimalDataAlignment() <span class="keyword">const</span>;
<a name="l00456"></a>00456 <span class="comment"></span>
<a name="l00457"></a>00457 <span class="comment">        //! returns true if this is a permutation (i.e. there is an inverse transformation)</span>
<a name="l00458"></a><a class="code" href="class_block_transformation.html#a8d154fdac89307d9edbd2a5ab97fa080">00458</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_block_transformation.html#a8d154fdac89307d9edbd2a5ab97fa080" title="returns true if this is a permutation (i.e. there is an inverse transformation)">IsPermutation</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">true</span>;}
<a name="l00459"></a>00459 <span class="comment"></span>
<a name="l00460"></a>00460 <span class="comment">        //! returns true if this is an encryption object</span>
<a name="l00461"></a>00461 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsForwardTransformation() <span class="keyword">const</span> =0;
<a name="l00462"></a>00462 <span class="comment"></span>
<a name="l00463"></a>00463 <span class="comment">        //! return number of blocks that can be processed in parallel, for bit-slicing implementations</span>
<a name="l00464"></a><a class="code" href="class_block_transformation.html#a7aceb4c214d901e9cc416b05d40eb282">00464</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_block_transformation.html#a7aceb4c214d901e9cc416b05d40eb282" title="return number of blocks that can be processed in parallel, for bit-slicing implementations...">OptimalNumberOfParallelBlocks</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 1;}
<a name="l00465"></a>00465 
<a name="l00466"></a>00466         <span class="keyword">enum</span> {BT_InBlockIsCounter=1, BT_DontIncrementInOutPointers=2, BT_XorInput=4, BT_ReverseDirection=8} FlagsForAdvancedProcessBlocks;
<a name="l00467"></a>00467 <span class="comment"></span>
<a name="l00468"></a>00468 <span class="comment">        //! encrypt and xor blocks according to flags (see FlagsForAdvancedProcessBlocks)</span>
<a name="l00469"></a>00469 <span class="comment"></span><span class="comment">        /*! /note If BT_InBlockIsCounter is set, last byte of inBlocks may be modified. */</span>
<a name="l00470"></a>00470         <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> AdvancedProcessBlocks(<span class="keyword">const</span> byte *inBlocks, <span class="keyword">const</span> byte *xorBlocks, byte *outBlocks, <span class="keywordtype">size_t</span> length, word32 flags) <span class="keyword">const</span>;
<a name="l00471"></a>00471 
<a name="l00472"></a>00472         <span class="keyword">inline</span> <a class="code" href="cryptlib_8h.html#a353ccabf5ddc119a6a33e92f7b9961c7" title="used to specify a direction for a cipher to operate in (encrypt or decrypt)">CipherDir</a> GetCipherDirection()<span class="keyword"> const </span>{<span class="keywordflow">return</span> IsForwardTransformation() ? ENCRYPTION : DECRYPTION;}
<a name="l00473"></a>00473 };
<a name="l00474"></a>00474 <span class="comment"></span>
<a name="l00475"></a>00475 <span class="comment">//! interface for the data processing part of stream ciphers</span>
<a name="l00476"></a>00476 <span class="comment"></span>
<a name="l00477"></a><a class="code" href="class_stream_transformation.html">00477</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_stream_transformation.html" title="interface for the data processing part of stream ciphers">StreamTransformation</a> : <span class="keyword">public</span> <a class="code" href="class_algorithm.html" title="interface for all crypto algorithms">Algorithm</a>
<a name="l00478"></a>00478 {
<a name="l00479"></a>00479 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00480"></a>00480 <span class="comment">        //! return a reference to this object, </span>
<a name="l00481"></a>00481 <span class="comment"></span><span class="comment">        /*! This function is useful for passing a temporary StreamTransformation object to a </span>
<a name="l00482"></a>00482 <span class="comment">                function that takes a non-const reference. */</span>
<a name="l00483"></a><a class="code" href="class_stream_transformation.html#a8c9304fff5af593ee68d3cf0d33c06e9">00483</a>         <a class="code" href="class_stream_transformation.html" title="interface for the data processing part of stream ciphers">StreamTransformation</a>&amp; <a class="code" href="class_stream_transformation.html#a8c9304fff5af593ee68d3cf0d33c06e9" title="return a reference to this object,">Ref</a>() {<span class="keywordflow">return</span> *<span class="keyword">this</span>;}
<a name="l00484"></a>00484 <span class="comment"></span>
<a name="l00485"></a>00485 <span class="comment">        //! returns block size, if input must be processed in blocks, otherwise 1</span>
<a name="l00486"></a><a class="code" href="class_stream_transformation.html#a3638ff7580edb42a5b1c367e53a7436f">00486</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_stream_transformation.html#a3638ff7580edb42a5b1c367e53a7436f" title="returns block size, if input must be processed in blocks, otherwise 1">MandatoryBlockSize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 1;}
<a name="l00487"></a>00487 <span class="comment"></span>
<a name="l00488"></a>00488 <span class="comment">        //! returns the input block size that is most efficient for this cipher</span>
<a name="l00489"></a>00489 <span class="comment"></span><span class="comment">        /*! \note optimal input length is n * OptimalBlockSize() - GetOptimalBlockSizeUsed() for any n &gt; 0 */</span>
<a name="l00490"></a><a class="code" href="class_stream_transformation.html#ae79457bcbafc980672d88ee54ed4ac66">00490</a>         <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_stream_transformation.html#ae79457bcbafc980672d88ee54ed4ac66" title="returns the input block size that is most efficient for this cipher">OptimalBlockSize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> MandatoryBlockSize();}<span class="comment"></span>
<a name="l00491"></a>00491 <span class="comment">        //! returns how much of the current block is used up</span>
<a name="l00492"></a><a class="code" href="class_stream_transformation.html#a94b4e1d14edde1fdde38361bce9ca4c6">00492</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_stream_transformation.html#a94b4e1d14edde1fdde38361bce9ca4c6" title="returns how much of the current block is used up">GetOptimalBlockSizeUsed</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}
<a name="l00493"></a>00493 <span class="comment"></span>
<a name="l00494"></a>00494 <span class="comment">        //! returns how input should be aligned for optimal performance</span>
<a name="l00495"></a>00495 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> OptimalDataAlignment() <span class="keyword">const</span>;
<a name="l00496"></a>00496 <span class="comment"></span>
<a name="l00497"></a>00497 <span class="comment">        //! encrypt or decrypt an array of bytes of specified length</span>
<a name="l00498"></a>00498 <span class="comment"></span><span class="comment">        /*! \note either inString == outString, or they don&apos;t overlap */</span>
<a name="l00499"></a>00499         <span class="keyword">virtual</span> <span class="keywordtype">void</span> ProcessData(byte *outString, <span class="keyword">const</span> byte *inString, <span class="keywordtype">size_t</span> length) =0;
<a name="l00500"></a>00500 <span class="comment"></span>
<a name="l00501"></a>00501 <span class="comment">        //! for ciphers where the last block of data is special, encrypt or decrypt the last block of data</span>
<a name="l00502"></a>00502 <span class="comment"></span><span class="comment">        /*! For now the only use of this function is for CBC-CTS mode. */</span>
<a name="l00503"></a>00503         <span class="keyword">virtual</span> <span class="keywordtype">void</span> ProcessLastBlock(byte *outString, <span class="keyword">const</span> byte *inString, <span class="keywordtype">size_t</span> length);<span class="comment"></span>
<a name="l00504"></a>00504 <span class="comment">        //! returns the minimum size of the last block, 0 indicating the last block is not special</span>
<a name="l00505"></a><a class="code" href="class_stream_transformation.html#a2eb96f3a8fae23cb9f85acb288e3bcbe">00505</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_stream_transformation.html#a2eb96f3a8fae23cb9f85acb288e3bcbe" title="returns the minimum size of the last block, 0 indicating the last block is not special...">MinLastBlockSize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}
<a name="l00506"></a>00506 <span class="comment"></span>
<a name="l00507"></a>00507 <span class="comment">        //! same as ProcessData(inoutString, inoutString, length)</span>
<a name="l00508"></a><a class="code" href="class_stream_transformation.html#ac00f3fcc21f33f11c8efa4de67ff7774">00508</a> <span class="comment"></span>        <span class="keyword">inline</span> <span class="keywordtype">void</span> ProcessString(byte *inoutString, <span class="keywordtype">size_t</span> length)
<a name="l00509"></a>00509                 {ProcessData(inoutString, inoutString, length);}<span class="comment"></span>
<a name="l00510"></a>00510 <span class="comment">        //! same as ProcessData(outString, inString, length)</span>
<a name="l00511"></a><a class="code" href="class_stream_transformation.html#a17951cb36412763e0d6bd9696177175d">00511</a> <span class="comment"></span>        <span class="keyword">inline</span> <span class="keywordtype">void</span> ProcessString(byte *outString, <span class="keyword">const</span> byte *inString, <span class="keywordtype">size_t</span> length)
<a name="l00512"></a>00512                 {ProcessData(outString, inString, length);}<span class="comment"></span>
<a name="l00513"></a>00513 <span class="comment">        //! implemented as {ProcessData(&amp;input, &amp;input, 1); return input;}</span>
<a name="l00514"></a><a class="code" href="class_stream_transformation.html#a71a9bd33526fc7f227050075e7a78106">00514</a> <span class="comment"></span>        <span class="keyword">inline</span> byte ProcessByte(byte input)
<a name="l00515"></a>00515                 {ProcessData(&amp;input, &amp;input, 1); <span class="keywordflow">return</span> input;}
<a name="l00516"></a>00516 <span class="comment"></span>
<a name="l00517"></a>00517 <span class="comment">        //! returns whether this cipher supports random access</span>
<a name="l00518"></a>00518 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsRandomAccess() <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l00519"></a>00519 <span class="comment">        //! for random access ciphers, seek to an absolute position</span>
<a name="l00520"></a><a class="code" href="class_stream_transformation.html#a7bfbac3f2e43b50d1e16e6b4b2d2e48a">00520</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> Seek(lword n)
<a name="l00521"></a>00521         {
<a name="l00522"></a>00522                 assert(!IsRandomAccess());
<a name="l00523"></a>00523                 <span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">&quot;StreamTransformation: this object doesn&apos;t support random access&quot;</span>);
<a name="l00524"></a>00524         }
<a name="l00525"></a>00525 <span class="comment"></span>
<a name="l00526"></a>00526 <span class="comment">        //! returns whether this transformation is self-inverting (e.g. xor with a keystream)</span>
<a name="l00527"></a>00527 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsSelfInverting() <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l00528"></a>00528 <span class="comment">        //! returns whether this is an encryption object</span>
<a name="l00529"></a>00529 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsForwardTransformation() <span class="keyword">const</span> =0;
<a name="l00530"></a>00530 };
<a name="l00531"></a>00531 <span class="comment"></span>
<a name="l00532"></a>00532 <span class="comment">//! interface for hash functions and data processing part of MACs</span>
<a name="l00533"></a>00533 <span class="comment"></span><span class="comment"></span>
<a name="l00534"></a>00534 <span class="comment">/*! HashTransformation objects are stateful.  They are created in an initial state,</span>
<a name="l00535"></a>00535 <span class="comment">        change state as Update() is called, and return to the initial</span>
<a name="l00536"></a>00536 <span class="comment">        state when Final() is called.  This interface allows a large message to</span>
<a name="l00537"></a>00537 <span class="comment">        be hashed in pieces by calling Update() on each piece followed by</span>
<a name="l00538"></a>00538 <span class="comment">        calling Final().</span>
<a name="l00539"></a>00539 <span class="comment">*/</span>
<a name="l00540"></a><a class="code" href="class_hash_transformation.html">00540</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_hash_transformation.html" title="interface for hash functions and data processing part of MACs">HashTransformation</a> : <span class="keyword">public</span> <a class="code" href="class_algorithm.html" title="interface for all crypto algorithms">Algorithm</a>
<a name="l00541"></a>00541 {
<a name="l00542"></a>00542 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00543"></a>00543 <span class="comment">        //! return a reference to this object, </span>
<a name="l00544"></a>00544 <span class="comment"></span><span class="comment">        /*! This function is useful for passing a temporary HashTransformation object to a </span>
<a name="l00545"></a>00545 <span class="comment">                function that takes a non-const reference. */</span>
<a name="l00546"></a><a class="code" href="class_hash_transformation.html#a39b0a4c4cdc11fda358f9975b5e4137e">00546</a>         <a class="code" href="class_hash_transformation.html" title="interface for hash functions and data processing part of MACs">HashTransformation</a>&amp; <a class="code" href="class_hash_transformation.html#a39b0a4c4cdc11fda358f9975b5e4137e" title="return a reference to this object,">Ref</a>() {<span class="keywordflow">return</span> *<span class="keyword">this</span>;}
<a name="l00547"></a>00547 <span class="comment"></span>
<a name="l00548"></a>00548 <span class="comment">        //! process more input</span>
<a name="l00549"></a>00549 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> Update(<span class="keyword">const</span> byte *input, <span class="keywordtype">size_t</span> length) =0;
<a name="l00550"></a>00550 <span class="comment"></span>
<a name="l00551"></a>00551 <span class="comment">        //! request space to write input into</span>
<a name="l00552"></a><a class="code" href="class_hash_transformation.html#a9fc0b332ef36900ca6ea5d949e95aba1">00552</a> <span class="comment"></span>        <span class="keyword">virtual</span> byte * <a class="code" href="class_hash_transformation.html#a9fc0b332ef36900ca6ea5d949e95aba1" title="request space to write input into">CreateUpdateSpace</a>(<span class="keywordtype">size_t</span> &amp;size) {size=0; <span class="keywordflow">return</span> NULL;}
<a name="l00553"></a>00553 <span class="comment"></span>
<a name="l00554"></a>00554 <span class="comment">        //! compute hash for current message, then restart for a new message</span>
<a name="l00555"></a>00555 <span class="comment"></span><span class="comment">        /*!     \pre size of digest == DigestSize(). */</span>
<a name="l00556"></a><a class="code" href="class_hash_transformation.html#aa0b8c7a110d8968268fd02ec32b9a8e8">00556</a>         <span class="keyword">virtual</span> <span class="keywordtype">void</span> Final(byte *digest)
<a name="l00557"></a>00557                 {TruncatedFinal(digest, DigestSize());}
<a name="l00558"></a>00558 <span class="comment"></span>
<a name="l00559"></a>00559 <span class="comment">        //! discard the current state, and restart with a new message</span>
<a name="l00560"></a><a class="code" href="class_hash_transformation.html#a92752eebac10497211d7a065faba8725">00560</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> Restart()
<a name="l00561"></a>00561                 {TruncatedFinal(NULL, 0);}
<a name="l00562"></a>00562 <span class="comment"></span>
<a name="l00563"></a>00563 <span class="comment">        //! size of the hash/digest/MAC returned by Final()</span>
<a name="l00564"></a>00564 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> DigestSize() <span class="keyword">const</span> =0;
<a name="l00565"></a>00565 <span class="comment"></span>
<a name="l00566"></a>00566 <span class="comment">        //! same as DigestSize()</span>
<a name="l00567"></a><a class="code" href="class_hash_transformation.html#a5e847d65a38ec354de1b28cc4bc66a81">00567</a> <span class="comment"></span>        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_hash_transformation.html#a5e847d65a38ec354de1b28cc4bc66a81" title="same as DigestSize()">TagSize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> DigestSize();}
<a name="l00568"></a>00568 
<a name="l00569"></a>00569 <span class="comment"></span>
<a name="l00570"></a>00570 <span class="comment">        //! block size of underlying compression function, or 0 if not block based</span>
<a name="l00571"></a><a class="code" href="class_hash_transformation.html#ab5507c62376f6bea41d53ae9544d0ff0">00571</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_hash_transformation.html#ab5507c62376f6bea41d53ae9544d0ff0" title="block size of underlying compression function, or 0 if not block based">BlockSize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}
<a name="l00572"></a>00572 <span class="comment"></span>
<a name="l00573"></a>00573 <span class="comment">        //! input to Update() should have length a multiple of this for optimal speed</span>
<a name="l00574"></a><a class="code" href="class_hash_transformation.html#a981fce3f7d06c1f4ab2da853a1cf429d">00574</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_hash_transformation.html#a981fce3f7d06c1f4ab2da853a1cf429d" title="input to Update() should have length a multiple of this for optimal speed">OptimalBlockSize</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 1;}
<a name="l00575"></a>00575 <span class="comment"></span>
<a name="l00576"></a>00576 <span class="comment">        //! returns how input should be aligned for optimal performance</span>
<a name="l00577"></a>00577 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> OptimalDataAlignment() <span class="keyword">const</span>;
<a name="l00578"></a>00578 <span class="comment"></span>
<a name="l00579"></a>00579 <span class="comment">        //! use this if your input is in one piece and you don&apos;t want to call Update() and Final() separately</span>
<a name="l00580"></a><a class="code" href="class_hash_transformation.html#af8124c4fca23b74bbdc43660bdae692c">00580</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalculateDigest(byte *digest, <span class="keyword">const</span> byte *input, <span class="keywordtype">size_t</span> length)
<a name="l00581"></a>00581                 {Update(input, length); Final(digest);}
<a name="l00582"></a>00582 <span class="comment"></span>
<a name="l00583"></a>00583 <span class="comment">        //! verify that digest is a valid digest for the current message, then reinitialize the object</span>
<a name="l00584"></a>00584 <span class="comment"></span><span class="comment">        /*! Default implementation is to call Final() and do a bitwise comparison</span>
<a name="l00585"></a>00585 <span class="comment">                between its output and digest. */</span>
<a name="l00586"></a><a class="code" href="class_hash_transformation.html#a16c4aecd047015d513feef4ed5b929ba">00586</a>         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Verify(<span class="keyword">const</span> byte *digest)
<a name="l00587"></a>00587                 {<span class="keywordflow">return</span> TruncatedVerify(digest, DigestSize());}
<a name="l00588"></a>00588 <span class="comment"></span>
<a name="l00589"></a>00589 <span class="comment">        //! use this if your input is in one piece and you don&apos;t want to call Update() and Verify() separately</span>
<a name="l00590"></a><a class="code" href="class_hash_transformation.html#acad96df68e70d922683e5063057130b2">00590</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> VerifyDigest(<span class="keyword">const</span> byte *digest, <span class="keyword">const</span> byte *input, <span class="keywordtype">size_t</span> length)
<a name="l00591"></a>00591                 {Update(input, length); <span class="keywordflow">return</span> Verify(digest);}
<a name="l00592"></a>00592 <span class="comment"></span>
<a name="l00593"></a>00593 <span class="comment">        //! truncated version of Final()</span>
<a name="l00594"></a>00594 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> TruncatedFinal(byte *digest, <span class="keywordtype">size_t</span> digestSize) =0;
<a name="l00595"></a>00595 <span class="comment"></span>
<a name="l00596"></a>00596 <span class="comment">        //! truncated version of CalculateDigest()</span>
<a name="l00597"></a><a class="code" href="class_hash_transformation.html#a0b6917657eaec935750fd83e28270d76">00597</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> CalculateTruncatedDigest(byte *digest, <span class="keywordtype">size_t</span> digestSize, <span class="keyword">const</span> byte *input, <span class="keywordtype">size_t</span> length)
<a name="l00598"></a>00598                 {Update(input, length); TruncatedFinal(digest, digestSize);}
<a name="l00599"></a>00599 <span class="comment"></span>
<a name="l00600"></a>00600 <span class="comment">        //! truncated version of Verify()</span>
<a name="l00601"></a>00601 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> TruncatedVerify(<span class="keyword">const</span> byte *digest, <span class="keywordtype">size_t</span> digestLength);
<a name="l00602"></a>00602 <span class="comment"></span>
<a name="l00603"></a>00603 <span class="comment">        //! truncated version of VerifyDigest()</span>
<a name="l00604"></a><a class="code" href="class_hash_transformation.html#a7958e99717019e8b9f91672bdfe9e086">00604</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> VerifyTruncatedDigest(<span class="keyword">const</span> byte *digest, <span class="keywordtype">size_t</span> digestLength, <span class="keyword">const</span> byte *input, <span class="keywordtype">size_t</span> length)
<a name="l00605"></a>00605                 {Update(input, length); <span class="keywordflow">return</span> TruncatedVerify(digest, digestLength);}
<a name="l00606"></a>00606 
<a name="l00607"></a>00607 <span class="keyword">protected</span>:
<a name="l00608"></a>00608         <span class="keywordtype">void</span> ThrowIfInvalidTruncatedSize(<span class="keywordtype">size_t</span> size) <span class="keyword">const</span>;
<a name="l00609"></a>00609 };
<a name="l00610"></a>00610 
<a name="l00611"></a>00611 <span class="keyword">typedef</span> <a class="code" href="class_hash_transformation.html" title="interface for hash functions and data processing part of MACs">HashTransformation</a> <a class="code" href="class_hash_transformation.html" title="interface for hash functions and data processing part of MACs">HashFunction</a>;
<a name="l00612"></a>00612 <span class="comment"></span>
<a name="l00613"></a>00613 <span class="comment">//! interface for one direction (encryption or decryption) of a block cipher</span>
<a name="l00614"></a>00614 <span class="comment"></span><span class="comment">/*! \note These objects usually should not be used directly. See BlockTransformation for more details. */</span>
<a name="l00615"></a><a class="code" href="class_block_cipher.html">00615</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_block_cipher.html" title="interface for one direction (encryption or decryption) of a block cipher">BlockCipher</a> : <span class="keyword">public</span> <a class="code" href="class_simple_keying_interface.html" title="keying interface for crypto algorithms that take byte strings as keys">SimpleKeyingInterface</a>, <span class="keyword">public</span> <a class="code" href="class_block_transformation.html" title="interface for the data processing part of block ciphers">BlockTransformation</a>
<a name="l00616"></a>00616 {
<a name="l00617"></a>00617 <span class="keyword">protected</span>:
<a name="l00618"></a>00618         <span class="keyword">const</span> <a class="code" href="class_algorithm.html" title="interface for all crypto algorithms">Algorithm</a> &amp; GetAlgorithm()<span class="keyword"> const </span>{<span class="keywordflow">return</span> *<span class="keyword">this</span>;}
<a name="l00619"></a>00619 };
<a name="l00620"></a>00620 <span class="comment"></span>
<a name="l00621"></a>00621 <span class="comment">//! interface for one direction (encryption or decryption) of a stream cipher or cipher mode</span>
<a name="l00622"></a><a class="code" href="class_symmetric_cipher.html">00622</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_symmetric_cipher.html" title="interface for one direction (encryption or decryption) of a stream cipher or cipher...">SymmetricCipher</a> : <span class="keyword">public</span> <a class="code" href="class_simple_keying_interface.html" title="keying interface for crypto algorithms that take byte strings as keys">SimpleKeyingInterface</a>, <span class="keyword">public</span> <a class="code" href="class_stream_transformation.html" title="interface for the data processing part of stream ciphers">StreamTransformation</a>
<a name="l00623"></a>00623 {
<a name="l00624"></a>00624 <span class="keyword">protected</span>:
<a name="l00625"></a>00625         <span class="keyword">const</span> <a class="code" href="class_algorithm.html" title="interface for all crypto algorithms">Algorithm</a> &amp; GetAlgorithm()<span class="keyword"> const </span>{<span class="keywordflow">return</span> *<span class="keyword">this</span>;}
<a name="l00626"></a>00626 };
<a name="l00627"></a>00627 <span class="comment"></span>
<a name="l00628"></a>00628 <span class="comment">//! interface for message authentication codes</span>
<a name="l00629"></a><a class="code" href="class_message_authentication_code.html">00629</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_message_authentication_code.html" title="interface for message authentication codes">MessageAuthenticationCode</a> : <span class="keyword">public</span> <a class="code" href="class_simple_keying_interface.html" title="keying interface for crypto algorithms that take byte strings as keys">SimpleKeyingInterface</a>, <span class="keyword">public</span> <a class="code" href="class_hash_transformation.html" title="interface for hash functions and data processing part of MACs">HashTransformation</a>
<a name="l00630"></a>00630 {
<a name="l00631"></a>00631 <span class="keyword">protected</span>:
<a name="l00632"></a>00632         <span class="keyword">const</span> <a class="code" href="class_algorithm.html" title="interface for all crypto algorithms">Algorithm</a> &amp; GetAlgorithm()<span class="keyword"> const </span>{<span class="keywordflow">return</span> *<span class="keyword">this</span>;}
<a name="l00633"></a>00633 };
<a name="l00634"></a>00634 <span class="comment"></span>
<a name="l00635"></a>00635 <span class="comment">//! interface for for one direction (encryption or decryption) of a stream cipher or block cipher mode with authentication</span>
<a name="l00636"></a>00636 <span class="comment"></span><span class="comment">/*! The StreamTransformation part of this interface is used to encrypt/decrypt the data, and the MessageAuthenticationCode part of this</span>
<a name="l00637"></a>00637 <span class="comment">        interface is used to input additional authenticated data (AAD, which is MAC&apos;ed but not encrypted), and to generate/verify the MAC. */</span>
<a name="l00638"></a><a class="code" href="class_authenticated_symmetric_cipher.html">00638</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_authenticated_symmetric_cipher.html" title="interface for for one direction (encryption or decryption) of a stream cipher or...">AuthenticatedSymmetricCipher</a> : <span class="keyword">public</span> <a class="code" href="class_message_authentication_code.html" title="interface for message authentication codes">MessageAuthenticationCode</a>, <span class="keyword">public</span> <a class="code" href="class_stream_transformation.html" title="interface for the data processing part of stream ciphers">StreamTransformation</a>
<a name="l00639"></a>00639 {
<a name="l00640"></a>00640 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00641"></a>00641 <span class="comment">        //! this indicates that a member function was called in the wrong state, for example trying to encrypt a message before having set the key or IV</span>
<a name="l00642"></a><a class="code" href="class_authenticated_symmetric_cipher_1_1_bad_state.html">00642</a> <span class="comment"></span>        <span class="keyword">class </span><a class="code" href="class_authenticated_symmetric_cipher_1_1_bad_state.html" title="this indicates that a member function was called in the wrong state, for example...">BadState</a> : <span class="keyword">public</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>
<a name="l00643"></a>00643         {
<a name="l00644"></a>00644         <span class="keyword">public</span>:
<a name="l00645"></a>00645                 <span class="keyword">explicit</span> <a class="code" href="class_authenticated_symmetric_cipher_1_1_bad_state.html" title="this indicates that a member function was called in the wrong state, for example...">BadState</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keyword">const</span> <span class="keywordtype">char</span> *message) : <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(OTHER_ERROR, name + <span class="stringliteral">&quot;: &quot;</span> + message) {}
<a name="l00646"></a>00646                 <span class="keyword">explicit</span> <a class="code" href="class_authenticated_symmetric_cipher_1_1_bad_state.html" title="this indicates that a member function was called in the wrong state, for example...">BadState</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keyword">const</span> <span class="keywordtype">char</span> *function, <span class="keyword">const</span> <span class="keywordtype">char</span> *state) : <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(OTHER_ERROR, name + <span class="stringliteral">&quot;: &quot;</span> + function + <span class="stringliteral">&quot; was called before &quot;</span> + state) {}
<a name="l00647"></a>00647         };
<a name="l00648"></a>00648 <span class="comment"></span>
<a name="l00649"></a>00649 <span class="comment">        //! the maximum length of AAD that can be input before the encrypted data</span>
<a name="l00650"></a>00650 <span class="comment"></span>        <span class="keyword">virtual</span> lword MaxHeaderLength() <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l00651"></a>00651 <span class="comment">        //! the maximum length of encrypted data</span>
<a name="l00652"></a>00652 <span class="comment"></span>        <span class="keyword">virtual</span> lword MaxMessageLength() <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l00653"></a>00653 <span class="comment">        //! the maximum length of AAD that can be input after the encrypted data</span>
<a name="l00654"></a><a class="code" href="class_authenticated_symmetric_cipher.html#a2307840ae74d2c4a1cc028d4aff903b3">00654</a> <span class="comment"></span>        <span class="keyword">virtual</span> lword <a class="code" href="class_authenticated_symmetric_cipher.html#a2307840ae74d2c4a1cc028d4aff903b3" title="the maximum length of AAD that can be input after the encrypted data">MaxFooterLength</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}<span class="comment"></span>
<a name="l00655"></a>00655 <span class="comment">        //! if this function returns true, SpecifyDataLengths() must be called before attempting to input data</span>
<a name="l00656"></a>00656 <span class="comment"></span><span class="comment">        /*! This is the case for some schemes, such as CCM. */</span>
<a name="l00657"></a><a class="code" href="class_authenticated_symmetric_cipher.html#a52595d1c7b43c7a416da2fffba46330b">00657</a>         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_authenticated_symmetric_cipher.html#a52595d1c7b43c7a416da2fffba46330b" title="if this function returns true, SpecifyDataLengths() must be called before attempting...">NeedsPrespecifiedDataLengths</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">false</span>;}<span class="comment"></span>
<a name="l00658"></a>00658 <span class="comment">        //! this function only needs to be called if NeedsPrespecifiedDataLengths() returns true</span>
<a name="l00659"></a>00659 <span class="comment"></span>        <span class="keywordtype">void</span> SpecifyDataLengths(lword headerLength, lword messageLength, lword footerLength=0);<span class="comment"></span>
<a name="l00660"></a>00660 <span class="comment">        //! encrypt and generate MAC in one call. will truncate MAC if macSize &lt; TagSize()</span>
<a name="l00661"></a>00661 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> EncryptAndAuthenticate(byte *ciphertext, byte *mac, <span class="keywordtype">size_t</span> macSize, <span class="keyword">const</span> byte *iv, <span class="keywordtype">int</span> ivLength, <span class="keyword">const</span> byte *header, <span class="keywordtype">size_t</span> headerLength, <span class="keyword">const</span> byte *message, <span class="keywordtype">size_t</span> messageLength);<span class="comment"></span>
<a name="l00662"></a>00662 <span class="comment">        //! decrypt and verify MAC in one call, returning true iff MAC is valid. will assume MAC is truncated if macLength &lt; TagSize()</span>
<a name="l00663"></a>00663 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> DecryptAndVerify(byte *message, <span class="keyword">const</span> byte *mac, <span class="keywordtype">size_t</span> macLength, <span class="keyword">const</span> byte *iv, <span class="keywordtype">int</span> ivLength, <span class="keyword">const</span> byte *header, <span class="keywordtype">size_t</span> headerLength, <span class="keyword">const</span> byte *ciphertext, <span class="keywordtype">size_t</span> ciphertextLength);
<a name="l00664"></a>00664 
<a name="l00665"></a>00665         <span class="comment">// redeclare this to avoid compiler ambiguity errors</span>
<a name="l00666"></a>00666         <span class="keyword">virtual</span> std::string <a class="code" href="class_algorithm.html#acd21c6715add4884fa043eaf51655039" title="returns name of this algorithm, not universally implemented yet">AlgorithmName</a>() <span class="keyword">const</span> =0;
<a name="l00667"></a>00667 
<a name="l00668"></a>00668 <span class="keyword">protected</span>:
<a name="l00669"></a>00669         <span class="keyword">const</span> <a class="code" href="class_algorithm.html" title="interface for all crypto algorithms">Algorithm</a> &amp; GetAlgorithm()<span class="keyword"> const </span>{<span class="keywordflow">return</span> *<span class="keyword">static_cast&lt;</span><span class="keyword">const </span><a class="code" href="class_message_authentication_code.html" title="interface for message authentication codes">MessageAuthenticationCode</a> *<span class="keyword">&gt;</span>(<span class="keyword">this</span>);}
<a name="l00670"></a>00670         <span class="keyword">virtual</span> <span class="keywordtype">void</span> UncheckedSpecifyDataLengths(lword headerLength, lword messageLength, lword footerLength) {}
<a name="l00671"></a>00671 };
<a name="l00672"></a>00672 
<a name="l00673"></a>00673 <span class="preprocessor">#ifdef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY</span>
<a name="l00674"></a>00674 <span class="preprocessor"></span><span class="keyword">typedef</span> <a class="code" href="class_symmetric_cipher.html" title="interface for one direction (encryption or decryption) of a stream cipher or cipher...">SymmetricCipher</a> StreamCipher;
<a name="l00675"></a>00675 <span class="preprocessor">#endif</span>
<a name="l00676"></a>00676 <span class="preprocessor"></span><span class="comment"></span>
<a name="l00677"></a>00677 <span class="comment">//! interface for random number generators</span>
<a name="l00678"></a>00678 <span class="comment"></span><span class="comment">/*! All return values are uniformly distributed over the range specified.</span>
<a name="l00679"></a>00679 <span class="comment">*/</span>
<a name="l00680"></a><a class="code" href="class_random_number_generator.html">00680</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> : <span class="keyword">public</span> <a class="code" href="class_algorithm.html" title="interface for all crypto algorithms">Algorithm</a>
<a name="l00681"></a>00681 {
<a name="l00682"></a>00682 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l00683"></a>00683 <span class="comment">        //! update RNG state with additional unpredictable values</span>
<a name="l00684"></a><a class="code" href="class_random_number_generator.html#a6feb4f0afedb62a495b7a9ae311fa1cb">00684</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="class_random_number_generator.html#a6feb4f0afedb62a495b7a9ae311fa1cb" title="update RNG state with additional unpredictable values">IncorporateEntropy</a>(<span class="keyword">const</span> byte *input, <span class="keywordtype">size_t</span> length) {<span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">&quot;RandomNumberGenerator: IncorporateEntropy not implemented&quot;</span>);}
<a name="l00685"></a>00685 <span class="comment"></span>
<a name="l00686"></a>00686 <span class="comment">        //! returns true if IncorporateEntropy is implemented</span>
<a name="l00687"></a><a class="code" href="class_random_number_generator.html#a85b1db1d40b57d18a320dba6cfb2e4b6">00687</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_random_number_generator.html#a85b1db1d40b57d18a320dba6cfb2e4b6" title="returns true if IncorporateEntropy is implemented">CanIncorporateEntropy</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">false</span>;}
<a name="l00688"></a>00688 <span class="comment"></span>
<a name="l00689"></a>00689 <span class="comment">        //! generate new random byte and return it</span>
<a name="l00690"></a>00690 <span class="comment"></span>        <span class="keyword">virtual</span> byte GenerateByte();
<a name="l00691"></a>00691 <span class="comment"></span>
<a name="l00692"></a>00692 <span class="comment">        //! generate new random bit and return it</span>
<a name="l00693"></a>00693 <span class="comment"></span><span class="comment">        /*! Default implementation is to call GenerateByte() and return its lowest bit. */</span>
<a name="l00694"></a>00694         <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GenerateBit();
<a name="l00695"></a>00695 <span class="comment"></span>
<a name="l00696"></a>00696 <span class="comment">        //! generate a random 32 bit word in the range min to max, inclusive</span>
<a name="l00697"></a>00697 <span class="comment"></span>        <span class="keyword">virtual</span> word32 GenerateWord32(word32 a=0, word32 b=0xffffffffL);
<a name="l00698"></a>00698 <span class="comment"></span>
<a name="l00699"></a>00699 <span class="comment">        //! generate random array of bytes</span>
<a name="l00700"></a>00700 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> GenerateBlock(byte *output, <span class="keywordtype">size_t</span> size);
<a name="l00701"></a>00701 <span class="comment"></span>
<a name="l00702"></a>00702 <span class="comment">        //! generate and discard n bytes</span>
<a name="l00703"></a>00703 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> DiscardBytes(<span class="keywordtype">size_t</span> n);
<a name="l00704"></a>00704 <span class="comment"></span>
<a name="l00705"></a>00705 <span class="comment">        //! generate random bytes as input to a BufferedTransformation</span>
<a name="l00706"></a>00706 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> GenerateIntoBufferedTransformation(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;target, <span class="keyword">const</span> std::string &amp;channel, lword length);
<a name="l00707"></a>00707 <span class="comment"></span>
<a name="l00708"></a>00708 <span class="comment">        //! randomly shuffle the specified array, resulting permutation is uniformly distributed</span>
<a name="l00709"></a><a class="code" href="class_random_number_generator.html#a9ef5090c556d086e7aa240acf7a131b4">00709</a> <span class="comment"></span>        <span class="keyword">template</span> &lt;<span class="keyword">class</span> IT&gt; <span class="keywordtype">void</span> Shuffle(IT begin, IT end)
<a name="l00710"></a>00710         {
<a name="l00711"></a>00711                 <span class="keywordflow">for</span> (; begin != end; ++begin)
<a name="l00712"></a>00712                         std::iter_swap(begin, begin + GenerateWord32(0, end-begin-1));
<a name="l00713"></a>00713         }
<a name="l00714"></a>00714 
<a name="l00715"></a>00715 <span class="preprocessor">#ifdef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY</span>
<a name="l00716"></a>00716 <span class="preprocessor"></span>        byte GetByte() {<span class="keywordflow">return</span> GenerateByte();}
<a name="l00717"></a>00717         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetBit() {<span class="keywordflow">return</span> GenerateBit();}
<a name="l00718"></a>00718         word32 GetLong(word32 a=0, word32 b=0xffffffffL) {<span class="keywordflow">return</span> GenerateWord32(a, b);}
<a name="l00719"></a>00719         word16 GetShort(word16 a=0, word16 b=0xffff) {<span class="keywordflow">return</span> (word16)GenerateWord32(a, b);}
<a name="l00720"></a>00720         <span class="keywordtype">void</span> <a class="code" href="class_get_block.html">GetBlock</a>(byte *output, <span class="keywordtype">size_t</span> size) {GenerateBlock(output, size);}
<a name="l00721"></a>00721 <span class="preprocessor">#endif</span>
<a name="l00722"></a>00722 <span class="preprocessor"></span>};
<a name="l00723"></a>00723 <span class="comment"></span>
<a name="l00724"></a>00724 <span class="comment">//! returns a reference that can be passed to functions that ask for a RNG but doesn&apos;t actually use it</span>
<a name="l00725"></a>00725 <span class="comment"></span>CRYPTOPP_DLL <a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp; CRYPTOPP_API NullRNG();
<a name="l00726"></a>00726 
<a name="l00727"></a>00727 <span class="keyword">class </span><a class="code" href="class_wait_object_container.html" title="container of wait objects">WaitObjectContainer</a>;
<a name="l00728"></a>00728 <span class="keyword">class </span><a class="code" href="class_call_stack.html">CallStack</a>;
<a name="l00729"></a>00729 <span class="comment"></span>
<a name="l00730"></a>00730 <span class="comment">//! interface for objects that you can wait for</span>
<a name="l00731"></a>00731 <span class="comment"></span>
<a name="l00732"></a><a class="code" href="class_waitable.html">00732</a> <span class="keyword">class </span>CRYPTOPP_NO_VTABLE <a class="code" href="class_waitable.html" title="interface for objects that you can wait for">Waitable</a>
<a name="l00733"></a>00733 {
<a name="l00734"></a>00734 <span class="keyword">public</span>:
<a name="l00735"></a>00735         <span class="keyword">virtual</span> ~<a class="code" href="class_waitable.html" title="interface for objects that you can wait for">Waitable</a>() {}
<a name="l00736"></a>00736 <span class="comment"></span>
<a name="l00737"></a>00737 <span class="comment">        //! maximum number of wait objects that this object can return</span>
<a name="l00738"></a>00738 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetMaxWaitObjectCount() <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l00739"></a>00739 <span class="comment">        //! put wait objects into container</span>
<a name="l00740"></a>00740 <span class="comment"></span><span class="comment">        /*! \param callStack is used for tracing no wait loops, example:</span>
<a name="l00741"></a>00741 <span class="comment">                     something.GetWaitObjects(c, CallStack(&quot;my func after X&quot;, 0));</span>
<a name="l00742"></a>00742 <span class="comment">                           - or in an outer GetWaitObjects() method that itself takes a callStack parameter:</span>
<a name="l00743"></a>00743 <span class="comment">                             innerThing.GetWaitObjects(c, CallStack(&quot;MyClass::GetWaitObjects at X&quot;, &amp;callStack)); */</span>
<a name="l00744"></a>00744         <span class="keyword">virtual</span> <span class="keywordtype">void</span> GetWaitObjects(<a class="code" href="class_wait_object_container.html" title="container of wait objects">WaitObjectContainer</a> &amp;container, <a class="code" href="class_call_stack.html">CallStack</a> <span class="keyword">const</span>&amp; callStack) =0;<span class="comment"></span>
<a name="l00745"></a>00745 <span class="comment">        //! wait on this object</span>
<a name="l00746"></a>00746 <span class="comment"></span><span class="comment">        /*! same as creating an empty container, calling GetWaitObjects(), and calling Wait() on the container */</span>
<a name="l00747"></a>00747         <span class="keywordtype">bool</span> Wait(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> milliseconds, <a class="code" href="class_call_stack.html">CallStack</a> <span class="keyword">const</span>&amp; callStack);
<a name="l00748"></a>00748 };
<a name="l00749"></a>00749 <span class="comment"></span>
<a name="l00750"></a>00750 <span class="comment">//! the default channel for BufferedTransformation, equal to the empty string</span>
<a name="l00751"></a>00751 <span class="comment"></span><span class="keyword">extern</span> CRYPTOPP_DLL <span class="keyword">const</span> std::string DEFAULT_CHANNEL;
<a name="l00752"></a>00752 <span class="comment"></span>
<a name="l00753"></a>00753 <span class="comment">//! channel for additional authenticated data, equal to &quot;AAD&quot;</span>
<a name="l00754"></a>00754 <span class="comment"></span><span class="keyword">extern</span> CRYPTOPP_DLL <span class="keyword">const</span> std::string AAD_CHANNEL;
<a name="l00755"></a>00755 <span class="comment"></span>
<a name="l00756"></a>00756 <span class="comment">//! interface for buffered transformations</span>
<a name="l00757"></a>00757 <span class="comment"></span><span class="comment"></span>
<a name="l00758"></a>00758 <span class="comment">/*! BufferedTransformation is a generalization of BlockTransformation,</span>
<a name="l00759"></a>00759 <span class="comment">        StreamTransformation, and HashTransformation.</span>
<a name="l00760"></a>00760 <span class="comment"></span>
<a name="l00761"></a>00761 <span class="comment">        A buffered transformation is an object that takes a stream of bytes</span>
<a name="l00762"></a>00762 <span class="comment">        as input (this may be done in stages), does some computation on them, and</span>
<a name="l00763"></a>00763 <span class="comment">        then places the result into an internal buffer for later retrieval.  Any</span>
<a name="l00764"></a>00764 <span class="comment">        partial result already in the output buffer is not modified by further</span>
<a name="l00765"></a>00765 <span class="comment">        input.</span>
<a name="l00766"></a>00766 <span class="comment"></span>
<a name="l00767"></a>00767 <span class="comment">        If a method takes a &quot;blocking&quot; parameter, and you</span>
<a name="l00768"></a>00768 <span class="comment">        pass &quot;false&quot; for it, the method will return before all input has been processed if</span>
<a name="l00769"></a>00769 <span class="comment">        the input cannot be processed without waiting (for network buffers to become available, for example).</span>
<a name="l00770"></a>00770 <span class="comment">        In this case the method will return true</span>
<a name="l00771"></a>00771 <span class="comment">        or a non-zero integer value. When this happens you must continue to call the method with the same</span>
<a name="l00772"></a>00772 <span class="comment">        parameters until it returns false or zero, before calling any other method on it or</span>
<a name="l00773"></a>00773 <span class="comment">        attached BufferedTransformation. The integer return value in this case is approximately</span>
<a name="l00774"></a>00774 <span class="comment">        the number of bytes left to be processed, and can be used to implement a progress bar.</span>
<a name="l00775"></a>00775 <span class="comment"></span>
<a name="l00776"></a>00776 <span class="comment">        For functions that take a &quot;propagation&quot; parameter, propagation != 0 means pass on the signal to attached</span>
<a name="l00777"></a>00777 <span class="comment">        BufferedTransformation objects, with propagation decremented at each step until it reaches 0.</span>
<a name="l00778"></a>00778 <span class="comment">        -1 means unlimited propagation.</span>
<a name="l00779"></a>00779 <span class="comment"></span>
<a name="l00780"></a>00780 <span class="comment">        \nosubgrouping</span>
<a name="l00781"></a>00781 <span class="comment">*/</span>
<a name="l00782"></a><a class="code" href="class_buffered_transformation.html">00782</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> : <span class="keyword">public</span> <a class="code" href="class_algorithm.html" title="interface for all crypto algorithms">Algorithm</a>, <span class="keyword">public</span> <a class="code" href="class_waitable.html" title="interface for objects that you can wait for">Waitable</a>
<a name="l00783"></a>00783 {
<a name="l00784"></a>00784 <span class="keyword">public</span>:
<a name="l00785"></a>00785         <span class="comment">// placed up here for CW8</span>
<a name="l00786"></a>00786         <span class="keyword">static</span> <span class="keyword">const</span> std::string &amp;NULL_CHANNEL; <span class="comment">// same as DEFAULT_CHANNEL, for backwards compatibility</span>
<a name="l00787"></a>00787 
<a name="l00788"></a>00788         <a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a>() : <a class="code" href="class_algorithm.html#a1c77f5117ca2cd881baf26a364cfc606">Algorithm</a>(<span class="keyword">false</span>) {}
<a name="l00789"></a>00789 <span class="comment"></span>
<a name="l00790"></a>00790 <span class="comment">        //! return a reference to this object</span>
<a name="l00791"></a>00791 <span class="comment"></span><span class="comment">        /*! This function is useful for passing a temporary BufferedTransformation object to a </span>
<a name="l00792"></a>00792 <span class="comment">                function that takes a non-const reference. */</span>
<a name="l00793"></a><a class="code" href="class_buffered_transformation.html#a25686ebe4c3ba26e7eeaae1dcd4d4215">00793</a>         <a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a>&amp; <a class="code" href="class_buffered_transformation.html#a25686ebe4c3ba26e7eeaae1dcd4d4215" title="return a reference to this object">Ref</a>() {<span class="keywordflow">return</span> *<span class="keyword">this</span>;}
<a name="l00794"></a>00794 <span class="comment"></span>
<a name="l00795"></a>00795 <span class="comment">        //!     \name INPUT</span>
<a name="l00796"></a>00796 <span class="comment"></span><span class="comment">        //@{</span>
<a name="l00797"></a>00797 <span class="comment"></span><span class="comment">                //! input a byte for processing</span>
<a name="l00798"></a><a class="code" href="class_buffered_transformation.html#ae70658b0d271f8e114ac6c3cc9774ede">00798</a> <span class="comment"></span>                <span class="keywordtype">size_t</span> Put(byte inByte, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>)
<a name="l00799"></a>00799                         {<span class="keywordflow">return</span> <a class="code" href="class_buffered_transformation.html#ae70658b0d271f8e114ac6c3cc9774ede" title="input a byte for processing">Put</a>(&amp;inByte, 1, blocking);}<span class="comment"></span>
<a name="l00800"></a>00800 <span class="comment">                //! input multiple bytes</span>
<a name="l00801"></a><a class="code" href="class_buffered_transformation.html#a44e935e60d3877975a7c82c6353d65c9">00801</a> <span class="comment"></span>                <span class="keywordtype">size_t</span> Put(<span class="keyword">const</span> byte *inString, <span class="keywordtype">size_t</span> length, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>)
<a name="l00802"></a>00802                         {<span class="keywordflow">return</span> Put2(inString, length, 0, blocking);}
<a name="l00803"></a>00803 <span class="comment"></span>
<a name="l00804"></a>00804 <span class="comment">                //! input a 16-bit word</span>
<a name="l00805"></a>00805 <span class="comment"></span>                <span class="keywordtype">size_t</span> PutWord16(word16 value, ByteOrder order=BIG_ENDIAN_ORDER, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>);<span class="comment"></span>
<a name="l00806"></a>00806 <span class="comment">                //! input a 32-bit word</span>
<a name="l00807"></a>00807 <span class="comment"></span>                <span class="keywordtype">size_t</span> PutWord32(word32 value, ByteOrder order=BIG_ENDIAN_ORDER, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>);
<a name="l00808"></a>00808 <span class="comment"></span>
<a name="l00809"></a>00809 <span class="comment">                //! request space which can be written into by the caller, and then used as input to Put()</span>
<a name="l00810"></a>00810 <span class="comment"></span><span class="comment">                /*! \param size is requested size (as a hint) for input, and size of the returned space for output */</span><span class="comment"></span>
<a name="l00811"></a>00811 <span class="comment">                /*! \note The purpose of this method is to help avoid doing extra memory allocations. */</span>
<a name="l00812"></a><a class="code" href="class_buffered_transformation.html#af390325c959c3d6a2c03a447d6cd469d">00812</a>                 <span class="keyword">virtual</span> byte * <a class="code" href="class_buffered_transformation.html#af390325c959c3d6a2c03a447d6cd469d" title="request space which can be written into by the caller, and then used as input to...">CreatePutSpace</a>(<span class="keywordtype">size_t</span> &amp;size) {size=0; <span class="keywordflow">return</span> NULL;}
<a name="l00813"></a>00813 
<a name="l00814"></a>00814                 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> CanModifyInput()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">false</span>;}
<a name="l00815"></a>00815 <span class="comment"></span>
<a name="l00816"></a>00816 <span class="comment">                //! input multiple bytes that may be modified by callee</span>
<a name="l00817"></a><a class="code" href="class_buffered_transformation.html#ae15df84a7b67c25dfe2ce0ef5a74123c">00817</a> <span class="comment"></span>                <span class="keywordtype">size_t</span> PutModifiable(byte *inString, <span class="keywordtype">size_t</span> length, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>)
<a name="l00818"></a>00818                         {<span class="keywordflow">return</span> PutModifiable2(inString, length, 0, blocking);}
<a name="l00819"></a>00819 
<a name="l00820"></a>00820                 <span class="keywordtype">bool</span> MessageEnd(<span class="keywordtype">int</span> propagation=-1, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>)
<a name="l00821"></a>00821                         {<span class="keywordflow">return</span> !!Put2(NULL, 0, propagation &lt; 0 ? -1 : propagation+1, blocking);}
<a name="l00822"></a>00822                 <span class="keywordtype">size_t</span> PutMessageEnd(<span class="keyword">const</span> byte *inString, <span class="keywordtype">size_t</span> length, <span class="keywordtype">int</span> propagation=-1, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>)
<a name="l00823"></a>00823                         {<span class="keywordflow">return</span> Put2(inString, length, propagation &lt; 0 ? -1 : propagation+1, blocking);}
<a name="l00824"></a>00824 <span class="comment"></span>
<a name="l00825"></a>00825 <span class="comment">                //! input multiple bytes for blocking or non-blocking processing</span>
<a name="l00826"></a>00826 <span class="comment"></span><span class="comment">                /*! \param messageEnd means how many filters to signal MessageEnd to, including this one */</span>
<a name="l00827"></a>00827                 <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> Put2(<span class="keyword">const</span> byte *inString, <span class="keywordtype">size_t</span> length, <span class="keywordtype">int</span> messageEnd, <span class="keywordtype">bool</span> blocking) =0;<span class="comment"></span>
<a name="l00828"></a>00828 <span class="comment">                //! input multiple bytes that may be modified by callee for blocking or non-blocking processing</span>
<a name="l00829"></a>00829 <span class="comment"></span><span class="comment">                /*! \param messageEnd means how many filters to signal MessageEnd to, including this one */</span>
<a name="l00830"></a><a class="code" href="class_buffered_transformation.html#a770bf11f26d4dec66423a7dc2d36843d">00830</a>                 <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> PutModifiable2(byte *inString, <span class="keywordtype">size_t</span> length, <span class="keywordtype">int</span> messageEnd, <span class="keywordtype">bool</span> blocking)
<a name="l00831"></a>00831                         {<span class="keywordflow">return</span> Put2(inString, length, messageEnd, blocking);}
<a name="l00832"></a>00832 <span class="comment"></span>
<a name="l00833"></a>00833 <span class="comment">                //! thrown by objects that have not implemented nonblocking input processing</span>
<a name="l00834"></a><a class="code" href="struct_buffered_transformation_1_1_blocking_input_only.html">00834</a> <span class="comment"></span>                <span class="keyword">struct </span><a class="code" href="struct_buffered_transformation_1_1_blocking_input_only.html" title="thrown by objects that have not implemented nonblocking input processing">BlockingInputOnly</a> : <span class="keyword">public</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>
<a name="l00835"></a>00835                         {<a class="code" href="struct_buffered_transformation_1_1_blocking_input_only.html" title="thrown by objects that have not implemented nonblocking input processing">BlockingInputOnly</a>(<span class="keyword">const</span> std::string &amp;s) : <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(s + <span class="stringliteral">&quot;: Nonblocking input is not implemented by this object.&quot;</span>) {}};<span class="comment"></span>
<a name="l00836"></a>00836 <span class="comment">        //@}</span>
<a name="l00837"></a>00837 <span class="comment"></span><span class="comment"></span>
<a name="l00838"></a>00838 <span class="comment">        //!     \name WAITING</span>
<a name="l00839"></a>00839 <span class="comment"></span><span class="comment">        //@{</span>
<a name="l00840"></a>00840 <span class="comment"></span>                <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_waitable.html#a221cf2a8063487b56b97c27197e16b12" title="maximum number of wait objects that this object can return">GetMaxWaitObjectCount</a>() <span class="keyword">const</span>;
<a name="l00841"></a>00841                 <span class="keywordtype">void</span> <a class="code" href="class_waitable.html#a97155f28db33d3dacc69dc453a01609a" title="put wait objects into container">GetWaitObjects</a>(<a class="code" href="class_wait_object_container.html" title="container of wait objects">WaitObjectContainer</a> &amp;container, <a class="code" href="class_call_stack.html">CallStack</a> <span class="keyword">const</span>&amp; callStack);<span class="comment"></span>
<a name="l00842"></a>00842 <span class="comment">        //@}</span>
<a name="l00843"></a>00843 <span class="comment"></span><span class="comment"></span>
<a name="l00844"></a>00844 <span class="comment">        //!     \name SIGNALS</span>
<a name="l00845"></a>00845 <span class="comment"></span><span class="comment">        //@{</span>
<a name="l00846"></a>00846 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">void</span> IsolatedInitialize(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;parameters) {<span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">&quot;BufferedTransformation: this object can&apos;t be reinitialized&quot;</span>);}
<a name="l00847"></a>00847                 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsolatedFlush(<span class="keywordtype">bool</span> hardFlush, <span class="keywordtype">bool</span> blocking) =0;
<a name="l00848"></a>00848                 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsolatedMessageSeriesEnd(<span class="keywordtype">bool</span> blocking) {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
<a name="l00849"></a>00849 <span class="comment"></span>
<a name="l00850"></a>00850 <span class="comment">                //! initialize or reinitialize this object</span>
<a name="l00851"></a>00851 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">void</span> Initialize(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;parameters=g_nullNameValuePairs, <span class="keywordtype">int</span> propagation=-1);<span class="comment"></span>
<a name="l00852"></a>00852 <span class="comment">                //! flush buffered input and/or output</span>
<a name="l00853"></a>00853 <span class="comment"></span><span class="comment">                /*! \param hardFlush is used to indicate whether all data should be flushed</span>
<a name="l00854"></a>00854 <span class="comment">                        \note Hard flushes must be used with care. It means try to process and output everything, even if</span>
<a name="l00855"></a>00855 <span class="comment">                        there may not be enough data to complete the action. For example, hard flushing a HexDecoder would</span>
<a name="l00856"></a>00856 <span class="comment">                        cause an error if you do it after inputing an odd number of hex encoded characters.</span>
<a name="l00857"></a>00857 <span class="comment">                        For some types of filters, for example ZlibDecompressor, hard flushes can only</span>
<a name="l00858"></a>00858 <span class="comment">                        be done at &quot;synchronization points&quot;. These synchronization points are positions in the data</span>
<a name="l00859"></a>00859 <span class="comment">                        stream that are created by hard flushes on the corresponding reverse filters, in this</span>
<a name="l00860"></a>00860 <span class="comment">                        example ZlibCompressor. This is useful when zlib compressed data is moved across a</span>
<a name="l00861"></a>00861 <span class="comment">                        network in packets and compression state is preserved across packets, as in the ssh2 protocol.</span>
<a name="l00862"></a>00862 <span class="comment">                */</span>
<a name="l00863"></a>00863                 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Flush(<span class="keywordtype">bool</span> hardFlush, <span class="keywordtype">int</span> propagation=-1, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>);<span class="comment"></span>
<a name="l00864"></a>00864 <span class="comment">                //! mark end of a series of messages</span>
<a name="l00865"></a>00865 <span class="comment"></span><span class="comment">                /*! There should be a MessageEnd immediately before MessageSeriesEnd. */</span>
<a name="l00866"></a>00866                 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> MessageSeriesEnd(<span class="keywordtype">int</span> propagation=-1, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>);
<a name="l00867"></a>00867 <span class="comment"></span>
<a name="l00868"></a>00868 <span class="comment">                //! set propagation of automatically generated and transferred signals</span>
<a name="l00869"></a>00869 <span class="comment"></span><span class="comment">                /*! propagation == 0 means do not automaticly generate signals */</span>
<a name="l00870"></a><a class="code" href="class_buffered_transformation.html#ae77dc2fddb3ff142effb00eff3217581">00870</a>                 <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="class_buffered_transformation.html#ae77dc2fddb3ff142effb00eff3217581" title="set propagation of automatically generated and transferred signals">SetAutoSignalPropagation</a>(<span class="keywordtype">int</span> propagation) {}
<a name="l00871"></a>00871 <span class="comment"></span>
<a name="l00872"></a>00872 <span class="comment">                //!</span>
<a name="l00873"></a>00873 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">int</span> GetAutoSignalPropagation()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}
<a name="l00874"></a>00874 <span class="keyword">public</span>:
<a name="l00875"></a>00875 
<a name="l00876"></a>00876 <span class="preprocessor">#ifdef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY</span>
<a name="l00877"></a>00877 <span class="preprocessor"></span>                <span class="keywordtype">void</span> Close() {MessageEnd();}
<a name="l00878"></a>00878 <span class="preprocessor">#endif</span>
<a name="l00879"></a>00879 <span class="preprocessor"></span><span class="comment">        //@}</span>
<a name="l00880"></a>00880 <span class="comment"></span><span class="comment"></span>
<a name="l00881"></a>00881 <span class="comment">        //!     \name RETRIEVAL OF ONE MESSAGE</span>
<a name="l00882"></a>00882 <span class="comment"></span><span class="comment">        //@{</span>
<a name="l00883"></a>00883 <span class="comment"></span><span class="comment">                //! returns number of bytes that is currently ready for retrieval</span>
<a name="l00884"></a>00884 <span class="comment"></span><span class="comment">                /*! All retrieval functions return the actual number of bytes</span>
<a name="l00885"></a>00885 <span class="comment">                        retrieved, which is the lesser of the request number and</span>
<a name="l00886"></a>00886 <span class="comment">                        MaxRetrievable(). */</span>
<a name="l00887"></a>00887                 <span class="keyword">virtual</span> lword MaxRetrievable() <span class="keyword">const</span>;
<a name="l00888"></a>00888 <span class="comment"></span>
<a name="l00889"></a>00889 <span class="comment">                //! returns whether any bytes are currently ready for retrieval</span>
<a name="l00890"></a>00890 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">bool</span> AnyRetrievable() <span class="keyword">const</span>;
<a name="l00891"></a>00891 <span class="comment"></span>
<a name="l00892"></a>00892 <span class="comment">                //! try to retrieve a single byte</span>
<a name="l00893"></a>00893 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> Get(byte &amp;outByte);<span class="comment"></span>
<a name="l00894"></a>00894 <span class="comment">                //! try to retrieve multiple bytes</span>
<a name="l00895"></a>00895 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> Get(byte *outString, <span class="keywordtype">size_t</span> getMax);
<a name="l00896"></a>00896 <span class="comment"></span>
<a name="l00897"></a>00897 <span class="comment">                //! peek at the next byte without removing it from the output buffer</span>
<a name="l00898"></a>00898 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> Peek(byte &amp;outByte) <span class="keyword">const</span>;<span class="comment"></span>
<a name="l00899"></a>00899 <span class="comment">                //! peek at multiple bytes without removing them from the output buffer</span>
<a name="l00900"></a>00900 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> Peek(byte *outString, <span class="keywordtype">size_t</span> peekMax) <span class="keyword">const</span>;
<a name="l00901"></a>00901 <span class="comment"></span>
<a name="l00902"></a>00902 <span class="comment">                //! try to retrieve a 16-bit word</span>
<a name="l00903"></a>00903 <span class="comment"></span>                <span class="keywordtype">size_t</span> GetWord16(word16 &amp;value, ByteOrder order=BIG_ENDIAN_ORDER);<span class="comment"></span>
<a name="l00904"></a>00904 <span class="comment">                //! try to retrieve a 32-bit word</span>
<a name="l00905"></a>00905 <span class="comment"></span>                <span class="keywordtype">size_t</span> GetWord32(word32 &amp;value, ByteOrder order=BIG_ENDIAN_ORDER);
<a name="l00906"></a>00906 <span class="comment"></span>
<a name="l00907"></a>00907 <span class="comment">                //! try to peek at a 16-bit word</span>
<a name="l00908"></a>00908 <span class="comment"></span>                <span class="keywordtype">size_t</span> PeekWord16(word16 &amp;value, ByteOrder order=BIG_ENDIAN_ORDER) <span class="keyword">const</span>;<span class="comment"></span>
<a name="l00909"></a>00909 <span class="comment">                //! try to peek at a 32-bit word</span>
<a name="l00910"></a>00910 <span class="comment"></span>                <span class="keywordtype">size_t</span> PeekWord32(word32 &amp;value, ByteOrder order=BIG_ENDIAN_ORDER) <span class="keyword">const</span>;
<a name="l00911"></a>00911 <span class="comment"></span>
<a name="l00912"></a>00912 <span class="comment">                //! move transferMax bytes of the buffered output to target as input</span>
<a name="l00913"></a><a class="code" href="class_buffered_transformation.html#ac31ac5d2da7897fb097086496b85e6f5">00913</a> <span class="comment"></span>                lword TransferTo(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;target, lword transferMax=LWORD_MAX, <span class="keyword">const</span> std::string &amp;channel=DEFAULT_CHANNEL)
<a name="l00914"></a>00914                         {TransferTo2(target, transferMax, channel); <span class="keywordflow">return</span> transferMax;}
<a name="l00915"></a>00915 <span class="comment"></span>
<a name="l00916"></a>00916 <span class="comment">                //! discard skipMax bytes from the output buffer</span>
<a name="l00917"></a>00917 <span class="comment"></span>                <span class="keyword">virtual</span> lword Skip(lword skipMax=LWORD_MAX);
<a name="l00918"></a>00918 <span class="comment"></span>
<a name="l00919"></a>00919 <span class="comment">                //! copy copyMax bytes of the buffered output to target as input</span>
<a name="l00920"></a><a class="code" href="class_buffered_transformation.html#a5253b8693ac9932f3862b71c9960903c">00920</a> <span class="comment"></span>                lword CopyTo(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;target, lword copyMax=LWORD_MAX, <span class="keyword">const</span> std::string &amp;channel=DEFAULT_CHANNEL)<span class="keyword"> const</span>
<a name="l00921"></a>00921 <span class="keyword">                        </span>{<span class="keywordflow">return</span> CopyRangeTo(target, 0, copyMax, channel);}
<a name="l00922"></a>00922 <span class="comment"></span>
<a name="l00923"></a>00923 <span class="comment">                //! copy copyMax bytes of the buffered output, starting at position (relative to current position), to target as input</span>
<a name="l00924"></a><a class="code" href="class_buffered_transformation.html#a1483b2879a70d26d0de568dd6081bb7b">00924</a> <span class="comment"></span>                lword CopyRangeTo(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;target, lword position, lword copyMax=LWORD_MAX, <span class="keyword">const</span> std::string &amp;channel=DEFAULT_CHANNEL)<span class="keyword"> const</span>
<a name="l00925"></a>00925 <span class="keyword">                        </span>{lword i = position; CopyRangeTo2(target, i, i+copyMax, channel); <span class="keywordflow">return</span> i-position;}
<a name="l00926"></a>00926 
<a name="l00927"></a>00927 <span class="preprocessor">#ifdef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY</span>
<a name="l00928"></a>00928 <span class="preprocessor"></span>                <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> MaxRetrieveable()<span class="keyword"> const </span>{<span class="keywordflow">return</span> MaxRetrievable();}
<a name="l00929"></a>00929 <span class="preprocessor">#endif</span>
<a name="l00930"></a>00930 <span class="preprocessor"></span><span class="comment">        //@}</span>
<a name="l00931"></a>00931 <span class="comment"></span><span class="comment"></span>
<a name="l00932"></a>00932 <span class="comment">        //!     \name RETRIEVAL OF MULTIPLE MESSAGES</span>
<a name="l00933"></a>00933 <span class="comment"></span><span class="comment">        //@{</span>
<a name="l00934"></a>00934 <span class="comment"></span><span class="comment">                //!</span>
<a name="l00935"></a>00935 <span class="comment"></span>                <span class="keyword">virtual</span> lword TotalBytesRetrievable() <span class="keyword">const</span>;<span class="comment"></span>
<a name="l00936"></a>00936 <span class="comment">                //! number of times MessageEnd() has been received minus messages retrieved or skipped</span>
<a name="l00937"></a>00937 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> NumberOfMessages() <span class="keyword">const</span>;<span class="comment"></span>
<a name="l00938"></a>00938 <span class="comment">                //! returns true if NumberOfMessages() &gt; 0</span>
<a name="l00939"></a>00939 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">bool</span> AnyMessages() <span class="keyword">const</span>;<span class="comment"></span>
<a name="l00940"></a>00940 <span class="comment">                //! start retrieving the next message</span>
<a name="l00941"></a>00941 <span class="comment"></span><span class="comment">                /*!</span>
<a name="l00942"></a>00942 <span class="comment">                        Returns false if no more messages exist or this message </span>
<a name="l00943"></a>00943 <span class="comment">                        is not completely retrieved.</span>
<a name="l00944"></a>00944 <span class="comment">                */</span>
<a name="l00945"></a>00945                 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> GetNextMessage();<span class="comment"></span>
<a name="l00946"></a>00946 <span class="comment">                //! skip count number of messages</span>
<a name="l00947"></a>00947 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> SkipMessages(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count=UINT_MAX);<span class="comment"></span>
<a name="l00948"></a>00948 <span class="comment">                //!</span>
<a name="l00949"></a>00949 <span class="comment"></span>                <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> TransferMessagesTo(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;target, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count=UINT_MAX, <span class="keyword">const</span> std::string &amp;channel=DEFAULT_CHANNEL)
<a name="l00950"></a>00950                         {TransferMessagesTo2(target, count, channel); <span class="keywordflow">return</span> count;}<span class="comment"></span>
<a name="l00951"></a>00951 <span class="comment">                //!</span>
<a name="l00952"></a>00952 <span class="comment"></span>                <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> CopyMessagesTo(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;target, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> count=UINT_MAX, <span class="keyword">const</span> std::string &amp;channel=DEFAULT_CHANNEL) <span class="keyword">const</span>;
<a name="l00953"></a>00953 <span class="comment"></span>
<a name="l00954"></a>00954 <span class="comment">                //!</span>
<a name="l00955"></a>00955 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">void</span> SkipAll();<span class="comment"></span>
<a name="l00956"></a>00956 <span class="comment">                //!</span>
<a name="l00957"></a>00957 <span class="comment"></span>                <span class="keywordtype">void</span> TransferAllTo(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;target, <span class="keyword">const</span> std::string &amp;channel=DEFAULT_CHANNEL)
<a name="l00958"></a>00958                         {TransferAllTo2(target, channel);}<span class="comment"></span>
<a name="l00959"></a>00959 <span class="comment">                //!</span>
<a name="l00960"></a>00960 <span class="comment"></span>                <span class="keywordtype">void</span> CopyAllTo(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;target, <span class="keyword">const</span> std::string &amp;channel=DEFAULT_CHANNEL) <span class="keyword">const</span>;
<a name="l00961"></a>00961 
<a name="l00962"></a>00962                 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> GetNextMessageSeries() {<span class="keywordflow">return</span> <span class="keyword">false</span>;}
<a name="l00963"></a>00963                 <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> NumberOfMessagesInThisSeries()<span class="keyword"> const </span>{<span class="keywordflow">return</span> NumberOfMessages();}
<a name="l00964"></a>00964                 <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> NumberOfMessageSeries()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}<span class="comment"></span>
<a name="l00965"></a>00965 <span class="comment">        //@}</span>
<a name="l00966"></a>00966 <span class="comment"></span><span class="comment"></span>
<a name="l00967"></a>00967 <span class="comment">        //!     \name NON-BLOCKING TRANSFER OF OUTPUT</span>
<a name="l00968"></a>00968 <span class="comment"></span><span class="comment">        //@{</span>
<a name="l00969"></a>00969 <span class="comment"></span><span class="comment">                //! upon return, byteCount contains number of bytes that have finished being transfered, and returns the number of bytes left in the current transfer block</span>
<a name="l00970"></a>00970 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> TransferTo2(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;target, lword &amp;byteCount, <span class="keyword">const</span> std::string &amp;channel=DEFAULT_CHANNEL, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>) =0;<span class="comment"></span>
<a name="l00971"></a>00971 <span class="comment">                //! upon return, begin contains the start position of data yet to be finished copying, and returns the number of bytes left in the current transfer block</span>
<a name="l00972"></a>00972 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> CopyRangeTo2(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;target, lword &amp;begin, lword end=LWORD_MAX, <span class="keyword">const</span> std::string &amp;channel=DEFAULT_CHANNEL, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>) <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l00973"></a>00973 <span class="comment">                //! upon return, messageCount contains number of messages that have finished being transfered, and returns the number of bytes left in the current transfer block</span>
<a name="l00974"></a>00974 <span class="comment"></span>                <span class="keywordtype">size_t</span> TransferMessagesTo2(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;target, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> &amp;messageCount, <span class="keyword">const</span> std::string &amp;channel=DEFAULT_CHANNEL, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>);<span class="comment"></span>
<a name="l00975"></a>00975 <span class="comment">                //! returns the number of bytes left in the current transfer block</span>
<a name="l00976"></a>00976 <span class="comment"></span>                <span class="keywordtype">size_t</span> TransferAllTo2(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;target, <span class="keyword">const</span> std::string &amp;channel=DEFAULT_CHANNEL, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>);<span class="comment"></span>
<a name="l00977"></a>00977 <span class="comment">        //@}</span>
<a name="l00978"></a>00978 <span class="comment"></span><span class="comment"></span>
<a name="l00979"></a>00979 <span class="comment">        //!     \name CHANNELS</span>
<a name="l00980"></a>00980 <span class="comment"></span><span class="comment">        //@{</span>
<a name="l00981"></a><a class="code" href="struct_buffered_transformation_1_1_no_channel_support.html">00981</a> <span class="comment"></span>                <span class="keyword">struct </span><a class="code" href="struct_buffered_transformation_1_1_no_channel_support.html">NoChannelSupport</a> : <span class="keyword">public</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>
<a name="l00982"></a>00982                         {<a class="code" href="struct_buffered_transformation_1_1_no_channel_support.html">NoChannelSupport</a>(<span class="keyword">const</span> std::string &amp;name) : <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(name + <span class="stringliteral">&quot;: this object doesn&apos;t support multiple channels&quot;</span>) {}};
<a name="l00983"></a><a class="code" href="struct_buffered_transformation_1_1_invalid_channel_name.html">00983</a>                 <span class="keyword">struct </span><a class="code" href="struct_buffered_transformation_1_1_invalid_channel_name.html">InvalidChannelName</a> : <span class="keyword">public</span> <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a>
<a name="l00984"></a>00984                         {<a class="code" href="struct_buffered_transformation_1_1_invalid_channel_name.html">InvalidChannelName</a>(<span class="keyword">const</span> std::string &amp;name, <span class="keyword">const</span> std::string &amp;channel) : <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a>(name + <span class="stringliteral">&quot;: unexpected channel name \&quot;&quot;</span> + channel + <span class="stringliteral">&quot;\&quot;&quot;</span>) {}};
<a name="l00985"></a>00985 
<a name="l00986"></a>00986                 <span class="keywordtype">size_t</span> ChannelPut(<span class="keyword">const</span> std::string &amp;channel, byte inByte, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>)
<a name="l00987"></a>00987                         {<span class="keywordflow">return</span> ChannelPut(channel, &amp;inByte, 1, blocking);}
<a name="l00988"></a>00988                 <span class="keywordtype">size_t</span> ChannelPut(<span class="keyword">const</span> std::string &amp;channel, <span class="keyword">const</span> byte *inString, <span class="keywordtype">size_t</span> length, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>)
<a name="l00989"></a>00989                         {<span class="keywordflow">return</span> ChannelPut2(channel, inString, length, 0, blocking);}
<a name="l00990"></a>00990 
<a name="l00991"></a>00991                 <span class="keywordtype">size_t</span> ChannelPutModifiable(<span class="keyword">const</span> std::string &amp;channel, byte *inString, <span class="keywordtype">size_t</span> length, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>)
<a name="l00992"></a>00992                         {<span class="keywordflow">return</span> ChannelPutModifiable2(channel, inString, length, 0, blocking);}
<a name="l00993"></a>00993 
<a name="l00994"></a>00994                 <span class="keywordtype">size_t</span> ChannelPutWord16(<span class="keyword">const</span> std::string &amp;channel, word16 value, ByteOrder order=BIG_ENDIAN_ORDER, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>);
<a name="l00995"></a>00995                 <span class="keywordtype">size_t</span> ChannelPutWord32(<span class="keyword">const</span> std::string &amp;channel, word32 value, ByteOrder order=BIG_ENDIAN_ORDER, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>);
<a name="l00996"></a>00996 
<a name="l00997"></a>00997                 <span class="keywordtype">bool</span> ChannelMessageEnd(<span class="keyword">const</span> std::string &amp;channel, <span class="keywordtype">int</span> propagation=-1, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>)
<a name="l00998"></a>00998                         {<span class="keywordflow">return</span> !!ChannelPut2(channel, NULL, 0, propagation &lt; 0 ? -1 : propagation+1, blocking);}
<a name="l00999"></a>00999                 <span class="keywordtype">size_t</span> ChannelPutMessageEnd(<span class="keyword">const</span> std::string &amp;channel, <span class="keyword">const</span> byte *inString, <span class="keywordtype">size_t</span> length, <span class="keywordtype">int</span> propagation=-1, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>)
<a name="l01000"></a>01000                         {<span class="keywordflow">return</span> ChannelPut2(channel, inString, length, propagation &lt; 0 ? -1 : propagation+1, blocking);}
<a name="l01001"></a>01001 
<a name="l01002"></a>01002                 <span class="keyword">virtual</span> byte * ChannelCreatePutSpace(<span class="keyword">const</span> std::string &amp;channel, <span class="keywordtype">size_t</span> &amp;size);
<a name="l01003"></a>01003 
<a name="l01004"></a>01004                 <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> ChannelPut2(<span class="keyword">const</span> std::string &amp;channel, <span class="keyword">const</span> byte *begin, <span class="keywordtype">size_t</span> length, <span class="keywordtype">int</span> messageEnd, <span class="keywordtype">bool</span> blocking);
<a name="l01005"></a>01005                 <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> ChannelPutModifiable2(<span class="keyword">const</span> std::string &amp;channel, byte *begin, <span class="keywordtype">size_t</span> length, <span class="keywordtype">int</span> messageEnd, <span class="keywordtype">bool</span> blocking);
<a name="l01006"></a>01006 
<a name="l01007"></a>01007                 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> ChannelFlush(<span class="keyword">const</span> std::string &amp;channel, <span class="keywordtype">bool</span> hardFlush, <span class="keywordtype">int</span> propagation=-1, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>);
<a name="l01008"></a>01008                 <span class="keyword">virtual</span> <span class="keywordtype">bool</span> ChannelMessageSeriesEnd(<span class="keyword">const</span> std::string &amp;channel, <span class="keywordtype">int</span> propagation=-1, <span class="keywordtype">bool</span> blocking=<span class="keyword">true</span>);
<a name="l01009"></a>01009 
<a name="l01010"></a>01010                 <span class="keyword">virtual</span> <span class="keywordtype">void</span> SetRetrievalChannel(<span class="keyword">const</span> std::string &amp;channel);<span class="comment"></span>
<a name="l01011"></a>01011 <span class="comment">        //@}</span>
<a name="l01012"></a>01012 <span class="comment"></span><span class="comment"></span>
<a name="l01013"></a>01013 <span class="comment">        //!     \name ATTACHMENT</span>
<a name="l01014"></a>01014 <span class="comment"></span><span class="comment">        /*! Some BufferedTransformation objects (e.g. Filter objects)</span>
<a name="l01015"></a>01015 <span class="comment">                allow other BufferedTransformation objects to be attached. When</span>
<a name="l01016"></a>01016 <span class="comment">                this is done, the first object instead of buffering its output,</span>
<a name="l01017"></a>01017 <span class="comment">                sents that output to the attached object as input. The entire</span>
<a name="l01018"></a>01018 <span class="comment">                attachment chain is deleted when the anchor object is destructed.</span>
<a name="l01019"></a>01019 <span class="comment">        */</span><span class="comment"></span>
<a name="l01020"></a>01020 <span class="comment">        //@{</span>
<a name="l01021"></a>01021 <span class="comment"></span><span class="comment">                //! returns whether this object allows attachment</span>
<a name="l01022"></a><a class="code" href="class_buffered_transformation.html#a20112606fc006c56f1561653cabd9542">01022</a> <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_buffered_transformation.html#a20112606fc006c56f1561653cabd9542" title="returns whether this object allows attachment">Attachable</a>() {<span class="keywordflow">return</span> <span class="keyword">false</span>;}<span class="comment"></span>
<a name="l01023"></a>01023 <span class="comment">                //! returns the object immediately attached to this object or NULL for no attachment</span>
<a name="l01024"></a><a class="code" href="class_buffered_transformation.html#aba6bbc169e26ed77a6bb5d50f91abda0">01024</a> <span class="comment"></span>                <span class="keyword">virtual</span> <a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> *<a class="code" href="class_buffered_transformation.html#aba6bbc169e26ed77a6bb5d50f91abda0" title="returns the object immediately attached to this object or NULL for no attachment">AttachedTransformation</a>() {assert(!Attachable()); <span class="keywordflow">return</span> 0;}<span class="comment"></span>
<a name="l01025"></a>01025 <span class="comment">                //!</span>
<a name="l01026"></a>01026 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> *AttachedTransformation()<span class="keyword"> const</span>
<a name="l01027"></a>01027 <span class="keyword">                        </span>{<span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span><a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> *<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;AttachedTransformation();}<span class="comment"></span>
<a name="l01028"></a>01028 <span class="comment">                //! delete the current attachment chain and replace it with newAttachment</span>
<a name="l01029"></a><a class="code" href="class_buffered_transformation.html#a424737ad6b93e393dc43c3edb1223c3d">01029</a> <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">void</span> Detach(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> *newAttachment = 0)
<a name="l01030"></a>01030                         {assert(!Attachable()); <span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">&quot;BufferedTransformation: this object is not attachable&quot;</span>);}<span class="comment"></span>
<a name="l01031"></a>01031 <span class="comment">                //! add newAttachment to the end of attachment chain</span>
<a name="l01032"></a>01032 <span class="comment"></span>                <span class="keyword">virtual</span> <span class="keywordtype">void</span> Attach(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> *newAttachment);<span class="comment"></span>
<a name="l01033"></a>01033 <span class="comment">        //@}</span>
<a name="l01034"></a>01034 <span class="comment"></span>
<a name="l01035"></a>01035 <span class="keyword">protected</span>:
<a name="l01036"></a>01036         <span class="keyword">static</span> <span class="keywordtype">int</span> DecrementPropagation(<span class="keywordtype">int</span> propagation)
<a name="l01037"></a>01037                 {<span class="keywordflow">return</span> propagation != 0 ? propagation - 1 : 0;}
<a name="l01038"></a>01038 
<a name="l01039"></a>01039 <span class="keyword">private</span>:
<a name="l01040"></a>01040         byte m_buf[4];  <span class="comment">// for ChannelPutWord16 and ChannelPutWord32, to ensure buffer isn&apos;t deallocated before non-blocking operation completes</span>
<a name="l01041"></a>01041 };
<a name="l01042"></a>01042 <span class="comment"></span>
<a name="l01043"></a>01043 <span class="comment">//! returns a reference to a BufferedTransformation object that discards all input</span>
<a name="l01044"></a>01044 <span class="comment"></span><a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp; TheBitBucket();
<a name="l01045"></a>01045 <span class="comment"></span>
<a name="l01046"></a>01046 <span class="comment">//! interface for crypto material, such as public and private keys, and crypto parameters</span>
<a name="l01047"></a>01047 <span class="comment"></span>
<a name="l01048"></a><a class="code" href="class_crypto_material.html">01048</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_crypto_material.html" title="interface for crypto material, such as public and private keys, and crypto parameters...">CryptoMaterial</a> : <span class="keyword">public</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a>
<a name="l01049"></a>01049 {
<a name="l01050"></a>01050 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l01051"></a>01051 <span class="comment">        //! exception thrown when invalid crypto material is detected</span>
<a name="l01052"></a><a class="code" href="class_crypto_material_1_1_invalid_material.html">01052</a> <span class="comment"></span>        <span class="keyword">class </span>CRYPTOPP_DLL <a class="code" href="class_crypto_material_1_1_invalid_material.html" title="exception thrown when invalid crypto material is detected">InvalidMaterial</a> : <span class="keyword">public</span> <a class="code" href="class_invalid_data_format.html" title="exception thrown when input data is received that doesn&amp;#39;t conform to expected...">InvalidDataFormat</a>
<a name="l01053"></a>01053         {
<a name="l01054"></a>01054         <span class="keyword">public</span>:
<a name="l01055"></a>01055                 <span class="keyword">explicit</span> <a class="code" href="class_crypto_material_1_1_invalid_material.html" title="exception thrown when invalid crypto material is detected">InvalidMaterial</a>(<span class="keyword">const</span> std::string &amp;s) : <a class="code" href="class_invalid_data_format.html" title="exception thrown when input data is received that doesn&amp;#39;t conform to expected...">InvalidDataFormat</a>(s) {}
<a name="l01056"></a>01056         };
<a name="l01057"></a>01057 <span class="comment"></span>
<a name="l01058"></a>01058 <span class="comment">        //! assign values from source to this object</span>
<a name="l01059"></a>01059 <span class="comment"></span><span class="comment">        /*! \note This function can be used to create a public key from a private key. */</span>
<a name="l01060"></a>01060         <span class="keyword">virtual</span> <span class="keywordtype">void</span> AssignFrom(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;source) =0;
<a name="l01061"></a>01061 <span class="comment"></span>
<a name="l01062"></a>01062 <span class="comment">        //! check this object for errors</span>
<a name="l01063"></a>01063 <span class="comment"></span><span class="comment">        /*! \param level denotes the level of thoroughness:</span>
<a name="l01064"></a>01064 <span class="comment">                0 - using this object won&apos;t cause a crash or exception (rng is ignored)</span>
<a name="l01065"></a>01065 <span class="comment">                1 - this object will probably function (encrypt, sign, etc.) correctly (but may not check for weak keys and such)</span>
<a name="l01066"></a>01066 <span class="comment">                2 - make sure this object will function correctly, and do reasonable security checks</span>
<a name="l01067"></a>01067 <span class="comment">                3 - do checks that may take a long time</span>
<a name="l01068"></a>01068 <span class="comment">                \return true if the tests pass */</span>
<a name="l01069"></a>01069         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Validate(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> level) <span class="keyword">const</span> =0;
<a name="l01070"></a>01070 <span class="comment"></span>
<a name="l01071"></a>01071 <span class="comment">        //! throws InvalidMaterial if this object fails Validate() test</span>
<a name="l01072"></a><a class="code" href="class_crypto_material.html#a6843c1d4563fbb0208deb22624e12cce">01072</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> ThrowIfInvalid(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> level)<span class="keyword"> const</span>
<a name="l01073"></a>01073 <span class="keyword">                </span>{<span class="keywordflow">if</span> (!Validate(rng, level)) <span class="keywordflow">throw</span> <a class="code" href="class_crypto_material_1_1_invalid_material.html" title="exception thrown when invalid crypto material is detected">InvalidMaterial</a>(<span class="stringliteral">&quot;CryptoMaterial: this object contains invalid values&quot;</span>);}
<a name="l01074"></a>01074 
<a name="l01075"></a>01075 <span class="comment">//      virtual std::vector&lt;std::string&gt; GetSupportedFormats(bool includeSaveOnly=false, bool includeLoadOnly=false);</span>
<a name="l01076"></a>01076 <span class="comment"></span>
<a name="l01077"></a>01077 <span class="comment">        //! save key into a BufferedTransformation</span>
<a name="l01078"></a><a class="code" href="class_crypto_material.html#a690c7ce3e765a502b29b47a08c1a4e7b">01078</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> Save(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>
<a name="l01079"></a>01079 <span class="keyword">                </span>{<span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">&quot;CryptoMaterial: this object does not support saving&quot;</span>);}
<a name="l01080"></a>01080 <span class="comment"></span>
<a name="l01081"></a>01081 <span class="comment">        //! load key from a BufferedTransformation</span>
<a name="l01082"></a>01082 <span class="comment"></span><span class="comment">        /*! \throws KeyingErr if decode fails</span>
<a name="l01083"></a>01083 <span class="comment">                \note Generally does not check that the key is valid.</span>
<a name="l01084"></a>01084 <span class="comment">                        Call ValidateKey() or ThrowIfInvalidKey() to check that. */</span>
<a name="l01085"></a><a class="code" href="class_crypto_material.html#ae7a94de4c3d3822070db5babbdf8b113">01085</a>         <span class="keyword">virtual</span> <span class="keywordtype">void</span> Load(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt)
<a name="l01086"></a>01086                 {<span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">&quot;CryptoMaterial: this object does not support loading&quot;</span>);}
<a name="l01087"></a>01087 <span class="comment"></span>
<a name="l01088"></a>01088 <span class="comment">        //! \return whether this object supports precomputation</span>
<a name="l01089"></a><a class="code" href="class_crypto_material.html#a64ab4ff4adfcfc2da59706ac32895b50">01089</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_crypto_material.html#a64ab4ff4adfcfc2da59706ac32895b50">SupportsPrecomputation</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">false</span>;}<span class="comment"></span>
<a name="l01090"></a>01090 <span class="comment">        //! do precomputation</span>
<a name="l01091"></a>01091 <span class="comment"></span><span class="comment">        /*! The exact semantics of Precompute() is varies, but</span>
<a name="l01092"></a>01092 <span class="comment">                typically it means calculate a table of n objects</span>
<a name="l01093"></a>01093 <span class="comment">                that can be used later to speed up computation. */</span>
<a name="l01094"></a><a class="code" href="class_crypto_material.html#a39e512d2ea70d0e967db98c19994a7fd">01094</a>         <span class="keyword">virtual</span> <span class="keywordtype">void</span> Precompute(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n)
<a name="l01095"></a>01095                 {assert(!SupportsPrecomputation()); <span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">&quot;CryptoMaterial: this object does not support precomputation&quot;</span>);}<span class="comment"></span>
<a name="l01096"></a>01096 <span class="comment">        //! retrieve previously saved precomputation</span>
<a name="l01097"></a><a class="code" href="class_crypto_material.html#a2911ebd9a28efa43dab71e5c12e2c90d">01097</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> LoadPrecomputation(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;storedPrecomputation)
<a name="l01098"></a>01098                 {assert(!SupportsPrecomputation()); <span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">&quot;CryptoMaterial: this object does not support precomputation&quot;</span>);}<span class="comment"></span>
<a name="l01099"></a>01099 <span class="comment">        //! save precomputation for later use</span>
<a name="l01100"></a><a class="code" href="class_crypto_material.html#a839d0f7f3e256b625caf6fd792925ad4">01100</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> SavePrecomputation(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;storedPrecomputation)<span class="keyword"> const</span>
<a name="l01101"></a>01101 <span class="keyword">                </span>{assert(!SupportsPrecomputation()); <span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">&quot;CryptoMaterial: this object does not support precomputation&quot;</span>);}
<a name="l01102"></a>01102 
<a name="l01103"></a>01103         <span class="comment">// for internal library use</span>
<a name="l01104"></a>01104         <span class="keywordtype">void</span> DoQuickSanityCheck()<span class="keyword"> const </span>{ThrowIfInvalid(NullRNG(), 0);}
<a name="l01105"></a>01105 
<a name="l01106"></a>01106 <span class="preprocessor">#if (defined(__SUNPRO_CC) &amp;&amp; __SUNPRO_CC &lt; 0x590)</span>
<a name="l01107"></a>01107 <span class="preprocessor"></span>        <span class="comment">// Sun Studio 11/CC 5.8 workaround: it generates incorrect code when casting to an empty virtual base class</span>
<a name="l01108"></a>01108         <span class="keywordtype">char</span> m_sunCCworkaround;
<a name="l01109"></a>01109 <span class="preprocessor">#endif</span>
<a name="l01110"></a>01110 <span class="preprocessor"></span>};
<a name="l01111"></a>01111 <span class="comment"></span>
<a name="l01112"></a>01112 <span class="comment">//! interface for generatable crypto material, such as private keys and crypto parameters</span>
<a name="l01113"></a>01113 <span class="comment"></span>
<a name="l01114"></a><a class="code" href="class_generatable_crypto_material.html">01114</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_generatable_crypto_material.html" title="interface for generatable crypto material, such as private keys and crypto parameters...">GeneratableCryptoMaterial</a> : <span class="keyword">virtual</span> <span class="keyword">public</span> <a class="code" href="class_crypto_material.html" title="interface for crypto material, such as public and private keys, and crypto parameters...">CryptoMaterial</a>
<a name="l01115"></a>01115 {
<a name="l01116"></a>01116 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l01117"></a>01117 <span class="comment">        //! generate a random key or crypto parameters</span>
<a name="l01118"></a>01118 <span class="comment"></span><span class="comment">        /*! \throws KeyingErr if algorithm parameters are invalid, or if a key can&apos;t be generated</span>
<a name="l01119"></a>01119 <span class="comment">                (e.g., if this is a public key object) */</span>
<a name="l01120"></a><a class="code" href="class_generatable_crypto_material.html#abe368b52db1ca7079b690f2d6e605f7a">01120</a>         <span class="keyword">virtual</span> <span class="keywordtype">void</span> GenerateRandom(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;params = g_nullNameValuePairs)
<a name="l01121"></a>01121                 {<span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">&quot;GeneratableCryptoMaterial: this object does not support key/parameter generation&quot;</span>);}
<a name="l01122"></a>01122 <span class="comment"></span>
<a name="l01123"></a>01123 <span class="comment">        //! calls the above function with a NameValuePairs object that just specifies &quot;KeySize&quot;</span>
<a name="l01124"></a>01124 <span class="comment"></span>        <span class="keywordtype">void</span> GenerateRandomWithKeySize(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> keySize);
<a name="l01125"></a>01125 };
<a name="l01126"></a>01126 <span class="comment"></span>
<a name="l01127"></a>01127 <span class="comment">//! interface for public keys</span>
<a name="l01128"></a>01128 <span class="comment"></span>
<a name="l01129"></a><a class="code" href="class_public_key.html">01129</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_public_key.html" title="interface for public keys">PublicKey</a> : <span class="keyword">virtual</span> <span class="keyword">public</span> <a class="code" href="class_crypto_material.html" title="interface for crypto material, such as public and private keys, and crypto parameters...">CryptoMaterial</a>
<a name="l01130"></a>01130 {
<a name="l01131"></a>01131 };
<a name="l01132"></a>01132 <span class="comment"></span>
<a name="l01133"></a>01133 <span class="comment">//! interface for private keys</span>
<a name="l01134"></a>01134 <span class="comment"></span>
<a name="l01135"></a><a class="code" href="class_private_key.html">01135</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_private_key.html" title="interface for private keys">PrivateKey</a> : <span class="keyword">public</span> <a class="code" href="class_generatable_crypto_material.html" title="interface for generatable crypto material, such as private keys and crypto parameters...">GeneratableCryptoMaterial</a>
<a name="l01136"></a>01136 {
<a name="l01137"></a>01137 };
<a name="l01138"></a>01138 <span class="comment"></span>
<a name="l01139"></a>01139 <span class="comment">//! interface for crypto prameters</span>
<a name="l01140"></a>01140 <span class="comment"></span>
<a name="l01141"></a><a class="code" href="class_crypto_parameters.html">01141</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_crypto_parameters.html" title="interface for crypto prameters">CryptoParameters</a> : <span class="keyword">public</span> <a class="code" href="class_generatable_crypto_material.html" title="interface for generatable crypto material, such as private keys and crypto parameters...">GeneratableCryptoMaterial</a>
<a name="l01142"></a>01142 {
<a name="l01143"></a>01143 };
<a name="l01144"></a>01144 <span class="comment"></span>
<a name="l01145"></a>01145 <span class="comment">//! interface for asymmetric algorithms</span>
<a name="l01146"></a>01146 <span class="comment"></span>
<a name="l01147"></a><a class="code" href="class_asymmetric_algorithm.html">01147</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_asymmetric_algorithm.html" title="interface for asymmetric algorithms">AsymmetricAlgorithm</a> : <span class="keyword">public</span> <a class="code" href="class_algorithm.html" title="interface for all crypto algorithms">Algorithm</a>
<a name="l01148"></a>01148 {
<a name="l01149"></a>01149 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l01150"></a>01150 <span class="comment">        //! returns a reference to the crypto material used by this object</span>
<a name="l01151"></a>01151 <span class="comment"></span>        <span class="keyword">virtual</span> <a class="code" href="class_crypto_material.html" title="interface for crypto material, such as public and private keys, and crypto parameters...">CryptoMaterial</a> &amp; AccessMaterial() =0;<span class="comment"></span>
<a name="l01152"></a>01152 <span class="comment">        //! returns a const reference to the crypto material used by this object</span>
<a name="l01153"></a>01153 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="class_crypto_material.html" title="interface for crypto material, such as public and private keys, and crypto parameters...">CryptoMaterial</a> &amp; GetMaterial() <span class="keyword">const</span> =0;
<a name="l01154"></a>01154 <span class="comment"></span>
<a name="l01155"></a>01155 <span class="comment">        //! for backwards compatibility, calls AccessMaterial().Load(bt)</span>
<a name="l01156"></a><a class="code" href="class_asymmetric_algorithm.html#a522dbfcd5c1a46bf1be301cec26d6534">01156</a> <span class="comment"></span>        <span class="keywordtype">void</span> BERDecode(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt)
<a name="l01157"></a>01157                 {AccessMaterial().Load(bt);}<span class="comment"></span>
<a name="l01158"></a>01158 <span class="comment">        //! for backwards compatibility, calls GetMaterial().Save(bt)</span>
<a name="l01159"></a><a class="code" href="class_asymmetric_algorithm.html#a2d704079890783422b0a44653480ab83">01159</a> <span class="comment"></span>        <span class="keywordtype">void</span> DEREncode(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt)<span class="keyword"> const</span>
<a name="l01160"></a>01160 <span class="keyword">                </span>{GetMaterial().Save(bt);}
<a name="l01161"></a>01161 };
<a name="l01162"></a>01162 <span class="comment"></span>
<a name="l01163"></a>01163 <span class="comment">//! interface for asymmetric algorithms using public keys</span>
<a name="l01164"></a>01164 <span class="comment"></span>
<a name="l01165"></a><a class="code" href="class_public_key_algorithm.html">01165</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_public_key_algorithm.html" title="interface for asymmetric algorithms using public keys">PublicKeyAlgorithm</a> : <span class="keyword">public</span> <a class="code" href="class_asymmetric_algorithm.html" title="interface for asymmetric algorithms">AsymmetricAlgorithm</a>
<a name="l01166"></a>01166 {
<a name="l01167"></a>01167 <span class="keyword">public</span>:
<a name="l01168"></a>01168         <span class="comment">// VC60 workaround: no co-variant return type</span>
<a name="l01169"></a><a class="code" href="class_public_key_algorithm.html#a74b77db3086e07caf5506fda9ec204e7">01169</a>         <a class="code" href="class_crypto_material.html" title="interface for crypto material, such as public and private keys, and crypto parameters...">CryptoMaterial</a> &amp; <a class="code" href="class_public_key_algorithm.html#a74b77db3086e07caf5506fda9ec204e7" title="returns a reference to the crypto material used by this object">AccessMaterial</a>() {<span class="keywordflow">return</span> AccessPublicKey();}
<a name="l01170"></a><a class="code" href="class_public_key_algorithm.html#aadbb6acca8905a61d75f1951d53a90e5">01170</a>         <span class="keyword">const</span> <a class="code" href="class_crypto_material.html" title="interface for crypto material, such as public and private keys, and crypto parameters...">CryptoMaterial</a> &amp; <a class="code" href="class_public_key_algorithm.html#aadbb6acca8905a61d75f1951d53a90e5" title="returns a const reference to the crypto material used by this object">GetMaterial</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> GetPublicKey();}
<a name="l01171"></a>01171 
<a name="l01172"></a>01172         <span class="keyword">virtual</span> <a class="code" href="class_public_key.html" title="interface for public keys">PublicKey</a> &amp; AccessPublicKey() =0;
<a name="l01173"></a>01173         <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="class_public_key.html" title="interface for public keys">PublicKey</a> &amp; GetPublicKey()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span><a class="code" href="class_public_key_algorithm.html" title="interface for asymmetric algorithms using public keys">PublicKeyAlgorithm</a> *<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;AccessPublicKey();}
<a name="l01174"></a>01174 };
<a name="l01175"></a>01175 <span class="comment"></span>
<a name="l01176"></a>01176 <span class="comment">//! interface for asymmetric algorithms using private keys</span>
<a name="l01177"></a>01177 <span class="comment"></span>
<a name="l01178"></a><a class="code" href="class_private_key_algorithm.html">01178</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_private_key_algorithm.html" title="interface for asymmetric algorithms using private keys">PrivateKeyAlgorithm</a> : <span class="keyword">public</span> <a class="code" href="class_asymmetric_algorithm.html" title="interface for asymmetric algorithms">AsymmetricAlgorithm</a>
<a name="l01179"></a>01179 {
<a name="l01180"></a>01180 <span class="keyword">public</span>:
<a name="l01181"></a><a class="code" href="class_private_key_algorithm.html#a48cf4528f16263f2200d5b908a0b8ffb">01181</a>         <a class="code" href="class_crypto_material.html" title="interface for crypto material, such as public and private keys, and crypto parameters...">CryptoMaterial</a> &amp; <a class="code" href="class_private_key_algorithm.html#a48cf4528f16263f2200d5b908a0b8ffb" title="returns a reference to the crypto material used by this object">AccessMaterial</a>() {<span class="keywordflow">return</span> AccessPrivateKey();}
<a name="l01182"></a><a class="code" href="class_private_key_algorithm.html#a0199217f43af73a6ad78fe1303903fe3">01182</a>         <span class="keyword">const</span> <a class="code" href="class_crypto_material.html" title="interface for crypto material, such as public and private keys, and crypto parameters...">CryptoMaterial</a> &amp; <a class="code" href="class_private_key_algorithm.html#a0199217f43af73a6ad78fe1303903fe3" title="returns a const reference to the crypto material used by this object">GetMaterial</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> GetPrivateKey();}
<a name="l01183"></a>01183 
<a name="l01184"></a>01184         <span class="keyword">virtual</span> <a class="code" href="class_private_key.html" title="interface for private keys">PrivateKey</a> &amp; AccessPrivateKey() =0;
<a name="l01185"></a>01185         <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="class_private_key.html" title="interface for private keys">PrivateKey</a> &amp; GetPrivateKey()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span><a class="code" href="class_private_key_algorithm.html" title="interface for asymmetric algorithms using private keys">PrivateKeyAlgorithm</a> *<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;AccessPrivateKey();}
<a name="l01186"></a>01186 };
<a name="l01187"></a>01187 <span class="comment"></span>
<a name="l01188"></a>01188 <span class="comment">//! interface for key agreement algorithms</span>
<a name="l01189"></a>01189 <span class="comment"></span>
<a name="l01190"></a><a class="code" href="class_key_agreement_algorithm.html">01190</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_key_agreement_algorithm.html" title="interface for key agreement algorithms">KeyAgreementAlgorithm</a> : <span class="keyword">public</span> <a class="code" href="class_asymmetric_algorithm.html" title="interface for asymmetric algorithms">AsymmetricAlgorithm</a>
<a name="l01191"></a>01191 {
<a name="l01192"></a>01192 <span class="keyword">public</span>:
<a name="l01193"></a><a class="code" href="class_key_agreement_algorithm.html#ab9c52198ff0dd877243c9520d96beaaa">01193</a>         <a class="code" href="class_crypto_material.html" title="interface for crypto material, such as public and private keys, and crypto parameters...">CryptoMaterial</a> &amp; <a class="code" href="class_key_agreement_algorithm.html#ab9c52198ff0dd877243c9520d96beaaa" title="returns a reference to the crypto material used by this object">AccessMaterial</a>() {<span class="keywordflow">return</span> AccessCryptoParameters();}
<a name="l01194"></a><a class="code" href="class_key_agreement_algorithm.html#aeef052b9f5db7aa72d451c272e578e47">01194</a>         <span class="keyword">const</span> <a class="code" href="class_crypto_material.html" title="interface for crypto material, such as public and private keys, and crypto parameters...">CryptoMaterial</a> &amp; <a class="code" href="class_key_agreement_algorithm.html#aeef052b9f5db7aa72d451c272e578e47" title="returns a const reference to the crypto material used by this object">GetMaterial</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> GetCryptoParameters();}
<a name="l01195"></a>01195 
<a name="l01196"></a>01196         <span class="keyword">virtual</span> <a class="code" href="class_crypto_parameters.html" title="interface for crypto prameters">CryptoParameters</a> &amp; AccessCryptoParameters() =0;
<a name="l01197"></a>01197         <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code" href="class_crypto_parameters.html" title="interface for crypto prameters">CryptoParameters</a> &amp; GetCryptoParameters()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span><a class="code" href="class_key_agreement_algorithm.html" title="interface for key agreement algorithms">KeyAgreementAlgorithm</a> *<span class="keyword">&gt;</span>(<span class="keyword">this</span>)-&gt;AccessCryptoParameters();}
<a name="l01198"></a>01198 };
<a name="l01199"></a>01199 <span class="comment"></span>
<a name="l01200"></a>01200 <span class="comment">//! interface for public-key encryptors and decryptors</span>
<a name="l01201"></a>01201 <span class="comment"></span><span class="comment"></span>
<a name="l01202"></a>01202 <span class="comment">/*! This class provides an interface common to encryptors and decryptors</span>
<a name="l01203"></a>01203 <span class="comment">        for querying their plaintext and ciphertext lengths.</span>
<a name="l01204"></a>01204 <span class="comment">*/</span>
<a name="l01205"></a><a class="code" href="class_p_k___crypto_system.html">01205</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_p_k___crypto_system.html" title="interface for public-key encryptors and decryptors">PK_CryptoSystem</a>
<a name="l01206"></a>01206 {
<a name="l01207"></a>01207 <span class="keyword">public</span>:
<a name="l01208"></a>01208         <span class="keyword">virtual</span> ~<a class="code" href="class_p_k___crypto_system.html" title="interface for public-key encryptors and decryptors">PK_CryptoSystem</a>() {}
<a name="l01209"></a>01209 <span class="comment"></span>
<a name="l01210"></a>01210 <span class="comment">        //! maximum length of plaintext for a given ciphertext length</span>
<a name="l01211"></a>01211 <span class="comment"></span><span class="comment">        /*! \note This function returns 0 if ciphertextLength is not valid (too long or too short). */</span>
<a name="l01212"></a>01212         <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> MaxPlaintextLength(<span class="keywordtype">size_t</span> ciphertextLength) <span class="keyword">const</span> =0;
<a name="l01213"></a>01213 <span class="comment"></span>
<a name="l01214"></a>01214 <span class="comment">        //! calculate length of ciphertext given length of plaintext</span>
<a name="l01215"></a>01215 <span class="comment"></span><span class="comment">        /*! \note This function returns 0 if plaintextLength is not valid (too long). */</span>
<a name="l01216"></a>01216         <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> CiphertextLength(<span class="keywordtype">size_t</span> plaintextLength) <span class="keyword">const</span> =0;
<a name="l01217"></a>01217 <span class="comment"></span>
<a name="l01218"></a>01218 <span class="comment">        //! this object supports the use of the parameter with the given name</span>
<a name="l01219"></a>01219 <span class="comment"></span><span class="comment">        /*! some possible parameter names: EncodingParameters, KeyDerivationParameters */</span>
<a name="l01220"></a>01220         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> ParameterSupported(<span class="keyword">const</span> <span class="keywordtype">char</span> *name) <span class="keyword">const</span> =0;
<a name="l01221"></a>01221 <span class="comment"></span>
<a name="l01222"></a>01222 <span class="comment">        //! return fixed ciphertext length, if one exists, otherwise return 0</span>
<a name="l01223"></a>01223 <span class="comment"></span><span class="comment">        /*! \note &quot;Fixed&quot; here means length of ciphertext does not depend on length of plaintext.</span>
<a name="l01224"></a>01224 <span class="comment">                It usually does depend on the key length. */</span>
<a name="l01225"></a><a class="code" href="class_p_k___crypto_system.html#ac803af974c9849eea17d73ac48b38566">01225</a>         <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> <a class="code" href="class_p_k___crypto_system.html#ac803af974c9849eea17d73ac48b38566" title="return fixed ciphertext length, if one exists, otherwise return 0">FixedCiphertextLength</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}
<a name="l01226"></a>01226 <span class="comment"></span>
<a name="l01227"></a>01227 <span class="comment">        //! return maximum plaintext length given the fixed ciphertext length, if one exists, otherwise return 0</span>
<a name="l01228"></a><a class="code" href="class_p_k___crypto_system.html#a900d50ffe8e8956c4f2a7ec22d818603">01228</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> <a class="code" href="class_p_k___crypto_system.html#a900d50ffe8e8956c4f2a7ec22d818603" title="return maximum plaintext length given the fixed ciphertext length, if one exists...">FixedMaxPlaintextLength</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> 0;}
<a name="l01229"></a>01229 
<a name="l01230"></a>01230 <span class="preprocessor">#ifdef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY</span>
<a name="l01231"></a>01231 <span class="preprocessor"></span>        <span class="keywordtype">size_t</span> MaxPlainTextLength(<span class="keywordtype">size_t</span> cipherTextLength)<span class="keyword"> const </span>{<span class="keywordflow">return</span> MaxPlaintextLength(cipherTextLength);}
<a name="l01232"></a>01232         <span class="keywordtype">size_t</span> CipherTextLength(<span class="keywordtype">size_t</span> plainTextLength)<span class="keyword"> const </span>{<span class="keywordflow">return</span> CiphertextLength(plainTextLength);}
<a name="l01233"></a>01233 <span class="preprocessor">#endif</span>
<a name="l01234"></a>01234 <span class="preprocessor"></span>};
<a name="l01235"></a>01235 <span class="comment"></span>
<a name="l01236"></a>01236 <span class="comment">//! interface for public-key encryptors</span>
<a name="l01237"></a><a class="code" href="class_p_k___encryptor.html">01237</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_p_k___encryptor.html" title="interface for public-key encryptors">PK_Encryptor</a> : <span class="keyword">public</span> <a class="code" href="class_p_k___crypto_system.html" title="interface for public-key encryptors and decryptors">PK_CryptoSystem</a>, <span class="keyword">public</span> <a class="code" href="class_public_key_algorithm.html" title="interface for asymmetric algorithms using public keys">PublicKeyAlgorithm</a>
<a name="l01238"></a>01238 {
<a name="l01239"></a>01239 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l01240"></a>01240 <span class="comment">        //! exception thrown when trying to encrypt plaintext of invalid length</span>
<a name="l01241"></a><a class="code" href="class_p_k___encryptor_1_1_invalid_plaintext_length.html">01241</a> <span class="comment"></span>        <span class="keyword">class </span>CRYPTOPP_DLL <a class="code" href="class_p_k___encryptor_1_1_invalid_plaintext_length.html" title="exception thrown when trying to encrypt plaintext of invalid length">InvalidPlaintextLength</a> : <span class="keyword">public</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>
<a name="l01242"></a>01242         {
<a name="l01243"></a>01243         <span class="keyword">public</span>:
<a name="l01244"></a>01244                 <a class="code" href="class_p_k___encryptor_1_1_invalid_plaintext_length.html" title="exception thrown when trying to encrypt plaintext of invalid length">InvalidPlaintextLength</a>() : <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(OTHER_ERROR, <span class="stringliteral">&quot;PK_Encryptor: invalid plaintext length&quot;</span>) {}
<a name="l01245"></a>01245         };
<a name="l01246"></a>01246 <span class="comment"></span>
<a name="l01247"></a>01247 <span class="comment">        //! encrypt a byte string</span>
<a name="l01248"></a>01248 <span class="comment"></span><span class="comment">        /*! \pre CiphertextLength(plaintextLength) != 0 (i.e., plaintext isn&apos;t too long)</span>
<a name="l01249"></a>01249 <span class="comment">                \pre size of ciphertext == CiphertextLength(plaintextLength)</span>
<a name="l01250"></a>01250 <span class="comment">        */</span>
<a name="l01251"></a>01251         <span class="keyword">virtual</span> <span class="keywordtype">void</span> Encrypt(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, 
<a name="l01252"></a>01252                 <span class="keyword">const</span> byte *plaintext, <span class="keywordtype">size_t</span> plaintextLength, 
<a name="l01253"></a>01253                 byte *ciphertext, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;parameters = g_nullNameValuePairs) <span class="keyword">const</span> =0;
<a name="l01254"></a>01254 <span class="comment"></span>
<a name="l01255"></a>01255 <span class="comment">        //! create a new encryption filter</span>
<a name="l01256"></a>01256 <span class="comment"></span><span class="comment">        /*! \note The caller is responsible for deleting the returned pointer.</span>
<a name="l01257"></a>01257 <span class="comment">                \note Encoding parameters should be passed in the &quot;EP&quot; channel.</span>
<a name="l01258"></a>01258 <span class="comment">        */</span>
<a name="l01259"></a>01259         <span class="keyword">virtual</span> <a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> * CreateEncryptionFilter(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, 
<a name="l01260"></a>01260                 <a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> *attachment=NULL, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;parameters = g_nullNameValuePairs) <span class="keyword">const</span>;
<a name="l01261"></a>01261 };
<a name="l01262"></a>01262 <span class="comment"></span>
<a name="l01263"></a>01263 <span class="comment">//! interface for public-key decryptors</span>
<a name="l01264"></a>01264 <span class="comment"></span>
<a name="l01265"></a><a class="code" href="class_p_k___decryptor.html">01265</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_p_k___decryptor.html" title="interface for public-key decryptors">PK_Decryptor</a> : <span class="keyword">public</span> <a class="code" href="class_p_k___crypto_system.html" title="interface for public-key encryptors and decryptors">PK_CryptoSystem</a>, <span class="keyword">public</span> <a class="code" href="class_private_key_algorithm.html" title="interface for asymmetric algorithms using private keys">PrivateKeyAlgorithm</a>
<a name="l01266"></a>01266 {
<a name="l01267"></a>01267 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l01268"></a>01268 <span class="comment">        //! decrypt a byte string, and return the length of plaintext</span>
<a name="l01269"></a>01269 <span class="comment"></span><span class="comment">        /*! \pre size of plaintext == MaxPlaintextLength(ciphertextLength) bytes.</span>
<a name="l01270"></a>01270 <span class="comment">                \return the actual length of the plaintext, indication that decryption failed.</span>
<a name="l01271"></a>01271 <span class="comment">        */</span>
<a name="l01272"></a>01272         <span class="keyword">virtual</span> <a class="code" href="struct_decoding_result.html" title="used to return decoding results">DecodingResult</a> Decrypt(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, 
<a name="l01273"></a>01273                 <span class="keyword">const</span> byte *ciphertext, <span class="keywordtype">size_t</span> ciphertextLength, 
<a name="l01274"></a>01274                 byte *plaintext, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;parameters = g_nullNameValuePairs) <span class="keyword">const</span> =0;
<a name="l01275"></a>01275 <span class="comment"></span>
<a name="l01276"></a>01276 <span class="comment">        //! create a new decryption filter</span>
<a name="l01277"></a>01277 <span class="comment"></span><span class="comment">        /*! \note caller is responsible for deleting the returned pointer</span>
<a name="l01278"></a>01278 <span class="comment">        */</span>
<a name="l01279"></a>01279         <span class="keyword">virtual</span> <a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> * CreateDecryptionFilter(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, 
<a name="l01280"></a>01280                 <a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> *attachment=NULL, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;parameters = g_nullNameValuePairs) <span class="keyword">const</span>;
<a name="l01281"></a>01281 <span class="comment"></span>
<a name="l01282"></a>01282 <span class="comment">        //! decrypt a fixed size ciphertext</span>
<a name="l01283"></a><a class="code" href="class_p_k___decryptor.html#ae7dbfced7f2792685edac3feca348ba0">01283</a> <span class="comment"></span>        <a class="code" href="struct_decoding_result.html" title="used to return decoding results">DecodingResult</a> FixedLengthDecrypt(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> byte *ciphertext, byte *plaintext, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;parameters = g_nullNameValuePairs)<span class="keyword"> const</span>
<a name="l01284"></a>01284 <span class="keyword">                </span>{<span class="keywordflow">return</span> Decrypt(rng, ciphertext, <a class="code" href="class_p_k___crypto_system.html#ac803af974c9849eea17d73ac48b38566" title="return fixed ciphertext length, if one exists, otherwise return 0">FixedCiphertextLength</a>(), plaintext, parameters);}
<a name="l01285"></a>01285 };
<a name="l01286"></a>01286 
<a name="l01287"></a>01287 <span class="preprocessor">#ifdef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY</span>
<a name="l01288"></a>01288 <span class="preprocessor"></span><span class="keyword">typedef</span> <a class="code" href="class_p_k___crypto_system.html" title="interface for public-key encryptors and decryptors">PK_CryptoSystem</a> PK_FixedLengthCryptoSystem;
<a name="l01289"></a>01289 <span class="keyword">typedef</span> <a class="code" href="class_p_k___encryptor.html" title="interface for public-key encryptors">PK_Encryptor</a> PK_FixedLengthEncryptor;
<a name="l01290"></a>01290 <span class="keyword">typedef</span> <a class="code" href="class_p_k___decryptor.html" title="interface for public-key decryptors">PK_Decryptor</a> PK_FixedLengthDecryptor;
<a name="l01291"></a>01291 <span class="preprocessor">#endif</span>
<a name="l01292"></a>01292 <span class="preprocessor"></span><span class="comment"></span>
<a name="l01293"></a>01293 <span class="comment">//! interface for public-key signers and verifiers</span>
<a name="l01294"></a>01294 <span class="comment"></span><span class="comment"></span>
<a name="l01295"></a>01295 <span class="comment">/*! This class provides an interface common to signers and verifiers</span>
<a name="l01296"></a>01296 <span class="comment">        for querying scheme properties.</span>
<a name="l01297"></a>01297 <span class="comment">*/</span>
<a name="l01298"></a><a class="code" href="class_p_k___signature_scheme.html">01298</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_p_k___signature_scheme.html" title="interface for public-key signers and verifiers">PK_SignatureScheme</a>
<a name="l01299"></a>01299 {
<a name="l01300"></a>01300 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l01301"></a>01301 <span class="comment">        //! invalid key exception, may be thrown by any function in this class if the private or public key has a length that can&apos;t be used</span>
<a name="l01302"></a><a class="code" href="class_p_k___signature_scheme_1_1_invalid_key_length.html">01302</a> <span class="comment"></span>        <span class="keyword">class </span>CRYPTOPP_DLL <a class="code" href="class_p_k___signature_scheme_1_1_invalid_key_length.html" title="invalid key exception, may be thrown by any function in this class if the private...">InvalidKeyLength</a> : <span class="keyword">public</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>
<a name="l01303"></a>01303         {
<a name="l01304"></a>01304         <span class="keyword">public</span>:
<a name="l01305"></a>01305                 <a class="code" href="class_p_k___signature_scheme_1_1_invalid_key_length.html" title="invalid key exception, may be thrown by any function in this class if the private...">InvalidKeyLength</a>(<span class="keyword">const</span> std::string &amp;message) : <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(OTHER_ERROR, message) {}
<a name="l01306"></a>01306         };
<a name="l01307"></a>01307 <span class="comment"></span>
<a name="l01308"></a>01308 <span class="comment">        //! key too short exception, may be thrown by any function in this class if the private or public key is too short to sign or verify anything</span>
<a name="l01309"></a><a class="code" href="class_p_k___signature_scheme_1_1_key_too_short.html">01309</a> <span class="comment"></span>        <span class="keyword">class </span>CRYPTOPP_DLL <a class="code" href="class_p_k___signature_scheme_1_1_key_too_short.html" title="key too short exception, may be thrown by any function in this class if the private...">KeyTooShort</a> : <span class="keyword">public</span> <a class="code" href="class_p_k___signature_scheme_1_1_invalid_key_length.html" title="invalid key exception, may be thrown by any function in this class if the private...">InvalidKeyLength</a>
<a name="l01310"></a>01310         {
<a name="l01311"></a>01311         <span class="keyword">public</span>:
<a name="l01312"></a>01312                 <a class="code" href="class_p_k___signature_scheme_1_1_key_too_short.html" title="key too short exception, may be thrown by any function in this class if the private...">KeyTooShort</a>() : <a class="code" href="class_p_k___signature_scheme_1_1_invalid_key_length.html" title="invalid key exception, may be thrown by any function in this class if the private...">InvalidKeyLength</a>(<span class="stringliteral">&quot;PK_Signer: key too short for this signature scheme&quot;</span>) {}
<a name="l01313"></a>01313         };
<a name="l01314"></a>01314 
<a name="l01315"></a>01315         <span class="keyword">virtual</span> ~<a class="code" href="class_p_k___signature_scheme.html" title="interface for public-key signers and verifiers">PK_SignatureScheme</a>() {}
<a name="l01316"></a>01316 <span class="comment"></span>
<a name="l01317"></a>01317 <span class="comment">        //! signature length if it only depends on the key, otherwise 0</span>
<a name="l01318"></a>01318 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> <a class="code" href="class_p_k___signature_scheme.html#aab30ad8e2da2d706cf6c69bdac963afc" title="signature length if it only depends on the key, otherwise 0">SignatureLength</a>() <span class="keyword">const</span> =0;
<a name="l01319"></a>01319 <span class="comment"></span>
<a name="l01320"></a>01320 <span class="comment">        //! maximum signature length produced for a given length of recoverable message part</span>
<a name="l01321"></a><a class="code" href="class_p_k___signature_scheme.html#af04668d211a923ba03f2721c220272e9">01321</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> <a class="code" href="class_p_k___signature_scheme.html#af04668d211a923ba03f2721c220272e9" title="maximum signature length produced for a given length of recoverable message part">MaxSignatureLength</a>(<span class="keywordtype">size_t</span> recoverablePartLength = 0)<span class="keyword"> const </span>{<span class="keywordflow">return</span> <a class="code" href="class_p_k___signature_scheme.html#aab30ad8e2da2d706cf6c69bdac963afc" title="signature length if it only depends on the key, otherwise 0">SignatureLength</a>();}
<a name="l01322"></a>01322 <span class="comment"></span>
<a name="l01323"></a>01323 <span class="comment">        //! length of longest message that can be recovered, or 0 if this signature scheme does not support message recovery</span>
<a name="l01324"></a>01324 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> <a class="code" href="class_p_k___signature_scheme.html#a1f6a62ce468f172636f117ee0693038f" title="length of longest message that can be recovered, or 0 if this signature scheme does...">MaxRecoverableLength</a>() <span class="keyword">const</span> =0;
<a name="l01325"></a>01325 <span class="comment"></span>
<a name="l01326"></a>01326 <span class="comment">        //! length of longest message that can be recovered from a signature of given length, or 0 if this signature scheme does not support message recovery</span>
<a name="l01327"></a>01327 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> <a class="code" href="class_p_k___signature_scheme.html#a2f2a599ba385e63766d4a7f7ccf2a884" title="length of longest message that can be recovered from a signature of given length...">MaxRecoverableLengthFromSignatureLength</a>(<span class="keywordtype">size_t</span> signatureLength) <span class="keyword">const</span> =0;
<a name="l01328"></a>01328 <span class="comment"></span>
<a name="l01329"></a>01329 <span class="comment">        //! requires a random number generator to sign</span>
<a name="l01330"></a>01330 <span class="comment"></span><span class="comment">        /*! if this returns false, NullRNG() can be passed to functions that take RandomNumberGenerator &amp; */</span>
<a name="l01331"></a>01331         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_p_k___signature_scheme.html#adeb758d5f8ae8fad137d11ad1c5c60c0" title="requires a random number generator to sign">IsProbabilistic</a>() <span class="keyword">const</span> =0;
<a name="l01332"></a>01332 <span class="comment"></span>
<a name="l01333"></a>01333 <span class="comment">        //! whether or not a non-recoverable message part can be signed</span>
<a name="l01334"></a>01334 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_p_k___signature_scheme.html#a00368da9563ce49efc42b5cd0d9c7738" title="whether or not a non-recoverable message part can be signed">AllowNonrecoverablePart</a>() <span class="keyword">const</span> =0;
<a name="l01335"></a>01335 <span class="comment"></span>
<a name="l01336"></a>01336 <span class="comment">        //! if this function returns true, during verification you must input the signature before the message, otherwise you can input it at anytime */</span>
<a name="l01337"></a><a class="code" href="class_p_k___signature_scheme.html#a780bca8d276b62bd28a54382f208ce36">01337</a> <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_p_k___signature_scheme.html#a780bca8d276b62bd28a54382f208ce36" title="if this function returns true, during verification you must input the signature before...">SignatureUpfront</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">false</span>;}
<a name="l01338"></a>01338 <span class="comment"></span>
<a name="l01339"></a>01339 <span class="comment">        //! whether you must input the recoverable part before the non-recoverable part during signing</span>
<a name="l01340"></a>01340 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> <a class="code" href="class_p_k___signature_scheme.html#a168ca843d63ddababdf2cee3eaa02813" title="whether you must input the recoverable part before the non-recoverable part during...">RecoverablePartFirst</a>() <span class="keyword">const</span> =0;
<a name="l01341"></a>01341 };
<a name="l01342"></a>01342 <span class="comment"></span>
<a name="l01343"></a>01343 <span class="comment">//! interface for accumulating messages to be signed or verified</span>
<a name="l01344"></a>01344 <span class="comment"></span><span class="comment">/*! Only Update() should be called</span>
<a name="l01345"></a>01345 <span class="comment">        on this class. No other functions inherited from HashTransformation should be called.</span>
<a name="l01346"></a>01346 <span class="comment">*/</span>
<a name="l01347"></a><a class="code" href="class_p_k___message_accumulator.html">01347</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_p_k___message_accumulator.html" title="interface for accumulating messages to be signed or verified">PK_MessageAccumulator</a> : <span class="keyword">public</span> <a class="code" href="class_hash_transformation.html" title="interface for hash functions and data processing part of MACs">HashTransformation</a>
<a name="l01348"></a>01348 {
<a name="l01349"></a>01349 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l01350"></a>01350 <span class="comment">        //! should not be called on PK_MessageAccumulator</span>
<a name="l01351"></a><a class="code" href="class_p_k___message_accumulator.html#ad79cf196ecea7753beaa19d1ebf06928">01351</a> <span class="comment"></span>        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_hash_transformation.html#a9f42cc280bac76b884ad12615c0dabb5" title="size of the hash/digest/MAC returned by Final()">DigestSize</a>()<span class="keyword"> const</span>
<a name="l01352"></a>01352 <span class="keyword">                </span>{<span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">&quot;PK_MessageAccumulator: DigestSize() should not be called&quot;</span>);}<span class="comment"></span>
<a name="l01353"></a>01353 <span class="comment">        //! should not be called on PK_MessageAccumulator</span>
<a name="l01354"></a><a class="code" href="class_p_k___message_accumulator.html#a7b32ac9635d646003f7a258d46a65015">01354</a> <span class="comment"></span>        <span class="keywordtype">void</span> <a class="code" href="class_hash_transformation.html#a590ecda344aa0fb045abf42ec08823b2" title="truncated version of Final()">TruncatedFinal</a>(byte *digest, <span class="keywordtype">size_t</span> digestSize) 
<a name="l01355"></a>01355                 {<span class="keywordflow">throw</span> <a class="code" href="class_not_implemented.html" title="exception thrown by a class if a non-implemented method is called">NotImplemented</a>(<span class="stringliteral">&quot;PK_MessageAccumulator: TruncatedFinal() should not be called&quot;</span>);}
<a name="l01356"></a>01356 };
<a name="l01357"></a>01357 <span class="comment"></span>
<a name="l01358"></a>01358 <span class="comment">//! interface for public-key signers</span>
<a name="l01359"></a>01359 <span class="comment"></span>
<a name="l01360"></a><a class="code" href="class_p_k___signer.html">01360</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_p_k___signer.html" title="interface for public-key signers">PK_Signer</a> : <span class="keyword">public</span> <a class="code" href="class_p_k___signature_scheme.html" title="interface for public-key signers and verifiers">PK_SignatureScheme</a>, <span class="keyword">public</span> <a class="code" href="class_private_key_algorithm.html" title="interface for asymmetric algorithms using private keys">PrivateKeyAlgorithm</a>
<a name="l01361"></a>01361 {
<a name="l01362"></a>01362 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l01363"></a>01363 <span class="comment">        //! create a new HashTransformation to accumulate the message to be signed</span>
<a name="l01364"></a>01364 <span class="comment"></span>        <span class="keyword">virtual</span> <a class="code" href="class_p_k___message_accumulator.html" title="interface for accumulating messages to be signed or verified">PK_MessageAccumulator</a> * NewSignatureAccumulator(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng) <span class="keyword">const</span> =0;
<a name="l01365"></a>01365 
<a name="l01366"></a>01366         <span class="keyword">virtual</span> <span class="keywordtype">void</span> InputRecoverableMessage(<a class="code" href="class_p_k___message_accumulator.html" title="interface for accumulating messages to be signed or verified">PK_MessageAccumulator</a> &amp;messageAccumulator, <span class="keyword">const</span> byte *recoverableMessage, <span class="keywordtype">size_t</span> recoverableMessageLength) <span class="keyword">const</span> =0;
<a name="l01367"></a>01367 <span class="comment"></span>
<a name="l01368"></a>01368 <span class="comment">        //! sign and delete messageAccumulator (even in case of exception thrown)</span>
<a name="l01369"></a>01369 <span class="comment"></span><span class="comment">        /*! \pre size of signature == MaxSignatureLength()</span>
<a name="l01370"></a>01370 <span class="comment">                \return actual signature length</span>
<a name="l01371"></a>01371 <span class="comment">        */</span>
<a name="l01372"></a>01372         <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> Sign(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <a class="code" href="class_p_k___message_accumulator.html" title="interface for accumulating messages to be signed or verified">PK_MessageAccumulator</a> *messageAccumulator, byte *signature) <span class="keyword">const</span>;
<a name="l01373"></a>01373 <span class="comment"></span>
<a name="l01374"></a>01374 <span class="comment">        //! sign and restart messageAccumulator</span>
<a name="l01375"></a>01375 <span class="comment"></span><span class="comment">        /*! \pre size of signature == MaxSignatureLength()</span>
<a name="l01376"></a>01376 <span class="comment">                \return actual signature length</span>
<a name="l01377"></a>01377 <span class="comment">        */</span>
<a name="l01378"></a>01378         <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> SignAndRestart(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <a class="code" href="class_p_k___message_accumulator.html" title="interface for accumulating messages to be signed or verified">PK_MessageAccumulator</a> &amp;messageAccumulator, byte *signature, <span class="keywordtype">bool</span> restart=<span class="keyword">true</span>) <span class="keyword">const</span> =0;
<a name="l01379"></a>01379 <span class="comment"></span>
<a name="l01380"></a>01380 <span class="comment">        //! sign a message</span>
<a name="l01381"></a>01381 <span class="comment"></span><span class="comment">        /*! \pre size of signature == MaxSignatureLength()</span>
<a name="l01382"></a>01382 <span class="comment">                \return actual signature length</span>
<a name="l01383"></a>01383 <span class="comment">        */</span>
<a name="l01384"></a>01384         <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> SignMessage(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> byte *message, <span class="keywordtype">size_t</span> messageLen, byte *signature) <span class="keyword">const</span>;
<a name="l01385"></a>01385 <span class="comment"></span>
<a name="l01386"></a>01386 <span class="comment">        //! sign a recoverable message</span>
<a name="l01387"></a>01387 <span class="comment"></span><span class="comment">        /*! \pre size of signature == MaxSignatureLength(recoverableMessageLength)</span>
<a name="l01388"></a>01388 <span class="comment">                \return actual signature length</span>
<a name="l01389"></a>01389 <span class="comment">        */</span>
<a name="l01390"></a>01390         <span class="keyword">virtual</span> <span class="keywordtype">size_t</span> SignMessageWithRecovery(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> byte *recoverableMessage, <span class="keywordtype">size_t</span> recoverableMessageLength, 
<a name="l01391"></a>01391                 <span class="keyword">const</span> byte *nonrecoverableMessage, <span class="keywordtype">size_t</span> nonrecoverableMessageLength, byte *signature) <span class="keyword">const</span>;
<a name="l01392"></a>01392 };
<a name="l01393"></a>01393 <span class="comment"></span>
<a name="l01394"></a>01394 <span class="comment">//! interface for public-key signature verifiers</span>
<a name="l01395"></a>01395 <span class="comment"></span><span class="comment">/*! The Recover* functions throw NotImplemented if the signature scheme does not support</span>
<a name="l01396"></a>01396 <span class="comment">        message recovery.</span>
<a name="l01397"></a>01397 <span class="comment">        The Verify* functions throw InvalidDataFormat if the scheme does support message</span>
<a name="l01398"></a>01398 <span class="comment">        recovery and the signature contains a non-empty recoverable message part. The</span>
<a name="l01399"></a>01399 <span class="comment">        Recovery* functions should be used in that case.</span>
<a name="l01400"></a>01400 <span class="comment">*/</span>
<a name="l01401"></a><a class="code" href="class_p_k___verifier.html">01401</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_p_k___verifier.html" title="interface for public-key signature verifiers">PK_Verifier</a> : <span class="keyword">public</span> <a class="code" href="class_p_k___signature_scheme.html" title="interface for public-key signers and verifiers">PK_SignatureScheme</a>, <span class="keyword">public</span> <a class="code" href="class_public_key_algorithm.html" title="interface for asymmetric algorithms using public keys">PublicKeyAlgorithm</a>
<a name="l01402"></a>01402 {
<a name="l01403"></a>01403 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l01404"></a>01404 <span class="comment">        //! create a new HashTransformation to accumulate the message to be verified</span>
<a name="l01405"></a>01405 <span class="comment"></span>        <span class="keyword">virtual</span> <a class="code" href="class_p_k___message_accumulator.html" title="interface for accumulating messages to be signed or verified">PK_MessageAccumulator</a> * NewVerificationAccumulator() <span class="keyword">const</span> =0;
<a name="l01406"></a>01406 <span class="comment"></span>
<a name="l01407"></a>01407 <span class="comment">        //! input signature into a message accumulator</span>
<a name="l01408"></a>01408 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> InputSignature(<a class="code" href="class_p_k___message_accumulator.html" title="interface for accumulating messages to be signed or verified">PK_MessageAccumulator</a> &amp;messageAccumulator, <span class="keyword">const</span> byte *signature, <span class="keywordtype">size_t</span> signatureLength) <span class="keyword">const</span> =0;
<a name="l01409"></a>01409 <span class="comment"></span>
<a name="l01410"></a>01410 <span class="comment">        //! check whether messageAccumulator contains a valid signature and message, and delete messageAccumulator (even in case of exception thrown)</span>
<a name="l01411"></a>01411 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Verify(<a class="code" href="class_p_k___message_accumulator.html" title="interface for accumulating messages to be signed or verified">PK_MessageAccumulator</a> *messageAccumulator) <span class="keyword">const</span>;
<a name="l01412"></a>01412 <span class="comment"></span>
<a name="l01413"></a>01413 <span class="comment">        //! check whether messageAccumulator contains a valid signature and message, and restart messageAccumulator</span>
<a name="l01414"></a>01414 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> VerifyAndRestart(<a class="code" href="class_p_k___message_accumulator.html" title="interface for accumulating messages to be signed or verified">PK_MessageAccumulator</a> &amp;messageAccumulator) <span class="keyword">const</span> =0;
<a name="l01415"></a>01415 <span class="comment"></span>
<a name="l01416"></a>01416 <span class="comment">        //! check whether input signature is a valid signature for input message</span>
<a name="l01417"></a>01417 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> VerifyMessage(<span class="keyword">const</span> byte *message, <span class="keywordtype">size_t</span> messageLen, 
<a name="l01418"></a>01418                 <span class="keyword">const</span> byte *signature, <span class="keywordtype">size_t</span> signatureLength) <span class="keyword">const</span>;
<a name="l01419"></a>01419 <span class="comment"></span>
<a name="l01420"></a>01420 <span class="comment">        //! recover a message from its signature</span>
<a name="l01421"></a>01421 <span class="comment"></span><span class="comment">        /*! \pre size of recoveredMessage == MaxRecoverableLengthFromSignatureLength(signatureLength)</span>
<a name="l01422"></a>01422 <span class="comment">        */</span>
<a name="l01423"></a>01423         <span class="keyword">virtual</span> <a class="code" href="struct_decoding_result.html" title="used to return decoding results">DecodingResult</a> Recover(byte *recoveredMessage, <a class="code" href="class_p_k___message_accumulator.html" title="interface for accumulating messages to be signed or verified">PK_MessageAccumulator</a> *messageAccumulator) <span class="keyword">const</span>;
<a name="l01424"></a>01424 <span class="comment"></span>
<a name="l01425"></a>01425 <span class="comment">        //! recover a message from its signature</span>
<a name="l01426"></a>01426 <span class="comment"></span><span class="comment">        /*! \pre size of recoveredMessage == MaxRecoverableLengthFromSignatureLength(signatureLength)</span>
<a name="l01427"></a>01427 <span class="comment">        */</span>
<a name="l01428"></a>01428         <span class="keyword">virtual</span> <a class="code" href="struct_decoding_result.html" title="used to return decoding results">DecodingResult</a> RecoverAndRestart(byte *recoveredMessage, <a class="code" href="class_p_k___message_accumulator.html" title="interface for accumulating messages to be signed or verified">PK_MessageAccumulator</a> &amp;messageAccumulator) <span class="keyword">const</span> =0;
<a name="l01429"></a>01429 <span class="comment"></span>
<a name="l01430"></a>01430 <span class="comment">        //! recover a message from its signature</span>
<a name="l01431"></a>01431 <span class="comment"></span><span class="comment">        /*! \pre size of recoveredMessage == MaxRecoverableLengthFromSignatureLength(signatureLength)</span>
<a name="l01432"></a>01432 <span class="comment">        */</span>
<a name="l01433"></a>01433         <span class="keyword">virtual</span> <a class="code" href="struct_decoding_result.html" title="used to return decoding results">DecodingResult</a> RecoverMessage(byte *recoveredMessage, 
<a name="l01434"></a>01434                 <span class="keyword">const</span> byte *nonrecoverableMessage, <span class="keywordtype">size_t</span> nonrecoverableMessageLength, 
<a name="l01435"></a>01435                 <span class="keyword">const</span> byte *signature, <span class="keywordtype">size_t</span> signatureLength) <span class="keyword">const</span>;
<a name="l01436"></a>01436 };
<a name="l01437"></a>01437 <span class="comment"></span>
<a name="l01438"></a>01438 <span class="comment">//! interface for domains of simple key agreement protocols</span>
<a name="l01439"></a>01439 <span class="comment"></span><span class="comment"></span>
<a name="l01440"></a>01440 <span class="comment">/*! A key agreement domain is a set of parameters that must be shared</span>
<a name="l01441"></a>01441 <span class="comment">        by two parties in a key agreement protocol, along with the algorithms</span>
<a name="l01442"></a>01442 <span class="comment">        for generating key pairs and deriving agreed values.</span>
<a name="l01443"></a>01443 <span class="comment">*/</span>
<a name="l01444"></a><a class="code" href="class_simple_key_agreement_domain.html">01444</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_simple_key_agreement_domain.html" title="interface for domains of simple key agreement protocols">SimpleKeyAgreementDomain</a> : <span class="keyword">public</span> <a class="code" href="class_key_agreement_algorithm.html" title="interface for key agreement algorithms">KeyAgreementAlgorithm</a>
<a name="l01445"></a>01445 {
<a name="l01446"></a>01446 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l01447"></a>01447 <span class="comment">        //! return length of agreed value produced</span>
<a name="l01448"></a>01448 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> AgreedValueLength() <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l01449"></a>01449 <span class="comment">        //! return length of private keys in this domain</span>
<a name="l01450"></a>01450 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> PrivateKeyLength() <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l01451"></a>01451 <span class="comment">        //! return length of public keys in this domain</span>
<a name="l01452"></a>01452 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> PublicKeyLength() <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l01453"></a>01453 <span class="comment">        //! generate private key</span>
<a name="l01454"></a>01454 <span class="comment"></span><span class="comment">        /*! \pre size of privateKey == PrivateKeyLength() */</span>
<a name="l01455"></a>01455         <span class="keyword">virtual</span> <span class="keywordtype">void</span> GeneratePrivateKey(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, byte *privateKey) <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l01456"></a>01456 <span class="comment">        //! generate public key</span>
<a name="l01457"></a>01457 <span class="comment"></span><span class="comment">        /*!     \pre size of publicKey == PublicKeyLength() */</span>
<a name="l01458"></a>01458         <span class="keyword">virtual</span> <span class="keywordtype">void</span> GeneratePublicKey(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> byte *privateKey, byte *publicKey) <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l01459"></a>01459 <span class="comment">        //! generate private/public key pair</span>
<a name="l01460"></a>01460 <span class="comment"></span><span class="comment">        /*! \note equivalent to calling GeneratePrivateKey() and then GeneratePublicKey() */</span>
<a name="l01461"></a>01461         <span class="keyword">virtual</span> <span class="keywordtype">void</span> GenerateKeyPair(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, byte *privateKey, byte *publicKey) <span class="keyword">const</span>;<span class="comment"></span>
<a name="l01462"></a>01462 <span class="comment">        //! derive agreed value from your private key and couterparty&apos;s public key, return false in case of failure</span>
<a name="l01463"></a>01463 <span class="comment"></span><span class="comment">        /*! \note If you have previously validated the public key, use validateOtherPublicKey=false to save time.</span>
<a name="l01464"></a>01464 <span class="comment">                \pre size of agreedValue == AgreedValueLength()</span>
<a name="l01465"></a>01465 <span class="comment">                \pre length of privateKey == PrivateKeyLength()</span>
<a name="l01466"></a>01466 <span class="comment">                \pre length of otherPublicKey == PublicKeyLength()</span>
<a name="l01467"></a>01467 <span class="comment">        */</span>
<a name="l01468"></a>01468         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Agree(byte *agreedValue, <span class="keyword">const</span> byte *privateKey, <span class="keyword">const</span> byte *otherPublicKey, <span class="keywordtype">bool</span> validateOtherPublicKey=<span class="keyword">true</span>) <span class="keyword">const</span> =0;
<a name="l01469"></a>01469 
<a name="l01470"></a>01470 <span class="preprocessor">#ifdef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY</span>
<a name="l01471"></a>01471 <span class="preprocessor"></span>        <span class="keywordtype">bool</span> ValidateDomainParameters(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng)<span class="keyword"> const</span>
<a name="l01472"></a>01472 <span class="keyword">                </span>{<span class="keywordflow">return</span> GetCryptoParameters().Validate(rng, 2);}
<a name="l01473"></a>01473 <span class="preprocessor">#endif</span>
<a name="l01474"></a>01474 <span class="preprocessor"></span>};
<a name="l01475"></a>01475 <span class="comment"></span>
<a name="l01476"></a>01476 <span class="comment">//! interface for domains of authenticated key agreement protocols</span>
<a name="l01477"></a>01477 <span class="comment"></span><span class="comment"></span>
<a name="l01478"></a>01478 <span class="comment">/*! In an authenticated key agreement protocol, each party has two</span>
<a name="l01479"></a>01479 <span class="comment">        key pairs. The long-lived key pair is called the static key pair,</span>
<a name="l01480"></a>01480 <span class="comment">        and the short-lived key pair is called the ephemeral key pair.</span>
<a name="l01481"></a>01481 <span class="comment">*/</span>
<a name="l01482"></a><a class="code" href="class_authenticated_key_agreement_domain.html">01482</a> <span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_authenticated_key_agreement_domain.html" title="interface for domains of authenticated key agreement protocols">AuthenticatedKeyAgreementDomain</a> : <span class="keyword">public</span> <a class="code" href="class_key_agreement_algorithm.html" title="interface for key agreement algorithms">KeyAgreementAlgorithm</a>
<a name="l01483"></a>01483 {
<a name="l01484"></a>01484 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l01485"></a>01485 <span class="comment">        //! return length of agreed value produced</span>
<a name="l01486"></a>01486 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> AgreedValueLength() <span class="keyword">const</span> =0;
<a name="l01487"></a>01487 <span class="comment"></span>
<a name="l01488"></a>01488 <span class="comment">        //! return length of static private keys in this domain</span>
<a name="l01489"></a>01489 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> StaticPrivateKeyLength() <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l01490"></a>01490 <span class="comment">        //! return length of static public keys in this domain</span>
<a name="l01491"></a>01491 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> StaticPublicKeyLength() <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l01492"></a>01492 <span class="comment">        //! generate static private key</span>
<a name="l01493"></a>01493 <span class="comment"></span><span class="comment">        /*! \pre size of privateKey == PrivateStaticKeyLength() */</span>
<a name="l01494"></a>01494         <span class="keyword">virtual</span> <span class="keywordtype">void</span> GenerateStaticPrivateKey(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, byte *privateKey) <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l01495"></a>01495 <span class="comment">        //! generate static public key</span>
<a name="l01496"></a>01496 <span class="comment"></span><span class="comment">        /*!     \pre size of publicKey == PublicStaticKeyLength() */</span>
<a name="l01497"></a>01497         <span class="keyword">virtual</span> <span class="keywordtype">void</span> GenerateStaticPublicKey(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> byte *privateKey, byte *publicKey) <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l01498"></a>01498 <span class="comment">        //! generate private/public key pair</span>
<a name="l01499"></a>01499 <span class="comment"></span><span class="comment">        /*! \note equivalent to calling GenerateStaticPrivateKey() and then GenerateStaticPublicKey() */</span>
<a name="l01500"></a>01500         <span class="keyword">virtual</span> <span class="keywordtype">void</span> GenerateStaticKeyPair(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, byte *privateKey, byte *publicKey) <span class="keyword">const</span>;
<a name="l01501"></a>01501 <span class="comment"></span>
<a name="l01502"></a>01502 <span class="comment">        //! return length of ephemeral private keys in this domain</span>
<a name="l01503"></a>01503 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> EphemeralPrivateKeyLength() <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l01504"></a>01504 <span class="comment">        //! return length of ephemeral public keys in this domain</span>
<a name="l01505"></a>01505 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> EphemeralPublicKeyLength() <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l01506"></a>01506 <span class="comment">        //! generate ephemeral private key</span>
<a name="l01507"></a>01507 <span class="comment"></span><span class="comment">        /*! \pre size of privateKey == PrivateEphemeralKeyLength() */</span>
<a name="l01508"></a>01508         <span class="keyword">virtual</span> <span class="keywordtype">void</span> GenerateEphemeralPrivateKey(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, byte *privateKey) <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l01509"></a>01509 <span class="comment">        //! generate ephemeral public key</span>
<a name="l01510"></a>01510 <span class="comment"></span><span class="comment">        /*!     \pre size of publicKey == PublicEphemeralKeyLength() */</span>
<a name="l01511"></a>01511         <span class="keyword">virtual</span> <span class="keywordtype">void</span> GenerateEphemeralPublicKey(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> byte *privateKey, byte *publicKey) <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l01512"></a>01512 <span class="comment">        //! generate private/public key pair</span>
<a name="l01513"></a>01513 <span class="comment"></span><span class="comment">        /*! \note equivalent to calling GenerateEphemeralPrivateKey() and then GenerateEphemeralPublicKey() */</span>
<a name="l01514"></a>01514         <span class="keyword">virtual</span> <span class="keywordtype">void</span> GenerateEphemeralKeyPair(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, byte *privateKey, byte *publicKey) <span class="keyword">const</span>;
<a name="l01515"></a>01515 <span class="comment"></span>
<a name="l01516"></a>01516 <span class="comment">        //! derive agreed value from your private keys and couterparty&apos;s public keys, return false in case of failure</span>
<a name="l01517"></a>01517 <span class="comment"></span><span class="comment">        /*! \note The ephemeral public key will always be validated.</span>
<a name="l01518"></a>01518 <span class="comment">                      If you have previously validated the static public key, use validateStaticOtherPublicKey=false to save time.</span>
<a name="l01519"></a>01519 <span class="comment">                \pre size of agreedValue == AgreedValueLength()</span>
<a name="l01520"></a>01520 <span class="comment">                \pre length of staticPrivateKey == StaticPrivateKeyLength()</span>
<a name="l01521"></a>01521 <span class="comment">                \pre length of ephemeralPrivateKey == EphemeralPrivateKeyLength()</span>
<a name="l01522"></a>01522 <span class="comment">                \pre length of staticOtherPublicKey == StaticPublicKeyLength()</span>
<a name="l01523"></a>01523 <span class="comment">                \pre length of ephemeralOtherPublicKey == EphemeralPublicKeyLength()</span>
<a name="l01524"></a>01524 <span class="comment">        */</span>
<a name="l01525"></a>01525         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> Agree(byte *agreedValue,
<a name="l01526"></a>01526                 <span class="keyword">const</span> byte *staticPrivateKey, <span class="keyword">const</span> byte *ephemeralPrivateKey,
<a name="l01527"></a>01527                 <span class="keyword">const</span> byte *staticOtherPublicKey, <span class="keyword">const</span> byte *ephemeralOtherPublicKey,
<a name="l01528"></a>01528                 <span class="keywordtype">bool</span> validateStaticOtherPublicKey=<span class="keyword">true</span>) <span class="keyword">const</span> =0;
<a name="l01529"></a>01529 
<a name="l01530"></a>01530 <span class="preprocessor">#ifdef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY</span>
<a name="l01531"></a>01531 <span class="preprocessor"></span>        <span class="keywordtype">bool</span> ValidateDomainParameters(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng)<span class="keyword"> const</span>
<a name="l01532"></a>01532 <span class="keyword">                </span>{<span class="keywordflow">return</span> GetCryptoParameters().Validate(rng, 2);}
<a name="l01533"></a>01533 <span class="preprocessor">#endif</span>
<a name="l01534"></a>01534 <span class="preprocessor"></span>};
<a name="l01535"></a>01535 
<a name="l01536"></a>01536 <span class="comment">// interface for password authenticated key agreement protocols, not implemented yet</span>
<a name="l01537"></a>01537 <span class="preprocessor">#if 0</span><span class="comment"></span>
<a name="l01538"></a>01538 <span class="comment">//! interface for protocol sessions</span>
<a name="l01539"></a>01539 <span class="comment"></span><span class="comment">/*! The methods should be called in the following order:</span>
<a name="l01540"></a>01540 <span class="comment"></span>
<a name="l01541"></a>01541 <span class="comment">        InitializeSession(rng, parameters);     // or call initialize method in derived class</span>
<a name="l01542"></a>01542 <span class="comment">        while (true)</span>
<a name="l01543"></a>01543 <span class="comment">        {</span>
<a name="l01544"></a>01544 <span class="comment">                if (OutgoingMessageAvailable())</span>
<a name="l01545"></a>01545 <span class="comment">                {</span>
<a name="l01546"></a>01546 <span class="comment">                        length = GetOutgoingMessageLength();</span>
<a name="l01547"></a>01547 <span class="comment">                        GetOutgoingMessage(message);</span>
<a name="l01548"></a>01548 <span class="comment">                        ; // send outgoing message</span>
<a name="l01549"></a>01549 <span class="comment">                }</span>
<a name="l01550"></a>01550 <span class="comment"></span>
<a name="l01551"></a>01551 <span class="comment">                if (LastMessageProcessed())</span>
<a name="l01552"></a>01552 <span class="comment">                        break;</span>
<a name="l01553"></a>01553 <span class="comment"></span>
<a name="l01554"></a>01554 <span class="comment">                ; // receive incoming message</span>
<a name="l01555"></a>01555 <span class="comment">                ProcessIncomingMessage(message);</span>
<a name="l01556"></a>01556 <span class="comment">        }</span>
<a name="l01557"></a>01557 <span class="comment">        ; // call methods in derived class to obtain result of protocol session</span>
<a name="l01558"></a>01558 <span class="comment">*/</span>
<a name="l01559"></a>01559 <span class="keyword">class </span>ProtocolSession
<a name="l01560"></a>01560 {
<a name="l01561"></a>01561 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l01562"></a>01562 <span class="comment">        //! exception thrown when an invalid protocol message is processed</span>
<a name="l01563"></a>01563 <span class="comment"></span>        <span class="keyword">class </span>ProtocolError : <span class="keyword">public</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>
<a name="l01564"></a>01564         {
<a name="l01565"></a>01565         <span class="keyword">public</span>:
<a name="l01566"></a>01566                 ProtocolError(ErrorType errorType, <span class="keyword">const</span> std::string &amp;s) : <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(errorType, s) {}
<a name="l01567"></a>01567         };
<a name="l01568"></a>01568 <span class="comment"></span>
<a name="l01569"></a>01569 <span class="comment">        //! exception thrown when a function is called unexpectedly</span>
<a name="l01570"></a>01570 <span class="comment"></span><span class="comment">        /*! for example calling ProcessIncomingMessage() when ProcessedLastMessage() == true */</span>
<a name="l01571"></a>01571         <span class="keyword">class </span>UnexpectedMethodCall : <span class="keyword">public</span> <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>
<a name="l01572"></a>01572         {
<a name="l01573"></a>01573         <span class="keyword">public</span>:
<a name="l01574"></a>01574                 UnexpectedMethodCall(<span class="keyword">const</span> std::string &amp;s) : <a class="code" href="class_exception.html" title="base class for all exceptions thrown by Crypto++">Exception</a>(OTHER_ERROR, s) {}
<a name="l01575"></a>01575         };
<a name="l01576"></a>01576 
<a name="l01577"></a>01577         ProtocolSession() : m_rng(NULL), m_throwOnProtocolError(true), m_validState(false) {}
<a name="l01578"></a>01578         <span class="keyword">virtual</span> ~ProtocolSession() {}
<a name="l01579"></a>01579 
<a name="l01580"></a>01580         <span class="keyword">virtual</span> <span class="keywordtype">void</span> InitializeSession(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html" title="interface for retrieving values given their names">NameValuePairs</a> &amp;parameters) =0;
<a name="l01581"></a>01581 
<a name="l01582"></a>01582         <span class="keywordtype">bool</span> GetThrowOnProtocolError()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_throwOnProtocolError;}
<a name="l01583"></a>01583         <span class="keywordtype">void</span> SetThrowOnProtocolError(<span class="keywordtype">bool</span> throwOnProtocolError) {m_throwOnProtocolError = throwOnProtocolError;}
<a name="l01584"></a>01584 
<a name="l01585"></a>01585         <span class="keywordtype">bool</span> HasValidState()<span class="keyword"> const </span>{<span class="keywordflow">return</span> m_validState;}
<a name="l01586"></a>01586 
<a name="l01587"></a>01587         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> OutgoingMessageAvailable() <span class="keyword">const</span> =0;
<a name="l01588"></a>01588         <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetOutgoingMessageLength() <span class="keyword">const</span> =0;
<a name="l01589"></a>01589         <span class="keyword">virtual</span> <span class="keywordtype">void</span> GetOutgoingMessage(byte *message) =0;
<a name="l01590"></a>01590 
<a name="l01591"></a>01591         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> LastMessageProcessed() <span class="keyword">const</span> =0;
<a name="l01592"></a>01592         <span class="keyword">virtual</span> <span class="keywordtype">void</span> ProcessIncomingMessage(<span class="keyword">const</span> byte *message, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> messageLength) =0;
<a name="l01593"></a>01593 
<a name="l01594"></a>01594 <span class="keyword">protected</span>:
<a name="l01595"></a>01595         <span class="keywordtype">void</span> HandleProtocolError(<a class="code" href="class_exception.html#a8e53909d979479380e0274807c074c0a" title="error types">Exception::ErrorType</a> errorType, <span class="keyword">const</span> std::string &amp;s) <span class="keyword">const</span>;
<a name="l01596"></a>01596         <span class="keywordtype">void</span> CheckAndHandleInvalidState() <span class="keyword">const</span>;
<a name="l01597"></a>01597         <span class="keywordtype">void</span> SetValidState(<span class="keywordtype">bool</span> valid) {m_validState = valid;}
<a name="l01598"></a>01598 
<a name="l01599"></a>01599         <a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> *m_rng;
<a name="l01600"></a>01600 
<a name="l01601"></a>01601 <span class="keyword">private</span>:
<a name="l01602"></a>01602         <span class="keywordtype">bool</span> m_throwOnProtocolError, m_validState;
<a name="l01603"></a>01603 };
<a name="l01604"></a>01604 
<a name="l01605"></a>01605 <span class="keyword">class </span>KeyAgreementSession : <span class="keyword">public</span> ProtocolSession
<a name="l01606"></a>01606 {
<a name="l01607"></a>01607 <span class="keyword">public</span>:
<a name="l01608"></a>01608         <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetAgreedValueLength() <span class="keyword">const</span> =0;
<a name="l01609"></a>01609         <span class="keyword">virtual</span> <span class="keywordtype">void</span> GetAgreedValue(byte *agreedValue) <span class="keyword">const</span> =0;
<a name="l01610"></a>01610 };
<a name="l01611"></a>01611 
<a name="l01612"></a>01612 <span class="keyword">class </span>PasswordAuthenticatedKeyAgreementSession : <span class="keyword">public</span> KeyAgreementSession
<a name="l01613"></a>01613 {
<a name="l01614"></a>01614 <span class="keyword">public</span>:
<a name="l01615"></a>01615         <span class="keywordtype">void</span> InitializePasswordAuthenticatedKeyAgreementSession(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, 
<a name="l01616"></a>01616                 <span class="keyword">const</span> byte *myId, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> myIdLength, 
<a name="l01617"></a>01617                 <span class="keyword">const</span> byte *counterPartyId, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> counterPartyIdLength, 
<a name="l01618"></a>01618                 <span class="keyword">const</span> byte *passwordOrVerifier, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> passwordOrVerifierLength);
<a name="l01619"></a>01619 };
<a name="l01620"></a>01620 
<a name="l01621"></a>01621 <span class="keyword">class </span>PasswordAuthenticatedKeyAgreementDomain : <span class="keyword">public</span> <a class="code" href="class_key_agreement_algorithm.html" title="interface for key agreement algorithms">KeyAgreementAlgorithm</a>
<a name="l01622"></a>01622 {
<a name="l01623"></a>01623 <span class="keyword">public</span>:<span class="comment"></span>
<a name="l01624"></a>01624 <span class="comment">        //! return whether the domain parameters stored in this object are valid</span>
<a name="l01625"></a>01625 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">bool</span> ValidateDomainParameters(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng)<span class="keyword"> const</span>
<a name="l01626"></a>01626 <span class="keyword">                </span>{<span class="keywordflow">return</span> GetCryptoParameters().Validate(rng, 2);}
<a name="l01627"></a>01627 
<a name="l01628"></a>01628         <span class="keyword">virtual</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> GetPasswordVerifierLength(<span class="keyword">const</span> byte *password, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> passwordLength) <span class="keyword">const</span> =0;
<a name="l01629"></a>01629         <span class="keyword">virtual</span> <span class="keywordtype">void</span> GeneratePasswordVerifier(<a class="code" href="class_random_number_generator.html" title="interface for random number generators">RandomNumberGenerator</a> &amp;rng, <span class="keyword">const</span> byte *userId, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> userIdLength, <span class="keyword">const</span> byte *password, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> passwordLength, byte *verifier) <span class="keyword">const</span> =0;
<a name="l01630"></a>01630 
<a name="l01631"></a>01631         <span class="keyword">enum</span> RoleFlags {CLIENT=1, SERVER=2, INITIATOR=4, RESPONDER=8};
<a name="l01632"></a>01632 
<a name="l01633"></a>01633         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> IsValidRole(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> role) =0;
<a name="l01634"></a>01634         <span class="keyword">virtual</span> PasswordAuthenticatedKeyAgreementSession * CreateProtocolSession(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> role) <span class="keyword">const</span> =0;
<a name="l01635"></a>01635 };
<a name="l01636"></a>01636 <span class="preprocessor">#endif</span>
<a name="l01637"></a>01637 <span class="preprocessor"></span><span class="comment"></span>
<a name="l01638"></a>01638 <span class="comment">//! BER Decode Exception Class, may be thrown during an ASN1 BER decode operation</span>
<a name="l01639"></a><a class="code" href="class_b_e_r_decode_err.html">01639</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL <a class="code" href="class_b_e_r_decode_err.html" title="BER Decode Exception Class, may be thrown during an ASN1 BER decode operation.">BERDecodeErr</a> : <span class="keyword">public</span> <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a>
<a name="l01640"></a>01640 {
<a name="l01641"></a>01641 <span class="keyword">public</span>: 
<a name="l01642"></a>01642         <a class="code" href="class_b_e_r_decode_err.html" title="BER Decode Exception Class, may be thrown during an ASN1 BER decode operation.">BERDecodeErr</a>() : <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a>(<span class="stringliteral">&quot;BER decode error&quot;</span>) {}
<a name="l01643"></a>01643         <a class="code" href="class_b_e_r_decode_err.html" title="BER Decode Exception Class, may be thrown during an ASN1 BER decode operation.">BERDecodeErr</a>(<span class="keyword">const</span> std::string &amp;s) : <a class="code" href="class_invalid_argument.html" title="exception thrown when an invalid argument is detected">InvalidArgument</a>(s) {}
<a name="l01644"></a>01644 };
<a name="l01645"></a>01645 <span class="comment"></span>
<a name="l01646"></a>01646 <span class="comment">//! interface for encoding and decoding ASN1 objects</span>
<a name="l01647"></a><a class="code" href="class_a_s_n1_object.html">01647</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL CRYPTOPP_NO_VTABLE <a class="code" href="class_a_s_n1_object.html" title="interface for encoding and decoding ASN1 objects">ASN1Object</a>
<a name="l01648"></a>01648 {
<a name="l01649"></a>01649 <span class="keyword">public</span>:
<a name="l01650"></a>01650         <span class="keyword">virtual</span> ~<a class="code" href="class_a_s_n1_object.html" title="interface for encoding and decoding ASN1 objects">ASN1Object</a>() {}<span class="comment"></span>
<a name="l01651"></a>01651 <span class="comment">        //! decode this object from a BufferedTransformation, using BER (Basic Encoding Rules)</span>
<a name="l01652"></a>01652 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> BERDecode(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt) =0;<span class="comment"></span>
<a name="l01653"></a>01653 <span class="comment">        //! encode this object into a BufferedTransformation, using DER (Distinguished Encoding Rules)</span>
<a name="l01654"></a>01654 <span class="comment"></span>        <span class="keyword">virtual</span> <span class="keywordtype">void</span> DEREncode(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt) <span class="keyword">const</span> =0;<span class="comment"></span>
<a name="l01655"></a>01655 <span class="comment">        //! encode this object into a BufferedTransformation, using BER</span>
<a name="l01656"></a>01656 <span class="comment"></span><span class="comment">        /*! this may be useful if DEREncode() would be too inefficient */</span>
<a name="l01657"></a><a class="code" href="class_a_s_n1_object.html#ab8446b61690a19015d3d565d86dd1d3d">01657</a>         <span class="keyword">virtual</span> <span class="keywordtype">void</span> <a class="code" href="class_a_s_n1_object.html#ab8446b61690a19015d3d565d86dd1d3d" title="encode this object into a BufferedTransformation, using BER">BEREncode</a>(<a class="code" href="class_buffered_transformation.html" title="interface for buffered transformations">BufferedTransformation</a> &amp;bt)<span class="keyword"> const </span>{DEREncode(bt);}
<a name="l01658"></a>01658 };
<a name="l01659"></a>01659 
<a name="l01660"></a>01660 <span class="preprocessor">#ifdef CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY</span>
<a name="l01661"></a>01661 <span class="preprocessor"></span><span class="keyword">typedef</span> <a class="code" href="class_p_k___signature_scheme.html" title="interface for public-key signers and verifiers">PK_SignatureScheme</a> PK_SignatureSystem;
<a name="l01662"></a>01662 <span class="keyword">typedef</span> <a class="code" href="class_simple_key_agreement_domain.html" title="interface for domains of simple key agreement protocols">SimpleKeyAgreementDomain</a> PK_SimpleKeyAgreementDomain;
<a name="l01663"></a>01663 <span class="keyword">typedef</span> <a class="code" href="class_authenticated_key_agreement_domain.html" title="interface for domains of authenticated key agreement protocols">AuthenticatedKeyAgreementDomain</a> PK_AuthenticatedKeyAgreementDomain;
<a name="l01664"></a>01664 <span class="preprocessor">#endif</span>
<a name="l01665"></a>01665 <span class="preprocessor"></span>
<a name="l01666"></a>01666 NAMESPACE_END
<a name="l01667"></a>01667 
<a name="l01668"></a>01668 <span class="preprocessor">#endif</span>
</pre></div></div>
<hr size="1"/><address style="text-align: right;"><small>Generated on 9 Dec 2009 for Crypto++ by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>