Example #1
2
/*
  generate a krb5 GSS-API wrapper packet given a ticket
*/
DATA_BLOB spnego_gen_krb5_wrap(DATA_BLOB ticket, const uint8 tok_id[2])
{
	ASN1_DATA data;
	DATA_BLOB ret;

	memset(&data, 0, sizeof(data));

	asn1_push_tag(&data, ASN1_APPLICATION(0));
	asn1_write_OID(&data, OID_KERBEROS5);

	asn1_write(&data, tok_id, 2);
	asn1_write(&data, ticket.data, ticket.length);
	asn1_pop_tag(&data);

	if (data.has_error) {
		DEBUG(1,("Failed to build krb5 wrapper at offset %d\n", (int)data.ofs));
		asn1_free(&data);
	}

	ret = data_blob(data.data, data.length);
	asn1_free(&data);

	return ret;
}
Example #2
0
/*
  generate a krb5 GSS-API wrapper packet given a ticket
*/
DATA_BLOB spnego_gen_krb5_wrap(TALLOC_CTX *ctx, const DATA_BLOB ticket, const uint8 tok_id[2])
{
    ASN1_DATA *data;
    DATA_BLOB ret;

    data = asn1_init(talloc_tos());
    if (data == NULL) {
        return data_blob_null;
    }

    asn1_push_tag(data, ASN1_APPLICATION(0));
    asn1_write_OID(data, OID_KERBEROS5);

    asn1_write(data, tok_id, 2);
    asn1_write(data, ticket.data, ticket.length);
    asn1_pop_tag(data);

    if (data->has_error) {
        DEBUG(1,("Failed to build krb5 wrapper at offset %d\n", (int)data->ofs));
    }

    ret = data_blob_talloc(ctx, data->data, data->length);
    asn1_free(data);

    return ret;
}
Example #3
0
/*
  generate a krb5 GSS-API wrapper packet given a ticket
*/
static DATA_BLOB gensec_gssapi_gen_krb5_wrap(TALLOC_CTX *mem_ctx, const DATA_BLOB *ticket, const uint8_t tok_id[2])
{
    struct asn1_data *data;
    DATA_BLOB ret;

    data = asn1_init(mem_ctx);
    if (!data || !ticket->data) {
        return data_blob(NULL,0);
    }

    asn1_push_tag(data, ASN1_APPLICATION(0));
    asn1_write_OID(data, GENSEC_OID_KERBEROS5);

    asn1_write(data, tok_id, 2);
    asn1_write(data, ticket->data, ticket->length);
    asn1_pop_tag(data);

    if (data->has_error) {
        DEBUG(1,("Failed to build krb5 wrapper at offset %d\n", (int)data->ofs));
        asn1_free(data);
        return data_blob(NULL,0);
    }

    ret = data_blob_talloc(mem_ctx, data->data, data->length);
    asn1_free(data);

    return ret;
}
Example #4
0
/*
  generate a krb5 GSS-API wrapper packet given a ticket
*/
DATA_BLOB spnego_gen_krb5_wrap(TALLOC_CTX *ctx, const DATA_BLOB ticket, const uint8_t tok_id[2])
{
	ASN1_DATA *data;
	DATA_BLOB ret = data_blob_null;

	data = asn1_init(talloc_tos());
	if (data == NULL) {
		return data_blob_null;
	}

	if (!asn1_push_tag(data, ASN1_APPLICATION(0))) goto err;
	if (!asn1_write_OID(data, OID_KERBEROS5)) goto err;

	if (!asn1_write(data, tok_id, 2)) goto err;
	if (!asn1_write(data, ticket.data, ticket.length)) goto err;
	if (!asn1_pop_tag(data)) goto err;

	if (!asn1_extract_blob(data, ctx, &ret)) {
		goto err;
	}

  err:

	if (asn1_has_error(data)) {
		DEBUG(1, ("Failed to build krb5 wrapper at offset %d\n",
			  (int)asn1_current_ofs(data)));
	}

	asn1_free(data);

	return ret;
}
Example #5
0
/*
  generate a negTokenInit packet given a GUID, a list of supported
  OIDs (the mechanisms) and a principal name string 
*/
DATA_BLOB spnego_gen_negTokenInit(uint8 guid[16], 
				  const char *OIDs[], 
				  const char *principal)
{
	int i;
	ASN1_DATA data;
	DATA_BLOB ret;

	memset(&data, 0, sizeof(data));

	asn1_write(&data, guid, 16);
	asn1_push_tag(&data,ASN1_APPLICATION(0));
	asn1_write_OID(&data,OID_SPNEGO);
	asn1_push_tag(&data,ASN1_CONTEXT(0));
	asn1_push_tag(&data,ASN1_SEQUENCE(0));

	asn1_push_tag(&data,ASN1_CONTEXT(0));
	asn1_push_tag(&data,ASN1_SEQUENCE(0));
	for (i=0; OIDs[i]; i++) {
		asn1_write_OID(&data,OIDs[i]);
	}
	asn1_pop_tag(&data);
	asn1_pop_tag(&data);

	asn1_push_tag(&data, ASN1_CONTEXT(3));
	asn1_push_tag(&data, ASN1_SEQUENCE(0));
	asn1_push_tag(&data, ASN1_CONTEXT(0));
	asn1_write_GeneralString(&data,principal);
	asn1_pop_tag(&data);
	asn1_pop_tag(&data);
	asn1_pop_tag(&data);

	asn1_pop_tag(&data);
	asn1_pop_tag(&data);

	asn1_pop_tag(&data);

	if (data.has_error) {
		DEBUG(1,("Failed to build negTokenInit at offset %d\n", (int)data.ofs));
		asn1_free(&data);
	}

	ret = data_blob(data.data, data.length);
	asn1_free(&data);

	return ret;
}
Example #6
0
static bool write_negTokenInit(struct asn1_data *asn1, struct spnego_negTokenInit *token)
{
    asn1_push_tag(asn1, ASN1_CONTEXT(0));
    asn1_push_tag(asn1, ASN1_SEQUENCE(0));

    /* Write mechTypes */
    if (token->mechTypes && *token->mechTypes) {
        int i;

        asn1_push_tag(asn1, ASN1_CONTEXT(0));
        asn1_push_tag(asn1, ASN1_SEQUENCE(0));
        for (i = 0; token->mechTypes[i]; i++) {
            asn1_write_OID(asn1, token->mechTypes[i]);
        }
        asn1_pop_tag(asn1);
        asn1_pop_tag(asn1);
    }

    /* write reqFlags */
    if (token->reqFlags & SPNEGO_REQ_FLAG) {
        int flags = token->reqFlags & ~SPNEGO_REQ_FLAG;

        asn1_push_tag(asn1, ASN1_CONTEXT(1));
        asn1_write_Integer(asn1, flags);
        asn1_pop_tag(asn1);
    }

    /* write mechToken */
    if (token->mechToken.data) {
        asn1_push_tag(asn1, ASN1_CONTEXT(2));
        asn1_write_OctetString(asn1, token->mechToken.data,
                               token->mechToken.length);
        asn1_pop_tag(asn1);
    }

    /* write mechListMIC */
    if (token->mechListMIC.data) {
        asn1_push_tag(asn1, ASN1_CONTEXT(3));
#if 0
        /* This is what RFC 2478 says ... */
        asn1_write_OctetString(asn1, token->mechListMIC.data,
                               token->mechListMIC.length);
#else
        /* ... but unfortunately this is what Windows
           sends/expects */
        asn1_push_tag(asn1, ASN1_SEQUENCE(0));
        asn1_push_tag(asn1, ASN1_CONTEXT(0));
        asn1_push_tag(asn1, ASN1_GENERAL_STRING);
        asn1_write(asn1, token->mechListMIC.data,
                   token->mechListMIC.length);
        asn1_pop_tag(asn1);
        asn1_pop_tag(asn1);
        asn1_pop_tag(asn1);
#endif
        asn1_pop_tag(asn1);
    }

    asn1_pop_tag(asn1);
    asn1_pop_tag(asn1);

    return !asn1->has_error;
}
Example #7
0
/* useful fn for writing a uint8 */
BOOL asn1_write_uint8(ASN1_DATA *data, uint8 v)
{
	return asn1_write(data, &v, 1);
}
Example #8
0
/* useful fn for writing a uint8_t */
bool asn1_write_uint8(struct asn1_data *data, uint8_t v)
{
	return asn1_write(data, &v, 1);
}