update bcrypt binding
diff --git a/lib/ptlsbcrypt.c b/lib/ptlsbcrypt.c
index 2ffac7b..89da77d 100644
--- a/lib/ptlsbcrypt.c
+++ b/lib/ptlsbcrypt.c
@@ -476,13 +476,18 @@
     }
 }
 
-static void ptls_bcrypt_aead_xor_iv(ptls_aead_context_t *_ctx, const void *_bytes, size_t len)
+static void ptls_bcrypt_aead_get_iv(ptls_aead_context_t *_ctx, void *iv)
 {
     struct ptls_bcrypt_aead_context_t *ctx = (struct ptls_bcrypt_aead_context_t *)_ctx;
-    const uint8_t *bytes = _bytes;
 
-    for (size_t i = 0; i < len; ++i)
-        ctx->bctx.iv[i] ^= bytes[i];
+    memcpy(iv, ctx->bctx.iv, ctx->super.algo->iv_size);
+}
+
+static void ptls_bcrypt_aead_set_iv(ptls_aead_context_t *_ctx, const void *iv)
+{
+    struct ptls_bcrypt_aead_context_t *ctx = (struct ptls_bcrypt_aead_context_t *)_ctx;
+
+    memcpy(ctx->bctx.iv, iv, ctx->super.algo->iv_size);
 }
 
 static int ptls_bcrypt_aead_setup_crypto(ptls_aead_context_t *_ctx, int is_enc, const void *key, const void *iv,
@@ -539,7 +544,8 @@
         memcpy(ctx->bctx.iv_static, iv, ctx->super.algo->iv_size);
         if (is_enc) {
             ctx->super.dispose_crypto = ptls_bcrypt_aead_dispose_crypto;
-            ctx->super.do_xor_iv = ptls_bcrypt_aead_xor_iv;
+            ctx->super.do_get_iv = ptls_bcrypt_aead_get_iv;
+            ctx->super.do_set_iv = ptls_bcrypt_aead_set_iv;
             ctx->super.do_decrypt = NULL;
             ctx->super.do_encrypt_init = ptls_bcrypt_aead_do_encrypt_init;
             ctx->super.do_encrypt_update = ptls_bcrypt_aead_do_encrypt_update;