aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/thedevstack/conversationsplus/crypto/sasl/SaslMechanism.java
blob: ed2764c85bd04a46eeceff2e806ed264d0bf2fb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package de.thedevstack.conversationsplus.crypto.sasl;

import java.security.SecureRandom;

import de.thedevstack.conversationsplus.entities.Account;
import de.thedevstack.conversationsplus.xml.TagWriter;

public abstract class SaslMechanism {

	final protected TagWriter tagWriter;
	final protected Account account;
	final protected SecureRandom rng;

	protected static enum State {
		INITIAL,
		AUTH_TEXT_SENT,
		RESPONSE_SENT,
		VALID_SERVER_RESPONSE,
	}

	public static class AuthenticationException extends Exception {
		public AuthenticationException(final String message) {
			super(message);
		}

		public AuthenticationException(final Exception inner) {
			super(inner);
		}
	}

	public static class InvalidStateException extends AuthenticationException {
		public InvalidStateException(final String message) {
			super(message);
		}

		public InvalidStateException(final State state) {
			this("Invalid state: " + state.toString());
		}
	}

	public SaslMechanism(final TagWriter tagWriter, final Account account, final SecureRandom rng) {
		this.tagWriter = tagWriter;
		this.account = account;
		this.rng = rng;
	}

	/**
	 * The priority is used to pin the authentication mechanism. If authentication fails, it MAY be retried with another
	 * mechanism of the same priority, but MUST NOT be tried with a mechanism of lower priority (to prevent downgrade
	 * attacks).
	 * @return An arbitrary int representing the priority
	 */
	public abstract int getPriority();

	public abstract String getMechanism();
	public String getClientFirstMessage() {
		return "";
	}
	public String getResponse(final String challenge) throws AuthenticationException {
		return "";
	}
}