Custom extension revision.

Use the same structure for client and server custom extensions.

Add utility functions in new file t1_ext.c.
Use new utility functions to handle custom server and client extensions
and remove a lot of code duplication.
Reviewed-by: Emilia Käsper <emilia@openssl.org>
diff --git a/ssl/ssl_locl.h b/ssl/ssl_locl.h
index 4a12aec..3bd50df 100644
--- a/ssl/ssl_locl.h
+++ b/ssl/ssl_locl.h
@@ -534,17 +534,15 @@
 
 typedef struct {
 	unsigned short ext_type;
-	custom_cli_ext_first_cb_fn fn1; 
-	custom_cli_ext_second_cb_fn fn2; 
+	custom_ext_add_cb add_cb; 
+	custom_ext_parse_cb parse_cb; 
 	void *arg;
-} custom_cli_ext_record;
+} custom_ext_method;
 
 typedef struct {
-	unsigned short ext_type;
-	custom_srv_ext_first_cb_fn fn1; 
-	custom_srv_ext_second_cb_fn fn2; 
-	void *arg;
-} custom_srv_ext_record;
+	custom_ext_method *meths;
+	size_t meths_count;
+} custom_ext_methods;
 
 typedef struct cert_st
 	{
@@ -642,12 +640,9 @@
 	unsigned char *ciphers_raw;
 	size_t ciphers_rawlen;
 
-	/* Arrays containing the callbacks for custom TLS Extensions. */
-	custom_cli_ext_record *custom_cli_ext_records;
-	size_t custom_cli_ext_records_count;
-	custom_srv_ext_record *custom_srv_ext_records;
-	size_t custom_srv_ext_records_count;
-
+	/* Custom extension methods for server and client */
+	custom_ext_methods cli_ext;
+	custom_ext_methods srv_ext;
 	/* Security callback */
 	int (*sec_cb)(SSL *s, SSL_CTX *ctx, int op, int bits, int nid, void *other, void *ex);
 	/* Security level */
@@ -1413,6 +1408,21 @@
 
 int srp_verify_server_param(SSL *s, int *al);
 
+/* t1_ext.c */
+
+int custom_ext_parse(SSL *s, int server,
+			unsigned short ext_type,
+			const unsigned char *ext_data, 
+			unsigned short ext_size,
+			int *al);
+int custom_ext_add(SSL *s, int server,
+			unsigned char **pret,
+			unsigned char *limit,
+			int *al);
+
+int custom_exts_copy(custom_ext_methods *dst, const custom_ext_methods *src);
+void custom_exts_free(custom_ext_methods *exts);
+
 #else
 
 #define ssl_init_wbio_buffer SSL_test_functions()->p_ssl_init_wbio_buffer