mirror of
https://github.com/ae-utbm/sith3.git
synced 2024-09-01 16:53:39 +00:00
103 lines
4.8 KiB
PHP
103 lines
4.8 KiB
PHP
|
|
|||
|
///// script PHP de v<>rification de la signature Paybox.
|
|||
|
///// Ce code peut s'executer dans un contexte Apache/PHP.
|
|||
|
///// Il affiche alors une page web qui permet de v<>rifier et signer des donn<6E>es.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<html>
|
|||
|
<head>
|
|||
|
<title>formulaire d'exemple pour test signature</title>
|
|||
|
</head>
|
|||
|
<body>
|
|||
|
|
|||
|
<?php
|
|||
|
|
|||
|
$status = "GUY";
|
|||
|
|
|||
|
function LoadKey( $keyfile, $pub=true, $pass='' ) { // chargement de la cl<63> (publique par d<>faut)
|
|||
|
|
|||
|
$fp = $filedata = $key = FALSE; // initialisation variables
|
|||
|
$fsize = filesize( $keyfile ); // taille du fichier
|
|||
|
if( !$fsize ) return FALSE; // si erreur on quitte de suite
|
|||
|
$fp = fopen( $keyfile, 'r' ); // ouverture fichier
|
|||
|
if( !$fp ) return FALSE; // si erreur ouverture on quitte
|
|||
|
$filedata = fread( $fp, $fsize ); // lecture contenu fichier
|
|||
|
fclose( $fp ); // fermeture fichier
|
|||
|
if( !$filedata ) return FALSE; // si erreur lecture, on quitte
|
|||
|
if( $pub )
|
|||
|
$key = openssl_pkey_get_public( $filedata ); // recuperation de la cle publique
|
|||
|
else // ou recuperation de la cle privee
|
|||
|
$key = openssl_pkey_get_private( array( $filedata, $pass ));
|
|||
|
return $key; // renvoi cle ( ou erreur )
|
|||
|
}
|
|||
|
|
|||
|
// comme precise la documentation Paybox, la signature doit <20>tre
|
|||
|
// obligatoirement en derni<6E>re position pour que cela fonctionne
|
|||
|
|
|||
|
function GetSignedData( $qrystr, &$data, &$sig ) { // renvoi les donnes signees et la signature
|
|||
|
|
|||
|
$pos = strrpos( $qrystr, '&' ); // cherche dernier separateur
|
|||
|
$data = substr( $qrystr, 0, $pos ); // et voila les donnees signees
|
|||
|
$pos= strpos( $qrystr, '=', $pos ) + 1; // cherche debut valeur signature
|
|||
|
$sig = substr( $qrystr, $pos ); // et voila la signature
|
|||
|
$sig = base64_decode( urldecode( $sig )); // decodage signature
|
|||
|
}
|
|||
|
|
|||
|
// $querystring = chaine enti<74>re retourn<72>e par Paybox lors du retour au site (m<>thode GET)
|
|||
|
// $keyfile = chemin d'acc<63>s complet au fichier de la cl<63> publique Paybox
|
|||
|
|
|||
|
function PbxVerSign( $qrystr, $keyfile ) { // verification signature Paybox
|
|||
|
|
|||
|
$key = LoadKey( $keyfile ); // chargement de la cle
|
|||
|
if( !$key ) return -1; // si erreur chargement cle
|
|||
|
// penser <20> openssl_error_string() pour diagnostic openssl si erreur
|
|||
|
GetSignedData( $qrystr, $data, $sig ); // separation et recuperation signature et donnees
|
|||
|
return openssl_verify( $data, $sig, $key ); // verification : 1 si valide, 0 si invalide, -1 si erreur
|
|||
|
}
|
|||
|
|
|||
|
if( !isset( $_POST['data'] )) // pour alimentation par defaut quand premier affichage du formulaire
|
|||
|
$_POST['data'] = 'arg1=aaaa&arg2=bbbb&arg3=cccc&arg4=dddd';
|
|||
|
|
|||
|
if( isset( $_POST['signer']) ) { // si on a demande la signature
|
|||
|
|
|||
|
$key = LoadKey( 'TestK004.prv.pem', false ); // chargement de la cle prive (de test, sans mot de passe)
|
|||
|
if( $key ) {
|
|||
|
openssl_sign( $_POST['data'], $signature, $key ); // generation de la signature
|
|||
|
openssl_free_key( $key ); // liberation ressource (confidentialite cle prive)
|
|||
|
$status = "OK";
|
|||
|
}
|
|||
|
else $status = openssl_error_string(); // diagnostic erreur
|
|||
|
|
|||
|
$_POST['signeddata'] = $_POST['data']; // construction chaine data + signature
|
|||
|
$_POST['signeddata'] .= '&sig=';
|
|||
|
$_POST['signeddata'] .= urlencode( base64_encode( $signature ));
|
|||
|
}
|
|||
|
if( isset( $_POST['verifier']) ) { // si on a demande la verification
|
|||
|
|
|||
|
$CheckSig = PbxVerSign( $_POST['signeddata'], 'TestK004.pub.pem' );
|
|||
|
|
|||
|
if( $CheckSig == 1 ) $status = "Signature valide";
|
|||
|
else if( $CheckSig == 0 ) $status = "Signature invalide : donnees alterees ou signature falsifiee";
|
|||
|
else $status = "Erreur lors de la v<>rification de la signature";
|
|||
|
}
|
|||
|
|
|||
|
?>
|
|||
|
<form action="testsign.php" method="POST">
|
|||
|
<table border="0" cellpadding="3" cellspacing="0" align="center">
|
|||
|
<tr>
|
|||
|
<td>status = <?php echo $status; ?></td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td><input type="text" name="data" size="80"value="<?= $_POST['data'] ?>"></td>
|
|||
|
<td><input type="submit" name="signer" value="signer"/></td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td><input type="text" name="signeddata" size="80"value="<?= $_POST['signeddata'] ?>"></td>
|
|||
|
<td><input type="submit" name="verifier" value="verifier"/></td>
|
|||
|
</tr>
|
|||
|
</table>
|
|||
|
</form>
|
|||
|
</body>
|
|||
|
</html>
|