package com.opentrust.spi.tsp;
import java.io.IOException;
import java.math.BigInteger;
import java.security.DigestException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SignatureException;
import java.security.cert.CertStore;
import java.security.cert.Certificate;
import java.util.Date;
/**
* représentation abstraite un jeton d'horodatage.
* @author mehdi.bouallagui
*
*/
public interface TimestampToken {
/**
* récupère la date du jeton
* @return date du jeton
* @throws NoSuchFieldException dans le cas où la date ne peut être retrouvée à partir du jeton
*/
public abstract Date getDateTime()
throws NoSuchFieldException;
/**
* permet de retrouver la précision de l'horodatage
* @return chaîne de caractères représentant la présision de l'horodatage. Le format de la chaine est défini par le motif suivant:
* "xx sec yy millis zz micros"
*
* @throws NoSuchFieldException dans le cas où la précision ne peut pas être retrouvée.
*/
public abstract String getAccuracy()
throws NoSuchFieldException;
/**
* retrouve la politique d'horodatage utilisée
* @return OID de la politique d'horodatage
* @throws NoSuchFieldException
*/
public abstract String getPolicy()
throws NoSuchFieldException;
/**
* retrouve le certificat de l'horodateur
* @return certificat de l'horodateur
* @throws NoSuchFieldException dans le cas où le certificat ne peut être retrouvé.
*/
public abstract Certificate getSignerCertificate()
throws NoSuchFieldException;
/**
* permet de retrouver le nonce, utilisé pour déjouer les attaques par rejeu: le nonce
* de la réponse doit correspondre à celui de la requête.
* @return nonce
* @throws NoSuchFieldException
*/
public abstract BigInteger getNonce()
throws NoSuchFieldException;
/**
* verifie que la signature de l'horodateur est 'cryptographiquement' correcte:
* en déchiffrant les données signées avec la clé publique de l'horodateur, on doit retrouver le hash des données
* initiales.
* @return vrai si la vérification réussit.
* @throws SignatureException si la vérification échoue
*/
public abstract boolean verifySignature() throws SignatureException;
/**
* vérifie que l'empreinte des données en entrée correpond à celle des données horodatées.
* @param data
* @return
* @throws DigestException si la vérification échoue
*/
public abstract boolean verifyImprint(byte[] data) throws DigestException;
/**
* Vérifie qu'il est possible de construire une chaine de certificats entre le certificat de l'horodateur
* et un ensemble de certificats de confiance (pouvant être root ou pas)
* @param trustedCertificates certificats de confiance.
* @return
*/
public abstract boolean verifyCertPath(Certificate [] trustedCertificates);
/**
* convertit le jeton sous format binaire
* @return le jeton d'horodatage sous sa représentation binaire
*/
public abstract byte[] getEncoded()
throws IOException;
/**
* extrait les certificats et les CRLs enveloppées dans le jeton d'horodatage
* @return
* @throws NoSuchAlgorithmException
* @throws NoSuchProviderException
* @throws NoSuchFieldException
*/
public abstract CertStore getCertificatesAndCRLs() throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchFieldException;
public abstract String getMessageImprintAlgName();
}