@@ -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+
18952145int 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+
31553410done :
31563411 ntlm_free_ctx (& ctx );
31573412 return gret ;
0 commit comments