+static bool encode_GSSSessionData(apr_pool_t *mempool,
+ GSSSessionData_t *gsessdata,
+ unsigned char **buf, int *len)
+{
+ asn_enc_rval_t rval;
+ unsigned char *buffer = NULL;
+ size_t buflen;
+ bool ret = false;
+
+ /* dry run to compute the size */
+ rval = der_encode(&asn_DEF_GSSSessionData, gsessdata, NULL, NULL);
+ if (rval.encoded == -1) goto done;
+
+ buflen = rval.encoded;
+ buffer = apr_pcalloc(mempool, buflen);
+
+ /* now for real */
+ rval = der_encode_to_buffer(&asn_DEF_GSSSessionData,
+ gsessdata, buffer, buflen);
+ if (rval.encoded == -1) goto done;
+
+ *buf = buffer;
+ *len = buflen;
+ ret = true;
+
+done:
+ return ret;
+}
+
+static GSSSessionData_t *decode_GSSSessionData(void *buf, size_t len)
+{
+ GSSSessionData_t *gsessdata = NULL;
+ asn_dec_rval_t rval;
+
+ rval = ber_decode(NULL, &asn_DEF_GSSSessionData,
+ (void **)&gsessdata, buf, len);
+ if (rval.code == RC_OK) {
+ return gsessdata;
+ }
+ return NULL;
+}
+