// NOTE: this is a machine generated file--editing not recommended // // sm_x509af.cpp - class member functions for ASN.1 module AuthenticationFramework // // This file was generated by snacc on Wed Jun 27 16:40:55 2001 // UBC snacc written by Mike Sample // A couple of enhancements made by IBM European Networking Center #include "asn-incl.h" #include "sm_vdatypes.h" #include "sm_x501ud.h" #include "sm_x411ub.h" #include "sm_x411mtsas.h" #include "sm_x501if.h" #include "sm_x520sa.h" #include "sm_x509cmn.h" #include "sm_x509af.h" #include "sm_x509ce.h" #include "pkcs1oids.h" #include "pkcs9oids.h" #include "sm_cms.h" #include "sm_ess.h" #include "pkcs7.h" #include "pkcs8.h" #include "appleoids.h" //------------------------------------------------------------------------------ // value defs //------------------------------------------------------------------------------ // class member definitions: AsnType *AttributeCertificateAssertionSetOf::Clone() const { return new AttributeCertificateAssertionSetOf; } AsnType *AttributeCertificateAssertionSetOf::Copy() const { return new AttributeCertificateAssertionSetOf (*this); } AsnLen AttributeCertificateAssertionSetOf::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SET_TAG_CODE); return l; } void AttributeCertificateAssertionSetOf::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SET_TAG_CODE)) { Asn1Error << "AttributeCertificateAssertionSetOf::BDec: ERROR - wrong tag" << endl; longjmp (env, -100); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } AttributeCertificateAssertionSetOf::AttributeCertificateAssertionSetOf (const AttributeCertificateAssertionSetOf &) { Asn1Error << "use of incompletely defined AttributeCertificateAssertionSetOf::AttributeCertificateAssertionSetOf (const AttributeCertificateAssertionSetOf &)" << endl; abort(); } AttributeCertificateAssertionSetOf::~AttributeCertificateAssertionSetOf() { SetCurrToFirst(); for (; Curr() != NULL; RemoveCurrFromList()) ; } // end of destructor #if SNACC_DEEP_COPY AttributeCertificateAssertionSetOf &AttributeCertificateAssertionSetOf::operator = (const AttributeCertificateAssertionSetOf &that) #else // SNACC_DEEP_COPY AttributeCertificateAssertionSetOf &AttributeCertificateAssertionSetOf::operator = (const AttributeCertificateAssertionSetOf &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { SetCurrToFirst(); for (; Curr(); RemoveCurrFromList()) ; //that.SetCurrToFirst(); //for (; that.Curr(); that.GoNext()) // AppendCopy (*that.Curr()); for (const AsnListElmt *run=that.first; run; run=run->next) AppendCopy (*run->elmt); } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined AttributeCertificateAssertionSetOf &AttributeCertificateAssertionSetOf::operator = (const AttributeCertificateAssertionSetOf &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } void AttributeCertificateAssertionSetOf::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE/SET OF -- " << endl; indentG += stdIndentG; //SetCurrToFirst(); //for (; Curr() != NULL; GoNext()) for (const AsnListElmt *run=first; run; run=run->next) { Indent (os, indentG); //os << *Curr(); os << *run->elmt; //if (Curr() != Last()) if (run != last) os << ","; os << endl; } indentG -= stdIndentG; Indent (os, indentG); os << "}\n"; #endif /* NDEBUG */ } // Print void AttributeCertificateAssertionSetOf::SetCurrElmt (unsigned long int index) { unsigned long int i; curr = first; if (count) for (i = 0; (i < (count-1)) && (i < index); i++) curr = curr->next; } // AttributeCertificateAssertionSetOf::SetCurrElmt unsigned long int AttributeCertificateAssertionSetOf::GetCurrElmtIndex() { unsigned long int i; AsnListElmt *tmp; if (curr != NULL) { for (i = 0, tmp = first; tmp != NULL; i++) { if (tmp == curr) return i; else tmp = tmp->next; } } return count; } // AttributeCertificateAssertionSetOf::GetCurrElmtIndex // alloc new list elmt, put at end of list // and return the component type AttributeType *AttributeCertificateAssertionSetOf::Append() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new AttributeType; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return (curr = newElmt)->elmt; } // AttributeCertificateAssertionSetOf::Append // alloc new list elmt, put at begining of list // and return the component type AttributeType *AttributeCertificateAssertionSetOf::Prepend() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new AttributeType; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return (curr = newElmt)->elmt; } // AttributeCertificateAssertionSetOf::Prepend // alloc new list elmt, insert it before the // current element and return the component type // if the current element is null, the new element // is placed at the beginning of the list. AttributeType *AttributeCertificateAssertionSetOf::InsertBefore() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new AttributeType; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return (curr = newElmt)->elmt; } // AttributeCertificateAssertionSetOf::InsertBefore // alloc new list elmt, insert it after the // current element and return the component type // if the current element is null, the new element // is placed at the end of the list. AttributeType *AttributeCertificateAssertionSetOf::InsertAfter() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new AttributeType; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return (curr = newElmt)->elmt; } // AttributeCertificateAssertionSetOf::InsertAfter AttributeCertificateAssertionSetOf &AttributeCertificateAssertionSetOf::AppendCopy (AttributeType &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new AttributeType; *newElmt->elmt = elmt; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return *this; } // AppendCopy AttributeCertificateAssertionSetOf &AttributeCertificateAssertionSetOf::PrependCopy (AttributeType &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new AttributeType; *newElmt->elmt = elmt; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return *this; } // AttributeCertificateAssertionSetOf::PrependCopy // alloc new list elmt, insert it before the // current element, copy the given elmt into the new elmt // and return the component type. // if the current element is null, the new element // is placed at the beginning of the list. AttributeCertificateAssertionSetOf &AttributeCertificateAssertionSetOf::InsertBeforeAndCopy (AttributeType &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new AttributeType; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return *this; } // AttributeCertificateAssertionSetOf::InsertBeforeAndCopy // alloc new list elmt, insert it after the // current element, copy given elmt in to new elmt // and return the component type // if the current element is null, the new element // is placed at the end of the list. AttributeCertificateAssertionSetOf &AttributeCertificateAssertionSetOf::InsertAfterAndCopy (AttributeType &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new AttributeType; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return *this; } // AttributeCertificateAssertionSetOf::InsertAfterAndCopy // remove current element from list if current element is not NULL // The new current element will be the next element. // If the current element is the last element in the list // the second but last element will become the new current element. void AttributeCertificateAssertionSetOf::RemoveCurrFromList() { AsnListElmt *del_elmt; if (curr != NULL) { del_elmt = curr; count--; if (count == 0) first = last = curr = NULL; else if (curr == first) { curr = first= first->next; first->prev = NULL; } else if (curr == last) { curr = last = last->prev; last->next = NULL; } else { curr->prev->next = curr->next; curr->next->prev = curr->prev; } delete del_elmt->elmt; delete del_elmt; } } AsnLen AttributeCertificateAssertionSetOf::BEncContent (BUF_TYPE b) { AsnListElmt *currElmt; AsnLen elmtLen; AsnLen totalLen = 0; { int iii,icount; CSM_Buffer **tmpEnc=NULL; for (currElmt = last,icount=0; currElmt != NULL; currElmt = currElmt->prev, icount++); tmpEnc = (CSM_Buffer **) calloc(sizeof(CSM_Buffer *), icount); for (currElmt = last, iii=0; currElmt != NULL; currElmt = currElmt->prev,iii++,elmtLen=0) { ENCODE_BUF1(currElmt->elmt->BEncContent, elmtLen); elmtLen += BEncDefLen (outputBuf, elmtLen); elmtLen += BEncTag1 (outputBuf, UNIV, PRIM, OID_TAG_CODE); ENCODE_BUF2(tmpEnc[iii]); } vdasnacc_sortSetOf(tmpEnc, icount); for (iii=0,elmtLen=0; iii < icount; elmtLen+=tmpEnc[iii++]->Length()) SM_WriteToAsnBuf(tmpEnc[iii], b); for (iii=0; iii < icount; iii++) delete tmpEnc[iii]; free(tmpEnc); } totalLen += elmtLen; return totalLen; } // AttributeCertificateAssertionSetOf::BEncContent void AttributeCertificateAssertionSetOf::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AttributeType *listElmt; AsnTag tag1; AsnLen listBytesDecoded = 0; AsnLen elmtLen1; while ((listBytesDecoded < elmtLen0) || (elmtLen0 == INDEFINITE_LEN)) { tag1 = BDecTag (b, listBytesDecoded, env); if ((tag1 == EOC_TAG_ID) && (elmtLen0 == INDEFINITE_LEN)) { BDEC_2ND_EOC_OCTET (b, listBytesDecoded, env); break; } if ((tag1 != MAKE_TAG_ID (UNIV, PRIM, OID_TAG_CODE))) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -101); } elmtLen1 = BDecLen (b, listBytesDecoded, env); listElmt = Append(); listElmt->BDecContent (b, tag1, elmtLen1, listBytesDecoded, env); } bytesDecoded += listBytesDecoded; } // AttributeCertificateAssertionSetOf::BDecContent AsnType *AttributeCertificateInfoSeqOf::Clone() const { return new AttributeCertificateInfoSeqOf; } AsnType *AttributeCertificateInfoSeqOf::Copy() const { return new AttributeCertificateInfoSeqOf (*this); } AsnLen AttributeCertificateInfoSeqOf::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void AttributeCertificateInfoSeqOf::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "AttributeCertificateInfoSeqOf::BDec: ERROR - wrong tag" << endl; longjmp (env, -102); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } AttributeCertificateInfoSeqOf::AttributeCertificateInfoSeqOf (const AttributeCertificateInfoSeqOf &) { Asn1Error << "use of incompletely defined AttributeCertificateInfoSeqOf::AttributeCertificateInfoSeqOf (const AttributeCertificateInfoSeqOf &)" << endl; abort(); } AttributeCertificateInfoSeqOf::~AttributeCertificateInfoSeqOf() { SetCurrToFirst(); for (; Curr() != NULL; RemoveCurrFromList()) ; } // end of destructor #if SNACC_DEEP_COPY AttributeCertificateInfoSeqOf &AttributeCertificateInfoSeqOf::operator = (const AttributeCertificateInfoSeqOf &that) #else // SNACC_DEEP_COPY AttributeCertificateInfoSeqOf &AttributeCertificateInfoSeqOf::operator = (const AttributeCertificateInfoSeqOf &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { SetCurrToFirst(); for (; Curr(); RemoveCurrFromList()) ; //that.SetCurrToFirst(); //for (; that.Curr(); that.GoNext()) // AppendCopy (*that.Curr()); for (const AsnListElmt *run=that.first; run; run=run->next) AppendCopy (*run->elmt); } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined AttributeCertificateInfoSeqOf &AttributeCertificateInfoSeqOf::operator = (const AttributeCertificateInfoSeqOf &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } void AttributeCertificateInfoSeqOf::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE/SET OF -- " << endl; indentG += stdIndentG; //SetCurrToFirst(); //for (; Curr() != NULL; GoNext()) for (const AsnListElmt *run=first; run; run=run->next) { Indent (os, indentG); //os << *Curr(); os << *run->elmt; //if (Curr() != Last()) if (run != last) os << ","; os << endl; } indentG -= stdIndentG; Indent (os, indentG); os << "}\n"; #endif /* NDEBUG */ } // Print void AttributeCertificateInfoSeqOf::SetCurrElmt (unsigned long int index) { unsigned long int i; curr = first; if (count) for (i = 0; (i < (count-1)) && (i < index); i++) curr = curr->next; } // AttributeCertificateInfoSeqOf::SetCurrElmt unsigned long int AttributeCertificateInfoSeqOf::GetCurrElmtIndex() { unsigned long int i; AsnListElmt *tmp; if (curr != NULL) { for (i = 0, tmp = first; tmp != NULL; i++) { if (tmp == curr) return i; else tmp = tmp->next; } } return count; } // AttributeCertificateInfoSeqOf::GetCurrElmtIndex // alloc new list elmt, put at end of list // and return the component type Attribute *AttributeCertificateInfoSeqOf::Append() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Attribute; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return (curr = newElmt)->elmt; } // AttributeCertificateInfoSeqOf::Append // alloc new list elmt, put at begining of list // and return the component type Attribute *AttributeCertificateInfoSeqOf::Prepend() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Attribute; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return (curr = newElmt)->elmt; } // AttributeCertificateInfoSeqOf::Prepend // alloc new list elmt, insert it before the // current element and return the component type // if the current element is null, the new element // is placed at the beginning of the list. Attribute *AttributeCertificateInfoSeqOf::InsertBefore() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Attribute; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return (curr = newElmt)->elmt; } // AttributeCertificateInfoSeqOf::InsertBefore // alloc new list elmt, insert it after the // current element and return the component type // if the current element is null, the new element // is placed at the end of the list. Attribute *AttributeCertificateInfoSeqOf::InsertAfter() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Attribute; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return (curr = newElmt)->elmt; } // AttributeCertificateInfoSeqOf::InsertAfter AttributeCertificateInfoSeqOf &AttributeCertificateInfoSeqOf::AppendCopy (Attribute &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Attribute; *newElmt->elmt = elmt; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return *this; } // AppendCopy AttributeCertificateInfoSeqOf &AttributeCertificateInfoSeqOf::PrependCopy (Attribute &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Attribute; *newElmt->elmt = elmt; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return *this; } // AttributeCertificateInfoSeqOf::PrependCopy // alloc new list elmt, insert it before the // current element, copy the given elmt into the new elmt // and return the component type. // if the current element is null, the new element // is placed at the beginning of the list. AttributeCertificateInfoSeqOf &AttributeCertificateInfoSeqOf::InsertBeforeAndCopy (Attribute &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Attribute; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return *this; } // AttributeCertificateInfoSeqOf::InsertBeforeAndCopy // alloc new list elmt, insert it after the // current element, copy given elmt in to new elmt // and return the component type // if the current element is null, the new element // is placed at the end of the list. AttributeCertificateInfoSeqOf &AttributeCertificateInfoSeqOf::InsertAfterAndCopy (Attribute &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Attribute; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return *this; } // AttributeCertificateInfoSeqOf::InsertAfterAndCopy // remove current element from list if current element is not NULL // The new current element will be the next element. // If the current element is the last element in the list // the second but last element will become the new current element. void AttributeCertificateInfoSeqOf::RemoveCurrFromList() { AsnListElmt *del_elmt; if (curr != NULL) { del_elmt = curr; count--; if (count == 0) first = last = curr = NULL; else if (curr == first) { curr = first= first->next; first->prev = NULL; } else if (curr == last) { curr = last = last->prev; last->next = NULL; } else { curr->prev->next = curr->next; curr->next->prev = curr->prev; } delete del_elmt->elmt; delete del_elmt; } } AsnLen AttributeCertificateInfoSeqOf::BEncContent (BUF_TYPE b) { AsnListElmt *currElmt; AsnLen elmtLen; AsnLen totalLen = 0; for (currElmt = last; currElmt != NULL; currElmt = currElmt->prev) { BEncEocIfNec (b); elmtLen = currElmt->elmt->BEncContent (b); elmtLen += BEncConsLen (b, elmtLen); elmtLen += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += elmtLen; } return totalLen; } // AttributeCertificateInfoSeqOf::BEncContent void AttributeCertificateInfoSeqOf::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { Attribute *listElmt; AsnTag tag1; AsnLen listBytesDecoded = 0; AsnLen elmtLen1; while ((listBytesDecoded < elmtLen0) || (elmtLen0 == INDEFINITE_LEN)) { tag1 = BDecTag (b, listBytesDecoded, env); if ((tag1 == EOC_TAG_ID) && (elmtLen0 == INDEFINITE_LEN)) { BDEC_2ND_EOC_OCTET (b, listBytesDecoded, env); break; } if ((tag1 != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -103); } elmtLen1 = BDecLen (b, listBytesDecoded, env); listElmt = Append(); listElmt->BDecContent (b, tag1, elmtLen1, listBytesDecoded, env); } bytesDecoded += listBytesDecoded; } // AttributeCertificateInfoSeqOf::BDecContent AlgorithmIdentifier::AlgorithmIdentifier() { parameters = NULL; } AlgorithmIdentifier::AlgorithmIdentifier (const AlgorithmIdentifier &) { Asn1Error << "use of incompletely defined AlgorithmIdentifier::AlgorithmIdentifier (const AlgorithmIdentifier &)" << endl; abort(); } AlgorithmIdentifier::~AlgorithmIdentifier() { delete parameters; } AsnType *AlgorithmIdentifier::Clone() const { return new AlgorithmIdentifier; } AsnType *AlgorithmIdentifier::Copy() const { return new AlgorithmIdentifier (*this); } #if SNACC_DEEP_COPY AlgorithmIdentifier &AlgorithmIdentifier::operator = (const AlgorithmIdentifier &that) #else // SNACC_DEEP_COPY AlgorithmIdentifier &AlgorithmIdentifier::operator = (const AlgorithmIdentifier &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { algorithm = that.algorithm; if (that.parameters) { if (!parameters) parameters = new AsnAny; *parameters = *that.parameters; } else { delete parameters; parameters = NULL; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined AlgorithmIdentifier &AlgorithmIdentifier::operator = (const AlgorithmIdentifier &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen AlgorithmIdentifier::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; if (NOT_NULL (parameters)) { ENC_LOAD_ANYBUF(parameters, b, l); totalLen += l; } l = algorithm.BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, OID_TAG_CODE); totalLen += l; return totalLen; } // AlgorithmIdentifier::BEncContent void AlgorithmIdentifier::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, OID_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); algorithm.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = b.PeekByte(); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDecEoc (b, seqBytesDecoded, env); bytesDecoded += seqBytesDecoded; return; } } } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -104); } // ANY type parameters = new AsnAny; DEC_LOAD_ANYBUF(parameters, b, seqBytesDecoded, env); bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -105); } else return; } // AlgorithmIdentifier::BDecContent AsnLen AlgorithmIdentifier::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void AlgorithmIdentifier::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "AlgorithmIdentifier::BDec: ERROR - wrong tag" << endl; longjmp (env, -106); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int AlgorithmIdentifier::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int AlgorithmIdentifier::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void AlgorithmIdentifier::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; { Indent (os, indentG); os << "algorithm "; os << algorithm; os << "," << endl; } if (NOT_NULL (parameters)) { os << ","<< endl; Indent (os, indentG); os << "parameters "; os << *parameters; } else { Indent (os, indentG); os << "parameters "; os << "-- void --"; os << endl; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // AlgorithmIdentifier::Print Time::Time() { choiceId = utcTimeCid; #if TCL utcTime = new UTCTime; #else utcTime = NULL; // incomplete initialization of mandatory element! #endif // TCL } Time::Time (const Time &) { Asn1Error << "use of incompletely defined Time::Time (const Time &)" << endl; abort(); } Time::~Time() { switch (choiceId) { case utcTimeCid: delete utcTime; break; case generalizedTimeCid: delete generalizedTime; break; } // end of switch } // end of destructor AsnType *Time::Clone() const { return new Time; } AsnType *Time::Copy() const { return new Time (*this); } #if SNACC_DEEP_COPY Time &Time::operator = (const Time &that) #else // SNACC_DEEP_COPY Time &Time::operator = (const Time &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { switch (choiceId) { case utcTimeCid: delete utcTime; break; case generalizedTimeCid: delete generalizedTime; break; } switch (choiceId = that.choiceId) { case utcTimeCid: utcTime = new UTCTime; *utcTime = *that.utcTime; break; case generalizedTimeCid: generalizedTime = new GeneralizedTime; *generalizedTime = *that.generalizedTime; break; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined Time &Time::operator = (const Time &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen Time::BEncContent (BUF_TYPE b) { AsnLen l; switch (choiceId) { case utcTimeCid: l = utcTime->BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, UTCTIME_TAG_CODE); break; case generalizedTimeCid: l = generalizedTime->BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, GENERALIZEDTIME_TAG_CODE); break; } // end switch return l; } // Time::BEncContent void Time::BDecContent (BUF_TYPE b, AsnTag tag, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { switch (tag) { case MAKE_TAG_ID (UNIV, PRIM, UTCTIME_TAG_CODE): case MAKE_TAG_ID (UNIV, CONS, UTCTIME_TAG_CODE): choiceId = utcTimeCid; utcTime = new UTCTime; utcTime->BDecContent (b, tag, elmtLen0, bytesDecoded, env); break; case MAKE_TAG_ID (UNIV, PRIM, GENERALIZEDTIME_TAG_CODE): case MAKE_TAG_ID (UNIV, CONS, GENERALIZEDTIME_TAG_CODE): choiceId = generalizedTimeCid; generalizedTime = new GeneralizedTime; generalizedTime->BDecContent (b, tag, elmtLen0, bytesDecoded, env); break; default: Asn1Error << "ERROR - unexpected tag in CHOICE" << endl; longjmp (env, -107); break; } // end switch } // Time::BDecContent AsnLen Time::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); return l; } void Time::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnLen elmtLen; AsnTag tag; /* CHOICEs are a special case - grab identifying tag */ /* this allows easier handling of nested CHOICEs */ tag = BDecTag (b, bytesDecoded, env); elmtLen = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen, bytesDecoded, env); } int Time::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int Time::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void Time::Print (ostream &os) const { #ifndef NDEBUG switch (choiceId) { case utcTimeCid: os << "utcTime "; if (utcTime) os << *utcTime; else os << "-- void3 --\n"; break; case generalizedTimeCid: os << "generalizedTime "; if (generalizedTime) os << *generalizedTime; else os << "-- void3 --\n"; break; } // end of switch #endif /* NDEBUG */ } // Time::Print Extension::Extension() { critical = NULL; } Extension::Extension (const Extension &) { Asn1Error << "use of incompletely defined Extension::Extension (const Extension &)" << endl; abort(); } Extension::~Extension() { delete critical; } AsnType *Extension::Clone() const { return new Extension; } AsnType *Extension::Copy() const { return new Extension (*this); } #if SNACC_DEEP_COPY Extension &Extension::operator = (const Extension &that) #else // SNACC_DEEP_COPY Extension &Extension::operator = (const Extension &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { extnId = that.extnId; if (that.critical) { if (!critical) critical = new AsnBool; *critical = *that.critical; } else { delete critical; critical = NULL; } extnValue = that.extnValue; } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined Extension &Extension::operator = (const Extension &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen Extension::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; l = extnValue.BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, OCTETSTRING_TAG_CODE); totalLen += l; if (NOT_NULL (critical)) { l = critical->BEncContent (b); BEncDefLenTo127 (b, l); l++; l += BEncTag1 (b, UNIV, PRIM, BOOLEAN_TAG_CODE); totalLen += l; } l = extnId.BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, OID_TAG_CODE); totalLen += l; return totalLen; } // Extension::BEncContent void Extension::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, OID_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); extnId.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -108); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, BOOLEAN_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); critical = new AsnBool; critical->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, OCTETSTRING_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, OCTETSTRING_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); extnValue.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -109); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -110); } else return; } // Extension::BDecContent AsnLen Extension::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void Extension::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "Extension::BDec: ERROR - wrong tag" << endl; longjmp (env, -111); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int Extension::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int Extension::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void Extension::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; { Indent (os, indentG); os << "extnId "; os << extnId; os << "," << endl; } if (NOT_NULL (critical)) { Indent (os, indentG); os << "critical "; os << *critical; } else { Indent (os, indentG); os << "critical "; os << "-- void --"; os << "," << endl; } { Indent (os, indentG); os << "extnValue "; os << extnValue; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // Extension::Print AttCertValidityPeriod::AttCertValidityPeriod() { } AttCertValidityPeriod::AttCertValidityPeriod (const AttCertValidityPeriod &) { Asn1Error << "use of incompletely defined AttCertValidityPeriod::AttCertValidityPeriod (const AttCertValidityPeriod &)" << endl; abort(); } AttCertValidityPeriod::~AttCertValidityPeriod() { } AsnType *AttCertValidityPeriod::Clone() const { return new AttCertValidityPeriod; } AsnType *AttCertValidityPeriod::Copy() const { return new AttCertValidityPeriod (*this); } #if SNACC_DEEP_COPY AttCertValidityPeriod &AttCertValidityPeriod::operator = (const AttCertValidityPeriod &that) #else // SNACC_DEEP_COPY AttCertValidityPeriod &AttCertValidityPeriod::operator = (const AttCertValidityPeriod &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { notBeforeTime = that.notBeforeTime; notAfterTime = that.notAfterTime; } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined AttCertValidityPeriod &AttCertValidityPeriod::operator = (const AttCertValidityPeriod &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen AttCertValidityPeriod::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; l = notAfterTime.BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, GENERALIZEDTIME_TAG_CODE); totalLen += l; l = notBeforeTime.BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, GENERALIZEDTIME_TAG_CODE); totalLen += l; return totalLen; } // AttCertValidityPeriod::BEncContent void AttCertValidityPeriod::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, GENERALIZEDTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, GENERALIZEDTIME_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); notBeforeTime.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -112); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, GENERALIZEDTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, GENERALIZEDTIME_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); notAfterTime.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -113); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -114); } else return; } // AttCertValidityPeriod::BDecContent AsnLen AttCertValidityPeriod::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void AttCertValidityPeriod::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "AttCertValidityPeriod::BDec: ERROR - wrong tag" << endl; longjmp (env, -115); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int AttCertValidityPeriod::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int AttCertValidityPeriod::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void AttCertValidityPeriod::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; { Indent (os, indentG); os << "notBeforeTime "; os << notBeforeTime; os << "," << endl; } { Indent (os, indentG); os << "notAfterTime "; os << notAfterTime; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // AttCertValidityPeriod::Print Validity::Validity() { #if TCL notBefore = new Time; #else notBefore = NULL; // incomplete initialization of mandatory element! #endif // TCL #if TCL notAfter = new Time; #else notAfter = NULL; // incomplete initialization of mandatory element! #endif // TCL } Validity::Validity (const Validity &) { Asn1Error << "use of incompletely defined Validity::Validity (const Validity &)" << endl; abort(); } Validity::~Validity() { delete notBefore; delete notAfter; } AsnType *Validity::Clone() const { return new Validity; } AsnType *Validity::Copy() const { return new Validity (*this); } #if SNACC_DEEP_COPY Validity &Validity::operator = (const Validity &that) #else // SNACC_DEEP_COPY Validity &Validity::operator = (const Validity &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { if (that.notBefore) { if (!notBefore) notBefore = new Time; *notBefore = *that.notBefore; } else { delete notBefore; notBefore = NULL; } if (that.notAfter) { if (!notAfter) notAfter = new Time; *notAfter = *that.notAfter; } else { delete notAfter; notAfter = NULL; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined Validity &Validity::operator = (const Validity &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen Validity::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; l = notAfter->BEncContent (b); totalLen += l; l = notBefore->BEncContent (b); totalLen += l; return totalLen; } // Validity::BEncContent void Validity::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, UTCTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, UTCTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, PRIM, GENERALIZEDTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, GENERALIZEDTIME_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); notBefore = new Time; notBefore->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -116); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, UTCTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, UTCTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, PRIM, GENERALIZEDTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, GENERALIZEDTIME_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); notAfter = new Time; notAfter->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -117); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -118); } else return; } // Validity::BDecContent AsnLen Validity::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void Validity::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "Validity::BDec: ERROR - wrong tag" << endl; longjmp (env, -119); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int Validity::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int Validity::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void Validity::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; if (NOT_NULL (notBefore)) { Indent (os, indentG); os << "notBefore "; os << *notBefore; } else { Indent (os, indentG); os << "notBefore "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (notAfter)) { Indent (os, indentG); os << "notAfter "; os << *notAfter; } else { Indent (os, indentG); os << "notAfter "; os << "-- void --"; os << endl; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // Validity::Print SubjectPublicKeyInfo::SubjectPublicKeyInfo() { #if TCL algorithm = new AlgorithmIdentifier; #else algorithm = NULL; // incomplete initialization of mandatory element! #endif // TCL } SubjectPublicKeyInfo::SubjectPublicKeyInfo (const SubjectPublicKeyInfo &) { Asn1Error << "use of incompletely defined SubjectPublicKeyInfo::SubjectPublicKeyInfo (const SubjectPublicKeyInfo &)" << endl; abort(); } SubjectPublicKeyInfo::~SubjectPublicKeyInfo() { delete algorithm; } AsnType *SubjectPublicKeyInfo::Clone() const { return new SubjectPublicKeyInfo; } AsnType *SubjectPublicKeyInfo::Copy() const { return new SubjectPublicKeyInfo (*this); } #if SNACC_DEEP_COPY SubjectPublicKeyInfo &SubjectPublicKeyInfo::operator = (const SubjectPublicKeyInfo &that) #else // SNACC_DEEP_COPY SubjectPublicKeyInfo &SubjectPublicKeyInfo::operator = (const SubjectPublicKeyInfo &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { if (that.algorithm) { if (!algorithm) algorithm = new AlgorithmIdentifier; *algorithm = *that.algorithm; } else { delete algorithm; algorithm = NULL; } subjectPublicKey = that.subjectPublicKey; } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined SubjectPublicKeyInfo &SubjectPublicKeyInfo::operator = (const SubjectPublicKeyInfo &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen SubjectPublicKeyInfo::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; l = subjectPublicKey.BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, BITSTRING_TAG_CODE); totalLen += l; BEncEocIfNec (b); l = algorithm->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; return totalLen; } // SubjectPublicKeyInfo::BEncContent void SubjectPublicKeyInfo::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); algorithm = new AlgorithmIdentifier; algorithm->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -120); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, BITSTRING_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, BITSTRING_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); subjectPublicKey.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -121); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -122); } else return; } // SubjectPublicKeyInfo::BDecContent AsnLen SubjectPublicKeyInfo::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void SubjectPublicKeyInfo::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "SubjectPublicKeyInfo::BDec: ERROR - wrong tag" << endl; longjmp (env, -123); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int SubjectPublicKeyInfo::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int SubjectPublicKeyInfo::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void SubjectPublicKeyInfo::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; if (NOT_NULL (algorithm)) { Indent (os, indentG); os << "algorithm "; os << *algorithm; } else { Indent (os, indentG); os << "algorithm "; os << "-- void --"; os << "," << endl; } { Indent (os, indentG); os << "subjectPublicKey "; os << subjectPublicKey; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // SubjectPublicKeyInfo::Print AsnType *Extensions::Clone() const { return new Extensions; } AsnType *Extensions::Copy() const { return new Extensions (*this); } AsnLen Extensions::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void Extensions::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "Extensions::BDec: ERROR - wrong tag" << endl; longjmp (env, -124); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } Extensions::Extensions (const Extensions &) { Asn1Error << "use of incompletely defined Extensions::Extensions (const Extensions &)" << endl; abort(); } Extensions::~Extensions() { SetCurrToFirst(); for (; Curr() != NULL; RemoveCurrFromList()) ; } // end of destructor #if SNACC_DEEP_COPY Extensions &Extensions::operator = (const Extensions &that) #else // SNACC_DEEP_COPY Extensions &Extensions::operator = (const Extensions &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { SetCurrToFirst(); for (; Curr(); RemoveCurrFromList()) ; //that.SetCurrToFirst(); //for (; that.Curr(); that.GoNext()) // AppendCopy (*that.Curr()); for (const AsnListElmt *run=that.first; run; run=run->next) AppendCopy (*run->elmt); } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined Extensions &Extensions::operator = (const Extensions &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } void Extensions::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE/SET OF -- " << endl; indentG += stdIndentG; //SetCurrToFirst(); //for (; Curr() != NULL; GoNext()) for (const AsnListElmt *run=first; run; run=run->next) { Indent (os, indentG); //os << *Curr(); os << *run->elmt; //if (Curr() != Last()) if (run != last) os << ","; os << endl; } indentG -= stdIndentG; Indent (os, indentG); os << "}\n"; #endif /* NDEBUG */ } // Print void Extensions::SetCurrElmt (unsigned long int index) { unsigned long int i; curr = first; if (count) for (i = 0; (i < (count-1)) && (i < index); i++) curr = curr->next; } // Extensions::SetCurrElmt unsigned long int Extensions::GetCurrElmtIndex() { unsigned long int i; AsnListElmt *tmp; if (curr != NULL) { for (i = 0, tmp = first; tmp != NULL; i++) { if (tmp == curr) return i; else tmp = tmp->next; } } return count; } // Extensions::GetCurrElmtIndex // alloc new list elmt, put at end of list // and return the component type Extension *Extensions::Append() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Extension; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return (curr = newElmt)->elmt; } // Extensions::Append // alloc new list elmt, put at begining of list // and return the component type Extension *Extensions::Prepend() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Extension; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return (curr = newElmt)->elmt; } // Extensions::Prepend // alloc new list elmt, insert it before the // current element and return the component type // if the current element is null, the new element // is placed at the beginning of the list. Extension *Extensions::InsertBefore() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Extension; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return (curr = newElmt)->elmt; } // Extensions::InsertBefore // alloc new list elmt, insert it after the // current element and return the component type // if the current element is null, the new element // is placed at the end of the list. Extension *Extensions::InsertAfter() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Extension; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return (curr = newElmt)->elmt; } // Extensions::InsertAfter Extensions &Extensions::AppendCopy (Extension &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Extension; *newElmt->elmt = elmt; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return *this; } // AppendCopy Extensions &Extensions::PrependCopy (Extension &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Extension; *newElmt->elmt = elmt; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return *this; } // Extensions::PrependCopy // alloc new list elmt, insert it before the // current element, copy the given elmt into the new elmt // and return the component type. // if the current element is null, the new element // is placed at the beginning of the list. Extensions &Extensions::InsertBeforeAndCopy (Extension &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Extension; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return *this; } // Extensions::InsertBeforeAndCopy // alloc new list elmt, insert it after the // current element, copy given elmt in to new elmt // and return the component type // if the current element is null, the new element // is placed at the end of the list. Extensions &Extensions::InsertAfterAndCopy (Extension &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Extension; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return *this; } // Extensions::InsertAfterAndCopy // remove current element from list if current element is not NULL // The new current element will be the next element. // If the current element is the last element in the list // the second but last element will become the new current element. void Extensions::RemoveCurrFromList() { AsnListElmt *del_elmt; if (curr != NULL) { del_elmt = curr; count--; if (count == 0) first = last = curr = NULL; else if (curr == first) { curr = first= first->next; first->prev = NULL; } else if (curr == last) { curr = last = last->prev; last->next = NULL; } else { curr->prev->next = curr->next; curr->next->prev = curr->prev; } delete del_elmt->elmt; delete del_elmt; } } AsnLen Extensions::BEncContent (BUF_TYPE b) { AsnListElmt *currElmt; AsnLen elmtLen; AsnLen totalLen = 0; for (currElmt = last; currElmt != NULL; currElmt = currElmt->prev) { BEncEocIfNec (b); elmtLen = currElmt->elmt->BEncContent (b); elmtLen += BEncConsLen (b, elmtLen); elmtLen += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += elmtLen; } return totalLen; } // Extensions::BEncContent void Extensions::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { Extension *listElmt; AsnTag tag1; AsnLen listBytesDecoded = 0; AsnLen elmtLen1; while ((listBytesDecoded < elmtLen0) || (elmtLen0 == INDEFINITE_LEN)) { tag1 = BDecTag (b, listBytesDecoded, env); if ((tag1 == EOC_TAG_ID) && (elmtLen0 == INDEFINITE_LEN)) { BDEC_2ND_EOC_OCTET (b, listBytesDecoded, env); break; } if ((tag1 != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -125); } elmtLen1 = BDecLen (b, listBytesDecoded, env); listElmt = Append(); listElmt->BDecContent (b, tag1, elmtLen1, listBytesDecoded, env); } bytesDecoded += listBytesDecoded; } // Extensions::BDecContent IssuerSerial::IssuerSerial() { issuerUID = NULL; } IssuerSerial::IssuerSerial (const IssuerSerial &) { Asn1Error << "use of incompletely defined IssuerSerial::IssuerSerial (const IssuerSerial &)" << endl; abort(); } IssuerSerial::~IssuerSerial() { delete issuerUID; } AsnType *IssuerSerial::Clone() const { return new IssuerSerial; } AsnType *IssuerSerial::Copy() const { return new IssuerSerial (*this); } #if SNACC_DEEP_COPY IssuerSerial &IssuerSerial::operator = (const IssuerSerial &that) #else // SNACC_DEEP_COPY IssuerSerial &IssuerSerial::operator = (const IssuerSerial &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { issuer = that.issuer; serial = that.serial; if (that.issuerUID) { if (!issuerUID) issuerUID = new UniqueIdentifier; *issuerUID = *that.issuerUID; } else { delete issuerUID; issuerUID = NULL; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined IssuerSerial &IssuerSerial::operator = (const IssuerSerial &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen IssuerSerial::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; if (NOT_NULL (issuerUID)) { l = issuerUID->BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, BITSTRING_TAG_CODE); totalLen += l; } l = serial.BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, INTEGER_TAG_CODE); totalLen += l; BEncEocIfNec (b); l = issuer.BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; return totalLen; } // IssuerSerial::BEncContent void IssuerSerial::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); issuer.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -126); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, INTEGER_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, INTEGER_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); serial.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -127); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, BITSTRING_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, BITSTRING_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); issuerUID = new UniqueIdentifier; issuerUID->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -128); } else return; } // IssuerSerial::BDecContent AsnLen IssuerSerial::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void IssuerSerial::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "IssuerSerial::BDec: ERROR - wrong tag" << endl; longjmp (env, -129); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int IssuerSerial::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int IssuerSerial::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void IssuerSerial::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; { Indent (os, indentG); os << "issuer "; os << issuer; os << "," << endl; } { Indent (os, indentG); os << "serial "; os << serial; os << "," << endl; } if (NOT_NULL (issuerUID)) { os << ","<< endl; Indent (os, indentG); os << "issuerUID "; os << *issuerUID; } else { Indent (os, indentG); os << "issuerUID "; os << "-- void --"; os << endl; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // IssuerSerial::Print AttributeCertificateAssertionChoice::AttributeCertificateAssertionChoice() { choiceId = baseCertificateIDCid; #if TCL baseCertificateID = new IssuerSerial; #else baseCertificateID = NULL; // incomplete initialization of mandatory element! #endif // TCL } AttributeCertificateAssertionChoice::AttributeCertificateAssertionChoice (const AttributeCertificateAssertionChoice &) { Asn1Error << "use of incompletely defined AttributeCertificateAssertionChoice::AttributeCertificateAssertionChoice (const AttributeCertificateAssertionChoice &)" << endl; abort(); } AttributeCertificateAssertionChoice::~AttributeCertificateAssertionChoice() { switch (choiceId) { case baseCertificateIDCid: delete baseCertificateID; break; case subjectNameCid: delete subjectName; break; } // end of switch } // end of destructor AsnType *AttributeCertificateAssertionChoice::Clone() const { return new AttributeCertificateAssertionChoice; } AsnType *AttributeCertificateAssertionChoice::Copy() const { return new AttributeCertificateAssertionChoice (*this); } #if SNACC_DEEP_COPY AttributeCertificateAssertionChoice &AttributeCertificateAssertionChoice::operator = (const AttributeCertificateAssertionChoice &that) #else // SNACC_DEEP_COPY AttributeCertificateAssertionChoice &AttributeCertificateAssertionChoice::operator = (const AttributeCertificateAssertionChoice &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { switch (choiceId) { case baseCertificateIDCid: delete baseCertificateID; break; case subjectNameCid: delete subjectName; break; } switch (choiceId = that.choiceId) { case baseCertificateIDCid: baseCertificateID = new IssuerSerial; *baseCertificateID = *that.baseCertificateID; break; case subjectNameCid: subjectName = new Name; *subjectName = *that.subjectName; break; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined AttributeCertificateAssertionChoice &AttributeCertificateAssertionChoice::operator = (const AttributeCertificateAssertionChoice &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen AttributeCertificateAssertionChoice::BEncContent (BUF_TYPE b) { AsnLen l; switch (choiceId) { case baseCertificateIDCid: BEncEocIfNec (b); BEncEocIfNec (b); l = baseCertificateID->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); l += BEncConsLen (b, l); l += BEncTag1 (b, CNTX, CONS, 0); break; case subjectNameCid: BEncEocIfNec (b); l = subjectName->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, CNTX, CONS, 1); break; } // end switch return l; } // AttributeCertificateAssertionChoice::BEncContent void AttributeCertificateAssertionChoice::BDecContent (BUF_TYPE b, AsnTag tag, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnLen elmtLen1; switch (tag) { case MAKE_TAG_ID (CNTX, CONS, 0): tag = BDecTag (b, bytesDecoded, env); if (tag != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -130); } elmtLen1 = BDecLen (b, bytesDecoded, env); choiceId = baseCertificateIDCid; baseCertificateID = new IssuerSerial; baseCertificateID->BDecContent (b, tag, elmtLen1, bytesDecoded, env); if (elmtLen0 == INDEFINITE_LEN) BDecEoc (b, bytesDecoded, env); break; case MAKE_TAG_ID (CNTX, CONS, 1): tag = BDecTag (b, bytesDecoded, env); elmtLen1 = BDecLen (b, bytesDecoded, env); choiceId = subjectNameCid; subjectName = new Name; subjectName->BDecContent (b, tag, elmtLen1, bytesDecoded, env); if (elmtLen0 == INDEFINITE_LEN) BDecEoc (b, bytesDecoded, env); break; default: Asn1Error << "ERROR - unexpected tag in CHOICE" << endl; longjmp (env, -131); break; } // end switch } // AttributeCertificateAssertionChoice::BDecContent AsnLen AttributeCertificateAssertionChoice::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); return l; } void AttributeCertificateAssertionChoice::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnLen elmtLen; AsnTag tag; /* CHOICEs are a special case - grab identifying tag */ /* this allows easier handling of nested CHOICEs */ tag = BDecTag (b, bytesDecoded, env); elmtLen = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen, bytesDecoded, env); } int AttributeCertificateAssertionChoice::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int AttributeCertificateAssertionChoice::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void AttributeCertificateAssertionChoice::Print (ostream &os) const { #ifndef NDEBUG switch (choiceId) { case baseCertificateIDCid: os << "baseCertificateID "; if (baseCertificateID) os << *baseCertificateID; else os << "-- void3 --\n"; break; case subjectNameCid: os << "subjectName "; if (subjectName) os << *subjectName; else os << "-- void3 --\n"; break; } // end of switch #endif /* NDEBUG */ } // AttributeCertificateAssertionChoice::Print AttributeCertificateInfoChoice::AttributeCertificateInfoChoice() { choiceId = baseCertificateIDCid; #if TCL baseCertificateID = new IssuerSerial; #else baseCertificateID = NULL; // incomplete initialization of mandatory element! #endif // TCL } AttributeCertificateInfoChoice::AttributeCertificateInfoChoice (const AttributeCertificateInfoChoice &) { Asn1Error << "use of incompletely defined AttributeCertificateInfoChoice::AttributeCertificateInfoChoice (const AttributeCertificateInfoChoice &)" << endl; abort(); } AttributeCertificateInfoChoice::~AttributeCertificateInfoChoice() { switch (choiceId) { case baseCertificateIDCid: delete baseCertificateID; break; case subjectNameCid: delete subjectName; break; } // end of switch } // end of destructor AsnType *AttributeCertificateInfoChoice::Clone() const { return new AttributeCertificateInfoChoice; } AsnType *AttributeCertificateInfoChoice::Copy() const { return new AttributeCertificateInfoChoice (*this); } #if SNACC_DEEP_COPY AttributeCertificateInfoChoice &AttributeCertificateInfoChoice::operator = (const AttributeCertificateInfoChoice &that) #else // SNACC_DEEP_COPY AttributeCertificateInfoChoice &AttributeCertificateInfoChoice::operator = (const AttributeCertificateInfoChoice &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { switch (choiceId) { case baseCertificateIDCid: delete baseCertificateID; break; case subjectNameCid: delete subjectName; break; } switch (choiceId = that.choiceId) { case baseCertificateIDCid: baseCertificateID = new IssuerSerial; *baseCertificateID = *that.baseCertificateID; break; case subjectNameCid: subjectName = new GeneralNames; *subjectName = *that.subjectName; break; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined AttributeCertificateInfoChoice &AttributeCertificateInfoChoice::operator = (const AttributeCertificateInfoChoice &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen AttributeCertificateInfoChoice::BEncContent (BUF_TYPE b) { AsnLen l; switch (choiceId) { case baseCertificateIDCid: BEncEocIfNec (b); BEncEocIfNec (b); l = baseCertificateID->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); l += BEncConsLen (b, l); l += BEncTag1 (b, CNTX, CONS, 0); break; case subjectNameCid: BEncEocIfNec (b); BEncEocIfNec (b); l = subjectName->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); l += BEncConsLen (b, l); l += BEncTag1 (b, CNTX, CONS, 1); break; } // end switch return l; } // AttributeCertificateInfoChoice::BEncContent void AttributeCertificateInfoChoice::BDecContent (BUF_TYPE b, AsnTag tag, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnLen elmtLen1; switch (tag) { case MAKE_TAG_ID (CNTX, CONS, 0): tag = BDecTag (b, bytesDecoded, env); if (tag != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -132); } elmtLen1 = BDecLen (b, bytesDecoded, env); choiceId = baseCertificateIDCid; baseCertificateID = new IssuerSerial; baseCertificateID->BDecContent (b, tag, elmtLen1, bytesDecoded, env); if (elmtLen0 == INDEFINITE_LEN) BDecEoc (b, bytesDecoded, env); break; case MAKE_TAG_ID (CNTX, CONS, 1): tag = BDecTag (b, bytesDecoded, env); if (tag != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -133); } elmtLen1 = BDecLen (b, bytesDecoded, env); choiceId = subjectNameCid; subjectName = new GeneralNames; subjectName->BDecContent (b, tag, elmtLen1, bytesDecoded, env); if (elmtLen0 == INDEFINITE_LEN) BDecEoc (b, bytesDecoded, env); break; default: Asn1Error << "ERROR - unexpected tag in CHOICE" << endl; longjmp (env, -134); break; } // end switch } // AttributeCertificateInfoChoice::BDecContent AsnLen AttributeCertificateInfoChoice::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); return l; } void AttributeCertificateInfoChoice::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnLen elmtLen; AsnTag tag; /* CHOICEs are a special case - grab identifying tag */ /* this allows easier handling of nested CHOICEs */ tag = BDecTag (b, bytesDecoded, env); elmtLen = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen, bytesDecoded, env); } int AttributeCertificateInfoChoice::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int AttributeCertificateInfoChoice::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void AttributeCertificateInfoChoice::Print (ostream &os) const { #ifndef NDEBUG switch (choiceId) { case baseCertificateIDCid: os << "baseCertificateID "; if (baseCertificateID) os << *baseCertificateID; else os << "-- void3 --\n"; break; case subjectNameCid: os << "subjectName "; if (subjectName) os << *subjectName; else os << "-- void3 --\n"; break; } // end of switch #endif /* NDEBUG */ } // AttributeCertificateInfoChoice::Print CRLToSignSeqOfSeq::CRLToSignSeqOfSeq() { #if TCL revocationDate = new Time; #else revocationDate = NULL; // incomplete initialization of mandatory element! #endif // TCL crlEntryExtensions = NULL; } CRLToSignSeqOfSeq::CRLToSignSeqOfSeq (const CRLToSignSeqOfSeq &) { Asn1Error << "use of incompletely defined CRLToSignSeqOfSeq::CRLToSignSeqOfSeq (const CRLToSignSeqOfSeq &)" << endl; abort(); } CRLToSignSeqOfSeq::~CRLToSignSeqOfSeq() { delete revocationDate; delete crlEntryExtensions; } AsnType *CRLToSignSeqOfSeq::Clone() const { return new CRLToSignSeqOfSeq; } AsnType *CRLToSignSeqOfSeq::Copy() const { return new CRLToSignSeqOfSeq (*this); } #if SNACC_DEEP_COPY CRLToSignSeqOfSeq &CRLToSignSeqOfSeq::operator = (const CRLToSignSeqOfSeq &that) #else // SNACC_DEEP_COPY CRLToSignSeqOfSeq &CRLToSignSeqOfSeq::operator = (const CRLToSignSeqOfSeq &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { userCertificate = that.userCertificate; if (that.revocationDate) { if (!revocationDate) revocationDate = new Time; *revocationDate = *that.revocationDate; } else { delete revocationDate; revocationDate = NULL; } if (that.crlEntryExtensions) { if (!crlEntryExtensions) crlEntryExtensions = new Extensions; *crlEntryExtensions = *that.crlEntryExtensions; } else { delete crlEntryExtensions; crlEntryExtensions = NULL; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined CRLToSignSeqOfSeq &CRLToSignSeqOfSeq::operator = (const CRLToSignSeqOfSeq &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen CRLToSignSeqOfSeq::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; if (NOT_NULL (crlEntryExtensions)) { BEncEocIfNec (b); l = crlEntryExtensions->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; } l = revocationDate->BEncContent (b); totalLen += l; l = userCertificate.BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, INTEGER_TAG_CODE); totalLen += l; return totalLen; } // CRLToSignSeqOfSeq::BEncContent void CRLToSignSeqOfSeq::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, INTEGER_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, INTEGER_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); userCertificate.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -135); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, UTCTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, UTCTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, PRIM, GENERALIZEDTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, GENERALIZEDTIME_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); revocationDate = new Time; revocationDate->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -136); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); crlEntryExtensions = new Extensions; crlEntryExtensions->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -137); } else return; } // CRLToSignSeqOfSeq::BDecContent AsnLen CRLToSignSeqOfSeq::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void CRLToSignSeqOfSeq::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "CRLToSignSeqOfSeq::BDec: ERROR - wrong tag" << endl; longjmp (env, -138); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int CRLToSignSeqOfSeq::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int CRLToSignSeqOfSeq::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void CRLToSignSeqOfSeq::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; { Indent (os, indentG); os << "userCertificate "; os << userCertificate; os << "," << endl; } if (NOT_NULL (revocationDate)) { Indent (os, indentG); os << "revocationDate "; os << *revocationDate; } else { Indent (os, indentG); os << "revocationDate "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (crlEntryExtensions)) { os << ","<< endl; Indent (os, indentG); os << "crlEntryExtensions "; os << *crlEntryExtensions; } else { Indent (os, indentG); os << "crlEntryExtensions "; os << "-- void --"; os << endl; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // CRLToSignSeqOfSeq::Print AsnType *CRLToSignSeqOf::Clone() const { return new CRLToSignSeqOf; } AsnType *CRLToSignSeqOf::Copy() const { return new CRLToSignSeqOf (*this); } AsnLen CRLToSignSeqOf::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void CRLToSignSeqOf::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "CRLToSignSeqOf::BDec: ERROR - wrong tag" << endl; longjmp (env, -139); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } CRLToSignSeqOf::CRLToSignSeqOf (const CRLToSignSeqOf &) { Asn1Error << "use of incompletely defined CRLToSignSeqOf::CRLToSignSeqOf (const CRLToSignSeqOf &)" << endl; abort(); } CRLToSignSeqOf::~CRLToSignSeqOf() { SetCurrToFirst(); for (; Curr() != NULL; RemoveCurrFromList()) ; } // end of destructor #if SNACC_DEEP_COPY CRLToSignSeqOf &CRLToSignSeqOf::operator = (const CRLToSignSeqOf &that) #else // SNACC_DEEP_COPY CRLToSignSeqOf &CRLToSignSeqOf::operator = (const CRLToSignSeqOf &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { SetCurrToFirst(); for (; Curr(); RemoveCurrFromList()) ; //that.SetCurrToFirst(); //for (; that.Curr(); that.GoNext()) // AppendCopy (*that.Curr()); for (const AsnListElmt *run=that.first; run; run=run->next) AppendCopy (*run->elmt); } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined CRLToSignSeqOf &CRLToSignSeqOf::operator = (const CRLToSignSeqOf &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } void CRLToSignSeqOf::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE/SET OF -- " << endl; indentG += stdIndentG; //SetCurrToFirst(); //for (; Curr() != NULL; GoNext()) for (const AsnListElmt *run=first; run; run=run->next) { Indent (os, indentG); //os << *Curr(); os << *run->elmt; //if (Curr() != Last()) if (run != last) os << ","; os << endl; } indentG -= stdIndentG; Indent (os, indentG); os << "}\n"; #endif /* NDEBUG */ } // Print void CRLToSignSeqOf::SetCurrElmt (unsigned long int index) { unsigned long int i; curr = first; if (count) for (i = 0; (i < (count-1)) && (i < index); i++) curr = curr->next; } // CRLToSignSeqOf::SetCurrElmt unsigned long int CRLToSignSeqOf::GetCurrElmtIndex() { unsigned long int i; AsnListElmt *tmp; if (curr != NULL) { for (i = 0, tmp = first; tmp != NULL; i++) { if (tmp == curr) return i; else tmp = tmp->next; } } return count; } // CRLToSignSeqOf::GetCurrElmtIndex // alloc new list elmt, put at end of list // and return the component type CRLToSignSeqOfSeq *CRLToSignSeqOf::Append() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CRLToSignSeqOfSeq; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return (curr = newElmt)->elmt; } // CRLToSignSeqOf::Append // alloc new list elmt, put at begining of list // and return the component type CRLToSignSeqOfSeq *CRLToSignSeqOf::Prepend() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CRLToSignSeqOfSeq; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return (curr = newElmt)->elmt; } // CRLToSignSeqOf::Prepend // alloc new list elmt, insert it before the // current element and return the component type // if the current element is null, the new element // is placed at the beginning of the list. CRLToSignSeqOfSeq *CRLToSignSeqOf::InsertBefore() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CRLToSignSeqOfSeq; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return (curr = newElmt)->elmt; } // CRLToSignSeqOf::InsertBefore // alloc new list elmt, insert it after the // current element and return the component type // if the current element is null, the new element // is placed at the end of the list. CRLToSignSeqOfSeq *CRLToSignSeqOf::InsertAfter() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CRLToSignSeqOfSeq; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return (curr = newElmt)->elmt; } // CRLToSignSeqOf::InsertAfter CRLToSignSeqOf &CRLToSignSeqOf::AppendCopy (CRLToSignSeqOfSeq &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CRLToSignSeqOfSeq; *newElmt->elmt = elmt; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return *this; } // AppendCopy CRLToSignSeqOf &CRLToSignSeqOf::PrependCopy (CRLToSignSeqOfSeq &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CRLToSignSeqOfSeq; *newElmt->elmt = elmt; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return *this; } // CRLToSignSeqOf::PrependCopy // alloc new list elmt, insert it before the // current element, copy the given elmt into the new elmt // and return the component type. // if the current element is null, the new element // is placed at the beginning of the list. CRLToSignSeqOf &CRLToSignSeqOf::InsertBeforeAndCopy (CRLToSignSeqOfSeq &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CRLToSignSeqOfSeq; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return *this; } // CRLToSignSeqOf::InsertBeforeAndCopy // alloc new list elmt, insert it after the // current element, copy given elmt in to new elmt // and return the component type // if the current element is null, the new element // is placed at the end of the list. CRLToSignSeqOf &CRLToSignSeqOf::InsertAfterAndCopy (CRLToSignSeqOfSeq &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CRLToSignSeqOfSeq; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return *this; } // CRLToSignSeqOf::InsertAfterAndCopy // remove current element from list if current element is not NULL // The new current element will be the next element. // If the current element is the last element in the list // the second but last element will become the new current element. void CRLToSignSeqOf::RemoveCurrFromList() { AsnListElmt *del_elmt; if (curr != NULL) { del_elmt = curr; count--; if (count == 0) first = last = curr = NULL; else if (curr == first) { curr = first= first->next; first->prev = NULL; } else if (curr == last) { curr = last = last->prev; last->next = NULL; } else { curr->prev->next = curr->next; curr->next->prev = curr->prev; } delete del_elmt->elmt; delete del_elmt; } } AsnLen CRLToSignSeqOf::BEncContent (BUF_TYPE b) { AsnListElmt *currElmt; AsnLen elmtLen; AsnLen totalLen = 0; for (currElmt = last; currElmt != NULL; currElmt = currElmt->prev) { BEncEocIfNec (b); elmtLen = currElmt->elmt->BEncContent (b); elmtLen += BEncConsLen (b, elmtLen); elmtLen += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += elmtLen; } return totalLen; } // CRLToSignSeqOf::BEncContent void CRLToSignSeqOf::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { CRLToSignSeqOfSeq *listElmt; AsnTag tag1; AsnLen listBytesDecoded = 0; AsnLen elmtLen1; while ((listBytesDecoded < elmtLen0) || (elmtLen0 == INDEFINITE_LEN)) { tag1 = BDecTag (b, listBytesDecoded, env); if ((tag1 == EOC_TAG_ID) && (elmtLen0 == INDEFINITE_LEN)) { BDEC_2ND_EOC_OCTET (b, listBytesDecoded, env); break; } if ((tag1 != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -140); } elmtLen1 = BDecLen (b, listBytesDecoded, env); listElmt = Append(); listElmt->BDecContent (b, tag1, elmtLen1, listBytesDecoded, env); } bytesDecoded += listBytesDecoded; } // CRLToSignSeqOf::BDecContent CertificateToSign::CertificateToSign() { version = NULL; #if TCL signature = new AlgorithmIdentifier; #else signature = NULL; // incomplete initialization of mandatory element! #endif // TCL #if TCL issuer = new Name; #else issuer = NULL; // incomplete initialization of mandatory element! #endif // TCL #if TCL validity = new Validity; #else validity = NULL; // incomplete initialization of mandatory element! #endif // TCL #if TCL subject = new Name; #else subject = NULL; // incomplete initialization of mandatory element! #endif // TCL #if TCL subjectPublicKeyInfo = new SubjectPublicKeyInfo; #else subjectPublicKeyInfo = NULL; // incomplete initialization of mandatory element! #endif // TCL issuerUniqueIdentifier = NULL; subjectUniqueIdentifier = NULL; extensions = NULL; } CertificateToSign::CertificateToSign (const CertificateToSign &) { Asn1Error << "use of incompletely defined CertificateToSign::CertificateToSign (const CertificateToSign &)" << endl; abort(); } CertificateToSign::~CertificateToSign() { delete version; delete signature; delete issuer; delete validity; delete subject; delete subjectPublicKeyInfo; delete issuerUniqueIdentifier; delete subjectUniqueIdentifier; delete extensions; } AsnType *CertificateToSign::Clone() const { return new CertificateToSign; } AsnType *CertificateToSign::Copy() const { return new CertificateToSign (*this); } #if SNACC_DEEP_COPY CertificateToSign &CertificateToSign::operator = (const CertificateToSign &that) #else // SNACC_DEEP_COPY CertificateToSign &CertificateToSign::operator = (const CertificateToSign &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { if (that.version) { if (!version) version = new Version; *version = *that.version; } else { delete version; version = NULL; } serialNumber = that.serialNumber; if (that.signature) { if (!signature) signature = new AlgorithmIdentifier; *signature = *that.signature; } else { delete signature; signature = NULL; } if (that.issuer) { if (!issuer) issuer = new Name; *issuer = *that.issuer; } else { delete issuer; issuer = NULL; } if (that.validity) { if (!validity) validity = new Validity; *validity = *that.validity; } else { delete validity; validity = NULL; } if (that.subject) { if (!subject) subject = new Name; *subject = *that.subject; } else { delete subject; subject = NULL; } if (that.subjectPublicKeyInfo) { if (!subjectPublicKeyInfo) subjectPublicKeyInfo = new SubjectPublicKeyInfo; *subjectPublicKeyInfo = *that.subjectPublicKeyInfo; } else { delete subjectPublicKeyInfo; subjectPublicKeyInfo = NULL; } if (that.issuerUniqueIdentifier) { if (!issuerUniqueIdentifier) issuerUniqueIdentifier = new UniqueIdentifier; *issuerUniqueIdentifier = *that.issuerUniqueIdentifier; } else { delete issuerUniqueIdentifier; issuerUniqueIdentifier = NULL; } if (that.subjectUniqueIdentifier) { if (!subjectUniqueIdentifier) subjectUniqueIdentifier = new UniqueIdentifier; *subjectUniqueIdentifier = *that.subjectUniqueIdentifier; } else { delete subjectUniqueIdentifier; subjectUniqueIdentifier = NULL; } if (that.extensions) { if (!extensions) extensions = new Extensions; *extensions = *that.extensions; } else { delete extensions; extensions = NULL; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined CertificateToSign &CertificateToSign::operator = (const CertificateToSign &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen CertificateToSign::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; if (NOT_NULL (extensions)) { BEncEocIfNec (b); BEncEocIfNec (b); l = extensions->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); l += BEncConsLen (b, l); l += BEncTag1 (b, CNTX, CONS, 3); totalLen += l; } if (NOT_NULL (subjectUniqueIdentifier)) { l = subjectUniqueIdentifier->BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, CNTX, PRIM, 2); totalLen += l; } if (NOT_NULL (issuerUniqueIdentifier)) { l = issuerUniqueIdentifier->BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, CNTX, PRIM, 1); totalLen += l; } BEncEocIfNec (b); l = subjectPublicKeyInfo->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; l = subject->BEncContent (b); totalLen += l; BEncEocIfNec (b); l = validity->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; l = issuer->BEncContent (b); totalLen += l; BEncEocIfNec (b); l = signature->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; l = serialNumber.BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, INTEGER_TAG_CODE); totalLen += l; if (NOT_NULL (version)) { BEncEocIfNec (b); l = version->BEncContent (b); BEncDefLenTo127 (b, l); l++; l += BEncTag1 (b, UNIV, PRIM, INTEGER_TAG_CODE); l += BEncConsLen (b, l); l += BEncTag1 (b, CNTX, CONS, 0); totalLen += l; } return totalLen; } // CertificateToSign::BEncContent void CertificateToSign::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; AsnLen elmtLen2; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (CNTX, CONS, 0))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); if (tag1 != MAKE_TAG_ID (UNIV, PRIM, INTEGER_TAG_CODE)) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -141); } elmtLen2 = BDecLen (b, seqBytesDecoded, env); version = new Version; version->BDecContent (b, tag1, elmtLen2, seqBytesDecoded, env); if (elmtLen1 == INDEFINITE_LEN) BDecEoc (b, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, INTEGER_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, INTEGER_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); serialNumber.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -142); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); signature = new AlgorithmIdentifier; signature->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -143); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); issuer = new Name; issuer->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -144); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); validity = new Validity; validity->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -145); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); subject = new Name; subject->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -146); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); subjectPublicKeyInfo = new SubjectPublicKeyInfo; subjectPublicKeyInfo->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -147); } if ((tag1 == MAKE_TAG_ID (CNTX, PRIM, 1)) || (tag1 == MAKE_TAG_ID (CNTX, CONS, 1))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); issuerUniqueIdentifier = new UniqueIdentifier; issuerUniqueIdentifier->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } if ((tag1 == MAKE_TAG_ID (CNTX, PRIM, 2)) || (tag1 == MAKE_TAG_ID (CNTX, CONS, 2))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); subjectUniqueIdentifier = new UniqueIdentifier; subjectUniqueIdentifier->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } if ((tag1 == MAKE_TAG_ID (CNTX, CONS, 3))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); if (tag1 != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -148); } elmtLen2 = BDecLen (b, seqBytesDecoded, env); extensions = new Extensions; extensions->BDecContent (b, tag1, elmtLen2, seqBytesDecoded, env); if (elmtLen1 == INDEFINITE_LEN) BDecEoc (b, seqBytesDecoded, env); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -149); } else return; } // CertificateToSign::BDecContent AsnLen CertificateToSign::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void CertificateToSign::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "CertificateToSign::BDec: ERROR - wrong tag" << endl; longjmp (env, -150); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int CertificateToSign::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int CertificateToSign::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void CertificateToSign::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; if (NOT_NULL (version)) { Indent (os, indentG); os << "version "; os << *version; } else { Indent (os, indentG); os << "version "; os << "-- void --"; os << "," << endl; } { Indent (os, indentG); os << "serialNumber "; os << serialNumber; os << "," << endl; } if (NOT_NULL (signature)) { Indent (os, indentG); os << "signature "; os << *signature; } else { Indent (os, indentG); os << "signature "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (issuer)) { Indent (os, indentG); os << "issuer "; os << *issuer; } else { Indent (os, indentG); os << "issuer "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (validity)) { Indent (os, indentG); os << "validity "; os << *validity; } else { Indent (os, indentG); os << "validity "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (subject)) { Indent (os, indentG); os << "subject "; os << *subject; } else { Indent (os, indentG); os << "subject "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (subjectPublicKeyInfo)) { Indent (os, indentG); os << "subjectPublicKeyInfo "; os << *subjectPublicKeyInfo; } else { Indent (os, indentG); os << "subjectPublicKeyInfo "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (issuerUniqueIdentifier)) { os << ","<< endl; Indent (os, indentG); os << "issuerUniqueIdentifier "; os << *issuerUniqueIdentifier; } else { Indent (os, indentG); os << "issuerUniqueIdentifier "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (subjectUniqueIdentifier)) { os << ","<< endl; Indent (os, indentG); os << "subjectUniqueIdentifier "; os << *subjectUniqueIdentifier; } else { Indent (os, indentG); os << "subjectUniqueIdentifier "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (extensions)) { os << ","<< endl; Indent (os, indentG); os << "extensions "; os << *extensions; } else { Indent (os, indentG); os << "extensions "; os << "-- void --"; os << endl; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // CertificateToSign::Print CRLToSign::CRLToSign() { version = NULL; #if TCL signature = new AlgorithmIdentifier; #else signature = NULL; // incomplete initialization of mandatory element! #endif // TCL #if TCL issuer = new Name; #else issuer = NULL; // incomplete initialization of mandatory element! #endif // TCL #if TCL thisUpdate = new Time; #else thisUpdate = NULL; // incomplete initialization of mandatory element! #endif // TCL nextUpdate = NULL; revokedCertificates = NULL; crlExtensions = NULL; } CRLToSign::CRLToSign (const CRLToSign &) { Asn1Error << "use of incompletely defined CRLToSign::CRLToSign (const CRLToSign &)" << endl; abort(); } CRLToSign::~CRLToSign() { delete version; delete signature; delete issuer; delete thisUpdate; delete nextUpdate; delete revokedCertificates; delete crlExtensions; } AsnType *CRLToSign::Clone() const { return new CRLToSign; } AsnType *CRLToSign::Copy() const { return new CRLToSign (*this); } #if SNACC_DEEP_COPY CRLToSign &CRLToSign::operator = (const CRLToSign &that) #else // SNACC_DEEP_COPY CRLToSign &CRLToSign::operator = (const CRLToSign &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { if (that.version) { if (!version) version = new Version; *version = *that.version; } else { delete version; version = NULL; } if (that.signature) { if (!signature) signature = new AlgorithmIdentifier; *signature = *that.signature; } else { delete signature; signature = NULL; } if (that.issuer) { if (!issuer) issuer = new Name; *issuer = *that.issuer; } else { delete issuer; issuer = NULL; } if (that.thisUpdate) { if (!thisUpdate) thisUpdate = new Time; *thisUpdate = *that.thisUpdate; } else { delete thisUpdate; thisUpdate = NULL; } if (that.nextUpdate) { if (!nextUpdate) nextUpdate = new Time; *nextUpdate = *that.nextUpdate; } else { delete nextUpdate; nextUpdate = NULL; } if (that.revokedCertificates) { if (!revokedCertificates) revokedCertificates = new CRLToSignSeqOf; *revokedCertificates = *that.revokedCertificates; } else { delete revokedCertificates; revokedCertificates = NULL; } if (that.crlExtensions) { if (!crlExtensions) crlExtensions = new Extensions; *crlExtensions = *that.crlExtensions; } else { delete crlExtensions; crlExtensions = NULL; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined CRLToSign &CRLToSign::operator = (const CRLToSign &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen CRLToSign::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; if (NOT_NULL (crlExtensions)) { BEncEocIfNec (b); BEncEocIfNec (b); l = crlExtensions->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); l += BEncConsLen (b, l); l += BEncTag1 (b, CNTX, CONS, 0); totalLen += l; } if (NOT_NULL (revokedCertificates)) { BEncEocIfNec (b); l = revokedCertificates->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; } if (NOT_NULL (nextUpdate)) { l = nextUpdate->BEncContent (b); totalLen += l; } l = thisUpdate->BEncContent (b); totalLen += l; l = issuer->BEncContent (b); totalLen += l; BEncEocIfNec (b); l = signature->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; if (NOT_NULL (version)) { l = version->BEncContent (b); BEncDefLenTo127 (b, l); l++; l += BEncTag1 (b, UNIV, PRIM, INTEGER_TAG_CODE); totalLen += l; } return totalLen; } // CRLToSign::BEncContent void CRLToSign::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; AsnLen elmtLen2; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, INTEGER_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); version = new Version; version->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); signature = new AlgorithmIdentifier; signature->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -151); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); issuer = new Name; issuer->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -152); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, UTCTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, UTCTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, PRIM, GENERALIZEDTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, GENERALIZEDTIME_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); thisUpdate = new Time; thisUpdate->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -153); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, UTCTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, UTCTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, PRIM, GENERALIZEDTIME_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, GENERALIZEDTIME_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); nextUpdate = new Time; nextUpdate->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); revokedCertificates = new CRLToSignSeqOf; revokedCertificates->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } if ((tag1 == MAKE_TAG_ID (CNTX, CONS, 0))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); if (tag1 != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -154); } elmtLen2 = BDecLen (b, seqBytesDecoded, env); crlExtensions = new Extensions; crlExtensions->BDecContent (b, tag1, elmtLen2, seqBytesDecoded, env); if (elmtLen1 == INDEFINITE_LEN) BDecEoc (b, seqBytesDecoded, env); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -155); } else return; } // CRLToSign::BDecContent AsnLen CRLToSign::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void CRLToSign::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "CRLToSign::BDec: ERROR - wrong tag" << endl; longjmp (env, -156); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int CRLToSign::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int CRLToSign::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void CRLToSign::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; if (NOT_NULL (version)) { Indent (os, indentG); os << "version "; os << *version; } else { Indent (os, indentG); os << "version "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (signature)) { Indent (os, indentG); os << "signature "; os << *signature; } else { Indent (os, indentG); os << "signature "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (issuer)) { Indent (os, indentG); os << "issuer "; os << *issuer; } else { Indent (os, indentG); os << "issuer "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (thisUpdate)) { Indent (os, indentG); os << "thisUpdate "; os << *thisUpdate; } else { Indent (os, indentG); os << "thisUpdate "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (nextUpdate)) { os << ","<< endl; Indent (os, indentG); os << "nextUpdate "; os << *nextUpdate; } else { Indent (os, indentG); os << "nextUpdate "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (revokedCertificates)) { os << ","<< endl; Indent (os, indentG); os << "revokedCertificates "; os << *revokedCertificates; } else { Indent (os, indentG); os << "revokedCertificates "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (crlExtensions)) { os << ","<< endl; Indent (os, indentG); os << "crlExtensions "; os << *crlExtensions; } else { Indent (os, indentG); os << "crlExtensions "; os << "-- void --"; os << endl; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // CRLToSign::Print AttributeCertificateInfo::AttributeCertificateInfo() { version = NULL; #if TCL subject = new AttributeCertificateInfoChoice; #else subject = NULL; // incomplete initialization of mandatory element! #endif // TCL #if TCL signature = new AlgorithmIdentifier; #else signature = NULL; // incomplete initialization of mandatory element! #endif // TCL #if TCL attCertValidityPeriod = new AttCertValidityPeriod; #else attCertValidityPeriod = NULL; // incomplete initialization of mandatory element! #endif // TCL issuerUniqueID = NULL; extensions = NULL; } AttributeCertificateInfo::AttributeCertificateInfo (const AttributeCertificateInfo &) { Asn1Error << "use of incompletely defined AttributeCertificateInfo::AttributeCertificateInfo (const AttributeCertificateInfo &)" << endl; abort(); } AttributeCertificateInfo::~AttributeCertificateInfo() { delete version; delete subject; delete signature; delete attCertValidityPeriod; delete issuerUniqueID; delete extensions; } AsnType *AttributeCertificateInfo::Clone() const { return new AttributeCertificateInfo; } AsnType *AttributeCertificateInfo::Copy() const { return new AttributeCertificateInfo (*this); } #if SNACC_DEEP_COPY AttributeCertificateInfo &AttributeCertificateInfo::operator = (const AttributeCertificateInfo &that) #else // SNACC_DEEP_COPY AttributeCertificateInfo &AttributeCertificateInfo::operator = (const AttributeCertificateInfo &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { if (that.version) { if (!version) version = new Version; *version = *that.version; } else { delete version; version = NULL; } if (that.subject) { if (!subject) subject = new AttributeCertificateInfoChoice; *subject = *that.subject; } else { delete subject; subject = NULL; } issuer = that.issuer; if (that.signature) { if (!signature) signature = new AlgorithmIdentifier; *signature = *that.signature; } else { delete signature; signature = NULL; } serialNumber = that.serialNumber; if (that.attCertValidityPeriod) { if (!attCertValidityPeriod) attCertValidityPeriod = new AttCertValidityPeriod; *attCertValidityPeriod = *that.attCertValidityPeriod; } else { delete attCertValidityPeriod; attCertValidityPeriod = NULL; } attributes = that.attributes; if (that.issuerUniqueID) { if (!issuerUniqueID) issuerUniqueID = new UniqueIdentifier; *issuerUniqueID = *that.issuerUniqueID; } else { delete issuerUniqueID; issuerUniqueID = NULL; } if (that.extensions) { if (!extensions) extensions = new Extensions; *extensions = *that.extensions; } else { delete extensions; extensions = NULL; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined AttributeCertificateInfo &AttributeCertificateInfo::operator = (const AttributeCertificateInfo &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen AttributeCertificateInfo::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; if (NOT_NULL (extensions)) { BEncEocIfNec (b); l = extensions->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; } if (NOT_NULL (issuerUniqueID)) { l = issuerUniqueID->BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, BITSTRING_TAG_CODE); totalLen += l; } BEncEocIfNec (b); l = attributes.BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; BEncEocIfNec (b); l = attCertValidityPeriod->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; l = serialNumber.BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, INTEGER_TAG_CODE); totalLen += l; BEncEocIfNec (b); l = signature->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; BEncEocIfNec (b); l = issuer.BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; l = subject->BEncContent (b); totalLen += l; if (NOT_NULL (version)) { l = version->BEncContent (b); BEncDefLenTo127 (b, l); l++; l += BEncTag1 (b, UNIV, PRIM, INTEGER_TAG_CODE); totalLen += l; } return totalLen; } // AttributeCertificateInfo::BEncContent void AttributeCertificateInfo::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, INTEGER_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); version = new Version; version->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } if ((tag1 == MAKE_TAG_ID (CNTX, CONS, 0)) || (tag1 == MAKE_TAG_ID (CNTX, CONS, 1))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); subject = new AttributeCertificateInfoChoice; subject->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -157); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); issuer.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -158); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); signature = new AlgorithmIdentifier; signature->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -159); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, INTEGER_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, INTEGER_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); serialNumber.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -160); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); attCertValidityPeriod = new AttCertValidityPeriod; attCertValidityPeriod->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -161); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); attributes.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -162); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, BITSTRING_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, BITSTRING_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); issuerUniqueID = new UniqueIdentifier; issuerUniqueID->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); extensions = new Extensions; extensions->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -163); } else return; } // AttributeCertificateInfo::BDecContent AsnLen AttributeCertificateInfo::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void AttributeCertificateInfo::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "AttributeCertificateInfo::BDec: ERROR - wrong tag" << endl; longjmp (env, -164); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int AttributeCertificateInfo::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int AttributeCertificateInfo::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void AttributeCertificateInfo::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; if (NOT_NULL (version)) { Indent (os, indentG); os << "version "; os << *version; } else { Indent (os, indentG); os << "version "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (subject)) { Indent (os, indentG); os << "subject "; os << *subject; } else { Indent (os, indentG); os << "subject "; os << "-- void --"; os << "," << endl; } { Indent (os, indentG); os << "issuer "; os << issuer; os << "," << endl; } if (NOT_NULL (signature)) { Indent (os, indentG); os << "signature "; os << *signature; } else { Indent (os, indentG); os << "signature "; os << "-- void --"; os << "," << endl; } { Indent (os, indentG); os << "serialNumber "; os << serialNumber; os << "," << endl; } if (NOT_NULL (attCertValidityPeriod)) { Indent (os, indentG); os << "attCertValidityPeriod "; os << *attCertValidityPeriod; } else { Indent (os, indentG); os << "attCertValidityPeriod "; os << "-- void --"; os << "," << endl; } { Indent (os, indentG); os << "attributes "; os << attributes; os << "," << endl; } if (NOT_NULL (issuerUniqueID)) { os << ","<< endl; Indent (os, indentG); os << "issuerUniqueID "; os << *issuerUniqueID; } else { Indent (os, indentG); os << "issuerUniqueID "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (extensions)) { os << ","<< endl; Indent (os, indentG); os << "extensions "; os << *extensions; } else { Indent (os, indentG); os << "extensions "; os << "-- void --"; os << endl; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // AttributeCertificateInfo::Print Certificate::Certificate() { #if TCL certificateToSign = new CertificateToSign; #else certificateToSign = NULL; // incomplete initialization of mandatory element! #endif // TCL #if TCL algorithmIdentifier = new AlgorithmIdentifier; #else algorithmIdentifier = NULL; // incomplete initialization of mandatory element! #endif // TCL } Certificate::Certificate (const Certificate &) { Asn1Error << "use of incompletely defined Certificate::Certificate (const Certificate &)" << endl; abort(); } Certificate::~Certificate() { delete certificateToSign; delete algorithmIdentifier; } AsnType *Certificate::Clone() const { return new Certificate; } AsnType *Certificate::Copy() const { return new Certificate (*this); } #if SNACC_DEEP_COPY Certificate &Certificate::operator = (const Certificate &that) #else // SNACC_DEEP_COPY Certificate &Certificate::operator = (const Certificate &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { if (that.certificateToSign) { if (!certificateToSign) certificateToSign = new CertificateToSign; *certificateToSign = *that.certificateToSign; } else { delete certificateToSign; certificateToSign = NULL; } if (that.algorithmIdentifier) { if (!algorithmIdentifier) algorithmIdentifier = new AlgorithmIdentifier; *algorithmIdentifier = *that.algorithmIdentifier; } else { delete algorithmIdentifier; algorithmIdentifier = NULL; } signatureValue = that.signatureValue; } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined Certificate &Certificate::operator = (const Certificate &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen Certificate::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; l = signatureValue.BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, BITSTRING_TAG_CODE); totalLen += l; BEncEocIfNec (b); l = algorithmIdentifier->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; BEncEocIfNec (b); l = certificateToSign->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; return totalLen; } // Certificate::BEncContent void Certificate::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); certificateToSign = new CertificateToSign; certificateToSign->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -165); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); algorithmIdentifier = new AlgorithmIdentifier; algorithmIdentifier->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -166); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, BITSTRING_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, BITSTRING_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); signatureValue.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -167); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -168); } else return; } // Certificate::BDecContent AsnLen Certificate::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void Certificate::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "Certificate::BDec: ERROR - wrong tag" << endl; longjmp (env, -169); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int Certificate::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int Certificate::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void Certificate::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; if (NOT_NULL (certificateToSign)) { Indent (os, indentG); os << "certificateToSign "; os << *certificateToSign; } else { Indent (os, indentG); os << "certificateToSign "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (algorithmIdentifier)) { Indent (os, indentG); os << "algorithmIdentifier "; os << *algorithmIdentifier; } else { Indent (os, indentG); os << "algorithmIdentifier "; os << "-- void --"; os << "," << endl; } { Indent (os, indentG); os << "signatureValue "; os << signatureValue; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // Certificate::Print AsnType *CrossCertificates::Clone() const { return new CrossCertificates; } AsnType *CrossCertificates::Copy() const { return new CrossCertificates (*this); } AsnLen CrossCertificates::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SET_TAG_CODE); return l; } void CrossCertificates::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SET_TAG_CODE)) { Asn1Error << "CrossCertificates::BDec: ERROR - wrong tag" << endl; longjmp (env, -170); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } CrossCertificates::CrossCertificates (const CrossCertificates &) { Asn1Error << "use of incompletely defined CrossCertificates::CrossCertificates (const CrossCertificates &)" << endl; abort(); } CrossCertificates::~CrossCertificates() { SetCurrToFirst(); for (; Curr() != NULL; RemoveCurrFromList()) ; } // end of destructor #if SNACC_DEEP_COPY CrossCertificates &CrossCertificates::operator = (const CrossCertificates &that) #else // SNACC_DEEP_COPY CrossCertificates &CrossCertificates::operator = (const CrossCertificates &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { SetCurrToFirst(); for (; Curr(); RemoveCurrFromList()) ; //that.SetCurrToFirst(); //for (; that.Curr(); that.GoNext()) // AppendCopy (*that.Curr()); for (const AsnListElmt *run=that.first; run; run=run->next) AppendCopy (*run->elmt); } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined CrossCertificates &CrossCertificates::operator = (const CrossCertificates &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } void CrossCertificates::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE/SET OF -- " << endl; indentG += stdIndentG; //SetCurrToFirst(); //for (; Curr() != NULL; GoNext()) for (const AsnListElmt *run=first; run; run=run->next) { Indent (os, indentG); //os << *Curr(); os << *run->elmt; //if (Curr() != Last()) if (run != last) os << ","; os << endl; } indentG -= stdIndentG; Indent (os, indentG); os << "}\n"; #endif /* NDEBUG */ } // Print void CrossCertificates::SetCurrElmt (unsigned long int index) { unsigned long int i; curr = first; if (count) for (i = 0; (i < (count-1)) && (i < index); i++) curr = curr->next; } // CrossCertificates::SetCurrElmt unsigned long int CrossCertificates::GetCurrElmtIndex() { unsigned long int i; AsnListElmt *tmp; if (curr != NULL) { for (i = 0, tmp = first; tmp != NULL; i++) { if (tmp == curr) return i; else tmp = tmp->next; } } return count; } // CrossCertificates::GetCurrElmtIndex // alloc new list elmt, put at end of list // and return the component type Certificate *CrossCertificates::Append() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Certificate; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return (curr = newElmt)->elmt; } // CrossCertificates::Append // alloc new list elmt, put at begining of list // and return the component type Certificate *CrossCertificates::Prepend() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Certificate; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return (curr = newElmt)->elmt; } // CrossCertificates::Prepend // alloc new list elmt, insert it before the // current element and return the component type // if the current element is null, the new element // is placed at the beginning of the list. Certificate *CrossCertificates::InsertBefore() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Certificate; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return (curr = newElmt)->elmt; } // CrossCertificates::InsertBefore // alloc new list elmt, insert it after the // current element and return the component type // if the current element is null, the new element // is placed at the end of the list. Certificate *CrossCertificates::InsertAfter() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Certificate; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return (curr = newElmt)->elmt; } // CrossCertificates::InsertAfter CrossCertificates &CrossCertificates::AppendCopy (Certificate &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Certificate; *newElmt->elmt = elmt; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return *this; } // AppendCopy CrossCertificates &CrossCertificates::PrependCopy (Certificate &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Certificate; *newElmt->elmt = elmt; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return *this; } // CrossCertificates::PrependCopy // alloc new list elmt, insert it before the // current element, copy the given elmt into the new elmt // and return the component type. // if the current element is null, the new element // is placed at the beginning of the list. CrossCertificates &CrossCertificates::InsertBeforeAndCopy (Certificate &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Certificate; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return *this; } // CrossCertificates::InsertBeforeAndCopy // alloc new list elmt, insert it after the // current element, copy given elmt in to new elmt // and return the component type // if the current element is null, the new element // is placed at the end of the list. CrossCertificates &CrossCertificates::InsertAfterAndCopy (Certificate &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new Certificate; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return *this; } // CrossCertificates::InsertAfterAndCopy // remove current element from list if current element is not NULL // The new current element will be the next element. // If the current element is the last element in the list // the second but last element will become the new current element. void CrossCertificates::RemoveCurrFromList() { AsnListElmt *del_elmt; if (curr != NULL) { del_elmt = curr; count--; if (count == 0) first = last = curr = NULL; else if (curr == first) { curr = first= first->next; first->prev = NULL; } else if (curr == last) { curr = last = last->prev; last->next = NULL; } else { curr->prev->next = curr->next; curr->next->prev = curr->prev; } delete del_elmt->elmt; delete del_elmt; } } AsnLen CrossCertificates::BEncContent (BUF_TYPE b) { AsnListElmt *currElmt; AsnLen elmtLen; AsnLen totalLen = 0; { int iii,icount; CSM_Buffer **tmpEnc=NULL; for (currElmt = last,icount=0; currElmt != NULL; currElmt = currElmt->prev, icount++); tmpEnc = (CSM_Buffer **) calloc(sizeof(CSM_Buffer *), icount); for (currElmt = last, iii=0; currElmt != NULL; currElmt = currElmt->prev,iii++,elmtLen=0) { BEncEocIfNec (b); ENCODE_BUF1(currElmt->elmt->BEncContent, elmtLen); elmtLen += BEncConsLen (outputBuf, elmtLen); elmtLen += BEncTag1 (outputBuf, UNIV, CONS, SEQ_TAG_CODE); ENCODE_BUF2(tmpEnc[iii]); } vdasnacc_sortSetOf(tmpEnc, icount); for (iii=0,elmtLen=0; iii < icount; elmtLen+=tmpEnc[iii++]->Length()) SM_WriteToAsnBuf(tmpEnc[iii], b); for (iii=0; iii < icount; iii++) delete tmpEnc[iii]; free(tmpEnc); } totalLen += elmtLen; return totalLen; } // CrossCertificates::BEncContent void CrossCertificates::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { Certificate *listElmt; AsnTag tag1; AsnLen listBytesDecoded = 0; AsnLen elmtLen1; while ((listBytesDecoded < elmtLen0) || (elmtLen0 == INDEFINITE_LEN)) { tag1 = BDecTag (b, listBytesDecoded, env); if ((tag1 == EOC_TAG_ID) && (elmtLen0 == INDEFINITE_LEN)) { BDEC_2ND_EOC_OCTET (b, listBytesDecoded, env); break; } if ((tag1 != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -171); } elmtLen1 = BDecLen (b, listBytesDecoded, env); listElmt = Append(); listElmt->BDecContent (b, tag1, elmtLen1, listBytesDecoded, env); } bytesDecoded += listBytesDecoded; } // CrossCertificates::BDecContent CertificatePair::CertificatePair() { forward = NULL; reverse = NULL; } CertificatePair::CertificatePair (const CertificatePair &) { Asn1Error << "use of incompletely defined CertificatePair::CertificatePair (const CertificatePair &)" << endl; abort(); } CertificatePair::~CertificatePair() { delete forward; delete reverse; } AsnType *CertificatePair::Clone() const { return new CertificatePair; } AsnType *CertificatePair::Copy() const { return new CertificatePair (*this); } #if SNACC_DEEP_COPY CertificatePair &CertificatePair::operator = (const CertificatePair &that) #else // SNACC_DEEP_COPY CertificatePair &CertificatePair::operator = (const CertificatePair &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { if (that.forward) { if (!forward) forward = new Certificate; *forward = *that.forward; } else { delete forward; forward = NULL; } if (that.reverse) { if (!reverse) reverse = new Certificate; *reverse = *that.reverse; } else { delete reverse; reverse = NULL; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined CertificatePair &CertificatePair::operator = (const CertificatePair &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen CertificatePair::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; if (NOT_NULL (reverse)) { BEncEocIfNec (b); BEncEocIfNec (b); l = reverse->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); l += BEncConsLen (b, l); l += BEncTag1 (b, CNTX, CONS, 1); totalLen += l; } if (NOT_NULL (forward)) { BEncEocIfNec (b); BEncEocIfNec (b); l = forward->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); l += BEncConsLen (b, l); l += BEncTag1 (b, CNTX, CONS, 0); totalLen += l; } return totalLen; } // CertificatePair::BEncContent void CertificatePair::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; AsnLen elmtLen2; if (elmtLen0 == 0) return; else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } if ((tag1 == MAKE_TAG_ID (CNTX, CONS, 0))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); if (tag1 != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -172); } elmtLen2 = BDecLen (b, seqBytesDecoded, env); forward = new Certificate; forward->BDecContent (b, tag1, elmtLen2, seqBytesDecoded, env); if (elmtLen1 == INDEFINITE_LEN) BDecEoc (b, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } if ((tag1 == MAKE_TAG_ID (CNTX, CONS, 1))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); if (tag1 != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -173); } elmtLen2 = BDecLen (b, seqBytesDecoded, env); reverse = new Certificate; reverse->BDecContent (b, tag1, elmtLen2, seqBytesDecoded, env); if (elmtLen1 == INDEFINITE_LEN) BDecEoc (b, seqBytesDecoded, env); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -174); } else return; } // CertificatePair::BDecContent AsnLen CertificatePair::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void CertificatePair::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "CertificatePair::BDec: ERROR - wrong tag" << endl; longjmp (env, -175); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int CertificatePair::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int CertificatePair::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void CertificatePair::Print (ostream &os) const { #ifndef NDEBUG int nonePrinted = true; os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; if (NOT_NULL (forward)) { nonePrinted = false; Indent (os, indentG); os << "forward "; os << *forward; } else { Indent (os, indentG); os << "forward "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (reverse)) { if (!nonePrinted) os << "," << endl; nonePrinted = false; Indent (os, indentG); os << "reverse "; os << *reverse; } else { Indent (os, indentG); os << "reverse "; os << "-- void --"; os << endl; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // CertificatePair::Print CertificateList::CertificateList() { #if TCL crlToSign = new CRLToSign; #else crlToSign = NULL; // incomplete initialization of mandatory element! #endif // TCL #if TCL algorithmIdentifier = new AlgorithmIdentifier; #else algorithmIdentifier = NULL; // incomplete initialization of mandatory element! #endif // TCL } CertificateList::CertificateList (const CertificateList &) { Asn1Error << "use of incompletely defined CertificateList::CertificateList (const CertificateList &)" << endl; abort(); } CertificateList::~CertificateList() { delete crlToSign; delete algorithmIdentifier; } AsnType *CertificateList::Clone() const { return new CertificateList; } AsnType *CertificateList::Copy() const { return new CertificateList (*this); } #if SNACC_DEEP_COPY CertificateList &CertificateList::operator = (const CertificateList &that) #else // SNACC_DEEP_COPY CertificateList &CertificateList::operator = (const CertificateList &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { if (that.crlToSign) { if (!crlToSign) crlToSign = new CRLToSign; *crlToSign = *that.crlToSign; } else { delete crlToSign; crlToSign = NULL; } if (that.algorithmIdentifier) { if (!algorithmIdentifier) algorithmIdentifier = new AlgorithmIdentifier; *algorithmIdentifier = *that.algorithmIdentifier; } else { delete algorithmIdentifier; algorithmIdentifier = NULL; } signatureValue = that.signatureValue; } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined CertificateList &CertificateList::operator = (const CertificateList &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen CertificateList::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; l = signatureValue.BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, BITSTRING_TAG_CODE); totalLen += l; BEncEocIfNec (b); l = algorithmIdentifier->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; BEncEocIfNec (b); l = crlToSign->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; return totalLen; } // CertificateList::BEncContent void CertificateList::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); crlToSign = new CRLToSign; crlToSign->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -176); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); algorithmIdentifier = new AlgorithmIdentifier; algorithmIdentifier->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -177); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, BITSTRING_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, BITSTRING_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); signatureValue.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -178); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -179); } else return; } // CertificateList::BDecContent AsnLen CertificateList::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void CertificateList::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "CertificateList::BDec: ERROR - wrong tag" << endl; longjmp (env, -180); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int CertificateList::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int CertificateList::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void CertificateList::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; if (NOT_NULL (crlToSign)) { Indent (os, indentG); os << "crlToSign "; os << *crlToSign; } else { Indent (os, indentG); os << "crlToSign "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (algorithmIdentifier)) { Indent (os, indentG); os << "algorithmIdentifier "; os << *algorithmIdentifier; } else { Indent (os, indentG); os << "algorithmIdentifier "; os << "-- void --"; os << "," << endl; } { Indent (os, indentG); os << "signatureValue "; os << signatureValue; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // CertificateList::Print AttributeCertificate::AttributeCertificate() { #if TCL attributeCertificateInfo = new AttributeCertificateInfo; #else attributeCertificateInfo = NULL; // incomplete initialization of mandatory element! #endif // TCL #if TCL algorithmIdentifier = new AlgorithmIdentifier; #else algorithmIdentifier = NULL; // incomplete initialization of mandatory element! #endif // TCL } AttributeCertificate::AttributeCertificate (const AttributeCertificate &) { Asn1Error << "use of incompletely defined AttributeCertificate::AttributeCertificate (const AttributeCertificate &)" << endl; abort(); } AttributeCertificate::~AttributeCertificate() { delete attributeCertificateInfo; delete algorithmIdentifier; } AsnType *AttributeCertificate::Clone() const { return new AttributeCertificate; } AsnType *AttributeCertificate::Copy() const { return new AttributeCertificate (*this); } #if SNACC_DEEP_COPY AttributeCertificate &AttributeCertificate::operator = (const AttributeCertificate &that) #else // SNACC_DEEP_COPY AttributeCertificate &AttributeCertificate::operator = (const AttributeCertificate &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { if (that.attributeCertificateInfo) { if (!attributeCertificateInfo) attributeCertificateInfo = new AttributeCertificateInfo; *attributeCertificateInfo = *that.attributeCertificateInfo; } else { delete attributeCertificateInfo; attributeCertificateInfo = NULL; } if (that.algorithmIdentifier) { if (!algorithmIdentifier) algorithmIdentifier = new AlgorithmIdentifier; *algorithmIdentifier = *that.algorithmIdentifier; } else { delete algorithmIdentifier; algorithmIdentifier = NULL; } signatureValue = that.signatureValue; } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined AttributeCertificate &AttributeCertificate::operator = (const AttributeCertificate &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen AttributeCertificate::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; l = signatureValue.BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, BITSTRING_TAG_CODE); totalLen += l; BEncEocIfNec (b); l = algorithmIdentifier->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; BEncEocIfNec (b); l = attributeCertificateInfo->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; return totalLen; } // AttributeCertificate::BEncContent void AttributeCertificate::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); attributeCertificateInfo = new AttributeCertificateInfo; attributeCertificateInfo->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -181); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); algorithmIdentifier = new AlgorithmIdentifier; algorithmIdentifier->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -182); } if ((tag1 == MAKE_TAG_ID (UNIV, PRIM, BITSTRING_TAG_CODE)) || (tag1 == MAKE_TAG_ID (UNIV, CONS, BITSTRING_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); signatureValue.BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -183); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -184); } else return; } // AttributeCertificate::BDecContent AsnLen AttributeCertificate::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void AttributeCertificate::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "AttributeCertificate::BDec: ERROR - wrong tag" << endl; longjmp (env, -185); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int AttributeCertificate::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int AttributeCertificate::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void AttributeCertificate::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; if (NOT_NULL (attributeCertificateInfo)) { Indent (os, indentG); os << "attributeCertificateInfo "; os << *attributeCertificateInfo; } else { Indent (os, indentG); os << "attributeCertificateInfo "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (algorithmIdentifier)) { Indent (os, indentG); os << "algorithmIdentifier "; os << *algorithmIdentifier; } else { Indent (os, indentG); os << "algorithmIdentifier "; os << "-- void --"; os << "," << endl; } { Indent (os, indentG); os << "signatureValue "; os << signatureValue; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // AttributeCertificate::Print AsnType *CertificationPathSeqOf::Clone() const { return new CertificationPathSeqOf; } AsnType *CertificationPathSeqOf::Copy() const { return new CertificationPathSeqOf (*this); } AsnLen CertificationPathSeqOf::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void CertificationPathSeqOf::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "CertificationPathSeqOf::BDec: ERROR - wrong tag" << endl; longjmp (env, -186); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } CertificationPathSeqOf::CertificationPathSeqOf (const CertificationPathSeqOf &) { Asn1Error << "use of incompletely defined CertificationPathSeqOf::CertificationPathSeqOf (const CertificationPathSeqOf &)" << endl; abort(); } CertificationPathSeqOf::~CertificationPathSeqOf() { SetCurrToFirst(); for (; Curr() != NULL; RemoveCurrFromList()) ; } // end of destructor #if SNACC_DEEP_COPY CertificationPathSeqOf &CertificationPathSeqOf::operator = (const CertificationPathSeqOf &that) #else // SNACC_DEEP_COPY CertificationPathSeqOf &CertificationPathSeqOf::operator = (const CertificationPathSeqOf &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { SetCurrToFirst(); for (; Curr(); RemoveCurrFromList()) ; //that.SetCurrToFirst(); //for (; that.Curr(); that.GoNext()) // AppendCopy (*that.Curr()); for (const AsnListElmt *run=that.first; run; run=run->next) AppendCopy (*run->elmt); } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined CertificationPathSeqOf &CertificationPathSeqOf::operator = (const CertificationPathSeqOf &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } void CertificationPathSeqOf::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE/SET OF -- " << endl; indentG += stdIndentG; //SetCurrToFirst(); //for (; Curr() != NULL; GoNext()) for (const AsnListElmt *run=first; run; run=run->next) { Indent (os, indentG); //os << *Curr(); os << *run->elmt; //if (Curr() != Last()) if (run != last) os << ","; os << endl; } indentG -= stdIndentG; Indent (os, indentG); os << "}\n"; #endif /* NDEBUG */ } // Print void CertificationPathSeqOf::SetCurrElmt (unsigned long int index) { unsigned long int i; curr = first; if (count) for (i = 0; (i < (count-1)) && (i < index); i++) curr = curr->next; } // CertificationPathSeqOf::SetCurrElmt unsigned long int CertificationPathSeqOf::GetCurrElmtIndex() { unsigned long int i; AsnListElmt *tmp; if (curr != NULL) { for (i = 0, tmp = first; tmp != NULL; i++) { if (tmp == curr) return i; else tmp = tmp->next; } } return count; } // CertificationPathSeqOf::GetCurrElmtIndex // alloc new list elmt, put at end of list // and return the component type CertificatePair *CertificationPathSeqOf::Append() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CertificatePair; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return (curr = newElmt)->elmt; } // CertificationPathSeqOf::Append // alloc new list elmt, put at begining of list // and return the component type CertificatePair *CertificationPathSeqOf::Prepend() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CertificatePair; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return (curr = newElmt)->elmt; } // CertificationPathSeqOf::Prepend // alloc new list elmt, insert it before the // current element and return the component type // if the current element is null, the new element // is placed at the beginning of the list. CertificatePair *CertificationPathSeqOf::InsertBefore() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CertificatePair; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return (curr = newElmt)->elmt; } // CertificationPathSeqOf::InsertBefore // alloc new list elmt, insert it after the // current element and return the component type // if the current element is null, the new element // is placed at the end of the list. CertificatePair *CertificationPathSeqOf::InsertAfter() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CertificatePair; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return (curr = newElmt)->elmt; } // CertificationPathSeqOf::InsertAfter CertificationPathSeqOf &CertificationPathSeqOf::AppendCopy (CertificatePair &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CertificatePair; *newElmt->elmt = elmt; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return *this; } // AppendCopy CertificationPathSeqOf &CertificationPathSeqOf::PrependCopy (CertificatePair &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CertificatePair; *newElmt->elmt = elmt; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return *this; } // CertificationPathSeqOf::PrependCopy // alloc new list elmt, insert it before the // current element, copy the given elmt into the new elmt // and return the component type. // if the current element is null, the new element // is placed at the beginning of the list. CertificationPathSeqOf &CertificationPathSeqOf::InsertBeforeAndCopy (CertificatePair &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CertificatePair; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return *this; } // CertificationPathSeqOf::InsertBeforeAndCopy // alloc new list elmt, insert it after the // current element, copy given elmt in to new elmt // and return the component type // if the current element is null, the new element // is placed at the end of the list. CertificationPathSeqOf &CertificationPathSeqOf::InsertAfterAndCopy (CertificatePair &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CertificatePair; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return *this; } // CertificationPathSeqOf::InsertAfterAndCopy // remove current element from list if current element is not NULL // The new current element will be the next element. // If the current element is the last element in the list // the second but last element will become the new current element. void CertificationPathSeqOf::RemoveCurrFromList() { AsnListElmt *del_elmt; if (curr != NULL) { del_elmt = curr; count--; if (count == 0) first = last = curr = NULL; else if (curr == first) { curr = first= first->next; first->prev = NULL; } else if (curr == last) { curr = last = last->prev; last->next = NULL; } else { curr->prev->next = curr->next; curr->next->prev = curr->prev; } delete del_elmt->elmt; delete del_elmt; } } AsnLen CertificationPathSeqOf::BEncContent (BUF_TYPE b) { AsnListElmt *currElmt; AsnLen elmtLen; AsnLen totalLen = 0; for (currElmt = last; currElmt != NULL; currElmt = currElmt->prev) { BEncEocIfNec (b); elmtLen = currElmt->elmt->BEncContent (b); elmtLen += BEncConsLen (b, elmtLen); elmtLen += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += elmtLen; } return totalLen; } // CertificationPathSeqOf::BEncContent void CertificationPathSeqOf::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { CertificatePair *listElmt; AsnTag tag1; AsnLen listBytesDecoded = 0; AsnLen elmtLen1; while ((listBytesDecoded < elmtLen0) || (elmtLen0 == INDEFINITE_LEN)) { tag1 = BDecTag (b, listBytesDecoded, env); if ((tag1 == EOC_TAG_ID) && (elmtLen0 == INDEFINITE_LEN)) { BDEC_2ND_EOC_OCTET (b, listBytesDecoded, env); break; } if ((tag1 != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -187); } elmtLen1 = BDecLen (b, listBytesDecoded, env); listElmt = Append(); listElmt->BDecContent (b, tag1, elmtLen1, listBytesDecoded, env); } bytesDecoded += listBytesDecoded; } // CertificationPathSeqOf::BDecContent AsnType *ForwardCertificationPath::Clone() const { return new ForwardCertificationPath; } AsnType *ForwardCertificationPath::Copy() const { return new ForwardCertificationPath (*this); } AsnLen ForwardCertificationPath::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void ForwardCertificationPath::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "ForwardCertificationPath::BDec: ERROR - wrong tag" << endl; longjmp (env, -188); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } ForwardCertificationPath::ForwardCertificationPath (const ForwardCertificationPath &) { Asn1Error << "use of incompletely defined ForwardCertificationPath::ForwardCertificationPath (const ForwardCertificationPath &)" << endl; abort(); } ForwardCertificationPath::~ForwardCertificationPath() { SetCurrToFirst(); for (; Curr() != NULL; RemoveCurrFromList()) ; } // end of destructor #if SNACC_DEEP_COPY ForwardCertificationPath &ForwardCertificationPath::operator = (const ForwardCertificationPath &that) #else // SNACC_DEEP_COPY ForwardCertificationPath &ForwardCertificationPath::operator = (const ForwardCertificationPath &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { SetCurrToFirst(); for (; Curr(); RemoveCurrFromList()) ; //that.SetCurrToFirst(); //for (; that.Curr(); that.GoNext()) // AppendCopy (*that.Curr()); for (const AsnListElmt *run=that.first; run; run=run->next) AppendCopy (*run->elmt); } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined ForwardCertificationPath &ForwardCertificationPath::operator = (const ForwardCertificationPath &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } void ForwardCertificationPath::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE/SET OF -- " << endl; indentG += stdIndentG; //SetCurrToFirst(); //for (; Curr() != NULL; GoNext()) for (const AsnListElmt *run=first; run; run=run->next) { Indent (os, indentG); //os << *Curr(); os << *run->elmt; //if (Curr() != Last()) if (run != last) os << ","; os << endl; } indentG -= stdIndentG; Indent (os, indentG); os << "}\n"; #endif /* NDEBUG */ } // Print void ForwardCertificationPath::SetCurrElmt (unsigned long int index) { unsigned long int i; curr = first; if (count) for (i = 0; (i < (count-1)) && (i < index); i++) curr = curr->next; } // ForwardCertificationPath::SetCurrElmt unsigned long int ForwardCertificationPath::GetCurrElmtIndex() { unsigned long int i; AsnListElmt *tmp; if (curr != NULL) { for (i = 0, tmp = first; tmp != NULL; i++) { if (tmp == curr) return i; else tmp = tmp->next; } } return count; } // ForwardCertificationPath::GetCurrElmtIndex // alloc new list elmt, put at end of list // and return the component type CrossCertificates *ForwardCertificationPath::Append() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CrossCertificates; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return (curr = newElmt)->elmt; } // ForwardCertificationPath::Append // alloc new list elmt, put at begining of list // and return the component type CrossCertificates *ForwardCertificationPath::Prepend() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CrossCertificates; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return (curr = newElmt)->elmt; } // ForwardCertificationPath::Prepend // alloc new list elmt, insert it before the // current element and return the component type // if the current element is null, the new element // is placed at the beginning of the list. CrossCertificates *ForwardCertificationPath::InsertBefore() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CrossCertificates; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return (curr = newElmt)->elmt; } // ForwardCertificationPath::InsertBefore // alloc new list elmt, insert it after the // current element and return the component type // if the current element is null, the new element // is placed at the end of the list. CrossCertificates *ForwardCertificationPath::InsertAfter() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CrossCertificates; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return (curr = newElmt)->elmt; } // ForwardCertificationPath::InsertAfter ForwardCertificationPath &ForwardCertificationPath::AppendCopy (CrossCertificates &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CrossCertificates; *newElmt->elmt = elmt; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return *this; } // AppendCopy ForwardCertificationPath &ForwardCertificationPath::PrependCopy (CrossCertificates &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CrossCertificates; *newElmt->elmt = elmt; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return *this; } // ForwardCertificationPath::PrependCopy // alloc new list elmt, insert it before the // current element, copy the given elmt into the new elmt // and return the component type. // if the current element is null, the new element // is placed at the beginning of the list. ForwardCertificationPath &ForwardCertificationPath::InsertBeforeAndCopy (CrossCertificates &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CrossCertificates; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return *this; } // ForwardCertificationPath::InsertBeforeAndCopy // alloc new list elmt, insert it after the // current element, copy given elmt in to new elmt // and return the component type // if the current element is null, the new element // is placed at the end of the list. ForwardCertificationPath &ForwardCertificationPath::InsertAfterAndCopy (CrossCertificates &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new CrossCertificates; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return *this; } // ForwardCertificationPath::InsertAfterAndCopy // remove current element from list if current element is not NULL // The new current element will be the next element. // If the current element is the last element in the list // the second but last element will become the new current element. void ForwardCertificationPath::RemoveCurrFromList() { AsnListElmt *del_elmt; if (curr != NULL) { del_elmt = curr; count--; if (count == 0) first = last = curr = NULL; else if (curr == first) { curr = first= first->next; first->prev = NULL; } else if (curr == last) { curr = last = last->prev; last->next = NULL; } else { curr->prev->next = curr->next; curr->next->prev = curr->prev; } delete del_elmt->elmt; delete del_elmt; } } AsnLen ForwardCertificationPath::BEncContent (BUF_TYPE b) { AsnListElmt *currElmt; AsnLen elmtLen; AsnLen totalLen = 0; for (currElmt = last; currElmt != NULL; currElmt = currElmt->prev) { BEncEocIfNec (b); elmtLen = currElmt->elmt->BEncContent (b); elmtLen += BEncConsLen (b, elmtLen); elmtLen += BEncTag1 (b, UNIV, CONS, SET_TAG_CODE); totalLen += elmtLen; } return totalLen; } // ForwardCertificationPath::BEncContent void ForwardCertificationPath::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { CrossCertificates *listElmt; AsnTag tag1; AsnLen listBytesDecoded = 0; AsnLen elmtLen1; while ((listBytesDecoded < elmtLen0) || (elmtLen0 == INDEFINITE_LEN)) { tag1 = BDecTag (b, listBytesDecoded, env); if ((tag1 == EOC_TAG_ID) && (elmtLen0 == INDEFINITE_LEN)) { BDEC_2ND_EOC_OCTET (b, listBytesDecoded, env); break; } if ((tag1 != MAKE_TAG_ID (UNIV, CONS, SET_TAG_CODE))) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -189); } elmtLen1 = BDecLen (b, listBytesDecoded, env); listElmt = Append(); listElmt->BDecContent (b, tag1, elmtLen1, listBytesDecoded, env); } bytesDecoded += listBytesDecoded; } // ForwardCertificationPath::BDecContent ACPathData::ACPathData() { certificate = NULL; attributeCertificate = NULL; } ACPathData::ACPathData (const ACPathData &) { Asn1Error << "use of incompletely defined ACPathData::ACPathData (const ACPathData &)" << endl; abort(); } ACPathData::~ACPathData() { delete certificate; delete attributeCertificate; } AsnType *ACPathData::Clone() const { return new ACPathData; } AsnType *ACPathData::Copy() const { return new ACPathData (*this); } #if SNACC_DEEP_COPY ACPathData &ACPathData::operator = (const ACPathData &that) #else // SNACC_DEEP_COPY ACPathData &ACPathData::operator = (const ACPathData &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { if (that.certificate) { if (!certificate) certificate = new Certificate; *certificate = *that.certificate; } else { delete certificate; certificate = NULL; } if (that.attributeCertificate) { if (!attributeCertificate) attributeCertificate = new AttributeCertificate; *attributeCertificate = *that.attributeCertificate; } else { delete attributeCertificate; attributeCertificate = NULL; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined ACPathData &ACPathData::operator = (const ACPathData &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen ACPathData::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; if (NOT_NULL (attributeCertificate)) { BEncEocIfNec (b); BEncEocIfNec (b); l = attributeCertificate->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); l += BEncConsLen (b, l); l += BEncTag1 (b, CNTX, CONS, 1); totalLen += l; } if (NOT_NULL (certificate)) { BEncEocIfNec (b); BEncEocIfNec (b); l = certificate->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); l += BEncConsLen (b, l); l += BEncTag1 (b, CNTX, CONS, 0); totalLen += l; } return totalLen; } // ACPathData::BEncContent void ACPathData::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; AsnLen elmtLen2; if (elmtLen0 == 0) return; else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } if ((tag1 == MAKE_TAG_ID (CNTX, CONS, 0))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); if (tag1 != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -190); } elmtLen2 = BDecLen (b, seqBytesDecoded, env); certificate = new Certificate; certificate->BDecContent (b, tag1, elmtLen2, seqBytesDecoded, env); if (elmtLen1 == INDEFINITE_LEN) BDecEoc (b, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } if ((tag1 == MAKE_TAG_ID (CNTX, CONS, 1))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); if (tag1 != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -191); } elmtLen2 = BDecLen (b, seqBytesDecoded, env); attributeCertificate = new AttributeCertificate; attributeCertificate->BDecContent (b, tag1, elmtLen2, seqBytesDecoded, env); if (elmtLen1 == INDEFINITE_LEN) BDecEoc (b, seqBytesDecoded, env); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -192); } else return; } // ACPathData::BDecContent AsnLen ACPathData::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void ACPathData::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "ACPathData::BDec: ERROR - wrong tag" << endl; longjmp (env, -193); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int ACPathData::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int ACPathData::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void ACPathData::Print (ostream &os) const { #ifndef NDEBUG int nonePrinted = true; os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; if (NOT_NULL (certificate)) { nonePrinted = false; Indent (os, indentG); os << "certificate "; os << *certificate; } else { Indent (os, indentG); os << "certificate "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (attributeCertificate)) { if (!nonePrinted) os << "," << endl; nonePrinted = false; Indent (os, indentG); os << "attributeCertificate "; os << *attributeCertificate; } else { Indent (os, indentG); os << "attributeCertificate "; os << "-- void --"; os << endl; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // ACPathData::Print AsnType *AttributeCertificationPathSeqOf::Clone() const { return new AttributeCertificationPathSeqOf; } AsnType *AttributeCertificationPathSeqOf::Copy() const { return new AttributeCertificationPathSeqOf (*this); } AsnLen AttributeCertificationPathSeqOf::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void AttributeCertificationPathSeqOf::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "AttributeCertificationPathSeqOf::BDec: ERROR - wrong tag" << endl; longjmp (env, -194); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } AttributeCertificationPathSeqOf::AttributeCertificationPathSeqOf (const AttributeCertificationPathSeqOf &) { Asn1Error << "use of incompletely defined AttributeCertificationPathSeqOf::AttributeCertificationPathSeqOf (const AttributeCertificationPathSeqOf &)" << endl; abort(); } AttributeCertificationPathSeqOf::~AttributeCertificationPathSeqOf() { SetCurrToFirst(); for (; Curr() != NULL; RemoveCurrFromList()) ; } // end of destructor #if SNACC_DEEP_COPY AttributeCertificationPathSeqOf &AttributeCertificationPathSeqOf::operator = (const AttributeCertificationPathSeqOf &that) #else // SNACC_DEEP_COPY AttributeCertificationPathSeqOf &AttributeCertificationPathSeqOf::operator = (const AttributeCertificationPathSeqOf &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { SetCurrToFirst(); for (; Curr(); RemoveCurrFromList()) ; //that.SetCurrToFirst(); //for (; that.Curr(); that.GoNext()) // AppendCopy (*that.Curr()); for (const AsnListElmt *run=that.first; run; run=run->next) AppendCopy (*run->elmt); } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined AttributeCertificationPathSeqOf &AttributeCertificationPathSeqOf::operator = (const AttributeCertificationPathSeqOf &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } void AttributeCertificationPathSeqOf::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE/SET OF -- " << endl; indentG += stdIndentG; //SetCurrToFirst(); //for (; Curr() != NULL; GoNext()) for (const AsnListElmt *run=first; run; run=run->next) { Indent (os, indentG); //os << *Curr(); os << *run->elmt; //if (Curr() != Last()) if (run != last) os << ","; os << endl; } indentG -= stdIndentG; Indent (os, indentG); os << "}\n"; #endif /* NDEBUG */ } // Print void AttributeCertificationPathSeqOf::SetCurrElmt (unsigned long int index) { unsigned long int i; curr = first; if (count) for (i = 0; (i < (count-1)) && (i < index); i++) curr = curr->next; } // AttributeCertificationPathSeqOf::SetCurrElmt unsigned long int AttributeCertificationPathSeqOf::GetCurrElmtIndex() { unsigned long int i; AsnListElmt *tmp; if (curr != NULL) { for (i = 0, tmp = first; tmp != NULL; i++) { if (tmp == curr) return i; else tmp = tmp->next; } } return count; } // AttributeCertificationPathSeqOf::GetCurrElmtIndex // alloc new list elmt, put at end of list // and return the component type ACPathData *AttributeCertificationPathSeqOf::Append() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new ACPathData; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return (curr = newElmt)->elmt; } // AttributeCertificationPathSeqOf::Append // alloc new list elmt, put at begining of list // and return the component type ACPathData *AttributeCertificationPathSeqOf::Prepend() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new ACPathData; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return (curr = newElmt)->elmt; } // AttributeCertificationPathSeqOf::Prepend // alloc new list elmt, insert it before the // current element and return the component type // if the current element is null, the new element // is placed at the beginning of the list. ACPathData *AttributeCertificationPathSeqOf::InsertBefore() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new ACPathData; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return (curr = newElmt)->elmt; } // AttributeCertificationPathSeqOf::InsertBefore // alloc new list elmt, insert it after the // current element and return the component type // if the current element is null, the new element // is placed at the end of the list. ACPathData *AttributeCertificationPathSeqOf::InsertAfter() { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new ACPathData; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return (curr = newElmt)->elmt; } // AttributeCertificationPathSeqOf::InsertAfter AttributeCertificationPathSeqOf &AttributeCertificationPathSeqOf::AppendCopy (ACPathData &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new ACPathData; *newElmt->elmt = elmt; newElmt->next = NULL; if (last == NULL) { newElmt->prev = NULL; first = last = newElmt; } else { newElmt->prev = last; last->next = newElmt; last = newElmt; } count++; return *this; } // AppendCopy AttributeCertificationPathSeqOf &AttributeCertificationPathSeqOf::PrependCopy (ACPathData &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new ACPathData; *newElmt->elmt = elmt; newElmt->prev = NULL; if (first == NULL) { newElmt->next = NULL; first = last = newElmt; } else { newElmt->next = first; first->prev = newElmt; first = newElmt; } count++; return *this; } // AttributeCertificationPathSeqOf::PrependCopy // alloc new list elmt, insert it before the // current element, copy the given elmt into the new elmt // and return the component type. // if the current element is null, the new element // is placed at the beginning of the list. AttributeCertificationPathSeqOf &AttributeCertificationPathSeqOf::InsertBeforeAndCopy (ACPathData &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new ACPathData; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->next = first; newElmt->prev = NULL; first = newElmt; if (last == NULL) last = newElmt; } else { newElmt->next = curr; newElmt->prev = curr->prev; curr->prev = newElmt; if (curr == first) first = newElmt; else newElmt->prev->next = newElmt; } count++; return *this; } // AttributeCertificationPathSeqOf::InsertBeforeAndCopy // alloc new list elmt, insert it after the // current element, copy given elmt in to new elmt // and return the component type // if the current element is null, the new element // is placed at the end of the list. AttributeCertificationPathSeqOf &AttributeCertificationPathSeqOf::InsertAfterAndCopy (ACPathData &elmt) { AsnListElmt *newElmt; newElmt = new AsnListElmt; newElmt->elmt = new ACPathData; *newElmt->elmt = elmt; if (curr == NULL) { newElmt->prev = last; newElmt->next = NULL; last = newElmt; if (first == NULL) first = newElmt; } else { newElmt->prev = curr; newElmt->next = curr->next; curr->next = newElmt; if (curr == last) last = newElmt; else newElmt->next->prev = newElmt; } count++; return *this; } // AttributeCertificationPathSeqOf::InsertAfterAndCopy // remove current element from list if current element is not NULL // The new current element will be the next element. // If the current element is the last element in the list // the second but last element will become the new current element. void AttributeCertificationPathSeqOf::RemoveCurrFromList() { AsnListElmt *del_elmt; if (curr != NULL) { del_elmt = curr; count--; if (count == 0) first = last = curr = NULL; else if (curr == first) { curr = first= first->next; first->prev = NULL; } else if (curr == last) { curr = last = last->prev; last->next = NULL; } else { curr->prev->next = curr->next; curr->next->prev = curr->prev; } delete del_elmt->elmt; delete del_elmt; } } AsnLen AttributeCertificationPathSeqOf::BEncContent (BUF_TYPE b) { AsnListElmt *currElmt; AsnLen elmtLen; AsnLen totalLen = 0; for (currElmt = last; currElmt != NULL; currElmt = currElmt->prev) { BEncEocIfNec (b); elmtLen = currElmt->elmt->BEncContent (b); elmtLen += BEncConsLen (b, elmtLen); elmtLen += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += elmtLen; } return totalLen; } // AttributeCertificationPathSeqOf::BEncContent void AttributeCertificationPathSeqOf::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { ACPathData *listElmt; AsnTag tag1; AsnLen listBytesDecoded = 0; AsnLen elmtLen1; while ((listBytesDecoded < elmtLen0) || (elmtLen0 == INDEFINITE_LEN)) { tag1 = BDecTag (b, listBytesDecoded, env); if ((tag1 == EOC_TAG_ID) && (elmtLen0 == INDEFINITE_LEN)) { BDEC_2ND_EOC_OCTET (b, listBytesDecoded, env); break; } if ((tag1 != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -195); } elmtLen1 = BDecLen (b, listBytesDecoded, env); listElmt = Append(); listElmt->BDecContent (b, tag1, elmtLen1, listBytesDecoded, env); } bytesDecoded += listBytesDecoded; } // AttributeCertificationPathSeqOf::BDecContent Certificates::Certificates() { #if TCL userCertificate = new Certificate; #else userCertificate = NULL; // incomplete initialization of mandatory element! #endif // TCL certificationPath = NULL; } Certificates::Certificates (const Certificates &) { Asn1Error << "use of incompletely defined Certificates::Certificates (const Certificates &)" << endl; abort(); } Certificates::~Certificates() { delete userCertificate; delete certificationPath; } AsnType *Certificates::Clone() const { return new Certificates; } AsnType *Certificates::Copy() const { return new Certificates (*this); } #if SNACC_DEEP_COPY Certificates &Certificates::operator = (const Certificates &that) #else // SNACC_DEEP_COPY Certificates &Certificates::operator = (const Certificates &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { if (that.userCertificate) { if (!userCertificate) userCertificate = new Certificate; *userCertificate = *that.userCertificate; } else { delete userCertificate; userCertificate = NULL; } if (that.certificationPath) { if (!certificationPath) certificationPath = new ForwardCertificationPath; *certificationPath = *that.certificationPath; } else { delete certificationPath; certificationPath = NULL; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined Certificates &Certificates::operator = (const Certificates &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen Certificates::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; if (NOT_NULL (certificationPath)) { BEncEocIfNec (b); l = certificationPath->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; } BEncEocIfNec (b); l = userCertificate->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; return totalLen; } // Certificates::BEncContent void Certificates::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); userCertificate = new Certificate; userCertificate->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -196); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); certificationPath = new ForwardCertificationPath; certificationPath->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -197); } else return; } // Certificates::BDecContent AsnLen Certificates::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void Certificates::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "Certificates::BDec: ERROR - wrong tag" << endl; longjmp (env, -198); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int Certificates::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int Certificates::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void Certificates::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; if (NOT_NULL (userCertificate)) { Indent (os, indentG); os << "userCertificate "; os << *userCertificate; } else { Indent (os, indentG); os << "userCertificate "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (certificationPath)) { os << ","<< endl; Indent (os, indentG); os << "certificationPath "; os << *certificationPath; } else { Indent (os, indentG); os << "certificationPath "; os << "-- void --"; os << endl; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // Certificates::Print CertificationPath::CertificationPath() { #if TCL userCertificate = new Certificate; #else userCertificate = NULL; // incomplete initialization of mandatory element! #endif // TCL theCACertificates = NULL; } CertificationPath::CertificationPath (const CertificationPath &) { Asn1Error << "use of incompletely defined CertificationPath::CertificationPath (const CertificationPath &)" << endl; abort(); } CertificationPath::~CertificationPath() { delete userCertificate; delete theCACertificates; } AsnType *CertificationPath::Clone() const { return new CertificationPath; } AsnType *CertificationPath::Copy() const { return new CertificationPath (*this); } #if SNACC_DEEP_COPY CertificationPath &CertificationPath::operator = (const CertificationPath &that) #else // SNACC_DEEP_COPY CertificationPath &CertificationPath::operator = (const CertificationPath &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { if (that.userCertificate) { if (!userCertificate) userCertificate = new Certificate; *userCertificate = *that.userCertificate; } else { delete userCertificate; userCertificate = NULL; } if (that.theCACertificates) { if (!theCACertificates) theCACertificates = new CertificationPathSeqOf; *theCACertificates = *that.theCACertificates; } else { delete theCACertificates; theCACertificates = NULL; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined CertificationPath &CertificationPath::operator = (const CertificationPath &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen CertificationPath::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; if (NOT_NULL (theCACertificates)) { BEncEocIfNec (b); l = theCACertificates->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; } BEncEocIfNec (b); l = userCertificate->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; return totalLen; } // CertificationPath::BEncContent void CertificationPath::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); userCertificate = new Certificate; userCertificate->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -199); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); theCACertificates = new CertificationPathSeqOf; theCACertificates->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -200); } else return; } // CertificationPath::BDecContent AsnLen CertificationPath::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void CertificationPath::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "CertificationPath::BDec: ERROR - wrong tag" << endl; longjmp (env, -201); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int CertificationPath::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int CertificationPath::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void CertificationPath::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; if (NOT_NULL (userCertificate)) { Indent (os, indentG); os << "userCertificate "; os << *userCertificate; } else { Indent (os, indentG); os << "userCertificate "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (theCACertificates)) { os << ","<< endl; Indent (os, indentG); os << "theCACertificates "; os << *theCACertificates; } else { Indent (os, indentG); os << "theCACertificates "; os << "-- void --"; os << endl; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // CertificationPath::Print AttributeCertificationPath::AttributeCertificationPath() { #if TCL attributeCertificate = new AttributeCertificate; #else attributeCertificate = NULL; // incomplete initialization of mandatory element! #endif // TCL acPath = NULL; } AttributeCertificationPath::AttributeCertificationPath (const AttributeCertificationPath &) { Asn1Error << "use of incompletely defined AttributeCertificationPath::AttributeCertificationPath (const AttributeCertificationPath &)" << endl; abort(); } AttributeCertificationPath::~AttributeCertificationPath() { delete attributeCertificate; delete acPath; } AsnType *AttributeCertificationPath::Clone() const { return new AttributeCertificationPath; } AsnType *AttributeCertificationPath::Copy() const { return new AttributeCertificationPath (*this); } #if SNACC_DEEP_COPY AttributeCertificationPath &AttributeCertificationPath::operator = (const AttributeCertificationPath &that) #else // SNACC_DEEP_COPY AttributeCertificationPath &AttributeCertificationPath::operator = (const AttributeCertificationPath &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { if (that.attributeCertificate) { if (!attributeCertificate) attributeCertificate = new AttributeCertificate; *attributeCertificate = *that.attributeCertificate; } else { delete attributeCertificate; attributeCertificate = NULL; } if (that.acPath) { if (!acPath) acPath = new AttributeCertificationPathSeqOf; *acPath = *that.acPath; } else { delete acPath; acPath = NULL; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined AttributeCertificationPath &AttributeCertificationPath::operator = (const AttributeCertificationPath &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen AttributeCertificationPath::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; if (NOT_NULL (acPath)) { BEncEocIfNec (b); l = acPath->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; } BEncEocIfNec (b); l = attributeCertificate->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); totalLen += l; return totalLen; } // AttributeCertificationPath::BEncContent void AttributeCertificationPath::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); attributeCertificate = new AttributeCertificate; attributeCertificate->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } else { Asn1Error << "ERROR - SEQUENCE is missing non-optional elmt." << endl; longjmp (env, -202); } if ((tag1 == MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); acPath = new AttributeCertificationPathSeqOf; acPath->BDecContent (b, tag1, elmtLen1, seqBytesDecoded, env); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -203); } else return; } // AttributeCertificationPath::BDecContent AsnLen AttributeCertificationPath::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void AttributeCertificationPath::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "AttributeCertificationPath::BDec: ERROR - wrong tag" << endl; longjmp (env, -204); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int AttributeCertificationPath::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int AttributeCertificationPath::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void AttributeCertificationPath::Print (ostream &os) const { #ifndef NDEBUG os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; if (NOT_NULL (attributeCertificate)) { Indent (os, indentG); os << "attributeCertificate "; os << *attributeCertificate; } else { Indent (os, indentG); os << "attributeCertificate "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (acPath)) { os << ","<< endl; Indent (os, indentG); os << "acPath "; os << *acPath; } else { Indent (os, indentG); os << "acPath "; os << "-- void --"; os << endl; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // AttributeCertificationPath::Print AttributeCertificateAssertion::AttributeCertificateAssertion() { subject = NULL; issuer = NULL; attCertValidity = NULL; attType = NULL; } AttributeCertificateAssertion::AttributeCertificateAssertion (const AttributeCertificateAssertion &) { Asn1Error << "use of incompletely defined AttributeCertificateAssertion::AttributeCertificateAssertion (const AttributeCertificateAssertion &)" << endl; abort(); } AttributeCertificateAssertion::~AttributeCertificateAssertion() { delete subject; delete issuer; delete attCertValidity; delete attType; } AsnType *AttributeCertificateAssertion::Clone() const { return new AttributeCertificateAssertion; } AsnType *AttributeCertificateAssertion::Copy() const { return new AttributeCertificateAssertion (*this); } #if SNACC_DEEP_COPY AttributeCertificateAssertion &AttributeCertificateAssertion::operator = (const AttributeCertificateAssertion &that) #else // SNACC_DEEP_COPY AttributeCertificateAssertion &AttributeCertificateAssertion::operator = (const AttributeCertificateAssertion &) #endif // SNACC_DEEP_COPY { #if SNACC_DEEP_COPY if (this != &that) { if (that.subject) { if (!subject) subject = new AttributeCertificateAssertionChoice; *subject = *that.subject; } else { delete subject; subject = NULL; } if (that.issuer) { if (!issuer) issuer = new Name; *issuer = *that.issuer; } else { delete issuer; issuer = NULL; } if (that.attCertValidity) { if (!attCertValidity) attCertValidity = new GeneralizedTime; *attCertValidity = *that.attCertValidity; } else { delete attCertValidity; attCertValidity = NULL; } if (that.attType) { if (!attType) attType = new AttributeCertificateAssertionSetOf; *attType = *that.attType; } else { delete attType; attType = NULL; } } return *this; #else // SNACC_DEEP_COPY Asn1Error << "use of incompletely defined AttributeCertificateAssertion &AttributeCertificateAssertion::operator = (const AttributeCertificateAssertion &)" << endl; abort(); // if your compiler complains here, check the -novolat option #endif // SNACC_DEEP_COPY } AsnLen AttributeCertificateAssertion::BEncContent (BUF_TYPE b) { AsnLen totalLen = 0; AsnLen l; if (NOT_NULL (attType)) { BEncEocIfNec (b); BEncEocIfNec (b); l = attType->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SET_TAG_CODE); l += BEncConsLen (b, l); l += BEncTag1 (b, CNTX, CONS, 3); totalLen += l; } if (NOT_NULL (attCertValidity)) { BEncEocIfNec (b); l = attCertValidity->BEncContent (b); l += BEncDefLen (b, l); l += BEncTag1 (b, UNIV, PRIM, GENERALIZEDTIME_TAG_CODE); l += BEncConsLen (b, l); l += BEncTag1 (b, CNTX, CONS, 2); totalLen += l; } if (NOT_NULL (issuer)) { BEncEocIfNec (b); l = issuer->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, CNTX, CONS, 1); totalLen += l; } if (NOT_NULL (subject)) { BEncEocIfNec (b); l = subject->BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, CNTX, CONS, 0); totalLen += l; } return totalLen; } // AttributeCertificateAssertion::BEncContent void AttributeCertificateAssertion::BDecContent (BUF_TYPE b, AsnTag /*tag0*/, AsnLen elmtLen0, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag1; AsnLen seqBytesDecoded = 0; AsnLen elmtLen1; AsnLen elmtLen2; if (elmtLen0 == 0) return; else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } if ((tag1 == MAKE_TAG_ID (CNTX, CONS, 0))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); elmtLen2 = BDecLen (b, seqBytesDecoded, env); subject = new AttributeCertificateAssertionChoice; subject->BDecContent (b, tag1, elmtLen2, seqBytesDecoded, env); if (elmtLen1 == INDEFINITE_LEN) BDecEoc (b, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } if ((tag1 == MAKE_TAG_ID (CNTX, CONS, 1))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); elmtLen2 = BDecLen (b, seqBytesDecoded, env); issuer = new Name; issuer->BDecContent (b, tag1, elmtLen2, seqBytesDecoded, env); if (elmtLen1 == INDEFINITE_LEN) BDecEoc (b, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } if ((tag1 == MAKE_TAG_ID (CNTX, CONS, 2))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); if ((tag1 != MAKE_TAG_ID (UNIV, PRIM, GENERALIZEDTIME_TAG_CODE)) && (tag1 != MAKE_TAG_ID (UNIV, CONS, GENERALIZEDTIME_TAG_CODE))) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -205); } elmtLen2 = BDecLen (b, seqBytesDecoded, env); attCertValidity = new GeneralizedTime; attCertValidity->BDecContent (b, tag1, elmtLen2, seqBytesDecoded, env); if (elmtLen1 == INDEFINITE_LEN) BDecEoc (b, seqBytesDecoded, env); if (seqBytesDecoded == elmtLen0) { bytesDecoded += seqBytesDecoded; return; } else { tag1 = BDecTag (b, seqBytesDecoded, env); if ((elmtLen0 == INDEFINITE_LEN) && (tag1 == EOC_TAG_ID)) { BDEC_2ND_EOC_OCTET (b, seqBytesDecoded, env) bytesDecoded += seqBytesDecoded; return; } } } if ((tag1 == MAKE_TAG_ID (CNTX, CONS, 3))) { elmtLen1 = BDecLen (b, seqBytesDecoded, env); tag1 = BDecTag (b, seqBytesDecoded, env); if (tag1 != MAKE_TAG_ID (UNIV, CONS, SET_TAG_CODE)) { Asn1Error << "Unexpected Tag" << endl; longjmp (env, -206); } elmtLen2 = BDecLen (b, seqBytesDecoded, env); attType = new AttributeCertificateAssertionSetOf; attType->BDecContent (b, tag1, elmtLen2, seqBytesDecoded, env); if (elmtLen1 == INDEFINITE_LEN) BDecEoc (b, seqBytesDecoded, env); } bytesDecoded += seqBytesDecoded; if (elmtLen0 == INDEFINITE_LEN) { BDecEoc (b, bytesDecoded, env); return; } else if (seqBytesDecoded != elmtLen0) { Asn1Error << "ERROR - Length discrepancy on sequence." << endl; longjmp (env, -207); } else return; } // AttributeCertificateAssertion::BDecContent AsnLen AttributeCertificateAssertion::BEnc (BUF_TYPE b) { AsnLen l; l = BEncContent (b); l += BEncConsLen (b, l); l += BEncTag1 (b, UNIV, CONS, SEQ_TAG_CODE); return l; } void AttributeCertificateAssertion::BDec (BUF_TYPE b, AsnLen &bytesDecoded, ENV_TYPE env) { AsnTag tag; AsnLen elmtLen1; if ((tag = BDecTag (b, bytesDecoded, env)) != MAKE_TAG_ID (UNIV, CONS, SEQ_TAG_CODE)) { Asn1Error << "AttributeCertificateAssertion::BDec: ERROR - wrong tag" << endl; longjmp (env, -208); } elmtLen1 = BDecLen (b, bytesDecoded, env); BDecContent (b, tag, elmtLen1, bytesDecoded, env); } int AttributeCertificateAssertion::BEncPdu (BUF_TYPE b, AsnLen &bytesEncoded) { bytesEncoded = BEnc (b); return !b.WriteError(); } int AttributeCertificateAssertion::BDecPdu (BUF_TYPE b, AsnLen &bytesDecoded) { ENV_TYPE env; int val; bytesDecoded = 0; if ((val = setjmp (env)) == 0) { BDec (b, bytesDecoded, env); return !b.ReadError(); } else return false; } void AttributeCertificateAssertion::Print (ostream &os) const { #ifndef NDEBUG int nonePrinted = true; os << "{ -- SEQUENCE --" << endl; indentG += stdIndentG; if (NOT_NULL (subject)) { nonePrinted = false; Indent (os, indentG); os << "subject "; os << *subject; } else { Indent (os, indentG); os << "subject "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (issuer)) { if (!nonePrinted) os << "," << endl; nonePrinted = false; Indent (os, indentG); os << "issuer "; os << *issuer; } else { Indent (os, indentG); os << "issuer "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (attCertValidity)) { if (!nonePrinted) os << "," << endl; nonePrinted = false; Indent (os, indentG); os << "attCertValidity "; os << *attCertValidity; } else { Indent (os, indentG); os << "attCertValidity "; os << "-- void --"; os << "," << endl; } if (NOT_NULL (attType)) { if (!nonePrinted) os << "," << endl; nonePrinted = false; Indent (os, indentG); os << "attType "; os << *attType; } else { Indent (os, indentG); os << "attType "; os << "-- void --"; os << endl; } os << endl; indentG -= stdIndentG; Indent (os, indentG); os << "}"; #endif /* NDEBUG */ } // AttributeCertificateAssertion::Print