1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.ws.security.common;
21
22 import org.apache.ws.security.WSPasswordCallback;
23 import org.apache.ws.security.WSSecurityException;
24 import org.apache.ws.security.util.Base64;
25 import org.apache.ws.security.util.WSSecurityUtil;
26
27 import javax.security.auth.callback.Callback;
28 import javax.security.auth.callback.CallbackHandler;
29 import javax.security.auth.callback.UnsupportedCallbackException;
30 import java.io.IOException;
31 import java.util.HashMap;
32 import java.util.Map;
33
34
35
36
37 public class SecretKeyCallbackHandler implements CallbackHandler {
38
39 private Map<String, byte[]> secrets = new HashMap<String, byte[]>();
40 private byte[] outboundSecret = null;
41
42 public void handle(Callback[] callbacks)
43 throws IOException, UnsupportedCallbackException {
44 for (int i = 0; i < callbacks.length; i++) {
45 if (callbacks[i] instanceof WSPasswordCallback) {
46 WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];
47 switch (pc.getUsage()) {
48 case WSPasswordCallback.SECRET_KEY:
49 case WSPasswordCallback.SECURITY_CONTEXT_TOKEN: {
50 byte[] secret = (byte[]) this.secrets.get(pc.getIdentifier());
51 if (secret == null) {
52 secret = outboundSecret;
53 }
54 pc.setKey(secret);
55 break;
56 }
57 }
58 } else {
59 throw new UnsupportedCallbackException(callbacks[i], "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 = WSSecurityUtil.generateDigest(outboundSecret);
71 String identifier = Base64.encode(encodedBytes);
72 addSecretKey(identifier, outboundSecret);
73 }
74 }