SaslMechanism.java

 1package eu.siacs.conversations.crypto.sasl;
 2
 3import java.security.SecureRandom;
 4
 5import eu.siacs.conversations.entities.Account;
 6import eu.siacs.conversations.xml.TagWriter;
 7
 8public abstract class SaslMechanism {
 9
10	final protected TagWriter tagWriter;
11	final protected Account account;
12	final protected SecureRandom rng;
13
14	protected enum State {
15		INITIAL,
16		AUTH_TEXT_SENT,
17		RESPONSE_SENT,
18		VALID_SERVER_RESPONSE,
19	}
20
21	public static class AuthenticationException extends Exception {
22		public AuthenticationException(final String message) {
23			super(message);
24		}
25
26		public AuthenticationException(final Exception inner) {
27			super(inner);
28		}
29
30		public AuthenticationException(final String message, final Exception exception) {
31			super(message,exception);
32		}
33	}
34
35	public static class InvalidStateException extends AuthenticationException {
36		public InvalidStateException(final String message) {
37			super(message);
38		}
39
40		public InvalidStateException(final State state) {
41			this("Invalid state: " + state.toString());
42		}
43	}
44
45	public SaslMechanism(final TagWriter tagWriter, final Account account, final SecureRandom rng) {
46		this.tagWriter = tagWriter;
47		this.account = account;
48		this.rng = rng;
49	}
50
51	/**
52	 * The priority is used to pin the authentication mechanism. If authentication fails, it MAY be retried with another
53	 * mechanism of the same priority, but MUST NOT be tried with a mechanism of lower priority (to prevent downgrade
54	 * attacks).
55	 * @return An arbitrary int representing the priority
56	 */
57	public abstract int getPriority();
58
59	public abstract String getMechanism();
60	public String getClientFirstMessage() {
61		return "";
62	}
63	public String getResponse(final String challenge) throws AuthenticationException {
64		return "";
65	}
66}