gpgme/tests/ChangeLog

444 lines
13 KiB
Plaintext
Raw Normal View History

2003-04-28 Marcus Brinkmann <marcus@g10code.de>
doc/ 2003-04-28 Marcus Brinkmann <marcus@g10code.de> * gpgme.texi (Decrypt): Descript gpgme_op_decrypt_result and GpgmeDecryptResult. gpgme 2003-04-28 Marcus Brinkmann <marcus@g10code.de> * gpgme.h (struct _gpgme_op_decrypt_result): New structure. (GpgmeDecryptResult): New type. (gpgme_op_decrypt_result): New prototype. * ops.h (_gpgme_op_decrypt_init_result): New prototype. (_gpgme_decrypt_status_handler): Fix prototype. (_gpgme_decrypt_start): Remove prototype. * decrypt-verify.c: Do not include <stdio.h>, <stdlib.h>, <string.h> and <assert.h>, "util.h" and "context.h", but "gpgme.h". (decrypt_verify_status_handler): Change first argument to void *, and rework error handling. (_gpgme_op_decrypt_verify_start): New function. (gpgme_op_decrypt_verify_start): Rewrite using _gpgme_op_decrypt_verify_start. (gpgme_op_decrypt_verify): Likewise. * decrypt.c: Include <string.h>, "gpgme.h" and "util.h". (struct decrypt_result): Change to typedef op_data_t, rewritten. (is_token): Remove function. (release_op_data): New function. (skip_token): Remove function. (gpgme_op_decrypt_result): New function. (_gpgme_decrypt_status_handler): Change first argument to void *. Rework error handling. (_gpgme_decrypt_start): Rename to ... (decrypt_start): ... this. Call _gpgme_op_decrypt_init_result. (_gpgme_op_decrypt_init_result): New function. (gpgme_op_decrypt_start): Use decrypt_start. (gpgme_op_decrypt): Likewise. tests/ 2003-04-28 Marcus Brinkmann <marcus@g10code.de> * gpg/t-decrypt.c: Rewritten.
2003-04-28 21:17:15 +00:00
* gpg/t-decrypt.c: Rewritten.
* gpg/t-signers.c: Rewritten.
2003-04-27 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-encrypt-sign.c (check_result): Rewritten.
* gpg/t-sign.c: Rewritten.
* gpgsm/t-sign.c: Rewritten.
* gpg/t-encrypt.c: Check for invalid recipients.
* gpgsm/t-encrypt.c: Likewise.
* gpg/t-import.c (check_result): Really use FPR.
* gpgsm/t-import.c (check_result): Rewritten.
2003-04-25 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-import.c: Rewritten.
* gpgsm/t-genkey.c: Rewritten.
* gpgsm/Makefile.am (noinst_PROGRAMS): Add t-genkey.
* gpg/t-genkey.c: Include <stdlib.h>.
(main): Check result->fpr before checking its length.
2003-04-24 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-genkey.c: Rewritten to match new semantics.
2003-02-06 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-decrypt.c (passphrase_cb): Fix to new prototype.
* gpg/t-decrypt-verify.c (passphrase_cb): Likewise.
* gpg/t-edit.c (passphrase_cb): Likewise.
* gpg/t-encrypt-sign.c (passphrase_cb): Likewise.
* gpg/t-encrypt-sym.c (passphrase_cb): Likewise.
* gpg/t-sign.c (passphrase_cb): Likewise.
* gpg/t-signers.c (passphrase_cb): Likewise.
2003-01-30 Marcus Brinkmann <marcus@g10code.de>
* t-engine-info.c: Use file_name instead path throughout.
* Makefile.am (TESTS): Add t-engine-info.
* t-engine-info.c: New file.
* gpg/t-encrypt.c (main): Don't print engine info.
* gpg/t-eventloop.c (main): Likewise.
* gpg/t-encrypt-sign.c (main): Likewise.
* gpgsm/t-encrypt.c (main): Likewise.
2002-12-24 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/t-verify.c (main): Adjust caller of gpgme_op_verify.
* gpg/t-verify.c (main): Likewise.
* gpg/t-decrypt-verify.c (main): Likewise for
gpgme_op_decrypt_verify.
2002-12-23 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/Makefile.am (./gpgsm.conf): Add a faked system time to
avoid certification's expiry.
* gpgsm/t-encrypt.c (main): Use the short certification name.
2002-11-19 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-genkey.c (main): Add missing argument to gpgme_op_genkey
invocation.
gpgme/ 2002-10-08 Marcus Brinkmann <marcus@g10code.de> New data object component: * gpgme.h (GpgmeDataReadCb, GpgmeDataWriteCb, GpgmeDataSeekCb, GpgmeDataReleaseCb): New types. (struct GpgmeDataCbs): New structure. (gpgme_data_read): Changed prototype to match that of read() closely. (gpgme_data_write): Similar for write(). (gpgme_data_seek, gpgme_data_new_from_cbs, gpgme_data_new_from_fd, gpgme_data_new_from_stream): New prototypes. (gpgme_data_get_type, gpgme_check_engine): Prototype removed. * Makefile.am (libgpgme_la_SOURCES): Add data.h, data-fd.c, data-stream.c, data-mem.c, data-user.c and data-compat.c. * data.c: Reimplemented from scratch. * (data-compat.c, data-fd.c, data.h, data-mem.c, data-stream.c, data-user.c): New file. * context.h (struct gpgme_data_s): Removed. * conversion.c: Include <errno.h> and <sys/types.h>. (_gpgme_data_append): New function. * data.c (_gpgme_data_append_string): Move to ... * conversion.c (_gpgme_data_append_string): ... here. * data.c (_gpgme_data_append_for_xml): Move to ... * conversion.c (_gpgme_data_append_for_xml): ... here. * data.c (_gpgme_data_append_string_for_xml): Move to ... * conversion.c (_gpgme_data_append_string_for_xml): ... here. * data.c (_gpgme_data_append_percentstring_for_xml): Move to ... * conversion.c (_gpgme_data_append_percentstring_for_xml): ... here. * ops.h (_gpgme_data_get_mode, _gpgme_data_set_mode): Prototype removed. * types.h (GpgmeDataMode): Type removed. * decrypt.c (_gpgme_decrypt_start): Don't check data type or mode. * edit.c (_gpgme_op_edit_start): Likewise. * encrypt.c (_gpgme_op_encrypt_start): Likewise. * encrypt-sign.c (_gpgme_op_encrypt_sign_start): Likewise. * encrypt-sign.c (_gpgme_op_encrypt_sign_start): Likewise. * export.c (_gpgme_op_export_start): Likewise. * genkey.c (_gpgme_op_genkey_start): Likewise. * import.c (_gpgme_op_import_start): Likewise. * sign.c (_gpgme_op_sign_start): Likewise. * verify.c (_gpgme_op_verify_start): Likewise. * encrypt.c (gpgme_op_encrypt): Remove hack that returns invalid no recipient if no data was returned. * encrypt-sign.c (gpgme_op_encrypt_sign): Remove hack that returns no recipient if no data was returned. * encrypt-sign.c (gpgme_op_encrypt_sign): Remove hack that returns no recipient if no data was returned. * engine.c (_gpgme_engine_op_verify): Add new argument to differentiate detached from normal signatures. * engine.h (_gpgme_engine_op_verify): Likewise for prototype. * engine-gpgsm.c (_gpgme_gpgsm_op_verify): Likewise. Don't check mode of data argument. * engine-gpgsm.h (_gpgme_gpgsm_op_verify): Likewise for prototype. * gpgme.h (gpgme_op_verify_start): Likewise for prototype. (gpgme_op_verify): Likewise for prototype. * rungpg.c (_gpgme_gpg_op_verify): Likewise. * rungpg.h (_gpgme_gpg_op_verify): Likewise for prototype. * verify.c (_gpgme_op_verify_start): Likewise. (gpgme_op_verify_start): Likewise. (gpgme_op_verify): Likewise. * rungpg.c (struct arg_and_data_s): New member INBOUND to hold direction of data object. (_gpgme_gpg_add_data): Add new argument INBOUND. Use it to determine direction of data object. (_gpgme_gpg_add_pm_data, _gpgme_gpg_set_command_handler, _gpgme_gpg_op_decrypt, _gpgme_gpg_op_edit, _gpgme_gpg_op_encrypt, _gpgme_gpg_op_encrypt_sign, _gpgme_gpg_op_export, _gpgme_gpg_op_genkey, _gpgme_gpg_op_import, _gpgme_gpg_op_sign, _gpgme_gpg_op_verify): Add new argument to _gpgme_gpg_add_data invocation. (build_argv): Use new member INBOUND to determine direction of file descriptor. Don't check the data type. * rungpg.h (_gpgme_gpg_add_data): Add new argument to prototype. * gpgme.c (gpgme_get_op_info): Don't call _gpgme_data_get_as_string if CTX->op_info is NULL. * version.c (gpgme_check_engine): Function removed. tests/ 2002-10-09 Marcus Brinkmann <marcus@g10code.de> * gpg/t-decrypt.c (print_data): Update to new gpgme_data_read interface, and use gpgme_engine_check_version instead gpgme_check_version. * gpg/t-decrypt-verify.c (print_data): Likewise. * gpg/t-edit.c (main): Likewise. * gpg/t-encrypt.c (print_data): Likewise. * gpg/t-encrypt-sign.c (print_data): Likewise. * gpg/t-encrypt-sym.c (print_data): Likewise. * gpg/t-eventloop.c (print_data): Likewise. * gpg/t-export.c (print_data): Likewise. * gpg/t-sign.c (print_data): Likewise. * gpg/t-signers.c (print_data): Likewise. * gpgsm/t-decrypt.c (print_data): Likewise. * gpgsm/t-encrypt.c (print_data): Likewise. * gpgsm/t-export.c (print_data): Likewise. * gpgsm/t-sign.c (print_data): Likewise. * gpg/t-verify.c (main): Likewise for gpgme_op_verify. * gpgsm/t-verify.c (main): Likewise for gpgme_op_verify. * t-data.c (read_once_test): Likewise. (write_test): Update for new behaviour of data objects. (main): Remove type test.
2002-10-09 00:16:38 +00:00
2002-10-09 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-decrypt.c (print_data): Update to new gpgme_data_read
interface, and use gpgme_engine_check_version instead
gpgme_check_version.
* gpg/t-decrypt-verify.c (print_data): Likewise.
* gpg/t-edit.c (main): Likewise.
* gpg/t-encrypt.c (print_data): Likewise.
* gpg/t-encrypt-sign.c (print_data): Likewise.
* gpg/t-encrypt-sym.c (print_data): Likewise.
* gpg/t-eventloop.c (print_data): Likewise.
* gpg/t-export.c (print_data): Likewise.
* gpg/t-sign.c (print_data): Likewise.
* gpg/t-signers.c (print_data): Likewise.
* gpgsm/t-decrypt.c (print_data): Likewise.
* gpgsm/t-encrypt.c (print_data): Likewise.
* gpgsm/t-export.c (print_data): Likewise.
* gpgsm/t-sign.c (print_data): Likewise.
* gpg/t-verify.c (main): Likewise for gpgme_op_verify.
* gpgsm/t-verify.c (main): Likewise for gpgme_op_verify.
* t-data.c (read_once_test): Likewise.
(write_test): Update for new behaviour of data objects.
(main): Remove type test.
2002-09-30 Werner Koch <wk@gnupg.org>
* gpgsm/t-keylist.c (doit): Add arg SECRET.
(main): Add option --secret.
2002-09-28 Marcus Brinkmann <marcus@g10code.de>
* t-version.c: Include <string.h>. Reported by St<53>phane Corth<74>sy.
2002-09-02 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-keylist.c (main): Test PATTERN for NULL before printing.
Reported by Dr. Stefan Dalibor <Dr.Stefan.Dalibor@bfa.de>.
2002-08-01 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-edit.c: Also add a test for the expire command (testing
the passphrase callback).
2002-07-28 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-edit.c: New file.
* gpg/Makefile (TESTS): Add t-edit.
2002-07-25 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-encrypt-sym.c (main): Change type of I to size_t and
rename to LEN.
* gpg/t-verify.c (main): Likewise. Submitted by St<53>phane
Corth<74>sy.
2002-07-03 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-eventloop.c: New file.
* gpg/Makefile (TESTS): Add t-eventloop.
2002-06-26 Werner Koch <wk@gnupg.org>
* gpgsm/t-import.c (print_op_info): New.
(main): Print operation info.
2002-06-25 Werner Koch <wk@gnupg.org>
* gpgsm/Makefile.am (DISTCLEANFILES): new.
2002-06-25 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/Makefile.am (TESTS): Add t-export.
gpgsm/t-export.c: New file.
2002-06-20 Werner Koch <wk@gnupg.org>
* gpgsm/t-sign.c (main): Also test a normal signature.
* gpg/Makefile (TESTS_ENVIRONMENT): Set GPG_AGENT_INFO empty.
* gpg/t-signers.c, gpg/t-sign.c, gpg/t-encrypt-sym.c
* gpg/t-encrypt-sign.c, gpg/t-decrypt.c
* gpg/t-decrypt-verify.c (main): Changed the GPG_AGENT_INFO check to
match the one in ../../gpgme/rungpg.c.
2002-06-12 Werner Koch <wk@gnupg.org>
* gpgsm/t-keylist.c (doit): Print operation info if available.
2002-06-10 Werner Koch <wk@gnupg.org>
* gpgsm/t-verify.c (print_sig_stat): Print the error token.
2002-06-04 Werner Koch <wk@gnupg.org>
* gpgsm/t-encrypt.c (main): Add a simple option parser and allow
to specify an encryption key.
2002-05-26 Marcus Brinkmann <marcus@g10code.de>
* gpg/Makefile.am (all-local): Remove dependency on ./secring.gpg.
(./secring.gpg): Remove target, and move all rules for this target
to ...
(./pubring.gpg): ... here. This was necessary because GnuPG 1.0.7
does create an empty secring.gpg file when importing public keys.
2002-05-08 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/t-verify.c (validity_string): New.
(print_sig_stat): Print expire time and validity.
(status_string): Add new exipred stati.
2002-05-03 Werner Koch <wk@gnupg.org>
* gpg/t-verify.c (validity_string): New.
(print_sig_stat): Print expire time and validity.
(status_string): Add new exipred stati.
2002-04-05 Marcus Brinkmann <marcus@g10code,de>
* gpgsm/Makefile.am (./trustlist.txt): Put more into this file to
prevent use of gpg-agent.
(./gpg-agent.conf): Remove target.
(all-local): Remove ./gpg-agent.conf.
2002-04-05 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/t-keylist.c (main): Use gpgme_engine_check_version instead
gpgme_check_engine.
* gpgsm/t-encrypt.c (main): Likewise.
2002-03-06 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-encrypt-sym.c: New file.
* gpg/Makefile.am (TESTS): Add t-encrypt-sym.
2002-03-05 Marcus Brinkmann <marcus@g10code.de>
* gpg/Makefile.am (CLEANFILES): Remove random_seed, which is now
in DISTCLEANFILES.
2002-03-04 Werner Koch <wk@gnupg.org>
* gpg/Makefile.am (DISTCLEANFILES): Added.
2002-03-03 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-verify.c (main): Add a few more sanity checks, and a check
for normal signatures.
2002-02-26 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-encrypt-sign.c: New file.
* gpg/Makefile.am (TESTS): Add t-encrypt-sign.
2002-02-13 Werner Koch <wk@gnupg.org>
* gpgsm/Makefile.am (private-keys-v1.d): Don't
fail when the directory already exists.
2002-02-12 Marcus Brinkmann <marcus@g10code.de>
* gpg/Makefile.am (CLEANFILES): New target.
(distclean-local): Rename to ...
(clean-local): ... this.
2002-02-09 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/Makefile.am (./private-keys-v1.d/$(key_id).key): Fix rule.
2002-02-09 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/t-genkey.c: New file (not added to Makefile.am because of
gpg-agent bug).
2002-02-08 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/Makefile.am (key_id): Update value.
(all-local): Add .key to keyid filename.
(./private-keys-v1.d/$(key_id)): Renamed to ...
(./private-keys-v1.d/$(key_id).key): ... this.
(all-local): Add ./gpgsm.conf, ./trustlist.txt.
(./gpgsm.conf, ./trustlist.txt): New target.
* gpgsm/567064FE6D14A17B2D811ABB407728BC558AA455: Renamed to ...
* gpgsm/32100C27173EF6E9C4E9A25D3D69F86D37A4F939: ... this.
2002-01-30 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-import.c (print_op_info): New function.
(main): Use it.
2002-01-22 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-signers.c (passphrase_cb): Change type of r_hd to void**.
* gpg/t-sign.c (passphrase_cb): Likewise.
* gpg/t-decrypt-verify.c (passphrase_cb): Likewise.
* gpg/t-decrypt.c (passphrase_cb): Likewise.
2001-12-19 Marcus Brinkmann <marcus@g10code.de>
* gpg/t-decrypt-verify.c: Don't include `mcheck.h'. Reported by
St<53>phane Corth<74>sy.
2001-12-19 Marcus Brinkmann <marcus@g10code.de>
* gpg/Makefile.am (EXTRA_DIST): Add missing line continuation.
2001-12-19 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/Makefile.am (EXTRA_DIST): Add $(key_id).
2001-12-16 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/Makefile: Rename `pubcerts.kbx' to `pubring.kbx'.
2001-12-15 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/t-keylist.c (check_two_contexts): Set protocols.
2001-12-14 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/t-sign.c: New file.
* gpgsm/Makefile.am (TESTS): Add t-sign.
2001-12-14 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/t-decrypt.c: New file.
* gpgsm/567064FE6D14A17B2D811ABB407728BC558AA455: Likewise.
* gpgsm/Makefile.am (TESTS): Add t-decrypt.
(key_id): New variable.
(all-local): New target ./private-keys-v1.d/$(key_id) added.
(./private-keys-v1.d/$(key_id)): New target.
2001-12-14 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/t-verify.c: New file.
* gpgsm/Makefile.am (TESTS): Add t-verify.
2001-12-14 Marcus Brinkmann <marcus@g10code.de>
* gpg/Makefile.am (GPG): Set to @GPG_PATH@.
(./pubring.gpg): Use $(GPG) instead gpg.
(./secring.gpg): Likewise.
* gpgsm/t-import.c (main): Remove third test case.
* gpgsm/Makefile.am (GPGSM): Set to @GPGSM@.
(all-local): New target.
(./pubcerts.kbx): Likewise.
* gpgsm/t-encrypt.c: New file.
* gpgsm/Makefile.am (TESTS): Add t-encrypt.
2001-12-14 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/t-keylist.c: New file.
* gpgsm/Makefile.am (TESTS): Add t-keylist.
2001-12-13 Marcus Brinkmann <marcus@g10code.de>
* gpgsm/cert_dfn_pca01.der: New file.
* gpgsm/cert_dfn_pca15.der: Likewise.
* gpgsm/cert_g10code_test1.der: Likewise.
* gpgsm/t-import.c: Likewise.
* gpgsm/Makefile.am (EXTRADIST): Add new files.
(TESTS): Add t-import.
2001-11-22 Marcus Brinkmann <marcus@g10code.de>
* gpg/: New directory.
* Makefile.am, t-verify.c, t-encrypt.c, t-signers.c, t-trustlist.c,
t-sign.c, t-keylist.c, t-import.c, t-genkey.c, t-export.c,
t-decrypt-verify.c, t-decrypt.c, t-version.c, t-data.c, mkdemodirs.
cipher-1.asc, cipher-2.asc, geheim.txt, pubdemo.asc, pubkey-1.asc,
secdemo.asc, seckey-1.asc): Move to sub directory gpg/.
* gpg/Makefile.am (INCLUDES): Include gpgme/, not include/ and
intl/.
(LDD): Correct relative path to gpgme library.
(TESTS): Remove t-version and t-data.
* gpg/t-verify.c, gpg/t-encrypt.c, gpg/t-signers.c, gpg/t-trustlist.c,
gpg/t-sign.c, gpg/t-keylist.c, gpg/t-import.c, gpg/t-genkey.c,
gpg/t-export.c, gpg/t-decrypt-verify.c, gpg/t-decrypt.c,
t-version.c, t-data.c): Include gpgme.h, not "../gpgme/gpgme.h".
* Makefile.am: New file.
* gpgsm/: New directory.
* gpgsm/Makefile.am: New file.
2001-11-16 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (TESTS): Add t-decrypt-verify.
* t-decrypt-verify.c: New file.
* cipher-2.asc: Likewise.
2001-11-02 Marcus Brinkmann <marcus@g10code.de>
* t-data.c: Include stddef.h.
(read_once_test): Change type of READ to size_t.
(read_test): Likewise.
(write_test): Likewise.
2001-10-29 Marcus Brinkmann <marcus@g10code.de>
* t-signers.c: New file.
* Makefile.am (TESTS): Add t-signers.
2001-10-22 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (TEST_ENVIRONMENT): Revert last change.
2001-10-22 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (TEST_ENVIRONMENT): Set environment to $(srcdir),
not current directory.
2001-10-22 Marcus Brinkmann <marcus@g10code.de>
* t-data.c (write_test): New function.
(main): Invoke write_test for all rounds except TEST_OUT_CB.
2001-10-22 Marcus Brinkmann <marcus@g10code.de>
* Makefile.am (INCLUDES): Remove spurious duplicate to silence
automake.
2001-10-16 Marcus Brinkmann <marcus@g10code.de>
* t-version.c: New file.
* t-data.c: Likewise.
* t-data-1.txt: Likewise.
* t-data-2.txt: Likewise.
* Makefile.am (TESTS): Add t-version, t-data.
2001-09-17 Werner Koch <wk@gnupg.org>
* t-keylist.c (check_two_contexts): New.
2001-09-03 Werner Koch <wk@gnupg.org>
* t-encrypt.c (print_op_info): New and use it after each operation..
2001-08-28 Werner Koch <wk@gnupg.org>
* t-sign.c (print_op_info): New and use it after each operation.
2001-03-15 Werner Koch <wk@gnupg.org>
* t-keylist.c (doit): List subkeys too, show caps.
2001-02-13 Werner Koch <wk@gnupg.org>
* t-verify.c (print_sig_stat): Repaled ulong by unsigned long
because we don't use the config stuff here.
2001-02-12 Werner Koch <wk@gnupg.org>
* tests/t-verify.c (print_sig_stat): Print info about the keys.
Copyright 2001 g10 Code GmbH
This file is free software; as a special exception the author gives
unlimited permission to copy and/or distribute it, with or without
modifications, as long as this notice is preserved.
This file is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.