mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-08-03 20:54:41 +02:00
DTLS IPv6 Hello Cookie Update
1. Add support for IPv6 addresses when calculating DTLS Cookie. 2. Simplify cookie calculation.
This commit is contained in:
40
src/io.c
40
src/io.c
@@ -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 */
|
||||||
|
Reference in New Issue
Block a user