@@ -1892,6 +1892,256 @@ int test_gssapi_1(bool user_env_file, bool use_cb, bool no_seal, bool use_cs)
1892
1892
return ret ;
1893
1893
}
1894
1894
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
+
1895
2145
int test_gssapi_cl (void )
1896
2146
{
1897
2147
gss_ctx_id_t cli_ctx = GSS_C_NO_CONTEXT ;
@@ -3152,6 +3402,11 @@ int main(int argc, const char *argv[])
3152
3402
fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
3153
3403
if (ret ) gret += ret ;
3154
3404
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
+
3155
3410
done :
3156
3411
ntlm_free_ctx (& ctx );
3157
3412
return gret ;
0 commit comments