Abstract 1 Introduction 2 Preliminaries 3 Zero-knowledge Authenticators with Policy-privacy 4 An Equivocable Groth16 5 Obliviously Updateable Policy-privacy 6 Application: Private On-chain Authentication 7 Implementation and Evaluation References

Zero-Knowledge Authenticator for Blockchain: Policy-Private and Obliviously Updateable

Kostas Kryptos Chalkias ORCID Mysten Labs, Palo Alto, CA, USA Deepak Maram ORCID Mysten Labs, Palo Alto, CA, USA Arnab Roy ORCID Mysten Labs, Palo Alto, CA, USA Joy Wang ORCID Mysten Labs, Palo Alto, CA, USA Aayush Yadav ORCID George Mason University, Fairfax, VA, USA
Abstract

Transaction details and participant identities on the blockchain are often publicly exposed. In this work, we posit that blockchain’s transparency should not come at the cost of privacy. To that end, we introduce zero-knowledge authenticators (zkAt), a new cryptographic primitive for privacy-preserving authentication on public blockchains. zkAt utilizes zero-knowledge proofs to enable users to authenticate transactions, while keeping the underlying authentication policies private.

Prior solutions for such policy-private authentication required the use of threshold signatures, which can only hide the threshold access structure itself. In comparison, zkAt provides privacy for arbitrarily complex authentication policies, and offers a richer interface even within the threshold access structure by, for instance, allowing for the combination of signatures under distinct signature schemes.

In order to construct zkAt, we design a compiler that transforms the popular Groth16 non-interactive zero knowledge (NIZK) proof system into a NIZK with equivocable verification keys, a property that we define in this work. Then, for any zkAt constructed using proof systems with this new property, we show that all public information must be independent of the policy, thereby achieving policy-privacy.

Next, we give an extension of zkAt, called zkAt+ wherein, assuming a trusted authority, policies can be updated obliviously in the sense that a third-party learns no new information when a policy is updated by the policy issuer. We also give a theoretical construction for zkAt+ using recursive NIZKs, and explore the integration of zkAt into modern blockchains. Finally, to evaluate their feasibility, we implement both our schemes for a specific threshold access structure. Our findings show that zkAt achieves comparable performance to traditional threshold signatures, while also attaining privacy for significantly more complex policies with very little overhead.

Keywords and phrases:
Blockchain privacy, authentication schemes, threshold wallets, zero knowledge proofs
Copyright and License:
[Uncaptioned image] © Kostas Kryptos Chalkias, Deepak Maram, Arnab Roy, Joy Wang, and Aayush Yadav; licensed under Creative Commons License CC-BY 4.0
2012 ACM Subject Classification:
Security and privacy Cryptography
; Security and privacy Authentication ; Security and privacy Privacy-preserving protocols
Related Version:
Full Version: https://ia.cr/2025/921
Acknowledgements:
The authors thank Foteini Baldimtsi for her feedback on the manuscript.
Editors:
Zeta Avarikioti and Nicolas Christin

1 Introduction

Blockchain technology, with its decentralized architecture, offers a transparent and immutable ledger of transactions, fostering trust among participants without the need for centralized intermediaries. To authenticate a blockchain transaction, a user creates a digital signature on the transaction. If said signature verifies under the user’s signature verification key, then the transaction is permanently added to the blockchain by the validators.

This transparency, however, often comes at the cost of privacy, as transaction details, participant identities, and contract logic are exposed to public scrutiny on most blockchains. While there has been significant progress in enabling confidential transactions with privacy-preserving blockchains, such as Zcash and Monero, and mixing services [28, 20, 19, 30, 27], practical privacy concerns extend beyond just transaction details. For instance, public access to account authentication logic makes it easier for malicious actors to design targeted attacks. Consider, for example, threshold multi-signature [32], which is a popular authentication mechanism supported by most blockchains for protecting high-value transactions. In threshold multi-signature, n different signing keys are generated such that signatures under at least tn of those keys are needed to authorize a transaction. However, this reveals the access structure (n,t) giving critical information to attackers who learn exactly how many accounts they need to compromise.

In this work, we investigate approaches to conceal the account authentication logic (i.e., the policy) on smart-contract supporting public blockchains such as Ethereum, Solana, Aptos and Sui. A popular solution to hide the access structure is to enforce it off-chain with threshold signatures [17, 18] issued by a set of custodians or guardians. In such a threshold authenticator111An authenticator is simply an authentication mechanism which encodes a general access structure in the form of an authentication policy., a single key is secret-shared between n parties such that any t parties can generate partial signatures, and aggregate them into a complete signature. Crucially, this final signature looks identical to a signature generated by the original key. Thus, threshold authenticators hide the access structure (both t and n) and inherently obscure the identity of the signers within a group against blockchain transaction observers. This additional privacy makes them a preferable alternative to the aforementioned multi-signature authenticators, as noted by a recent user study [38].

The need for complex authentication policies.

Threshold-wallets (i.e., cryptographic wallets with authentication enforced via threshold signatures), however, do not support the broad range of authentication needs seen in practice. A recent example is that of account abstraction [43] which allows for programmable access to user accounts via smart contracts instead of relying exclusively on private keys. For one, threshold-wallets – by definition – only support a threshold access structure rather than arbitrary boolean formulae. It is also not possible to combine existing keys created under different signature schemes, so for instance, it is not possible to create a 1-out-of-2 access structure between an ECSDA and an EdDSA key under existing threshold signature schemes. Further, some implementations of threshold EdDSA wallets can inadvertently reveal that the wallet is a threshold-wallet rather than a single key222Many threshold EdDSA libraries introduce randomness in signatures on retries. So if different signatures for the same message are observed, it can reveal the use of a threshold-wallet [34].!

In practice, authentication policy designers may want to use transaction data to select an appropriate access structure so as to balance usability and security concerns. Which is to say that they might, for instance, want to use 2-out-of-3 keys for high-value transactions above a certain amount, and only 1-out-of-3 keys otherwise; or they might require authorization from a special administrator key for certain transactions. Rich contextual policies like these are commonly seen in smart-contract based authenticators [42, 3] (where the authentication policy is expressed in a smart contract) and off-chain authenticators [8, 24] (where the authentication policy is enforced off-chain by a trusted party). Finally, zero-knowledge proofs offer similarly complex authentication policies with some limited degree of privacy for the inputs to the policy, but not the policy itself [40].

To summarize, existing threshold authenticators offer some amount of privacy but only support very specific authentication policies. On the flip side, smart-contract authenticators leverage the rich language support to encode arbitrarily complex policies, but cannot hide the authentication policy; and zero-knowledge proofs offer only limited privacy but for general authentication policies. This is also summarized in Table 1 below.

This observation leads to the central question that motivates this work: can we build private authenticators that are capable of hiding arbitrarily complex policies?

Our results.

To address this question, we design a new class of authentication schemes to validate user transactions on the blockchain while hiding the underlying (authentication) policy. Since they leverage zero-knowledge proof systems as the core building block, we refer to these schemes as zero-knowledge authenticators (zkAt). We summarize our contributions below:

  1. (1)

    Formalizing zero-knowledge authenticators: we formalize the notion of zero-knowledge authenticators with policy-privacy for policies expressible as general 𝖭𝖯 statements. Specifically, the property of policy-privacy guarantees that an adversary learns nothing about the underlying policy besides its public inputs.

  2. (2)

    Constructing zero-knowledge authenticators: we give a practical construction for zkAt by building on the seminal work of Groth [29], known colloquially as simply “Groth16”. More precisely, we define the property of verification-key equivocation and show that non-interactive zero-knowledge proof systems (NIZK) with this property can be generically used to instantiate zkAt. Then, we modify the Groth16 construction so that it satisfies verification-key equivocation, thus yielding a zkAt.

  3. (3)

    Oblivious policy updates: once policy-privacy has been achieved, a second interesting question emerges: can policies be updated without leaking any new public information?

    As our third contribution, we resolve this question by introducing zkAt+, which extends our standard zkAt by additionally allowing for such oblivious policy updates. We also give a theoretical construction for zkAt+ using recursive NIZKs.

  4. (4)

    Demonstrating practicality: we implement both zkAt and zkAt+, and evaluate them against similar (but less expressive) threshold signatures. Our results demonstrate that zkAt offers comparable performance, even for more complex policy semantics, and as the underlying NIZK is a succinct argument of knowledge (zk-SNARK), the final proof size is independent of the policy.

Table 1: A comparison between authenticators. “Expressiveness” refers to whether complex policies can be specified. “Policy anonymity set” indicates the level of policy privacy achieved: None (no privacy), a pre-defined policy set (some privacy), all policies (full privacy).
Type Expressiveness
Policy
anonimity set
Oblivious updates
Multi-signature Limited None N/A
Threshold Limited Pre-defined N/A
Smart-contract Rich None N/A
Zero-knowledge Rich Pre-defined
zkAt Rich All
zkAt+ Rich All

1.1 Application overview

Our stated goal is to build a private authenticator for transactions on public blockchains. More precisely, we want to build an authenticator for arbitrarily complex policies, such that the underlying policy remains hidden from all parties that did not generate the policy and/or the proof. Before delving into the technical details, we explore two scenarios where zkAt can be applied.

  1. (1)

    Delegated transactions. High-level executives at an organization hold shared custody of the organizational finances in the form of a threshold-wallet. The board members of the organization vote on the policies required to authenticate transactions made with the wallet. They might, for instance, require an authentication policy stating that all “large” transactions initiated by the company must be signed by all the executives and at least 50% of the board. For privately-held organizations, it may be in their interest to keep such policies hidden from the public as an added layer of protection for the organizational funds.

  2. (2)

    Self-custody solutions. As another example, consider an individual user who wants to protect their assets using a policy that requires, for instance, the user’s valid JSON web tokens (JWT) issued by two-out-of-three OpenID providers (cf. [4] for a discussion on JWT and OpenID) the user has previously registered, in order to authenticate a transaction.

In both examples, zkAt makes it more challenging for attackers to mount a successful attack by hiding all information about the authentication logic and access structure. In particular, in the first example, not only do attackers external to the organization not know how many signatures are needed to authenticate a transaction, they do not even know whether this threshold varies by amount and, if so, what the amount is! Similarly, in the second example, the attackers don’t know which OpenID providers the user has registered and, by extension, which accounts they need to compromise.

Remark 1.1.

