org.sinekartads.smartcard.DigitalSignatureClient.java Source code

Java tutorial

Introduction

Here is the source code for org.sinekartads.smartcard.DigitalSignatureClient.java

Source

/*
 * Copyright (C) 2014 - 2015 Jenia Software.
 *
 * This file is part of Sinekarta-ds
 *
 * Sinekarta-ds is Open SOurce Software: you can redistribute it and/or modify
 * it under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.sinekartads.smartcard;

import java.security.cert.X509Certificate;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.sinekartads.exception.InvalidCertificateException;
import org.sinekartads.exception.InvalidDriverException;
import org.sinekartads.exception.SignFailedException;
import org.sinekartads.exception.SmartCardAccessException;
import org.sinekartads.utils.HexUtils;

public class DigitalSignatureClient {

    private static final Logger tracer = Logger.getLogger(DigitalSignatureClient.class);

    private String driver;
    private String pin;
    private String alias;
    private String[] aliases;
    private ISmartCardAccess sca;

    public DigitalSignatureClient() {
        super();
    }

    public DigitalSignatureClient(String driver) {
        super();
        this.driver = driver;
    }

    public DigitalSignatureClient(String driver, String pin) {
        super();
        this.driver = driver;
        this.pin = pin;
    }

    public DigitalSignatureClient(String driver, String pin, String alias) {
        super();
        this.driver = driver;
        this.pin = pin;
        this.alias = alias;
    }

    public void verifyDriver() throws SmartCardAccessException {
        tracer.info(String.format("verifying driver %s with %s", driver, sca));
        tracer.info(String.format("selectDriver - %s", driver));
        try {
            sca.selectDriver(driver);
        } catch (SmartCardAccessException e) {
            driver = null;
            throw e;
        }
    }

    public String[] certificateList() throws SmartCardAccessException {
        try {
            tracer.info(String.format("loginWithPin"));
            tracer.info(String.format("pin:    %s", pin));
            aliases = sca.loginAndCertificateList(pin);
            return aliases;
        } catch (SmartCardAccessException e) {
            pin = null;
            throw e;
        }
    }

    public X509Certificate selectCertificate() throws SmartCardAccessException {
        try {
            if (ArrayUtils.isEmpty(aliases)) {
                certificateList();
            }
            if (ArrayUtils.isNotEmpty(aliases)) {
                if (ArrayUtils.contains(aliases, alias)) {
                    return sca.selectCertificate(alias);
                } else {
                    tracer.error(String.format("impossibile reperire il certificato per l'identit %s", alias));
                    throw new InvalidCertificateException(
                            String.format("impossibile reperire il certificato per l'identit %s", alias));
                }
            } else {
                tracer.error(String.format("impossibile reperire il certificato per l'identit %s", alias));
                throw new InvalidCertificateException(
                        String.format("impossibile reperire il certificato per l'identit %s", alias));
            }
        } catch (SmartCardAccessException e) {
            alias = null;
            throw e;
        }
    }

    public String sign(String hexDigest) throws SmartCardAccessException {
        try {
            if (selectCertificate() != null) {
                byte[] digest = HexUtils.decodeHex(hexDigest);
                byte[] digitalSignature = sca.signFingerPrint(digest);
                return HexUtils.encodeHex(digitalSignature);
            } else {
                tracer.error("invalid vertificate");
                throw new SignFailedException("invalid vertificate");
            }
        } catch (SmartCardAccessException e) {
            throw e;
        }
    }

    public void open() throws SmartCardAccessException {
        if (sca == null) {
            if (StringUtils.isEmpty(driver)) {
                throw new InvalidDriverException("driver must be set befor calling to open");
            }
            if (StringUtils.equals(driver, FakeSmartCardAccess.FAKE_DRIVER)) {
                sca = new FakeSmartCardAccess();
            } else {
                sca = new SmartCardAccess();
            }
        } else {
            if (StringUtils.equals(driver, FakeSmartCardAccess.FAKE_DRIVER)
                    && !(sca instanceof FakeSmartCardAccess)) {
                sca = new FakeSmartCardAccess();
            }
            if (!StringUtils.equals(driver, FakeSmartCardAccess.FAKE_DRIVER)
                    && (sca instanceof FakeSmartCardAccess)) {
                sca = new SmartCardAccess();
            }
        }
        sca.open();
    }

    public void close() throws SmartCardAccessException {
        sca.close();
    }

    public String getDriver() {
        return driver;
    }

    public void setDriver(String driver) {
        this.driver = driver;
    }

    public String getPin() {
        return pin;
    }

    public void setPin(String pin) {
        this.pin = pin;
    }

    public String getAlias() {
        return alias;
    }

    public void setAlias(String alias) {
        this.alias = alias;
    }

    public boolean isEmptyDriver() {
        return StringUtils.isEmpty(driver);
    }

    public boolean isEmptyPin() {
        return StringUtils.isEmpty(pin);
    }

    public boolean isEmptyAlias() {
        return StringUtils.isEmpty(alias);
    }

}