<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def crypto_sign(wallet_handle: int, signer_vk: str, msg: bytes) -> bytes: """ Signs a message with a key. Note to use DID keys with this function you can call indy_key_for_did to get key id (verkey) for specific DID. :param wallet_handle: wallet handler (created by open_wallet). :param signer_vk: id (verkey) of my key. The key must be created by calling create_key or create_and_store_my_did :param msg: a message to be signed :return: a signature string """


    logger = logging.getLogger(__name__)
    logger.debug("crypto_sign: >>> wallet_handle: %r, signer_vk: %r, msg: %r",
                 wallet_handle,
                 signer_vk,
                 msg)

    def transform_cb(arr_ptr: POINTER(c_uint8), arr_len: c_uint32):
        return bytes(arr_ptr[:arr_len]),

    if not hasattr(crypto_sign, "cb"):
        logger.debug("crypto_sign: Creating callback")
        crypto_sign.cb = create_cb(CFUNCTYPE(None, c_int32, c_int32, POINTER(c_uint8), c_uint32), transform_cb)

    c_wallet_handle = c_int32(wallet_handle)
    c_signer_vk = c_char_p(signer_vk.encode('utf-8'))
    c_msg_len = c_uint32(len(msg))

    signature = await do_call('indy_crypto_sign',
                              c_wallet_handle,
                              c_signer_vk,
                              msg,
                              c_msg_len,
                              crypto_sign.cb)

    logger.debug("crypto_sign: <<< res: %r", signature)
    return signature