We wish to emphasize that, more generally, in the scenarios we envision, the authentication policies are hidden from the validators as well as other (public) third-parties. At first brush, this may seem counter-intuitive – how can a validator validate a transaction without knowing the underlying policy? Our claim is that there is no reason for the validator to know the policy at all! Whatever the policy may be, a validator’s only concern is to ensure that the transaction satisfies it, i.e., given the transaction as input, the verification algorithm accepts under the policy issuer’s verification key. Importantly, as both our examples illustrate, the policy issuer could be the user (prover) themselves, and it is in their interest to design strong authentication policies.

1.2 Technical overview

To illustrate our technical ideas, we will begin by first considering a simple approach where we only attempt to hide the user’s secret credentials.

A simple first approach.

The idea is to instantiate a general-purpose zero-knowledge proof system (such as [29, 25]) with the policy circuit as input to the setup. As a concrete example, to create a 1-out-of-2 multi-signature between two existing on-chain accounts while also hiding the identities of the two multi-signature participants, a user can proceed in the following manner:

  • Setup. Create commitments c1,c2 to two addresses, i.e., ci=𝖢𝗈𝗆𝗆𝗂𝗍(𝖺𝖽𝖽𝗋i;ri), where each address 𝖺𝖽𝖽𝗋i is a signature verification key for some signer. Create a designated-prover NIZK (DP-NIZK) proving key and (proof) verification key pair (𝗉𝗄,𝗏𝗄) for the policy 𝖯 given by the relation,

    {𝓍(c1,c2,𝗍𝗑𝗉𝖻),𝓌(𝖺𝖽𝖽𝗋,r,σ,𝗍𝗑𝗉𝗏):(c1=𝖢𝗈𝗆𝗆𝗂𝗍(𝖺𝖽𝖽𝗋;r)c2=𝖢𝗈𝗆𝗆𝗂𝗍(𝖺𝖽𝖽𝗋;r))𝖲𝗂𝗀.𝖵𝖾𝗋𝗂𝖿𝗒(𝖺𝖽𝖽𝗋,𝗍𝗑𝗉𝖻||𝗍𝗑𝗉𝗏,σ)=1},

    where 𝗍𝗑𝗉𝖻 (resp. 𝗍𝗑𝗉𝗏) is the public (resp. private) part of the transaction. The proof verification key 𝗏𝗄 acts as the user’s on-chain address.

  • Signing. Split the transaction into public and private components, as determined by the privacy requirements. Collect signature σ on the full transaction 𝗍𝗑𝗉𝖻||𝗍𝗑𝗉𝗏 from one of the two accounts 𝖺𝖽𝖽𝗋=𝖺𝖽𝖽𝗋1 or 𝖺𝖽𝖽𝗋=𝖺𝖽𝖽𝗋2. Generate a ZK proof π=𝖹𝖪.𝖯𝗋𝗈𝗏𝖾(𝗉𝗄,(c1,c2,𝗍𝗑𝗉𝖻),(𝖺𝖽𝖽𝗋,r,σ,𝗍𝗑𝗉𝗏)) proving that the policy is satisfied or, in other words, the signature verifies with one of the two addresses.

Thus the resulting signature is nothing but a zero-knowledge proof, and the privacy guarantee for the private inputs follows straightforwardly from the zero-knowledge property. Notably, the above sketch already permits more expressive policies than threshold signatures albeit without hiding the policy – the fact that 𝖯 is a 1-out-of-2 authentication policy is known to the public, however the actual addresses remain hidden thanks to the hiding property of the commitment (as long as r1 and r2 are secret), as do the private inputs to the circuit.

Next, in order to hide the policy itself, the most obvious solution would be to universalize the circuit. For example, we could make the circuit do n=𝗉𝗈𝗅𝗒(λ) signature verifications irrespective of the policy. This would allow policies that use up to n signatures to use the same circuit. In effect, the “policy anonymity set” consists of all policies that use up to n signatures. While this straw-man approach works to an extent, it results in poor signing performance (even if someone’s policy only uses O(1) signatures, they need to verify all n to generate the signature). Moreover, as policies become more expressive, the policy anonymity set grows exponentially (if there are m possible triggers, a universal circuit would have to verify all the 2m possibilities). Thus the signing overhead for our simple first approach scales proportionally to the size of the policy anonymity set, resulting in an unsatisfactory trade-off between privacy and performance.

Achieving efficient policy privacy.

In order to achieve policy-privacy without sacrificing performance, we must ask a more fundamental question about our sketch above (without the universalized circuit): assuming that the proving key is held privately by the user, do the verification key and proof reveal any non-trivial information about the policy?

A priori, it is not at all obvious whether a zkAt is directly constructible from any existing NIZK schemes. So, as a first step, we must formalize our, presently abstract, policy-privacy property. To that end, we define a new property for NIZK proof systems, which we call verification key equivocation (𝗏𝗄-equivocation). At a high level, in the 𝗏𝗄-equivocation experiment, an adversary – holding a proof verification key – must identify which of the two policies (of its choice) was an honest proof created with respect to, for a statement (also of its choice) that satisfies both policies. We find this to be a novel and practically useful property that, to the best of our knowledge, has not been previously considered in designated proof systems. The crucial observation is that if the underlying NIZK has equivocable verification keys, or in other words if the verification key is independent of the underlying relation (which encodes the policy), then a zkAt (instantiated according to our simple first approach) hides the policy since the proof is already zero-knowledge!

Our next task then is to develop such a proof system with 𝗏𝗄-equivocation. For this, we turn to the work of Groth [29], that describes a NIZK for quadratic arithmetic programs (QAPs) from pairing-based assumptions (cf. § 2.3 for a description of the scheme). In particular, we find that a simple modification to Groth16 is sufficient to achieve this property. At a high level, our main observation is that the only component linking the verification key to the underlying relation are the evaluations of the QAP polynomials at a random point x; and as it turns out, we can interpolate fresh polynomials that behave exactly as the original ones on the characteristic points (so that they describe the same arithmetic circuit), but additionally, also evaluate at x to a priori uniformly chosen values. These fresh polynomials now define an updated QAP. This essentially fixes the evaluation of the polynomials at x independently of the relation, and consequently the resulting verification key is made completely independent of the updated QAP. Most notably, this modification affects no change to the proof verification function, thus making it fully compatible with existing Groth16 verifiers!

The overall workflow for setting up zkAt keys should thus be:

  1. 1.

    Choose a policy and encode it into a circuit,

  2. 2.

    Run the modified Groth16 setup to generate the trapdoor, proving and verification keys,

  3. 3.

    Delete the trapdoor (as we explain shortly, if storing a sensitive secret is acceptable and oblivious policy updates are desired, then the trapdoor can be persisted); and

  4. 4.

    Store the proving key, and publish the verification key as the on-chain address.

Interestingly, unlike in most other use cases of Groth16, the presence of a trusted setup phase is not a problem. This is because it is in the interest of the user, who is the trusted setup generator, to delete the trapdoor safely as otherwise their account could be compromised.

Updating policies obliviously.

Policy issuers may want to be able to update their policies for any number of reasons, such as for operational reasons such as periodic key rotation. A trivial way to do this, of course, is to issue a fresh set of keys with respect to the new policy. However, recall that the verification key acts as the user’s on-chain address, and thus the trivial approach would require updating user addresses every time a policy is changed. It is therefore desirable to grant policy issuers the ability to update policies without having to change the verification keys. We call this feature oblivious updateability.

Interestingly, our Groth16-zkAt already achieves oblivious updateability in a limited sense – the idea is to retain the trapdoor for our modified proof system (in cold storage), so that new proving keys can be generated at will. Old policies and the corresponding proving keys can then be retired by adding a clause within the policy circuit to check that the current time is less than a fixed expiry time (this assumes that the current time is accessible as a public input, a feature commonly available on most blockchains).

However, persisting the trapdoor carries significantly more risk as a leaked trapdoor breaks security. Moreover, we only know our Groth16-zkAt to be securely updateable assuming that an attacker cannot access two different proving keys corresponding to the same verification key, but in situations such as oblivious policy updates, this is not necessarily the case – a user (prover) with two proving keys for the same verification key can learn non-trivial infomation about the trapdoor and possibly break soundness of the NIZK.

Maliciously-secure oblivious policy updates.

The upshot of this is that we must extend our zkAt definition so as to realize maliciously-secure policy updates in the strongest sense, i.e., one where the adversary is given access to an update oracle, which returns updated proving keys (corresponding to the same verification key) for policy updates of the adversary’s choice. We call the extended primitive that satisfies the stronger update security, zkAt+.

The main technical challenge in constructing a zkAt+ is to somehow fix the proof verification key across policy updates since it acts as the user’s on-chain address while securely updating the proving key. As we just explained, however, the Groth16-zkAt approach does not quite work, so we approach this problem from a new direction. As usual, during authentication, the user will still compute a proof πI that the transaction satisfies the underlying policy using a (not necessarily designated-prover) NIZK. The astute reader may observe that the user cannot send this proof in the clear, since it obviously contains information about the policy. Indeed, instead the user recursively composes this proof with another “outer” NIZK proof πO, essentially proving that it has a proof that the transaction satisfies the policy. Notably, as this outer NIZK has the same structure for any policy, there need only be a single global common reference string (CRS), 𝖼𝗋𝗌O that can be used to generate and verify outer proofs for all users.

Observe, also, that the policy can now be updated obliviously, since 𝖼𝗋𝗌O does not depend on any policy specific information. Unfortunately, this construction is incomplete, since there are no clear candidate public keys that could play the role of a user address. One might again be tempted to set the “inner” NIZK proof’s verification key as the user’s address, but remember that this is not possible if we want oblivious updates. Instead of a proof verification key acting as the user’s on-chain address, we let it be given by a signature verification key 𝗏𝗄, for a signing-verification key pair (𝗌𝗄,𝗏𝗄) generated by the user. Now, in addition to the inner proof πI, the user must additionally compute a signature σ on the inner proof’s CRS, 𝖼𝗋𝗌I, and then, in the outer proof, also prove that σ verifies under 𝗏𝗄. Thus, the public instance for the outer NIZK is the address 𝗏𝗄 along with any other public transaction data, and the private witness is 𝖼𝗋𝗌I, πI and σ.

In order to update a policy, the policy issuer simply computes a fresh 𝖼𝗋𝗌I for the new policy and signs it with its secret signing key 𝗌𝗄. Clearly, this reveals no information regarding the update on the chain. Moreover, this construction has maliciously-secure policy updates by soundness of the both NIZKs.

