Skip to content

Commit 8e378bd

Browse files
committed
Add test to check gss_set_cred_option
Signed-off-by: Simo Sorce <[email protected]>
1 parent fe9ff79 commit 8e378bd

File tree

1 file changed

+255
-0
lines changed

1 file changed

+255
-0
lines changed

Diff for: tests/ntlmssptest.c

+255
Original file line numberDiff line numberDiff line change
@@ -1892,6 +1892,256 @@ int test_gssapi_1(bool user_env_file, bool use_cb, bool no_seal, bool use_cs)
18921892
return ret;
18931893
}
18941894

1895+
int inner_setup_channel(gss_cred_id_t cli_cred, gss_ctx_id_t *cli_ctx,
1896+
gss_cred_id_t srv_cred, gss_ctx_id_t *srv_ctx,
1897+
gss_name_t gss_srvname, int *step)
1898+
{
1899+
gss_buffer_desc cli_token = { 0 };
1900+
gss_buffer_desc srv_token = { 0 };
1901+
uint32_t retmin, retmaj;
1902+
uint32_t req_flags = 0;
1903+
int ret;
1904+
1905+
*step = 1;
1906+
retmaj = gssntlm_init_sec_context(&retmin, cli_cred, cli_ctx,
1907+
gss_srvname, GSS_C_NO_OID,
1908+
req_flags, 0, GSS_C_NO_CHANNEL_BINDINGS,
1909+
GSS_C_NO_BUFFER, NULL, &cli_token,
1910+
NULL, NULL);
1911+
if (retmaj != GSS_S_CONTINUE_NEEDED) {
1912+
print_gss_error("gssntlm_init_sec_context 1 failed!",
1913+
retmaj, retmin);
1914+
ret = EINVAL;
1915+
goto done;
1916+
}
1917+
1918+
*step = 2;
1919+
retmaj = gssntlm_accept_sec_context(&retmin, srv_ctx, srv_cred,
1920+
&cli_token, GSS_C_NO_CHANNEL_BINDINGS,
1921+
NULL, NULL, &srv_token,
1922+
NULL, NULL, NULL);
1923+
if (retmaj != GSS_S_CONTINUE_NEEDED) {
1924+
print_gss_error("gssntlm_accept_sec_context 1 failed!",
1925+
retmaj, retmin);
1926+
ret = EINVAL;
1927+
goto done;
1928+
}
1929+
1930+
gss_release_buffer(&retmin, &cli_token);
1931+
1932+
*step = 3;
1933+
retmaj = gssntlm_init_sec_context(&retmin, cli_cred, cli_ctx,
1934+
gss_srvname, GSS_C_NO_OID,
1935+
req_flags, 0, GSS_C_NO_CHANNEL_BINDINGS,
1936+
&srv_token, NULL, &cli_token,
1937+
NULL, NULL);
1938+
if (retmaj != GSS_S_COMPLETE) {
1939+
print_gss_error("gssntlm_init_sec_context 2 failed!",
1940+
retmaj, retmin);
1941+
ret = EINVAL;
1942+
goto done;
1943+
}
1944+
1945+
gss_release_buffer(&retmin, &srv_token);
1946+
1947+
*step = 4;
1948+
retmaj = gssntlm_accept_sec_context(&retmin, srv_ctx, srv_cred,
1949+
&cli_token, GSS_C_NO_CHANNEL_BINDINGS,
1950+
NULL, NULL, &srv_token,
1951+
NULL, NULL, NULL);
1952+
if (retmaj != GSS_S_COMPLETE) {
1953+
print_gss_error("gssntlm_accept_sec_context 2 failed!",
1954+
retmaj, retmin);
1955+
ret = EINVAL;
1956+
goto done;
1957+
}
1958+
1959+
ret = 0;
1960+
1961+
done:
1962+
gss_release_buffer(&retmin, &cli_token);
1963+
gss_release_buffer(&retmin, &srv_token);
1964+
return ret;
1965+
}
1966+
1967+
int test_gssapi_neg_flags(void)
1968+
{
1969+
gss_ctx_id_t cli_ctx = GSS_C_NO_CONTEXT;
1970+
gss_ctx_id_t srv_ctx = GSS_C_NO_CONTEXT;
1971+
gss_cred_id_t cli_cred = GSS_C_NO_CREDENTIAL;
1972+
gss_cred_id_t srv_cred = GSS_C_NO_CREDENTIAL;
1973+
gss_OID_desc gssntlm_neg_flags_oid = {
1974+
GSS_NTLMSSP_NEG_FLAGS_OID_LENGTH,
1975+
discard_const(GSS_NTLMSSP_NEG_FLAGS_OID_STRING)
1976+
};
1977+
const char *username;
1978+
const char *password = "testpassword";
1979+
const char *srvname = "test@testserver";
1980+
gss_name_t gss_username = NULL;
1981+
gss_name_t gss_srvname = NULL;
1982+
gss_buffer_desc pwbuf;
1983+
gss_buffer_desc nbuf;
1984+
gss_buffer_desc value;
1985+
uint32_t neg_flags;
1986+
uint32_t retmin, retmaj;
1987+
int step;
1988+
int ret;
1989+
1990+
setenv("NTLM_USER_FILE", TEST_USER_FILE, 0);
1991+
username = getenv("TEST_USER_NAME");
1992+
1993+
if (username == NULL) {
1994+
username = "TESTDOM\\testuser";
1995+
}
1996+
nbuf.value = discard_const(username);
1997+
nbuf.length = strlen(username);
1998+
retmaj = gssntlm_import_name(&retmin, &nbuf,
1999+
GSS_C_NT_USER_NAME,
2000+
&gss_username);
2001+
if (retmaj != GSS_S_COMPLETE) {
2002+
print_gss_error("gssntlm_import_name(username) failed!",
2003+
retmaj, retmin);
2004+
return EINVAL;
2005+
}
2006+
2007+
pwbuf.value = discard_const(password);
2008+
pwbuf.length = strlen(password);
2009+
retmaj = gssntlm_acquire_cred_with_password(&retmin,
2010+
(gss_name_t)gss_username,
2011+
(gss_buffer_t)&pwbuf,
2012+
GSS_C_INDEFINITE,
2013+
GSS_C_NO_OID_SET,
2014+
GSS_C_INITIATE,
2015+
&cli_cred, NULL, NULL);
2016+
if (retmaj != GSS_S_COMPLETE) {
2017+
print_gss_error("gssntlm_acquire_cred_with_password failed!",
2018+
retmaj, retmin);
2019+
ret = EINVAL;
2020+
goto done;
2021+
}
2022+
2023+
nbuf.value = discard_const(srvname);
2024+
nbuf.length = strlen(srvname);
2025+
retmaj = gssntlm_import_name(&retmin, &nbuf,
2026+
GSS_C_NT_HOSTBASED_SERVICE,
2027+
&gss_srvname);
2028+
if (retmaj != GSS_S_COMPLETE) {
2029+
print_gss_error("gssntlm_import_name(srvname) failed!",
2030+
retmaj, retmin);
2031+
return EINVAL;
2032+
}
2033+
2034+
retmaj = gssntlm_acquire_cred(&retmin, (gss_name_t)gss_srvname,
2035+
GSS_C_INDEFINITE, GSS_C_NO_OID_SET,
2036+
GSS_C_ACCEPT, &srv_cred, NULL, NULL);
2037+
if (retmaj != GSS_S_COMPLETE) {
2038+
print_gss_error("gssntlm_acquire_cred(srvname) failed!",
2039+
retmaj, retmin);
2040+
ret = EINVAL;
2041+
goto done;
2042+
}
2043+
2044+
ret = inner_setup_channel(cli_cred, &cli_ctx, srv_cred, &srv_ctx,
2045+
gss_srvname, &step);
2046+
if (ret != 0) {
2047+
goto done;
2048+
}
2049+
2050+
gssntlm_delete_sec_context(&retmin, &cli_ctx, GSS_C_NO_BUFFER);
2051+
gssntlm_delete_sec_context(&retmin, &srv_ctx, GSS_C_NO_BUFFER);
2052+
2053+
/* test again with different neg flags */
2054+
neg_flags = NTLMSSP_NEGOTIATE_128 \
2055+
| NTLMSSP_NEGOTIATE_NTLM \
2056+
| NTLMSSP_NEGOTIATE_UNICODE;
2057+
value.value = &neg_flags;
2058+
value.length = sizeof(neg_flags);
2059+
2060+
retmaj = gssntlm_set_cred_option(&retmin, &cli_cred,
2061+
&gssntlm_neg_flags_oid, &value);
2062+
if (retmaj != GSS_S_COMPLETE) {
2063+
print_gss_error("gssntlm_set_cred_option(cli_cred) failed!",
2064+
retmaj, retmin);
2065+
ret = EINVAL;
2066+
goto done;
2067+
}
2068+
2069+
ret = inner_setup_channel(cli_cred, &cli_ctx, srv_cred, &srv_ctx,
2070+
gss_srvname, &step);
2071+
if (ret != 0) {
2072+
goto done;
2073+
}
2074+
fprintf(stderr, "1 ");
2075+
2076+
gssntlm_delete_sec_context(&retmin, &cli_ctx, GSS_C_NO_BUFFER);
2077+
gssntlm_delete_sec_context(&retmin, &srv_ctx, GSS_C_NO_BUFFER);
2078+
2079+
/* test again with incompatible neg flags */
2080+
neg_flags = NTLMSSP_NEGOTIATE_56;
2081+
value.value = &neg_flags;
2082+
value.length = sizeof(neg_flags);
2083+
2084+
retmaj = gssntlm_set_cred_option(&retmin, &srv_cred,
2085+
&gssntlm_neg_flags_oid, &value);
2086+
if (retmaj != GSS_S_COMPLETE) {
2087+
print_gss_error("gssntlm_set_cred_option(srv_cred) failed!",
2088+
retmaj, retmin);
2089+
ret = EINVAL;
2090+
goto done;
2091+
}
2092+
2093+
ret = inner_setup_channel(cli_cred, &cli_ctx, srv_cred, &srv_ctx,
2094+
gss_srvname, &step);
2095+
if (!(ret == 22 && step == 2)) {
2096+
fprintf(stderr, "Expected Negotiataion failure (%d, %d)\n", ret, step);
2097+
ret = EINVAL;
2098+
goto done;
2099+
}
2100+
fprintf(stderr, "2 ");
2101+
2102+
gssntlm_delete_sec_context(&retmin, &cli_ctx, GSS_C_NO_BUFFER);
2103+
gssntlm_delete_sec_context(&retmin, &srv_ctx, GSS_C_NO_BUFFER);
2104+
2105+
/* test again with reset flags */
2106+
value.value = NULL;
2107+
value.length = 0;
2108+
retmaj = gssntlm_set_cred_option(&retmin, &cli_cred,
2109+
&gssntlm_neg_flags_oid, &value);
2110+
if (retmaj != GSS_S_COMPLETE) {
2111+
print_gss_error("gssntlm_set_cred_option(cli_cred) failed!",
2112+
retmaj, retmin);
2113+
ret = EINVAL;
2114+
goto done;
2115+
}
2116+
2117+
retmaj = gssntlm_set_cred_option(&retmin, &srv_cred,
2118+
&gssntlm_neg_flags_oid, &value);
2119+
if (retmaj != GSS_S_COMPLETE) {
2120+
print_gss_error("gssntlm_set_cred_option(srv_cred) failed!",
2121+
retmaj, retmin);
2122+
ret = EINVAL;
2123+
goto done;
2124+
}
2125+
2126+
ret = inner_setup_channel(cli_cred, &cli_ctx, srv_cred, &srv_ctx,
2127+
gss_srvname, &step);
2128+
if (ret != 0) {
2129+
goto done;
2130+
}
2131+
fprintf(stderr, "3 ");
2132+
2133+
ret = 0;
2134+
2135+
done:
2136+
gssntlm_delete_sec_context(&retmin, &cli_ctx, GSS_C_NO_BUFFER);
2137+
gssntlm_delete_sec_context(&retmin, &srv_ctx, GSS_C_NO_BUFFER);
2138+
gssntlm_release_name(&retmin, &gss_username);
2139+
gssntlm_release_name(&retmin, &gss_srvname);
2140+
gssntlm_release_cred(&retmin, &cli_cred);
2141+
gssntlm_release_cred(&retmin, &srv_cred);
2142+
return ret;
2143+
}
2144+
18952145
int test_gssapi_cl(void)
18962146
{
18972147
gss_ctx_id_t cli_ctx = GSS_C_NO_CONTEXT;
@@ -3152,6 +3402,11 @@ int main(int argc, const char *argv[])
31523402
fprintf(stderr, "Test: %s\n", (ret ? "FAIL":"SUCCESS"));
31533403
if (ret) gret += ret;
31543404

3405+
fprintf(stderr, "Test Negotiate flags variations\n");
3406+
ret = test_gssapi_neg_flags();
3407+
fprintf(stderr, "Test: %s\n", (ret ? "FAIL":"SUCCESS"));
3408+
if (ret) gret++;
3409+
31553410
done:
31563411
ntlm_free_ctx(&ctx);
31573412
return gret;

0 commit comments

Comments
 (0)