/*
 * Version 1.1
 * CeCILL Copyright (c) 2006-2007, AtolCD, ADULLACT-projet
 * Initiated by AtolCD S.A. & ADULLACT-projet S.A.
 * Developped by AtolCD
 *
 * contact@atolcd.com
 * contact@adullact-projet.coop
 *
 * Ce logiciel est un programme informatique servant à faire circuler des
 * documents au travers d'un circuit de validation, où chaque acteur vise
 * le dossier, jusqu'à l'étape finale de signature.
 *
 * Ce logiciel est régi par la licence CeCILL soumise au droit français et
 * respectant les principes de diffusion des logiciels libres. Vous pouvez
 * utiliser, modifier et/ou redistribuer ce programme sous les conditions
 * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
 * sur le site "http://www.cecill.info".
 *
 * En contrepartie de l'accessibilité au code source et des droits de copie,
 * de modification et de redistribution accordés par cette licence, il n'est
 * offert aux utilisateurs qu'une garantie limitée.  Pour les mêmes raisons,
 * seule une responsabilité restreinte pèse sur l'auteur du programme,  le
 * titulaire des droits patrimoniaux et les concédants successifs.
 *
 * A cet égard  l'attention de l'utilisateur est attirée sur les risques
 * associés au chargement,  à l'utilisation,  à la modification et/ou au
 * développement et à la reproduction du logiciel par l'utilisateur étant
 * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
 * manipuler et qui le réserve donc à des développeurs et des professionnels
 * avertis possédant  des  connaissances  informatiques approfondies.  Les
 * utilisateurs sont donc invités à charger  et  tester  l'adéquation  du
 * logiciel à leurs besoins dans des conditions permettant d'assurer la
 * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
 * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
 *
 * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
 * pris connaissance de la licence CeCILL, et que vous en avez accepté les
 * termes.
 *
 */
package org.adullact.iparapheur.util;

import java.io.IOException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import org.bouncycastle.asn1.ASN1Object;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.DEREncodable;
import org.bouncycastle.asn1.DERObjectIdentifier;
import org.bouncycastle.asn1.DERString;
import org.bouncycastle.asn1.x509.PolicyInformation;

/**
 *
 * @author Vivien Barousse
 */
public class X509Util {

    private static final Logger log = Logger.getLogger(X509Util.class);

    public static final String CERT_POLICY_EXTENSION_OID = "2.5.29.32";

    public static Map<String, String> getPolicyProperties(X509Certificate cert) {
        Map<String, String> properties = new HashMap<String, String>();

        byte[] extensionValue = cert.getExtensionValue(CERT_POLICY_EXTENSION_OID);

        if (extensionValue == null) {
            return properties;
        }

        try {
            byte[] bValue = ((ASN1OctetString) ASN1Object.fromByteArray(extensionValue)).getOctets();

            ASN1Sequence pSeq = (ASN1Sequence) ASN1Sequence.fromByteArray(bValue);

            for (int i = 0, len = pSeq.size(); i < len; i++) {
                PolicyInformation pi = PolicyInformation.getInstance(pSeq.getObjectAt(i));
                String piId = pi.getPolicyIdentifier().getId();

                properties.put("pPolicyIdentifierID", piId);

                ASN1Sequence pQuals;
                if ((pQuals = pi.getPolicyQualifiers()) != null) {

                    for (int j = 0, plen = pQuals.size(); j < plen; j++) {
                        ASN1Sequence pqi = (ASN1Sequence) pQuals.getObjectAt(j);
                        String pqId = ((DERObjectIdentifier) pqi.getObjectAt(0)).getId();

                        DEREncodable d = pqi.getObjectAt(1);
                        if (pqId.equals("1.3.6.1.5.5.7.2.1")) {
                            String sUri = ((DERString) d).getString();
                            properties.put("pSPURI", sUri);
                        } else if (pqId.equals("1.3.6.1.5.5.7.2.2")) {
                            ASN1Sequence un = (ASN1Sequence) d;

                            for (int k = 0, dlen = un.size(); k < dlen; k++) {
                                DEREncodable de = un.getObjectAt(k);
                                properties.put("pPolicyIdentifierDescription", ((DERString) de).getString());
                            }
                        }
                    }
                }
            }
        } catch (IOException e) {
            log.error("Error getting policy properties from certificate", e);
        }

        return properties;
    }

}
