def _verify_multi(self, token, verifying_keys, num_required=None):
        headers, payload, raw_signatures, signing_inputs = _unpack_token_json(token)
        if num_required is None:
            num_required = len(raw_signatures)
        if num_required > len(verifying_keys):
            return False
        if len(headers) != len(raw_signatures):
            raise DecodeError('Header/signature mismatch')
        verifying_keys = [load_verifying_key(vk, self.crypto_backend) for vk in verifying_keys]
        for vk in verifying_keys:
            if vk.curve.name != verifying_keys[0].curve.name:
                raise DecodeError("TODO: only support using keys from one curve per JWT")
        der_signatures = [raw_to_der_signature(rs, verifying_keys[0].curve) for rs in raw_signatures]
        num_verified = 0
        for (signing_input, der_sig) in zip(signing_inputs, der_signatures):
            for vk in verifying_keys:
                verifier = self._get_verifier(vk, der_sig)
                verifier.update(signing_input)
                try:
                    verifier.verify()
                    num_verified += 1
                    verifying_keys.remove(vk)
                    break
                except InvalidSignature:
                    pass
            if num_verified >= num_required:
                break
        return (num_verified >= num_required)