]> git.mxchange.org Git - friendica.git/blobdiff - src/Util/LDSignature.php
Changed conversation url (used for AP)
[friendica.git] / src / Util / LDSignature.php
index a52d84e478a36e803ccb8401e3b564d43fa258df..51086ac3e14a9b45e0caeedc4d11167e0ee16a10 100644 (file)
@@ -6,6 +6,11 @@ use Friendica\Util\JsonLD;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Protocol\ActivityPub;
 
+/**
+ * @brief Implements JSON-LD signatures
+ *
+ * Ported from Osada: https://framagit.org/macgirvin/osada
+ */
 class LDSignature
 {
        public static function isSigned($data)
@@ -13,42 +18,40 @@ class LDSignature
                return !empty($data['signature']);
        }
 
-       public static function isVerified($data, $pubkey = null)
+       public static function getSigner($data)
        {
                if (!self::isSigned($data)) {
                        return false;
                }
 
-               if (empty($pubkey)) {
 /*
-                       $creator = $data['signature']['creator'];
-                       $actor = JsonLD::fetchElement($data, 'actor', 'id');
-
-                       $url = (strpos($creator, '#') ? substr($creator, 0, strpos($creator, '#')) : $creator);
-
-                       $profile = ActivityPub::fetchprofile($url);
-                       if (!empty($profile)) {
-                               logger('Taking key from creator ' . $creator, LOGGER_DEBUG);
-                       } elseif ($url != $actor) {
-                               $profile = ActivityPub::fetchprofile($actor);
-                               if (empty($profile)) {
-                                       return false;
-                               }
-                               logger('Taking key from actor ' . $actor, LOGGER_DEBUG);
-                       }
+               $creator = $data['signature']['creator'];
+               $actor = JsonLD::fetchElement($data, 'actor', 'id');
 
-*/
-                       $actor = JsonLD::fetchElement($data, 'actor', 'id');
-                       if (empty($actor)) {
-                               return false;
-                       }
+               $url = (strpos($creator, '#') ? substr($creator, 0, strpos($creator, '#')) : $creator);
 
+               $profile = ActivityPub::fetchprofile($url);
+               if (!empty($profile)) {
+                       logger('Taking key from creator ' . $creator, LOGGER_DEBUG);
+               } elseif ($url != $actor) {
                        $profile = ActivityPub::fetchprofile($actor);
-                       if (empty($profile['pubkey'])) {
+                       if (empty($profile)) {
                                return false;
                        }
-                       $pubkey = $profile['pubkey'];
+                       logger('Taking key from actor ' . $actor, LOGGER_DEBUG);
+               }
+
+*/
+               $actor = JsonLD::fetchElement($data, 'actor', 'id');
+               if (empty($actor)) {
+                       return false;
+               }
+
+               $profile = ActivityPub::fetchprofile($actor);
+               if (empty($profile['pubkey'])) {
+                       return false;
                }
+               $pubkey = $profile['pubkey'];
 
                $ohash = self::hash(self::signable_options($data['signature']));
                $dhash = self::hash(self::signable_data($data));
@@ -56,7 +59,11 @@ class LDSignature
                $x = Crypto::rsaVerify($ohash . $dhash, base64_decode($data['signature']['signatureValue']), $pubkey);
                logger('LD-verify: ' . intval($x));
 
-               return $x;
+               if (empty($x)) {
+                       return false;
+               } else {
+                       return $actor;
+               }
        }
 
        public static function sign($data, $owner)
@@ -65,7 +72,7 @@ class LDSignature
                        'type' => 'RsaSignature2017',
                        'nonce' => random_string(64),
                        'creator' => $owner['url'] . '#main-key',
-                       'created' => DateTimeFormat::utcNow()
+                       'created' => DateTimeFormat::utcNow(DateTimeFormat::ATOM)
                ];
 
                $ohash = self::hash(self::signable_options($options));
@@ -75,32 +82,21 @@ class LDSignature
                return array_merge($data, ['signature' => $options]);
        }
 
-
        private static function signable_data($data)
        {
-               $newdata = [];
-               if (!empty($data)) {
-                       foreach ($data as $k => $v) {
-                               if (!in_array($k, ['signature'])) {
-                                       $newdata[$k] = $v;
-                               }
-                       }
-               }
-               return $newdata;
+               unset($data['signature']);
+               return $data;
        }
 
-
        private static function signable_options($options)
        {
                $newopts = ['@context' => 'https://w3id.org/identity/v1'];
-               if (!empty($options)) {
-                       foreach ($options as $k => $v) {
-                               if (!in_array($k, ['type','id','signatureValue'])) {
-                                       $newopts[$k] = $v;
-                               }
-                       }
-               }
-               return $newopts;
+
+               unset($options['type']);
+               unset($options['id']);
+               unset($options['signatureValue']);
+
+               return array_merge($newopts, $options);
        }
 
        private static function hash($obj)