ext_cert_type.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "gnutls_int.h"
00030 #include "gnutls_errors.h"
00031 #include "gnutls_num.h"
00032 #include "ext_cert_type.h"
00033 #include "gnutls_state.h"
00034 #include "gnutls_num.h"
00035
00036 inline static int MHD__gnutls_num2cert_type (int num);
00037 inline static int MHD__gnutls_cert_type2num (int record_size);
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 int
00049 MHD_gtls_cert_type_recv_params (MHD_gtls_session_t session,
00050 const opaque * data, size_t _data_size)
00051 {
00052 int new_type = -1, ret, i;
00053 ssize_t data_size = _data_size;
00054
00055 #if MHD_DEBUG_TLS
00056 if (session->security_parameters.entity == GNUTLS_CLIENT)
00057 {
00058 if (data_size > 0)
00059 {
00060 if (data_size != 1)
00061 {
00062 MHD_gnutls_assert ();
00063 return GNUTLS_E_UNEXPECTED_PACKET_LENGTH;
00064 }
00065
00066 new_type = MHD__gnutls_num2cert_type (data[0]);
00067
00068 if (new_type < 0)
00069 {
00070 MHD_gnutls_assert ();
00071 return new_type;
00072 }
00073
00074
00075 if ((ret =
00076 MHD_gtls_session_cert_type_supported (session, new_type)) < 0)
00077 {
00078 MHD_gnutls_assert ();
00079 return ret;
00080 }
00081
00082 MHD__gnutls_session_cert_type_set (session, new_type);
00083 }
00084 }
00085 else
00086 #endif
00087
00088 {
00089
00090 if (data_size > 1)
00091 {
00092 uint8_t len;
00093
00094 len = data[0];
00095 DECR_LEN (data_size, len);
00096
00097 for (i = 0; i < len; i++)
00098 {
00099 new_type = MHD__gnutls_num2cert_type (data[i + 1]);
00100
00101 if (new_type < 0)
00102 continue;
00103
00104
00105 if ((ret =
00106 MHD_gtls_session_cert_type_supported (session,
00107 new_type)) < 0)
00108 {
00109 MHD_gnutls_assert ();
00110 continue;
00111 }
00112 else
00113 break;
00114
00115 }
00116
00117 if (new_type < 0)
00118 {
00119 MHD_gnutls_assert ();
00120 return GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER;
00121 }
00122
00123 if ((ret =
00124 MHD_gtls_session_cert_type_supported (session, new_type)) < 0)
00125 {
00126 MHD_gnutls_assert ();
00127
00128
00129
00130
00131
00132 return 0;
00133 }
00134
00135 MHD__gnutls_session_cert_type_set (session, new_type);
00136 }
00137
00138
00139 }
00140
00141 return 0;
00142 }
00143
00144
00145
00146 int
00147 MHD_gtls_cert_type_send_params (MHD_gtls_session_t session, opaque * data,
00148 size_t data_size)
00149 {
00150 unsigned int len;
00151
00152
00153 #if MHD_DEBUG_TLS
00154 unsigned int i;
00155 if (session->security_parameters.entity == GNUTLS_CLIENT)
00156 {
00157
00158 if (session->internals.priorities.cert_type.num_algorithms > 0)
00159 {
00160
00161 len = session->internals.priorities.cert_type.num_algorithms;
00162
00163 if (len == 1 &&
00164 session->internals.priorities.cert_type.priority[0] ==
00165 MHD_GNUTLS_CRT_X509)
00166 {
00167
00168
00169
00170 return 0;
00171 }
00172
00173 if (data_size < len + 1)
00174 {
00175 MHD_gnutls_assert ();
00176 return GNUTLS_E_SHORT_MEMORY_BUFFER;
00177 }
00178
00179
00180
00181 data[0] = (uint8_t) len;
00182
00183 for (i = 0; i < len; i++)
00184 {
00185 data[i + 1] =
00186 MHD__gnutls_cert_type2num (session->internals.
00187 priorities.cert_type.priority[i]);
00188 }
00189 return len + 1;
00190 }
00191
00192 }
00193 else
00194 #endif
00195 {
00196 if (session->security_parameters.cert_type != DEFAULT_CERT_TYPE)
00197 {
00198 len = 1;
00199 if (data_size < len)
00200 {
00201 MHD_gnutls_assert ();
00202 return GNUTLS_E_SHORT_MEMORY_BUFFER;
00203 }
00204
00205 data[0] =
00206 MHD__gnutls_cert_type2num (session->
00207 security_parameters.cert_type);
00208 return len;
00209 }
00210
00211
00212 }
00213
00214 return 0;
00215 }
00216
00217
00218
00219
00220 inline static int
00221 MHD__gnutls_num2cert_type (int num)
00222 {
00223 switch (num)
00224 {
00225 case 0:
00226 return MHD_GNUTLS_CRT_X509;
00227 default:
00228 return GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER;
00229 }
00230 }
00231
00232
00233
00234
00235 inline static int
00236 MHD__gnutls_cert_type2num (int cert_type)
00237 {
00238 switch (cert_type)
00239 {
00240 case MHD_GNUTLS_CRT_X509:
00241 return 0;
00242 default:
00243 return GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER;
00244 }
00245
00246 }