We remark that in applications where the policy issuers are distinct from the users (which, recall, need not always be the case) there does arise a subtle issue with this approach, namely that a user holding an older proving key can still authenticate with respect to that policy. This, however, is easily circumvented by having the policy issuer additionally sign an arbitrarily chosen tag that the user must prove belongs to a public set of currently accepted tags, and has the benefit of allowing policies to expire gracefully.

1.3 Related Work

Existing blockchain authentication methods.

Threshold [17, 18, 33, 6, 41, 2] and multi-signing [39, 9] are commonly used authentication mechanisms in blockchain settings. Our solution offers all the same benefits of threshold-based solutions such as privacy of signers, compact signatures while also capturing more complex policy semantics beyond the threshold. Moreover, with our zkAt, one can do this with pre-existing signing keys and without requiring any expensive distributed key-generation, a pre-requisite for threshold signatures. Smart-contract based authenticators [3, 42] (sometimes called account abstraction wallets [43]) are popular for their flexibility and security features, for example, account recovery, flexible policies for high-value transactions, ability to change policies over time. However, these offer no notion of privacy. Interestingly, zkAt can be used to turn any smart-contract based authenticator private.

Attribute-based authentication.

Another common authentication mechanism is based on user attributes satisfying certain pre-specified criteria [37, 35]. Indeed, this is nothing but a policy-based authentication mechanism with the important distinction that the authentication policy need not be private. Put another way, one may view zkAt as an extension of attribute-based authentication that offers stronger privacy guarantees for not just the user’s attributes, but also the constraints on those attributes.

Functional commitments.

A functional commitment scheme [36] enables a user to succinctly commit to a function (from a specified family), such that the user can later verifiably reveal values of the function at desired inputs. Such a commitment must be binding to the function and may additionally also hide [10] it. We observe that zkAt realizes a sort of function-private functional commitment scheme for functions with binary outputs, with 𝗏𝗄 being the commitment to the policy function. Perhaps for the first time, our equivocable Groth16 construction gives a functional commitment where the underlying function is updateable or equivocable (given the trapdoor) without changing the commitment.

2 Preliminaries

In this section, we provide preliminaries needed for this work.

Notation.

Let λ denote the security parameter, and ppt denote probabilistic polynomial-time. We use $ to denote the output of a randomized algorithm, to denote output of a deterministic algorithm, and for assignment. For our security definitions, we use notation similar to [29].

Following common convention we use lowercase bold-face letters to denote vectors and uppercase bold-face letters for matrices. For a vector 𝐱, xi denotes its ith element. In general 𝔾 denotes a group and 𝔽 a field. Let gi be the generator of a group 𝔾i, then we write gix for x𝔽 as [x]i and a[x]igiax, for some a𝔽. As usual, is the ring of integers and p is the ring of integers modulo p for some integer p>0. Finally, p[X] is the ring of polynomials with coefficients in p, and for any polynomial U(X)p[X] the notation deg(U) denotes its degree.

Bilinear pairings.

Let 𝔾1 and 𝔾2 be groups of the same prime order q with the generators g1,g2 respectively. Using the notation from [29], we denote the pairing map 𝔾1×𝔾2𝔾T as [a]1[b]2=[ab]T for any a,bq.

2.1 Cryptographic Building Blocks

We recall the definitions for some common cryptographic primitives that we use in our constructions.

2.1.1 Signature schemes

A signature scheme 𝖲𝗂𝗀 over message space consists of the following polynomial time algorithms:

  • 𝖲𝖾𝗍𝗎𝗉(1λ)(𝗏𝗄,𝗌𝗄)¯. is a randomized algorithm that takes security parameter λ as input and returns a pair of keys (𝗏𝗄,𝗌𝗄), where 𝗏𝗄 is the verification key and 𝗌𝗄 is the signing key.

  • 𝖲𝗂𝗀𝗇(𝗌𝗄,M)σ¯. is a possibly randomized algorithm that takes as input the signing key 𝗌𝗄, and a message M, and returns a signature σ.

  • 𝖵𝖾𝗋𝗂𝖿𝗒(𝗏𝗄,M,σ){0,1}¯. is a deterministic algorithm that takes as input the verification key 𝗏𝗄, a message M, and a signature σ. It outputs 1 (accept) or 0 (reject).

A signature scheme satisfies correctness if for all λ, M, and every signing-verification key pair (𝗏𝗄,𝗌𝗄)𝖲𝖾𝗍𝗎𝗉(1λ), every signature σ$𝖲𝗂𝗀𝗇(𝗌𝗄,M), 𝖵𝖾𝗋𝗂𝖿𝗒(𝗏𝗄,M,σ)=1.

Definition 2.1 (Existential unforgeability under chosen messages).

A signature scheme 𝖲𝗂𝗀=(𝖲𝖾𝗍𝗎𝗉,𝖲𝗂𝗀𝗇,𝖵𝖾𝗋𝗂𝖿𝗒) is existentially unforgeable under chosen messages if for every ppt attacker 𝒜 there exists a negligible function ϵ() such that for all λ the following probability is at most ϵ(λ)

Pr[𝖵𝖾𝗋𝗂𝖿𝗒(𝗏𝗄,M,σ)=1:(𝗏𝗄,𝗌𝗄)$𝖲𝖾𝗍𝗎𝗉(1λ)(M,σ)𝒜𝒪𝗌𝗄(𝗏𝗄)]

and 𝒜 should never have queried M to the signing oracle, 𝒪𝗌𝗄().

2.1.2 Non-interactive zero-knowledge

Let 𝖢λ{𝖢:{0,1}𝗉𝗈𝗅𝗒(λ){0,1}} be a family of boolean circuits computable in polynomial time. Then, a non-interactive proof system for a circuit 𝖢λ consists of the following polynomial time algorithms:

  • 𝖲𝖾𝗍𝗎𝗉(1λ,𝖢)(𝖼𝗋𝗌,τ)¯. The setup algorithm takes as input the security parameter λ and a circuit 𝖢, and outputs a common reference string 𝖼𝗋𝗌 and a trapdoor τ.

  • 𝖯𝗋𝗈𝗏𝖾(𝖼𝗋𝗌,x,w)π¯. The prover algorithm takes as input a 𝖼𝗋𝗌, an instance x, and a witness w. It outputs a proof π.

  • 𝖵𝖾𝗋𝗂𝖿𝗒(𝖼𝗋𝗌,x,π)0/1¯. The verification algorithm takes as input a 𝖼𝗋𝗌, an instance x, and a proof π. It outputs 1 (accept) or 0 (reject).

Definition 2.2 (Non-interactive zero-knowledge).

Given a circuit 𝖢, a NIZK proof system for an 𝖭𝖯 relation ={(x,w):𝖢(x||w)=1} must satisfy the following properties:

  • Completeness: For every λ, and every crs computed as (𝖼𝗋𝗌,τ)$𝖲𝖾𝗍𝗎𝗉(1λ,𝖢), any instance and witness pair (x,w),

    Pr[𝖵𝖾𝗋𝗂𝖿𝗒(𝖼𝗋𝗌,x,π)=1:π$𝖯𝗋𝗈𝗏𝖾(𝖼𝗋𝗌,x,w)]=1.
  • Soundness: For every ppt adversary 𝒜, there exists a negligible function ϵ() such that for all λ the following probability is at most ϵ(λ),

    Pr[𝖵𝖾𝗋𝗂𝖿𝗒(𝖼𝗋𝗌,x,π)=1x:(𝖼𝗋𝗌,τ)$𝖲𝖾𝗍𝗎𝗉(1λ,𝖢)(x,π)𝒜(𝖼𝗋𝗌)]

    where is the language specified by .

  • Zero-knowledge: There exists a ppt simulator 𝒮=(𝒮1,𝒮2) for every adversary 𝒜 and such that there is a negligible function ϵ() such that for every λ and every (x,w) the following probability is at most ϵ(λ),
    |Pr[𝒜(𝖼𝗋𝗌,x,π)=1:(𝖼𝗋𝗌,τ)$𝖲𝖾𝗍𝗎𝗉(1λ,𝖢)π$𝖯𝗋𝗈𝗏𝖾(𝖼𝗋𝗌,x,w)]Pr[𝒜(𝖼𝗋𝗌,x,π)=1:(𝖼𝗋𝗌,τ)𝒮1(1λ,𝖢)π𝒮2(τ,x)]|

Argument of Knowledge.

Further, a NIZK proof system is an argument of knowledge if it satisfies the following additional property:

  • (Computational) Knowledge soundness: For every ppt adversary 𝒜 there exists a ppt extractor and a negligible function ϵ(), such that for all λ the following probability is at most ϵ(λ),

    Pr[𝖵𝖾𝗋𝗂𝖿𝗒(𝖼𝗋𝗌,x,π)=1(x,w):(𝖼𝗋𝗌,τ)$𝖲𝖾𝗍𝗎𝗉(1λ,𝖢)((x,π);w)(𝒜||)(𝖼𝗋𝗌)]

    where the notation ((x,π);w)(𝒜||)(𝖼𝗋𝗌), taken from [29], is shorthand for (x,π)𝒜(𝖼𝗋𝗌) and w(x,π) such that and gets access to 𝒜’s code.

Designated-prover NIZK.

A (publicly verifiable) designated-prover NIZK scheme (DP-NIZK) for a circuit 𝖢 consists of the following polynomial time algorithms:

  • 𝖲𝖾𝗍𝗎𝗉(1λ,𝖢)(𝗏𝗄,𝗉𝗄,τ)¯. The setup algorithm takes as input the security parameter λ and a boolean circuit 𝖢, and outputs a verification key 𝗏𝗄, a proving key 𝗉𝗄 and a trapdoor τ.

  • 𝖯𝗋𝗈𝗏𝖾(𝗉𝗄,x,w)π¯. The prover algorithm takes as input the proving key 𝗉𝗄, an instance x, and a witness w. It outputs a proof π.

  • 𝖵𝖾𝗋𝗂𝖿𝗒(𝗏𝗄,x,π)0/1¯. The verification algorithm takes as input a verification key 𝗏𝗄, an instance x, and a proof π. It outputs 1 (accept) or 0 (reject).

A DP-NIZK scheme must further satisfy the same properties as described in Definition 2.2 with the 𝖼𝗋𝗌 appropriately replaced by 𝗉𝗄 and 𝗏𝗄.

2.2 Quadratic arithmetic programs

