diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2013-12-18 20:14:15 +0700 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2013-12-18 20:14:15 +0700 |
commit | ed135453ca41139233eb39bf709a2e56440293f8 (patch) | |
tree | d5ed061fbc4144075bee5ec2887e9ec31e1910f3 | |
parent | Factor out variation of MacUtilities.DoFinal (diff) | |
download | BouncyCastle.NET-ed25519-ed135453ca41139233eb39bf709a2e56440293f8.tar.xz |
Port of PrfAlgorithm and ProtocolVersion from Java TLS
-rw-r--r-- | crypto/crypto.csproj | 10 | ||||
-rw-r--r-- | crypto/crypto.mdp | 2 | ||||
-rw-r--r-- | crypto/src/crypto/tls/PrfAlgorithm.cs | 25 | ||||
-rw-r--r-- | crypto/src/crypto/tls/ProtocolVersion.cs | 159 |
4 files changed, 196 insertions, 0 deletions
diff --git a/crypto/crypto.csproj b/crypto/crypto.csproj index 4aaba880f..9ebe947e1 100644 --- a/crypto/crypto.csproj +++ b/crypto/crypto.csproj @@ -4354,6 +4354,16 @@ BuildAction = "Compile" /> <File + RelPath = "src\crypto\tls\PrfAlgorithm.cs" + SubType = "Code" + BuildAction = "Compile" + /> + <File + RelPath = "src\crypto\tls\ProtocolVersion.cs" + SubType = "Code" + BuildAction = "Compile" + /> + <File RelPath = "src\crypto\tls\PskTlsClient.cs" SubType = "Code" BuildAction = "Compile" diff --git a/crypto/crypto.mdp b/crypto/crypto.mdp index a530926b5..98b8e26a9 100644 --- a/crypto/crypto.mdp +++ b/crypto/crypto.mdp @@ -682,6 +682,8 @@ <File subtype="Code" buildaction="Compile" name="src/crypto/tls/Certificate.cs" /> <File subtype="Code" buildaction="Compile" name="src/crypto/tls/CombinedHash.cs" /> <File subtype="Code" buildaction="Compile" name="src/crypto/tls/ICertificateVerifyer.cs" /> + <File subtype="Code" buildaction="Compile" name="src/crypto/tls/PrfAlgorithm.cs" /> + <File subtype="Code" buildaction="Compile" name="src/crypto/tls/ProtocolVersion.cs" /> <File subtype="Code" buildaction="Compile" name="src/crypto/tls/RecordStream.cs" /> <File subtype="Code" buildaction="Compile" name="src/crypto/tls/TlsMac.cs" /> <File subtype="Code" buildaction="Compile" name="src/crypto/tls/TlsProtocolHandler.cs" /> diff --git a/crypto/src/crypto/tls/PrfAlgorithm.cs b/crypto/src/crypto/tls/PrfAlgorithm.cs new file mode 100644 index 000000000..976113495 --- /dev/null +++ b/crypto/src/crypto/tls/PrfAlgorithm.cs @@ -0,0 +1,25 @@ +using System; + +namespace Org.BouncyCastle.Crypto.Tls +{ + /** + * RFC 5246 + * <p/> + * Note that the values here are implementation-specific and arbitrary. It is recommended not to + * depend on the particular values (e.g. serialization). + */ + public abstract class PrfAlgorithm + { + /* + * Placeholder to refer to the legacy TLS algorithm + */ + public const int tls_prf_legacy = 0; + + public const int tls_prf_sha256 = 1; + + /* + * Implied by RFC 5288 + */ + public const int tls_prf_sha384 = 2; + } +} diff --git a/crypto/src/crypto/tls/ProtocolVersion.cs b/crypto/src/crypto/tls/ProtocolVersion.cs new file mode 100644 index 000000000..4d45e4a07 --- /dev/null +++ b/crypto/src/crypto/tls/ProtocolVersion.cs @@ -0,0 +1,159 @@ +using System; +using System.IO; + +using Org.BouncyCastle.Utilities; + +namespace Org.BouncyCastle.Crypto.Tls +{ + public sealed class ProtocolVersion + { + public static readonly ProtocolVersion SSLv3 = new ProtocolVersion(0x0300, "SSL 3.0"); + public static readonly ProtocolVersion TLSv10 = new ProtocolVersion(0x0301, "TLS 1.0"); + public static readonly ProtocolVersion TLSv11 = new ProtocolVersion(0x0302, "TLS 1.1"); + public static readonly ProtocolVersion TLSv12 = new ProtocolVersion(0x0303, "TLS 1.2"); + public static readonly ProtocolVersion DTLSv10 = new ProtocolVersion(0xFEFF, "DTLS 1.0"); + public static readonly ProtocolVersion DTLSv12 = new ProtocolVersion(0xFEFD, "DTLS 1.2"); + + private readonly int version; + private readonly String name; + + private ProtocolVersion(int v, String name) + { + this.version = v & 0xffff; + this.name = name; + } + + public int FullVersion + { + get { return version; } + } + + public int MajorVersion + { + get { return version >> 8; } + } + + public int MinorVersion + { + get { return version & 0xff; } + } + + public bool IsDtls + { + get { return MajorVersion == 0xFE; } + } + + public bool IsSsl + { + get { return this == SSLv3; } + } + + public bool IsTls + { + get { return MajorVersion == 0x03; } + } + + public ProtocolVersion GetEquivalentTLSVersion() + { + if (!IsDtls) + { + return this; + } + if (this == DTLSv10) + { + return TLSv11; + } + return TLSv12; + } + + public bool IsEqualOrEarlierVersionOf(ProtocolVersion version) + { + if (MajorVersion != version.MajorVersion) + { + return false; + } + int diffMinorVersion = version.MinorVersion - MinorVersion; + return IsDtls ? diffMinorVersion <= 0 : diffMinorVersion >= 0; + } + + public bool IsLaterVersionOf(ProtocolVersion version) + { + if (MajorVersion != version.MajorVersion) + { + return false; + } + int diffMinorVersion = version.MinorVersion - MinorVersion; + return IsDtls ? diffMinorVersion > 0 : diffMinorVersion < 0; + } + + public override bool Equals(object other) + { + return this == other || (other is ProtocolVersion && Equals((ProtocolVersion)other)); + } + + public bool Equals(ProtocolVersion other) + { + return other != null && this.version == other.version; + } + + public override int GetHashCode() + { + return version; + } + + /// <exception cref="IOException"/> + public static ProtocolVersion Get(int major, int minor) + { + switch (major) + { + case 0x03: + { + switch (minor) + { + case 0x00: + return SSLv3; + case 0x01: + return TLSv10; + case 0x02: + return TLSv11; + case 0x03: + return TLSv12; + } + return GetUnknownVersion(major, minor, "TLS"); + } + case 0xFE: + { + switch (minor) + { + case 0xFF: + return DTLSv10; + case 0xFE: + throw new TlsFatalAlert(AlertDescription.illegal_parameter); + case 0xFD: + return DTLSv12; + } + return GetUnknownVersion(major, minor, "DTLS"); + } + default: + { + throw new TlsFatalAlert(AlertDescription.illegal_parameter); + } + } + } + + public override string ToString() + { + return name; + } + + private static ProtocolVersion GetUnknownVersion(int major, int minor, string prefix) + { + TlsUtilities.CheckUint8(major); + TlsUtilities.CheckUint8(minor); + + int v = (major << 8) | minor; + String hex = Convert.ToString(0x10000 | v, 16).Substring(1).ToUpperInvariant(); + return new ProtocolVersion(v, prefix + " 0x" + hex); + } + } +} |