LCOV - code coverage report
Current view: top level - librpc/ndr - ndr_ntlmssp.c (source / functions) Hit Total Coverage
Test: coverage report for v4-17-test 1498b464 Lines: 50 88 56.8 %
Date: 2024-06-13 04:01:37 Functions: 4 8 50.0 %

          Line data    Source code
       1             : /*
       2             :    Unix SMB/CIFS implementation.
       3             : 
       4             :    routines for marshalling/unmarshalling special ntlmssp structures
       5             : 
       6             :    Copyright (C) Guenther Deschner 2009
       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 "../librpc/gen_ndr/ndr_ntlmssp.h"
      24             : 
      25           0 : _PUBLIC_ size_t ndr_ntlmssp_string_length(uint32_t negotiate_flags, const char *s)
      26             : {
      27           0 :         if (!s) {
      28           0 :                 return 0;
      29             :         }
      30             : 
      31           0 :         if (negotiate_flags & NTLMSSP_NEGOTIATE_UNICODE) {
      32           0 :                 return strlen(s) * 2;
      33             :         }
      34             : 
      35           0 :         return strlen(s);
      36             : }
      37             : 
      38      453015 : _PUBLIC_ uint32_t ndr_ntlmssp_negotiated_string_flags(uint32_t negotiate_flags)
      39             : {
      40      453015 :         uint32_t flags = LIBNDR_FLAG_STR_NOTERM |
      41             :                          LIBNDR_FLAG_STR_CHARLEN |
      42             :                          LIBNDR_FLAG_REMAINING;
      43             : 
      44      453015 :         if (!(negotiate_flags & NTLMSSP_NEGOTIATE_UNICODE)) {
      45           0 :                 flags |= LIBNDR_FLAG_STR_ASCII;
      46             :         }
      47             : 
      48      453015 :         return flags;
      49             : }
      50             : 
      51       19891 : _PUBLIC_ enum ndr_err_code ndr_push_AV_PAIR_LIST(struct ndr_push *ndr, int ndr_flags, const struct AV_PAIR_LIST *r)
      52             : {
      53             :         uint32_t cntr_pair_0;
      54       19891 :         if (ndr_flags & NDR_SCALARS) {
      55       19891 :                 NDR_CHECK(ndr_push_align(ndr, 4));
      56      174348 :                 for (cntr_pair_0 = 0; cntr_pair_0 < r->count; cntr_pair_0++) {
      57      154457 :                         NDR_CHECK(ndr_push_AV_PAIR(ndr, NDR_SCALARS, &r->pair[cntr_pair_0]));
      58             :                 }
      59             :         }
      60       19891 :         if (ndr_flags & NDR_BUFFERS) {
      61      174348 :                 for (cntr_pair_0 = 0; cntr_pair_0 < r->count; cntr_pair_0++) {
      62      154457 :                         NDR_CHECK(ndr_push_AV_PAIR(ndr, NDR_BUFFERS, &r->pair[cntr_pair_0]));
      63             :                 }
      64             :         }
      65       19891 :         return NDR_ERR_SUCCESS;
      66             : }
      67             : 
      68       24399 : _PUBLIC_ enum ndr_err_code ndr_pull_AV_PAIR_LIST(struct ndr_pull *ndr, int ndr_flags, struct AV_PAIR_LIST *r)
      69             : {
      70             :         uint32_t cntr_pair_0;
      71             :         TALLOC_CTX *_mem_save_pair_0;
      72       24399 :         if (ndr_flags & NDR_SCALARS) {
      73       24399 :                 uint32_t offset = 0;
      74       24399 :                 NDR_CHECK(ndr_pull_align(ndr, 4));
      75       24399 :                 r->count = 0;
      76       24399 :                 if (ndr->data_size > 0) {
      77       24399 :                         NDR_PULL_NEED_BYTES(ndr, 4);
      78             :                 }
      79      186439 :                 while (offset + 4 <= ndr->data_size) {
      80             :                         uint16_t length;
      81             :                         uint16_t type;
      82      167718 :                         type = SVAL(ndr->data + offset, 0);
      83      167718 :                         if (type == MsvAvEOL) {
      84       24397 :                                 r->count++;
      85       24397 :                                 break;
      86             :                         }
      87      143321 :                         length = SVAL(ndr->data + offset, 2);
      88      143321 :                         offset += length + 4;
      89      143321 :                         r->count++;
      90             :                 }
      91       24399 :                 NDR_PULL_ALLOC_N(ndr, r->pair, r->count);
      92       24399 :                 _mem_save_pair_0 = NDR_PULL_GET_MEM_CTX(ndr);
      93       24399 :                 NDR_PULL_SET_MEM_CTX(ndr, r->pair, 0);
      94      192115 :                 for (cntr_pair_0 = 0; cntr_pair_0 < r->count; cntr_pair_0++) {
      95      167718 :                         NDR_CHECK(ndr_pull_AV_PAIR(ndr, NDR_SCALARS, &r->pair[cntr_pair_0]));
      96             :                 }
      97       24397 :                 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_pair_0, 0);
      98             :         }
      99       24397 :         if (ndr_flags & NDR_BUFFERS) {
     100       24397 :                 _mem_save_pair_0 = NDR_PULL_GET_MEM_CTX(ndr);
     101       24397 :                 NDR_PULL_SET_MEM_CTX(ndr, r->pair, 0);
     102      192113 :                 for (cntr_pair_0 = 0; cntr_pair_0 < r->count; cntr_pair_0++) {
     103      167716 :                         NDR_CHECK(ndr_pull_AV_PAIR(ndr, NDR_BUFFERS, &r->pair[cntr_pair_0]));
     104             :                 }
     105       24397 :                 NDR_PULL_SET_MEM_CTX(ndr, _mem_save_pair_0, 0);
     106             :         }
     107       24397 :         return NDR_ERR_SUCCESS;
     108             : }
     109             : 
     110           0 : _PUBLIC_ void ndr_print_ntlmssp_nt_response(TALLOC_CTX *mem_ctx,
     111             :                                             const DATA_BLOB *nt_response,
     112             :                                             bool ntlmv2)
     113             : {
     114             :         enum ndr_err_code ndr_err;
     115             : 
     116           0 :         if (ntlmv2) {
     117             :                 struct NTLMv2_RESPONSE nt;
     118           0 :                 if (nt_response->length > 24) {
     119           0 :                         ndr_err = ndr_pull_struct_blob(nt_response, mem_ctx, &nt,
     120             :                                         (ndr_pull_flags_fn_t)ndr_pull_NTLMv2_RESPONSE);
     121           0 :                         if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
     122           0 :                                 NDR_PRINT_DEBUG(NTLMv2_RESPONSE, &nt);
     123             :                         }
     124             :                 }
     125             :         } else {
     126             :                 struct NTLM_RESPONSE nt;
     127           0 :                 if (nt_response->length == 24) {
     128           0 :                         ndr_err = ndr_pull_struct_blob(nt_response, mem_ctx, &nt,
     129             :                                         (ndr_pull_flags_fn_t)ndr_pull_NTLM_RESPONSE);
     130           0 :                         if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
     131           0 :                                 NDR_PRINT_DEBUG(NTLM_RESPONSE, &nt);
     132             :                         }
     133             :                 }
     134             :         }
     135           0 : }
     136             : 
     137           0 : _PUBLIC_ void ndr_print_ntlmssp_lm_response(TALLOC_CTX *mem_ctx,
     138             :                                             const DATA_BLOB *lm_response,
     139             :                                             bool ntlmv2)
     140             : {
     141             :         enum ndr_err_code ndr_err;
     142             : 
     143           0 :         if (ntlmv2) {
     144             :                 struct LMv2_RESPONSE lm;
     145           0 :                 if (lm_response->length == 24) {
     146           0 :                         ndr_err = ndr_pull_struct_blob(lm_response, mem_ctx, &lm,
     147             :                                         (ndr_pull_flags_fn_t)ndr_pull_LMv2_RESPONSE);
     148           0 :                         if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
     149           0 :                                 NDR_PRINT_DEBUG(LMv2_RESPONSE, &lm);
     150             :                         }
     151             :                 }
     152             :         } else {
     153             :                 struct LM_RESPONSE lm;
     154           0 :                 if (lm_response->length == 24) {
     155           0 :                         ndr_err = ndr_pull_struct_blob(lm_response, mem_ctx, &lm,
     156             :                                         (ndr_pull_flags_fn_t)ndr_pull_LM_RESPONSE);
     157           0 :                         if (NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
     158           0 :                                 NDR_PRINT_DEBUG(LM_RESPONSE, &lm);
     159             :                         }
     160             :                 }
     161             :         }
     162           0 : }
     163             : 
     164           0 : _PUBLIC_ void ndr_print_ntlmssp_Version(struct ndr_print *ndr, const char *name, const union ntlmssp_Version *r)
     165             : {
     166             :         int level;
     167           0 :         level = ndr_print_steal_switch_value(ndr, r);
     168           0 :         switch (level) {
     169           0 :                 case NTLMSSP_NEGOTIATE_VERSION:
     170           0 :                         ndr_print_ntlmssp_VERSION(ndr, name, &r->version);
     171           0 :                 break;
     172             : 
     173           0 :                 default:
     174           0 :                 break;
     175             : 
     176             :         }
     177           0 : }
     178             : 
     179       99389 : _PUBLIC_ struct AV_PAIR *ndr_ntlmssp_find_av(const struct AV_PAIR_LIST *av_list,
     180             :                                              enum ntlmssp_AvId AvId)
     181             : {
     182       99389 :         struct AV_PAIR *res = NULL;
     183       99389 :         uint32_t i = 0;
     184             : 
     185      799284 :         for (i = 0; i < av_list->count; i++) {
     186      453256 :                 if (av_list->pair[i].AvId != AvId) {
     187      364568 :                         continue;
     188             :                 }
     189             : 
     190       88688 :                 res = discard_const_p(struct AV_PAIR, &av_list->pair[i]);
     191       88688 :                 break;
     192             :         }
     193             : 
     194       99389 :         return res;
     195             : }

Generated by: LCOV version 1.13