A quadratic arithmetic program (QAP) comprises of a finite field p for some prime p with |p|=λ, integers m, and polynomials {Ui(X),Vi(X),Wi(X)}i=0m and T(X) in p[X] with deg(Ui),deg(Vi),deg(Wi)<deg(T)=n (for all i[0,m]) such that, for a01, it defines the following relation

{x(ai)i[0,]pw(ai)i[+1,m]pm:i=0maiUi(X)i=0maiVi(X)=i=0maiWi(X)modT(X)}

In this work, we consider proof systems for satisfiability of general arithmetic circuits, which consist of addition and multiplication gates over the finite field p. Gennaro, et al. [26] gave an efficient technique for converting any arithmetic circuit into a QAP, thus allowing us to prove statements encoded as general arithmetic circuits using Groth16.

2.3 Recalling Groth16

Since it will be essential to one of our constructions, we now recall the Groth’s NIZK argument for QAPs (and therefore for any arithmetic circuit).

Now, for some prime p such that |p|=λ, groups 𝔾1=g1 and 𝔾2=g2 and 𝔾T such that the pairing 𝖾:𝔾1×𝔾2𝔾T is a bilinear map. Consider a QAP,

={p,𝔾1,𝔾2,𝔾T,𝖾,g1,g2,,{Ui(X),Vi(X),Wi(X)}i=0m,T(X)},

that defines a field p and a language of statements (a1,,a)p and witnesses (a+1,,am)pm such that for a0=1, polynomials {Ui(X),Vi(X),Wi(X)}i=0m and T(X) in p[X] with deg(Ui),deg(Vi),deg(Wi)<deg(T)=n (for all i[0,m]) and T(X)i=1n(Xri) for all distinct rip, the following holds

i=0maiUi(X)i=0maiVi(X)i=0maiWi(X)=H(X)T(X)

for some degree (n2) polynomial H(X)p[X]. Then, the Groth16 NIZK argument is given by the following algorithms:

  • Setup. The setup algorithm accepts the QAP as input, sets the secret trapdoor τ(α,β,γ,δ,x) for α,β,γ,δ,x$p, and outputs it along with the verifier key 𝗏𝗄 and the prover key 𝗉𝗄 where

    𝗏𝗄([α]1,[β]2,[γ]2,[δ]2,{[χi]1[βUi(x)+αVi(x)+Wi(x)γ]1}i=0),
    𝗉𝗄([α]1,[β]1,[β]2,[δ]1,[δ]2,{[θj]1[xjT(x)δ]1}j=0n2{[ψi]1[Ui(x)]1}i=0m,{[φi]2[Vi(x)]2}i=0m,{[ζi]1[βUi(x)+αVi(x)+Wi(x)δ]1}i=+1m).
  • Prove. The proving algorithm samples r,sp and, using the instance and witness (a1,,a,a+1,,am)pm, sets the polynomial

    H(X)i=0maiUi(X)i=0maiVi(X)i=0maiWi(X)T(X).

    It then computes

    π([A]1[α]1+r[δ]1+i=0mai[ψi]1,[B]2[β]2+s[δ]2+i=0mai[φi]2,[C]1(s[α]1+r[β]1+rs[δ]1+i=+1mai[ζi]1+j=0n2hj[θj]1)) (4)

    given the 𝗉𝗄, and outputs π as the proof.

  • Verify. Given the 𝗏𝗄, the instance (a1,,a)p and a proof π([A]1,[B]2,[C]1), the verifier simply checks whether:

    [A]1[B]2=?[α]1[β]2+[C]1[δ]2+(i=0ai[χi]1)[γ]2

    and outputs the result.

3 Zero-knowledge Authenticators with Policy-privacy

We now formalize the notion of a zero-knowledge authenticator for a family of authentication policies and construct such an authenticator under a mild assumption that the underlying NIZK has equivocable (verification) keys, a property which we also define.

3.1 Zero-knowledge authenticator

We define a zero-knowledge authenticator for a family of authentication policies. As mentioned in the introduction, a zkAt can easily capture low-level semantics of an authentication mechanism as a (polynomial-size) circuit.

Let Π={fλ:{0,1}𝗉𝗈𝗅𝗒(λ){0,1}} be a family of authentication policies, then a zero-knowledge authenticator for any policy 𝖯Π over the message space and private input space Ω consists of the following polynomial time algorithms:

  • 𝖲𝖾𝗍𝗎𝗉(1λ,𝖯)(𝗏𝗄𝖯,𝗉𝗄𝖯)¯. The setup algorithm takes as input the security parameter λ and the authentication policy 𝖯. It outputs a public verification key 𝗏𝗄𝖯 and a secret proving key333We can assume that 𝗉𝗄𝖯 also implicitly contains 𝖯. 𝗉𝗄𝖯.

  • 𝖠𝗎𝗍𝗁𝖯𝗋𝗈𝗏𝖾(𝗉𝗄𝖯,M,ω)π/¯. The proving algorithm takes as input the secret key 𝗉𝗄𝖯, a message M to be signed and some private input ωΩ. It outputs a proof π or .

  • 𝖠𝗎𝗍𝗁𝖵𝖿𝗒(𝗏𝗄𝖯,M,π){0,1}¯. The verification algorithm takes as input the public verification key 𝗏𝗄𝖯, a message M, and a proof π. It outputs 0 or 1.

Definition 3.1 (Zero-knowledge Authenticator).

A zero-knowledge authenticator must satisfy the following properties with respect to any policy 𝖯Π:

  • Completeness: For every message M and for every string ωΩ such that 𝖯(M||ω)=1,

    Pr[𝖠𝗎𝗍𝗁𝖵𝖿𝗒(𝗏𝗄𝖯,M,π)=1:(𝗏𝗄𝖯,𝗉𝗄𝖯)$𝖲𝖾𝗍𝗎𝗉(1λ,𝖯)π$𝖠𝗎𝗍𝗁𝖯𝗋𝗈𝗏𝖾(𝗉𝗄𝖯,M,ω)]=1
  • Knowledge soundness: For every ppt adversary 𝒜 there exists a ppt extractor and a negligible function ϵ() satisfying, for all λ the following probability is at most ϵ(λ)

    Pr[𝖠𝗎𝗍𝗁𝖵𝖿𝗒(𝗏𝗄𝖯,M,π)=1𝖯(M||ω)1:(𝗏𝗄𝖯,𝗉𝗄𝖯)$𝖲𝖾𝗍𝗎𝗉(1λ,𝖯)((M,π);ω)(𝒜||)(𝗏𝗄𝖯,𝗉𝗄𝖯)]
  • (Perfect) zero-knowledge: There exists a ppt simulator 𝒮=(𝒮1,𝒮2) such that for every ppt adversary 𝒜, every λ, every M and every string ωΩ such that 𝖯(M||ω)=1,

    Pr[𝒜(𝗏𝗄𝖯,M,π)=1:(𝗏𝗄𝖯,𝗉𝗄𝖯)$𝖲𝖾𝗍𝗎𝗉(1λ,𝖯)π$𝖠𝗎𝗍𝗁𝖯𝗋𝗈𝗏𝖾(𝗉𝗄𝖯,M,ω)]=
    Pr[𝒜(𝗏𝗄𝖯,M,π)=1:(𝗏𝗄𝖯,𝗉𝗄𝖯,τ)𝒮1(1λ,𝖯)π𝒮2(τ,M)]
  • Policy privacy: For every stateful ppt adversary 𝒜, there is a negligible function ϵ() such that the following probability is at most 1/2+ϵ(λ)

    Pr[b^{0,1}:𝖯b^(M||ωb^)=1𝒜(π)=b:{0,1}$b𝖯0,𝖯1𝒜(1λ)(𝗏𝗄𝖯b,𝗉𝗄𝖯b)$𝖲𝖾𝗍𝗎𝗉(1λ,𝖯b)(M,ω0,ω1)𝒜(𝗏𝗄𝖯b)π$𝖠𝗎𝗍𝗁𝖯𝗋𝗈𝗏𝖾(𝗉𝗄𝖯b,M,ωb)]

Before giving a formal construction, we must define a new object called designated-prover NIZK schemes (DP-NIZK) with equivocable verification keys. At a high level, the property of verification-key equivocation guarantees that the verification key of a DP-NIZK scheme is independent of its circuit. Looking ahead to our construction, when instantiated with a DP-NIZK with this property, we will be able to reduce the policy privacy of our zkAt to the verification key equivocation of the DP-NIZK.

3.1.1 Verification-key equivocation

Informally, the 𝗏𝗄-equivocation game models and adversary who, given a verification key and a proof for a statement in languages specified by both circuits of its choice, must decide which of the said circuits does the key (and proof) correspond to.

Definition 3.2 (𝗏𝗄-equivocation).

A publicly verifiable DP-NIZK scheme has equivocable verification keys if for every stateful ppt adversary 𝒜, there is a negligible function ϵ() such that the following probability is at most 12+ϵ(λ),

Pr[b^{0,1}:𝖢b^(x||wb^)=1𝒜(π)=b:{0,1}$b𝖢0,𝖢1𝒜(1λ)(𝗏𝗄b,𝗉𝗄b)$𝖲𝖾𝗍𝗎𝗉(1λ,𝖢b)(x,w0,w1)𝒜(𝗏𝗄b)π$𝖯𝗋𝗈𝗏𝖾(𝗉𝗄b,x,wb)]

where each circuit 𝖢b encodes an 𝖭𝖯 relation b={(x,w):𝖢b(x||w)=1}

3.2 Construction

