1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.opensaml.xml.security.keyinfo;
18
19 import org.opensaml.xml.Configuration;
20 import org.opensaml.xml.io.Marshaller;
21 import org.opensaml.xml.io.MarshallingException;
22 import org.opensaml.xml.io.Unmarshaller;
23 import org.opensaml.xml.io.UnmarshallingException;
24 import org.opensaml.xml.security.SecurityException;
25 import org.opensaml.xml.security.credential.Credential;
26 import org.opensaml.xml.signature.KeyInfo;
27 import org.w3c.dom.Element;
28
29
30
31
32
33
34
35
36
37
38
39
40
41 public class StaticKeyInfoGenerator implements KeyInfoGenerator {
42
43
44 private KeyInfo keyInfo;
45
46
47 private Unmarshaller keyInfoUnmarshaller;
48
49
50 private Marshaller keyInfoMarshaller;
51
52
53
54
55
56
57 public StaticKeyInfoGenerator(KeyInfo newKeyInfo) {
58 setKeyInfo(newKeyInfo);
59 }
60
61
62 public KeyInfo generate(Credential credential) throws SecurityException {
63 if (keyInfo.getParent() == null) {
64 return keyInfo;
65 } else {
66 return clone(keyInfo);
67 }
68 }
69
70
71
72
73
74
75 public KeyInfo getKeyInfo() {
76 return keyInfo;
77 }
78
79
80
81
82
83
84 public void setKeyInfo(KeyInfo newKeyInfo) {
85 if (newKeyInfo == null) {
86 throw new IllegalArgumentException("KeyInfo may not be null");
87 }
88 keyInfo = newKeyInfo;
89 }
90
91
92
93
94
95
96
97
98 private KeyInfo clone(KeyInfo origKeyInfo) throws SecurityException {
99
100
101
102
103 Element origDOM = origKeyInfo.getDOM();
104 if (origDOM == null) {
105 try {
106 getMarshaller().marshall(origKeyInfo);
107 } catch (MarshallingException e) {
108 throw new SecurityException("Error marshalling the original KeyInfo during cloning", e);
109 }
110 }
111
112 KeyInfo newKeyInfo = null;
113 try {
114 newKeyInfo = (KeyInfo) getUnmarshaller().unmarshall(origKeyInfo.getDOM());
115 } catch (UnmarshallingException e) {
116 throw new SecurityException("Error unmarshalling the new KeyInfo during cloning", e);
117 }
118
119
120
121 if (origDOM == null) {
122 origKeyInfo.releaseChildrenDOM(true);
123 origKeyInfo.releaseDOM();
124 } else {
125 newKeyInfo.releaseChildrenDOM(true);
126 newKeyInfo.releaseDOM();
127 }
128
129 return newKeyInfo;
130 }
131
132
133
134
135
136
137
138 private Marshaller getMarshaller() throws SecurityException {
139 if (keyInfoMarshaller != null) {
140 return keyInfoMarshaller;
141 }
142 keyInfoMarshaller = Configuration.getMarshallerFactory().getMarshaller(KeyInfo.DEFAULT_ELEMENT_NAME);
143 if (keyInfoMarshaller == null) {
144 throw new SecurityException("Could not obtain KeyInfo marshaller from the configuration");
145 }
146 return keyInfoMarshaller;
147 }
148
149
150
151
152
153
154
155 private Unmarshaller getUnmarshaller() throws SecurityException {
156 if (keyInfoUnmarshaller != null) {
157 return keyInfoUnmarshaller;
158 }
159 keyInfoUnmarshaller = Configuration.getUnmarshallerFactory().getUnmarshaller(KeyInfo.DEFAULT_ELEMENT_NAME);
160 if (keyInfoUnmarshaller == null) {
161 throw new SecurityException("Could not obtain KeyInfo unmarshaller from the configuration");
162 }
163 return keyInfoUnmarshaller;
164 }
165
166 }