]> git.mxchange.org Git - friendica.git/blob - include/diaspora.php
eedcad719df77d096bfa92a66b9160478389e12b
[friendica.git] / include / diaspora.php
1 <?php
2
3
4
5
6 function diaspora_base_message($type,$data) {
7
8         $tpl = get_markup_template('diaspora_' . $type . '.tpl');
9         if(! $tpl) 
10                 return '';
11         return replace_macros($tpl,$data);
12
13 }
14
15
16 function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) {
17         $a = get_app();
18
19         $inner_aes_key = random_string(16);
20         $b_inner_aes_key = base64_encode($inner_aes_key);
21         $inner_iv = random_string(16);
22         $b_inner_iv = base64_encode($inner_iv);
23
24         $outer_aes_key = random_string(16);
25         $b_outer_aes_key = base64_encode($outer_aes_key);
26         $outer_iv = random_string(16);
27         $b_outer_iv = base64_encode($outer_iv);
28         
29         $handle = 'acct:' . $user['nickname'] . '@' . substr($a->get_baseurl(), strpos('://') + 3);
30
31         $padded_data = pkcs5_pad($msg);
32         $inner_encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $inner_aes_key, $padded_data, MCRYPT_MODE_CBC, $inner_iv);
33
34         $b64_data = base64_encode($inner_encrypted);
35         $b64url_data = base64url_encode($b64_data);
36         $b64url_stripped = str_replace(array("\n","\r"," ","\t"),array('','','',''),$b64url_data);
37     $lines = str_split($b64url_stripped,60);
38     $data = implode("\n",$lines);
39         $data = $data . (($data[-1] != "\n") ? "\n" : '') ;
40         $type = 'application/atom+xml';
41         $encoding = 'base64url';
42         $alg = 'RSA-SHA256';
43
44         $signable_data = $data  . '.' . base64url_encode($type) . "\n" . '.' 
45                 . base64url_encode($encoding) . "\n" . '.' . base64url_encode($alg) . "\n";
46
47         $signature = '';
48         $result = openssl_sign($signable_data,$signature,$prvkey,'SHA256');
49
50         $sig = base64url_encode($signature);
51
52 $decrypted_header = <<< EOT
53 <decrypted_header>
54   <iv>$b_inner_iv</iv>
55   <aes_key>$b_inner_aes_key</aes_key>
56   <author>
57     <name>{$contact['name']}</name>
58     <uri>$handle</uri>
59   </author>
60 </decrypted_header>
61 EOT;
62
63         $decrypted_header = pkcs5_pad($decrypted_header);
64         $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $outer_aes_key, $decrypted_header, MCRYPT_MODE_CBC, $outer_iv);
65
66         $outer_json = json_encode(array('iv' => $b64_outer_iv,'key' => $b64_outer_aes_key));
67         $encrypted_outer_key_bundle = '';
68         openssl_public_encrypt($outer_json,$encrypted_outer_key_bundle,$pubkey);
69         
70         $b64_encrypted_outer_key_bundle = base64_encode($encrypted_outer_key_bundle);
71         $encrypted_header_json_object = json_encode(array('aes_key' => base64_encode($encrypted_outer_key_bundle), 
72                 'ciphertext' => base64_encode($ciphertext)));
73         $encrypted_header = '<encrypted_header>' . base64_encode($encrypted_header_json_object) . '</encrypted_header>';
74
75 $magicenv = <<< EOT
76 <?xml version='1.0' encoding='UTF-8'?>
77 <entry xmlns='http://www.w3.org/2005/Atom'>
78   $encrypted_header
79   <me:env xmlns:me="http://salmon-protocol.org/ns/magic-env">
80     <me:encoding>base64url</me:encoding>
81     <me:alg>RSA-SHA256</me:alg>
82     <me:data type="application/atom+xml">$data</me:data>
83     <me:sig>$sig</me:sig>
84   </me:env>
85 </entry>
86 EOT;
87
88         return $magic_env;
89
90 }