/************************************************************************* * * * CESeCore: CE Security Core * * * * This software is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or any later version. * * * * See terms of license at gnu.org. * * * *************************************************************************/ package org.cesecore.keys.token; import java.io.IOException; import java.io.Serializable; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.Key; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.SignatureException; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.spec.AlgorithmParameterSpec; import java.util.List; import java.util.Properties; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; /** Handles operations of the device producing signatures and handling the private key. * All Crypto Token plug-ins must implement this interface. * * @version $Id: CryptoToken.java 22596 2016-01-18 14:59:25Z mikekushner $ */ public interface CryptoToken extends Serializable { static final int STATUS_ACTIVE = 1; static final int STATUS_OFFLINE = 2; /** Auto activation property that can be defined in Crypto token properties */ static final String AUTOACTIVATE_PIN_PROPERTY = "pin"; /** Boolean indicating if it should be allowed to extract private keys */ static final String ALLOW_EXTRACTABLE_PRIVATE_KEY = "allow.extractable.privatekey"; /** "|"-separated string of "keyalias;keyspec" pairs that act as placeholders for keyaliases that can be generated later */ static final String KEYPLACEHOLDERS_PROPERTY = "statedump.keytemplates"; static final String KEYPLACEHOLDERS_OUTER_SEPARATOR = "|"; static final String KEYPLACEHOLDERS_INNER_SEPARATOR = ";"; /** Boolean indicating if explicit ECC parameters should be used, instead of named curves which is standard. * Explicit parameters are only used by ICAO CSCA and DS certificates as defined in ICAO 9303. */ static final String EXPLICIT_ECC_PUBLICKEY_PARAMETERS = "explicit.ecc.publickey.parameters"; /** */ static final String TOKENNAME_PROPERTY = "tokenName"; /** Whether non-existent slots should be allowed or throw an NoSuchSlotException */ static final String ALLOW_NONEXISTING_SLOT_PROPERTY = "allow.nonexisting.slot"; /** * Method called after creation of instance. Gives the object it's properties. * * Info contains Crypto Token properties, as entered for all tokens. Properties can create properties used by extending or wrapping classes so the implementing * class should not delete or remove properties that are unknown to it, but keep them transparently. * Data contains Crypto Token data, can be null for tokens that don't need it. * * @param properties Properties info used to create token, new token or init existing token * @param data byte[] data as created internally for tokens, can be null for tokens that don't need it * @param id unique ID of the user of the token, the id is user defined and not used internally for anything but logging. * @throws Exception */ void init(Properties properties, byte[] data, int id) throws Exception; /** Gets the id that was passed as parameter to init * */ int getId(); /** * Method used to activate Crypto Tokens when connected after being offline. * * @param authenticationcode used to unlock crypto token, i.e PIN for smartcard HSMs. This parameter might be ignored, e.g. for auto-activated soft tokens. * @throws CryptoTokenOfflineException if Crypto Token is not available or connected. * @throws CryptoTokenAuthenticationFailedException with error message if authentication to tokens fail. */ void activate(char[] authenticationcode) throws CryptoTokenOfflineException, CryptoTokenAuthenticationFailedException; /** * Method used to deactivate tokens. * Used to set a Crypto Token to offline status and to reset the HSMs authorization code. * */ void deactivate(); /** Checks if an alias is in use by a Crypto Token * @param the alias that we want to check * @return true if there is a private, public or symmetric entry with this alias in the CryptoToken */ boolean isAliasUsed(String alias); /** Returns the private key (if possible) of token. * Note that this method does NOT check if the key is permitted to be extracted. * * @param alias the key alias to retrieve from the token * @throws CryptoTokenOfflineException if Crypto Token is not available or connected, or key with alias does not exist. * @return PrivateKey object */ PrivateKey getPrivateKey(String alias) throws CryptoTokenOfflineException; /** Returns the public key (if possible) of token. * * @param alias the key alias to retrieve from the token * @throws CryptoTokenOfflineException if Crypto Token is not available or connected * @return the public key, or null if key with the alias does not exist. */ PublicKey getPublicKey(String alias) throws CryptoTokenOfflineException; /** Returns the key (if possible) of token, used for symmetric keys. For assymmetric keys getPrivateKye and getPublic key is recommended.. * * @param alias the key alias to retrieve from the token * @throws CryptoTokenOfflineException if Crypto Token is not available or connected, or key with alias does not exist. * @return Key object */ Key getKey(String alias) throws CryptoTokenOfflineException; /** Deletes an entry in the crypto token * * @param alias is a reference to the entry in the token that should be deleted. * @throws KeyStoreException * @throws IOException * @throws CertificateException * @throws NoSuchAlgorithmException */ void deleteEntry(String alias) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, CryptoTokenOfflineException; /** Generates a key pair (asymmetric keys) in the crypto token. * * @param keySpec all decimal digits RSA key length, otherwise name of ECC curve or DSA key using syntax DSAnnnn * @param alias the name of the key pair in the crypto token */ void generateKeyPair(final String keySpec, final String alias) throws InvalidAlgorithmParameterException, CryptoTokenOfflineException; /** Generates a key pair (asymmetric keys) in the crypto token. This method is used when you have an existing PublicKey and * want to generate a key of the same type. You can use KeyTools to get the AlgorithmParameterSpec from an existing PublicKey. *
     * AlgorithmParameterSpec spec = KeyTools.getKeyGenSpec(templatePublicKey);
     * 
* * @param spec AlgorithmParameterSpec describing the key pair to be generated * @param alias the name of the key pair in the crypto token */ void generateKeyPair(final AlgorithmParameterSpec spec, final String alias) throws InvalidAlgorithmParameterException, CertificateException, IOException, CryptoTokenOfflineException; /** Generates a symmetric key. * * @param algorithm symmetric algorithm specified in http://download.oracle.com/javase/1.5.0/docs/api/index.html, suggest AES, DESede or DES * @param keysize keysize of symmetric key, suggest 128 or 256 for AES, 64 for 168 for DESede and 64 for DES * @param alias the alias the key will get in the keystore * @throws NoSuchProviderException * @throws NoSuchAlgorithmException * @throws KeyStoreException */ void generateKey(final String algorithm, final int keysize, final String alias) throws NoSuchAlgorithmException, NoSuchProviderException, KeyStoreException, CryptoTokenOfflineException, InvalidKeyException, InvalidAlgorithmParameterException, SignatureException, CertificateException, IOException, NoSuchPaddingException, IllegalBlockSizeException; /** Returns the signature Provider that should be used to sign things with * the PrivateKey object returned by this signing device implementation. * @return String the name of the Provider */ String getSignProviderName(); /** Returns the crypto Provider that should be used to encrypt/decrypt things with * the PrivateKey object returned by this signing device implementation. * In most cases this is the same as the signature provider. * @return String the name of the Provider */ String getEncProviderName(); /** * Resets token. Might cure HW failures. It is up to each implementation to implement this or not. */ void reset(); /** @return user friendly identifier */ String getTokenName(); /** Set user friendly identifier */ void setTokenName(String tokenName); /** * Method that returns the current status of the crypto token. * * Returns one of the CryptoToken.STATUS_.. values */ int getTokenStatus(); /** Return token properties, can be the same as passed to init, or an updated set * * @return Properties can be empty but should never be null */ Properties getProperties(); /** Updates dynamic properties for the crypto token. Call this method when a new key string, autoactivation PIN has been set * and the init method on the crypto token is not called. * Does not update properties that is only used when token is created, for example P11 slot, this is only updated on recreation of the token. * @param properties Properties containing the new key properties or other properties, such as activation PIN */ void setProperties(Properties properties); /** * Stores a new key in this crypto token's keystore. * * @param alias The alias for the key * @param key The key to be stored * @param chain The associated key chain * @param password Password to this slot. * @throws KeyStoreException if keystore for this crypto token has not been initialized */ void storeKey(String alias, Key key, Certificate chain[], char[] password) throws KeyStoreException; /** Stores keystore data (if any) to be used when initializing a new (existing) token with the init method * * @return byte[] with keystore data, can be null if not needed for initialization */ byte[] getTokenData(); /** Testing a keypair to see that it is usable * * @param alias the alias of the key pair to test * @throws InvalidKeyException if the public key can not be used to verify a string signed by the private key, because the key is wrong or the * signature operation fails for other reasons such as a NoSuchAlgorithmException or SignatureException. * @throws CryptoTokenOfflineException if the crypto token is offline */ void testKeyPair(String alias) throws InvalidKeyException, CryptoTokenOfflineException; // NOPMD:this is not a junit test /** Testing a keypair to see that it is usable * * @param alias the alias of the key pair to test * @param publicKey the public key of the key pair * @param privateKey the private key of the key pair * @throws InvalidKeyException if the public key can not be used to verify a string signed by the private key, because the key is wrong or the * signature operation fails for other reasons such as a NoSuchAlgorithmException or SignatureException. */ void testKeyPair(final String alias, PublicKey publicKey, PrivateKey privateKey) throws InvalidKeyException; /** * Checks if generated private keys are allowed to be extracted. * * @return false if the private key is not extractable. */ boolean doPermitExtractablePrivateKey(); /** * * @return an enumeration of aliases from this token's key store. * @throws KeyStoreException if the keystore has not been initialized (loaded). * @throws CryptoTokenOfflineException if the keystore has not been initialized (loaded). */ List getAliases() throws KeyStoreException, CryptoTokenOfflineException; /** @return true if there is an auto activation PIN stored in the token */ boolean isAutoActivationPinPresent(); }