00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "ElGamal.h"
00019
00020 using namespace CODEX_Ciphers;
00021
00022 ElGamalSignature::ElGamalSignature() :
00023 CODEX_ASN1::Base( false )
00024 {
00025 }
00026
00027 ElGamalSignature::ElGamalSignature( BIGNUM * r, BIGNUM * s ) :
00028 CODEX_ASN1::Base( true ),
00029 m_r( r ),
00030 m_s( s )
00031 {
00032 }
00033
00034 ElGamalSignature::ElGamalSignature( const CODEX_ASN1::BigNumber& r,
00035 const CODEX_ASN1::BigNumber& s ) :
00036 CODEX_ASN1::Base( true ),
00037 m_r( r ),
00038 m_s( s )
00039 {
00040 }
00041
00042 ElGamalSignature::ElGamalSignature( const ElGamalSignature& aSig ) :
00043 CODEX_ASN1::Base( aSig.m_initialized ),
00044 m_r( aSig.m_r ),
00045 m_s( aSig.m_s )
00046 {
00047 }
00048
00049 ElGamalSignature::~ElGamalSignature()
00050 {
00051 }
00052
00053 void
00054 ElGamalSignature::operator=( const ElGamalSignature& aSig )
00055 {
00056 m_initialized = aSig.m_initialized;
00057 m_r = aSig.m_r;
00058 m_s = aSig.m_s;
00059 }
00060
00061 int
00062 ElGamalSignature::marshal( unsigned char ** pp ) const
00063 {
00064 int r=0;
00065 int ret=0;
00066 unsigned char * p;
00067
00068 ret += m_r.marshal(0);
00069 ret += m_s.marshal(0);
00070 M_ASN1_I2D_seq_total();
00071 m_r.marshal(&p);
00072 m_s.marshal(&p);
00073 M_ASN1_I2D_finish();
00074 }
00075
00076 void*
00077 ElGamalSignature::unmarshal( void* bogus, unsigned char ** pp, long length )
00078 {
00079 if ( m_initialized )
00080 {
00081 return NULL;
00082 }
00083 if ( (NULL == pp) || (NULL == *pp) )
00084 {
00085 return NULL;
00086 }
00087 ASN1_CTX c;
00088 c.pp = pp;
00089 c.q = *pp;
00090 c.error = ERR_R_NESTED_ASN1_ERROR;
00091 int i;
00092
00093 M_ASN1_D2I_Init();
00094 M_ASN1_D2I_start_sequence();
00095 M_ASN1_D2I_get(i, m_r.unmarshal);
00096 M_ASN1_D2I_get(i, m_s.unmarshal);
00097 if ( !asn1_Finish(&c) )
00098 {
00099 return NULL;
00100 }
00101 *pp=c.p;
00102 m_initialized = true;
00103 return this;
00104 err:
00105 return NULL;
00106 }