1470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro/*
2470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro *  Licensed to the Apache Software Foundation (ASF) under one or more
3470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro *  contributor license agreements.  See the NOTICE file distributed with
4470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro *  this work for additional information regarding copyright ownership.
5470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro *  The ASF licenses this file to You under the Apache License, Version 2.0
6470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro *  (the "License"); you may not use this file except in compliance with
7470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro *  the License.  You may obtain a copy of the License at
8470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro *
9470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro *     http://www.apache.org/licenses/LICENSE-2.0
10470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro *
11470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro *  Unless required by applicable law or agreed to in writing, software
12470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro *  distributed under the License is distributed on an "AS IS" BASIS,
13470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro *  See the License for the specific language governing permissions and
15470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro *  limitations under the License.
16470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro */
17470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
18470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro/**
19470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro* @author Aleksei Y. Semenov
20470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro* @version $Revision$
21470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro*/
22470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
23470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giropackage org.apache.harmony.security.tests.support;
24470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
25470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giroimport java.security.Identity;
26470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giroimport java.security.IdentityScope;
27470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giroimport java.security.KeyManagementException;
28470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giroimport java.security.PublicKey;
29470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giroimport java.util.Enumeration;
30470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giroimport java.util.Hashtable;
31470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
32470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro/**
33470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro * Provides full functionality. Currently used for testing only.
34470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro *
35470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro * @see java.security.IdentityScope
36470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro */
37470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
38470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giropublic class SystemScope extends IdentityScope {
39470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
40470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    /**
41470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     * @serial
42470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     */
43470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    private static final long serialVersionUID = -4810285697932522607L;
44470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
45470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    // Identities hash: key is the identity name
46470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    private Hashtable names = new Hashtable();
47470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
48470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    // Identities hash: key is the public key
49470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    private Hashtable keys = new Hashtable();
50470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
51470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    /**
52470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     * @see java.security.IdentityScope#IdentityScope()
53470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     */
54470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    public SystemScope() {
55470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    }
56470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
57470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    /**
58470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     * @see java.security.IdentityScope#IdentityScope(String)
59470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     */
60470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    public SystemScope(String name) {
61470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        super(name);
62470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    }
63470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
64470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    /**
65470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     * @see java.security.IdentityScope#IdentityScope(String, IdentityScope)
66470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     */
67470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    public SystemScope(String name, IdentityScope scope)
68470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro            throws KeyManagementException {
69470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        super(name, scope);
70470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    }
71470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
72470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    /**
73470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     * @see java.security.IdentityScope#size()
74470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     */
75470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    public int size() {
76470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        return names.size();
77470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    }
78470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
79470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    /**
80470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     * @see java.security.IdentityScope#getIdentity(java.lang.String)
81470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     */
82470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    public synchronized Identity getIdentity(String name) {
83470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        if (name == null) {
84470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro            throw new NullPointerException("name == null");
85470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        }
86470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        return (Identity) names.get(name);
87470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    }
88470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
89470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    /**
90470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     * @see java.security.IdentityScope#getIdentity(java.security.PublicKey)
91470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     */
92470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    public synchronized Identity getIdentity(PublicKey key) {
93470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        if (key == null) {
94470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro            return null;
95470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        }
96470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        return (Identity) keys.get(key);
97470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    }
98470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
99470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    /**
100470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     * @see java.security.IdentityScope#addIdentity(java.security.Identity)
101470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     */
102470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    public synchronized void addIdentity(Identity identity) throws KeyManagementException {
103470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        if (identity == null) {
104470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro            throw new NullPointerException("identity == null");
105470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        }
106470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
107470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        String name = identity.getName();
108470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        if (names.containsKey(name)) {
109470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro            throw new KeyManagementException("name '" + name + "' is already used");
110470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        }
111470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
112470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        PublicKey key = identity.getPublicKey();
113470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        if (key != null && keys.containsKey(key)) {
114470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro            throw new KeyManagementException("key '" + key + "' is already used");
115470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        }
116470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
117470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        names.put(name, identity);
118470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        if (key != null) {
119470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro            keys.put(key, identity);
120470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        }
121470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    }
122470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
123470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    /**
124470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     * @see java.security.IdentityScope#removeIdentity(java.security.Identity)
125470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     */
126470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    public synchronized void removeIdentity(Identity identity)
127470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro            throws KeyManagementException {
128470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
129470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        //Exception caught = null;
130470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        if (identity == null) {
131470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro            throw new NullPointerException("identity == null");
132470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        }
133470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
134470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        String name = identity.getName();
135470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        if (name == null) {
136470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro            throw new NullPointerException("name == null");
137470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        }
138470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
139470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        boolean contains = names.containsKey(name);
140470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        names.remove(name);
141470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
142470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        PublicKey key = identity.getPublicKey();
143470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
144470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        if (key != null) {
145470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro            contains = contains || keys.containsKey(key);
146470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro            keys.remove(key);
147470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        }
148470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
149470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        if (!contains) {
150470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro            throw new KeyManagementException("identity not found");
151470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        }
152470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    }
153470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro
154470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    /**
155470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     * @see java.security.IdentityScope#identities()
156470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro     */
157470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    public Enumeration identities() {
158470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro        return names.elements();
159470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro    }
160470d4739ef2a14ef77f11bc6dc5d0f09b9e8f6d0Sergio Giro}
161