This section describes the step-by-step procedure for calling a C MDER encode function.
Before any encode function can be called; the user must first
initialize an encoding context. This is a variable of type OSCTXT.
This variable holds all of the working data used during the encoding
of a message. The context variable is declared as a normal automatic
variable within the top-level calling function. It must be initialized before use. This
can be accomplished by using the mderInitContext
function as
follows:
OSCTXT ctxt; if (mderInitContext (&ctxt) != 0) { /* initialization failed, could be a license problem */ printf (“context initialization failed (check license)\n”); return –1; }
After initializing the context and populating a variable of the structure to be encoded, an encode function can be called to encode the message.
A program fragment that could be used to encode a simple release request PDU is as follows:
#include "IEEE-11073-20601-ASN1.h" /* include file generated by ASN1C */ int main (void) { ApduType data; /* typedef generated by ASN1C */ OSCTXT ctxt; OSOCTET* msgptr; int stat; /* Step 1: Initialize the context and set the buffer pointer */ stat = mderInitContext (&ctxt); if (stat != 0) { /* initialization failed, could be a license problem */ rtxErrPrint (&ctxt); return stat; } /* Step 2: Populate the structure to be encoded */ asn1Init_ApduType (&data); data.t = T_ApduType_rlrq; data.u.rlrq = rtxMemAllocTypeZ (&ctxt, RlrqApdu); data.u.rlrq->reason = normal; /* Step 3: Call the generated encode function */ stat = mderEnc_ApduType (&ctxt, &data); /* Step 4: Check the return status. */ if (stat < 0) { rtxErrPrint (&ctxt); return stat; } stat = rtFreeContext (&ctxt); if (stat != 0) { printf ("Error freeing context!\n"); return stat; } return 0; }