silverpill:
-
RSA was chosen to make implementation process easier for developers. Today the de-facto standard for server-to-server authentication in Fediverse is HTTP signatures with RSASSA-PKCS1-v1_5 algorithm. Every interoperating server already stores an RSA key for each user and knows how to verify those signatures. In order to implement FEP-8b32, developers only need to find some JCS library and adjust their activity construction and validation procedures. And while I understand that
jcs-eddsa-2022is preferable, implementing it would require more effort and that may discourage people. Of course, this is just a guess, and the recommendation will be revised based on a feedback from developers.silverpill:nd while I understand that
jcs-eddsa-2022is preferable, implementing it would require more effort and that may discourage people.I would say: It's better to encourage people to bite the bullet now then later. If the FediVerse is successful, there will be more projects to convince to make the switch than there are now. Furthermore, it should be a lot easier to find an ed25519 library than a jcs one.
-
I am in the process of implementing this FEP in Hubzilla. Regarding backward compatibility: can you provide an example on how to double sign (identity proofs and ld signatures) activities?How should such messages be verified?
I do not want to ditch ld signatures yet since they are required by Mastodon and Friendica to accept relayed messages. AFAIK both projects have not implemented this FEP yet.
Thanks!
Good question! I think you need to add an integrity proof first, and then a linked data signature.
- Recipients that support only linked data signatures will verify the
signatureand ignore theproof. - Recipients that support integrity proofs should remove the
signatureand verify theproofafter that.
Let me know if it works, and I'll update the FEP accordingly.
- Recipients that support only linked data signatures will verify the
-
I think this FEP should point out somewhere that:
- When verifying an Activity, the
controllerparameter of the proof, should be theactorof the Activity. - When verifying an Object, the
controllerparameter of the proof, should be theattributedToof the Object.
I think this would be a step forward in clarifying what integrity constraints on ActivityPub objects mean. The advantage of starting in this FEP is that the conditions should be pretty uncontested. The two points above should "obviously" be true.
Did you mean
verificationMethod?controlleris not listed among possible properties of an integrity proof: https://w3c.github.io/vc-data-integrity/#proofs - When verifying an Activity, the
-
The RDF canonicalization algorithm is actually called URDNA2015. I searched for libraries implementing this algorithm and found Ruby, Python, Javascript, Go, Rust and PHP implementations. This covers all popular AP servers except Pleroma and Mobilizon (written in Elixir). There's no JCS implementation in Ruby (for Mastodon). I think this is a bigger blocker, so URDNA2015 could be a better choice after all.
silverpill:One of the remaining issues here is a lack of clarity regarding proof type. When I read Data Integrity spec I get the impression that it recommends using
DataIntegrityProoftype along withcryptosuiteproperty, but it is not clear how cryptosuites are registered.I found specification for
eddsa-2022cryptosuite: https://w3c.github.io/vc-di-eddsa/.Shouldn't JCS be the clear favorite because it's faster? I cannot find any analysis of the performance of the two algorithms, but it's my expectation knowing roughly what they do.
Also if I understand https://lists.w3.org/Archives/Public/public-vc-wg/2023Jan/0030.html correctly, it's impossible to implement full URDNA without implementing JCS. So library support should favor JCS. (Or implementations are incomplete).
-
helge:
Include test cases of activities that should be valid using various algorithm pairings. This would at least help me, if I wanted to implement this.
Only a small number of proof suites (methods) has been standardized so far: https://w3c-ccg.github.io/vc-extension-registry/#proof-methods. I'm mostly improvising and inventing my own suites. If you want to create an interoperable implementation, we can discuss it here or somewhere else, but I don't want to include non-standard proof suites in the proposal (
helge:JcsRsaSignature2022is used in the example but without it proposal would be incomplete).Specify behavior if Authentication is missing, e.g.
Some servers may process activities in background and respond with 200/202 before authentication is performed.
helge:Discuss behavior for AP S2S 7.1.2 Forwarding from Inbox, e.g.
Should this be a separate section in the proposal? Efficient forwarding is not the only use case of object integrity proofs, so if we talk about this we may as well mention other use cases.
helge:Discuss public key caching. This probably goes beyond the scope of this FEP. So, one might one want add something like This section is non-normative. to it.
That's a good idea. This FEP can include recommendations for dealing with rotated/revoked keys: https://socialhub.activitypub.rocks/t/reuse-of-identity-channel-addresses-revocation-reissue-of-keys/2888
I think a section on sample use cases would really help this proposal.
Another possible use case is to include the object being announced in an Announce activity. This would reduce the peak loads on servers, as only servers not having cached the public key, would need to fetch it.
---
An idea, I had is to use key expiration as a method to decide if content needs to be refetched. I'm not 100% sure if this is a good mechanism, but I thought it might be a good idea to put out there.
-
https://github.com/Wind4Greg/EdDSA-Test-Vectors
is useful. I also think that the proof format
"proof": { "type": "DataIntegrityProof", "cryptosuite": "json-eddsa-2022", "created": "2023-02-24T23:36:38Z", "verificationMethod": "https://vc.example/issuers/5678#z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2", "proofPurpose": "assertionMethod", "proofValue": "z4J5StJRP9nWYuCGaxgeCWXmmMJvVtLuVKvYv7z9pkGP1nYpaVk5hUaA8cvS37ncvbKWZgUTaSyGcavnVvb1at9kZ" }looks good and is specified in the context at https://www.w3.org/ns/credentials/v2
My quick search unfortunately, did not reveal a good description of the context. It was introduced in https://www.w3.org/TR/vc-data-model-2.0/#base-context . The good news is that the context allows for adding an "expires" term. This is important as we will want to encourage usage of "time to live" for ActivityPub.
For people preferring to read Python: https://codeberg.org/helge/vc-di-eddsa-python
Only the JCS part verifies correctly.
-
Hello!
This is a discussion thread for the proposed FEP-8b32: Object Integrity Proofs.Please use this thread to discuss the proposed FEP and any potential problemsor improvements that can be addressed.
Summary
This proposal describes how ActivityPub servers and clients could create self-authenticating activities and objects.
HTTP signatures are often used for authentication during server-to-server interactions. However, this ties authentication to activity delivery, and limits the flexibility of the protocol.
Integrity proofs are sets of attributes that represent digital signatures and parameters required to verify them. These proofs can be added to any activity or object, allowing recipients to verify the identity of the actor and integrity of the data. That decouples authentication from the transport, and enables various protocol improvements such as activity relaying, embedded objects and client-side signing.
Oh, and it also remains to be seen what per-user keys (client-managed and/or server-managed) implementations will already be implementing for E2EE if they prioritize that feature first-- I know Evan is researching this at the moment and there may be some FEPs around that soon. The more composable these various features are, the smaller the lift for any one FEP becomes
-
I found that the test vector in FEP-8b32 (and Mitra's implementation) is inconsistent with the algorithm described in the Data Integrity EdDSA Cryptosuites v1.0 specification.
Looking at section [3.3.1 Create Proof (eddsa-jcs-2022)][1] of the specification, it states:
- Set proof.\@context to unsecuredDocument.\@context.
The test vector, on the other hand, is the result of skipping this step. [Mitra's implementation][2] also omits this step.
Is this test vector in FEP-8b32 intended or is it a bug in the specification?
[1]: https://w3c.github.io/vc-di-eddsa/#create-proof-eddsa-jcs-2022[2]: https://codeberg.org/silverpill/mitra/src/tag/v2.21.0/mitra_utils/src/json_signatures/create.rs#L207-L248
I wrote about this a couple of days ago:
silverpill:JCS context injection PR has been merged, test vectors have been updated as well. I will update my implementation in two stages, according to the plan:
New algorithms are implemented but I haven't pushed changes to Codeberg yet. During the transitional period, consider FEP-8b32 test vectors to be "correct" ones (i.e. don't add
@contextto your proofs). -
helge:
I could suggest a few fixes for the situation now, e.g. versioning the AS
@context. The experience is just not there to know if what I suggest is good.Update:https://www.w3.org/wiki/Activity_Streams/Primer/Context_document_versioninghttps://github.com/w3c/activitystreams/issues/560#issuecomment-1908602094
Good-faith question because I too have mixed feelings about JSON-LD and its tooling/ecosystem support, but would recommending or requiring an RDFC step in signing FEPs (current or future) help the "bad LD" issue, or just further tax/annoy/bully the devs who don't use LD for anything? I was under the impression that RDFC is a lot more feature-complete and street-ready than it was a year ago, but that is more anecdotal/hearsay than based on personal experience.
I think it's better to stay away from anything JSON-LD/RDF related. Developers don't like it, and for those few who do JSON-LD processing it seems to be a constant source of problems.
-
In the future, would it be possible to send activities using only Object Integrity Proofs and not rely on HTTP Signatures? Or are Object Integrity Proofs just a complement to HTTP Signatures?
I would say that HTTP Signatures is table-stakes to federate with the mainstream Fediverse and will remain that way at least in the short-term. I'm not sure which implementations/communities are open to dropping signatures at the server/HTTPS layer in leiu of relying solely on client-managed signing, and I would imagine it's a liability/regulatory issue for some servers on top of a technical sea change. Suffice it to say that dropping TLS-level signing would be a big protocol change and I haven't seen much conversation implying such a change is imminent!
That said, while it may not be a replacement for HTTP-Signatures, there are plenty of other reasons to adopt it and promote its general adoption. Lots of developer-community research lately has focused on interoperability with other decentralized networks, and I think the Object Proofs model maps well to how Nostr and Bluesky do client-side per-object signing. A bridge to those networks might be able to validate Object Proofs and resign/countersign/etc individual posts for republishing in those other networks (maybe @snarfed can add color here, I probably have the terminology at least a little wrong?). Additionally, there are some portability corner-cases like the dead-server salvage-migration (see user story 3 here), which might also justify client-signing individual objects even if connections to that server (while it's up!) are also secured by HTTP-Sig.
-
Hello!
This is a discussion thread for the proposed FEP-8b32: Object Integrity Proofs.Please use this thread to discuss the proposed FEP and any potential problemsor improvements that can be addressed.
Summary
This proposal describes how ActivityPub servers and clients could create self-authenticating activities and objects.
HTTP signatures are often used for authentication during server-to-server interactions. However, this ties authentication to activity delivery, and limits the flexibility of the protocol.
Integrity proofs are sets of attributes that represent digital signatures and parameters required to verify them. These proofs can be added to any activity or object, allowing recipients to verify the identity of the actor and integrity of the data. That decouples authentication from the transport, and enables various protocol improvements such as activity relaying, embedded objects and client-side signing.
Proposal now recommends
jcs-eddsa-2022cryptosuite: https://codeberg.org/fediverse/fep/pulls/92I'll implement it too and report my findings.
-
Thanks, i think that will work if it is made clear that signature has to be removed before verifying proof.
Currently i am strugling with our jsonld library which fails as soon as i add
https://w3id.org/security/data-integrity/v1to the contextI don't know how much you have in common with Friendica, but they had a similar problem: https://github.com/friendica/friendica/issues/12815#issuecomment-1685307304
-
hongminhee:
I would like to use ECDSA as the Web Cryptography API does not support EdDSA.
I don't recommend that because all existing FEP-8b32 implementations use
hongminhee:eddsa-jcs-2022. And it looks like WebCrypto support is being worked on? https://github.com/w3c/webcrypto/pull/362Would it be possible to add an example in the test suite that uses
ecdsa-jcs-2019as the cryptosuite?You can find test vectors for ecdsa-jcs-2019 in sections A.3 and A.4: https://www.w3.org/TR/vc-di-ecdsa/#representation-ecdsa-jcs-2019-with-curve-p-256.
I think FEP-8b32 should recommend only one cryptosuite to avoid fragmentation and extra work for implementers, and over the course of the past 1.5 years we came to an agreement that
hongminhee:eddsa-jcs-2022is the best option. I may implement ecdsa-jcs-2019 in my personal AP server at some point, but this is not going to happen anytime soonAlso, could there be a cryptosuite that uses RSA and JCS together?
It is possible, I used RSA-based integrity proofs (with a custom cryptosuite) in the early days of FEP-8b32. But people who work on W3C Data Integrity specification consider RSA outdated and insecure, and have no plans to define RSA-JCS cryptosuite.
Thank you for your kind response!
silverpill:And it looks like WebCrypto support is being worked on? Add Curve25519 by twiss · Pull Request #362 · w3c/webcrypto · GitHub
Thanks to you, I was able to successfully sign and verify with Ed25519 in Node.js, Bun, and Deno.
silverpill:I think FEP-8b32 should recommend only one cryptosuite to avoid fragmentation and extra work for implementers, and over the course of the past 1.5 years we came to an agreement that
eddsa-jcs-2022is the best option.I will try to implement
eddsa-jcs-2022into Fedify as you said! -
Hello!
This is a discussion thread for the proposed FEP-8b32: Object Integrity Proofs.Please use this thread to discuss the proposed FEP and any potential problemsor improvements that can be addressed.
Summary
This proposal describes how ActivityPub servers and clients could create self-authenticating activities and objects.
HTTP signatures are often used for authentication during server-to-server interactions. However, this ties authentication to activity delivery, and limits the flexibility of the protocol.
Integrity proofs are sets of attributes that represent digital signatures and parameters required to verify them. These proofs can be added to any activity or object, allowing recipients to verify the identity of the actor and integrity of the data. That decouples authentication from the transport, and enables various protocol improvements such as activity relaying, embedded objects and client-side signing.
Like the test vectors in the Data Integrity EdDSA Cryptosuites v1.0 specification, it would be nice if the test vectors for FEP-8b32 included an intermediate step to compute the proof:
- Canonical object
- Object hash (hex)
- Canonical proof config
- Proof config hash (hex)
- Combination of two hashes (hex)
- Signature of combined hashes (hex)
- Signature (base58-btc)
Would this be possible?
-
Here's an interesting use case: integrity proofs can be used to implement client+relay model, where the signing key is stored on the client and activity signing is done by client as well. The relay (server) accepts signed activity via C2S and delivers it to the audience. The relay can refuse to deliver activity but it can not change the activity in any way, because that would invalidate the signature.
-
Hello!
This is a discussion thread for the proposed FEP-8b32: Object Integrity Proofs.Please use this thread to discuss the proposed FEP and any potential problemsor improvements that can be addressed.
Summary
This proposal describes how ActivityPub servers and clients could create self-authenticating activities and objects.
HTTP signatures are often used for authentication during server-to-server interactions. However, this ties authentication to activity delivery, and limits the flexibility of the protocol.
Integrity proofs are sets of attributes that represent digital signatures and parameters required to verify them. These proofs can be added to any activity or object, allowing recipients to verify the identity of the actor and integrity of the data. That decouples authentication from the transport, and enables various protocol improvements such as activity relaying, embedded objects and client-side signing.
I think this FEP should point out somewhere that:
- When verifying an Activity, the
controllerparameter of the proof, should be theactorof the Activity. - When verifying an Object, the
controllerparameter of the proof, should be theattributedToof the Object.
I think this would be a step forward in clarifying what integrity constraints on ActivityPub objects mean. The advantage of starting in this FEP is that the conditions should be pretty uncontested. The two points above should "obviously" be true.
- When verifying an Activity, the
-
A few thoughts (not really comments yet):
- One should explain the distinction between an identifier and a public key. This is not a technical distinction (both can be considered as points on Curve 25519) but a distinction of purpose.
- An Identifier identifies an actor
- A Public Key is used by the actor to prove he did something, i.e. by signing it. (Awful sentence)
- There are more key types see
https://signal.org/docs/specifications/x3dh/#keys
Given their use, one can rotate public keys quite frequently. For example, I could issue a new public key every week with a 2 week expiry. Once the public key is expired, I publish the private key. This means that signatures don't make it impossible to delete objects.
I'm unsure if I like the name "MultiKey". "Multi" might be taken to mean "multipurpose" instead of being a format. It might be better to specify the use as "SigningKey". Maybe, one can invent a naming scheme that also covers fep-c390 and uses such as
- X25519 key exchange, see this
- What one needs for x3dh / double ratchet
- Other use cases? Object Capabilities?
helge:One should explain the distinction between an identifier and a public key. This is not a technical distinction (both can be considered as points on Curve 25519) but a distinction of purpose.
@codenamedmitri proposed to use properties like
helge:authentication,keyAgreementetc to make the purpose of the key clear. I support this.Given their use, one can rotate public keys quite frequently. For example, I could issue a new public key every week with a 2 week expiry. Once the public key is expired, I publish the private key. This means that signatures don’t make it impossible to delete objects.
FEP-521a allows actor to have multiple keys, so you can add a new key without removing the expired one (just mark it as "expired" somehow).
helge:I’m unsure if I like the name “MultiKey”.
I took it from "EdDSA Cryptosuite v2022" document. There's a warning about moving it to Data Integrity spec, so we can expect it to become standard. If we replace
attachmentwithauthentication, the ambiguity will disappear. - One should explain the distinction between an identifier and a public key. This is not a technical distinction (both can be considered as points on Curve 25519) but a distinction of purpose.
-
Hello!
This is a discussion thread for the proposed FEP-8b32: Object Integrity Proofs.Please use this thread to discuss the proposed FEP and any potential problemsor improvements that can be addressed.
Summary
This proposal describes how ActivityPub servers and clients could create self-authenticating activities and objects.
HTTP signatures are often used for authentication during server-to-server interactions. However, this ties authentication to activity delivery, and limits the flexibility of the protocol.
Integrity proofs are sets of attributes that represent digital signatures and parameters required to verify them. These proofs can be added to any activity or object, allowing recipients to verify the identity of the actor and integrity of the data. That decouples authentication from the transport, and enables various protocol improvements such as activity relaying, embedded objects and client-side signing.
Here's an interesting use case: integrity proofs can be used to implement client+relay model, where the signing key is stored on the client and activity signing is done by client as well. The relay (server) accepts signed activity via C2S and delivers it to the audience. The relay can refuse to deliver activity but it can not change the activity in any way, because that would invalidate the signature.
-
Great questions. (re whether the authentication or assertionMethod purpose is more appropriate). I think we should go with assertionMethod (when signing activities), and reserve authentication just for logging in with DID Auth ceremonies.Can you provide a link to the most recent draft (draft like) document for DID Auth? https://github.com/WebOfTrustInfo/rwot6-santabarbara/blob/master/final-documents/did-auth.md seems out of date …
-
Hello!
This is a discussion thread for the proposed FEP-8b32: Object Integrity Proofs.Please use this thread to discuss the proposed FEP and any potential problemsor improvements that can be addressed.
Summary
This proposal describes how ActivityPub servers and clients could create self-authenticating activities and objects.
HTTP signatures are often used for authentication during server-to-server interactions. However, this ties authentication to activity delivery, and limits the flexibility of the protocol.
Integrity proofs are sets of attributes that represent digital signatures and parameters required to verify them. These proofs can be added to any activity or object, allowing recipients to verify the identity of the actor and integrity of the data. That decouples authentication from the transport, and enables various protocol improvements such as activity relaying, embedded objects and client-side signing.
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login