1 /*
   2  * reserved comment block
   3  * DO NOT REMOVE OR ALTER!
   4  */
   5 /**
   6  * Licensed to the Apache Software Foundation (ASF) under one
   7  * or more contributor license agreements. See the NOTICE file
   8  * distributed with this work for additional information
   9  * regarding copyright ownership. The ASF licenses this file
  10  * to you under the Apache License, Version 2.0 (the
  11  * "License"); you may not use this file except in compliance
  12  * with the License. You may obtain a copy of the License at
  13  *
  14  * http://www.apache.org/licenses/LICENSE-2.0
  15  *
  16  * Unless required by applicable law or agreed to in writing,
  17  * software distributed under the License is distributed on an
  18  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  19  * KIND, either express or implied. See the License for the
  20  * specific language governing permissions and limitations
  21  * under the License.
  22  */
  23 package com.sun.org.apache.xml.internal.security.keys.content.x509;
  24 
  25 import java.security.MessageDigest;
  26 import java.security.cert.X509Certificate;
  27 
  28 import com.sun.org.apache.xml.internal.security.algorithms.JCEMapper;
  29 import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
  30 import com.sun.org.apache.xml.internal.security.utils.Constants;
  31 import com.sun.org.apache.xml.internal.security.utils.Signature11ElementProxy;
  32 import org.w3c.dom.Attr;
  33 import org.w3c.dom.Document;
  34 import org.w3c.dom.Element;
  35 
  36 /**
  37  * Provides content model support for the <code>dsig11:X509Digest</code> element.
  38  * 
  39  * @author Brent Putman (putmanb@georgetown.edu)
  40  */
  41 public class XMLX509Digest extends Signature11ElementProxy implements XMLX509DataContent {
  42 
  43     /**
  44      * Constructor XMLX509Digest
  45      *
  46      * @param element
  47      * @param BaseURI
  48      * @throws XMLSecurityException
  49      */
  50     public XMLX509Digest(Element element, String BaseURI) throws XMLSecurityException {
  51         super(element, BaseURI);
  52     }
  53 
  54     /**
  55      * Constructor XMLX509Digest
  56      *
  57      * @param doc
  58      * @param digestBytes
  59      * @param algorithmURI
  60      */
  61     public XMLX509Digest(Document doc, byte[] digestBytes, String algorithmURI) {
  62         super(doc);
  63         this.addBase64Text(digestBytes);
  64         this.constructionElement.setAttributeNS(null, Constants._ATT_ALGORITHM, algorithmURI);
  65     }
  66 
  67     /**
  68      * Constructor XMLX509Digest
  69      *
  70      * @param doc
  71      * @param x509certificate
  72      * @param algorithmURI
  73      * @throws XMLSecurityException
  74      */
  75     public XMLX509Digest(Document doc, X509Certificate x509certificate, String algorithmURI) throws XMLSecurityException {
  76         super(doc);
  77         this.addBase64Text(getDigestBytesFromCert(x509certificate, algorithmURI));
  78         this.constructionElement.setAttributeNS(null, Constants._ATT_ALGORITHM, algorithmURI);
  79     }
  80 
  81     /**
  82      * Method getAlgorithmAttr
  83      *
  84      * @return the Algorithm attribute
  85      */
  86     public Attr getAlgorithmAttr() {
  87         return this.constructionElement.getAttributeNodeNS(null, Constants._ATT_ALGORITHM);
  88     }
  89 
  90     /**
  91      * Method getAlgorithm
  92      *
  93      * @return Algorithm string
  94      */
  95     public String getAlgorithm() {
  96         return this.getAlgorithmAttr().getNodeValue();
  97     }
  98 
  99     /**
 100      * Method getDigestBytes
 101      *
 102      * @return the digestbytes
 103      * @throws XMLSecurityException
 104      */
 105     public byte[] getDigestBytes() throws XMLSecurityException {
 106         return this.getBytesFromTextChild();
 107     }
 108 
 109     /**
 110      * Method getDigestBytesFromCert
 111      *
 112      * @param cert
 113      * @param algorithmURI
 114      * @return digest bytes from the given certificate
 115      *
 116      * @throws XMLSecurityException
 117      */
 118     public static byte[] getDigestBytesFromCert(X509Certificate cert, String algorithmURI) throws XMLSecurityException {
 119         String jcaDigestAlgorithm = JCEMapper.translateURItoJCEID(algorithmURI);
 120         if (jcaDigestAlgorithm == null) {
 121             Object exArgs[] = { algorithmURI };
 122             throw new XMLSecurityException("XMLX509Digest.UnknownDigestAlgorithm", exArgs);
 123         }
 124 
 125         try {
 126             MessageDigest md = MessageDigest.getInstance(jcaDigestAlgorithm);
 127             return md.digest(cert.getEncoded());
 128         } catch (Exception e) {
 129             Object exArgs[] = { jcaDigestAlgorithm };
 130             throw new XMLSecurityException("XMLX509Digest.FailedDigest", exArgs);
 131         }
 132 
 133     }
 134 
 135     /** @inheritDoc */
 136     public String getBaseLocalName() {
 137         return Constants._TAG_X509DIGEST;
 138     }
 139 }