diff options
author | Simon Josefsson <simon@josefsson.org> | 2007-02-21 16:00:12 +0000 |
---|---|---|
committer | Simon Josefsson <simon@josefsson.org> | 2007-02-21 16:00:12 +0000 |
commit | 37e3fede4aa509a7060b75d0c846a335293aca39 (patch) | |
tree | 8019fe03ab836b36d02f835c6ef522b1e67d2170 /lib/gnutls_supplemental.c | |
parent | 65f3630bd7a8270cd76c0cf72949301523f1cf0c (diff) | |
download | gnutls-37e3fede4aa509a7060b75d0c846a335293aca39.tar.gz |
Fill in type+length.
Diffstat (limited to 'lib/gnutls_supplemental.c')
-rw-r--r-- | lib/gnutls_supplemental.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/lib/gnutls_supplemental.c b/lib/gnutls_supplemental.c index 1983f316a1..a0b33351bc 100644 --- a/lib/gnutls_supplemental.c +++ b/lib/gnutls_supplemental.c @@ -50,6 +50,12 @@ #include "gnutls_errors.h" #include "gnutls_num.h" +typedef int (*supp_recv_func) (gnutls_session_t session, + const opaque *data, + size_t data_size); +typedef int (*supp_send_func) (gnutls_session_t session, + gnutls_buffer *buf); + typedef struct { const char *name; @@ -87,10 +93,9 @@ get_supp_func_recv (gnutls_supplemental_data_format_type_t type) } int -_gnutls_gen_supplemental (gnutls_session_t session) +_gnutls_gen_supplemental (gnutls_session_t session, gnutls_buffer *buf) { gnutls_supplemental_entry *p; - gnutls_buffer *buf = &session->security_parameters.extensions.supp_data; int ret; /* Make room for 3 byte length field. */ @@ -104,14 +109,34 @@ _gnutls_gen_supplemental (gnutls_session_t session) for(p = _gnutls_supplemental; p->name; p++) { supp_send_func supp_send = p->supp_send_func; + size_t sizepos = buf->length; int ret; - ret = supp_send (session); + /* Make room for supplement type and length byte length field. */ + ret = _gnutls_buffer_append (buf, "\0\0\0\0", 4); if (ret < 0) { gnutls_assert (); return ret; } + + ret = supp_send (session, buf); + if (ret < 0) + { + gnutls_assert (); + return ret; + } + + /* If data were added, store type+length, otherwise reset. */ + if (buf->length > sizepos + 4) + { + buf->data[sizepos] = 0; + buf->data[sizepos + 1] = p->type; + buf->data[sizepos + 2] = ((buf->length - sizepos - 4) >> 8) & 0xFF; + buf->data[sizepos + 3] = (buf->length - sizepos -4) & 0xFF; + } + else + buf->length -= 4; } buf->data[0] = ((buf->length - 3) << 16) & 0xFF; |