DTLS IPv6 Hello Cookie Update

1. Add support for IPv6 addresses when calculating DTLS Cookie.
2. Simplify cookie calculation.
This commit is contained in:
John Safranek
2013-06-26 11:21:36 -07:00
parent 0d0fc27e42
commit 29b32e582a

View File

@@ -454,11 +454,10 @@ int EmbedSendTo(CYASSL* ssl, char *buf, int sz, void *ctx)
int EmbedGenerateCookie(CYASSL* ssl, byte *buf, int sz, void *ctx) int EmbedGenerateCookie(CYASSL* ssl, byte *buf, int sz, void *ctx)
{ {
int sd = ssl->wfd; int sd = ssl->wfd;
struct sockaddr_in peer; struct sockaddr_in6 peer;
XSOCKLENT peerSz = sizeof(peer); XSOCKLENT peerSz = sizeof(peer);
byte cookieSrc[sizeof(struct in_addr) + sizeof(int)];
int cookieSrcSz = 0;
Sha sha; Sha sha;
byte digest[SHA_DIGEST_SIZE];
(void)ctx; (void)ctx;
@@ -467,28 +466,29 @@ int EmbedGenerateCookie(CYASSL* ssl, byte *buf, int sz, void *ctx)
return GEN_COOKIE_E; return GEN_COOKIE_E;
} }
if (peer.sin_family == AF_INET) {
struct sockaddr_in *s = (struct sockaddr_in*)&peer;
cookieSrcSz = sizeof(struct in_addr) + sizeof(s->sin_port);
XMEMCPY(cookieSrc, &s->sin_port, sizeof(s->sin_port));
XMEMCPY(cookieSrc + sizeof(s->sin_port),
&s->sin_addr, sizeof(struct in_addr));
}
InitSha(&sha); InitSha(&sha);
ShaUpdate(&sha, cookieSrc, cookieSrcSz);
if (sz < SHA_DIGEST_SIZE) { if (peer.sin6_family == AF_INET6) {
byte digest[SHA_DIGEST_SIZE]; ShaUpdate(&sha, (byte*)&peer.sin6_port, sizeof(peer.sin6_port));
ShaFinal(&sha, digest); ShaUpdate(&sha, (byte*)&peer.sin6_addr, sizeof(peer.sin6_addr));
XMEMCPY(buf, digest, sz); }
return sz; else if (peer.sin6_family == AF_INET) {
struct sockaddr_in *s = (struct sockaddr_in*)&peer;
ShaUpdate(&sha, (byte*)&s->sin_port, sizeof(s->sin_port));
ShaUpdate(&sha, (byte*)&s->sin_addr, sizeof(s->sin_addr));
}
else {
CYASSL_MSG("peer sin_family unknown type in EmbedGenerateCookie");
return GEN_COOKIE_E;
} }
ShaFinal(&sha, buf); ShaFinal(&sha, digest);
return SHA_DIGEST_SIZE; if (sz > SHA_DIGEST_SIZE)
sz = SHA_DIGEST_SIZE;
XMEMCPY(buf, digest, sz);
return sz;
} }
#endif /* CYASSL_DTLS */ #endif /* CYASSL_DTLS */