History

libsec: fix bugs in tls extension handling (thanks kemal)

cinap_lenrek committed 5 years ago

Commit dd00a151 parent e9853211 file · +14 −27Browse files

Unified · Split

libsec/tlshand.c+14−27
@@ -500,9 +500,7 @@ tlsClientExtensions(TLSconn *conn, int *plen) · 499 unmodified lines
500500 p = b = nil;
501501
502502 // RFC6066 - Server Name Identification
503− if(conn->serverName != nil){
504− n = strlen(conn->serverName);
505−
503+ if(conn->serverName != nil && (n = strlen(conn->serverName)) > 0){
506504 m = p - b;
507505 b = erealloc(b, m + 2+2+2+1+2+n);
508506 p = b + m;
@@ -655,37 +653,26 @@ checkClientExtensions(TlsConnection *c, Bytes *ext) · 146 unmodified lines
655653 uchar *p, *e;
656654 int i, j, n;
657655
658− p = ext->data;
659− e = p+ext->len;
660− while(p < e){
661− if(e-p < 2)
656+ if(ext == nil)
657+ return 0;
658+
659+ for(p = ext->data, e = p+ext->len; p < e; p += n){
660+ if(e-p < 4)
662661 goto Short;
663− switch(get16(p)){
664− case Extec:
665− p += 2;
666− n = get16(p);
667− if(e-p < n || n < 2)
662+ p += 4;
663+ if(e-p < (n = get16(p-2)))
664+ goto Short;
665+ switch(get16(p-4)){
666+ case Extec:
667+ if(n < 4 || n % 2 || get16(p) != (n -= 2))
668668 goto Short;
669669 p += 2;
670− n = get16(p);
671− p += 2;
672− if(e-p < n || n & 1 || n == 0)
673− goto Short;
674670 for(i = 0; i < nelem(namedcurves) && c->sec->nc == nil; i++)
675671 for(j = 0; j < n; j += 2)
676672 if(namedcurves[i].tlsid == get16(p+j)){
677673 c->sec->nc = &namedcurves[i];
678674 break;
679675 }
680− p += n;
681− break;
682− default:
683− p += 2;
684− n = get16(p);
685− p += 2;
686− if(e-p < n)
687− goto Short;
688− p += n;
689676 break;
690677 }
691678 }
@@ -1591,7 +1578,7 @@ msgRecv(TlsConnection *c, Msg *m) · 899 unmodified lines
15911578 nn = get16(p);
15921579 p += 2, n -= 2;
15931580
1594− if((nn & 1) || n < nn || nn < 2)
1581+ if(nn % 2 || n < nn || nn < 2)
15951582 goto Short;
15961583 m->u.clientHello.ciphers = newints(nn >> 1);
15971584 for(i = 0; i < nn; i += 2)
@@ -1680,7 +1667,7 @@ msgRecv(TlsConnection *c, Msg *m) · 82 unmodified lines
16801667 goto Short;
16811668 nn = get16(p);
16821669 p += 2, n -= 2;
1683− if(nn & 1)
1670+ if(nn % 2)
16841671 goto Short;
16851672 m->u.certificateRequest.sigalgs = newints(nn>>1);
16861673 for(i = 0; i < nn; i += 2)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t