<?php
# Hier kommen Pushs AN Dich an, wenn Du die URL Deines Scripts als curl_url in Deinem Profil hinterlegt hast
# Der Absender bekommt eine passende Antwort, wenn eine gefunden wird.

date_default_timezone_set("Europe/Berlin");

$debug=0;

# generelle API-Werte:
$api_url="https://webms.app/api/";
$api_timeout=10;
$api_version=1;

####################################
# Deine Variablen:
####################################

# Hier kommt Dein API-Key hin (siehe Dein Profil)
$my_api_key="asdasd878976876ASD";

# Das ist Dein Private-Key (den Du vorher aus Deinem Profil exportieren musst)
# Die Export-Datei ist am "#" in 3 Teile getrennt:
# 1) Dein geheimer Cookie für Dein Gerät (mit dem alleine niemand Deine Nachrichten lesen kann)
# 2) Dein Public-Key (den jeder haben darf)
# 3) Dein Private-Key (den NIEMAND haben darf!!)
# Letzterer muss hier hin zum Verschlüsseln und Entschlüsseln:
$private_key="asdasdUHJASDKJF";

####################################
# Ende Deiner Variablen
####################################

# per POST ankommende Werte:
$encrypted_text=$_POST['encrypted_text'];
$iv=$_POST['iv'];
$from=$_POST['from'];
$to=$_POST['to'];
$id=$_POST['id'];
$api_key=$_POST['api_key'];

# Raus, wenn es einen nicht gibt:
if(!$encrypted_text || !$iv || !$from || !$to || !$id || !$api_key)exit();

# Mein API-Key wird auch per POST mitgeliefert, aber gehasht (sha512)
if($api_key!=hash("sha512",$my_api_key))exit();
# dadurch kann ich sicher gehen, dass nicht IRGENDJEMAND dieses Script aufruft von außen

# Start:

####################################
# Start: Haupt-Funktion zur Kommunikation mit dem WebMS-Server (braucht man in beiden APIs)
####################################

function webms_api($params)
{
  global $api_url;
  global $api_timeout;

  $api_ch = curl_init();
  curl_setopt($api_ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($api_ch, CURLOPT_POST, TRUE);
  curl_setopt($api_ch, CURLOPT_POSTFIELDS, http_build_query($params));
  curl_setopt($api_ch, CURLOPT_TIMEOUT, $api_timeout);
  curl_setopt($api_ch, CURLOPT_CONNECTTIMEOUT, $api_timeout);
  curl_setopt($api_ch, CURLOPT_URL, $api_url);
  curl_setopt($api_ch, CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($api_ch, CURLOPT_SSL_VERIFYPEER, false);
  $res = curl_exec($api_ch);
  curl_close($api_ch);

  return $res;
}

####################################
# 1. Pubkey des Absender holen:
####################################
$api_params=array(
  "api_key" => $my_api_key,
  "api_version" => $api_version,
  "call" => "get_pubkey",
  "user" => $from,
);
# Ausführen:
$public_key=webms_api($api_params);

if($debug==1)
{
  echo "<pre>";
  print_r($public_key);
  echo "</pre>";
}
####################################
# 2. Nachricht ENTschlüsseln mit GEMEINSAMEM Key:
####################################

$shared_key=openssl_pkey_derive(base64_decode($public_key),base64_decode($private_key));

$decrypted_text = openssl_decrypt(base64_decode($encrypted_text), "AES-256-CBC", $shared_key, OPENSSL_RAW_DATA, base64_decode($iv));
#while($e = openssl_error_string()){echo $e."<br>\n";}

if($debug==1)echo "decrypted_text:<br>$decrypted_text<br><br>";

# Da Du hier die enschlüsselte Nachricht hast, kannst Du hier auch andere Dinge damit tun.
# z.B. Speichern, per Mail versenden usw....

####################################
# 3. passende Antwort suchen:
####################################

$antwort="";

# dem Absender antworten:
if($decrypted_text=="Uhr")$antwort="Es ist ".date("H:i:s")." Uhr";
if($decrypted_text=="Hi")$antwort="Selber Hi!";
if($decrypted_text=="Hallo, dies ist mein Test um 13:37:25")$antwort="JAJAAAA....";
# weitere ifs....

if($debug==1)echo "Antwort: $decrypted_text<br>";

# Wenn keine Rückantwort: EXIT!
if(!$antwort)exit();

####################################
# 4. Nachricht verschlüsseln mit GEMEINSAMEM Key:
####################################

# Pseudo-Bytes generieren (IV)
$iv = openssl_random_pseudo_bytes(16);

$nachricht_verschluesselt = openssl_encrypt($antwort, "AES-256-CBC", $shared_key, OPENSSL_RAW_DATA, $iv);

# beides base64-encoden:
$iv=base64_encode($iv);
$nachricht_verschluesselt=base64_encode($nachricht_verschluesselt);

if($debug==1)echo "RA: $iv<hr>$nachricht_verschluesselt<hr>";

####################################
# 5. Die Antwort versenden an den Partner:
####################################

# ACHTUNG: "to" ist hier $from, weil der Absender die Antwort wieder bekommt:
$api_params=array(
  "api_key" => $my_api_key,
  "api_version" => $api_version,
  "call" => "write",
  "to" => $from,
  "encrypted_text" => $nachricht_verschluesselt,
  "iv" => $iv
);
echo webms_api($api_params);
?>