root/source4/torture/rpc/session_key.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. init_lsa_String
  2. test_CreateSecret_basic
  3. test_secrets
  4. add_test
  5. torture_rpc_lsa_secrets

   1 /* 
   2    Unix SMB/CIFS implementation.
   3    test suite for lsa rpc operations
   4 
   5    Copyright (C) Andrew Tridgell 2003
   6    Copyright (C) Andrew Bartlett <abartlet@samba.org> 2004-2005
   7    
   8    This program is free software; you can redistribute it and/or modify
   9    it under the terms of the GNU General Public License as published by
  10    the Free Software Foundation; either version 3 of the License, or
  11    (at your option) any later version.
  12    
  13    This program is distributed in the hope that it will be useful,
  14    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16    GNU General Public License for more details.
  17    
  18    You should have received a copy of the GNU General Public License
  19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  20 */
  21 
  22 #include "includes.h"
  23 #include "torture/torture.h"
  24 #include "librpc/gen_ndr/ndr_lsa_c.h"
  25 
  26 #include "libcli/auth/libcli_auth.h"
  27 #include "torture/rpc/rpc.h"
  28 #include "lib/cmdline/popt_common.h"
  29 #include "param/param.h"
  30 
  31 static void init_lsa_String(struct lsa_String *name, const char *s)
     /* [<][>][^][v][top][bottom][index][help] */
  32 {
  33         name->string = s;
  34 }
  35 
  36 static bool test_CreateSecret_basic(struct dcerpc_pipe *p, 
     /* [<][>][^][v][top][bottom][index][help] */
  37                                     struct torture_context *tctx,
  38                                     struct policy_handle *handle)
  39 {
  40         NTSTATUS status;
  41         struct lsa_CreateSecret r;
  42         struct lsa_SetSecret r3;
  43         struct lsa_QuerySecret r4;
  44         struct policy_handle sec_handle;
  45         struct lsa_DeleteObject d;
  46         struct lsa_DATA_BUF buf1;
  47         struct lsa_DATA_BUF_PTR bufp1;
  48         DATA_BLOB enc_key;
  49         DATA_BLOB session_key;
  50         NTTIME old_mtime, new_mtime;
  51         DATA_BLOB blob1, blob2;
  52         const char *secret1 = "abcdef12345699qwerty";
  53         char *secret2;
  54         char *secname;
  55 
  56         secname = talloc_asprintf(tctx, "torturesecret-%u", (uint_t)random());
  57 
  58         torture_comment(tctx, "Testing CreateSecret of %s\n", secname);
  59                 
  60         init_lsa_String(&r.in.name, secname);
  61         
  62         r.in.handle = handle;
  63         r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
  64         r.out.sec_handle = &sec_handle;
  65         
  66         status = dcerpc_lsa_CreateSecret(p, tctx, &r);
  67         torture_assert_ntstatus_ok(tctx, status, "CreateSecret failed");
  68         
  69         status = dcerpc_fetch_session_key(p, &session_key);
  70         torture_assert_ntstatus_ok(tctx, status, "dcerpc_fetch_session_key failed");
  71         
  72         enc_key = sess_encrypt_string(secret1, &session_key);
  73         
  74         r3.in.sec_handle = &sec_handle;
  75         r3.in.new_val = &buf1;
  76         r3.in.old_val = NULL;
  77         r3.in.new_val->data = enc_key.data;
  78         r3.in.new_val->length = enc_key.length;
  79         r3.in.new_val->size = enc_key.length;
  80         
  81         torture_comment(tctx, "Testing SetSecret\n");
  82         
  83         status = dcerpc_lsa_SetSecret(p, tctx, &r3);
  84         torture_assert_ntstatus_ok(tctx, status, "SetSecret failed");
  85                 
  86         r3.in.sec_handle = &sec_handle;
  87         r3.in.new_val = &buf1;
  88         r3.in.old_val = NULL;
  89         r3.in.new_val->data = enc_key.data;
  90         r3.in.new_val->length = enc_key.length;
  91         r3.in.new_val->size = enc_key.length;
  92         
  93         /* break the encrypted data */
  94         enc_key.data[0]++;
  95         
  96         torture_comment(tctx, "Testing SetSecret with broken key\n");
  97         
  98         status = dcerpc_lsa_SetSecret(p, tctx, &r3);
  99         torture_assert_ntstatus_equal(tctx, status, NT_STATUS_UNKNOWN_REVISION, 
 100                 "SetSecret should have failed UNKNOWN_REVISION");
 101         
 102         data_blob_free(&enc_key);
 103         
 104         ZERO_STRUCT(new_mtime);
 105         ZERO_STRUCT(old_mtime);
 106         
 107         /* fetch the secret back again */
 108         r4.in.sec_handle = &sec_handle;
 109         r4.in.new_val = &bufp1;
 110         r4.in.new_mtime = &new_mtime;
 111         r4.in.old_val = NULL;
 112         r4.in.old_mtime = NULL;
 113         
 114         bufp1.buf = NULL;
 115         
 116         torture_comment(tctx, "Testing QuerySecret\n");
 117         status = dcerpc_lsa_QuerySecret(p, tctx, &r4);
 118         torture_assert_ntstatus_ok(tctx, status, "QuerySecret failed");
 119         if (r4.out.new_val == NULL || r4.out.new_val->buf == NULL)
 120                 torture_fail(tctx, "No secret buffer returned");
 121         blob1.data = r4.out.new_val->buf->data;
 122         blob1.length = r4.out.new_val->buf->size;
 123         
 124         blob2 = data_blob_talloc(tctx, NULL, blob1.length);
 125         
 126         secret2 = sess_decrypt_string(tctx, &blob1, &session_key);
 127         
 128         torture_assert_str_equal(tctx, secret1, secret2, "Returned secret invalid");
 129 
 130         d.in.handle = &sec_handle;
 131         d.out.handle = &sec_handle;
 132         status = dcerpc_lsa_DeleteObject(p, tctx, &d);
 133         torture_assert_ntstatus_ok(tctx, status, "delete should have returned OKINVALID_HANDLE");
 134         return true;
 135 }
 136 
 137 struct secret_settings {
 138         uint32_t bindoptions;
 139         bool keyexchange;
 140         bool ntlm2;
 141         bool lm_key;
 142 };
 143 
 144 static bool test_secrets(struct torture_context *torture, const void *_data)
     /* [<][>][^][v][top][bottom][index][help] */
 145 {
 146         struct dcerpc_pipe *p;
 147         struct policy_handle *handle;
 148         struct dcerpc_binding *binding;
 149         const struct secret_settings *settings = 
 150                 (const struct secret_settings *)_data;
 151 
 152         lp_set_cmdline(torture->lp_ctx, "ntlmssp client:keyexchange", settings->keyexchange?"True":"False");
 153         lp_set_cmdline(torture->lp_ctx, "ntlmssp_client:ntlm2", settings->ntlm2?"True":"False");
 154         lp_set_cmdline(torture->lp_ctx, "ntlmssp_client:lm_key", settings->lm_key?"True":"False");
 155 
 156         torture_assert_ntstatus_ok(torture, torture_rpc_binding(torture, &binding), 
 157                                    "Getting bindoptions");
 158 
 159         binding->flags |= settings->bindoptions;
 160 
 161         torture_assert_ntstatus_ok(torture, 
 162                                    dcerpc_pipe_connect_b(torture, &p, binding,
 163                                                          &ndr_table_lsarpc,
 164                                                          cmdline_credentials,
 165                                                          torture->ev,
 166                                                          torture->lp_ctx),
 167                                    "connect");
 168 
 169         if (!test_lsa_OpenPolicy2(p, torture, &handle)) {
 170                 return false;
 171         }
 172 
 173         torture_assert(torture, handle, "OpenPolicy2 failed.  This test cannot run against this server");
 174         
 175         if (!test_CreateSecret_basic(p, torture, handle)) {
 176                 return false;
 177         }
 178 
 179         return true;
 180 }
 181 
 182 static struct torture_tcase *add_test(struct torture_suite *suite, uint32_t bindoptions, 
     /* [<][>][^][v][top][bottom][index][help] */
 183                                      bool keyexchange, bool ntlm2, bool lm_key)
 184 {
 185         char *name = NULL;
 186         struct secret_settings *settings;
 187 
 188         settings = talloc_zero(suite, struct secret_settings);
 189         settings->bindoptions = bindoptions;
 190 
 191         if (bindoptions == DCERPC_PUSH_BIGENDIAN)
 192                 name = talloc_strdup(suite, "bigendian");
 193         else if (bindoptions == DCERPC_SEAL)
 194                 name = talloc_strdup(suite, "seal");
 195         else if (bindoptions == 0) 
 196                 name = talloc_strdup(suite, "none");
 197         else
 198                 name = talloc_strdup(suite, "unknown");
 199 
 200         name = talloc_asprintf_append_buffer(name, " keyexchange:%s", keyexchange?"yes":"no");
 201         settings->keyexchange = keyexchange;
 202 
 203         name = talloc_asprintf_append_buffer(name, " ntlm2:%s", ntlm2?"yes":"no");
 204         settings->ntlm2 = ntlm2;
 205 
 206         name = talloc_asprintf_append_buffer(name, " lm_key:%s", lm_key?"yes":"no");
 207         settings->lm_key = lm_key;
 208 
 209         return torture_suite_add_simple_tcase_const(suite, name, test_secrets,
 210                         settings);
 211 }
 212 
 213 static const bool bool_vals[] = { true, false };
 214 
 215 /* TEST session key correctness by pushing and pulling secrets */
 216 struct torture_suite *torture_rpc_lsa_secrets(TALLOC_CTX *mem_ctx)
     /* [<][>][^][v][top][bottom][index][help] */
 217 {
 218         struct torture_suite *suite = torture_suite_create(mem_ctx, "SECRETS");
 219         int keyexchange, ntlm2, lm_key;
 220 
 221         for (keyexchange = 0; keyexchange < ARRAY_SIZE(bool_vals); keyexchange++) {
 222                 for (ntlm2 = 0; ntlm2 < ARRAY_SIZE(bool_vals); ntlm2++) {
 223                         for (lm_key = 0; lm_key < ARRAY_SIZE(bool_vals); lm_key++) {
 224                                 add_test(suite, DCERPC_PUSH_BIGENDIAN, bool_vals[keyexchange], bool_vals[ntlm2], 
 225                                          bool_vals[lm_key]);
 226                                 add_test(suite, DCERPC_SEAL, bool_vals[keyexchange], bool_vals[ntlm2], bool_vals[lm_key]);
 227                                 add_test(suite, 0, bool_vals[keyexchange], bool_vals[ntlm2], bool_vals[lm_key]);
 228                         }
 229                 }
 230         }
 231 
 232         return suite;
 233 }

/* [<][>][^][v][top][bottom][index][help] */