summary refs log tree commit diff
diff options
context:
space:
mode:
authorpdp8 <pdp8@pdp8.info>2023-05-04 17:52:56 +0200
committerpdp8 <pdp8@pdp8.info>2023-05-04 17:52:56 +0200
commit7340bf4afb5c0ca8f3d72db8848222508bb8807c (patch)
tree9176951f7fa9b4e3753acbe70c2c8d74ff7a8a37
parent437fadbf926f1811a0ef6b6897b3fd841c2242d5 (diff)
local signature accept
-rw-r--r--application.rb70
1 files changed, 31 insertions, 39 deletions
diff --git a/application.rb b/application.rb
index ab42c1f..c821876 100644
--- a/application.rb
+++ b/application.rb
@@ -158,16 +158,17 @@ class Application
       body = object.to_json
       digest = "SHA-256=" + sha256.base64digest(body)
 
-      signed_string = "(request-target): post /inbox\nhost: #{uri.host}\ndate: #{date}\ndigest: #{digest}"
+      signed_string = "(request-target): post /inbox\nhost: #{uri.host}\ndate: #{date}\ndigest: #{digest}\ncontent-type: application/activity+json"
+      puts signed_string
       signature = Base64.strict_encode64(keypair.sign(OpenSSL::Digest.new('SHA256'), signed_string))
-      signed_header = 'keyId="' + ACTOR + '#main-key",algorithm="rsa-sha256",headers="(request-target) host date digest",signature="' + signature + '"'
+      signed_header = 'keyId="' + ACTOR + '#main-key",algorithm="rsa-sha256",headers="(request-target) host date digest content-type",signature="' + signature + '"'
 
       uri = URI.parse(get(url)["inbox"])
       http = Net::HTTP.new(uri.host, uri.port)
       http.use_ssl = true
       header = {
-        'Accept' => 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"',
-        'Content-Type' => 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"',
+        # 'Accept' => 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"',
+        'Content-Type' => 'application/activity+json',
         'Host' => uri.host,
         'Date' => date,
         'Digest' => digest,
@@ -178,8 +179,8 @@ class Application
       request.body = body
 
       response = http.request(request)
-      # puts(response.body, response.code)
-      puts(response.code)
+      puts(response.body, response.code)
+      # puts(response.code)
       # puts(response.body["signed_string"])
       # puts(response.body["signature"])
     end
@@ -200,42 +201,33 @@ class Application
 
   def verify env
     # https://github.com/mastodon/mastodon/blob/main/app/controllers/concerns/signature_verification.rb
-    puts env
-    # puts env.select { |k, v| k.match(/^HTTP_/) }
-    #  puts env["HTTP_SIGNATURE"] # .split(',').each do |pair|
-    begin
-      signature_params = {}
-      env["HTTP_SIGNATURE"].split(',').each do |pair|
-        k, v = pair.split('=')
-        signature_params[k] = v.gsub('"', '')
-      end
+    # TODO verify digest
+    signature_params = {}
+    env["HTTP_SIGNATURE"].split(',').each do |pair|
+      k, v = pair.split('=')
+      signature_params[k] = v.gsub('"', '')
+    end
 
-      # puts signature_params
-      key_id = signature_params['keyId']
-      headers = signature_params['headers']
-      signature = Base64.decode64(signature_params['signature'])
+    key_id = signature_params['keyId']
+    headers = signature_params['headers']
+    signature = Base64.decode64(signature_params['signature'])
 
-      actor = get key_id
-      key = OpenSSL::PKey::RSA.new(actor['publicKey']['publicKeyPem'])
+    actor = get key_id
+    key = OpenSSL::PKey::RSA.new(actor['publicKey']['publicKeyPem'])
 
-      comparison = headers.split(' ').map do |signed_params_name|
-        if signed_params_name == '(request-target)'
-          '(request-target): post /inbox'
-        elsif signed_params_name == 'content-type'
-          "#{signed_params_name}: #{env["CONTENT_TYPE"]}"
-        else
-          "#{signed_params_name}: #{env["HTTP_" + signed_params_name.upcase]}"
-        end
-      end.join("\n")
-
-      puts comparison
-      # key.verify(OpenSSL::Digest::SHA256.new, signature, comparison)
-      key.verify(OpenSSL::Digest.new('SHA256'), signature, comparison)
-    rescue => e
-      puts e.class
-      # puts e.message
-      false
-    end
+    comparison = headers.split(' ').map do |signed_params_name|
+      if signed_params_name == '(request-target)'
+        '(request-target): post /inbox'
+      elsif signed_params_name == 'content-type'
+        "#{signed_params_name}: #{env["CONTENT_TYPE"]}"
+      else
+        "#{signed_params_name}: #{env["HTTP_" + signed_params_name.upcase]}"
+      end
+    end.join("\n")
+
+    puts comparison
+    puts env["HTTP_SIGNATURE"]
+    key.verify(OpenSSL::Digest.new('SHA256'), signature, comparison)
   end
 
   def get url