@@ -1488,7 +1488,7 @@ int test_gssapi_1(bool user_env_file, bool use_cb, bool no_seal)
1488
1488
uint8_t rand_cb [128 ];
1489
1489
struct gss_channel_bindings_struct cbts = { 0 };
1490
1490
gss_channel_bindings_t cbt = GSS_C_NO_CHANNEL_BINDINGS ;
1491
- gss_buffer_set_t data_set ;
1491
+ gss_buffer_set_t data_set = NULL ;
1492
1492
gss_OID_desc sasl_ssf_oid = {
1493
1493
11 , discard_const ("\x2a\x86\x48\x86\xf7\x12\x01\x02\x02\x05\x0f" )
1494
1494
};
@@ -1498,12 +1498,10 @@ int test_gssapi_1(bool user_env_file, bool use_cb, bool no_seal)
1498
1498
1499
1499
setenv ("NTLM_USER_FILE" , TEST_USER_FILE , 0 );
1500
1500
1501
- if (user_env_file ) {
1502
- username = "testuser" ;
1503
- } else {
1501
+ username = getenv ("TEST_USER_NAME" );
1502
+ if (username == NULL ) {
1504
1503
username = "TESTDOM\\testuser" ;
1505
1504
}
1506
-
1507
1505
nbuf .value = discard_const (username );
1508
1506
nbuf .length = strlen (username );
1509
1507
retmaj = gssntlm_import_name (& retmin , & nbuf ,
@@ -1771,9 +1769,9 @@ int test_gssapi_1(bool user_env_file, bool use_cb, bool no_seal)
1771
1769
goto done ;
1772
1770
}
1773
1771
1774
- if (strcmp (nbuf .value , "TESTDOM\\testuser" ) != 0 ) {
1772
+ if (strcmp (nbuf .value , username ) != 0 ) {
1775
1773
fprintf (stderr , "Expected username of [%s] but got [%s] instead!\n" ,
1776
- "TESTDOM\\testuser" , (char * )nbuf .value );
1774
+ username , (char * )nbuf .value );
1777
1775
ret = EINVAL ;
1778
1776
goto done ;
1779
1777
}
@@ -1826,7 +1824,7 @@ int test_gssapi_cl(void)
1826
1824
gss_buffer_desc srv_token = { 0 };
1827
1825
gss_cred_id_t cli_cred = GSS_C_NO_CREDENTIAL ;
1828
1826
gss_cred_id_t srv_cred = GSS_C_NO_CREDENTIAL ;
1829
- const char * username = "TESTDOM\\testuser" ;
1827
+ const char * username ;
1830
1828
const char * password = "testpassword" ;
1831
1829
const char * srvname = "test@testserver" ;
1832
1830
gss_name_t gss_username = NULL ;
@@ -1846,6 +1844,10 @@ int test_gssapi_cl(void)
1846
1844
1847
1845
setenv ("NTLM_USER_FILE" , TEST_USER_FILE , 0 );
1848
1846
1847
+ username = getenv ("TEST_USER_NAME" );
1848
+ if (username == NULL ) {
1849
+ username = "TESTDOM\\testuser" ;
1850
+ }
1849
1851
nbuf .value = discard_const (username );
1850
1852
nbuf .length = strlen (username );
1851
1853
retmaj = gssntlm_import_name (& retmin , & nbuf ,
@@ -2223,183 +2225,222 @@ int test_ZERO_LMKEY(struct ntlm_ctx *ctx)
2223
2225
int main (int argc , const char * argv [])
2224
2226
{
2225
2227
struct ntlm_ctx * ctx ;
2228
+ int gret = 0 ;
2226
2229
int ret ;
2227
2230
2228
2231
/* enable trace debugging by dfault in tests */
2229
2232
setenv ("GSSNTLMSSP_DEBUG" , "tests-trace.log" , 0 );
2230
2233
2231
- fprintf (stdout , "Test errors\n" );
2234
+ fprintf (stderr , "Test errors\n" );
2232
2235
ret = test_Errors ();
2233
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2236
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2237
+ if (ret ) gret ++ ;
2234
2238
2235
2239
ret = ntlm_init_ctx (& ctx );
2236
2240
if (ret ) goto done ;
2237
2241
2238
- fprintf (stdout , "Test LMOWFv1\n" );
2242
+ fprintf (stderr , "Test LMOWFv1\n" );
2239
2243
ret = test_LMOWFv1 (ctx );
2240
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2244
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2245
+ if (ret ) gret ++ ;
2241
2246
2242
- fprintf (stdout , "Test NTOWFv1\n" );
2247
+ fprintf (stderr , "Test NTOWFv1\n" );
2243
2248
ret = test_NTOWFv1 (ctx );
2244
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2249
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2250
+ if (ret ) gret ++ ;
2245
2251
2246
- fprintf (stdout , "Test LMResponse v1\n" );
2252
+ fprintf (stderr , "Test LMResponse v1\n" );
2247
2253
ret = test_LMResponseV1 (ctx );
2248
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2254
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2255
+ if (ret ) gret ++ ;
2249
2256
2250
- fprintf (stdout , "Test NTResponse v1\n" );
2257
+ fprintf (stderr , "Test NTResponse v1\n" );
2251
2258
ret = test_NTResponseV1 (ctx );
2252
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2259
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2260
+ if (ret ) gret ++ ;
2253
2261
2254
- fprintf (stdout , "Test SessionBaseKey v1\n" );
2262
+ fprintf (stderr , "Test SessionBaseKey v1\n" );
2255
2263
ret = test_SessionBaseKeyV1 (ctx );
2256
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2264
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2265
+ if (ret ) gret ++ ;
2257
2266
2258
- fprintf (stdout , "Test LM KeyExchangeKey\n" );
2267
+ fprintf (stderr , "Test LM KeyExchangeKey\n" );
2259
2268
ret = test_LM_KeyExchangeKey (ctx );
2260
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2269
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2270
+ if (ret ) gret ++ ;
2261
2271
2262
- fprintf (stdout , "Test EncryptedSessionKey v1 (1)\n" );
2272
+ fprintf (stderr , "Test EncryptedSessionKey v1 (1)\n" );
2263
2273
ret = test_EncryptedSessionKey1 (ctx );
2264
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2274
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2275
+ if (ret ) gret ++ ;
2265
2276
2266
- fprintf (stdout , "Test EncryptedSessionKey v1 (2)\n" );
2277
+ fprintf (stderr , "Test EncryptedSessionKey v1 (2)\n" );
2267
2278
ret = test_EncryptedSessionKey2 (ctx );
2268
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2279
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2280
+ if (ret ) gret ++ ;
2269
2281
2270
- fprintf (stdout , "Test EncryptedSessionKey v1 (3)\n" );
2282
+ fprintf (stderr , "Test EncryptedSessionKey v1 (3)\n" );
2271
2283
ret = test_EncryptedSessionKey3 (ctx );
2272
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2284
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2285
+ if (ret ) gret ++ ;
2273
2286
2274
2287
/* override internal version for V1 test vector */
2275
2288
ntlm_internal_set_version (6 , 0 , 6000 , 15 );
2276
2289
2277
- fprintf (stdout , "Test decoding ChallengeMessage v1\n" );
2290
+ fprintf (stderr , "Test decoding ChallengeMessage v1\n" );
2278
2291
ret = test_DecodeChallengeMessageV1 (ctx );
2279
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2292
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2293
+ if (ret ) gret ++ ;
2280
2294
2281
- fprintf (stdout , "Test encoding ChallengeMessage v1\n" );
2295
+ fprintf (stderr , "Test encoding ChallengeMessage v1\n" );
2282
2296
ret = test_EncodeChallengeMessageV1 (ctx );
2283
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2297
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2298
+ if (ret ) gret ++ ;
2284
2299
2285
- fprintf (stdout , "Test LMResponse v2\n" );
2300
+ fprintf (stderr , "Test LMResponse v2\n" );
2286
2301
ret = test_LMResponseV2 (ctx );
2287
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2302
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2303
+ if (ret ) gret ++ ;
2288
2304
2289
- fprintf (stdout , "Test NTResponse v2\n" );
2305
+ fprintf (stderr , "Test NTResponse v2\n" );
2290
2306
ret = test_NTResponseV2 (ctx );
2291
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2307
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2308
+ if (ret ) gret ++ ;
2292
2309
2293
- fprintf (stdout , "Test SessionBaseKey v2\n" );
2310
+ fprintf (stderr , "Test SessionBaseKey v2\n" );
2294
2311
ret = test_SessionBaseKeyV2 (ctx );
2295
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2312
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2313
+ if (ret ) gret ++ ;
2296
2314
2297
- fprintf (stdout , "Test EncryptedSessionKey v2\n" );
2315
+ fprintf (stderr , "Test EncryptedSessionKey v2\n" );
2298
2316
ret = test_EncryptedSessionKey (ctx , & T_NTLMv2 .SessionBaseKey ,
2299
2317
& T_NTLMv2 .EncryptedSessionKey );
2300
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2318
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2319
+ if (ret ) gret ++ ;
2301
2320
2302
2321
/* override internal version for V2 test vector */
2303
2322
ntlm_internal_set_version (6 , 0 , 6000 , 15 );
2304
2323
2305
- fprintf (stdout , "Test decoding ChallengeMessage v2\n" );
2324
+ fprintf (stderr , "Test decoding ChallengeMessage v2\n" );
2306
2325
ret = test_DecodeChallengeMessageV2 (ctx );
2307
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2326
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2327
+ if (ret ) gret ++ ;
2308
2328
2309
- fprintf (stdout , "Test encoding ChallengeMessage v2\n" );
2329
+ fprintf (stderr , "Test encoding ChallengeMessage v2\n" );
2310
2330
ret = test_EncodeChallengeMessageV2 (ctx );
2311
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2331
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2332
+ if (ret ) gret ++ ;
2312
2333
2313
- fprintf (stdout , "Test decoding AuthenticateMessage v2\n" );
2334
+ fprintf (stderr , "Test decoding AuthenticateMessage v2\n" );
2314
2335
ret = test_DecodeAuthenticateMessageV2 (ctx );
2315
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2336
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2337
+ if (ret ) gret ++ ;
2316
2338
2317
- fprintf (stdout , "Test encoding AuthenticateMessage v2\n" );
2339
+ fprintf (stderr , "Test encoding AuthenticateMessage v2\n" );
2318
2340
ret = test_EncodeAuthenticateMessageV2 (ctx );
2319
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2341
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2342
+ if (ret ) gret ++ ;
2320
2343
2321
2344
/* override internal version for CBT test vector */
2322
2345
ntlm_internal_set_version (6 , 1 , 7600 , 15 );
2323
2346
2324
- fprintf (stdout , "Test decoding ChallengeMessage v2 with CBT\n" );
2347
+ fprintf (stderr , "Test decoding ChallengeMessage v2 with CBT\n" );
2325
2348
ret = test_DecodeChallengeMessageV2CBT (ctx );
2326
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2349
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2350
+ if (ret ) gret ++ ;
2327
2351
2328
- fprintf (stdout , "Test encoding ChallengeMessage v2 with CBT\n" );
2352
+ fprintf (stderr , "Test encoding ChallengeMessage v2 with CBT\n" );
2329
2353
ret = test_EncodeChallengeMessageV2CBT (ctx );
2330
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2354
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2355
+ if (ret ) gret ++ ;
2331
2356
2332
- fprintf (stdout , "Test decoding AuthenticateMessage v2 with CBT\n" );
2357
+ fprintf (stderr , "Test decoding AuthenticateMessage v2 with CBT\n" );
2333
2358
ret = test_DecodeAuthenticateMessageV2CBT (ctx );
2334
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2359
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2360
+ if (ret ) gret ++ ;
2335
2361
2336
- fprintf (stdout , "Test sealing a Message with No Extended Security\n" );
2362
+ fprintf (stderr , "Test sealing a Message with No Extended Security\n" );
2337
2363
ret = test_GSS_Wrap_EX (ctx , & T_GSSWRAPv1noESS );
2338
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2364
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2365
+ if (ret ) gret ++ ;
2339
2366
2340
- fprintf (stdout , "Test sealing a Message with NTLMv1 Extended Security\n" );
2367
+ fprintf (stderr , "Test sealing a Message with NTLMv1 Extended Security\n" );
2341
2368
ret = test_GSS_Wrap_EX (ctx , & T_GSSWRAPEXv1 );
2342
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2369
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2370
+ if (ret ) gret ++ ;
2343
2371
2344
- fprintf (stdout , "Test sealing a Message with NTLMv2 Extended Security\n" );
2372
+ fprintf (stderr , "Test sealing a Message with NTLMv2 Extended Security\n" );
2345
2373
ret = test_GSS_Wrap_EX (ctx , & T_GSSWRAPEXv2 );
2346
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2374
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2375
+ if (ret ) gret ++ ;
2347
2376
2348
- fprintf (stdout , " *** Test with NTLMv1 auth" );
2377
+ fprintf (stderr , " *** Test with NTLMv1 auth\n " );
2349
2378
setenv ("LM_COMPAT_LEVEL" , "0" , 1 );
2350
2379
2351
- fprintf (stdout , "Test GSSAPI conversation (user env file)\n" );
2380
+ fprintf (stderr , "Test GSSAPI conversation (user env file)\n" );
2352
2381
ret = test_gssapi_1 (true, false, false);
2353
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2382
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2383
+ if (ret ) gret ++ ;
2354
2384
2355
- fprintf (stdout , "Test GSSAPI conversation (no SEAL)\n" );
2385
+ fprintf (stderr , "Test GSSAPI conversation (no SEAL)\n" );
2356
2386
ret = test_gssapi_1 (true, false, true);
2357
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2387
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2388
+ if (ret ) gret ++ ;
2358
2389
2359
- fprintf (stdout , "Test GSSAPI conversation (with password)\n" );
2390
+ fprintf (stderr , "Test GSSAPI conversation (with password)\n" );
2360
2391
ret = test_gssapi_1 (false, false, false);
2361
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2392
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2393
+ if (ret ) gret ++ ;
2362
2394
2363
- fprintf (stdout , "Test Connectionless exchange\n" );
2395
+ fprintf (stderr , "Test Connectionless exchange\n" );
2364
2396
ret = test_gssapi_cl ();
2365
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2397
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2398
+ if (ret ) gret ++ ;
2366
2399
2367
- fprintf (stdout , " *** Again forcing NTLMv2 auth" );
2400
+ fprintf (stderr , " *** Again forcing NTLMv2 auth\n " );
2368
2401
setenv ("LM_COMPAT_LEVEL" , "5" , 1 );
2369
2402
2370
- fprintf (stdout , "Test GSSAPI conversation (user env file)\n" );
2403
+ fprintf (stderr , "Test GSSAPI conversation (user env file)\n" );
2371
2404
ret = test_gssapi_1 (true, false, false);
2372
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2405
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2406
+ if (ret ) gret ++ ;
2373
2407
2374
- fprintf (stdout , "Test GSSAPI conversation (no SEAL)\n" );
2408
+ fprintf (stderr , "Test GSSAPI conversation (no SEAL)\n" );
2375
2409
ret = test_gssapi_1 (true, false, true);
2376
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2410
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2411
+ if (ret ) gret ++ ;
2377
2412
2378
- fprintf (stdout , "Test GSSAPI conversation (with password)\n" );
2413
+ fprintf (stderr , "Test GSSAPI conversation (with password)\n" );
2379
2414
ret = test_gssapi_1 (false, false, false);
2380
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2415
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2416
+ if (ret ) gret ++ ;
2381
2417
2382
- fprintf (stdout , "Test GSSAPI conversation (with CB)\n" );
2418
+ fprintf (stderr , "Test GSSAPI conversation (with CB)\n" );
2383
2419
ret = test_gssapi_1 (false, true, false);
2384
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2420
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2421
+ if (ret ) gret ++ ;
2385
2422
2386
- fprintf (stdout , "Test Connectionless exchange\n" );
2423
+ fprintf (stderr , "Test Connectionless exchange\n" );
2387
2424
ret = test_gssapi_cl ();
2388
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2425
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2426
+ if (ret ) gret ++ ;
2389
2427
2390
- fprintf (stdout , "Test RFC5801 SPI\n" );
2428
+ fprintf (stderr , "Test RFC5801 SPI\n" );
2391
2429
ret = test_gssapi_rfc5801 ();
2392
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2430
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2431
+ if (ret ) gret ++ ;
2393
2432
2394
- fprintf (stdout , "Test RFC5587 SPI\n" );
2433
+ fprintf (stderr , "Test RFC5587 SPI\n" );
2395
2434
ret = test_gssapi_rfc5587 ();
2396
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2435
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2436
+ if (ret ) gret ++ ;
2397
2437
2398
- fprintf (stdout , "Test ZERO LM_KEY\n" );
2438
+ fprintf (stderr , "Test ZERO LM_KEY\n" );
2399
2439
ret = test_ZERO_LMKEY (ctx );
2400
- fprintf (stdout , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2440
+ fprintf (stderr , "Test: %s\n" , (ret ? "FAIL" :"SUCCESS" ));
2441
+ if (ret ) gret ++ ;
2401
2442
2402
2443
done :
2403
2444
ntlm_free_ctx (& ctx );
2404
- return ret ;
2445
+ return gret ;
2405
2446
}
0 commit comments