We now provide our construction. It requires a publicly-verifiable DP-NIZK scheme with 𝗏𝗄-equivocation 𝖭𝖨𝖹𝖪=(𝖭𝖨𝖹𝖪.𝖲𝖾𝗍𝗎𝗉,𝖭𝖨𝖹𝖪.𝖯𝗋𝗈𝗏𝖾,𝖭𝖨𝖹𝖪.𝖵𝖾𝗋𝗂𝖿𝗒) for the relation 𝖯={(x,w):𝖯(x||w)=1}.

  • 𝖲𝖾𝗍𝗎𝗉(1λ,𝖯)(𝗏𝗄𝖯,𝗉𝗄𝖯)¯. Give the security parameter λ and the policy 𝖯 as input, the setup algorithm runs the NIZK setup to obtain the verification and the prover keys, i.e., (𝗏𝗄𝗓𝗄,𝗉𝗄𝗓𝗄)$𝖭𝖨𝖹𝖪.𝖲𝖾𝗍𝗎𝗉(1λ,𝖯). It then outputs 𝗏𝗄𝖯𝗏𝗄𝗓𝗄, and 𝗉𝗄𝖯𝗉𝗄𝗓𝗄.

  • 𝖠𝗎𝗍𝗁𝖯𝗋𝗈𝗏𝖾(𝗉𝗄𝖯,M,ω)π/¯. It parses 𝗉𝗄𝖯 to obtain 𝗉𝗄𝗓𝗄 and then computes the proof π$𝖭𝖨𝖹𝖪.𝖯𝗋𝗈𝗏𝖾(𝗉𝗄𝗓𝗄,xM,wω) and outputs it.

  • 𝖠𝗎𝗍𝗁𝖵𝖿𝗒(𝗏𝗄𝖯,M,π){0,1}¯. It returns the output of 𝖭𝖨𝖹𝖪.𝖵𝖾𝗋𝗂𝖿𝗒(𝗏𝗄𝖯,M,π).

Security.

We claim that the above construction is a zkAt. The knowledge soundness and zero-knowledge properties of zkAt follow directly from the underlying DP-NIZK so we only focus on policy privacy, which we claim follows when the DP-NIZK proof has equivocable verification keys. The formal theorem statement and proof are presented in the full version of this article [14].

4 An Equivocable Groth16

In Section 3.1.1 we defined proofs with equivocable verification keys that are required to instantiate our zkAt construction. We now explain how to concretely build this primitive from the DP-NIZK of Groth [29].

A crucial observation towards achieving policy-privacy is that the Groth16 verification key can be equivocated – in the sense that one can perform the Groth16 setup in a way that guarantees that 𝗏𝗄 can be sampled independently of the relation. We give a bootstrapping compiler to build an equivocable Groth16 scheme given the non-equivocable version.

Now, for some prime p such that |p|=λ, groups 𝔾1=g1 and 𝔾2=g2 and 𝔾T such that the pairing 𝖾:𝔾1×𝔾2𝔾T is a bilinear map, consider a QAP,

={p,𝔾1,𝔾2,𝔾T,𝖾,g1,g2,,{Ui(X),Vi(X),Wi(X)}i=0m,T(X)}, (5)

that defines a field p and a language of statements (a1,,a)p and witnesses (a+1,,am)pm such that for a0=1, polynomials {Ui(X),Vi(X),Wi(X)}i=0m and T(X) in p[X] with deg(Ui),deg(Vi),deg(Wi)<deg(T)=n (for all i[0,m]) and T(X)i=1n(Xri) for all distinct rip, the following holds

i=0maiUi(X)i=0maiVi(X)i=0maiWi(X)=H(X)T(X)

for some degree (n2) polynomial H(X)p[X]. Then, we have the following constructive procedure:

  1. 1.

    Sample x,{yU,i}i=0m,{yV,i}i=0m,{yW,i}i=0m$p.

  2. 2.

    For every symbol S{U,V,W} and for every i[0,m] interpolate the polynomial S~i(X)p[X] over coordinates

    S~i(x)=yS,i and j[n]:S~i(rj)=Si(rj)=Si,j.

Given this, we claim that the modified QAP:

~={p,𝔾1,𝔾2,𝔾T,𝖾,g1,g2,,{U~i(X),V~i(X),W~i(X)}i=0m,T(X)} (6)

defines the same relation as . Formally,

Lemma 4.1.

T(X) divides i=0maiU~i(X)i=0maiV~i(X)i=0maiW~i(X) if and only if (a1,,am) is a satisfying assignment for .

Please refer to the full version of this article [14] for the proof of this lemma.

In short, by interpolating fresh polynomials {U~i,V~i,W~i}i that behave exactly as {Ui,Vi,Wi}i (respectively, for each i), but also evaluate at x to uniformly chosen values {yU,i,yV,i,yW,i}i (respectively, for each i), we have essentially fixed the evaluation of the polynomials at x independently of the relation. The result is that the verification key generated during setup will now be made completely independent of the updated QAP which, as we have just shown, defines the same relation as the original QAP. Accordingly, let us now define the modified setup algorithm (prove and verify algorithms do not change):

  • Setup. The setup algorithm accepts a QAP as explained by (5), sets the secret trapdoor τ(α,β,γ,δ,x,{yU,i}i=0m,{yV,i}i=0m,{yW,i}i=0m) for all values in τ sampled uniformly from p, and outputs it along with the verifier key 𝗏𝗄 and the prover key (𝗉𝗄,~) where ~ is of the form described in (6) and,

    𝗏𝗄([α]1,[β]2,[γ]2,[δ]2,{[χi]1[βyU,i+αyV,i+yW,iγ]1}i=0),
    𝗉𝗄([α]1,[β]1,[β]2,[δ]1,[δ]2,{[θj]1[xjT(x)δ]1}j=0n2{[ψi]1[yU,i]1}i=0m,{[φi]2[yV,i]2}i=0m,{[ζi]1[βyU,i+αyV,i+yW,iδ]1}i=+1m).
Security.

The main theorem for this construction states that it is a NIZK proof system with 𝗏𝗄-equivocation. In addition, completeness and zero-knowledge follow straightforwardly, so we only show that this construction is also knowledge-sound. This is described and proven formally in the full version of this article [14].

5 Obliviously Updateable Policy-privacy

In this section, we introduce zkAt with oblivious updates wherein, given a 𝗉𝗄𝖯 with respect to an existing policy 𝖯Π, a policy issuer can update 𝗉𝗄𝖯 to 𝗉𝗄𝖯 for some new policy 𝖯Π without updating the corresponding 𝗏𝗄𝖯. Following the formal definition, we give a generic construction for zkAt using recursive NIZKs.
An obliviously updateable zkAt, that we call zkAt+, additionally consists of the following polynomial time algorithms:

  • 𝖦𝖾𝗇(1λ)𝗉𝗉¯. The parameter generation algorithm as input the security parameter λ, and outputs public parameters 𝗉𝗉 for the protocol. All algorithms of zkAt+ take 𝗉𝗉 as input, but we omit it for brevity. This algorithm is run once and for all.

  • 𝖲𝖾𝗍𝗎𝗉(1λ,𝖯)(𝗏𝗄𝖯,𝗉𝗄𝖯,κ)¯. The setup algorithm takes as input the security parameter λ and the authentication policy 𝖯. It outputs a public verification key 𝗏𝗄𝖯, a secret proving key 𝗉𝗄𝖯 and a secret update key κ.

  • 𝖯𝗈𝗅𝖴𝗉𝖽𝖺𝗍𝖾(𝗉𝗄𝖯,κ,𝖯)𝗉𝗄𝖯/¯. The policy update algorithm takes as input the secret proving key 𝗉𝗄𝖯, a secret update key κ, and an updated policy 𝖯. It outputs the updated secret proving key 𝗉𝗄𝖯.

Definition 5.1 (Obliviously updateable Policy-private Zero-knowledge Authenticator).

A zkAt+ must additionally satisfy the following properties for policies 𝖯,𝖯Π,

  • Update completeness: For every message M and for every string ωΩ such that 𝖯(M||ω)=1, we must have that

    Pr[𝖠𝗎𝗍𝗁𝖵𝖿𝗒(𝗏𝗄𝖯,M,π)=1:𝗉𝗉$𝖦𝖾𝗇(1λ)(𝗏𝗄𝖯,𝗉𝗄𝖯,κ)$𝖲𝖾𝗍𝗎𝗉(1λ,𝖯)𝗉𝗄𝖯$𝖯𝗈𝗅𝖴𝗉𝖽𝖺𝗍𝖾(𝗉𝗄𝖯,𝖯)π$𝖠𝗎𝗍𝗁𝖯𝗋𝗈𝗏𝖾(𝗉𝗄𝖯,M,ω)]=1
  • Update knowledge soundness: For every ppt adversary 𝒜 there exists a ppt extractor and a negligible function ϵ(), for all λ such that the following probability is at most ϵ(λ),

    Pr[𝖠𝗎𝗍𝗁𝖵𝖿𝗒(𝗏𝗄𝖯,M,π)=1𝖯Q𝖯:𝖯(M||ω)1:𝗉𝗉𝖦𝖾𝗇(1λ)𝖯𝒜(𝗉𝗉)(𝗏𝗄𝖯,𝗉𝗄𝖯,κ)$𝖲𝖾𝗍𝗎𝗉(1λ,𝖯)((M,π);ω)(𝒜𝒪κ||)(𝗉𝗉)]

    where the oracle 𝒪κ() takes as input an updated policy 𝖯(i)Π in its ith-query. It adds 𝖯(i) to the set Q𝖯 (initially set to {𝖯}) and outputs the signing key 𝗉𝗄𝖯(i) under 𝖯(i) by running 𝖯𝗈𝗅𝖴𝗉𝖽𝖺𝗍𝖾(𝗉𝗄𝖯,κ,𝖯(i)).

Remark 5.2.

Since the verification key 𝗏𝗄𝖯 is independent of the policy updates, the view of the policy privacy adversary remains unaltered from that in Definition 3.1. So, policy privacy is actually implicit in the definition.

5.1 Construction

In this section, we describe our generic zkAt+ construction for disjunctive policy updates, which we explain next.

Disjunctive policy updates.

Let 𝖯Π be an existing policy. Then, an update 𝖯Π is a disjunctive update if and only if 𝖯 is a disjunction of 𝖯 with some other valid policy. Thus, for each 𝖯Π, we can define the predicate 𝖠𝖽𝗆𝖯(𝖯)=1𝖯{𝖯f:fΠ}.

Barring the trivial idea of re-running the setup and distributing fresh keys under the new policy, obliviously performing general policy updates, which is to say non-disjunctive updates, appears to be somewhat challenging. This is because it would require a way to revoke a proving key under an older policy without also revoking the corresponding verification key. Nevertheless, as we explain show in the full version of this article [14], allowing the older proving key to expire via a simple tagging mechanism suffices for general policy updates with only minor generic modification to the overall construction.

At a high level, our zkAt+ construction, recursively composes NIZK proofs with the “inner” proof corresponding to the policy predicate, and the “outer” proof to the knowledge of a valid proof to the policy predicate as well as a signature on the inner verification key for soundness. Thus a verifier simply verifies this outer proof and is convinced of the user’s authenticity. Like in our Groth16-zkAt construction, our zkAt+ construction also requires maintaining a sensitive secret κ that gets used whenever the policies need to be updated, so that when a new policy is created, the issuer simply issues a fresh signature on the new inner verification key (using κ). Importantly, no change is made to the outer keys so that all third parties remain unaware of the update.

