/* The DTLS Generate Cookie callback * return : number of bytes copied into buf, or error */ int EmbedGenerateCookie(WOLFSSL* ssl, byte *buf, int sz, void *ctx) { WOLFSSL_DTLS_CTX* dtlsCtx = (WOLFSSL_DTLS_CTX*)ctx; struct sockaddr_storage peer; XSOCKLENT peerSz = sizeof(peer); byte digest[SHA_DIGEST_SIZE]; int ret = 0; (void)ssl; if (dtlsCtx == NULL || dtlsCtx->peer.sz == 0 || dtlsCtx->peer.sa == NULL) { WOLFSSL_MSG("Peer address was not set for this session"); return GEN_COOKIE_E; } /* Use peer's address as cookie. */ XMEMSET(&peer, 0, sizeof(peer)); XMEMCPY(&peer, dtlsCtx->peer.sa, dtlsCtx->peer.sz); ret = wc_ShaHash((byte*)&peer, peerSz, digest); if (ret != 0) { return ret; } if (sz > SHA_DIGEST_SIZE) { sz = SHA_DIGEST_SIZE; } XMEMCPY(buf, digest, sz); return sz; }
/* The DTLS Generate Cookie callback * return : number of bytes copied into buf, or error */ int EmbedGenerateCookie(WOLFSSL* ssl, byte *buf, int sz, void *ctx) { int sd = ssl->wfd; struct sockaddr_storage peer; XSOCKLENT peerSz = sizeof(peer); byte digest[SHA_DIGEST_SIZE]; int ret = 0; (void)ctx; XMEMSET(&peer, 0, sizeof(peer)); if (getpeername(sd, (struct sockaddr*)&peer, &peerSz) != 0) { WOLFSSL_MSG("getpeername failed in EmbedGenerateCookie"); return GEN_COOKIE_E; } ret = wc_ShaHash((byte*)&peer, peerSz, digest); if (ret != 0) return ret; if (sz > SHA_DIGEST_SIZE) sz = SHA_DIGEST_SIZE; XMEMCPY(buf, digest, sz); return sz; }
/* Generic Hashing Wrapper */ int wc_Hash(enum wc_HashType hash_type, const byte* data, word32 data_len, byte* hash, word32 hash_len) { int ret = HASH_TYPE_E; /* Default to hash type error */ word32 dig_size; /* Validate hash buffer size */ dig_size = wc_HashGetDigestSize(hash_type); if (hash_len < dig_size) { return BUFFER_E; } /* Suppress possible unused arg if all hashing is disabled */ (void)data; (void)data_len; (void)hash; (void)hash_len; switch(hash_type) { case WC_HASH_TYPE_MD5: #ifndef NO_MD5 ret = wc_Md5Hash(data, data_len, hash); #endif break; case WC_HASH_TYPE_SHA: #ifndef NO_SHA ret = wc_ShaHash(data, data_len, hash); #endif break; case WC_HASH_TYPE_SHA224: #ifdef WOLFSSL_SHA224 ret = wc_Sha224Hash(data, data_len, hash); #endif break; case WC_HASH_TYPE_SHA256: #ifndef NO_SHA256 ret = wc_Sha256Hash(data, data_len, hash); #endif break; case WC_HASH_TYPE_SHA384: #if defined(WOLFSSL_SHA512) && defined(WOLFSSL_SHA384) ret = wc_Sha384Hash(data, data_len, hash); #endif break; case WC_HASH_TYPE_SHA512: #ifdef WOLFSSL_SHA512 ret = wc_Sha512Hash(data, data_len, hash); #endif break; case WC_HASH_TYPE_MD5_SHA: #if !defined(NO_MD5) && !defined(NO_SHA) ret = wc_Md5Hash(data, data_len, hash); if (ret == 0) { ret = wc_ShaHash(data, data_len, &hash[MD5_DIGEST_SIZE]); } #endif break; /* Not Supported */ case WC_HASH_TYPE_MD2: case WC_HASH_TYPE_MD4: case WC_HASH_TYPE_NONE: default: ret = BAD_FUNC_ARG; break; } return ret; }
/* Generic Hashing Wrapper */ int wc_Hash(enum wc_HashType hash_type, const byte* data, word32 data_len, byte* hash, word32 hash_len) { int ret = BAD_FUNC_ARG; word32 dig_size; /* Validate hash buffer size */ dig_size = wc_HashGetDigestSize(hash_type); if (hash_len < dig_size) { return BUFFER_E; } /* Supress possible unused arg if all hashing is disabled */ (void)data; (void)data_len; (void)hash; (void)hash_len; switch(hash_type) { #ifndef NO_MD5 case WC_HASH_TYPE_MD5: ret = wc_Md5Hash(data, data_len, hash); break; #endif #ifndef NO_SHA case WC_HASH_TYPE_SHA: ret = wc_ShaHash(data, data_len, hash); break; #endif #ifndef NO_SHA256 case WC_HASH_TYPE_SHA256: ret = wc_Sha256Hash(data, data_len, hash); break; #endif #ifdef WOLFSSL_SHA512 #ifdef WOLFSSL_SHA384 case WC_HASH_TYPE_SHA384: ret = wc_Sha384Hash(data, data_len, hash); break; #endif /* WOLFSSL_SHA384 */ case WC_HASH_TYPE_SHA512: ret = wc_Sha512Hash(data, data_len, hash); break; #endif /* WOLFSSL_SHA512 */ /* Not Supported */ #ifdef WOLFSSL_MD2 case WC_HASH_TYPE_MD2: #endif #ifndef NO_MD4 case WC_HASH_TYPE_MD4: #endif case WC_HASH_TYPE_NONE: default: WOLFSSL_MSG("wc_Hash: Bad hash type"); ret = BAD_FUNC_ARG; break; } return ret; }