// Encode to Safe64 void EncodeSafe64(char *dst, void *src, UINT src_size) { UINT size; if (dst == NULL || src == NULL) { return; } size = B64_Encode(dst, src, src_size); dst[size] = 0; Base64ToSafe64(dst); }
//============================================================================ // NDataEncoder::Encode : Encode to text. //---------------------------------------------------------------------------- NString NDataEncoder::Encode(const NData &theValue, NDataEncoding theEncoding) { NString theResult; // Encode the data switch (theEncoding) { case kNDataEncodingHex: theResult = Hex_Encode(theValue); break; case kNDataEncodingB64: theResult = B64_Encode(theValue); break; default: NN_LOG("Unknown encoding: %d", theEncoding); break; } return(theResult); }
// Output contents of the item void CfgAddItemText(BUF *b, ITEM *t, UINT depth) { char *data; char *sub = NULL; UINT len; UINT size; char *utf8; UINT utf8_size; wchar_t *string; // Validate arguments if (b == NULL || t == NULL) { return; } // Process the data by its type data = NULL; switch (t->Type) { case ITEM_TYPE_INT: data = Malloc(32); ToStr(data, *((UINT *)t->Buf)); break; case ITEM_TYPE_INT64: data = Malloc(64); ToStr64(data, *((UINT64 *)t->Buf)); break; case ITEM_TYPE_BYTE: data = ZeroMalloc(t->size * 4 + 32); len = B64_Encode(data, t->Buf, t->size); data[len] = 0; break; case ITEM_TYPE_STRING: string = t->Buf; utf8_size = CalcUniToUtf8(string); utf8_size++; utf8 = ZeroMalloc(utf8_size); utf8[0] = 0; UniToUtf8(utf8, utf8_size, string); size = utf8_size; data = utf8; break; case ITEM_TYPE_BOOL: size = 32; data = Malloc(size); if (*((bool *)t->Buf) == false) { StrCpy(data, size, TAG_FALSE); } else { StrCpy(data, size, TAG_TRUE); } break; } if (data == NULL) { return; } // Output the data line CfgAddData(b, t->Type, t->Name, data, sub, depth); // Memory release Free(data); if (sub != NULL) { Free(sub); } }
bool SmbAuthenticate(char* name, char* password, char* domainname, char* groupname, UINT timeout, UCHAR* challenge8, UCHAR* MsChapV2_ClientResponse, UCHAR* nt_pw_hash_hash) { bool auth = false; int fds[2]; FILE* out, *in; PID pid; char buffer[255]; char ntlm_timeout[32]; char* proc_parameter[6]; if (name == NULL || password == NULL || domainname == NULL || groupname == NULL) { Debug("Sam.c - SmbAuthenticate - wrong password parameter\n"); return false; } if (password[0] == '\0' && (challenge8 == NULL || MsChapV2_ClientResponse == NULL || nt_pw_hash_hash == NULL)) { Debug("Sam.c - SmbAuthenticate - wrong MsCHAPv2 parameter\n"); return false; } Zero(buffer, sizeof(buffer)); // Truncate string if unsafe char EnSafeStr(domainname, '\0'); if (strlen(domainname) > 255) { // there is no domainname longer then 255 chars! // http://tools.ietf.org/html/rfc1035 section 2.3.4 domainname[255] = '\0'; } // set timeout to 15 minutes even if timeout is disabled, to prevent ntlm_auth from hung up if (timeout <= 0 || timeout > 900) { timeout = 999; } snprintf(ntlm_timeout, sizeof(ntlm_timeout), "%is", timeout); Debug("Sam.c - timeout for ntlm_auth %s\n", ntlm_timeout); proc_parameter[0] = "timeout"; proc_parameter[1] = ntlm_timeout; proc_parameter[2] = "ntlm_auth"; proc_parameter[3] = "--helper-protocol=ntlm-server-1"; proc_parameter[4] = 0; if (strlen(groupname) > 1) { // DNS Name 255 chars + OU names are limited to 64 characters + cmdline 32 + 1 char requiremember[352]; // Truncate string if unsafe char EnSafeStr(groupname, '\0'); snprintf(requiremember, sizeof(requiremember), "--require-membership-of=%s\\%s", domainname, groupname); proc_parameter[4] = requiremember; proc_parameter[5] = 0; } pid = OpenChildProcess("timeout", proc_parameter, fds); if (pid < 0) { Debug("Sam.c - SmbCheckLogon - error fork child process (ntlm_auth)\n"); return false; } out = fdopen(fds[1], "w"); if (out == 0) { CloseChildProcess(pid, fds); Debug("Sam.c - cant open out pipe (ntlm_auth)\n"); return false; } in = fdopen(fds[0], "r"); if (in == 0) { fclose(out); CloseChildProcess(pid, fds); Debug("Sam.c - cant open in pipe (ntlm_auth)\n"); return false; } if (base64_enc_len(strlen(name)) < sizeof(buffer)-1 && base64_enc_len(strlen(password)) < sizeof(buffer)-1 && base64_enc_len(strlen(domainname)) < sizeof(buffer)-1) { char answer[300]; unsigned int end = B64_Encode(buffer, name, strlen(name)); buffer[end] = '\0'; fputs("Username:: ", out); fputs(buffer, out); fputs("\n", out); Debug("Username: %s\n", buffer); buffer[0] = 0; end = B64_Encode(buffer, domainname, strlen(domainname)); buffer[end] = '\0'; fputs("NT-Domain:: ", out); fputs(buffer, out); fputs("\n", out); Debug("NT-Domain: %s\n", buffer); buffer[0] = 0; if (password[0] != '\0') { Debug("Password authentication\n"); end = B64_Encode(buffer, password, strlen(password)); buffer[end] = '\0'; fputs("Password:: ", out); fputs(buffer, out); fputs("\n", out); Debug("Password: %s\n", buffer); buffer[0] = 0; } else { char* mschapv2_client_response; char* base64_challenge8; Debug("MsChapV2 authentication\n"); mschapv2_client_response = CopyBinToStr(MsChapV2_ClientResponse, 24); end = B64_Encode(buffer, mschapv2_client_response, 48); buffer[end] = '\0'; fputs("NT-Response:: ", out); fputs(buffer, out); fputs("\n", out); Debug("NT-Response:: %s\n", buffer); buffer[0] = 0; Free(mschapv2_client_response); base64_challenge8 = CopyBinToStr(challenge8, 8); end = B64_Encode(buffer, base64_challenge8 , 16); buffer[end] = '\0'; fputs("LANMAN-Challenge:: ", out); fputs(buffer, out); fputs("\n", out); Debug("LANMAN-Challenge:: %s\n", buffer); buffer[0] = 0; Free(base64_challenge8); fputs("Request-User-Session-Key: Yes\n", out); } // Start authentication fputs( ".\n", out ); fflush (out); // Request send! Zero(answer, sizeof(answer)); while (fgets(answer, sizeof(answer)-1, in)) { char* response_parameter; if (strncmp(answer, ".\n", sizeof(answer)-1 ) == 0) { break; } /* Indicates a base64 encoded structure */ response_parameter = strstr(answer, ":: "); if (!response_parameter) { char* newline; response_parameter = strstr(answer, ": "); if (!response_parameter) { continue; } response_parameter[0] ='\0'; response_parameter++; response_parameter[0] ='\0'; response_parameter++; newline = strstr(response_parameter, "\n"); if( newline ) newline[0] = '\0'; } else { response_parameter[0] ='\0'; response_parameter++; response_parameter[0] ='\0'; response_parameter++; response_parameter[0] ='\0'; response_parameter++; end = Decode64(response_parameter, response_parameter); response_parameter[end] = '\0'; } if (strncmp(answer, "Authenticated", sizeof(answer)-1 ) == 0) { if (strcmp(response_parameter, "Yes") == 0) { Debug("Authenticated!\n"); auth = true; } else if (strcmp(response_parameter, "No") == 0) { Debug("Authentication failed!\n"); auth = false; } } else if (strncmp(answer, "User-Session-Key", sizeof(answer)-1 ) == 0) { if (nt_pw_hash_hash != NULL) { BUF* Buf = StrToBin(response_parameter); Copy(nt_pw_hash_hash, Buf->Buf, 16); FreeBuf(Buf); } } } } fclose(in); fclose(out); CloseChildProcess(pid, fds); return auth; }