Tools required.

The construction below utilizes a signature scheme 𝖲𝗂𝗀=(𝖲𝗂𝗀.𝖲𝖾𝗍𝗎𝗉,𝖲𝗂𝗀.𝖲𝗂𝗀𝗇,𝖲𝗂𝗀.𝖵𝖾𝗋𝗂𝖿𝗒), an inner NIZKAoK scheme 𝖭𝖨𝖹𝖪I=(𝖭𝖨𝖹𝖪I.𝖲𝖾𝗍𝗎𝗉,𝖭𝖨𝖹𝖪I.𝖯𝗋𝗈𝗏𝖾,𝖭𝖨𝖹𝖪I.𝖵𝖾𝗋𝗂𝖿𝗒) which encodes the policy, and an outer NIZKAoK scheme, 𝖭𝖨𝖹𝖪O=(𝖭𝖨𝖹𝖪O.𝖲𝖾𝗍𝗎𝗉,𝖭𝖨𝖹𝖪O.𝖯𝗋𝗈𝗏𝖾,𝖭𝖨𝖹𝖪O.𝖵𝖾𝗋𝗂𝖿𝗒) for the following relation

O={x(𝗏𝗄σ,M)w(𝖼𝗋𝗌I,πI,σ):𝖭𝖨𝖹𝖪I.𝖵𝖾𝗋𝗂𝖿𝗒(𝖼𝗋𝗌I,M,πI)=1𝖲𝗂𝗀.𝖵𝖾𝗋𝗂𝖿𝗒(𝗏𝗄σ,𝖼𝗋𝗌I,σ)=1}
  • 𝖦𝖾𝗇(1λ)𝗉𝗉¯. Given the security parameter λ as input, the parameter generation algorithm generates the NIZK crs as 𝖼𝗋𝗌O$𝖭𝖨𝖹𝖪O.𝖲𝖾𝗍𝗎𝗉(1λ,𝖢O), where 𝖢O is the circuit encoding O, and outputs 𝗉𝗉𝖼𝗋𝗌O. This algorithm is run once and for all.

  • 𝖲𝖾𝗍𝗎𝗉(1λ,𝖯)(𝗏𝗄𝖯,𝗉𝗄𝖯,κ)¯. Given the security parameter λ and the policy 𝖯 as input, the setup algorithm runs the inner NIZK setup to obtain 𝖼𝗋𝗌I$𝖭𝖨𝖹𝖪I.𝖲𝖾𝗍𝗎𝗉(1λ,𝖯). Next, it creates the signing and verification keys for the signature scheme as (𝗏𝗄σ,𝗌𝗄σ)$𝖲𝗂𝗀.𝖲𝖾𝗍𝗎𝗉(1λ), and then signs 𝖼𝗋𝗌I to obtain σ$𝖲𝗂𝗀.𝖲𝗂𝗀𝗇(𝗌𝗄σ,𝖼𝗋𝗌I). Finally, it outputs 𝗏𝗄𝖯𝗏𝗄σ, 𝗉𝗄𝖯(𝖼𝗋𝗌I,𝗏𝗄σ,σ), and κ𝗌𝗄σ.

  • 𝖠𝗎𝗍𝗁𝖯𝗋𝗈𝗏𝖾(𝗉𝗄𝖯,M,ω)π/¯. It first parses 𝗉𝗄𝖯 as (𝖼𝗋𝗌I,𝗏𝗄σ,σ) and continues only if 𝖲𝗂𝗀.𝖵𝖾𝗋𝗂𝖿𝗒(𝗏𝗄σ,𝖼𝗋𝗌I,σ)=1, otherwise it aborts and outputs . It then computes the proof πI$𝖭𝖨𝖹𝖪I.𝖯𝗋𝗈𝗏𝖾(𝖼𝗋𝗌I,xM,wω) and then outputs the final proof π computed as π$𝖭𝖨𝖹𝖪O.𝖯𝗋𝗈𝗏𝖾(𝗉𝗉,x(𝗏𝗄σ,M),w(𝖼𝗋𝗌I,πI,σ)).

  • 𝖠𝗎𝗍𝗁𝖵𝖿𝗒(𝗏𝗄𝖯,M,π){0,1}¯. Returns the output of 𝖭𝖨𝖹𝖪O.𝖵𝖾𝗋𝗂𝖿𝗒(𝗉𝗉,x(𝗏𝗄𝖯,M),π).

  • 𝖯𝗈𝗅𝖴𝗉𝖽𝖺𝗍𝖾(𝗉𝗄𝖯,κ,𝖯)𝗉𝗄𝖯/¯. If 𝖠𝖽𝗆𝖯(𝖯)1, it outputs and aborts. Otherwise, it parses 𝗉𝗄𝖯 as (𝖼𝗋𝗌I,𝗏𝗄σ,σ). Then, the update algorithm re-runs the inner NIZK setup with this input to obtain 𝖼𝗋𝗌I$𝖭𝖨𝖹𝖪I.𝖲𝖾𝗍𝗎𝗉(1λ,𝖯). Next, it signs 𝖼𝗋𝗌I to obtain σ$𝖲𝗂𝗀.𝖲𝗂𝗀𝗇(κ,𝖼𝗋𝗌I). Finally, it outputs 𝗉𝗄𝖯(𝖼𝗋𝗌I,𝗏𝗄σ,σ).

Remark 5.3.

Depending on the application scenario, the setup could be combined with the parameter generation algorithm so that both are performed once, and the rest of the protocol proceeds identically. This could be potentially useful in a situation where, for instance, an organization has an authorized list of users who can create transactions on behalf of the organization, while keeping their individual identities private. Moreover, this gives a maximally private authentication scheme while still demanding accountability from the users. On the other hand, if a protocol requires identities from individual users, one can perform the setup for each user and set the (hash of) 𝗏𝗄σ as their corresponding addresses.

Security.

The main security theorem and the corresponding proof for this section are provided in the full version of this article [14].

6 Application: Private On-chain Authentication

We now discuss how our zkAt construction can be integrated into a blockchain. First, recall that zkAt+ uses existing NIZKs in a black-box manner, so its instantiation is relatively straightforward. Even our concrete Groth16-zkAt uses the standard Groth16 proving and verification algorithms. Therefore, the only major requirement for integrating our zkAt constructions is the support for on-chain NIZK verification. Fortunately, many smart-contract supporting chains like Ethereum, Aptos and Sui already support on-chain NIZK verification for Groth16 (among others), and can thus readily integrate any of our constructions. Therefore, zkAt can act as a drop-in replacement for any existing authenticator used on public blockchains including multi-signature, threshold signatures and smart-contract based authenticators.

Next, we give a practical instantiation of our zkAt. As a concrete example we will consider the policy – “require t-out-of-n signatures,” where t,n and the n signature verification keys are all to be hidden with the zkAt. The concrete zkAt would look as follows:

  • Setup. Create commitments c1,c2,,cn to the n account addresses, i.e., ci𝖢𝗈𝗆𝗆𝗂𝗍(𝖺𝖽𝖽𝗋i;ri) where address 𝖺𝖽𝖽𝗋i is a signature verification key for the ith signer. Then, create a Merkle tree digest of the n commitments, 𝗋𝗈𝗈𝗍𝖬𝖳.𝖢𝗈𝗆𝗆𝗂𝗍({c1,,cn}). Run the Groth16-zkAt setup to create a (designated-prover) NIZK proving key and (proof) verification key pair (𝗉𝗄𝖯,𝗏𝗄𝖯)$𝖲𝖾𝗍𝗎𝗉(1λ,𝖯) for the policy 𝖯 given by the relation,

    {𝓍(𝗋𝗈𝗈𝗍,𝗍𝗑𝗉𝖻),𝓌({𝖺𝖽𝖽𝗋i,ri,ci,σi}i=1t,𝗍𝗑𝗉𝗏):ik[t],𝖺𝖽𝖽𝗋i𝖺𝖽𝖽𝗋kci=𝖢𝗈𝗆𝗆𝗂𝗍(𝖺𝖽𝖽𝗋i;ri)𝖲𝗂𝗀.𝖵𝖾𝗋𝗂𝖿𝗒(𝖺𝖽𝖽𝗋i,𝗍𝗑𝗉𝖻||𝗍𝗑𝗉𝗏,σi)=1𝖬𝖳.𝖨𝗇𝖼𝗅𝗎𝖽𝖾𝗌(𝗋𝗈𝗈𝗍,ci)=1},

    where 𝗍𝗑𝗉𝖻 (resp. 𝗍𝗑𝗉𝗏) is the public (resp. private) part of the transaction. The proof verification key 𝗏𝗄 acts as the user’s on-chain address.

  • Sign. Split the transaction into public and private components, as determined by the privacy requirements. Collect signatures {σ1,σ2,,σt} on the full transaction 𝗍𝗑𝗉𝖻||𝗍𝗑𝗉𝗏 from t accounts {i1,i2,,it}. Finally, generate the authentication proof with public input M(𝗋𝗈𝗈𝗍,𝗍𝗑𝗉𝖻) and private input ω({𝖺𝖽𝖽𝗋i,ri,ci,σi}i=1t,𝗍𝗑𝗉𝗏), i.e., π$𝖠𝗎𝗍𝗁𝖯𝗋𝗈𝗏𝖾(𝗉𝗄𝖯,M,ω) proving that the user has t valid signatures on the transaction from the set of n signers committed in the Merkle tree.

In particular, this design only requires implementing t signature verifications in the circuit. Assuming the use of a NIZK-friendly signature scheme which only requires a few thousand R1CS constraints per verification, this is concretely efficient (cf. § 7). Using standard signature schemes (which might be necessary if we want to use existing accounts) can lead to costlier circuits. Concretely, each secp256k1 verification requires 1.5M constraints [1] and Ed25519 verification requires 2.5M constraints [23]. However, proving only takes a few seconds on cloud machines444It only takes 6s to verify Ed25519 signatures on a 16-core 32G RAM machine [23]., so these are still practical for reasonable t values seen in practice.

Remark 6.1.

