<?php
require_once('./U2F.php');
session_start();
if (isset($_GET['destroy'])) {
	session_destroy();
	session_start();
}
$u2f = new U2F('https://'.$_SERVER['HTTP_HOST'], __DIR__.'/openssl');
?>
<html>
	<head>
		<script src="u2f-api.js"></script>
		<style>textarea { width: 100%; }</style>
	</head>
	<body>
		<?php
		if (!isset($_SESSION['state']) || ($_SESSION['state'] === 'registerRequest' && !isset($_POST['registerResponse']))) {
			$request = $u2f->generateRegisterRequest();
			$_SESSION['registerRequest'] = $request;
			$_SESSION['state'] = 'registerRequest';
			?>
			Request:
			<pre><?php echo htmlspecialchars(print_r($request, true), ENT_HTML5 | ENT_COMPAT, 'ISO-8859-1'); ?></pre>
			<form action="<?=$_SERVER['PHP_SELF']?>" method="post" id="form">
				<textarea name="registerResponse" id="response" rows="24" cols="80"></textarea>
				<button type="submit">Submit</button>
			</form>
			<script>
			u2f.register('<?=$request['appId']?>', [ <?=json_encode($request);?> ], [], function (response) {
				document.getElementById('response').value = JSON.stringify(response)
			})
			</script>
			<?php
		}
		else if ($_SESSION['state'] === 'registerRequest') {
			$optReturn = array();
			$u2fData = $u2f->verifyRegisterResponse($_SESSION['registerRequest'], json_decode($_POST['registerResponse'], true), $optReturn);
			unset($_SESSION['registerRequest']);
			$_SESSION['u2fData'] = array($u2fData);
			$_SESSION['state'] = 'registered';
			?>
			You registered successfully. Reload to authenticate.
			<hr>
			Data to store:
			<pre><?php echo htmlspecialchars(print_r($u2fData, true), ENT_HTML5 | ENT_COMPAT, 'ISO-8859-1'); ?></pre>
			Debug Information:
			<pre><?php echo htmlspecialchars(print_r($optReturn, true), ENT_HTML5 | ENT_COMPAT, 'ISO-8859-1'); ?></pre>
			<?php $attestData = openssl_x509_parse($optReturn['registrationData']['certAsPem'], $attest); if ($attestData) { ?>
			Attestation Certificate:
			<pre><?php echo htmlspecialchars(print_r($attestData, true), ENT_HTML5 | ENT_COMPAT, 'ISO-8859-1'); ?></pre>
			<?php
			}
		}
		else if ($_SESSION['state'] === 'registered' || ($_SESSION['state'] === 'signRequest' && !isset($_POST['signResponse']))) {
			$request = $u2f->generateSignRequest($_SESSION['u2fData']);
			$_SESSION['signRequest'] = $request;
			$_SESSION['state'] = 'signRequest';
			?>
			Request:
			<pre><?php echo htmlspecialchars(print_r($request, true), ENT_HTML5 | ENT_COMPAT, 'ISO-8859-1'); ?></pre>
			<form action="<?=$_SERVER['PHP_SELF']?>" method="post" id="form">
				<textarea name="signResponse" id="response" rows="24" cols="80"></textarea>
				<button type="submit">Submit</button>
			</form>
			<script>
			u2f.sign('<?=$request['appId']?>', '<?=$request['challenge']?>', <?=json_encode($request['registeredKeys']);?>, function (response) {
				document.getElementById('response').value = JSON.stringify(response)
			})
			</script>
			<?php
		}
		else if ($_SESSION['state'] === 'signRequest') {
			$optReturn = array();
			$u2fData = $u2f->verifySignResponse($_SESSION['signRequest'], $_SESSION['u2fData'], json_decode($_POST['signResponse'], true), $optReturn);
			unset($_SESSION['signRequest']);
			$_SESSION['u2fData'] = $u2fData;
			$_SESSION['state'] = 'registered';
			?>
			Successfully authenticated.
			<hr>
			Data to store:
			<pre><?php echo htmlspecialchars(print_r($u2fData, true), ENT_HTML5 | ENT_COMPAT, 'ISO-8859-1'); ?></pre>
			Debug Information:
			<pre><?php echo htmlspecialchars(print_r($optReturn, true), ENT_HTML5 | ENT_COMPAT, 'ISO-8859-1'); ?></pre>
			<?php
		}
		?>
		<hr>
		Stored information
		<pre><?php echo htmlspecialchars(print_r($_SESSION, true), ENT_HTML5 | ENT_COMPAT, 'ISO-8859-1'); ?></pre>
		<a href="<?=$_SERVER['PHP_SELF']?>?destroy">Destroy stored information</a>
	</body>
</html>
