Packs a message by encrypting the message and serializes it in a JWE-like format (Experimental)

    Note to use DID keys with this function you can call did.key_for_did to get key id (verkey)
    for specific DID.

    #Params
    command_handle: command handle to map callback to user context.
    wallet_handle: wallet handler (created by open_wallet)
    message: the message being sent as a string. If it's JSON formatted it should be converted to a string
    recipient_verkeys: a list of Strings which are recipient verkeys
    sender_verkey: the sender's verkey as a string. -> When None is passed in this parameter, anoncrypt mode is used

    returns an Agent Wire Message format as a byte array. See HIPE 0028 for detailed formats

async def pack_message(wallet_handle: int,
                       message: str,
                       recipient_verkeys: list,
                       sender_verkey: Optional[str]) -> bytes:
    """
    Packs a message by encrypting the message and serializes it in a JWE-like format (Experimental)

    Note to use DID keys with this function you can call did.key_for_did to get key id (verkey)
    for specific DID.

    #Params
    command_handle: command handle to map callback to user context.
    wallet_handle: wallet handler (created by open_wallet)
    message: the message being sent as a string. If it's JSON formatted it should be converted to a string
    recipient_verkeys: a list of Strings which are recipient verkeys
    sender_verkey: the sender's verkey as a string. -> When None is passed in this parameter, anoncrypt mode is used

    returns an Agent Wire Message format as a byte array. See HIPE 0028 for detailed formats
    """

    logger = logging.getLogger(__name__)
    logger.debug("pack_message: >>> wallet_handle: %r, message: %r, recipient_verkeys: %r, sender_verkey: %r",
                 wallet_handle,
                 message,
                 recipient_verkeys,
                 sender_verkey)

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

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

    c_wallet_handle = c_int32(wallet_handle)
    msg_bytes = message.encode("utf-8")
    c_msg_len = c_uint32(len(msg_bytes))
    c_recipient_verkeys = c_char_p(json.dumps(recipient_verkeys).encode('utf-8'))
    c_sender_vk = c_char_p(sender_verkey.encode('utf-8')) if sender_verkey is not None else None
    res = await do_call('indy_pack_message',
                        c_wallet_handle,
                        msg_bytes,
                        c_msg_len,
                        c_recipient_verkeys,
                        c_sender_vk,
                        pack_message.cb)
    logger.debug("pack_message: <<< res: %r", res)
    return res