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 */
23package com.sun.org.apache.xml.internal.security.keys.content;
24
25import java.security.PublicKey;
26
27import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
28import com.sun.org.apache.xml.internal.security.keys.content.keyvalues.DSAKeyValue;
29import com.sun.org.apache.xml.internal.security.keys.content.keyvalues.RSAKeyValue;
30import com.sun.org.apache.xml.internal.security.utils.Constants;
31import com.sun.org.apache.xml.internal.security.utils.SignatureElementProxy;
32import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
33import org.w3c.dom.Document;
34import org.w3c.dom.Element;
35
36/**
37 * The KeyValue element contains a single public key that may be useful in
38 * validating the signature. Structured formats for defining DSA (REQUIRED)
39 * and RSA (RECOMMENDED) public keys are defined in Signature Algorithms
40 * (section 6.4). The KeyValue element may include externally defined public
41 * keys values represented as PCDATA or element types from an external
42 * namespace.
43 *
44 * @author $Author: coheigea $
45 */
46public class KeyValue extends SignatureElementProxy implements KeyInfoContent {
47
48    /**
49     * Constructor KeyValue
50     *
51     * @param doc
52     * @param dsaKeyValue
53     */
54    public KeyValue(Document doc, DSAKeyValue dsaKeyValue) {
55        super(doc);
56
57        XMLUtils.addReturnToElement(this.constructionElement);
58        this.constructionElement.appendChild(dsaKeyValue.getElement());
59        XMLUtils.addReturnToElement(this.constructionElement);
60    }
61
62    /**
63     * Constructor KeyValue
64     *
65     * @param doc
66     * @param rsaKeyValue
67     */
68    public KeyValue(Document doc, RSAKeyValue rsaKeyValue) {
69        super(doc);
70
71        XMLUtils.addReturnToElement(this.constructionElement);
72        this.constructionElement.appendChild(rsaKeyValue.getElement());
73        XMLUtils.addReturnToElement(this.constructionElement);
74    }
75
76    /**
77     * Constructor KeyValue
78     *
79     * @param doc
80     * @param unknownKeyValue
81     */
82    public KeyValue(Document doc, Element unknownKeyValue) {
83        super(doc);
84
85        XMLUtils.addReturnToElement(this.constructionElement);
86        this.constructionElement.appendChild(unknownKeyValue);
87        XMLUtils.addReturnToElement(this.constructionElement);
88    }
89
90    /**
91     * Constructor KeyValue
92     *
93     * @param doc
94     * @param pk
95     */
96    public KeyValue(Document doc, PublicKey pk) {
97        super(doc);
98
99        XMLUtils.addReturnToElement(this.constructionElement);
100
101        if (pk instanceof java.security.interfaces.DSAPublicKey) {
102            DSAKeyValue dsa = new DSAKeyValue(this.doc, pk);
103
104            this.constructionElement.appendChild(dsa.getElement());
105            XMLUtils.addReturnToElement(this.constructionElement);
106        } else if (pk instanceof java.security.interfaces.RSAPublicKey) {
107            RSAKeyValue rsa = new RSAKeyValue(this.doc, pk);
108
109            this.constructionElement.appendChild(rsa.getElement());
110            XMLUtils.addReturnToElement(this.constructionElement);
111        }
112    }
113
114    /**
115     * Constructor KeyValue
116     *
117     * @param element
118     * @param BaseURI
119     * @throws XMLSecurityException
120     */
121    public KeyValue(Element element, String BaseURI) throws XMLSecurityException {
122        super(element, BaseURI);
123    }
124
125    /**
126     * Method getPublicKey
127     *
128     * @return the public key
129     * @throws XMLSecurityException
130     */
131    public PublicKey getPublicKey() throws XMLSecurityException {
132        Element rsa =
133            XMLUtils.selectDsNode(
134                this.constructionElement.getFirstChild(), Constants._TAG_RSAKEYVALUE, 0);
135
136        if (rsa != null) {
137            RSAKeyValue kv = new RSAKeyValue(rsa, this.baseURI);
138            return kv.getPublicKey();
139        }
140
141        Element dsa =
142            XMLUtils.selectDsNode(
143                this.constructionElement.getFirstChild(), Constants._TAG_DSAKEYVALUE, 0);
144
145        if (dsa != null) {
146            DSAKeyValue kv = new DSAKeyValue(dsa, this.baseURI);
147            return kv.getPublicKey();
148        }
149
150        return null;
151    }
152
153    /** @inheritDoc */
154    public String getBaseLocalName() {
155        return Constants._TAG_KEYVALUE;
156    }
157}
158