[cap-talk] Implementing a crypto brand: What are the security requirements?
David Hopwood
david.nospam.hopwood at blueyonder.co.uk
Fri Mar 23 17:01:29 CDT 2007
Tyler Close wrote:
> Hi Kevin,
>
[...]
>>>http://waterken.sourceforge.net/javadoc/org/ref_send/brand/package-
>>>summary.html
>>
>>Looking at this page, I note that it uses the term "Brand" in the
>>opposite sense that E does. The "brand" of E's built-in sealing
>>system is the facet of minimal authority; yours is the maximal.
>>
>>Most Authority <-----------> Least Authority
>> Sealer
>> /\
>> / \
>> [Sealer,Unsealer] / \ elib.sealing.Brand
>> (your Brand) \ /
>> \ /
>> \/
>> Unsealer
>
>
> In my opinion, the term "brand" in E is overloaded. I think it could
> be interpreted as describing the return of the getBrand() method, or
> the return of the makeBrand() method. For clarity, I chose to give it
> a single meaning, the return of the makeBrand() method and use the
> term "label" for the other meaning.
The return of makeBrand() is a "sealer/unsealer pair", not a brand.
This may mean that the 'makeBrand' function is misnamed, but the
terminology is otherwise consistent; I think that consistency is
important here and the terms should not be changed without good reason.
>>The elib.sealing.Brand (from a client's perspective) reliably
>>identifies the group without giving any other authority;
>
> It depends on what you mean by "reliably". Any object possessing the E
> Brand can masquerade as a member of the group. I think this fact is
> easily missed since E's Brand supports identity comparison and so
> seems to provide authority.
>
>>it is available everywhere your protocol offers its "label".
>
> Correct. I renamed this attribute to label and changed its type to
> String to better communicate that this attribute does not offer any
> guarantees that can be relied upon.
Changing the type to String prevents the use of private (i.e. closely
held or anonymous) Brands. I don't see any good reason to do that.
> To find out if a Box is an
> authentic Box, you must unseal() it, not just check its label.
Yes, this is important. But I don't think that changing the type to String
helps much by itself to clarify it.
[...]
>>>Spoofability
>>> Without possession of Unsealer A , it is not possible to determine
>>>if a Box is an authentic Box A.
>>
>>In E-on-Java, possession of the brand is sufficient:
>>
>> ? def SealedBox := <type:org.erights.e.elib.sealing.SealedBox>
>> # value: SealedBox
>>
>> ? (sealer.seal("foo") :SealedBox).getBrand() == brand
>> # value: true
>>
>>I do not know whether this or its lack is a desirable property, nor
>>whether it is possible to implement in a cryptographic system. This
>>property could be removed from E by hiding the SealedBox guard.
>
> As I discussed above, the E-on-Java implementation does currently
> implement spoofability, since any object with the E Brand can
> masquerade as an authentic Box. Your comments above confirm that this
> fact is subtle and easily missed. In the above E code, "sealer" could
> refer to an object that creates a SealedBox of a different E Brand,
> but that claims to be of the "brand" Brand.
Yes. The corresponding cryptographic property is "recipient-hiding encryption",
where a ciphertext does not leak information about which public key was used to
encrypt it. This was discussed on sci.crypt in the following thread:
<http://groups.google.co.uk/group/sci.crypt/browse_thread/thread/6d55f2194ec361ef/bba7b80796f095fd>
I later did some work on formalizing this property. Following the notation and
the approach to defining security properties from [DHIES], we have:
Adv_Hide(A, ASYM) = 2.Pr[(sk_0, pk_0) <- ASYM.keygen;
(sk_1, pk_1) <- ASYM.keygen;
b <- {0, 1};
A.guess(pk_0, pk_1,
ASYM.encrypt_(pk_b),
ASYM.decrypt_(sk_b)) = b] - 1
That is, the security of a scheme ASYM is determined by an attacker A's
advantage in the following experiment:
- generate two random key pairs: (sk_0, pk_0) and (sk_1, pk_1);
- flip a fair coin, b = 0 or 1;
- give the attacker both public keys, an encryption oracle for pk_b, and
a decryption oracle for sk_b;
- the attacker must guess b with probability significantly > 1/2.
Of course the scheme must also be secure in other senses usually required of
a public-key encryption scheme.
[There is a generalization of this that covers the case of "blinded" encryption,
where multiple equivalent-but-distinct public keys can be derived. See
<http://groups.google.co.uk/group/sci.crypt/msg/cadfb95e695c4b25>
for the gory details, although I'm not sure blinding is relevant here.]
It is fairly easy to come up with encryption schemes that provably have this
security property (the simplest way is to use [DHIES] in a cyclic group with
common parameters for all keys).
>>>Integrity
>>> The content of a Box A cannot be mutated.
>>
>>This is not a property of the sealing system provided by E. The box
>>cannot be mutated, but its contents do not lose mutability.
>
> E-on-Java does implement Integrity as I've defined it. Your second
> sentence above is the crucial one needed to understand the precise
> meaning. You can seal a reference to a mutable object in a Box, but
> you can't change which reference is in the Box once sealed.
An encryption scheme with the corresponding property is called "nonmalleable",
and I suggest using the same term here.
It is implied by "indistinguishability under adaptive chosen ciphertext attack" --
see Definition 4 in [DHIES] (note that this also implies privacy, i.e.
protection + confidentiality).
[DHIES] Michel Abdalla, Mihir Bellare, Phillip Rogaway,
"DHIES: An encryption scheme based on the Diffie-Hellman Problem,"
September 18, 2001.
<http://www-cse.ucsd.edu/users/mihir/papers/dhaes.pdf>
--
David Hopwood <david.hopwood at industrial-designers.co.uk> (note new address)
More information about the cap-talk
mailing list