int WPACKET_memcpy(WPACKET *pkt, const void *src, size_t len)
{
    unsigned char *dest;
    if (len == 0)
        return 1;
    if (!WPACKET_allocate_bytes(pkt, len, &dest))
        return 0;
    memcpy(dest, src, len);
    return 1;
}
['int tls13_derive_iv(SSL *s, const unsigned char *secret, unsigned char *iv,\n                    size_t ivlen)\n{\n    static const unsigned char ivlabel[] = "iv";\n    return tls13_hkdf_expand(s, secret, ivlabel, sizeof(ivlabel) - 1, NULL,\n                             iv, ivlen);\n}', 'static int tls13_hkdf_expand(SSL *s, const unsigned char *secret,\n                             const unsigned char *label, size_t labellen,\n                             const unsigned char *hash,\n                             unsigned char *out, size_t outlen)\n{\n    const unsigned char label_prefix[] = "TLS 1.3, ";\n    const EVP_MD *md = ssl_handshake_md(s);\n    EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, NULL);\n    int ret;\n    size_t hkdflabellen;\n    size_t hashlen;\n    unsigned char hkdflabel[sizeof(uint16_t) + sizeof(uint8_t) +\n                            + sizeof(label_prefix) + TLS13_MAX_LABEL_LEN\n                            + EVP_MAX_MD_SIZE];\n    WPACKET pkt;\n    if (pctx == NULL)\n        return 0;\n    hashlen = EVP_MD_size(md);\n    if (!WPACKET_init_static_len(&pkt, hkdflabel, sizeof(hkdflabel), 0)\n            || !WPACKET_put_bytes_u16(&pkt, outlen)\n            || !WPACKET_start_sub_packet_u8(&pkt)\n            || !WPACKET_memcpy(&pkt, label_prefix, sizeof(label_prefix) - 1)\n            || !WPACKET_memcpy(&pkt, label, labellen)\n            || !WPACKET_close(&pkt)\n            || !WPACKET_sub_memcpy_u8(&pkt, hash, (hash == NULL) ? 0 : hashlen)\n            || !WPACKET_get_total_written(&pkt, &hkdflabellen)\n            || !WPACKET_finish(&pkt)) {\n        WPACKET_cleanup(&pkt);\n        return 0;\n    }\n    ret = EVP_PKEY_derive_init(pctx) <= 0\n            || EVP_PKEY_CTX_hkdf_mode(pctx, EVP_PKEY_HKDEF_MODE_EXPAND_ONLY)\n               <= 0\n            || EVP_PKEY_CTX_set_hkdf_md(pctx, md) <= 0\n            || EVP_PKEY_CTX_set1_hkdf_key(pctx, secret, hashlen) <= 0\n            || EVP_PKEY_CTX_add1_hkdf_info(pctx, hkdflabel, hkdflabellen) <= 0\n            || EVP_PKEY_derive(pctx, out, &outlen) <= 0;\n    EVP_PKEY_CTX_free(pctx);\n    return ret == 0;\n}', 'int WPACKET_memcpy(WPACKET *pkt, const void *src, size_t len)\n{\n    unsigned char *dest;\n    if (len == 0)\n        return 1;\n    if (!WPACKET_allocate_bytes(pkt, len, &dest))\n        return 0;\n    memcpy(dest, src, len);\n    return 1;\n}', 'int WPACKET_allocate_bytes(WPACKET *pkt, size_t len, unsigned char **allocbytes)\n{\n    if (!WPACKET_reserve_bytes(pkt, len, allocbytes))\n        return 0;\n    pkt->written += len;\n    pkt->curr += len;\n    return 1;\n}', 'int WPACKET_reserve_bytes(WPACKET *pkt, size_t len, unsigned char **allocbytes)\n{\n    assert(pkt->subs != NULL && len != 0);\n    if (pkt->subs == NULL || len == 0)\n        return 0;\n    if (pkt->maxsize - pkt->written < len)\n        return 0;\n    if (pkt->staticbuf == NULL && (pkt->buf->length - pkt->written < len)) {\n        size_t newlen;\n        size_t reflen;\n        reflen = (len > pkt->buf->length) ? len : pkt->buf->length;\n        if (reflen > SIZE_MAX / 2) {\n            newlen = SIZE_MAX;\n        } else {\n            newlen = reflen * 2;\n            if (newlen < DEFAULT_BUF_SIZE)\n                newlen = DEFAULT_BUF_SIZE;\n        }\n        if (BUF_MEM_grow(pkt->buf, newlen) == 0)\n            return 0;\n    }\n    *allocbytes = GETBUF(pkt) + pkt->curr;\n    return 1;\n}']