s3-asn1: make all of s3 asn1 code do a proper asn1_init() first.
authorGünther Deschner <gd@samba.org>
Wed, 22 Oct 2008 17:23:49 +0000 (19:23 +0200)
committerGünther Deschner <gd@samba.org>
Wed, 22 Oct 2008 19:37:36 +0000 (21:37 +0200)
Guenther

source3/libads/cldap.c
source3/libads/krb5_setpw.c
source3/libsmb/clikrb5.c
source3/libsmb/clispnego.c
source3/libsmb/spnego.c
source3/smbd/sesssetup.c
source3/torture/t_asn1.c

index 7180464d475361c5f23e75047fa9dfe015efd6ed..8f9a8ff2137fd62ce74161a9ee389cfb2620428e 100644 (file)
 /*
   do a cldap netlogon query
 */
-static int send_cldap_netlogon(int sock, const char *domain, 
+static int send_cldap_netlogon(TALLOC_CTX *mem_ctx, int sock, const char *domain,
                               const char *hostname, unsigned ntversion)
 {
-       ASN1_DATA data;
+       ASN1_DATA *data;
        char ntver[4];
 #ifdef CLDAP_USER_QUERY
        char aac[4];
@@ -36,69 +36,72 @@ static int send_cldap_netlogon(int sock, const char *domain,
 #endif
        SIVAL(ntver, 0, ntversion);
 
-       memset(&data, 0, sizeof(data));
+       data = asn1_init(mem_ctx);
+       if (data == NULL) {
+               return -1;
+       }
 
-       asn1_push_tag(&data,ASN1_SEQUENCE(0));
-       asn1_write_Integer(&data, 4);
-       asn1_push_tag(&data, ASN1_APPLICATION(3));
-       asn1_write_OctetString(&data, NULL, 0);
-       asn1_write_enumerated(&data, 0);
-       asn1_write_enumerated(&data, 0);
-       asn1_write_Integer(&data, 0);
-       asn1_write_Integer(&data, 0);
-       asn1_write_BOOLEAN(&data, False);
-       asn1_push_tag(&data, ASN1_CONTEXT(0));
+       asn1_push_tag(data,ASN1_SEQUENCE(0));
+       asn1_write_Integer(data, 4);
+       asn1_push_tag(data, ASN1_APPLICATION(3));
+       asn1_write_OctetString(data, NULL, 0);
+       asn1_write_enumerated(data, 0);
+       asn1_write_enumerated(data, 0);
+       asn1_write_Integer(data, 0);
+       asn1_write_Integer(data, 0);
+       asn1_write_BOOLEAN(data, False);
+       asn1_push_tag(data, ASN1_CONTEXT(0));
 
        if (domain) {
-               asn1_push_tag(&data, ASN1_CONTEXT(3));
-               asn1_write_OctetString(&data, "DnsDomain", 9);
-               asn1_write_OctetString(&data, domain, strlen(domain));
-               asn1_pop_tag(&data);
+               asn1_push_tag(data, ASN1_CONTEXT(3));
+               asn1_write_OctetString(data, "DnsDomain", 9);
+               asn1_write_OctetString(data, domain, strlen(domain));
+               asn1_pop_tag(data);
        }
 
-       asn1_push_tag(&data, ASN1_CONTEXT(3));
-       asn1_write_OctetString(&data, "Host", 4);
-       asn1_write_OctetString(&data, hostname, strlen(hostname));
-       asn1_pop_tag(&data);
+       asn1_push_tag(data, ASN1_CONTEXT(3));
+       asn1_write_OctetString(data, "Host", 4);
+       asn1_write_OctetString(data, hostname, strlen(hostname));
+       asn1_pop_tag(data);
 
 #ifdef CLDAP_USER_QUERY
-       asn1_push_tag(&data, ASN1_CONTEXT(3));
-       asn1_write_OctetString(&data, "User", 4);
-       asn1_write_OctetString(&data, "SAMBA$", 6);
-       asn1_pop_tag(&data);
-
-       asn1_push_tag(&data, ASN1_CONTEXT(3));
-       asn1_write_OctetString(&data, "AAC", 4);
-       asn1_write_OctetString(&data, aac, 4);
-       asn1_pop_tag(&data);
+       asn1_push_tag(data, ASN1_CONTEXT(3));
+       asn1_write_OctetString(data, "User", 4);
+       asn1_write_OctetString(data, "SAMBA$", 6);
+       asn1_pop_tag(data);
+
+       asn1_push_tag(data, ASN1_CONTEXT(3));
+       asn1_write_OctetString(data, "AAC", 4);
+       asn1_write_OctetString(data, aac, 4);
+       asn1_pop_tag(data);
 #endif
 
-       asn1_push_tag(&data, ASN1_CONTEXT(3));
-       asn1_write_OctetString(&data, "NtVer", 5);
-       asn1_write_OctetString(&data, ntver, 4);
-       asn1_pop_tag(&data);
+       asn1_push_tag(data, ASN1_CONTEXT(3));
+       asn1_write_OctetString(data, "NtVer", 5);
+       asn1_write_OctetString(data, ntver, 4);
+       asn1_pop_tag(data);
 
-       asn1_pop_tag(&data);
+       asn1_pop_tag(data);
 
-       asn1_push_tag(&data,ASN1_SEQUENCE(0));
-       asn1_write_OctetString(&data, "NetLogon", 8);
-       asn1_pop_tag(&data);
-       asn1_pop_tag(&data);
-       asn1_pop_tag(&data);
+       asn1_push_tag(data,ASN1_SEQUENCE(0));
+       asn1_write_OctetString(data, "NetLogon", 8);
+       asn1_pop_tag(data);
+       asn1_pop_tag(data);
+       asn1_pop_tag(data);
 
-       if (data.has_error) {
-               DEBUG(2,("Failed to build cldap netlogon at offset %d\n", (int)data.ofs));
-               asn1_free(&data);
+       if (data->has_error) {
+               DEBUG(2,("Failed to build cldap netlogon at offset %d\n", (int)data->ofs));
+               asn1_free(data);
                return -1;
        }
 
-       if (write(sock, data.data, data.length) != (ssize_t)data.length) {
+       if (write(sock, data->data, data->length) != (ssize_t)data->length) {
                DEBUG(2,("failed to send cldap query (%s)\n", strerror(errno)));
-               asn1_free(&data);
+               asn1_free(data);
                return -1;
        }
 
-       asn1_free(&data);
+       asn1_free(data);
 
        return 0;
 }
@@ -123,7 +126,7 @@ static int recv_cldap_netlogon(TALLOC_CTX *mem_ctx,
                               struct netlogon_samlogon_response **reply)
 {
        int ret;
-       ASN1_DATA data;
+       ASN1_DATA *data;
        DATA_BLOB blob = data_blob_null;
        DATA_BLOB os1 = data_blob_null;
        DATA_BLOB os2 = data_blob_null;
@@ -160,28 +163,34 @@ static int recv_cldap_netlogon(TALLOC_CTX *mem_ctx,
        }
        blob.length = ret;
 
-       asn1_load(&data, blob);
-       asn1_start_tag(&data, ASN1_SEQUENCE(0));
-       asn1_read_Integer(&data, &i1);
-       asn1_start_tag(&data, ASN1_APPLICATION(4));
-       asn1_read_OctetString(&data, NULL, &os1);
-       asn1_start_tag(&data, ASN1_SEQUENCE(0));
-       asn1_start_tag(&data, ASN1_SEQUENCE(0));
-       asn1_read_OctetString(&data, NULL, &os2);
-       asn1_start_tag(&data, ASN1_SET);
-       asn1_read_OctetString(&data, NULL, &os3);
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
-
-       if (data.has_error) {
+       data = asn1_init(mem_ctx);
+       if (data == NULL) {
+               data_blob_free(&blob);
+               return -1;
+       }
+
+       asn1_load(data, blob);
+       asn1_start_tag(data, ASN1_SEQUENCE(0));
+       asn1_read_Integer(data, &i1);
+       asn1_start_tag(data, ASN1_APPLICATION(4));
+       asn1_read_OctetString(data, NULL, &os1);
+       asn1_start_tag(data, ASN1_SEQUENCE(0));
+       asn1_start_tag(data, ASN1_SEQUENCE(0));
+       asn1_read_OctetString(data, NULL, &os2);
+       asn1_start_tag(data, ASN1_SET);
+       asn1_read_OctetString(data, NULL, &os3);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
+
+       if (data->has_error) {
                data_blob_free(&blob);
                data_blob_free(&os1);
                data_blob_free(&os2);
                data_blob_free(&os3);
-               asn1_free(&data);
+               asn1_free(data);
                DEBUG(1,("Failed to parse cldap reply\n"));
                return -1;
        }
@@ -193,6 +202,7 @@ static int recv_cldap_netlogon(TALLOC_CTX *mem_ctx,
                data_blob_free(&os2);
                data_blob_free(&os3);
                data_blob_free(&blob);
+               asn1_free(data);
                return -1;
        }
 
@@ -202,6 +212,7 @@ static int recv_cldap_netlogon(TALLOC_CTX *mem_ctx,
                data_blob_free(&os2);
                data_blob_free(&os3);
                data_blob_free(&blob);
+               asn1_free(data);
                TALLOC_FREE(r);
                return -1;
        }
@@ -212,8 +223,8 @@ static int recv_cldap_netlogon(TALLOC_CTX *mem_ctx,
        data_blob_free(&os2);
        data_blob_free(&os3);
        data_blob_free(&blob);
-       
-       asn1_free(&data);
+
+       asn1_free(data);
 
        if (reply) {
                *reply = r;
@@ -244,7 +255,7 @@ bool ads_cldap_netlogon(TALLOC_CTX *mem_ctx,
                return False;
        }
 
-       ret = send_cldap_netlogon(sock, realm, global_myname(), nt_version);
+       ret = send_cldap_netlogon(mem_ctx, sock, realm, global_myname(), nt_version);
        if (ret != 0) {
                close(sock);
                return False;
index 0ff9f2ba3298ecb8cf42698f480c7d3ac39a9b77..04ee6ee62a8c4bfdf32570b18b737b4f1e7b6460 100644 (file)
@@ -65,7 +65,7 @@ static DATA_BLOB encode_krb5_setpw(const char *principal, const char *password)
        char* c;
        char* princ;
 
-       ASN1_DATA req;
+       ASN1_DATA *req;
        DATA_BLOB ret;
 
 
@@ -90,40 +90,43 @@ static DATA_BLOB encode_krb5_setpw(const char *principal, const char *password)
                return data_blob_null;
        }
 
-       memset(&req, 0, sizeof(req));
-       
-       asn1_push_tag(&req, ASN1_SEQUENCE(0));
-       asn1_push_tag(&req, ASN1_CONTEXT(0));
-       asn1_write_OctetString(&req, password, strlen(password));
-       asn1_pop_tag(&req);
+       req = asn1_init(talloc_tos());
+       if (req == NULL) {
+               return data_blob_null;
+       }
 
-       asn1_push_tag(&req, ASN1_CONTEXT(1));
-       asn1_push_tag(&req, ASN1_SEQUENCE(0));
+       asn1_push_tag(req, ASN1_SEQUENCE(0));
+       asn1_push_tag(req, ASN1_CONTEXT(0));
+       asn1_write_OctetString(req, password, strlen(password));
+       asn1_pop_tag(req);
 
-       asn1_push_tag(&req, ASN1_CONTEXT(0));
-       asn1_write_Integer(&req, 1);
-       asn1_pop_tag(&req);
+       asn1_push_tag(req, ASN1_CONTEXT(1));
+       asn1_push_tag(req, ASN1_SEQUENCE(0));
 
-       asn1_push_tag(&req, ASN1_CONTEXT(1));
-       asn1_push_tag(&req, ASN1_SEQUENCE(0));
+       asn1_push_tag(req, ASN1_CONTEXT(0));
+       asn1_write_Integer(req, 1);
+       asn1_pop_tag(req);
+
+       asn1_push_tag(req, ASN1_CONTEXT(1));
+       asn1_push_tag(req, ASN1_SEQUENCE(0));
 
        if (princ_part1) {
-               asn1_write_GeneralString(&req, princ_part1);
+               asn1_write_GeneralString(req, princ_part1);
        }
        
-       asn1_write_GeneralString(&req, princ_part2);
-       asn1_pop_tag(&req);
-       asn1_pop_tag(&req);
-       asn1_pop_tag(&req);
-       asn1_pop_tag(&req);
-
-       asn1_push_tag(&req, ASN1_CONTEXT(2));
-       asn1_write_GeneralString(&req, realm);
-       asn1_pop_tag(&req);
-       asn1_pop_tag(&req);
-
-       ret = data_blob(req.data, req.length);
-       asn1_free(&req);
+       asn1_write_GeneralString(req, princ_part2);
+       asn1_pop_tag(req);
+       asn1_pop_tag(req);
+       asn1_pop_tag(req);
+       asn1_pop_tag(req);
+
+       asn1_push_tag(req, ASN1_CONTEXT(2));
+       asn1_write_GeneralString(req, realm);
+       asn1_pop_tag(req);
+       asn1_pop_tag(req);
+
+       ret = data_blob(req->data, req->length);
+       asn1_free(req);
 
        free(princ);
 
index 5bcc678847ed96aeb09300aab97ec4411ffbc2ea..9f86b8b2f85df70570ec6f42e97395606ad22207 100644 (file)
@@ -320,31 +320,36 @@ bool unwrap_edata_ntstatus(TALLOC_CTX *mem_ctx,
                           DATA_BLOB *edata_out)
 {
        DATA_BLOB edata_contents;
-       ASN1_DATA data;
+       ASN1_DATA *data;
        int edata_type;
 
        if (!edata->length) {
                return False;
        }
 
-       asn1_load(&data, *edata);
-       asn1_start_tag(&data, ASN1_SEQUENCE(0));
-       asn1_start_tag(&data, ASN1_CONTEXT(1));
-       asn1_read_Integer(&data, &edata_type);
+       data = asn1_init(mem_ctx);
+       if (data == NULL) {
+               return false;
+       }
+
+       asn1_load(data, *edata);
+       asn1_start_tag(data, ASN1_SEQUENCE(0));
+       asn1_start_tag(data, ASN1_CONTEXT(1));
+       asn1_read_Integer(data, &edata_type);
 
        if (edata_type != KRB5_PADATA_PW_SALT) {
                DEBUG(0,("edata is not of required type %d but of type %d\n", 
                        KRB5_PADATA_PW_SALT, edata_type));
-               asn1_free(&data);
+               asn1_free(data);
                return False;
        }
        
-       asn1_start_tag(&data, ASN1_CONTEXT(2));
-       asn1_read_OctetString(&data, NULL, &edata_contents);
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
-       asn1_free(&data);
+       asn1_start_tag(data, ASN1_CONTEXT(2));
+       asn1_read_OctetString(data, NULL, &edata_contents);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
+       asn1_free(data);
 
        *edata_out = data_blob_talloc(mem_ctx, edata_contents.data, edata_contents.length);
 
@@ -357,32 +362,37 @@ bool unwrap_edata_ntstatus(TALLOC_CTX *mem_ctx,
 bool unwrap_pac(TALLOC_CTX *mem_ctx, DATA_BLOB *auth_data, DATA_BLOB *unwrapped_pac_data)
 {
        DATA_BLOB pac_contents;
-       ASN1_DATA data;
+       ASN1_DATA *data;
        int data_type;
 
        if (!auth_data->length) {
                return False;
        }
 
-       asn1_load(&data, *auth_data);
-       asn1_start_tag(&data, ASN1_SEQUENCE(0));
-       asn1_start_tag(&data, ASN1_SEQUENCE(0));
-       asn1_start_tag(&data, ASN1_CONTEXT(0));
-       asn1_read_Integer(&data, &data_type);
+       data = asn1_init(mem_ctx);
+       if (data == NULL) {
+               return false;
+       }
+
+       asn1_load(data, *auth_data);
+       asn1_start_tag(data, ASN1_SEQUENCE(0));
+       asn1_start_tag(data, ASN1_SEQUENCE(0));
+       asn1_start_tag(data, ASN1_CONTEXT(0));
+       asn1_read_Integer(data, &data_type);
        
        if (data_type != KRB5_AUTHDATA_WIN2K_PAC ) {
                DEBUG(10,("authorization data is not a Windows PAC (type: %d)\n", data_type));
-               asn1_free(&data);
+               asn1_free(data);
                return False;
        }
        
-       asn1_end_tag(&data);
-       asn1_start_tag(&data, ASN1_CONTEXT(1));
-       asn1_read_OctetString(&data, NULL, &pac_contents);
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
-       asn1_free(&data);
+       asn1_end_tag(data);
+       asn1_start_tag(data, ASN1_CONTEXT(1));
+       asn1_read_OctetString(data, NULL, &pac_contents);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
+       asn1_free(data);
 
        *unwrapped_pac_data = data_blob_talloc(mem_ctx, pac_contents.data, pac_contents.length);
 
index d45213cd9ec2abc67abc1ec91a4f6882d3efcdb6..fd312a4c0a7688d24122b195f13eefeb138c0f07 100644 (file)
@@ -30,45 +30,47 @@ DATA_BLOB spnego_gen_negTokenInit(char guid[16],
                                  const char *principal)
 {
        int i;
-       ASN1_DATA data;
+       ASN1_DATA *data;
        DATA_BLOB ret;
 
-       memset(&data, 0, sizeof(data));
+       data = asn1_init(talloc_tos());
+       if (data == NULL) {
+               return data_blob_null;
+       }
 
-       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_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));
+       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_write_OID(data,OIDs[i]);
        }
-       asn1_pop_tag(&data);
-       asn1_pop_tag(&data);
+       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_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);
+       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);
+       if (data->has_error) {
+               DEBUG(1,("Failed to build negTokenInit at offset %d\n", (int)data->ofs));
        }
 
-       ret = data_blob(data.data, data.length);
-       asn1_free(&data);
+       ret = data_blob(data->data, data->length);
+       asn1_free(data);
 
        return ret;
 }
@@ -82,38 +84,40 @@ DATA_BLOB spnego_gen_negTokenInit(char guid[16],
 */
 DATA_BLOB gen_negTokenInit(const char *OID, DATA_BLOB blob)
 {
-       ASN1_DATA data;
+       ASN1_DATA *data;
        DATA_BLOB ret;
 
-       memset(&data, 0, sizeof(data));
+       data = asn1_init(talloc_tos());
+       if (data == NULL) {
+               return data_blob_null;
+       }
 
-       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_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));
-       asn1_write_OID(&data, OID);
-       asn1_pop_tag(&data);
-       asn1_pop_tag(&data);
+       asn1_push_tag(data, ASN1_CONTEXT(0));
+       asn1_push_tag(data, ASN1_SEQUENCE(0));
+       asn1_write_OID(data, OID);
+       asn1_pop_tag(data);
+       asn1_pop_tag(data);
 
-       asn1_push_tag(&data, ASN1_CONTEXT(2));
-       asn1_write_OctetString(&data,blob.data,blob.length);
-       asn1_pop_tag(&data);
+       asn1_push_tag(data, ASN1_CONTEXT(2));
+       asn1_write_OctetString(data,blob.data,blob.length);
+       asn1_pop_tag(data);
 
-       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);
+       if (data->has_error) {
+               DEBUG(1,("Failed to build negTokenInit at offset %d\n", (int)data->ofs));
        }
 
-       ret = data_blob(data.data, data.length);
-       asn1_free(&data);
+       ret = data_blob(data->data, data->length);
+       asn1_free(data);
 
        return ret;
 }
@@ -128,44 +132,50 @@ bool spnego_parse_negTokenInit(DATA_BLOB blob,
 {
        int i;
        bool ret;
-       ASN1_DATA data;
+       ASN1_DATA *data;
+
+       data = asn1_init(talloc_tos());
+       if (data == NULL) {
+               return false;
+       }
+
+       asn1_load(data, blob);
 
-       asn1_load(&data, blob);
+       asn1_start_tag(data,ASN1_APPLICATION(0));
 
-       asn1_start_tag(&data,ASN1_APPLICATION(0));
-       asn1_check_OID(&data,OID_SPNEGO);
-       asn1_start_tag(&data,ASN1_CONTEXT(0));
-       asn1_start_tag(&data,ASN1_SEQUENCE(0));
+       asn1_check_OID(data,OID_SPNEGO);
+       asn1_start_tag(data,ASN1_CONTEXT(0));
+       asn1_start_tag(data,ASN1_SEQUENCE(0));
 
-       asn1_start_tag(&data,ASN1_CONTEXT(0));
-       asn1_start_tag(&data,ASN1_SEQUENCE(0));
-       for (i=0; asn1_tag_remaining(&data) > 0 && i < ASN1_MAX_OIDS-1; i++) {
+       asn1_start_tag(data,ASN1_CONTEXT(0));
+       asn1_start_tag(data,ASN1_SEQUENCE(0));
+       for (i=0; asn1_tag_remaining(data) > 0 && i < ASN1_MAX_OIDS-1; i++) {
                const char *oid_str = NULL;
-               asn1_read_OID(&data,NULL,&oid_str);
+               asn1_read_OID(data,NULL,&oid_str);
                OIDs[i] = oid_str;
        }
        OIDs[i] = NULL;
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
 
        *principal = NULL;
-       if (asn1_tag_remaining(&data) > 0) {
-               asn1_start_tag(&data, ASN1_CONTEXT(3));
-               asn1_start_tag(&data, ASN1_SEQUENCE(0));
-               asn1_start_tag(&data, ASN1_CONTEXT(0));
-               asn1_read_GeneralString(&data,NULL,principal);
-               asn1_end_tag(&data);
-               asn1_end_tag(&data);
-               asn1_end_tag(&data);
+       if (asn1_tag_remaining(data) > 0) {
+               asn1_start_tag(data, ASN1_CONTEXT(3));
+               asn1_start_tag(data, ASN1_SEQUENCE(0));
+               asn1_start_tag(data, ASN1_CONTEXT(0));
+               asn1_read_GeneralString(data,NULL,principal);
+               asn1_end_tag(data);
+               asn1_end_tag(data);
+               asn1_end_tag(data);
        }
 
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
 
-       asn1_end_tag(&data);
+       asn1_end_tag(data);
 
-       ret = !data.has_error;
-       if (data.has_error) {
+       ret = !data->has_error;
+       if (data->has_error) {
                int j;
                TALLOC_FREE(*principal);
                for(j = 0; j < i && j < ASN1_MAX_OIDS-1; j++) {
@@ -173,7 +183,7 @@ bool spnego_parse_negTokenInit(DATA_BLOB blob,
                }
        }
 
-       asn1_free(&data);
+       asn1_free(data);
        return ret;
 }
 
@@ -183,40 +193,42 @@ bool spnego_parse_negTokenInit(DATA_BLOB blob,
 DATA_BLOB gen_negTokenTarg(const char *OIDs[], DATA_BLOB blob)
 {
        int i;
-       ASN1_DATA data;
+       ASN1_DATA *data;
        DATA_BLOB ret;
 
-       memset(&data, 0, sizeof(data));
+       data = asn1_init(talloc_tos());
+       if (data == NULL) {
+               return data_blob_null;
+       }
 
-       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_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));
+       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_write_OID(data,OIDs[i]);
        }
-       asn1_pop_tag(&data);
-       asn1_pop_tag(&data);
+       asn1_pop_tag(data);
+       asn1_pop_tag(data);
 
-       asn1_push_tag(&data, ASN1_CONTEXT(2));
-       asn1_write_OctetString(&data,blob.data,blob.length);
-       asn1_pop_tag(&data);
+       asn1_push_tag(data, ASN1_CONTEXT(2));
+       asn1_write_OctetString(data,blob.data,blob.length);
+       asn1_pop_tag(data);
 
-       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 negTokenTarg at offset %d\n", (int)data.ofs));
-               asn1_free(&data);
+       if (data->has_error) {
+               DEBUG(1,("Failed to build negTokenTarg at offset %d\n", (int)data->ofs));
        }
 
-       ret = data_blob(data.data, data.length);
-       asn1_free(&data);
+       ret = data_blob(data->data, data->length);
+       asn1_free(data);
 
        return ret;
 }
@@ -224,61 +236,66 @@ DATA_BLOB gen_negTokenTarg(const char *OIDs[], DATA_BLOB blob)
 /*
   parse a negTokenTarg packet giving a list of OIDs and a security blob
 */
-bool parse_negTokenTarg(DATA_BLOB blob, const char *OIDs[ASN1_MAX_OIDS], DATA_BLOB *secblob)
+bool parse_negTokenTarg(DATA_BLOB blob, char *OIDs[ASN1_MAX_OIDS], DATA_BLOB *secblob)
 {
        int i;
-       ASN1_DATA data;
+       ASN1_DATA *data;
+
+       data = asn1_init(talloc_tos());
+       if (data == NULL) {
+               return false;
+       }
 
-       asn1_load(&data, blob);
-       asn1_start_tag(&data, ASN1_APPLICATION(0));
-       asn1_check_OID(&data,OID_SPNEGO);
-       asn1_start_tag(&data, ASN1_CONTEXT(0));
-       asn1_start_tag(&data, ASN1_SEQUENCE(0));
+       asn1_load(data, blob);
+       asn1_start_tag(data, ASN1_APPLICATION(0));
+       asn1_check_OID(data,OID_SPNEGO);
+       asn1_start_tag(data, ASN1_CONTEXT(0));
+       asn1_start_tag(data, ASN1_SEQUENCE(0));
 
-       asn1_start_tag(&data, ASN1_CONTEXT(0));
-       asn1_start_tag(&data, ASN1_SEQUENCE(0));
-       for (i=0; asn1_tag_remaining(&data) > 0 && i < ASN1_MAX_OIDS-1; i++) {
+       asn1_start_tag(data, ASN1_CONTEXT(0));
+       asn1_start_tag(data, ASN1_SEQUENCE(0));
+       for (i=0; asn1_tag_remaining(data) > 0 && i < ASN1_MAX_OIDS-1; i++) {
                const char *oid_str = NULL;
-               asn1_read_OID(&data,NULL,&oid_str);
+               asn1_read_OID(data,NULL,&oid_str);
                OIDs[i] = oid_str;
        }
        OIDs[i] = NULL;
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
 
        /* Skip any optional req_flags that are sent per RFC 4178 */
-       if (asn1_peek_tag(&data, ASN1_CONTEXT(1))) {
+       if (asn1_peek_tag(data, ASN1_CONTEXT(1))) {
                uint8 flags;
 
-               asn1_start_tag(&data, ASN1_CONTEXT(1));
-               asn1_start_tag(&data, ASN1_BITFIELD);
-               while (asn1_tag_remaining(&data) > 0)
-                       asn1_read_uint8(&data, &flags);
-               asn1_end_tag(&data);
-               asn1_end_tag(&data);
+               asn1_start_tag(data, ASN1_CONTEXT(1));
+               asn1_start_tag(data, ASN1_BITFIELD);
+               while (asn1_tag_remaining(data) > 0)
+                       asn1_read_uint8(data, &flags);
+               asn1_end_tag(data);
+               asn1_end_tag(data);
        }
 
-       asn1_start_tag(&data, ASN1_CONTEXT(2));
-       asn1_read_OctetString(&data,NULL,secblob);
-       asn1_end_tag(&data);
+       asn1_start_tag(data, ASN1_CONTEXT(2));
+       asn1_read_OctetString(data,NULL,secblob);
+       asn1_end_tag(data);
 
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
 
-       asn1_end_tag(&data);
+       asn1_end_tag(data);
 
-       if (data.has_error) {
+       if (data->has_error) {
                int j;
                data_blob_free(secblob);
                for(j = 0; j < i && j < ASN1_MAX_OIDS-1; j++) {
                        TALLOC_FREE(OIDs[j]);
                }
-               DEBUG(1,("Failed to parse negTokenTarg at offset %d\n", (int)data.ofs));
-               asn1_free(&data);
+               DEBUG(1,("Failed to parse negTokenTarg at offset %d\n", (int)data->ofs));
+               asn1_free(data);
                return False;
        }
 
-       asn1_free(&data);
+       asn1_free(data);
        return True;
 }
 
@@ -287,25 +304,27 @@ bool parse_negTokenTarg(DATA_BLOB blob, const char *OIDs[ASN1_MAX_OIDS], DATA_BL
 */
 DATA_BLOB spnego_gen_krb5_wrap(const DATA_BLOB ticket, const uint8 tok_id[2])
 {
-       ASN1_DATA data;
+       ASN1_DATA *data;
        DATA_BLOB ret;
 
-       memset(&data, 0, sizeof(data));
+       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_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);
+       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);
+       if (data->has_error) {
+               DEBUG(1,("Failed to build krb5 wrapper at offset %d\n", (int)data->ofs));
        }
 
-       ret = data_blob(data.data, data.length);
-       asn1_free(&data);
+       ret = data_blob(data->data, data->length);
+       asn1_free(data);
 
        return ret;
 }
@@ -316,33 +335,38 @@ DATA_BLOB spnego_gen_krb5_wrap(const DATA_BLOB ticket, const uint8 tok_id[2])
 bool spnego_parse_krb5_wrap(DATA_BLOB blob, DATA_BLOB *ticket, uint8 tok_id[2])
 {
        bool ret;
-       ASN1_DATA data;
+       ASN1_DATA *data;
        int data_remaining;
 
-       asn1_load(&data, blob);
-       asn1_start_tag(&data, ASN1_APPLICATION(0));
-       asn1_check_OID(&data, OID_KERBEROS5);
+       data = asn1_init(talloc_tos());
+       if (data == NULL) {
+               return false;
+       }
+
+       asn1_load(data, blob);
+       asn1_start_tag(data, ASN1_APPLICATION(0));
+       asn1_check_OID(data, OID_KERBEROS5);
 
-       data_remaining = asn1_tag_remaining(&data);
+       data_remaining = asn1_tag_remaining(data);
 
        if (data_remaining < 3) {
-               data.has_error = True;
+               data->has_error = True;
        } else {
-               asn1_read(&data, tok_id, 2);
+               asn1_read(data, tok_id, 2);
                data_remaining -= 2;
                *ticket = data_blob(NULL, data_remaining);
-               asn1_read(&data, ticket->data, ticket->length);
+               asn1_read(data, ticket->data, ticket->length);
        }
 
-       asn1_end_tag(&data);
+       asn1_end_tag(data);
 
-       ret = !data.has_error;
+       ret = !data->has_error;
 
-       if (data.has_error) {
+       if (data->has_error) {
                data_blob_free(ticket);
        }
 
-       asn1_free(&data);
+       asn1_free(data);
 
        return ret;
 }
@@ -389,45 +413,50 @@ bool spnego_parse_challenge(const DATA_BLOB blob,
                            DATA_BLOB *chal1, DATA_BLOB *chal2)
 {
        bool ret;
-       ASN1_DATA data;
+       ASN1_DATA *data;
 
        ZERO_STRUCTP(chal1);
        ZERO_STRUCTP(chal2);
 
-       asn1_load(&data, blob);
-       asn1_start_tag(&data,ASN1_CONTEXT(1));
-       asn1_start_tag(&data,ASN1_SEQUENCE(0));
+       data = asn1_init(talloc_tos());
+       if (data == NULL) {
+               return false;
+       }
+
+       asn1_load(data, blob);
+       asn1_start_tag(data,ASN1_CONTEXT(1));
+       asn1_start_tag(data,ASN1_SEQUENCE(0));
 
-       asn1_start_tag(&data,ASN1_CONTEXT(0));
-       asn1_check_enumerated(&data,1);
-       asn1_end_tag(&data);
+       asn1_start_tag(data,ASN1_CONTEXT(0));
+       asn1_check_enumerated(data,1);
+       asn1_end_tag(data);
 
-       asn1_start_tag(&data,ASN1_CONTEXT(1));
-       asn1_check_OID(&data, OID_NTLMSSP);
-       asn1_end_tag(&data);
+       asn1_start_tag(data,ASN1_CONTEXT(1));
+       asn1_check_OID(data, OID_NTLMSSP);
+       asn1_end_tag(data);
 
-       asn1_start_tag(&data,ASN1_CONTEXT(2));
-       asn1_read_OctetString(&data, NULL, chal1);
-       asn1_end_tag(&data);
+       asn1_start_tag(data,ASN1_CONTEXT(2));
+       asn1_read_OctetString(data, NULL, chal1);
+       asn1_end_tag(data);
 
        /* the second challenge is optional (XP doesn't send it) */
-       if (asn1_tag_remaining(&data)) {
-               asn1_start_tag(&data,ASN1_CONTEXT(3));
-               asn1_read_OctetString(&data, NULL, chal2);
-               asn1_end_tag(&data);
+       if (asn1_tag_remaining(data)) {
+               asn1_start_tag(data,ASN1_CONTEXT(3));
+               asn1_read_OctetString(data, NULL, chal2);
+               asn1_end_tag(data);
        }
 
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
 
-       ret = !data.has_error;
+       ret = !data->has_error;
 
-       if (data.has_error) {
+       if (data->has_error) {
                data_blob_free(chal1);
                data_blob_free(chal2);
        }
 
-       asn1_free(&data);
+       asn1_free(data);
        return ret;
 }
 
@@ -437,22 +466,25 @@ bool spnego_parse_challenge(const DATA_BLOB blob,
 */
 DATA_BLOB spnego_gen_auth(DATA_BLOB blob)
 {
-       ASN1_DATA data;
+       ASN1_DATA *data;
        DATA_BLOB ret;
 
-       memset(&data, 0, sizeof(data));
+       data = asn1_init(talloc_tos());
+       if (data == NULL) {
+               return data_blob_null;
+       }
 
-       asn1_push_tag(&data, ASN1_CONTEXT(1));
-       asn1_push_tag(&data, ASN1_SEQUENCE(0));
-       asn1_push_tag(&data, ASN1_CONTEXT(2));
-       asn1_write_OctetString(&data,blob.data,blob.length);    
-       asn1_pop_tag(&data);
-       asn1_pop_tag(&data);
-       asn1_pop_tag(&data);
+       asn1_push_tag(data, ASN1_CONTEXT(1));
+       asn1_push_tag(data, ASN1_SEQUENCE(0));
+       asn1_push_tag(data, ASN1_CONTEXT(2));
+       asn1_write_OctetString(data,blob.data,blob.length);
+       asn1_pop_tag(data);
+       asn1_pop_tag(data);
+       asn1_pop_tag(data);
 
-       ret = data_blob(data.data, data.length);
+       ret = data_blob(data->data, data->length);
 
-       asn1_free(&data);
+       asn1_free(data);
 
        return ret;
 }
@@ -462,25 +494,30 @@ DATA_BLOB spnego_gen_auth(DATA_BLOB blob)
 */
 bool spnego_parse_auth(DATA_BLOB blob, DATA_BLOB *auth)
 {
-       ASN1_DATA data;
-
-       asn1_load(&data, blob);
-       asn1_start_tag(&data, ASN1_CONTEXT(1));
-       asn1_start_tag(&data, ASN1_SEQUENCE(0));
-       asn1_start_tag(&data, ASN1_CONTEXT(2));
-       asn1_read_OctetString(&data, NULL, auth);
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
-
-       if (data.has_error) {
-               DEBUG(3,("spnego_parse_auth failed at %d\n", (int)data.ofs));
+       ASN1_DATA *data;
+
+       data = asn1_init(talloc_tos());
+       if (data == NULL) {
+               return false;
+       }
+
+       asn1_load(data, blob);
+       asn1_start_tag(data, ASN1_CONTEXT(1));
+       asn1_start_tag(data, ASN1_SEQUENCE(0));
+       asn1_start_tag(data, ASN1_CONTEXT(2));
+       asn1_read_OctetString(data, NULL, auth);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
+
+       if (data->has_error) {
+               DEBUG(3,("spnego_parse_auth failed at %d\n", (int)data->ofs));
                data_blob_free(auth);
-               asn1_free(&data);
+               asn1_free(data);
                return False;
        }
 
-       asn1_free(&data);
+       asn1_free(data);
        return True;
 }
 
@@ -490,7 +527,7 @@ bool spnego_parse_auth(DATA_BLOB blob, DATA_BLOB *auth)
 DATA_BLOB spnego_gen_auth_response(DATA_BLOB *reply, NTSTATUS nt_status,
                                   const char *mechOID)
 {
-       ASN1_DATA data;
+       ASN1_DATA *data;
        DATA_BLOB ret;
        uint8 negResult;
 
@@ -502,31 +539,34 @@ DATA_BLOB spnego_gen_auth_response(DATA_BLOB *reply, NTSTATUS nt_status,
                negResult = SPNEGO_NEG_RESULT_REJECT; 
        }
 
-       ZERO_STRUCT(data);
+       data = asn1_init(talloc_tos());
+       if (data == NULL) {
+               return data_blob_null;
+       }
 
-       asn1_push_tag(&data, ASN1_CONTEXT(1));
-       asn1_push_tag(&data, ASN1_SEQUENCE(0));
-       asn1_push_tag(&data, ASN1_CONTEXT(0));
-       asn1_write_enumerated(&data, negResult);
-       asn1_pop_tag(&data);
+       asn1_push_tag(data, ASN1_CONTEXT(1));
+       asn1_push_tag(data, ASN1_SEQUENCE(0));
+       asn1_push_tag(data, ASN1_CONTEXT(0));
+       asn1_write_enumerated(data, negResult);
+       asn1_pop_tag(data);
 
        if (mechOID) {
-               asn1_push_tag(&data,ASN1_CONTEXT(1));
-               asn1_write_OID(&data, mechOID);
-               asn1_pop_tag(&data);
+               asn1_push_tag(data,ASN1_CONTEXT(1));
+               asn1_write_OID(data, mechOID);
+               asn1_pop_tag(data);
        }
 
        if (reply && reply->data != NULL) {
-               asn1_push_tag(&data,ASN1_CONTEXT(2));
-               asn1_write_OctetString(&data, reply->data, reply->length);
-               asn1_pop_tag(&data);
+               asn1_push_tag(data,ASN1_CONTEXT(2));
+               asn1_write_OctetString(data, reply->data, reply->length);
+               asn1_pop_tag(data);
        }
 
-       asn1_pop_tag(&data);
-       asn1_pop_tag(&data);
+       asn1_pop_tag(data);
+       asn1_pop_tag(data);
 
-       ret = data_blob(data.data, data.length);
-       asn1_free(&data);
+       ret = data_blob(data->data, data->length);
+       asn1_free(data);
        return ret;
 }
 
@@ -537,7 +577,7 @@ bool spnego_parse_auth_response(DATA_BLOB blob, NTSTATUS nt_status,
                                const char *mechOID,
                                DATA_BLOB *auth)
 {
-       ASN1_DATA data;
+       ASN1_DATA *data;
        uint8 negResult;
 
        if (NT_STATUS_IS_OK(nt_status)) {
@@ -548,53 +588,58 @@ bool spnego_parse_auth_response(DATA_BLOB blob, NTSTATUS nt_status,
                negResult = SPNEGO_NEG_RESULT_REJECT;
        }
 
-       asn1_load(&data, blob);
-       asn1_start_tag(&data, ASN1_CONTEXT(1));
-       asn1_start_tag(&data, ASN1_SEQUENCE(0));
-       asn1_start_tag(&data, ASN1_CONTEXT(0));
-       asn1_check_enumerated(&data, negResult);
-       asn1_end_tag(&data);
+       data = asn1_init(talloc_tos());
+       if (data == NULL) {
+               return false;
+       }
+
+       asn1_load(data, blob);
+       asn1_start_tag(data, ASN1_CONTEXT(1));
+       asn1_start_tag(data, ASN1_SEQUENCE(0));
+       asn1_start_tag(data, ASN1_CONTEXT(0));
+       asn1_check_enumerated(data, negResult);
+       asn1_end_tag(data);
 
        *auth = data_blob_null;
 
-       if (asn1_tag_remaining(&data)) {
-               asn1_start_tag(&data,ASN1_CONTEXT(1));
-               asn1_check_OID(&data, mechOID);
-               asn1_end_tag(&data);
+       if (asn1_tag_remaining(data)) {
+               asn1_start_tag(data,ASN1_CONTEXT(1));
+               asn1_check_OID(data, mechOID);
+               asn1_end_tag(data);
 
-               if (asn1_tag_remaining(&data)) {
-                       asn1_start_tag(&data,ASN1_CONTEXT(2));
-                       asn1_read_OctetString(&data, NULL, auth);
-                       asn1_end_tag(&data);
+               if (asn1_tag_remaining(data)) {
+                       asn1_start_tag(data,ASN1_CONTEXT(2));
+                       asn1_read_OctetString(data, NULL, auth);
+                       asn1_end_tag(data);
                }
        } else if (negResult == SPNEGO_NEG_RESULT_INCOMPLETE) {
-               data.has_error = 1;
+               data->has_error = 1;
        }
 
        /* Binding against Win2K DC returns a duplicate of the responseToken in
         * the optional mechListMIC field. This is a bug in Win2K. We ignore
         * this field if it exists. Win2K8 may return a proper mechListMIC at
         * which point we need to implement the integrity checking. */
-       if (asn1_tag_remaining(&data)) {
+       if (asn1_tag_remaining(data)) {
                DATA_BLOB mechList = data_blob_null;
-               asn1_start_tag(&data, ASN1_CONTEXT(3));
-               asn1_read_OctetString(&data, NULL, &mechList);
-               asn1_end_tag(&data);
+               asn1_start_tag(data, ASN1_CONTEXT(3));
+               asn1_read_OctetString(data, NULL, &mechList);
+               asn1_end_tag(data);
                data_blob_free(&mechList);
                DEBUG(5,("spnego_parse_auth_response received mechListMIC, "
                    "ignoring.\n"));
        }
 
-       asn1_end_tag(&data);
-       asn1_end_tag(&data);
+       asn1_end_tag(data);
+       asn1_end_tag(data);
 
-       if (data.has_error) {
-               DEBUG(3,("spnego_parse_auth_response failed at %d\n", (int)data.ofs));
-               asn1_free(&data);
+       if (data->has_error) {
+               DEBUG(3,("spnego_parse_auth_response failed at %d\n", (int)data->ofs));
+               asn1_free(data);
                data_blob_free(auth);
                return False;
        }
 
-       asn1_free(&data);
+       asn1_free(data);
        return True;
 }
index 70fd441c9edbfb078d947ce343bbbcfbae9a52e7..b2197eb71b880a914174ff42ac3e70ca55584f53 100644 (file)
@@ -249,24 +249,29 @@ static bool write_negTokenTarg(ASN1_DATA *asn1, negTokenTarg_t *token)
 
 ssize_t read_spnego_data(DATA_BLOB data, SPNEGO_DATA *token)
 {
-       ASN1_DATA asn1;
+       ASN1_DATA *asn1;
        ssize_t ret = -1;
 
        ZERO_STRUCTP(token);
-       ZERO_STRUCT(asn1);
-       asn1_load(&asn1, data);
 
-       switch (asn1.data[asn1.ofs]) {
+       asn1 = asn1_init(talloc_tos());
+       if (asn1 == NULL) {
+               return -1;
+       }
+
+       asn1_load(asn1, data);
+
+       switch (asn1->data[asn1->ofs]) {
        case ASN1_APPLICATION(0):
-               asn1_start_tag(&asn1, ASN1_APPLICATION(0));
-               asn1_check_OID(&asn1, OID_SPNEGO);
-               if (read_negTokenInit(&asn1, &token->negTokenInit)) {
+               asn1_start_tag(asn1, ASN1_APPLICATION(0));
+               asn1_check_OID(asn1, OID_SPNEGO);
+               if (read_negTokenInit(asn1, &token->negTokenInit)) {
                        token->type = SPNEGO_NEG_TOKEN_INIT;
                }
-               asn1_end_tag(&asn1);
+               asn1_end_tag(asn1);
                break;
        case ASN1_CONTEXT(1):
-               if (read_negTokenTarg(&asn1, &token->negTokenTarg)) {
+               if (read_negTokenTarg(asn1, &token->negTokenTarg)) {
                        token->type = SPNEGO_NEG_TOKEN_TARG;
                }
                break;
@@ -274,39 +279,42 @@ ssize_t read_spnego_data(DATA_BLOB data, SPNEGO_DATA *token)
                break;
        }
 
-       if (!asn1.has_error) ret = asn1.ofs;
-       asn1_free(&asn1);
+       if (!asn1->has_error) ret = asn1->ofs;
+       asn1_free(asn1);
 
        return ret;
 }
 
 ssize_t write_spnego_data(DATA_BLOB *blob, SPNEGO_DATA *spnego)
 {
-       ASN1_DATA asn1;
+       ASN1_DATA *asn1;
        ssize_t ret = -1;
 
-       ZERO_STRUCT(asn1);
+       asn1 = asn1_init(talloc_tos());
+       if (asn1 == NULL) {
+               return -1;
+       }
 
        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);
+               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);
+               write_negTokenTarg(asn1, &spnego->negTokenTarg);
                break;
        default:
-               asn1.has_error = True;
+               asn1->has_error = True;
                break;
        }
 
-       if (!asn1.has_error) {
-               *blob = data_blob(asn1.data, asn1.length);
-               ret = asn1.ofs;
+       if (!asn1->has_error) {
+               *blob = data_blob(asn1->data, asn1->length);
+               ret = asn1->ofs;
        }
-       asn1_free(&asn1);
+       asn1_free(asn1);
 
        return ret;
 }
index c0a4696754674570f4edffc9a83fe5935f8a30a7..a482b3398a23c4f03eb90b801143164415bed3f2 100644 (file)
@@ -998,7 +998,7 @@ static NTSTATUS check_spnego_blob_complete(uint16 smbpid, uint16 vuid,
                DATA_BLOB *pblob)
 {
        struct pending_auth_data *pad = NULL;
-       ASN1_DATA data;
+       ASN1_DATA *data;
        size_t needed_len = 0;
 
        pad = get_pending_auth_data(smbpid);
@@ -1085,34 +1085,39 @@ static NTSTATUS check_spnego_blob_complete(uint16 smbpid, uint16 vuid,
         * the data given in this blob is enough.
         */
 
-       asn1_load(&data, *pblob);
-       asn1_start_tag(&data, pblob->data[0]);
-       if (data.has_error || data.nesting == NULL) {
-               asn1_free(&data);
+       data = asn1_init(NULL);
+       if (data == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       asn1_load(data, *pblob);
+       asn1_start_tag(data, pblob->data[0]);
+       if (data->has_error || data->nesting == NULL) {
+               asn1_free(data);
                /* Let caller catch. */
                return NT_STATUS_OK;
        }
 
        /* Integer wrap paranoia.... */
 
-       if (data.nesting->taglen + data.nesting->start < data.nesting->taglen ||
-           data.nesting->taglen + data.nesting->start < data.nesting->start) {
+       if (data->nesting->taglen + data->nesting->start < data->nesting->taglen ||
+           data->nesting->taglen + data->nesting->start < data->nesting->start) {
 
                DEBUG(2,("check_spnego_blob_complete: integer wrap "
                        "data.nesting->taglen = %u, "
                        "data.nesting->start = %u\n",
-                       (unsigned int)data.nesting->taglen,
-                       (unsigned int)data.nesting->start ));
+                       (unsigned int)data->nesting->taglen,
+                       (unsigned int)data->nesting->start ));
 
-               asn1_free(&data);
+               asn1_free(data);
                return NT_STATUS_INVALID_PARAMETER;
        }
 
        /* Total length of the needed asn1 is the tag length
         * plus the current offset. */
 
-       needed_len = data.nesting->taglen + data.nesting->start;
-       asn1_free(&data);
+       needed_len = data->nesting->taglen + data->nesting->start;
+       asn1_free(data);
 
        DEBUG(10,("check_spnego_blob_complete: needed_len = %u, "
                "pblob->length = %u\n",
index 5862742bc12dea7c57460c582b56cae833ca2d40..0ccd97b6d5748b3eceeaa65ca80fe3b449c727a9 100644 (file)
@@ -31,22 +31,26 @@ int main(void)
        bool ok = True;
 
        for (i=0; tests[i].data != NULL; i++) {
-               ASN1_DATA data;
+               ASN1_DATA *data;
                DATA_BLOB blob;
 
-               ZERO_STRUCT(data);
-               asn1_write_Integer(&data, values[i]);
+               data = asn1_init(talloc_tos());
+               if (!data) {
+                       return -1;
+               }
+
+               asn1_write_Integer(data, values[i]);
 
-               if ((data.length != tests[i].length) ||
-                   (memcmp(data.data, tests[i].data, data.length) != 0)) {
+               if ((data->length != tests[i].length) ||
+                   (memcmp(data>data, tests[i].data, data->length) != 0)) {
                        printf("Test for %d failed\n", values[i]);
                        ok = False;
                }
 
-               blob.data = data.data;
-               blob.length = data.length;
-               asn1_load(&data, blob);
-               if (!asn1_read_Integer(&data, &val)) {
+               blob.data = data->data;
+               blob.length = data->length;
+               asn1_load(data, blob);
+               if (!asn1_read_Integer(data, &val)) {
                        printf("Could not read our own Integer for %d\n",
                               values[i]);
                        ok = False;