Successfully integrating zkAt into a blockchain, will also require some standardization effort with regards to the zkAt’s public inputs so as not to unintentionally leak some information about the policy by virtue of using any specific public input. Below, we provide a brief list of the required public inputs to a zkAt. Note that a blockchain designer may decide to support all or a subset of these.

  • Transaction details (𝗍𝗑𝗉𝖻):

    • Digest: specifying just a transaction digest however requires parsing the transaction within a zero-knowledge proof. Transaction parsing can be simplified by carefully designing the format of a transaction, e.g., structure it in the format of a Merkle tree. We leave concrete specification for future work.

    • Amount: if supporting a specific type of transaction is enough, e.g., amount transfers, then exposing the transaction amount as a public input can make the signature generation process very efficient.

    • Other fields: similarly, other common fields of a transaction, e.g., the sender address, can be exposed as public inputs.

  • Time: most blockchains support some notion of time. Including time allows specifying time-based policies, e.g., use a certain set of credentials before market close and another after. If the trapdoor is persisted in a safe place (e.g., cold storage), then time allows oblivious policy updates. Say we want to rotate keys once a month, then we can embed an expiry date after a month, and use the trapdoor to generate a new policy when needed.

  • Support for web2 credentials: certain blockchains support authentication based on existing credentials issued by web2 providers, e.g., e-Passports [31], OpenID Connect credentials [4]. To support these, the chains use oracles to fetch the public keys of an issuer. In this case, a Merkle root of all the authorized public keys can serve as a public input.

7 Implementation and Evaluation

We implemented, both, our zkAt construction by instantiating with standard Groth16 (as a proxy for the Groth16-zkAt), as well as zkAt+ constructions in Go using the gnark library [11]555GitHub: https://github.com/Consensys/gnark (we chose this library since it supports both Groth16 and recursive composition). All our experiments were done on a laptop equipped with an Apple M3 Pro chip and we report means over 100 executions.

Policy choice.

We restrict our implementations to the policy 𝖯 described abstractly in the previous section as: “require 1-out-of-3 signatures for transaction amounts under 1000 units, otherwise require 2-out-of-3”. We find that this sufficiently captures complex policy semantics not offered by, for instance, a traditional (t-out-of-n) threshold scheme while also giving a reasonable basis for comparison between the two.

We remark that our scheme generalizes to arbitrary circuits, and for zkAt, the proving time is no worse than a standard zk-SNARK which is very commonly used in practice so we expect an identical scalability profile since the prove and verify algorithms do not change. Our intention for comparing with a 2-of-3 scheme is simply to demonstrate that the computational cost for additional privacy is nominal. Of course, one can formulate more complex policies with greater number of constraints, but we note here that even as the prover time increases for more complex policies, the proof size and the verification time remain the same due to the use of zk-SNARK. Moreover, since the proof computation would be performed offline, and the (online) verification time is reasonably efficient, and depends essentially only on the size of the public input, we do not expect a significant bottleneck to the scalability of our protocol.

Table 2: Comparison of zkAt with threshold signatures. Signer time is equivalently the prover time in zkAt.
Signer
time (ms)
Verifier
time (ms)
zkAt for 𝖯 50.97 0.89
2-of-3 threshold 0.03 0.07

7.1 Evaluation of zkAt

In our proof-of-concept implementation a prover first draws an integer valued transaction amounts uniformly, creates the required number of EdDSA signatures [7] over a ZK-friendly curve and then constructs the zkAt proof with the transaction data as the public input and the signatures and their corresponding verification keys as the private input. In short, the NIZK verification circuit checks whether one or two of the signatures verify depending on the transaction amount.

Concretely, the basic zkAt was implemented over the BN254 curve and the resulting R1CS had 24,564 constraints. Table 2 compares our implementation against a 2-of-3 threshold scheme. While the signer (prover) time for zkAt is noticeably higher relative to the threshold scheme, it is still small in absolute terms. The verification times are within an order of magnitude.

7.2 Evaluation of zkAt+

As before, in our simple proof-of-concept implementation a prover first draws an integer valued transaction amounts uniformly, creates the required number of EdDSA signatures [7]. It then constructs the inner proof that the necessary number of verifying signatures were obtained for the for the given transaction amount. Next, using the transaction data and its signature verification key (which can be thought of as the prover’s address) as the public input, it constructs the outer proof that (i) the inner NIZK circuit accepts and; (ii) it has a verifying signature (with respect to the signature verification key corresponding to its address) on the proving key used to compute the inner proof. In our implementation, we instantiate the proof system with the Groth16 due to its compact proof size as well as support for its recursive composition inside gnark, although other choices of proof systems such as [25, 16, 15] are equally valid.

We implement the zkAt+ over the SNARK-friendly 2-chain666A 2-chain is a pair of pairing-friendly elliptic curves such that the base field of one curve is equal to the scalar field of the other. This enables efficient proof composition of up to one level [12]. of BLS12-377 inner curve [5, 12] and BW6-761 [13, 21] outer curve which was shown to be highly efficient for Groth16 [21, 22]. The inner and outer R1CSs have 24,172 and 40,474 constraints respectively. Table 3 gives the prover and verifier times for our implementation.

Table 3: Prover and verifier times for zkAt+. The preprocessing time is given for each signer.
Inner prover
time (ms)
Preprocessing 325.15
Proof generation 78.55
Outer prover time (ms) 644.54
Verifier time (ms) 7.47

