336 names2->name = new SEC_WCHAR[lstrlen(names1->name) + 1]; |
337 names2->name = new SEC_WCHAR[lstrlen(names1->name) + 1]; |
337 if (names2->name == NULL) { |
338 if (names2->name == NULL) { |
338 delete names2; |
339 delete names2; |
339 return GSS_S_FAILURE; |
340 return GSS_S_FAILURE; |
340 } |
341 } |
341 wcscpy(names2->PackageName, isNegotiateOID(mech_type) |
342 wcscpy_s(names2->PackageName, 20, isNegotiateOID(mech_type) |
342 ? L"Negotiate" : L"Kerberos"); |
343 ? L"Negotiate" : L"Kerberos"); |
343 lstrcpy(names2->name, names1->name); |
344 StringCchCopy(names2->name, lstrlen(names1->name) + 1, names1->name); |
344 *output_name = (gss_name_t)names2; |
345 *output_name = (gss_name_t)names2; |
345 return GSS_S_COMPLETE; |
346 return GSS_S_COMPLETE; |
346 } |
347 } |
347 |
348 |
348 __declspec(dllexport) OM_uint32 |
349 __declspec(dllexport) OM_uint32 |
367 buffer[1] = 1; |
368 buffer[1] = 1; |
368 buffer[2] = 0; |
369 buffer[2] = 0; |
369 buffer[3] = 2 + mechLen; |
370 buffer[3] = 2 + mechLen; |
370 buffer[4] = 6; |
371 buffer[4] = 6; |
371 buffer[5] = mechLen; |
372 buffer[5] = mechLen; |
372 memcpy(buffer + 6, mech == 'K' ? KRB5_OID.elements : SPNEGO_OID.elements, 9); |
373 memcpy_s(buffer + 6, mechLen, mech == 'K' ? KRB5_OID.elements : SPNEGO_OID.elements, mechLen); |
373 buffer[6 + mechLen] = buffer[7 + mechLen] = buffer[8 + mechLen] = 0; |
374 buffer[6 + mechLen] = buffer[7 + mechLen] = buffer[8 + mechLen] = 0; |
374 buffer[9 + mechLen] = (char)len; |
375 buffer[9 + mechLen] = (char)len; |
375 if (WideCharToMultiByte(CP_ACP, 0, names, len, |
376 if (WideCharToMultiByte(CP_ACP, 0, names, len, |
376 buffer+10+mechLen, len, NULL, NULL) == 0) { |
377 buffer+10+mechLen, len, NULL, NULL) == 0) { |
377 delete buffer; |
378 delete buffer; |
430 cred->count = (int)desired_mech->count; |
431 cred->count = (int)desired_mech->count; |
431 cred->creds = new OneCred[cred->count]; |
432 cred->creds = new OneCred[cred->count]; |
432 for (int i = 0; i < cred->count; i++) { |
433 for (int i = 0; i < cred->count; i++) { |
433 TCHAR* name = isKerberosOID(&desired_mech->elements[i]) |
434 TCHAR* name = isKerberosOID(&desired_mech->elements[i]) |
434 ? L"Kerberos" : L"Negotiate"; |
435 ? L"Kerberos" : L"Negotiate"; |
435 wcscpy(cred->creds[i].PackageName, name); |
436 wcscpy_s(cred->creds[i].PackageName, 20, name); |
436 cred->creds[i].phCred = new CredHandle(); |
437 cred->creds[i].phCred = new CredHandle(); |
437 ts.QuadPart = 0; |
438 ts.QuadPart = 0; |
438 ss = AcquireCredentialsHandle( |
439 ss = AcquireCredentialsHandle( |
439 NULL, |
440 NULL, |
440 name, |
441 name, |
506 } |
507 } |
507 SEC_WCHAR* names = new SEC_WCHAR[lstrlen(snames.sUserName) + 1]; |
508 SEC_WCHAR* names = new SEC_WCHAR[lstrlen(snames.sUserName) + 1]; |
508 if (names == NULL) { |
509 if (names == NULL) { |
509 return GSS_S_FAILURE; |
510 return GSS_S_FAILURE; |
510 } |
511 } |
511 lstrcpy(names, snames.sUserName); |
512 StringCchCopy(names, lstrlen(snames.sUserName) + 1, snames.sUserName); |
512 FreeContextBuffer(&snames); |
513 FreeContextBuffer(&snames); |
513 PP("new name at %p", names); |
514 PP("new name at %p", names); |
514 Name* name1 = new Name; |
515 Name* name1 = new Name; |
515 if (name1 == NULL) { |
516 if (name1 == NULL) { |
516 delete[] names; |
517 delete[] names; |
517 return GSS_S_FAILURE; |
518 return GSS_S_FAILURE; |
518 } |
519 } |
519 name1->name = names; |
520 name1->name = names; |
520 lstrcpy(name1->PackageName, ((Credential*)cred_handle)->creds[0].PackageName); |
521 wcscpy_s(name1->PackageName, 20, ((Credential*)cred_handle)->creds[0].PackageName); |
521 *name = (gss_name_t) name1; |
522 *name = (gss_name_t) name1; |
522 } |
523 } |
523 if (lifetime) { |
524 if (lifetime) { |
524 *lifetime = ((Credential*)cred_handle)->time; |
525 *lifetime = ((Credential*)cred_handle)->time; |
525 } |
526 } |
677 |
678 |
678 output_token->length = OutSecBuff.cbBuffer; |
679 output_token->length = OutSecBuff.cbBuffer; |
679 |
680 |
680 pfDone = !((SEC_I_CONTINUE_NEEDED == ss) || |
681 pfDone = !((SEC_I_CONTINUE_NEEDED == ss) || |
681 (SEC_I_COMPLETE_AND_CONTINUE == ss)); |
682 (SEC_I_COMPLETE_AND_CONTINUE == ss)); |
682 |
|
683 outFlag = flagSspi2Gss(outFlag); |
683 outFlag = flagSspi2Gss(outFlag); |
|
684 PP("Done? %d outFlag: %d", pfDone, outFlag); |
684 |
685 |
685 *ret_flags = (OM_uint32)outFlag; |
686 *ret_flags = (OM_uint32)outFlag; |
686 if (ss == SEC_I_CONTINUE_NEEDED) { |
687 if (ss == SEC_I_CONTINUE_NEEDED) { |
687 return GSS_S_CONTINUE_NEEDED; |
688 return GSS_S_CONTINUE_NEEDED; |
688 } else { |
689 } else { |
744 n1->name = new SEC_WCHAR[lstrlen(pc->nnames.sClientName) + 1]; |
745 n1->name = new SEC_WCHAR[lstrlen(pc->nnames.sClientName) + 1]; |
745 if (n1->name == NULL) { |
746 if (n1->name == NULL) { |
746 goto err; |
747 goto err; |
747 } |
748 } |
748 PP("new name at %p", n1->name); |
749 PP("new name at %p", n1->name); |
749 lstrcpy(n1->name, pc->nnames.sClientName); |
750 StringCchCopy(n1->name, lstrlen(pc->nnames.sClientName) + 1, pc->nnames.sClientName); |
750 lstrcpy(n1->PackageName, pc->PackageName); |
751 wcscpy_s(n1->PackageName, 20, pc->PackageName); |
751 *src_name = (gss_name_t) n1; |
752 *src_name = (gss_name_t) n1; |
752 } |
753 } |
753 if (targ_name != NULL) { |
754 if (targ_name != NULL) { |
754 n2 = new Name; |
755 n2 = new Name; |
755 if (n2 == NULL) { |
756 if (n2 == NULL) { |
758 n2->name = new SEC_WCHAR[lstrlen(pc->nnames.sServerName) + 1]; |
759 n2->name = new SEC_WCHAR[lstrlen(pc->nnames.sServerName) + 1]; |
759 if (n2->name == NULL) { |
760 if (n2->name == NULL) { |
760 goto err; |
761 goto err; |
761 } |
762 } |
762 PP("new name at %p", n2->name); |
763 PP("new name at %p", n2->name); |
763 lstrcpy(n2->name, pc->nnames.sServerName); |
764 StringCchCopy(n2->name, lstrlen(pc->nnames.sServerName) + 1, pc->nnames.sServerName); |
764 lstrcpy(n2->PackageName, pc->PackageName); |
765 wcscpy_s(n2->PackageName, 20, pc->PackageName); |
765 *targ_name = (gss_name_t) n2; |
766 *targ_name = (gss_name_t) n2; |
766 } |
767 } |
767 if (lifetime_rec != NULL) { |
768 if (lifetime_rec != NULL) { |
768 SecPkgContext_Lifespan ls; |
769 SecPkgContext_Lifespan ls; |
769 SECURITY_STATUS ss; |
770 SECURITY_STATUS ss; |
964 + pc->SecPkgContextSizes.cbBlockSize);; |
965 + pc->SecPkgContextSizes.cbBlockSize);; |
965 |
966 |
966 SecBuff[1].BufferType = SECBUFFER_DATA; |
967 SecBuff[1].BufferType = SECBUFFER_DATA; |
967 SecBuff[1].cbBuffer = (ULONG)input_message_buffer->length; |
968 SecBuff[1].cbBuffer = (ULONG)input_message_buffer->length; |
968 SecBuff[1].pvBuffer = malloc(SecBuff[1].cbBuffer); |
969 SecBuff[1].pvBuffer = malloc(SecBuff[1].cbBuffer); |
969 memcpy(SecBuff[1].pvBuffer, input_message_buffer->value, |
970 memcpy_s(SecBuff[1].pvBuffer, SecBuff[1].cbBuffer, |
970 input_message_buffer->length); |
971 input_message_buffer->value, input_message_buffer->length); |
971 |
972 |
972 SecBuff[2].BufferType = SECBUFFER_PADDING; |
973 SecBuff[2].BufferType = SECBUFFER_PADDING; |
973 SecBuff[2].cbBuffer = pc->SecPkgContextSizes.cbBlockSize; |
974 SecBuff[2].cbBuffer = pc->SecPkgContextSizes.cbBlockSize; |
974 SecBuff[2].pvBuffer = malloc(SecBuff[2].cbBuffer); |
975 SecBuff[2].pvBuffer = malloc(SecBuff[2].cbBuffer); |
975 |
976 |
982 free(SecBuff[1].pvBuffer); |
983 free(SecBuff[1].pvBuffer); |
983 free(SecBuff[2].pvBuffer); |
984 free(SecBuff[2].pvBuffer); |
984 return GSS_S_FAILURE; |
985 return GSS_S_FAILURE; |
985 } |
986 } |
986 |
987 |
987 memcpy((PBYTE)SecBuff[0].pvBuffer + SecBuff[0].cbBuffer, SecBuff[1].pvBuffer, |
988 memcpy_s((PBYTE)SecBuff[0].pvBuffer + SecBuff[0].cbBuffer, |
|
989 input_message_buffer->length + pc->SecPkgContextSizes.cbBlockSize, |
|
990 SecBuff[1].pvBuffer, |
988 SecBuff[1].cbBuffer); |
991 SecBuff[1].cbBuffer); |
989 memcpy((PBYTE)SecBuff[0].pvBuffer + SecBuff[0].cbBuffer + SecBuff[1].cbBuffer, |
992 memcpy_s((PBYTE)SecBuff[0].pvBuffer + SecBuff[0].cbBuffer + SecBuff[1].cbBuffer, |
990 SecBuff[2].pvBuffer, SecBuff[2].cbBuffer); |
993 pc->SecPkgContextSizes.cbBlockSize, |
|
994 SecBuff[2].pvBuffer, |
|
995 SecBuff[2].cbBuffer); |
991 |
996 |
992 output_message_buffer->length = SecBuff[1].cbBuffer + SecBuff[0].cbBuffer |
997 output_message_buffer->length = SecBuff[1].cbBuffer + SecBuff[0].cbBuffer |
993 + SecBuff[2].cbBuffer; |
998 + SecBuff[2].cbBuffer; |
994 free(SecBuff[1].pvBuffer); |
999 free(SecBuff[1].pvBuffer); |
995 free(SecBuff[2].pvBuffer); |
1000 free(SecBuff[2].pvBuffer); |
1019 |
1024 |
1020 SecBuff[0].BufferType = SECBUFFER_STREAM; |
1025 SecBuff[0].BufferType = SECBUFFER_STREAM; |
1021 SecBuff[0].cbBuffer = (ULONG)input_message_buffer->length; |
1026 SecBuff[0].cbBuffer = (ULONG)input_message_buffer->length; |
1022 output_message_buffer->value = SecBuff[0].pvBuffer |
1027 output_message_buffer->value = SecBuff[0].pvBuffer |
1023 = malloc(input_message_buffer->length); |
1028 = malloc(input_message_buffer->length); |
1024 memcpy(SecBuff[0].pvBuffer, input_message_buffer->value, |
1029 memcpy_s(SecBuff[0].pvBuffer, input_message_buffer->length, |
1025 input_message_buffer->length); |
1030 input_message_buffer->value, input_message_buffer->length); |
1026 |
1031 |
1027 SecBuff[1].BufferType = SECBUFFER_DATA; |
1032 SecBuff[1].BufferType = SECBUFFER_DATA; |
1028 SecBuff[1].cbBuffer = 0; |
1033 SecBuff[1].cbBuffer = 0; |
1029 SecBuff[1].pvBuffer = NULL; |
1034 SecBuff[1].pvBuffer = NULL; |
1030 |
1035 |
1122 gss_OID newcopy = new gss_OID_desc[count + 1]; |
1127 gss_OID newcopy = new gss_OID_desc[count + 1]; |
1123 if (newcopy == NULL) { |
1128 if (newcopy == NULL) { |
1124 return GSS_S_FAILURE; |
1129 return GSS_S_FAILURE; |
1125 } |
1130 } |
1126 if (existing) { |
1131 if (existing) { |
1127 memcpy(newcopy, existing, count * sizeof(gss_OID_desc)); |
1132 memcpy_s(newcopy, (count + 1) * sizeof(gss_OID_desc), |
|
1133 existing, count * sizeof(gss_OID_desc)); |
1128 } |
1134 } |
1129 newcopy[count].length = member_oid->length; |
1135 newcopy[count].length = member_oid->length; |
1130 newcopy[count].elements = new char[member_oid->length]; |
1136 newcopy[count].elements = new char[member_oid->length]; |
1131 if (newcopy[count].elements == NULL) { |
1137 if (newcopy[count].elements == NULL) { |
1132 delete[] newcopy; |
1138 delete[] newcopy; |
1133 return GSS_S_FAILURE; |
1139 return GSS_S_FAILURE; |
1134 } |
1140 } |
1135 memcpy(newcopy[count].elements, member_oid->elements, member_oid->length); |
1141 memcpy_s(newcopy[count].elements, member_oid->length, |
|
1142 member_oid->elements, member_oid->length); |
1136 (*oid_set)->elements = newcopy; |
1143 (*oid_set)->elements = newcopy; |
1137 (*oid_set)->count++; |
1144 (*oid_set)->count++; |
1138 if (existing) { |
1145 if (existing) { |
1139 delete[] existing; |
1146 delete[] existing; |
1140 } |
1147 } |
1150 OM_uint32 *message_context, |
1157 OM_uint32 *message_context, |
1151 gss_buffer_t status_string) |
1158 gss_buffer_t status_string) |
1152 { |
1159 { |
1153 PP(">>>> Calling UNIMPLEMENTED gss_display_status..."); |
1160 PP(">>>> Calling UNIMPLEMENTED gss_display_status..."); |
1154 status_string->value = new char[7]; |
1161 status_string->value = new char[7]; |
1155 memcpy(status_string->value, "Nothing", 7); |
1162 memcpy_s(status_string->value, 7, "Nothing", 7); |
1156 status_string->length = 7; |
1163 status_string->length = 7; |
1157 return GSS_S_COMPLETE; |
1164 return GSS_S_COMPLETE; |
1158 } |
1165 } |
1159 |
1166 |
1160 __declspec(dllexport) OM_uint32 |
1167 __declspec(dllexport) OM_uint32 |