#social 2017-08-05
2017-08-05 UTC
JanKusanagi, xmpp-social, tantek, jankusanagi_, timbl and tOkeshu joined the channel
# tOkeshu hi
# tOkeshu I'm looking at http signed messages
# tOkeshu and I lack some crypto knowledge, if anyone could help me that would be nice :)
# tOkeshu in the spec here https://web-payments.org/specs/source/http-signatures/ there is rsa-sha256 mentionned
# tOkeshu but it seems there is more to it that just rsa and sha256?
# tOkeshu does anyone know what is the proper way to sign something with rsa-sha256 ?
# saranix it's as simple as calling openssl_sign() from most languages
# saranix the "difficult" part of http sigs is the canonicalization of the headers. But it's a lot easier than the canonicalization of a lot of other algos
# tOkeshu saranix: canonicalization? you mean translating header to lowercase, etc. ?
# saranix yes
# tOkeshu saranix: thanks for the tip, I did not think OpenSSL would allow me to do that, I was looking at more low level libraries
# tOkeshu key* not keep
# tOkeshu however, I can't seem to have the correct result: I look at https://web-payments.org/specs/source/http-signatures/#default-test specifically and I use the given keep and try to sign with PyOpenSSL but the result is different for Signature
# saranix I get a different value too. strange...
# saranix do you get jKyvPcxB4JbmYY4mByyBY7cZfNl4OW9HpFQlG7N4YcJPteKTu4MWCLyk+gIr0wDgqtLWf9NLpMAMimdfsH7FSWGfbMFSrsVTHNTk0rK3usrfFnti1dxsM4jl0kYJCKTGI/UWkqiaxwNiKqGcdlEDrTcUhhsFsOIo8VhddmZTZ8w= ?
# tOkeshu yes
# saranix :-D
# tOkeshu maybe they signed it with the public key (is such thing possible?)
# saranix maybe there's a bug in the spec. Or maybe there's something missing from the description "The string to sign would be:" (which I would argue is a bug in the spec)
# tOkeshu ok then
# saranix it would be pretty embarrasing if your example is wrong... you'd think they'd double-check that
# tOkeshu I agree
# tOkeshu now what bothers me a bit is the algorithm attribute
# tOkeshu are we expected to allow any algoritm?
# saranix hmm... I tried the "Basic Test" just for kicks and also wrong sig. That is quite concerning...
# saranix From what I can tell there are 2 algos specified, hmac, and rsa-sha256 (I think rsa-sha1 and rsa-sha512 are also valid varients)
# saranix but you don't have to support algos you don't know
# saranix I'd say most people probably use rsa-sha256
# saranix For Basic Test I get: HUxc9BS3P/kPhSmJo+0pQ4IsCo007vkv6bUm4Qehrx+B1Eo4Mq5/6KylET72ZpMUS80XvjlOPjKzxfeTQj4DiKbAzwJAb4HX3qX6obQTa00/qPDXlMepD2JtTw33yNnm/0xV7fQuvILN/ys+378Ysi082+4xBQFwvhNvSoVsGv4=
# saranix for All Headers Test I get: Ef7MlxLXoBovhil3AlyjtBwAL9g4TN3tibLj7uuNB3CROat/9KaeQ4hW2NiJ+pZ6HQEOx9vYZAyi+7cmIkmJszJCut5kQLAwuX+Ms/mUFvpKlSo9StS2bMXDBNjOh4Auj774GFj4gwjS+3NhFeoqyr/MuN6HsEnkvn6zdgfE2i0=
# tOkeshu same here
# saranix well that's good I guess
# tOkeshu another thing that I don't get is, how are clients and servers supposed to discover the keys
# tOkeshu I the specific case of signed http messages, I guess this is out of the spec. But then what about ActivityPub?
# saranix For ActivityPub, you use the publicKeyPem attribute on the actor object, or, alternately, the publicKey object parameter
# tOkeshu I don't see that anywhere in the spec :/
# saranix it's not in ActivityPub. Should be. https://github.com/w3c/activitypub/issues/203
# saranix As you can tell from the issue comments there's still some unsettled things around this issue.
# saranix how did you find out about httpsigs?
# tOkeshu well it is mentionned in the AP spec
# tOkeshu there https://www.w3.org/TR/activitypub/#authorization-lds
# saranix it actually points to https://www.w3.org/TR/activitypub/#provideClientKey
# saranix eww
# saranix that's an ugly way
# saranix I like publicKeyPem better
# tOkeshu what I don't grasp though, is that, for me, this mechanism was supposed to verify s2s exchanges (to avoid posting data on the behalf of someone without authorization), so I don't understand why it has to be in the actor object
# saranix tOkeshu: you stepped on a landmine :-) That's a hot topic around here... the server isn't it's own entity yet it's trusted to hold keys
# tOkeshu haha damn
# saranix I'd be happy for you to join my small faction in support of better semantics :-)
# tOkeshu I mean there is more to it than I thought. Do http sig actually works for enforcing that a server is publishing content only on the behalf of it's own users and not others?
# saranix tOkeshu: yeah that's pretty much it. Considering https is a thing, it doesn't really add much
# saranix tOkeshu: it does allow multiple applications on a single origin though
# saranix ... which I think is the intention
# saranix jaywink: what do you mean it won't work?
# saranix jaywink: I think puckipedia has a proof-of-concept
# tOkeshu you mean half finished
# tOkeshu :D
# saranix I haven't gotten around to mine yet. I haven't a clue when I will either...
# saranix I like ld-sigs over salmon because of the potential for non-exploding objects
# tOkeshu I'm still confused how any of that can sort out forget activities from legit ones tbh :/
# tOkeshu forged*
# saranix tOkeshu: if you've got social app at http://mysite.example/social, and somewiki at http://mysite.example/somewiki, http sigs basically doesn't allow somewiki to pretend to be social's users and vice-versa
# saranix jaywink: I'm not happy about fetching every sub-object either. It's explosive datarhea
# tOkeshu saranix: how is that? is it assuming the keys are already exchanged?
# saranix tOkeshu: well the actor's key would have to be published under the same tree, because the same softwares would have control over that tree
# tOkeshu saranix: can we take it step by step?
# tOkeshu I am mysite.evil.com
# tOkeshu I want to post something on the behalf of mysite.example
# tOkeshu I push an activity to mysite.something.de
# tOkeshu the signature can still be valid right?
# saranix yes that's another feature...
# saranix but I think because of the way the AP spec works, most people will still end up just fetching https://mysite.example/post/uuid anyway
# saranix you have to if it's a subobject... unless you move up from http-sigs to either ld-sigs or magic-env sigs
# tOkeshu what about a like? A like is in the form of
{"type": "Like", "actor": "http://mysite.example", "object": "http://mysite.something.de", "id": "mysite.evil.com"}
# tOkeshu in this case I try to pretend something was liked by actor. The activity is still dereferencable from mysite.evil.com
# saranix yeah, authentication is really it's primary use
# tOkeshu jaywink: but the "original" is available on mysite.evil.com. So you would get the same object anyway.
# tOkeshu there is just a missmatch between the actor's origin and the activity's origin
# tOkeshu which I guess, should be the same? always?
# saranix tOkeshu: as I said, feature. That's so you can post on a forum or in a friend's collection elsewhere
# saranix ideally, you'd still want the canonical to be your own origin though, just so you can keep your document safe from site closures
# saranix http-sigs won't allow that though because http-sigs is ephemeral. You are signing the headers of a particular http transaction
# saranix you need ld-sigs or better for that
# tOkeshu hmmm ok
# tOkeshu jaywink: I don't get your point
# tOkeshu anyway, I guess since this part of the spec is a bit dangling, I should probably not implement that right now
# tOkeshu if anyone is curious, my implementation is writing in django there: https://github.com/tOkeshu/activitypub-example
# tOkeshu it's more of a prototype server for tests than anything else to be honest
# tOkeshu (I plan to write a more concrete implementation for a clone of mastodon, in django too)
# saranix yay! congrats tOkeshu
# tOkeshu saranix: I don't why you're congratulate me but thanks :D
# tOkeshu (arf sorry, my english is terrible today)
# saranix tOkeshu: for writing a test impl. it's a milestone :-)
# saranix but back to what jaywink said, the point of http-sigs is for private auth. So, for example http://bob.example can fetch a http://sue.example/posts/for-bob-only-1234 by authenticating as Bob.
# tOkeshu I see!
# tOkeshu saranix: wait, how do you know it's bob in the signature? or do you map implicitely the post with bob's key?
JanKusanagi joined the channel
# saranix tOkeshu: bob's activitypub sends a http signed get request for the post, sue's server authorizes it because it's visible to "http://bob.example" (an actor object) which has bob's key attached to it
# saranix tOkeshu: similarly, bob's activitypub could POST an
{type:Add, object:bobs_thing, target:sues_collection}
, and if sue allows bob to do this the server authenticates the POSTtOkeshu joined the channel