References

  • [1] 0xPARC. Big integer arithmetic and secp256k1 ecc operations in circom. https://github.com/0xPARC/circom-ecdsa, 2024. Accessed: 2025-02-19.
  • [2] Damiano Abram, Ariel Nof, Claudio Orlandi, Peter Scholl, and Omer Shlomovits. Low-bandwidth threshold ECDSA via pseudorandom correlation generators. In 2022 IEEE Symposium on Security and Privacy, pages 2554–2572, San Francisco, CA, USA, May 22–26 2022. IEEE Computer Society Press. doi:10.1109/SP46214.2022.9833559.
  • [3] Argent. Smart wallet features. https://www.argent.xyz/blog/smart-wallet-features, 2024. Accessed: 2024-10-11.
  • [4] Foteini Baldimtsi, Konstantinos Kryptos Chalkias, Yan Ji, Jonas Lindstrøm, Deepak Maram, Ben Riva, Arnab Roy, Mahdi Sedaghat, and Joy Wang. zkLogin: Privacy-preserving blockchain authentication with existing credentials. In Bo Luo, Xiaojing Liao, Jun Xu, Engin Kirda, and David Lie, editors, ACM CCS 2024: 31st Conference on Computer and Communications Security, pages 3182–3196, Salt Lake City, UT, USA, October 14–18 2024. ACM Press. doi:10.1145/3658644.3690356.
  • [5] Paulo S. L. M. Barreto, Ben Lynn, and Michael Scott. Constructing elliptic curves with prescribed embedding degrees. In Stelvio Cimato, Clemente Galdi, and Giuseppe Persiano, editors, SCN 02: 3rd International Conference on Security in Communication Networks, volume 2576 of Lecture Notes in Computer Science, pages 257–267, Amalfi, Italy, September 12–13 2003. Springer Berlin Heidelberg, Germany. doi:10.1007/3-540-36413-7_19.
  • [6] Mihir Bellare, Elizabeth C. Crites, Chelsea Komlo, Mary Maller, Stefano Tessaro, and Chenzhi Zhu. Better than advertised security for non-interactive threshold signatures. In Yevgeniy Dodis and Thomas Shrimpton, editors, Advances in Cryptology – CRYPTO 2022, Part IV, volume 13510 of Lecture Notes in Computer Science, pages 517–550, Santa Barbara, CA, USA, August 15–18 2022. Springer, Cham, Switzerland. doi:10.1007/978-3-031-15985-5_18.
  • [7] Daniel J. Bernstein, Niels Duif, Tanja Lange, Peter Schwabe, and Bo-Yin Yang. High-speed high-security signatures. Journal of Cryptographic Engineering, 2(2):77–89, September 2012. doi:10.1007/s13389-012-0027-1.
  • [8] BitGo. Policy builder overview. https://developers.bitgo.com/guides/policy-builder/overview, 2024. Accessed: 2024-10-11.
  • [9] Dan Boneh, Manu Drijvers, and Gregory Neven. Compact multi-signatures for smaller blockchains. In Thomas Peyrin and Steven Galbraith, editors, Advances in Cryptology – ASIACRYPT 2018, Part II, volume 11273 of Lecture Notes in Computer Science, pages 435–464, Brisbane, Queensland, Australia, December 2–6 2018. Springer, Cham, Switzerland. doi:10.1007/978-3-030-03329-3_15.
  • [10] Dan Boneh, Wilson Nguyen, and Alex Ozdemir. Efficient functional commitments: How to commit to private functions. Cryptology ePrint Archive, Report 2021/1342, 2021. URL: https://eprint.iacr.org/2021/1342.
  • [11] Gautam Botrel, Thomas Piellard, Youssef El Housni, Ivo Kubjas, and Arya Tabaie. Consensys/gnark: v0.9.0, February 2023. doi:10.5281/zenodo.5819104.
  • [12] Sean Bowe, Alessandro Chiesa, Matthew Green, Ian Miers, Pratyush Mishra, and Howard Wu. ZEXE: Enabling decentralized private computation. In 2020 IEEE Symposium on Security and Privacy, pages 947–964, San Francisco, CA, USA, May 18–21 2020. IEEE Computer Society Press. doi:10.1109/SP40000.2020.00050.
  • [13] Friederike Brezing and Annegret Weng. Elliptic curves suitable for pairing based cryptography. Designs, Codes and Cryptography, 37(1):133–141, 2005. doi:10.1007/s10623-004-3808-4.
  • [14] Kostas Kryptos Chalkias, Deepak Maram, Arnab Roy, Joy Wang, and Aayush Yadav. Zero-knowledge authenticator for blockchain: Policy-private and obliviously updateable. Cryptology ePrint Archive, Paper 2025/921, 2025. URL: https://eprint.iacr.org/2025/921.
  • [15] Binyi Chen, Benedikt Bünz, Dan Boneh, and Zhenfei Zhang. HyperPlonk: Plonk with linear-time prover and high-degree custom gates. In Carmit Hazay and Martijn Stam, editors, Advances in Cryptology – EUROCRYPT 2023, Part II, volume 14005 of Lecture Notes in Computer Science, pages 499–530, Lyon, France, April 23–27 2023. Springer, Cham, Switzerland. doi:10.1007/978-3-031-30617-4_17.
  • [16] Alessandro Chiesa, Yuncong Hu, Mary Maller, Pratyush Mishra, Psi Vesely, and Nicholas P. Ward. Marlin: Preprocessing zkSNARKs with universal and updatable SRS. In Anne Canteaut and Yuval Ishai, editors, Advances in Cryptology – EUROCRYPT 2020, Part I, volume 12105 of Lecture Notes in Computer Science, pages 738–768, Zagreb, Croatia, May 10–14 2020. Springer, Cham, Switzerland. doi:10.1007/978-3-030-45721-1_26.
  • [17] Yvo Desmedt. Society and group oriented cryptography: A new concept. In Carl Pomerance, editor, Advances in Cryptology – CRYPTO’87, volume 293 of Lecture Notes in Computer Science, pages 120–127, Santa Barbara, CA, USA, August 16–20 1988. Springer Berlin Heidelberg, Germany. doi:10.1007/3-540-48184-2_8.
  • [18] Yvo Desmedt and Yair Frankel. Threshold cryptosystems. In Gilles Brassard, editor, Advances in Cryptology – CRYPTO’89, volume 435 of Lecture Notes in Computer Science, pages 307–315, Santa Barbara, CA, USA, August 20–24 1990. Springer, New York, USA. doi:10.1007/0-387-34805-0_28.
  • [19] Jiajun Du, Zhonghui Ge, Yu Long, Zhen Liu, Shifeng Sun, Xian Xu, and Dawu Gu. MixCT: Mixing confidential transactions from homomorphic commitment. In Vijayalakshmi Atluri, Roberto Di Pietro, Christian Damsgaard Jensen, and Weizhi Meng, editors, ESORICS 2022: 27th European Symposium on Research in Computer Security, Part III, volume 13556 of Lecture Notes in Computer Science, pages 763–769, Copenhagen, Denmark, September 26–30 2022. Springer, Cham, Switzerland. doi:10.1007/978-3-031-17143-7_39.
  • [20] Stefan Dziembowski, Lisa Eckey, Sebastian Faust, and Daniel Malinowski. Perun: Virtual payment hubs over cryptocurrencies. In 2019 IEEE Symposium on Security and Privacy, pages 106–123, San Francisco, CA, USA, May 19–23 2019. IEEE Computer Society Press. doi:10.1109/SP.2019.00020.
  • [21] Youssef El Housni and Aurore Guillevic. Optimized and secure pairing-friendly elliptic curves suitable for one layer proof composition. In Stephan Krenn, Haya Shulman, and Serge Vaudenay, editors, CANS 20: 19th International Conference on Cryptology and Network Security, volume 12579 of Lecture Notes in Computer Science, pages 259–279, Vienna, Austria, December 14–16 2020. Springer, Cham, Switzerland. doi:10.1007/978-3-030-65411-5_13.
  • [22] Youssef El Housni and Aurore Guillevic. Families of SNARK-friendly 2-chains of elliptic curves. In Orr Dunkelman and Stefan Dziembowski, editors, Advances in Cryptology – EUROCRYPT 2022, Part II, volume 13276 of Lecture Notes in Computer Science, pages 367–396, Trondheim, Norway, May 30 – June 3 2022. Springer, Cham, Switzerland. doi:10.1007/978-3-031-07085-3_13.
  • [23] Electron Labs. Ed25519 implementation in circom. https://github.com/Electron-Labs/ed25519-circom, 2024. Accessed: 2024-10-11.
  • [24] Fireblocks. Fireblocks governance and policy engine. https://www.fireblocks.com/platforms/governance-and-policy-engine/, 2024. Accessed: 2024-10-11.
  • [25] Ariel Gabizon, Zachary J. Williamson, and Oana Ciobotaru. PLONK: Permutations over Lagrange-bases for oecumenical noninteractive arguments of knowledge. Cryptology ePrint Archive, Report 2019/953, 2019. URL: https://eprint.iacr.org/2019/953.
  • [26] Rosario Gennaro, Craig Gentry, Bryan Parno, and Mariana Raykova. Quadratic span programs and succinct NIZKs without PCPs. In Thomas Johansson and Phong Q. Nguyen, editors, Advances in Cryptology – EUROCRYPT 2013, volume 7881 of Lecture Notes in Computer Science, pages 626–645, Athens, Greece, May 26–30 2013. Springer Berlin Heidelberg, Germany. doi:10.1007/978-3-642-38348-9_37.
  • [27] Noemi Glaeser, Matteo Maffei, Giulio Malavolta, Pedro Moreno-Sanchez, Erkan Tairi, and Sri Aravinda Krishnan Thyagarajan. Foundations of coin mixing services. In Heng Yin, Angelos Stavrou, Cas Cremers, and Elaine Shi, editors, ACM CCS 2022: 29th Conference on Computer and Communications Security, pages 1259–1273, Los Angeles, CA, USA, November 7–11 2022. ACM Press. doi:10.1145/3548606.3560637.
  • [28] Matthew Green and Ian Miers. Bolt: Anonymous payment channels for decentralized currencies. In Bhavani M. Thuraisingham, David Evans, Tal Malkin, and Dongyan Xu, editors, ACM CCS 2017: 24th Conference on Computer and Communications Security, pages 473–489, Dallas, TX, USA, October 31 – November 2 2017. ACM Press. doi:10.1145/3133956.3134093.
  • [29] Jens Groth. On the size of pairing-based non-interactive arguments. In Marc Fischlin and Jean-Sébastien Coron, editors, Advances in Cryptology – EUROCRYPT 2016, Part II, volume 9666 of Lecture Notes in Computer Science, pages 305–326, Vienna, Austria, May 8–12 2016. Springer Berlin Heidelberg, Germany. doi:10.1007/978-3-662-49896-5_11.
  • [30] Ethan Heilman, Leen Alshenibr, Foteini Baldimtsi, Alessandra Scafuro, and Sharon Goldberg. TumbleBit: An untrusted bitcoin-compatible anonymous payment hub. In ISOC Network and Distributed System Security Symposium – NDSS 2017, San Diego, CA, USA, February 26 – March 1 2017. The Internet Society. doi:10.14722/ndss.2017.23086.
  • [31] International Civil Aviation Organization. Basics of epassport cryptography, 2024. Accessed: 2025-02-17. URL: https://www.icao.int/Security/FAL/PKD/BVRT/Pages/Basics.aspx.
  • [32] K. Itakura. A public-key cryptosystem suitable for digital multisignatures, 1983.
  • [33] Chelsea Komlo and Ian Goldberg. FROST: Flexible round-optimized Schnorr threshold signatures. In Orr Dunkelman, Michael J. Jacobson, Jr., and Colin O’Flynn, editors, SAC 2020: 27th Annual International Workshop on Selected Areas in Cryptography, volume 12804 of Lecture Notes in Computer Science, pages 34–65, Halifax, NS, Canada (Virtual Event), October 21-23 2020. Springer, Cham, Switzerland. doi:10.1007/978-3-030-81652-0_2.
  • [34] Kostas Kryptos Chalkias. Soft privacy-related leak in threshold eddsa wallets. https://x.com/kostascrypto/status/1703594584100700641, 2023.
  • [35] Jin Li, Man Ho Au, Willy Susilo, Dongqing Xie, and Kui Ren. Attribute-based signature and its applications. In Dengguo Feng, David A. Basin, and Peng Liu, editors, ASIACCS 10: 5th ACM Symposium on Information, Computer and Communications Security, pages 60–69, Beijing, China, April 13–16 2010. ACM Press. doi:10.1145/1755688.1755697.
  • [36] Benoît Libert, Somindu C. Ramanna, and Moti Yung. Functional commitment schemes: From polynomial commitments to pairing-based accumulators from simple assumptions. In Ioannis Chatzigiannakis, Michael Mitzenmacher, Yuval Rabani, and Davide Sangiorgi, editors, ICALP 2016: 43rd International Colloquium on Automata, Languages and Programming, volume 55 of Leibniz International Proceedings in Informatics (LIPIcs), pages 30:1–30:14, Rome, Italy, July 11–15 2016. Schloss Dagstuhl – Leibniz-Zentrum für Informatik. doi:10.4230/LIPIcs.ICALP.2016.30.
  • [37] Hemanta K. Maji, Manoj Prabhakaran, and Mike Rosulek. Attribute-based signatures. In Aggelos Kiayias, editor, Topics in Cryptology – CT-RSA 2011, volume 6558 of Lecture Notes in Computer Science, pages 376–392, San Francisco, CA, USA, February 14–18 2011. Springer Berlin Heidelberg, Germany. doi:10.1007/978-3-642-19074-2_24.
  • [38] Easwar Vivek Mangipudi, Udit Desai, Mohsen Minaei, Mainack Mondal, and Aniket Kate. Uncovering impact of mental models towards adoption of multi-device crypto-wallets. In Weizhi Meng, Christian Damsgaard Jensen, Cas Cremers, and Engin Kirda, editors, ACM CCS 2023: 30th Conference on Computer and Communications Security, pages 3153–3167, Copenhagen, Denmark, November 26–30 2023. ACM Press. doi:10.1145/3576915.3623218.
  • [39] Silvio Micali, Kazuo Ohta, and Leonid Reyzin. Accountable-subgroup multisignatures: Extended abstract. In Michael K. Reiter and Pierangela Samarati, editors, ACM CCS 2001: 8th Conference on Computer and Communications Security, pages 245–254, Philadelphia, PA, USA, November 5–8 2001. ACM Press. doi:10.1145/501983.502017.
  • [40] Microchain Labs. Zk session keys. https://docs.microchain.microchainlabs.xyz/blog/second-post, 2024. Accessed: 2025-02-21.
  • [41] Tim Ruffing, Viktoria Ronge, Elliott Jin, Jonas Schneider-Bensch, and Dominique Schröder. ROAST: Robust asynchronous schnorr threshold signatures. In Heng Yin, Angelos Stavrou, Cas Cremers, and Elaine Shi, editors, ACM CCS 2022: 29th Conference on Computer and Communications Security, pages 2551–2564, Los Angeles, CA, USA, November 7–11 2022. ACM Press. doi:10.1145/3548606.3560583.
  • [42] Safe Core. Safe core protocol whitepaper. URL: https://github.com/5afe/safe-core-protocol-specs/blob/main/whitepaper.pdf, 2024. Accessed: 2024-10-11.
  • [43] Qin Wang and Shiping Chen. Account abstraction, analysed. In 2023 IEEE International Conference on Blockchain (Blockchain), pages 323–331, 2023. doi:10.1109/Blockchain60715.2023.00057.