'RsaSignature2017', 'nonce' => random_string(64), 'creator' => $owner['url'] . '#main-key', 'created' => DateTimeFormat::utcNow() ]; $ohash = self::hash(self::signable_options($options)); $dhash = self::hash(self::signable_data($data)); $options['signatureValue'] = base64_encode(Crypto::rsaSign($ohash . $dhash, $owner['uprvkey'])); 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; } 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; } private static function hash($obj) { return hash('sha256', JsonLD::normalize($obj)); } }