1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.wss4j.dom.common;
21
22 import org.apache.wss4j.common.ext.WSPasswordCallback;
23 import org.apache.wss4j.common.ext.WSSecurityException;
24 import org.apache.wss4j.common.util.KeyUtils;
25 import org.apache.xml.security.utils.XMLUtils;
26
27 import javax.security.auth.callback.Callback;
28 import javax.security.auth.callback.CallbackHandler;
29 import javax.security.auth.callback.UnsupportedCallbackException;
30
31 import java.io.IOException;
32 import java.util.HashMap;
33 import java.util.Map;
34
35
36
37
38 public class SecretKeyCallbackHandler implements CallbackHandler {
39
40 private Map<String, byte[]> secrets = new HashMap<>();
41 private byte[] outboundSecret;
42
43 public void handle(Callback[] callbacks)
44 throws IOException, UnsupportedCallbackException {
45 for (Callback callback : callbacks) {
46 if (callback instanceof WSPasswordCallback) {
47 WSPasswordCallback pc = (WSPasswordCallback) callback;
48 if (pc.getUsage() == WSPasswordCallback.SECRET_KEY
49 || pc.getUsage() == WSPasswordCallback.SECURITY_CONTEXT_TOKEN) {
50 byte[] secret = this.secrets.get(pc.getIdentifier());
51 if (secret == null) {
52 secret = outboundSecret;
53 }
54 pc.setKey(secret);
55 break;
56 }
57 } else {
58 throw new UnsupportedCallbackException(callback, "Unrecognized Callback");
59 }
60 }
61 }
62
63 public void addSecretKey(String identifier, byte[] secretKey) {
64 secrets.put(identifier, secretKey);
65 }
66
67 public void setOutboundSecret(byte[] secret) throws WSSecurityException {
68 outboundSecret = secret;
69 byte[] encodedBytes = KeyUtils.generateDigest(outboundSecret);
70 String identifier = XMLUtils.encodeToString(encodedBytes);
71 addSecretKey(identifier, outboundSecret);
72 }
73 }