void octsTest(void) { unsigned char buf[] = {0x04,0x14,0x31,0x32,0x33,0x34,0x35,0x36,0x37, 0x38,0x39,0x30,0x41,0x42,0x43,0x44,0x45,0x46, 0x47,0x48,0x49,0x50}; AsnBuf asnBuf((char *)buf, 22); size_t i; AsnLen len = 22; AsnOcts octs; try { std::cout << "*** start of AsnOcts tests ***\n"; if (octs.BDecPdu(asnBuf, len)) { if (memcmp(octs.c_ustr(), &buf[2], octs.Len()) == 0) { for (i = 0; i < 20; i++) { std::cout << "OCTET STRING value: " << octs.c_ustr()[i] << std::endl; } } else { for (i = 0; i < 20; i++) { std::cout << "ERROR: Unexpected result for OCTET STRING: " << octs.c_ustr()[i] << std::endl; } } } else { std::cout << "Decode of OCTET STRING encoded FAILED!\n"; } std::cout << "*** End of AsnOcts tests ***\n"; } catch(SnaccException &e) { std::cout << "Octs test failed:\n"; std::cout << "ERROR STRING: "; std::cout << e.what() << "\n"; std::cout.flush(); std::cout << "*** End of AsnOcts tests ***\n"; } }
void AsnAny::PDec(AsnBufBits &b, AsnLen &bitsDecoded) { AsnBufBits tmpBufBits; AsnOcts tmpAnyLoadOcts; AsnLen tmpBitsDecoded=0; FUNC("AsnAny::PDec"); // ai will be NULL if this is an ANY (not an ANY DEFINED BY) if (ai != NULL) { // the type is already known clone it and use it's BDec to decode the // ASN.1 // value = ai->typeToClone->Clone(); if (value == NULL) { throw SnaccException(STACK_ENTRY, "typeToClone->Clone() failed", INVALID_ANY); } // IF value == NULL else { tmpAnyLoadOcts.PDec(b, bitsDecoded); // OUTER OctetString // OUTER "bitsDecoded" returned to caller. if (tmpAnyLoadOcts.length()) { tmpBufBits.PutBits((unsigned char *)tmpAnyLoadOcts.c_ustr(), tmpAnyLoadOcts.length()*8); value->PDec(tmpBufBits, tmpBitsDecoded); // DECODE actual known value. } // END IF tmpBitsDecoded } // END IF value == NULL } // IF ai != NULL else // JUST load BLOB of data in "anyBuf" { tmpAnyLoadOcts.PDec(b, bitsDecoded); // OUTER OctetString // OUTER "bitsDecoded" returned to caller. if (tmpAnyLoadOcts.length()) { if(this->anyBuf) delete this->anyBuf; this->anyBuf = new AsnBuf((char *)tmpAnyLoadOcts.c_str(), tmpAnyLoadOcts.length()); } // END IF any data in ANY. } // END IF ai != NULL } // END AsnAny::PDec(...)
void doubleDecodeTest(void) { char buf[] = {0x04,0x01,0x31,0x04,0x01,0x32}; AsnBuf asnBuf(buf, 6); AsnLen len; AsnOcts octs; try { std::cout << "*** doubleDecodeTest ***\n"; if (octs.BDecPdu(asnBuf, len)) { if (octs.c_ustr()[0] == '1') { std::cout << "First OCTET STRING value: " << octs.c_ustr()[0] << std::endl; if (octs.BDecPdu(asnBuf, len)) { if (octs.c_ustr()[0] == '2') { std::cout << "Second OCTET STRING value: " << octs.c_ustr()[0] << std::endl; } else { std::cout << "Unexpected result for second OCTET STRING: " << octs.c_ustr()[0] << std::endl; } } else { std::cout << "Decode of second OCTET STRING failed!\n"; } } else { std::cout << "ERROR: Unexpected result for first OCTET STRING: " << octs.c_ustr()[0] << std::endl; } } else { std::cout << "Decode of double OCTET STRING encoded FAILED!\n"; } std::cout << "*** doubleDecodeTest ***\n"; } catch(SnaccException &e) { std::cout << "Double decode test failed:\n"; std::cout << "ERROR STRING: "; std::cout << e.what() << "\n"; std::cout.flush(); std::cout << "*** doubleDecodeTest ***\n"; } }