From: Nikos Mavrogiannopoulos Date: Fri, 21 Jan 2005 00:33:59 +0000 (+0000) Subject: Simplified the algorithm to OID and vice versa functions, and added the RSA-RMD160... X-Git-Tag: gnutls_1_2_0~46 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d7833e4423f90aa445583db75464d864ad0fa3ce;p=thirdparty%2Fgnutls.git Simplified the algorithm to OID and vice versa functions, and added the RSA-RMD160 and the RMD160 OID. --- diff --git a/lib/gnutls.h.in.in b/lib/gnutls.h.in.in index 01b3031f5e..47206f7e12 100644 --- a/lib/gnutls.h.in.in +++ b/lib/gnutls.h.in.in @@ -166,7 +166,7 @@ typedef enum { GNUTLS_PK_RSA = 1, GNUTLS_PK_DSA, const char *gnutls_pk_algorithm_get_name( gnutls_pk_algorithm_t algorithm); typedef enum { GNUTLS_SIGN_RSA_SHA = 1, GNUTLS_SIGN_DSA_SHA, - GNUTLS_SIGN_RSA_MD5, GNUTLS_SIGN_RSA_MD2, + GNUTLS_SIGN_RSA_MD5, GNUTLS_SIGN_RSA_MD2, GNUTLS_SIGN_RSA_RMD160, GNUTLS_SIGN_UNKNOWN = 0xff } gnutls_sign_algorithm_t; diff --git a/lib/gnutls_algorithms.c b/lib/gnutls_algorithms.c index d22de3d960..a46c525049 100644 --- a/lib/gnutls_algorithms.c +++ b/lib/gnutls_algorithms.c @@ -24,7 +24,7 @@ #include "gnutls_algorithms.h" #include "gnutls_errors.h" #include "gnutls_cert.h" - +#include /* Cred type mappings to KX algorithms * FIXME: The mappings are not 1-1. Some KX such as SRP_RSA require @@ -161,16 +161,18 @@ static const gnutls_cipher_entry algorithms[] = { struct gnutls_hash_entry { const char *name; + const char* oid; gnutls_mac_algorithm_t id; }; typedef struct gnutls_hash_entry gnutls_hash_entry; static const gnutls_hash_entry hash_algorithms[] = { - {"SHA", GNUTLS_MAC_SHA}, - {"MD5", GNUTLS_MAC_MD5}, - {"RIPEMD160", GNUTLS_MAC_RMD160}, - {"NULL", GNUTLS_MAC_NULL}, - {0, 0} + {"SHA", OID_SHA1, GNUTLS_MAC_SHA}, + {"MD5", OID_MD5, GNUTLS_MAC_MD5}, + {"MD2", OID_MD2, 0/*GNUTLS_MAC_MD2*/}, + {"RIPEMD160", OID_RMD160, GNUTLS_MAC_RMD160}, + {"NULL", "", GNUTLS_MAC_NULL}, + {0, 0, 0} }; #define GNUTLS_HASH_LOOP(b) \ @@ -522,6 +524,27 @@ const char *gnutls_mac_get_name(gnutls_mac_algorithm_t algorithm) return ret; } +const char *_gnutls_x509_mac_to_oid(gnutls_mac_algorithm_t algorithm) +{ + const char *ret = NULL; + + /* avoid prefix */ + GNUTLS_HASH_ALG_LOOP(ret = p->oid); + + return ret; +} + +gnutls_mac_algorithm_t _gnutls_x509_oid2mac_algorithm(const char *oid) +{ +gnutls_mac_algorithm_t ret = 0; + + GNUTLS_HASH_LOOP(if (strcmp(oid, p->oid)==0) {ret = p->id;break;}); + + if (ret == 0) return GNUTLS_MAC_UNKNOWN; + return ret; +} + + int _gnutls_mac_is_ok(gnutls_mac_algorithm_t algorithm) { ssize_t ret = -1; @@ -1390,16 +1413,20 @@ enum encipher_type _gnutls_kx_encipher_type(gnutls_kx_algorithm_t */ struct gnutls_sign_entry { const char *name; + const char* oid; gnutls_sign_algorithm_t id; + gnutls_pk_algorithm_t pk; + gnutls_mac_algorithm_t mac; }; typedef struct gnutls_sign_entry gnutls_sign_entry; static const gnutls_sign_entry sign_algorithms[] = { - {"RSA-SHA", GNUTLS_SIGN_RSA_SHA}, - {"DSA-SHA", GNUTLS_SIGN_DSA_SHA}, - {"RSA-MD5", GNUTLS_SIGN_RSA_MD5}, - {"RSA-MD2", GNUTLS_SIGN_RSA_MD2}, - {0, 0} + {"RSA-SHA", RSA_SHA1_OID, GNUTLS_SIGN_RSA_SHA, GNUTLS_PK_RSA, GNUTLS_MAC_SHA}, + {"RSA-RMD160", RSA_RMD160_OID, GNUTLS_SIGN_RSA_RMD160, GNUTLS_PK_RSA, GNUTLS_MAC_RMD160}, + {"DSA-SHA", DSA_SHA1_OID, GNUTLS_SIGN_DSA_SHA, GNUTLS_PK_DSA, GNUTLS_MAC_SHA}, + {"RSA-MD5", RSA_MD5_OID, GNUTLS_SIGN_RSA_MD5, GNUTLS_PK_RSA, GNUTLS_MAC_MD5}, + {"RSA-MD2", RSA_MD2_OID, GNUTLS_SIGN_RSA_MD2, GNUTLS_PK_RSA, 0/*GNUTLS_MAC_MD2*/}, + {0, 0, 0, 0, 0} }; #define GNUTLS_SIGN_LOOP(b) \ @@ -1407,7 +1434,7 @@ static const gnutls_sign_entry sign_algorithms[] = { for(p = sign_algorithms; p->name != NULL; p++) { b ; } #define GNUTLS_SIGN_ALG_LOOP(a) \ - GNUTLS_SIGN_LOOP( if(p->id == algorithm) { a; break; } ) + GNUTLS_SIGN_LOOP( if(p->id == sign) { a; break; } ) @@ -1419,7 +1446,7 @@ static const gnutls_sign_entry sign_algorithms[] = { * of the specified sign algorithm or NULL. **/ const char *gnutls_sign_algorithm_get_name(gnutls_sign_algorithm_t - algorithm) + sign) { const char *ret = NULL; @@ -1429,18 +1456,56 @@ const char *gnutls_sign_algorithm_get_name(gnutls_sign_algorithm_t return ret; } +gnutls_sign_algorithm_t _gnutls_x509_oid2sign_algorithm(const char *oid) +{ + gnutls_sign_algorithm_t ret = 0; + + GNUTLS_SIGN_LOOP(if(strcmp(oid, p->oid)==0) {ret=p->id;break;}); + + if (ret == 0) { + _gnutls_x509_log("Unknown SIGN OID: '%s'\n", oid); + return GNUTLS_SIGN_UNKNOWN; + } + return ret; +} + +gnutls_sign_algorithm_t _gnutls_x509_pk_to_sign(gnutls_pk_algorithm_t pk, + gnutls_mac_algorithm_t mac) +{ +gnutls_sign_algorithm_t ret = 0; + + GNUTLS_SIGN_LOOP(if(pk==p->pk && mac==p->mac) {ret=p->id;break;}); + + if (ret==0) return GNUTLS_SIGN_UNKNOWN; + return ret; +} + +const char *_gnutls_x509_sign_to_oid(gnutls_pk_algorithm_t pk, + gnutls_mac_algorithm_t mac) +{ +gnutls_sign_algorithm_t sign; +const char* ret; + + sign = _gnutls_x509_pk_to_sign(pk, mac); + + GNUTLS_SIGN_ALG_LOOP(ret=p->oid); + return ret; +} + + /* pk algorithms; */ struct gnutls_pk_entry { const char *name; + const char* oid; gnutls_pk_algorithm_t id; }; typedef struct gnutls_pk_entry gnutls_pk_entry; static const gnutls_pk_entry pk_algorithms[] = { - {"RSA", GNUTLS_PK_RSA}, - {"DSA", GNUTLS_PK_DSA}, - {0, 0} + {"RSA", PKIX1_RSA_OID, GNUTLS_PK_RSA}, + {"DSA", DSA_OID, GNUTLS_PK_DSA}, + {0, 0, 0} }; #define GNUTLS_PK_LOOP(b) \ @@ -1468,3 +1533,19 @@ const char *gnutls_pk_algorithm_get_name(gnutls_pk_algorithm_t algorithm) return ret; } + +gnutls_pk_algorithm_t _gnutls_x509_oid2pk_algorithm(const char *oid) +{ +gnutls_pk_algorithm_t ret = GNUTLS_PK_UNKNOWN; + + GNUTLS_PK_LOOP(if (strcmp(p->oid,oid)==0) {ret = p->id; break;}); + return ret; +} + +const char *_gnutls_x509_pk_to_oid(gnutls_pk_algorithm_t algorithm) +{ + const char *ret = NULL; + + GNUTLS_PK_ALG_LOOP(ret = p->oid); + return ret; +} diff --git a/lib/gnutls_algorithms.h b/lib/gnutls_algorithms.h index 3bda86fa2f..172c65f3e0 100644 --- a/lib/gnutls_algorithms.h +++ b/lib/gnutls_algorithms.h @@ -18,6 +18,9 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ +#ifndef ALGORITHMS_H +# define ALGORITHMS_H + #include "gnutls_auth.h" /* functions for version */ @@ -37,6 +40,8 @@ const char *gnutls_mac_get_name(gnutls_mac_algorithm_t algorithm); int _gnutls_mac_is_ok(gnutls_mac_algorithm_t algorithm); int _gnutls_mac_priority(gnutls_session_t session, gnutls_mac_algorithm_t algorithm); +gnutls_mac_algorithm_t _gnutls_x509_oid2mac_algorithm(const char *oid); +const char *_gnutls_x509_mac_to_oid(gnutls_mac_algorithm_t mac); /* functions for cipher suites */ int _gnutls_supported_ciphersuites(gnutls_session_t session, @@ -48,15 +53,11 @@ int _gnutls_supported_compression_methods(gnutls_session_t session, const char *_gnutls_cipher_suite_get_name(cipher_suite_st * algorithm); gnutls_cipher_algorithm_t _gnutls_cipher_suite_get_cipher_algo(const - cipher_suite_st - * - algorithm); + cipher_suite_st* algorithm); gnutls_kx_algorithm_t _gnutls_cipher_suite_get_kx_algo(const - cipher_suite_st * - algorithm); + cipher_suite_st * algorithm); gnutls_mac_algorithm_t _gnutls_cipher_suite_get_mac_algo(const - cipher_suite_st * - algorithm); + cipher_suite_st *algorithm); gnutls_protocol_t _gnutls_cipher_suite_get_version(const cipher_suite_st * algorithm); cipher_suite_st _gnutls_cipher_suite_get_suite_name(cipher_suite_st * @@ -64,7 +65,7 @@ cipher_suite_st _gnutls_cipher_suite_get_suite_name(cipher_suite_st * /* functions for ciphers */ int _gnutls_cipher_priority(gnutls_session_t session, - gnutls_cipher_algorithm_t algorithm); + gnutls_cipher_algorithm_t algorithm); int _gnutls_cipher_get_block_size(gnutls_cipher_algorithm_t algorithm); int _gnutls_cipher_is_block(gnutls_cipher_algorithm_t algorithm); int _gnutls_cipher_is_ok(gnutls_cipher_algorithm_t algorithm); @@ -107,7 +108,9 @@ gnutls_credentials_type_t _gnutls_map_kx_get_cred(gnutls_kx_algorithm_t /* KX to PK mapping */ gnutls_pk_algorithm_t _gnutls_map_pk_get_pk(gnutls_kx_algorithm_t - kx_algorithm); + kx_algorithm); +gnutls_pk_algorithm_t _gnutls_x509_oid2pk_algorithm(const char *oid); +const char *_gnutls_x509_pk_to_oid(gnutls_pk_algorithm_t pk); enum encipher_type { CIPHER_ENCRYPT = 0, CIPHER_SIGN = 1, CIPHER_IGN }; @@ -134,3 +137,15 @@ struct gnutls_compression_entry { int comp_level; }; typedef struct gnutls_compression_entry gnutls_compression_entry; + +/* sign algorithms stuff + */ +gnutls_sign_algorithm_t _gnutls_x509_oid2sign_algorithm(const char *oid); +gnutls_sign_algorithm_t _gnutls_x509_oid2sign_algorithm(const char *oid); +gnutls_sign_algorithm_t _gnutls_x509_pk_to_sign(gnutls_pk_algorithm_t pk, + gnutls_mac_algorithm_t mac); +const char *_gnutls_x509_sign_to_oid(gnutls_pk_algorithm_t, + gnutls_mac_algorithm_t mac); + + +#endif diff --git a/lib/gnutls_int.h b/lib/gnutls_int.h index 85ecc7a512..8f4baf64ae 100644 --- a/lib/gnutls_int.h +++ b/lib/gnutls_int.h @@ -245,7 +245,7 @@ typedef enum gnutls_pk_algorithm { typedef enum gnutls_sign_algorithm { GNUTLS_SIGN_RSA_SHA = 1, GNUTLS_SIGN_DSA_SHA, - GNUTLS_SIGN_RSA_MD5, GNUTLS_SIGN_RSA_MD2, + GNUTLS_SIGN_RSA_MD5, GNUTLS_SIGN_RSA_MD2, GNUTLS_SIGN_RSA_RMD160, GNUTLS_SIGN_UNKNOWN = 0xff } gnutls_sign_algorithm_t; @@ -255,16 +255,14 @@ typedef void (*LOG_FUNC) (int, const char *); /* Pull & Push functions defines: */ -typedef ssize_t(*gnutls_pull_func) (gnutls_transport_ptr_t, void *, - size_t); -typedef ssize_t(*gnutls_push_func) (gnutls_transport_ptr_t, const void *, - size_t); +typedef ssize_t(*gnutls_pull_func)(gnutls_transport_ptr_t, void *, size_t); +typedef ssize_t(*gnutls_push_func)(gnutls_transport_ptr_t, const void *,size_t); /* Store & Retrieve functions defines: */ typedef int (*gnutls_db_store_func) (void *, gnutls_datum_t key, - gnutls_datum_t data); + gnutls_datum_t data); typedef int (*gnutls_db_remove_func) (void *, gnutls_datum_t key); typedef gnutls_datum_t(*gnutls_db_retr_func) (void *, gnutls_datum_t key); diff --git a/lib/x509/common.c b/lib/x509/common.c index 74b3b4beb3..158b20d48e 100644 --- a/lib/x509/common.c +++ b/lib/x509/common.c @@ -330,102 +330,6 @@ void _gnutls_int2str(unsigned int k, char *data) sprintf(data, "%d", k); } - -gnutls_pk_algorithm_t _gnutls_x509_oid2pk_algorithm(const char *oid) -{ - if (strcmp(oid, PKIX1_RSA_OID) == 0) /* pkix-1 1 - RSA */ - return GNUTLS_PK_RSA; - else if (strcmp(oid, DSA_OID) == 0) - return GNUTLS_PK_DSA; - - _gnutls_x509_log("Unknown PK OID: '%s'\n", oid); - - return GNUTLS_PK_UNKNOWN; -} - -gnutls_sign_algorithm_t _gnutls_x509_oid2sign_algorithm(const char *oid) -{ - if (strcmp(oid, RSA_MD5_OID) == 0) { - return GNUTLS_SIGN_RSA_MD5; - } else if (strcmp(oid, RSA_SHA1_OID) == 0) { - return GNUTLS_SIGN_RSA_SHA; - } else if (strcmp(oid, RSA_MD2_OID) == 0) { - return GNUTLS_SIGN_RSA_MD2; - } else if (strcmp(oid, DSA_SHA1_OID) == 0) { - return GNUTLS_SIGN_DSA_SHA; - } - - _gnutls_x509_log("Unknown SIGN OID: '%s'\n", oid); - - return GNUTLS_SIGN_UNKNOWN; -} - - -/* returns -1 on error - */ -gnutls_mac_algorithm_t _gnutls_x509_oid2mac_algorithm(const char *oid) -{ - if (strcmp(oid, OID_SHA1) == 0) - return GNUTLS_MAC_SHA; - else if (strcmp(oid, OID_MD5) == 0) - return GNUTLS_MAC_MD5; - - return GNUTLS_MAC_UNKNOWN; -} - -const char *_gnutls_x509_mac_to_oid(gnutls_mac_algorithm_t mac) -{ - if (mac == GNUTLS_MAC_SHA) - return OID_SHA1; - else if (mac == GNUTLS_MAC_MD5) - return OID_MD5; - else - return NULL; -} - -const char *_gnutls_x509_pk_to_oid(gnutls_pk_algorithm_t pk) -{ - if (pk == GNUTLS_PK_RSA) - return PKIX1_RSA_OID; - else if (pk == GNUTLS_PK_DSA) - return DSA_OID; - else - return NULL; -} - -gnutls_sign_algorithm_t _gnutls_x509_pk_to_sign(gnutls_pk_algorithm_t pk, - gnutls_mac_algorithm_t mac) -{ - if (pk == GNUTLS_PK_RSA) { - if (mac == GNUTLS_MAC_SHA) - return GNUTLS_SIGN_RSA_SHA; - else if (mac == GNUTLS_MAC_MD5) - return GNUTLS_SIGN_RSA_MD5; - } else if (pk == GNUTLS_PK_DSA) { - if (mac == GNUTLS_MAC_SHA) - return GNUTLS_SIGN_DSA_SHA; - } - return GNUTLS_SIGN_UNKNOWN; -} - -const char *_gnutls_x509_sign_to_oid(gnutls_pk_algorithm_t pk, - gnutls_mac_algorithm_t mac) -{ - gnutls_sign_algorithm_t sign; - - sign = _gnutls_x509_pk_to_sign(pk, mac); - - if (sign == GNUTLS_SIGN_RSA_SHA) - return RSA_SHA1_OID; - else if (sign == GNUTLS_SIGN_RSA_MD5) - return RSA_MD5_OID; - else if (sign == GNUTLS_SIGN_DSA_SHA) - return DSA_SHA1_OID; - - return NULL; -} - - /* TIME functions * Convertions between generalized or UTC time to time_t * diff --git a/lib/x509/common.h b/lib/x509/common.h index 4ae3ca4515..0592f7fd57 100644 --- a/lib/x509/common.h +++ b/lib/x509/common.h @@ -1,3 +1,8 @@ +#ifndef COMMON_H +# define COMMON_H + +#include + /* for int2str */ #define MAX_INT_DIGITS 4 void _gnutls_int2str(unsigned int k, char *data); @@ -21,6 +26,7 @@ void _gnutls_int2str(unsigned int k, char *data); #define RSA_MD5_OID "1.2.840.113549.1.1.4" #define RSA_MD2_OID "1.2.840.113549.1.1.2" #define RSA_SHA1_OID "1.2.840.113549.1.1.5" +#define RSA_RMD160_OID "1.3.36.3.3.1.2" time_t _gnutls_x509_utcTime2gtime(const char *ttime); time_t _gnutls_x509_generalTime2gtime(const char *ttime); @@ -37,62 +43,44 @@ const char *_gnutls_x509_oid2ldap_string(const char *OID); int _gnutls_x509_oid_data_choice(const char *OID); int _gnutls_x509_oid_data_printable(const char *OID); -gnutls_pk_algorithm_t _gnutls_x509_oid2pk_algorithm(const char *oid); -gnutls_mac_algorithm_t _gnutls_x509_oid2mac_algorithm(const char *oid); -gnutls_sign_algorithm_t _gnutls_x509_oid2sign_algorithm(const char *oid); - -const char *_gnutls_x509_pk_to_oid(gnutls_pk_algorithm_t pk); - -gnutls_sign_algorithm_t _gnutls_x509_pk_to_sign(gnutls_pk_algorithm_t pk, - gnutls_mac_algorithm_t - mac); -const char *_gnutls_x509_sign_to_oid(gnutls_pk_algorithm_t, - gnutls_mac_algorithm_t mac); -const char *_gnutls_x509_mac_to_oid(gnutls_mac_algorithm_t mac); - time_t _gnutls_x509_get_time(ASN1_TYPE c2, const char *when); gnutls_x509_subject_alt_name_t _gnutls_x509_san_find_type(char *str_type); int _gnutls_x509_der_encode_and_copy(ASN1_TYPE src, const char *src_name, - ASN1_TYPE dest, const char *dest_name, - int str); + ASN1_TYPE dest, const char *dest_name, + int str); int _gnutls_x509_der_encode(ASN1_TYPE src, const char *src_name, - gnutls_datum_t * res, int str); + gnutls_datum_t * res, int str); int _gnutls_x509_export_int(ASN1_TYPE asn1_data, - gnutls_x509_crt_fmt_t format, char *pem_header, - int tmp_buf_size, unsigned char *output_data, - size_t * output_data_size); + gnutls_x509_crt_fmt_t format, char *pem_header, + int tmp_buf_size, unsigned char *output_data, + size_t * output_data_size); int _gnutls_x509_read_value(ASN1_TYPE c, const char *root, - gnutls_datum_t * ret, int str); + gnutls_datum_t * ret, int str); int _gnutls_x509_write_value(ASN1_TYPE c, const char *root, - const gnutls_datum_t * data, int str); + const gnutls_datum_t * data, int str); int _gnutls_x509_encode_and_write_attribute(const char *given_oid, - ASN1_TYPE asn1_struct, - const char *where, - const void *data, - int sizeof_data, int multi); + ASN1_TYPE asn1_struct, const char *where, const void *data, + int sizeof_data, int multi); int _gnutls_x509_decode_and_read_attribute(ASN1_TYPE asn1_struct, - const char *where, char *oid, - int oid_size, - gnutls_datum_t * value, - int multi); + const char *where, char *oid, int oid_size, gnutls_datum_t * value, int multi); int _gnutls_x509_get_pk_algorithm(ASN1_TYPE src, const char *src_name, - unsigned int *bits); + unsigned int *bits); int _gnutls_x509_encode_and_copy_PKI_params(ASN1_TYPE dst, - const char *dst_name, - gnutls_pk_algorithm_t - pk_algorithm, mpi_t * params, - int params_size); + const char *dst_name, gnutls_pk_algorithm_t pk_algorithm, mpi_t * params, + int params_size); int _gnutls_asn1_copy_node(ASN1_TYPE * dst, const char *dst_name, - ASN1_TYPE src, const char *src_name); + ASN1_TYPE src, const char *src_name); int _gnutls_x509_get_signed_data(ASN1_TYPE src, const char *src_name, gnutls_datum_t * signed_data); int _gnutls_x509_get_signature(ASN1_TYPE src, const char *src_name, gnutls_datum_t * signature); + +#endif diff --git a/lib/x509/x509.h b/lib/x509/x509.h index 2f0e0867ad..4b49088742 100644 --- a/lib/x509/x509.h +++ b/lib/x509/x509.h @@ -3,6 +3,8 @@ #define OID_SHA1 "1.3.14.3.2.26" #define OID_MD5 "1.2.840.113549.2.5" +#define OID_MD2 "1.2.840.113549.2.2" +#define OID_RMD160 "1.3.36.3.2.1" typedef struct gnutls_x509_crl_int { ASN1_TYPE crl;