|
|
@@ -0,0 +1,107 @@ |
|
|
|
Object Signing |
|
|
|
============== |
|
|
|
|
|
|
|
Signing objects is very important. But the other issue is authenticating |
|
|
|
that the signed object is valid. One issue that is if a key is |
|
|
|
compromised, it can be used to sign statements that objects in the past |
|
|
|
are valid. One way to address this situation is to sign the current |
|
|
|
Merkle DAG that contains all the "produced" objects by that author. The |
|
|
|
tree structure of a Merkle DAG with selective split locations allow the |
|
|
|
tree to add additional objects w/o recalculating the entire tree. |
|
|
|
|
|
|
|
This also allows rolling keys more simply, as the new key starts signing |
|
|
|
the new root, and once verification of the new key has been done, the |
|
|
|
objects are now authenticated again. When this happens, no old keys |
|
|
|
need be kept, and it's encouraged to remove the old keys and only keep |
|
|
|
one, the current key, for each identity. |
|
|
|
|
|
|
|
As this spec is geared toward JSON encoding, but |
|
|
|
|
|
|
|
Objects: |
|
|
|
Identity |
|
|
|
- uuid: UUIDv4 |
|
|
|
- updated: Date that this object was last updated |
|
|
|
- name: Common name of this identity. |
|
|
|
- email (optional) |
|
|
|
- info |
|
|
|
- tree_hash: Hash of the root of the object tree |
|
|
|
- public_key: A publicKey object as specified in [JSF] |
|
|
|
- sig: The signature of the object, a signaturecore as defined by [JSF]. |
|
|
|
|
|
|
|
name: Note that it is recommended to ensure that this is unique among |
|
|
|
all the identities imported/trusted, and that work is done to present |
|
|
|
look alike names. Giving an option to rename an Identity locally is |
|
|
|
highly recommended to make it easier for the user. |
|
|
|
info: General information text about this identity. |
|
|
|
tree_hash: The multihash of the root of the object tree. |
|
|
|
sig: Note that keyId and publicKey should not be included, as the public |
|
|
|
key used to verify the signature MUST be the publick_key as specified |
|
|
|
by the public_key property of the Identity object. |
|
|
|
|
|
|
|
ValidIdentity |
|
|
|
- identity: UUIDv4 of the identity. |
|
|
|
- identity_pubkey: The publicKey object, per [JSF], of the Identity object |
|
|
|
being asserted. |
|
|
|
- assertee: UUIDv4 of the identity asserting the validity. |
|
|
|
- assertee_pubkey: The publicKey object, per [JSF], of the Identity object |
|
|
|
being asserted. |
|
|
|
- sig: Signature of the assertion, a signateurecore by [JSF]. |
|
|
|
|
|
|
|
It is yet to be decided if the ValidIdentity object will be used. |
|
|
|
|
|
|
|
The tree_hash is a [multihash]. The data refered will be a JSON [JCS] |
|
|
|
encoded object or array. If it is an array, then each element of the |
|
|
|
array will be a multihash refering to an object that validated by the |
|
|
|
tree. The array MUST on contain unique multihashes, that is the array |
|
|
|
is the equivalent of a set. The array MUST be sorted, so that a binary |
|
|
|
search may be used over the array to find if a multihash is present or |
|
|
|
not. If the data is an object, it will contain a key to help locate |
|
|
|
the object, with the value being another multihash, refering to either |
|
|
|
an object or array again. In all cases, the order of objects MUST be: |
|
|
|
tree_hash -> [ object -> ]* array -> authenticated object. If objects |
|
|
|
are used, the keys SHALL be based upon the last modified date of the |
|
|
|
object. The first level MUST be year, then month, then day, then hour, |
|
|
|
then minute, then second, then milisecond, then microsecond. If the |
|
|
|
encoded array is longer than 256KiB, it MUST be broken up, and a new |
|
|
|
level of objects MUST be added. |
|
|
|
|
|
|
|
Note that the contents of the multihash are NOT distributed w/ the |
|
|
|
Identity object. The entire tree may be very large, and a complete |
|
|
|
tree is NOT needed to verify a subset of the tree. It is expected that |
|
|
|
the parts will be hosted via IPFS, or another mechanism allowing the |
|
|
|
retrival of the data. |
|
|
|
|
|
|
|
Questions: |
|
|
|
- Should ranges be supported for keys? That is, days could be `05-13`. |
|
|
|
Advantages, easier to split nodes. Actually, better will be to use |
|
|
|
a proper B-tree style structure, where there's a left node, and then |
|
|
|
each key has all the values between it and the next node. |
|
|
|
- Use Base64URL or Base32? JSF uses Base64URL though. |
|
|
|
- Should hard limits be enforced on the array length? |
|
|
|
- IPFS has a 1MiB block size limit, and it looks like UnixFS uses a |
|
|
|
default block size of 256KiB, so something similar should be used. |
|
|
|
Maybe recommend even smaller, say 8KiB? |
|
|
|
- What should block garbage collection be? That is when a block is |
|
|
|
no longer in the tree, how long should it be "available" for? This |
|
|
|
partly depends upon how often the Identity object is published, that |
|
|
|
is, only push a complete tree when an Identity hash is "published" or |
|
|
|
fetched publicly. |
|
|
|
- When distributing a set, use the IPFS CAR format? or something else? |
|
|
|
- Should the merkle tree objects be a proper object themselves? That |
|
|
|
is have their own UUID? If anything, this is more like a UUIDv5 type |
|
|
|
thing where the object would have a UUIDv5, BUT why use that when |
|
|
|
hashing the object directly gives the same results? Advantage, the |
|
|
|
objects can be passed as normal, everyday objects, disadvantage is |
|
|
|
that there will be more overhead, and cannot use IPFS directly for |
|
|
|
serving the blocks. |
|
|
|
|
|
|
|
Answered: |
|
|
|
- Should a [Rabin fingerprint] be used? Other option is to create a |
|
|
|
n-tree. No, as this needs to be an append (in time) friendly |
|
|
|
structure, where inserting hashes into a sorted list will be random, |
|
|
|
causing lots of blocks to be created and unable to be cached. |
|
|
|
|
|
|
|
[Rabin fingerprint]: https://en.wikipedia.org/wiki/Rabin_fingerprint |
|
|
|
[multihash]: https://multiformats.io/multihash/ |
|
|
|
[JCS]: https://tools.ietf.org/html/rfc8785 |
|
|
|
[JSF]: https://cyberphone.github.io/doc/security/jsf.html |