Cryptocurrency: Demystifiying SMPC (Secure multi-party computation) and its threat model
Karl Semich
0xloem at gmail.com
Wed Feb 8 16:29:17 PST 2023
It’s nice to see the article style although the content is above the
product of my expertise, interest, and attention soan, leaving the
topic still mystifying for me. I can’t verify if it’s a fake or an
honest share, but it’s a breath of fresh air.
Demystifiying SMPC (Secure multi-party computation) and its threat model
Prologue
SMPC is an interesting topic, whose the applications include
systematic security and cryptographic engineering, and this article
will discuss its principles, threat models and use-case.
History and substantiation of SMPC
Secure Multiparty Computation (SMPC) is a branch of cryptography dated
to 1979 by A. Shamir, R. Rivet and L. Adleman in the Mental Poker
Secret Split, and then Andrew Chi-Chi Yao, officially proposed in 1982
through the “Millionaire Problem”.
In 1986, Yao proposed Garbled Circuit Protocol, which is still the
basis for the most effective MPC implementations today.
In 1987, Goldrakh, Mikali and Wigderson extended two-party protocol to
multi-party.
In the 1990s, MPC studies led to breakthroughs in universal
composability and mobile security.
In 2008, the first large-scale practical application of SMPC was
demonstrated at an auction in Denmark.
In the late 2010s, MPCs were first used by digital custody and digital
wallets to protect digital assets.
In 2019, the MPC-CMP debuted with the first one-round operation,
threshold DSA signature algorithm with automated key refreshing.
Threats and security requirements
Generally speaking, SMPC allows several participants to perform a
computational process with confidential data that are at their own
disposal as input data, without disclosing confidential data or
intermediate results that can be used to compute confidential data to
other participants.
The SMPC protocol should guarantee two main properties:
Privacy: No party has access to information, except for their own
input and output data and what can be computed on the basis of their
own input and output data.
Correctness: if any corrupted parties (for example, bribed by the
adversary) act dishonestly, for example, share information in private
or perform actions that deviate from the norms of the protocol, the
protocol should not allow the dishonest parties to be able to make
honest parties get the wrong result or disclose their secrets.
Ideal/realistic modeling paradigm: the list above is not a definition
of security; It simply lists certain requirements that a secure
protocol must comply with. On the contrary, the definition of security
should include all important security requirements and cover all
possible adversarial attacks. In addition, it should be simple and
rather concise for practical use.
The current security standards are determined as follows. Consider the
“ideal world”, where there is an external trusted party to help
participants with their computations. In such a world, participants
simply send their input data to the trusted parties on a fully
protected channel, which then computes the selected functions and
sends the relevant exits independently and secretly to each
participant. Since the only action performed by participants is to
send their input to the trusted side, the only freedom remaining for
the adversary is to choose the input of the corrupted party (for
example, a corrupted party wants to enter a, but the adversary asks
them to enter a', and for other participants, the corrupted party
input a', therefore, the final result generated by a'should be
considered “correct” for other participants). Thus, in the ideal
world, all safety requirements listed above would be fulfilled.
However, in the “real world”, no party can be trusted by all. On the
contrary, the participants work together to execute the protocol
without any outside help, and the corrupted parties can perform more
dishonest operations. The protocol is called secure if it can imitate
the results obtained in the ideal world described above, i.e. if the
real protocol performed by participants guarantees that no adversary
can cause more damage than if the attack was performed in an ideal
world. This condition can be expressed as follows: so that any
adversary can launch a successful attack in the real world, the
adversary in the ideal world should always be able to successfully
launch the same attack. However, in the ideal world, the attack could
not be successfully fulfilled; Therefore, all real attacks on the
implementation of the protocol must fail.
The above informal definition of security does not take into account
the security model. In SMPC studies, the security model determines the
capabilities of the adversary. The security of the protocol makes
sense only if it is discussed within the framework of a certain
security model. The protocol is considered safe only if it is
resistant to any competitive attack in the framework of the
corresponding security model. Depending on the behavior of the
adversary, the security model can be divided into the following
different types:
Semi-honest model: Corrupted parties can only execute the protocol
honestly . However, the adversary has access to exhaustive information
about the internal state of each corrupted party (including copies of
all the information received) and will try to use these information to
obtain other information which should be kept secret. Prevention of
such attempts should be one of the most basic requirements of a secure
protocol.
Malicious attack model: in addition to informing about all internal
states, corrupted parties can also perform dishonest actions that are
deviated from the specifications of the protocol under the
instructions of the adversary. A secure protocol, immune to malicious
attackers can guarantee that any malicious attack will end with an
error. However, achieving this level of security requires a high price
in terms of the effectiveness of the protocol, for example, dishonest
interference in intermediate processes should be found in advance,
leading to the abort of computations with a warning, or requiring a
retry of an erroneous step, instead of emitting a specious result.
Hidden attack model: the Semi-honest model, described above, is too
weak, but malicious attack model makes the protocol too ineffective in
accordance with safety requirements. To overcome these difficulties,
the hidden attack model was proposed. A secretive adversary can show
malicious behavior, but they has a certain probability of being caught
by honest participants. This models a number of financial or political
conditions in which it cannot be assumed that all actions are honest,
but involved companies and institutions cannot afford reputation
damage associated with fraud. In this model, the adversary should
weigh the risks of being caught against the advantages of deception.
If a deception remains unnoticed, the result may be specious.
Committer
The most intuitively understandable form of the committer is: Alice
generates a random number r and uses it as a key to encrypt a secret
p, e = Enc(p, r), Alice first sends (commits) e to Bob, and then at
some point Alice sends r to Bob, so Bob can decrypt (open) e to get p
= Dec(e, r).
Oblivious transfer
Alice holds two secrets m(0) and m(1) to send to Bob, Bob can choose
only one of two. Alice will not know what secret Bob chooses, and Bob
does not know the secret that he does not choose.
Shimon Even, Oded Goldreich and Abraham Lempel used the nature of the
RSA to propose an oblivious transfer scheme (see
https://en.wikipedia.org/wiki/Oblivious_transfer#1%E2%80%932_oblivious_transfer)
for preventing dishonest, the idea of which can be summarized as
follows:
Alice randomly generates two values x(0) and x(1) and send to Bob, Bob
randomly generates k locally, uses the nature of the public key
encryption algorithm to encrypt k, mixed with the selected x(b) and
sends it to Alice, which is equivalent to how Alice asks Bob to use
the selected x(b) to “commit” k to her, and the role of the public key
encryption algorithm is to prevent the leak of k from the channel.
Since Alice cannot predict the value of k, she could ony use x(0) and
x(1), which she knows to get the possible values k(0), k(1) by
decryption, and use k(0) and k(1) as the keys to encrypt m(0) and m(1)
and send to Bob, and Bob decrypt the corresponding ciphertext with khe
knows. Bob has no chance to be dishonest when “committing” k,
otherwise, neither k(0) nor k(1) will be equal to k, then Bob will not
get anything.
Homomorphic encryption
The nature of some encryption algorithms lies in the fact that the
effect of performing some operation with ciphertext is equivalent to
perform plaintext operations, and then encrypting the result. Most
common encryption algorithms usually have only partial homomorphism,
that is, only a specific operation (for example, addition) for
plaintexts can be achieved using the operations of ciphertext, and the
operations of the ciphertext may not correspond to the same plaintext
operation. Partial homomorphic encryption algorithms, which can keep
certain operations with plaintext, are often used to implement the
appropriate primitives of MPC operations, such as using an encryption
algorithms that keeps multiplication to achieve MPC multiplication.
Zero-knowledge proof
A zero-knowledge proof or zero-knowledge protocol is a method by which
one party (the prover) can prove to another party (the verifier) that
a given statement is true while the prover avoids conveying any
additional information apart from the fact that the statement is
indeed true.
For example, Alice has Bob’s public key pkb, and Bob want to prove
that he has the corresponding secret key skb.
Alice randomly generates r, and sends c = E(pkb, r) to Bob,
Bob decrypts c and sends the result of D(skb, c) to Alice, which should equal r.
Thus, Bob proves that he does hold skb without leaking any additional
information.
However, c might be a ciphertext encrypted with pkb collected by
Alice, and she might trick Bob to decrypt it for her, pretending to
ask Bob for a zero-knowledge proof. To prevent this, Bob could in
return request Alice to prove with zero-knowledge that she knows r in
the first place. For example, he could randomly generate a salt s,
send to Alice, and ask her to send h = Hash(r||s) along with c, and
verify whether h equals Hash(D(skb, c)||s). (|| for concatenation of
data string, using this salt to prevent Alice picking a precomputed h)
If so, Bob sends D(skb, c) to Alice for her to verify, otherwise, Bob
would know that Alice does not know r so that she might be dishonest,
and he could just abort the conversation to avoid greater loss. With
these improvements above, the protocol becomes this below:
Bob randomly generate s, and sends to Alice,
Alice randomly generates r, sends c = E(pkb, r), h = Hash(r||s) to Bob,
Bob computes d = D(skb, c) and verifies h == Hash(d||s). if so, he
sends d to Alice, otherwise, he aborts the conversation to avoid
greater loss.
Alice verifies that r == d.
Zero-knowledge proof schemes are usually used to confirm the
correctness of intermediate results of multi-step MPC protocol.
Although MPC may work without zero-knowledge proof, a multi-step MPC
protocol without zero-knowledge proof is vulnerable against not only
dishonest participants, but also unexpected errors, thus not an “SMPC”
protocol.
Shamir’s Secret Sharing
Split a secret value x on GF(q) into n pieces. x could be restored
when collecting t+1pieces (called “shares”), but not t or less.
The method is shown below:
Select any t elements a(1) ~ a(t) in GF(q) and let x = a(0), build a
polynomial x(e) ≡ a(0) + {i=1~t}Σ{a(i)e^i} ≡ {i=0~t}Σ{a(i)e^i} mod q,
obviously x(0)is equal to x. Note: the process to compute and export
x(e) = a(0) + {i=1~t}Σ{a(i)e^i} , is usually not supported by HSM,
otherwise private key x could be computed via x(e) -
({i=1~t}Σ{a(i)e^i}) , contradicting with the property of HSM.
Randomly choose n (>t) pairs of [e(i), x(e(i))], (e(i) is the i-th
sample value of the the independent variable e, all e(i) is not equal
to 0 and differs), save a(1) ~ a(t) in secret or destroy, and appoint
[e(i), x(e(i)] to the i-th participant.
After collecting 0~t, in total t+1 pairs, compute the constant term
l(k,0) of the corresponding Lagrange basis polynomial, i.e. The value
of the Lagrange basis polynomial when its independent variable is
zero: l(k,0) ≡ {m=0~t, m!=k}Π{e(m)×inv(q, e(m)-e(k))} mod q, in which
inv(q,x) is the multiplicative inverse of x with respect to the
modulus q.
Now we can get x = x(0) ≡ {i=0~t}Σ{l(i,0)×x(e(i))} mod q.
The property of Shamir’s Secret Sharing
Lagrange basis polynomial l(i,e(j)) = δ(i,j) = (i == j ? 1 : 0), i.e.
l(i,e)gets 1 at e(i) and 0 in all the others e(j) where j != i, which
is like a base vector,
Thus, the polynomial x(e) can be expressed as a linear combination of
Lagrange basis polynomials, and their coefficients are equal to the
value of x(e) at each e(i): x(e) ≡ {i=0~t}Σ{x(e(i))×l(i,e)} mod q, and
then x(0) ≡ {i=0~t}Σ{x(e(i))×l(i,0)} mod q, in which l(i,0) is the
value of the i-th Lagrange basis polynomial when its independent
variable is zero, and equals its constant term, or Lagrange
coefficient.
Thus, Shamir’s Secret Sharing could be described as: Taking the
Lagrange coefficients l(i,0) as base vectors, an arbitrary secret x
could be linearly expanded and its coordinates, i.e. the share, is the
value of x(e) at each e(i), and l(i,0) is completely determined by
each e(i). Because the rank of the linear space of all t-degree
polynomials is (t+1), not less than (t+1) base vectors (Lagrange basis
polynomials) are needed to express an arbitrary polynomial in such
space.
It follows that Shamir’s secret sharing is linear to the coordinates,
that is, the share. That is to say, if several secrets y(0) ~ y(m) is
shared with the same set of e(i), obtaining coordinates y(j,e(i)), the
arbitrary linear combination of y(0) ~ y(m), Y ≡ {j=0~m}Σ{b(j)y(j)} ≡
{j=0~m}Σ{b(j)×{i=0~t}Σ{y(j,e(i))×l(i,0)}} ≡
{i=0~t}Σ{{j=0~m}Σ{b(j)y(j,e(i))}×l(i,0)} ≡ {i=0~t}Σ{Y(e(i))×l(i,0)}
mod q, in which Y(e(i)) ≡ {j=0~m}Σ{b(j)y(j,e(i))}. That is, assuming
sharing with the same set of e(i), the sharing result of a linear
combination of a set of secrets is equivalent to sharing those secrets
individually and then linearly combining the sharing results in the
same mode, which could be further written in matrix form: Y ≡ <b|y> ≡
<b|[y(j,e(i))]|l> ≡ <Y|l> mod q (row, column vectors, and are
expressed with Dirac’s bra-ket notation),
Y = [ b(0) ~ b(m) ]×[y(0) = [ b(0) ~ b(m) ]×[y(0,e(0))~y(0,e(t))
×[l(0,0) = [Y(e(0))~Y(e(t))]×[l(0,0)
~ ~ ~ ~
~
y(m)] y(m,e(0))~y(m,e(t))]
l(t,0)] l(t,0)]
in which <b| is a row vector with m+1 dimensions, |y> ≡
[y(j,e(i))]|l>, is a column vector with m+1 dimensions, arranged with
all secrets y(0) ~ y(m), [y(j,e(i))] is a matrix with m+1 rows and t+1
columns, each row of whose represents the sharing of the corresponding
secret, while the column represents all the share received by the
corresponding participant. |l> is a column vector with t+1 dimensions,
arranged with Lagrange coefficients, <Y| ≡ <b|[y(j,e(i))] is a row
vector with t+1 dimensions, arranged with the result of linear
combination in the same mode of all received share by each
participant.
This property has an important application in MPC-CMP: m = t is
usually maded, and all b equals 1, y(0) ~ y(t) is generated or held by
t+1 participants, with Y being their sum. They are then shared with
the same set of e(i) to all the participant. Each participant then
sums up all received shares, gets Y(e(i)). Multiplying with their
corresponding Lagrange coefficient, Each participant gets their W(i) =
Y(e(i))×l(i,0), the “Additive Secret Sharing” of Y = {j=0~t}Σ{y(j)}.
The sum of all “Additive Secret Sharing” remains Y, but no participant
can get y(i) owned by another participant.
Feldman-VSS
Based on Shamir’s Secret Sharing, making all t+1 samples of v(i) ≡
g^a(i) from 0~t, note that g^a(0) = g^x, while g is the generator of a
cyclic group suitable of DH key exchange. Although individual
participant does not know a(i), they can verify whether g^x(e(i)) ?≡
{j=0~t}Π{v(j)^(e(i)^j)}, because {j=0~t}Π{v(j)^(e(i)^j)} ≡
{j=0~t}Π{(g^a(j))^(e(i)^j)} ≡ {j=0~t}Π{g^(a(j)(e(i)^j)} ≡
g^({j=0~t}Σ{a(j)(e(i)^j}) ≡ g^x(e(i)), otherwise, the sharing process
fails.
To make things simple, when describing Shamir’s and Feldman-VSS below,
we would let e(i) = i, that is, for the i-th participant, [i, x(i)] is
delivered as the share, in which x(i) is the value of polynomial x(e)
when its independent variable takes the integer i, and because
participants should know their sequence number, only x(i)should be
transferred.
Paillier algorithm
Basically an extension of RSA, performed on Z(n^2), with the following
partial homomorphism:
Dp(sk, Ep(pk, a)×Ep(pk, b)) ≡ (a+b) mod n^2,
Dp(sk, Ep(pk, b)^a) ≡ Dp(sk, Ep(pk, a)^b) ≡ (a×b) mod n^2.
MtA (for Multiplicative to Additive) secret conversion protocol
Alice and Bob hold a, b ∈ Z(q) respectively, they want to generate α
and β, satisfying α + β ≡ a×b mod q, and Alice will hold a and α, Bob
will hold b and β, without leaking to each other.
By using the Paillier algorithm above,
Alice sends c(A) = Ep(pkA, a) to Bob, and proves she knows the a <
q^3satisfying the computation process of c(A) with zero-knowledge. For
example, Bob could randomly generate r, sends t(A) = c(A)×Ep(pkA, r)
to Alice and requests Dp(skA, t(A)) - a, which should equal r.
Bob randomly selects β' in Z(q^5), sends c(B) = c(A)^b×Ep(pkA, β') =
Ep(pkA, a×b)×Ep(pkA, β') = Ep(pkA, a×b+β') to Alice, let β = -β' mod
q, and proves he knows the b < q^3 and β' < q^7 satisfying the
computation process of c(B) with zero-knowledge. For example, Alice
could send c'(A) = Ep(pkA, n^2-a) to Bob and requests c'(B) =
c'(A)^b×Ep(pkA, n^2-β'), Dp(ska, c'(B)×c(B)) should equal 0. If B ≡
g^b is a public value, Bob should additionally prove that g^b == Bwith
zero-knowledge.
Alice decrypts c(B) to obtain α' = a×b+β', let α = α' mod q. If B is
public, Alice can randomly generate r', send to Bob, and request
(g^β)^r', in order to verify that (g^β)^r'×g^(r'α) ≡ B^(r'a).
Now we assume that there are t+1 participants P(0)~P(t), each holding
their own a(i), b(i). P(i) performs MtA secret conversion with P(j) to
obtain α(i,j) held by P(i) and β(i,j) held by P(j), and applying “self
conversion agreement”: α(i,i) = a(i)×b(i), β(i,i) = 0. Then each
participant P(i) compute p(i) = {j=0~t}Σ{α(i,j)+β(j,i)}, so
{i=0~t}Σ{p(i)} = {i=0~t}Σ{{j=0~t}Σ{α(i,j)+β(j,i)}} =
{i,j=0~t}Σ{α(i,j)+β(j,i)} = {i,j=0~t}Σ{α(i,j)+β(i,j)} =
{i,j=0~t}Σ{a(i)×b(j)} = ({i=0~t}Σ{a(i)})×({j=0~t}Σ{b(j)}, because all
α(i,j) and β(i,j) are included in the range of sum. The whole process
correspond to perform “Additive Secret Sharing” upon the product ab of
a = {i=0~t}Σ{a(i)} and b = {j=0~t}Σ{b(j)} into p(i) =
{j=0~t}Σ{α(i,j)+β(j,i)} held by each participant, without truly
computing a, b and ab.
Non-Malleable Equivocable Commitments
If {pk, tk} = KG(seed), [C(M), D(M)] = Com(pk, M, R), then Ver(pk,
C(M), D(M)) = M. There is D(M') = Equiv(pk, tk, M, R, M') satisfying
Ver(pk, C(M), D(M')) = M'.
That is, D(M) could restore C(M) to M, but the result is not unique.
Function Equiv() could be used to compute a D(M') that can decrypt
C(M) into M'.
Generalized DSA-type signature algorithm
Defined on a cyclic group in which discrete logarithm is hard to
resolve, the order of the group is prime number q, g is the generator.
A scalar x is used as private key, X = g^x is the public key. If
elliptic curves are concerned, capital letters are all used to
represent points on an elliptic curve.
Choose a k “randomly”, let r = H'(g^k), e = H(m), s = inv(q,k)(e+xr)
mod q, H(m)is a function to obtain a scalar from several leftmost bits
of the hash of m. The pair (r,s) is the signature, and it is valid if
and only if r == H'(g^(e×inv(q,s))×X^(rinv(q,s)))
In classic DSA, the cyclic group is the subgroup with order q (not
unique) of a multiplicative group of integers modulo p that (p-1) is
divisible by q. The generator g = h^((p-1)/q) mod p, in which h is
randomly chosen among {2...(p-2)} and g != 1. H’(A) is A mod q.
In ECDSA, the cyclic group is the subgroup with order q of an additive
group of points on an elliptic curve defined on a finite field. H'(A)
is x(A) mod q, while x(A) returns the horizonal coordinate of point A
on the elliptic curve.
k should have these three property below:
1. Randomness: It should be unable to compute from the data being
signed (called "payload" below) and the resulted signature.
2. Confidentiality: It should not be leaked outside the signing process.
3. Uniqueness: It should be different for different payloads.
Otherwise, an attacker may compute the private key from payloads and
signatures, for example, when k is leaked, we can obtain x =
inv(q,r)(sk - H(m)).
If the random number comes from a flawed RNG, its randomness and
uniqueness will become difficult to guarantee, for the attacker may
find the pattern of the flawed RNG by collecting enough
payload-signature pairs, and then compute the private key.
One of the methods to solve this problem is to derive the “random
number” kdeterministically from the hash value of private key and
payload with irreversible algorithm (such as hash or message
authentication code algorithm): The participation of private key in
the derivation process guarantees property 1 and 3, if only the
private key is not leaked. This method has been standardized as RFC
6979.
EdDSA algorithm
Though so named, EdDSA (RFC 8032) does not belong to generalized
DSA-type algorithm. Instead, it is a mixture of signature algorithms
of Schnorr and DSA in a cyclic subgroup with prime order q of an
additive group of points on a twisted Edwards elliptic curve.
The private key t is a randomly-generated bit string. It is hashed
with an algorithm generating results with 2b bits, and the result is
split in two l(t) and h(t), with b bits each.
The private scalar x = (l(t)&i)|j, i, j are parameters dependent on
the particular curve, used to set some bits of x to 0 or 1 uniformly.
The generator G is a fixed point on the elliptic curve, and the cyclic
subgroup generated by G has order q, while the largest cyclic group on
the curve has order 2^c×q. The public key is X = xG. What corresponds
to k is deterministically generated from the payload m and h(t)via
hashing: k = H(h(t)||m) mod q, || for concatenation of data string.
R = kG is a point on the curve, e = H(R||X||m), s = (k + xe) mod q,
the pair (R,s) forms the signature, verified via 2^c×s×G == 2^c×R +
2^c×e×X.
In the original Schnorr algorithm, e = H(R||m), s = (k - xe) mod q,
and the signature consists of (s,e), verified via e == H((sG+eX)||m).
EdDSA borrows (R,s)from generalized DSA-type algorithm, and make
public key X participate the generation of e.
Contrary to ECDSA, EdDSA does not use an H'() function which only
returns the horizonal coordinate of a point. Instead, EdDSA uses a
coding scheme capable to represent a point on the twisted Edwards
elliptic curve losslessly.
The private scalar x corresponds to the private key of generalized
DSA-type and original Schnorr signature algorithm, while h(t) acts as
a seed generated along with, but mathematically irrelated to the
private scalar x, used to generate k, avoiding issues of randomly
generate k in generalized DSA. The private key t yet acts as a seed to
generate x and h(t). If t is saved, there would be no need to save x
and h(t) at the same time.
Attacks against EdDSA usually aim at obtaining the private scalar x,
instead of the private key t, because one possessing x could already
generate valid signature by randomly choosing h(t) or k.
A false public key attack against EdDSA
In the step s = (k + x(e = H(R||X||m))) mod q, X = xG must be
guaranteed, otherwise, a false public key attack could be performed to
obtain the private scalar x:
Injecting an X' != xG the adversary knows, to produce s' = (k + x(e' =
H(R||X'||m))) mod q, the adversary could obtain x =
(s'-s)inv(q,(e'-e)) mod q.
MPC-CMP: multi-party DSA
In this protocol, the standing of k and inv(q,k) in generalized DSA we
discussed above is swapped, that is, r = H'(g^inv(q,k)), s = k(e+xr)
mod q, in order to guarantee that k and s could be computed
distributively.
The exact steps are shown below: 0. Each participant holds their own
u(i), publishes g^u(i) as their personal public key, and shares u(i)
via Feldman-VSS to every other participant, let a(i,j) be the j-th
polynomial coefficient generated by the i-th participant, v(i,j) =
g^a(i,j) is published to verify the validity of Feldman-VSS. Each
participant sums up all received shares x(i,j) to get x(i) =
{j}Σ{x(i,j)}, multiplied with the corresponding Lagrange coefficient
to get w(i) = x(i)×l(i,0), being the “Additive Secret Sharing” of x =
{i}Σ{u(i)}. x acts as the collective private key, while X =
{i}Π{g^u(i)} = g^({i}Σ{u(i)}) = g^x acts as the collective public key.
In the mean time, the X(i) = {j=0~t}Π{v(i,j)^(i^j)} = g^x(i) obtained
from the step of Feldman-VSS could be used to compute W(i) =
X(i)^l(i,0) = g^w(i).
Each participant randomly generates k(i), γ(i), commits {C(i),D(i)} =
Com(g^γ(i)), and broadcasts C(i), let k = {i}Σ{k(i)}, γ = {j}Σ{γ(j)},
converts k(i)×γ(j) = α(i,j)+β(i,j) with MtA (applying the “self
conversion agreement” here), and let δ(i) = {j}Σ{α(i,j)+β(j,i)}.
Each participant converts k(i)×w(j) = µ(i,j)+ν(i,j) and checks w(i)
with W(i), let σ(i) = {j}Σ{µ(i,j)+ν(j,i)}. Thus, {i}Σ{δ(i)} = kγ,
{i}Σ{σ(i)} = k×{j}Σ{w(j)} = kx.
Each participant broadcasts their own δ(i), and computes δ =
{i}Σ{δ(i)} = kγ, and inv(q,δ) mod q.
Each participant broadcasts their own D(i) to open Γ(i) = g^γ(i), and
computes R = ({i}Π{Γ(i)})^inv(q,δ) = g^({i}Σ{γ(i)}×inv(q,kγ)) =
g^inv(q,k), and r = H'(R).
Each participant computes e = H(m), s(i) = k(i)×e + rσ(i).
Zero-knowledge checking: 5a. Each participant randomly generates l(i),
ρ(i) ∈ Z(q), computes V(i) = R^s(i)×g^l(i), A(i) = g^ρ(i),
{C(1,i),D(1,i)} = Com(V(i),A(i)) and broadcasts C(1,i).
5b. Each participant broadcasts own D(1,i) and proves they know s(i),
l(i) and ρ(i) satisfying the computation process of V(i) and A(i). The
protocol is aborted if this proof fails. Let V =
g^(-e)×X^(-r)×{i}Π{V(i)}, A = {i}Π{A(i)}.
5c. Each participant computes U(i) = V^ρ(i), T(i) = A^l(i), commits
{C(2,i),D(2,i)} = Com(U(i),T(i)) and broadcasts C(2,i).
5d. Each participant broadcasts own D(2,i) to open U(i) and T(i), if
{i}Π{U(i)} != {i}Π{T(i)}, the protocol should be aborted.
5e. Otherwise, each participant publishes their own (r,s(i)) pair, and
the sum of all s(i) is s = {i}Σ{s(i)} = ke + rkx, which could be used
to assemble the signature (r,s) and verifiable with the collective
public key X.
The importance of the zero-knowledge checking is that an incorrect DSA
signature can be used to extrapolate the private key (whether it is a
participant’s personal private key or the theoretical collective
private key), and the checking described above can prevent the
incorrect DSA signature being published when an error is detected.
The following zero-knowledge proof scheme could be used against V(i)
in 5b, (i is omitted below):
Prover randomly selects a, b ∈ Z(q), sends α = R^a×g^b to the Verifier.
Verifier randomly generates challenge c ∈ Z(q) and sends to the Prover.
Prover computes t = a + cs mod q and u = b + cl mod q, and sends to Verifier.
Verifier checks whether R^t×g^u == α×V^c.
Discussion of MPC-CMP-DSA
In the above scheme, k is assembled from k(i) randomly generated by
each participant and is not directly present during the computation.
Thus, the advantages of generating k(i) with deterministic algorithms
are apparently limited compared to single-keyed DSA.
The possibility to compute EdDSA in the manner of MPC-CMP
The key to compute EdDSA distributively is to compute R = kG
distributively without leaking k.
Can SMPC solve “single point of failure” issue?
>From the point of view of the application, e.g: the digital custody
needs multiple parties to participate in each operation, even if the
attacker compromises one of the participating nodes, this does not
lead to the compromise of entire system. At first glance, this solves
the problem of a single point of failure for typical “ideal” scenario,
but the real-life situation is much more complicated. SMPC cannot
solve the problem of a single point of falure in the following
scenarios.
Alice, Bob and Chris use Windows, GNU/Linux and Mac OS X to deploy an
SMPC scheme, respectively, but meet worst-case scenario, that is, the
attacker uses a set of 0day exploits to compromise each node in 1
second by utilizing some sophisticated RCEs.
Only the service node in Tier-4 data center knows the IP address of
the participant node and performs MPC operations. Unfortunately, there
is a mole using a PCI device which looks like a USB one to conduct a
DMA attack to compromise the system in Tier-4 data center, and then
performing lateral movement and further infiltration to implant
rootkits even bootkits. In this circumstances, any normal operations
launched by custodian’s client are able to lead to diaster which
scenario 1) can be happened reversely.
Gain the footholds by phishing, then attack the custodian via methods
like scenario 1).
Note that security incidents caused by stupid operations of
cross-chain bridges are not discussed in the threat model of this
article.
Can integration of TEE mitigate the above risks?
No. ALthough CCC (Confidential Computing Consortium) mentioned about
enclave/TEE solutions like Intel SGX/AMD SEV to work with SMPC, but
the technical analysis of CCC also discussed the risk and defect of
these technologies. The failure of Intel SGX is an interesting example
and the detail is in our previous write-up Intel SGX deprecation
review. TEE can reduce the risk of certain components with proper use,
but this is not a silver bullet.
Summary
Don’t roll your own crypto unless you know what you’re really doing.
Double confirm that if SMPC libraries has a real implementation of
zero-knowledge proof even in a hardcoded scheme. (Some vendors or open
source SMPC implementations doesn’t have ZKP implementation by
default)
Follow the cypherpunks/cryptography best-practices, e.g: the
risk-based assessment for non-deterministics approach is necessary,
etc.
User’s threat model is usually not vendor’s threat model. But vendor’s
threat model seems “OK” to user. So make sure the SMPC vendor’s threat
model fits yours.
System security & cryptography engineering are twins. If your
stupidity intend to ignore one of them, your production system will
have serious problem.
The devil is in the details. Technical detail matters!
References
A Technical Analysis of Confidential Computing v1.3
https://confidentialcomputing.io/wp-content/uploads/sites/85/2023/01/CCC-A-Technical-Analysis-of-Confidential-Computing-v1.3_Updated_November_2022.pdf
A Pragmatic Introduction to Secure Multi-Party Computation
https://securecomputation.org/docs/pragmaticmpc.pdf
Next Generation Data Center Security: The Cornerstone of Web3?
https://hardenedvault.net/blog/2022-08-05-next-gen-data-center-web3/
Intel SGX deprecation review
https://hardenedvault.net/blog/2022-01-15-sgx-deprecated/
Firmware bootkits
https://github.com/hardenedvault/bootkit-samples
Taurus Releases the First Open-Source Implementation of MPC-CMP
https://blog.taurushq.com/first-open-source-implementation-of-mpc-cmp/
Introducing MPC-CMP: Pushing MPC Wallet Signing Speeds 8X
https://www.fireblocks.com/blog/pushing-mpc-wallet-signing-speeds-8x-with-mpc-cmp-9/
QREDO
https://www.qredo.com/qredo-yellow-paper.pdf
Common Terminology for Confidential Computing
https://confidentialcomputing.io/wp-content/uploads/sites/85/2023/01/Common-Terminology-for-Confidential-Computing.pdf
SLIP-0039 : Shamir’s Secret-Sharing for Mnemonic Codes
https://github.com/satoshilabs/slips/blob/master/slip-0039.md#slip-0039--shamirs-secret-sharing-for-mnemonic-codes
TinySMPC
https://github.com/kennysong/tinysmpc
More information about the cypherpunks
mailing list