ssize_t spnego_write_data(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, struct spnego_data *spnego) { struct asn1_data *asn1 = asn1_init(mem_ctx); ssize_t ret = -1; if (asn1 == NULL) { return -1; } switch (spnego->type) { case SPNEGO_NEG_TOKEN_INIT: asn1_push_tag(asn1, ASN1_APPLICATION(0)); asn1_write_OID(asn1, GENSEC_OID_SPNEGO); write_negTokenInit(asn1, &spnego->negTokenInit); asn1_pop_tag(asn1); break; case SPNEGO_NEG_TOKEN_TARG: write_negTokenTarg(asn1, &spnego->negTokenTarg); break; default: asn1->has_error = true; break; } if (!asn1->has_error) { *blob = data_blob_talloc(mem_ctx, asn1->data, asn1->length); ret = asn1->ofs; } asn1_free(asn1); return ret; }
ssize_t write_spnego_data(DATA_BLOB *blob, SPNEGO_DATA *spnego) { ASN1_DATA asn1; ssize_t ret = -1; ZERO_STRUCT(asn1); switch (spnego->type) { case SPNEGO_NEG_TOKEN_INIT: asn1_push_tag(&asn1, ASN1_APPLICATION(0)); asn1_write_OID(&asn1, OID_SPNEGO); write_negTokenInit(&asn1, &spnego->negTokenInit); asn1_pop_tag(&asn1); break; case SPNEGO_NEG_TOKEN_TARG: write_negTokenTarg(&asn1, &spnego->negTokenTarg); break; default: asn1.has_error = True; break; } if (!asn1.has_error) { *blob = data_blob(asn1.data, asn1.length); ret = asn1.ofs; } asn1_free(&asn1); return ret; }