1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.wss4j.stax.test.utils;
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 @Override
44 public void handle(Callback[] callbacks)
45 throws IOException, UnsupportedCallbackException {
46 for (Callback callback : callbacks) {
47 if (callback instanceof WSPasswordCallback) {
48 WSPasswordCallback pc = (WSPasswordCallback) callback;
49 if (pc.getUsage() == WSPasswordCallback.SECRET_KEY
50 || pc.getUsage() == WSPasswordCallback.SECURITY_CONTEXT_TOKEN) {
51 byte[] secret = this.secrets.get(pc.getIdentifier());
52 if (secret == null) {
53 secret = outboundSecret;
54 }
55 pc.setKey(secret);
56 break;
57 }
58 } else {
59 throw new UnsupportedCallbackException(callback, "Unrecognized Callback");
60 }
61 }
62 }
63
64 public void addSecretKey(String identifier, byte[] secretKey) {
65 secrets.put(identifier, secretKey);
66 }
67
68 public void setOutboundSecret(byte[] secret) throws WSSecurityException {
69 outboundSecret = secret;
70 byte[] encodedBytes = KeyUtils.generateDigest(outboundSecret);
71 String identifier = XMLUtils.encodeToString(encodedBytes);
72 addSecretKey(identifier, outboundSecret);
73 }
74 }