diff --git a/crypto-test/CryptoTest.cs b/crypto-test/CryptoTest.cs
index 1f6973e28..5a411b482 100644
--- a/crypto-test/CryptoTest.cs
+++ b/crypto-test/CryptoTest.cs
@@ -14,27 +14,28 @@ namespace crypto_test
try
{
- Org.BouncyCastle.Asn1.Tests.RegressionTest.Main(args);
- //Org.BouncyCastle.Bcpg.OpenPgp.Tests.Dsa2Test.?
- Org.BouncyCastle.Bcpg.OpenPgp.Tests.RegressionTest.Main(args);
- Org.BouncyCastle.Bcpg.OpenPgp.Examples.Tests.AllTests.Main(args);
- Org.BouncyCastle.Cms.Tests.AllTests.Main(args);
- Org.BouncyCastle.Crypto.Tests.RegressionTest.Main(args);
- Org.BouncyCastle.Crypto.IO.Tests.AllTests.Main(args);
- Org.BouncyCastle.Math.Tests.AllTests.Main(args);
- Org.BouncyCastle.Math.EC.Tests.AllTests.Main(args);
- Org.BouncyCastle.Ocsp.Tests.AllTests.Main(args);
- //Org.BouncyCastle.Pkcs.Tests.?
- Org.BouncyCastle.Pkcs.Tests.EncryptedPrivateKeyInfoTest.Main(args);
- Org.BouncyCastle.Pkcs.Tests.Pkcs10Test.Main(args);
- Org.BouncyCastle.Pkcs.Tests.Pkcs12StoreTest.Main(args);
- //Org.BouncyCastle.OpenSsl.Tests.?
- Org.BouncyCastle.OpenSsl.Tests.ReaderTest.Main(args);
- Org.BouncyCastle.OpenSsl.Tests.WriterTest.Main(args);
- //Org.BouncyCastle.Security.Tests.?
- Org.BouncyCastle.Tests.RegressionTest.Main(args);
- Org.BouncyCastle.Tsp.Tests.AllTests.Main(args);
- //Org.BouncyCastle.X509.Tests.?
+ Org.BouncyCastle.Asn1.Tests.RegressionTest.Main(args);
+ //Org.BouncyCastle.Bcpg.OpenPgp.Tests.Dsa2Test.?
+ Org.BouncyCastle.Bcpg.OpenPgp.Tests.RegressionTest.Main(args);
+ Org.BouncyCastle.Bcpg.OpenPgp.Examples.Tests.AllTests.Main(args);
+ Org.BouncyCastle.Cms.Tests.AllTests.Main(args);
+ Org.BouncyCastle.Crypto.Agreement.Tests.AllTests.Main(args);
+ Org.BouncyCastle.Crypto.Tests.RegressionTest.Main(args);
+ Org.BouncyCastle.Crypto.IO.Tests.AllTests.Main(args);
+ Org.BouncyCastle.Math.Tests.AllTests.Main(args);
+ Org.BouncyCastle.Math.EC.Tests.AllTests.Main(args);
+ Org.BouncyCastle.Ocsp.Tests.AllTests.Main(args);
+ //Org.BouncyCastle.Pkcs.Tests.?
+ Org.BouncyCastle.Pkcs.Tests.EncryptedPrivateKeyInfoTest.Main(args);
+ Org.BouncyCastle.Pkcs.Tests.Pkcs10Test.Main(args);
+ Org.BouncyCastle.Pkcs.Tests.Pkcs12StoreTest.Main(args);
+ //Org.BouncyCastle.OpenSsl.Tests.?
+ Org.BouncyCastle.OpenSsl.Tests.ReaderTest.Main(args);
+ Org.BouncyCastle.OpenSsl.Tests.WriterTest.Main(args);
+ //Org.BouncyCastle.Security.Tests.?
+ Org.BouncyCastle.Tests.RegressionTest.Main(args);
+ Org.BouncyCastle.Tsp.Tests.AllTests.Main(args);
+ //Org.BouncyCastle.X509.Tests.?
}
catch (Exception e)
{
diff --git a/crypto/crypto.csproj b/crypto/crypto.csproj
index df7df9f5a..b80a3fec0 100644
--- a/crypto/crypto.csproj
+++ b/crypto/crypto.csproj
@@ -3199,6 +3199,41 @@
BuildAction = "Compile"
/>
<File
+ RelPath = "src\crypto\agreement\jpake\JPakeParticipant.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "src\crypto\agreement\jpake\JPakePrimeOrderGroup.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "src\crypto\agreement\jpake\JPakePrimeOrderGroups.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "src\crypto\agreement\jpake\JPakeRound1Payload.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "src\crypto\agreement\jpake\JPakeRound2Payload.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "src\crypto\agreement\jpake\JPakeRound3Payload.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "src\crypto\agreement\jpake\JPakeUtilities.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
RelPath = "src\crypto\agreement\kdf\DHKdfParameters.cs"
SubType = "Code"
BuildAction = "Compile"
@@ -10990,6 +11025,26 @@
BuildAction = "Compile"
/>
<File
+ RelPath = "test\src\crypto\agreement\test\AllTests.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "test\src\crypto\agreement\test\JPakeParticipantTest.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "test\src\crypto\agreement\test\JPakePrimeOrderGroupTest.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "test\src\crypto\agreement\test\JPakeUtilitiesTest.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
RelPath = "test\src\crypto\examples\DESExample.cs"
SubType = "Code"
BuildAction = "Compile"
diff --git a/crypto/src/crypto/agreement/jpake/JPAKEParticipant.cs b/crypto/src/crypto/agreement/jpake/JPAKEParticipant.cs
index 0874f3d83..f8ca2cd41 100755
--- a/crypto/src/crypto/agreement/jpake/JPAKEParticipant.cs
+++ b/crypto/src/crypto/agreement/jpake/JPAKEParticipant.cs
@@ -5,7 +5,7 @@ using Org.BouncyCastle.Crypto.Digests;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Security;
-namespace Org.BouncyCastle.Crypto.Agreement.Jpake
+namespace Org.BouncyCastle.Crypto.Agreement.JPake
{
/// <summary>
/// A participant in a Password Authenticated Key Exchange by Juggling (J-PAKE) exchange.
@@ -16,20 +16,20 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
///
/// The J-PAKE protocol is symmetric.
/// There is no notion of a <i>client</i> or <i>server</i>, but rather just two <i>participants</i>.
- /// An instance of JPAKEParticipant represents one participant, and
+ /// An instance of JPakeParticipant represents one participant, and
/// is the primary interface for executing the exchange.
///
- /// To execute an exchange, construct a JPAKEParticipant on each end,
+ /// To execute an exchange, construct a JPakeParticipant on each end,
/// and call the following 7 methods
/// (once and only once, in the given order, for each participant, sending messages between them as described):
///
/// CreateRound1PayloadToSend() - and send the payload to the other participant
- /// ValidateRound1PayloadReceived(JPAKERound1Payload) - use the payload received from the other participant
+ /// ValidateRound1PayloadReceived(JPakeRound1Payload) - use the payload received from the other participant
/// CreateRound2PayloadToSend() - and send the payload to the other participant
- /// ValidateRound2PayloadReceived(JPAKERound2Payload) - use the payload received from the other participant
+ /// ValidateRound2PayloadReceived(JPakeRound2Payload) - use the payload received from the other participant
/// CalculateKeyingMaterial()
/// CreateRound3PayloadToSend(BigInteger) - and send the payload to the other participant
- /// ValidateRound3PayloadReceived(JPAKERound3Payload, BigInteger) - use the payload received from the other participant
+ /// ValidateRound3PayloadReceived(JPakeRound3Payload, BigInteger) - use the payload received from the other participant
///
/// Each side should derive a session key from the keying material returned by CalculateKeyingMaterial().
/// The caller is responsible for deriving the session key using a secure key derivation function (KDF).
@@ -51,9 +51,9 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
///
/// This class is stateful and NOT threadsafe.
/// Each instance should only be used for ONE complete J-PAKE exchange
- /// (i.e. a new JPAKEParticipant should be constructed for each new J-PAKE exchange).
+ /// (i.e. a new JPakeParticipant should be constructed for each new J-PAKE exchange).
/// </summary>
- public class JPAKEParticipant
+ public class JPakeParticipant
{
// Possible internal states. Used for state checking.
public static readonly int STATE_INITIALIZED = 0;
@@ -109,8 +109,8 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
private int state;
/// <summary>
- /// Convenience constructor for a new JPAKEParticipant that uses
- /// the JPAKEPrimeOrderGroups#NIST_3072 prime order group,
+ /// Convenience constructor for a new JPakeParticipant that uses
+ /// the JPakePrimeOrderGroups#NIST_3072 prime order group,
/// a SHA-256 digest, and a default SecureRandom implementation.
///
/// After construction, the State state will be STATE_INITIALIZED.
@@ -123,11 +123,11 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// <param name="password">Shared secret.
/// A defensive copy of this array is made (and cleared once CalculateKeyingMaterial() is called).
/// Caller should clear the input password as soon as possible.</param>
- public JPAKEParticipant(string participantId, char[] password)
- : this(participantId, password, JPAKEPrimeOrderGroups.NIST_3072) { }
+ public JPakeParticipant(string participantId, char[] password)
+ : this(participantId, password, JPakePrimeOrderGroups.NIST_3072) { }
/// <summary>
- /// Convenience constructor for a new JPAKEParticipant that uses
+ /// Convenience constructor for a new JPakeParticipant that uses
/// a SHA-256 digest, and a default SecureRandom implementation.
///
/// After construction, the State state will be STATE_INITIALIZED.
@@ -140,13 +140,13 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// <param name="password">Shared secret.
/// A defensive copy of this array is made (and cleared once CalculateKeyingMaterial() is called).
/// Caller should clear the input password as soon as possible.</param>
- /// <param name="group">Prime order group. See JPAKEPrimeOrderGroups for standard groups.</param>
- public JPAKEParticipant(string participantId, char[] password, JPAKEPrimeOrderGroup group)
+ /// <param name="group">Prime order group. See JPakePrimeOrderGroups for standard groups.</param>
+ public JPakeParticipant(string participantId, char[] password, JPakePrimeOrderGroup group)
: this(participantId, password, group, new Sha256Digest(), new SecureRandom()) { }
/// <summary>
- /// Constructor for a new JPAKEParticipant.
+ /// Constructor for a new JPakeParticipant.
///
/// After construction, the State state will be STATE_INITIALIZED.
///
@@ -158,17 +158,17 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// <param name="password">Shared secret.
/// A defensive copy of this array is made (and cleared once CalculateKeyingMaterial() is called).
/// Caller should clear the input password as soon as possible.</param>
- /// <param name="group">Prime order group. See JPAKEPrimeOrderGroups for standard groups.</param>
+ /// <param name="group">Prime order group. See JPakePrimeOrderGroups for standard groups.</param>
/// <param name="digest">Digest to use during zero knowledge proofs and key confirmation
/// (SHA-256 or stronger preferred).</param>
/// <param name="random">Source of secure random data for x1 and x2, and for the zero knowledge proofs.</param>
- public JPAKEParticipant(string participantId, char[] password, JPAKEPrimeOrderGroup group, IDigest digest, SecureRandom random)
+ public JPakeParticipant(string participantId, char[] password, JPakePrimeOrderGroup group, IDigest digest, SecureRandom random)
{
- JPAKEUtil.ValidateNotNull(participantId, "participantId");
- JPAKEUtil.ValidateNotNull(password, "password");
- JPAKEUtil.ValidateNotNull(group, "p");
- JPAKEUtil.ValidateNotNull(digest, "digest");
- JPAKEUtil.ValidateNotNull(random, "random");
+ JPakeUtilities.ValidateNotNull(participantId, "participantId");
+ JPakeUtilities.ValidateNotNull(password, "password");
+ JPakeUtilities.ValidateNotNull(group, "p");
+ JPakeUtilities.ValidateNotNull(digest, "digest");
+ JPakeUtilities.ValidateNotNull(random, "random");
if (password.Length == 0)
{
@@ -204,7 +204,7 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// Gets the current state of this participant.
/// See the <tt>STATE_*</tt> constants for possible values.
/// </summary>
- public int State
+ public virtual int State
{
get { return state; }
}
@@ -215,24 +215,22 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
///
/// After execution, the State state} will be STATE_ROUND_1_CREATED}.
/// </summary>
- public JPAKERound1Payload CreateRound1PayloadToSend()
+ public virtual JPakeRound1Payload CreateRound1PayloadToSend()
{
if (this.state >= STATE_ROUND_1_CREATED)
- {
throw new InvalidOperationException("Round 1 payload already created for " + this.participantId);
- }
- this.x1 = JPAKEUtil.GenerateX1(q, random);
- this.x2 = JPAKEUtil.GenerateX2(q, random);
+ this.x1 = JPakeUtilities.GenerateX1(q, random);
+ this.x2 = JPakeUtilities.GenerateX2(q, random);
- this.gx1 = JPAKEUtil.CalculateGx(p, g, x1);
- this.gx2 = JPAKEUtil.CalculateGx(p, g, x2);
- BigInteger[] knowledgeProofForX1 = JPAKEUtil.CalculateZeroKnowledgeProof(p, q, g, gx1, x1, participantId, digest, random);
- BigInteger[] knowledgeProofForX2 = JPAKEUtil.CalculateZeroKnowledgeProof(p, q, g, gx2, x2, participantId, digest, random);
+ this.gx1 = JPakeUtilities.CalculateGx(p, g, x1);
+ this.gx2 = JPakeUtilities.CalculateGx(p, g, x2);
+ BigInteger[] knowledgeProofForX1 = JPakeUtilities.CalculateZeroKnowledgeProof(p, q, g, gx1, x1, participantId, digest, random);
+ BigInteger[] knowledgeProofForX2 = JPakeUtilities.CalculateZeroKnowledgeProof(p, q, g, gx2, x2, participantId, digest, random);
this.state = STATE_ROUND_1_CREATED;
- return new JPAKERound1Payload(participantId, gx1, gx2, knowledgeProofForX1, knowledgeProofForX2);
+ return new JPakeRound1Payload(participantId, gx1, gx2, knowledgeProofForX1, knowledgeProofForX2);
}
/// <summary>
@@ -245,12 +243,10 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// Throws CryptoException if validation fails. Throws InvalidOperationException
/// if called multiple times.
/// </summary>
- public void ValidateRound1PayloadReceived(JPAKERound1Payload round1PayloadReceived)
+ public virtual void ValidateRound1PayloadReceived(JPakeRound1Payload round1PayloadReceived)
{
if (this.state >= STATE_ROUND_1_VALIDATED)
- {
throw new InvalidOperationException("Validation already attempted for round 1 payload for " + this.participantId);
- }
this.partnerParticipantId = round1PayloadReceived.ParticipantId;
this.gx3 = round1PayloadReceived.Gx1;
@@ -259,42 +255,38 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
BigInteger[] knowledgeProofForX3 = round1PayloadReceived.KnowledgeProofForX1;
BigInteger[] knowledgeProofForX4 = round1PayloadReceived.KnowledgeProofForX2;
- JPAKEUtil.ValidateParticipantIdsDiffer(participantId, round1PayloadReceived.ParticipantId);
- JPAKEUtil.ValidateGx4(gx4);
- JPAKEUtil.ValidateZeroKnowledgeProof(p, q, g, gx3, knowledgeProofForX3, round1PayloadReceived.ParticipantId, digest);
- JPAKEUtil.ValidateZeroKnowledgeProof(p, q, g, gx4, knowledgeProofForX4, round1PayloadReceived.ParticipantId, digest);
+ JPakeUtilities.ValidateParticipantIdsDiffer(participantId, round1PayloadReceived.ParticipantId);
+ JPakeUtilities.ValidateGx4(gx4);
+ JPakeUtilities.ValidateZeroKnowledgeProof(p, q, g, gx3, knowledgeProofForX3, round1PayloadReceived.ParticipantId, digest);
+ JPakeUtilities.ValidateZeroKnowledgeProof(p, q, g, gx4, knowledgeProofForX4, round1PayloadReceived.ParticipantId, digest);
this.state = STATE_ROUND_1_VALIDATED;
}
/// <summary>
/// Creates and returns the payload to send to the other participant during round 2.
///
- /// ValidateRound1PayloadReceived(JPAKERound1Payload) must be called prior to this method.
+ /// ValidateRound1PayloadReceived(JPakeRound1Payload) must be called prior to this method.
///
/// After execution, the State state will be STATE_ROUND_2_CREATED.
///
- /// Throws InvalidOperationException if called prior to ValidateRound1PayloadReceived(JPAKERound1Payload), or multiple times
+ /// Throws InvalidOperationException if called prior to ValidateRound1PayloadReceived(JPakeRound1Payload), or multiple times
/// </summary>
- public JPAKERound2Payload CreateRound2PayloadToSend()
+ public virtual JPakeRound2Payload CreateRound2PayloadToSend()
{
if (this.state >= STATE_ROUND_2_CREATED)
- {
throw new InvalidOperationException("Round 2 payload already created for " + this.participantId);
- }
if (this.state < STATE_ROUND_1_VALIDATED)
- {
throw new InvalidOperationException("Round 1 payload must be validated prior to creating round 2 payload for " + this.participantId);
- }
- BigInteger gA = JPAKEUtil.CalculateGA(p, gx1, gx3, gx4);
- BigInteger s = JPAKEUtil.CalculateS(password);
- BigInteger x2s = JPAKEUtil.CalculateX2s(q, x2, s);
- BigInteger A = JPAKEUtil.CalculateA(p, q, gA, x2s);
- BigInteger[] knowledgeProofForX2s = JPAKEUtil.CalculateZeroKnowledgeProof(p, q, gA, A, x2s, participantId, digest, random);
+ BigInteger gA = JPakeUtilities.CalculateGA(p, gx1, gx3, gx4);
+ BigInteger s = JPakeUtilities.CalculateS(password);
+ BigInteger x2s = JPakeUtilities.CalculateX2s(q, x2, s);
+ BigInteger A = JPakeUtilities.CalculateA(p, q, gA, x2s);
+ BigInteger[] knowledgeProofForX2s = JPakeUtilities.CalculateZeroKnowledgeProof(p, q, gA, A, x2s, participantId, digest, random);
this.state = STATE_ROUND_2_CREATED;
- return new JPAKERound2Payload(participantId, A, knowledgeProofForX2s);
+ return new JPakeRound2Payload(participantId, A, knowledgeProofForX2s);
}
/// <summary>
@@ -308,27 +300,23 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// After execution, the State state will be STATE_ROUND_2_VALIDATED.
///
/// Throws CryptoException if validation fails. Throws
- /// InvalidOperationException if called prior to ValidateRound1PayloadReceived(JPAKERound1Payload), or multiple times
+ /// InvalidOperationException if called prior to ValidateRound1PayloadReceived(JPakeRound1Payload), or multiple times
/// </summary>
- public void ValidateRound2PayloadReceived(JPAKERound2Payload round2PayloadReceived)
+ public virtual void ValidateRound2PayloadReceived(JPakeRound2Payload round2PayloadReceived)
{
if (this.state >= STATE_ROUND_2_VALIDATED)
- {
throw new InvalidOperationException("Validation already attempted for round 2 payload for " + this.participantId);
- }
if (this.state < STATE_ROUND_1_VALIDATED)
- {
throw new InvalidOperationException("Round 1 payload must be validated prior to validation round 2 payload for " + this.participantId);
- }
- BigInteger gB = JPAKEUtil.CalculateGA(p, gx3, gx1, gx2);
+ BigInteger gB = JPakeUtilities.CalculateGA(p, gx3, gx1, gx2);
this.b = round2PayloadReceived.A;
BigInteger[] knowledgeProofForX4s = round2PayloadReceived.KnowledgeProofForX2s;
- JPAKEUtil.ValidateParticipantIdsDiffer(participantId, round2PayloadReceived.ParticipantId);
- JPAKEUtil.ValidateParticipantIdsEqual(this.partnerParticipantId, round2PayloadReceived.ParticipantId);
- JPAKEUtil.ValidateGa(gB);
- JPAKEUtil.ValidateZeroKnowledgeProof(p, q, gB, b, knowledgeProofForX4s, round2PayloadReceived.ParticipantId, digest);
+ JPakeUtilities.ValidateParticipantIdsDiffer(participantId, round2PayloadReceived.ParticipantId);
+ JPakeUtilities.ValidateParticipantIdsEqual(this.partnerParticipantId, round2PayloadReceived.ParticipantId);
+ JPakeUtilities.ValidateGa(gB);
+ JPakeUtilities.ValidateZeroKnowledgeProof(p, q, gB, b, knowledgeProofForX4s, round2PayloadReceived.ParticipantId, digest);
this.state = STATE_ROUND_2_VALIDATED;
}
@@ -336,7 +324,7 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// <summary>
/// Calculates and returns the key material.
/// A session key must be derived from this key material using a secure key derivation function (KDF).
- /// The KDF used to derive the key is handled externally (i.e. not by JPAKEParticipant).
+ /// The KDF used to derive the key is handled externally (i.e. not by JPakeParticipant).
///
/// The keying material will be identical for each participant if and only if
/// each participant's password is the same. i.e. If the participants do not
@@ -344,39 +332,35 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// Therefore, if you immediately start using a key derived from
/// the keying material, then you must handle detection of incorrect keys.
/// If you want to handle this detection explicitly, you can optionally perform
- /// rounds 3 and 4. See JPAKEParticipant for details on how to execute
+ /// rounds 3 and 4. See JPakeParticipant for details on how to execute
/// rounds 3 and 4.
///
/// The keying material will be in the range <tt>[0, p-1]</tt>.
///
- /// ValidateRound2PayloadReceived(JPAKERound2Payload) must be called prior to this method.
+ /// ValidateRound2PayloadReceived(JPakeRound2Payload) must be called prior to this method.
///
/// As a side effect, the internal password array is cleared, since it is no longer needed.
///
/// After execution, the State state will be STATE_KEY_CALCULATED.
///
- /// Throws InvalidOperationException if called prior to ValidateRound2PayloadReceived(JPAKERound2Payload),
+ /// Throws InvalidOperationException if called prior to ValidateRound2PayloadReceived(JPakeRound2Payload),
/// or if called multiple times.
/// </summary>
- public BigInteger CalculateKeyingMaterial()
+ public virtual BigInteger CalculateKeyingMaterial()
{
if (this.state >= STATE_KEY_CALCULATED)
- {
throw new InvalidOperationException("Key already calculated for " + participantId);
- }
if (this.state < STATE_ROUND_2_VALIDATED)
- {
throw new InvalidOperationException("Round 2 payload must be validated prior to creating key for " + participantId);
- }
- BigInteger s = JPAKEUtil.CalculateS(password);
+ BigInteger s = JPakeUtilities.CalculateS(password);
// Clear the password array from memory, since we don't need it anymore.
// Also set the field to null as a flag to indicate that the key has already been calculated.
Array.Clear(password, 0, password.Length);
this.password = null;
- BigInteger keyingMaterial = JPAKEUtil.CalculateKeyingMaterial(p, q, gx4, x2, s, b);
+ BigInteger keyingMaterial = JPakeUtilities.CalculateKeyingMaterial(p, q, gx4, x2, s, b);
// Clear the ephemeral private key fields as well.
// Note that we're relying on the garbage collector to do its job to clean these up.
@@ -398,25 +382,21 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// <summary>
/// Creates and returns the payload to send to the other participant during round 3.
///
- /// See JPAKEParticipant for more details on round 3.
+ /// See JPakeParticipant for more details on round 3.
///
/// After execution, the State state} will be STATE_ROUND_3_CREATED.
/// Throws InvalidOperationException if called prior to CalculateKeyingMaterial, or multiple
/// times.
/// </summary>
/// <param name="keyingMaterial">The keying material as returned from CalculateKeyingMaterial().</param>
- public JPAKERound3Payload CreateRound3PayloadToSend(BigInteger keyingMaterial)
+ public virtual JPakeRound3Payload CreateRound3PayloadToSend(BigInteger keyingMaterial)
{
if (this.state >= STATE_ROUND_3_CREATED)
- {
throw new InvalidOperationException("Round 3 payload already created for " + this.participantId);
- }
if (this.state < STATE_KEY_CALCULATED)
- {
throw new InvalidOperationException("Keying material must be calculated prior to creating round 3 payload for " + this.participantId);
- }
- BigInteger macTag = JPAKEUtil.CalculateMacTag(
+ BigInteger macTag = JPakeUtilities.CalculateMacTag(
this.participantId,
this.partnerParticipantId,
this.gx1,
@@ -428,13 +408,13 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
this.state = STATE_ROUND_3_CREATED;
- return new JPAKERound3Payload(participantId, macTag);
+ return new JPakeRound3Payload(participantId, macTag);
}
/// <summary>
/// Validates the payload received from the other participant during round 3.
///
- /// See JPAKEParticipant for more details on round 3.
+ /// See JPakeParticipant for more details on round 3.
///
/// After execution, the State state will be STATE_ROUND_3_VALIDATED.
///
@@ -442,21 +422,17 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// CalculateKeyingMaterial or multiple times
/// </summary>
/// <param name="keyingMaterial">The keying material as returned from CalculateKeyingMaterial().</param>
- public void ValidateRound3PayloadReceived(JPAKERound3Payload round3PayloadReceived, BigInteger keyingMaterial)
+ public virtual void ValidateRound3PayloadReceived(JPakeRound3Payload round3PayloadReceived, BigInteger keyingMaterial)
{
if (this.state >= STATE_ROUND_3_VALIDATED)
- {
throw new InvalidOperationException("Validation already attempted for round 3 payload for " + this.participantId);
- }
if (this.state < STATE_KEY_CALCULATED)
- {
throw new InvalidOperationException("Keying material must be calculated prior to validating round 3 payload for " + this.participantId);
- }
- JPAKEUtil.ValidateParticipantIdsDiffer(participantId, round3PayloadReceived.ParticipantId);
- JPAKEUtil.ValidateParticipantIdsEqual(this.partnerParticipantId, round3PayloadReceived.ParticipantId);
+ JPakeUtilities.ValidateParticipantIdsDiffer(participantId, round3PayloadReceived.ParticipantId);
+ JPakeUtilities.ValidateParticipantIdsEqual(this.partnerParticipantId, round3PayloadReceived.ParticipantId);
- JPAKEUtil.ValidateMacTag(
+ JPakeUtilities.ValidateMacTag(
this.participantId,
this.partnerParticipantId,
this.gx1,
diff --git a/crypto/src/crypto/agreement/jpake/JPAKEPrimeOrderGroup.cs b/crypto/src/crypto/agreement/jpake/JPAKEPrimeOrderGroup.cs
index 3a142f713..08ffe1a55 100755
--- a/crypto/src/crypto/agreement/jpake/JPAKEPrimeOrderGroup.cs
+++ b/crypto/src/crypto/agreement/jpake/JPAKEPrimeOrderGroup.cs
@@ -2,7 +2,7 @@
using Org.BouncyCastle.Math;
-namespace Org.BouncyCastle.Crypto.Agreement.Jpake
+namespace Org.BouncyCastle.Crypto.Agreement.JPake
{
/// <summary>
/// A pre-computed prime order group for use during a J-PAKE exchange.
@@ -10,22 +10,22 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// Typically a Schnorr group is used. In general, J-PAKE can use any prime order group
/// that is suitable for public key cryptography, including elliptic curve cryptography.
///
- /// See JPAKEPrimeOrderGroups for convenient standard groups.
+ /// See JPakePrimeOrderGroups for convenient standard groups.
///
/// NIST <a href="http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/DSA2_All.pdf">publishes</a>
/// many groups that can be used for the desired level of security.
/// </summary>
- public class JPAKEPrimeOrderGroup
+ public class JPakePrimeOrderGroup
{
private readonly BigInteger p;
private readonly BigInteger q;
private readonly BigInteger g;
/// <summary>
- /// Constructs a new JPAKEPrimeOrderGroup.
+ /// Constructs a new JPakePrimeOrderGroup.
///
/// In general, you should use one of the pre-approved groups from
- /// JPAKEPrimeOrderGroups, rather than manually constructing one.
+ /// JPakePrimeOrderGroups, rather than manually constructing one.
///
/// The following basic checks are performed:
///
@@ -46,47 +46,38 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// Throws NullReferenceException if any argument is null. Throws
/// InvalidOperationException is any of the above validations fail.
/// </summary>
- public JPAKEPrimeOrderGroup(BigInteger p, BigInteger q, BigInteger g)
+ public JPakePrimeOrderGroup(BigInteger p, BigInteger q, BigInteger g)
: this(p, q, g, false)
{
// Don't skip the checks on user-specified groups.
}
/// <summary>
- /// Constructor used by the pre-approved groups in JPAKEPrimeOrderGroups.
+ /// Constructor used by the pre-approved groups in JPakePrimeOrderGroups.
/// These pre-approved groups can avoid the expensive checks.
/// User-specified groups should not use this constructor.
/// </summary>
- public JPAKEPrimeOrderGroup(BigInteger p, BigInteger q, BigInteger g, bool skipChecks)
+ public JPakePrimeOrderGroup(BigInteger p, BigInteger q, BigInteger g, bool skipChecks)
{
- JPAKEUtil.ValidateNotNull(p, "p");
- JPAKEUtil.ValidateNotNull(q, "q");
- JPAKEUtil.ValidateNotNull(g, "g");
+ JPakeUtilities.ValidateNotNull(p, "p");
+ JPakeUtilities.ValidateNotNull(q, "q");
+ JPakeUtilities.ValidateNotNull(g, "g");
if (!skipChecks)
{
- if (!p.Subtract(JPAKEUtil.ONE).Mod(q).Equals(JPAKEUtil.ZERO))
- {
+ if (!p.Subtract(JPakeUtilities.One).Mod(q).Equals(JPakeUtilities.Zero))
throw new ArgumentException("p-1 must be evenly divisible by q");
- }
- if (g.CompareTo(BigInteger.ValueOf(2)) == -1 || g.CompareTo(p.Subtract(JPAKEUtil.ONE)) == 1)
- {
+ if (g.CompareTo(BigInteger.Two) == -1 || g.CompareTo(p.Subtract(JPakeUtilities.One)) == 1)
throw new ArgumentException("g must be in [2, p-1]");
- }
- if (!g.ModPow(q, p).Equals(JPAKEUtil.ONE))
- {
+ if (!g.ModPow(q, p).Equals(JPakeUtilities.One))
throw new ArgumentException("g^q mod p must equal 1");
- }
+
// Note these checks do not guarantee that p and q are prime.
// We just have reasonable certainty that they are prime.
if (!p.IsProbablePrime(20))
- {
throw new ArgumentException("p must be prime");
- }
if (!q.IsProbablePrime(20))
- {
throw new ArgumentException("q must be prime");
- }
}
this.p = p;
@@ -94,17 +85,17 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
this.g = g;
}
- public BigInteger P
+ public virtual BigInteger P
{
get { return p; }
}
- public BigInteger Q
+ public virtual BigInteger Q
{
get { return q; }
}
- public BigInteger G
+ public virtual BigInteger G
{
get { return g; }
}
diff --git a/crypto/src/crypto/agreement/jpake/JPAKEPrimeOrderGroups.cs b/crypto/src/crypto/agreement/jpake/JPAKEPrimeOrderGroups.cs
index aeaff6f72..33640845a 100755
--- a/crypto/src/crypto/agreement/jpake/JPAKEPrimeOrderGroups.cs
+++ b/crypto/src/crypto/agreement/jpake/JPAKEPrimeOrderGroups.cs
@@ -1,6 +1,6 @@
using Org.BouncyCastle.Math;
-namespace Org.BouncyCastle.Crypto.Agreement.Jpake
+namespace Org.BouncyCastle.Crypto.Agreement.JPake
{
/// <summary>
/// Standard pre-computed prime order groups for use by J-PAKE.
@@ -13,13 +13,13 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// and from the prime order groups
/// <a href="http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/DSA2_All.pdf">published by NIST</a>.
/// </summary>
- public class JPAKEPrimeOrderGroups
+ public class JPakePrimeOrderGroups
{
/// <summary>
/// From Sun's JDK JavaDoc (docs/guide/security/CryptoSpec.html#AppB)
/// 1024-bit p, 160-bit q and 1024-bit g for 80-bit security.
/// </summary>
- public static readonly JPAKEPrimeOrderGroup SUN_JCE_1024 = new JPAKEPrimeOrderGroup(
+ public static readonly JPakePrimeOrderGroup SUN_JCE_1024 = new JPakePrimeOrderGroup(
// p
new BigInteger(
"fd7f53811d75122952df4a9c2eece4e7f611b7523cef4400c31e3f80b6512669" +
@@ -41,7 +41,7 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// From NIST.
/// 2048-bit p, 224-bit q and 2048-bit g for 112-bit security.
/// </summary>
- public static readonly JPAKEPrimeOrderGroup NIST_2048 = new JPAKEPrimeOrderGroup(
+ public static readonly JPakePrimeOrderGroup NIST_2048 = new JPakePrimeOrderGroup(
// p
new BigInteger(
"C196BA05AC29E1F9C3C72D56DFFC6154A033F1477AC88EC37F09BE6C5BB95F51" +
@@ -71,7 +71,7 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// From NIST.
/// 3072-bit p, 256-bit q and 3072-bit g for 128-bit security.
/// </summary>
- public static readonly JPAKEPrimeOrderGroup NIST_3072 = new JPAKEPrimeOrderGroup(
+ public static readonly JPakePrimeOrderGroup NIST_3072 = new JPakePrimeOrderGroup(
// p
new BigInteger(
"90066455B5CFC38F9CAA4A48B4281F292C260FEEF01FD61037E56258A7795A1C" +
diff --git a/crypto/src/crypto/agreement/jpake/JPAKERound1Payload.cs b/crypto/src/crypto/agreement/jpake/JPAKERound1Payload.cs
index 7b638dabd..9e4ab7a5f 100755
--- a/crypto/src/crypto/agreement/jpake/JPAKERound1Payload.cs
+++ b/crypto/src/crypto/agreement/jpake/JPAKERound1Payload.cs
@@ -2,7 +2,7 @@
using Org.BouncyCastle.Math;
-namespace Org.BouncyCastle.Crypto.Agreement.Jpake
+namespace Org.BouncyCastle.Crypto.Agreement.JPake
{
/// <summary>
/// The payload sent/received during the first round of a J-PAKE exchange.
@@ -13,9 +13,9 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
///
/// Each participant must also validate the payload received from the other.
/// The received payload should be validated via
- /// JPAKEParticipant.ValidateRound1PayloadReceived(JPAKERound1Payload).
+ /// JPAKEParticipant.ValidateRound1PayloadReceived(JPakeRound1Payload).
/// </summary>
- public class JPAKERound1Payload
+ public class JPakeRound1Payload
{
/// <summary>
/// The id of the JPAKEParticipant who created/sent this payload.
@@ -46,13 +46,13 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// </summary>
private readonly BigInteger[] knowledgeProofForX2;
- public JPAKERound1Payload(string participantId, BigInteger gx1, BigInteger gx2, BigInteger[] knowledgeProofForX1, BigInteger[] knowledgeProofForX2)
+ public JPakeRound1Payload(string participantId, BigInteger gx1, BigInteger gx2, BigInteger[] knowledgeProofForX1, BigInteger[] knowledgeProofForX2)
{
- JPAKEUtil.ValidateNotNull(participantId, "participantId");
- JPAKEUtil.ValidateNotNull(gx1, "gx1");
- JPAKEUtil.ValidateNotNull(gx2, "gx2");
- JPAKEUtil.ValidateNotNull(knowledgeProofForX1, "knowledgeProofForX1");
- JPAKEUtil.ValidateNotNull(knowledgeProofForX2, "knowledgeProofForX2");
+ JPakeUtilities.ValidateNotNull(participantId, "participantId");
+ JPakeUtilities.ValidateNotNull(gx1, "gx1");
+ JPakeUtilities.ValidateNotNull(gx2, "gx2");
+ JPakeUtilities.ValidateNotNull(knowledgeProofForX1, "knowledgeProofForX1");
+ JPakeUtilities.ValidateNotNull(knowledgeProofForX2, "knowledgeProofForX2");
this.participantId = participantId;
this.gx1 = gx1;
@@ -63,22 +63,22 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
Array.Copy(knowledgeProofForX2, this.knowledgeProofForX2, knowledgeProofForX2.Length);
}
- public string ParticipantId
+ public virtual string ParticipantId
{
get { return participantId; }
}
- public BigInteger Gx1
+ public virtual BigInteger Gx1
{
get { return gx1; }
}
- public BigInteger Gx2
+ public virtual BigInteger Gx2
{
get { return gx2; }
}
- public BigInteger[] KnowledgeProofForX1
+ public virtual BigInteger[] KnowledgeProofForX1
{
get
{
@@ -88,7 +88,7 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
}
}
- public BigInteger[] KnowledgeProofForX2
+ public virtual BigInteger[] KnowledgeProofForX2
{
get
{
diff --git a/crypto/src/crypto/agreement/jpake/JPAKERound2Payload.cs b/crypto/src/crypto/agreement/jpake/JPAKERound2Payload.cs
index cf1a8575e..47962cb3f 100755
--- a/crypto/src/crypto/agreement/jpake/JPAKERound2Payload.cs
+++ b/crypto/src/crypto/agreement/jpake/JPAKERound2Payload.cs
@@ -3,7 +3,7 @@
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Utilities;
-namespace Org.BouncyCastle.Crypto.Agreement.Jpake
+namespace Org.BouncyCastle.Crypto.Agreement.JPake
{
/// <summary>
/// The payload sent/received during the second round of a J-PAKE exchange.
@@ -16,9 +16,9 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// Each JPAKEParticipant must also validate the payload
/// received from the other JPAKEParticipant.
/// The received payload should be validated via
- /// JPAKEParticipant#validateRound2PayloadReceived(JPAKERound2Payload)
+ /// JPAKEParticipant#validateRound2PayloadReceived(JPakeRound2Payload)
/// </summary>
- public class JPAKERound2Payload
+ public class JPakeRound2Payload
{
/// <summary>
/// The id of the JPAKEParticipant who created/sent this payload.
@@ -37,11 +37,11 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// </summary>
private readonly BigInteger[] knowledgeProofForX2s;
- public JPAKERound2Payload(string participantId, BigInteger a, BigInteger[] knowledgeProofForX2s)
+ public JPakeRound2Payload(string participantId, BigInteger a, BigInteger[] knowledgeProofForX2s)
{
- JPAKEUtil.ValidateNotNull(participantId, "participantId");
- JPAKEUtil.ValidateNotNull(a, "a");
- JPAKEUtil.ValidateNotNull(knowledgeProofForX2s, "knowledgeProofForX2s");
+ JPakeUtilities.ValidateNotNull(participantId, "participantId");
+ JPakeUtilities.ValidateNotNull(a, "a");
+ JPakeUtilities.ValidateNotNull(knowledgeProofForX2s, "knowledgeProofForX2s");
this.participantId = participantId;
this.a = a;
@@ -49,17 +49,17 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
knowledgeProofForX2s.CopyTo(this.knowledgeProofForX2s, 0);
}
- public string ParticipantId
+ public virtual string ParticipantId
{
get { return participantId; }
}
- public BigInteger A
+ public virtual BigInteger A
{
get { return a; }
}
- public BigInteger[] KnowledgeProofForX2s
+ public virtual BigInteger[] KnowledgeProofForX2s
{
get
{
diff --git a/crypto/src/crypto/agreement/jpake/JPAKERound3Payload.cs b/crypto/src/crypto/agreement/jpake/JPAKERound3Payload.cs
index 95e0f24ce..767702f23 100755
--- a/crypto/src/crypto/agreement/jpake/JPAKERound3Payload.cs
+++ b/crypto/src/crypto/agreement/jpake/JPAKERound3Payload.cs
@@ -2,7 +2,7 @@
using Org.BouncyCastle.Math;
-namespace Org.BouncyCastle.Crypto.Agreement.Jpake
+namespace Org.BouncyCastle.Crypto.Agreement.JPake
{
/// <summary>
/// The payload sent/received during the optional third round of a J-PAKE exchange,
@@ -16,9 +16,9 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// Eeach JPAKEParticipant must also validate the payload
/// received from the other JPAKEParticipant.
/// The received payload should be validated via
- /// JPAKEParticipant#validateRound3PayloadReceived(JPAKERound3Payload, BigInteger)
+ /// JPAKEParticipant#validateRound3PayloadReceived(JPakeRound3Payload, BigInteger)
/// </summary>
- public class JPAKERound3Payload
+ public class JPakeRound3Payload
{
/// <summary>
/// The id of the {@link JPAKEParticipant} who created/sent this payload.
@@ -32,18 +32,18 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// </summary>
private readonly BigInteger macTag;
- public JPAKERound3Payload(string participantId, BigInteger magTag)
+ public JPakeRound3Payload(string participantId, BigInteger magTag)
{
this.participantId = participantId;
this.macTag = magTag;
}
- public string ParticipantId
+ public virtual string ParticipantId
{
get { return participantId; }
}
- public BigInteger MacTag
+ public virtual BigInteger MacTag
{
get { return macTag; }
}
diff --git a/crypto/src/crypto/agreement/jpake/JPAKEUtil.cs b/crypto/src/crypto/agreement/jpake/JPakeUtilities.cs
index 34f8c2685..eaf8af676 100755..100644
--- a/crypto/src/crypto/agreement/jpake/JPAKEUtil.cs
+++ b/crypto/src/crypto/agreement/jpake/JPakeUtilities.cs
@@ -4,25 +4,26 @@ using System.Text;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Macs;
using Org.BouncyCastle.Crypto.Parameters;
+using Org.BouncyCastle.Crypto.Utilities;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities;
-namespace Org.BouncyCastle.Crypto.Agreement.Jpake
+namespace Org.BouncyCastle.Crypto.Agreement.JPake
{
/// <summary>
/// Primitives needed for a J-PAKE exchange.
///
/// The recommended way to perform a J-PAKE exchange is by using
/// two JPAKEParticipants. Internally, those participants
- /// call these primitive operations in JPAKEUtil.
+ /// call these primitive operations in JPakeUtilities.
///
/// The primitives, however, can be used without a JPAKEParticipant if needed.
/// </summary>
- public class JPAKEUtil
+ public abstract class JPakeUtilities
{
- public static BigInteger ZERO = BigInteger.ValueOf(0);
- public static BigInteger ONE = BigInteger.ValueOf(1);
+ public static readonly BigInteger Zero = BigInteger.Zero;
+ public static readonly BigInteger One = BigInteger.One;
/// <summary>
/// Return a value that can be used as x1 or x3 during round 1.
@@ -30,8 +31,8 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// </summary>
public static BigInteger GenerateX1(BigInteger q, SecureRandom random)
{
- BigInteger min = ZERO;
- BigInteger max = q.Subtract(ONE);
+ BigInteger min = Zero;
+ BigInteger max = q.Subtract(One);
return BigIntegers.CreateRandomInRange(min, max, random);
}
@@ -41,8 +42,8 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// </summary>
public static BigInteger GenerateX2(BigInteger q, SecureRandom random)
{
- BigInteger min = ONE;
- BigInteger max = q.Subtract(ONE);
+ BigInteger min = One;
+ BigInteger max = q.Subtract(One);
return BigIntegers.CreateRandomInRange(min, max, random);
}
@@ -52,7 +53,7 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// </summary>
public static BigInteger CalculateS(char[] password)
{
- return new BigInteger(Strings.ToUtf8ByteArray(password));
+ return new BigInteger(Encoding.UTF8.GetBytes(password));
}
/// <summary>
@@ -96,20 +97,19 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
public static BigInteger[] CalculateZeroKnowledgeProof(BigInteger p, BigInteger q, BigInteger g,
BigInteger gx, BigInteger x, string participantId, IDigest digest, SecureRandom random)
{
- BigInteger[] zeroKnowledgeProof = new BigInteger[2];
-
/* Generate a random v, and compute g^v */
- BigInteger vMin = ZERO;
- BigInteger vMax = q.Subtract(ONE);
+ BigInteger vMin = Zero;
+ BigInteger vMax = q.Subtract(One);
BigInteger v = BigIntegers.CreateRandomInRange(vMin, vMax, random);
BigInteger gv = g.ModPow(v, p);
BigInteger h = CalculateHashForZeroKnowledgeProof(g, gv, gx, participantId, digest); // h
- zeroKnowledgeProof[0] = gv;
- zeroKnowledgeProof[1] = v.Subtract(x.Multiply(h)).Mod(q); // r = v-x*h
-
- return zeroKnowledgeProof;
+ return new BigInteger[]
+ {
+ gv,
+ v.Subtract(x.Multiply(h)).Mod(q) // r = v-x*h
+ };
}
private static BigInteger CalculateHashForZeroKnowledgeProof(BigInteger g, BigInteger gr, BigInteger gx,
@@ -125,8 +125,7 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
UpdateDigestIncludingSize(digest, participantId);
- byte[] output = new byte[digest.GetDigestSize()];
- digest.DoFinal(output, 0);
+ byte[] output = DigestUtilities.DoFinal(digest);
return new BigInteger(output);
}
@@ -137,10 +136,8 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// </summary>
public static void ValidateGx4(BigInteger gx4)
{
- if (gx4.Equals(ONE))
- {
+ if (gx4.Equals(One))
throw new CryptoException("g^x validation failed. g^x should not be 1.");
- }
}
/// <summary>
@@ -155,10 +152,8 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// </summary>
public static void ValidateGa(BigInteger ga)
{
- if (ga.Equals(ONE))
- {
+ if (ga.Equals(One))
throw new CryptoException("ga is equal to 1. It should not be. The chances of this happening are on the order of 2^160 for a 160-bit q. Try again.");
- }
}
/// <summary>
@@ -176,9 +171,9 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
BigInteger r = zeroKnowledgeProof[1];
BigInteger h = CalculateHashForZeroKnowledgeProof(g, gv, gx, participantId, digest);
- if (!(gx.CompareTo(ZERO) == 1 && // g^x > 0
+ if (!(gx.CompareTo(Zero) == 1 && // g^x > 0
gx.CompareTo(p) == -1 && // g^x < p
- gx.ModPow(q, p).CompareTo(ONE) == 0 && // g^x^q mod q = 1
+ gx.ModPow(q, p).CompareTo(One) == 0 && // g^x^q mod q = 1
/*
* Below, I took a straightforward way to compute g^r * g^x^h,
* which needs 2 exp. Using a simultaneous computation technique
@@ -245,12 +240,10 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
/// </summary>
/// <param name="obj">object in question</param>
/// <param name="description">name of the object (to be used in exception message)</param>
- public static void ValidateNotNull(Object obj, string description)
+ public static void ValidateNotNull(object obj, string description)
{
if (obj == null)
- {
- throw new NullReferenceException(description + " must not be null");
- }
+ throw new ArgumentNullException(description);
}
/// <summary>
@@ -275,8 +268,8 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
byte[] macKey = CalculateMacKey(keyingMaterial, digest);
HMac mac = new HMac(digest);
- byte[] macOutput = new byte[mac.GetMacSize()];
mac.Init(new KeyParameter(macKey));
+ Arrays.Fill(macKey, (byte)0);
/*
* MacData = "KC_1_U" || participantId_Alice || participantId_Bob || gx1 || gx2 || gx3 || gx4.
@@ -289,9 +282,7 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
UpdateMac(mac, gx3);
UpdateMac(mac, gx4);
- mac.DoFinal(macOutput, 0);
-
- Arrays.Fill(macKey, (byte)0);
+ byte[] macOutput = MacUtilities.DoFinal(mac);
return new BigInteger(macOutput);
}
@@ -311,10 +302,7 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
*/
UpdateDigest(digest, "JPAKE_KC");
- byte[] output = new byte[digest.GetDigestSize()];
- digest.DoFinal(output, 0);
-
- return output;
+ return DigestUtilities.DoFinal(digest);
}
/// <summary>
@@ -348,57 +336,56 @@ namespace Org.BouncyCastle.Crypto.Agreement.Jpake
private static void UpdateDigest(IDigest digest, BigInteger bigInteger)
{
- byte[] byteArray = BigIntegers.AsUnsignedByteArray(bigInteger);
- digest.BlockUpdate(byteArray, 0, byteArray.Length);
- Arrays.Fill(byteArray, (byte)0);
+ UpdateDigest(digest, BigIntegers.AsUnsignedByteArray(bigInteger));
}
- private static void UpdateDigestIncludingSize(IDigest digest, BigInteger bigInteger)
+ private static void UpdateDigest(IDigest digest, string str)
{
- byte[] byteArray = BigIntegers.AsUnsignedByteArray(bigInteger);
- digest.BlockUpdate(IntToByteArray(byteArray.Length), 0, 4);
- digest.BlockUpdate(byteArray, 0, byteArray.Length);
- Arrays.Fill(byteArray, (byte)0);
+ UpdateDigest(digest, Encoding.UTF8.GetBytes(str));
}
- private static void UpdateDigest(IDigest digest, string str)
+ private static void UpdateDigest(IDigest digest, byte[] bytes)
{
- byte[] byteArray = Encoding.UTF8.GetBytes(str);
- digest.BlockUpdate(byteArray, 0, byteArray.Length);
- Arrays.Fill(byteArray, (byte)0);
+ digest.BlockUpdate(bytes, 0, bytes.Length);
+ Arrays.Fill(bytes, (byte)0);
+ }
+
+ private static void UpdateDigestIncludingSize(IDigest digest, BigInteger bigInteger)
+ {
+ UpdateDigestIncludingSize(digest, BigIntegers.AsUnsignedByteArray(bigInteger));
}
private static void UpdateDigestIncludingSize(IDigest digest, string str)
{
- byte[] byteArray = Encoding.UTF8.GetBytes(str);
- digest.BlockUpdate(IntToByteArray(byteArray.Length), 0, 4);
- digest.BlockUpdate(byteArray, 0, byteArray.Length);
- Arrays.Fill(byteArray, (byte)0);
+ UpdateDigestIncludingSize(digest, Encoding.UTF8.GetBytes(str));
+ }
+
+ private static void UpdateDigestIncludingSize(IDigest digest, byte[] bytes)
+ {
+ digest.BlockUpdate(IntToByteArray(bytes.Length), 0, 4);
+ digest.BlockUpdate(bytes, 0, bytes.Length);
+ Arrays.Fill(bytes, (byte)0);
}
private static void UpdateMac(IMac mac, BigInteger bigInteger)
{
- byte[] byteArray = BigIntegers.AsUnsignedByteArray(bigInteger);
- mac.BlockUpdate(byteArray, 0, byteArray.Length);
- Arrays.Fill(byteArray, (byte)0);
+ UpdateMac(mac, BigIntegers.AsUnsignedByteArray(bigInteger));
}
private static void UpdateMac(IMac mac, string str)
{
- byte[] byteArray = Encoding.UTF8.GetBytes(str);
- mac.BlockUpdate(byteArray, 0, byteArray.Length);
- Arrays.Fill(byteArray, (byte)0);
+ UpdateMac(mac, Encoding.UTF8.GetBytes(str));
}
- private static byte[] IntToByteArray(int value)
+ private static void UpdateMac(IMac mac, byte[] bytes)
{
- return new byte[]{
- (byte)((uint)value >> 24),
- (byte)((uint)value >> 16),
- (byte)((uint)value >> 8),
- (byte)value
- };
+ mac.BlockUpdate(bytes, 0, bytes.Length);
+ Arrays.Fill(bytes, (byte)0);
}
+ private static byte[] IntToByteArray(int value)
+ {
+ return Pack.UInt32_To_BE((uint)value);
+ }
}
}
diff --git a/crypto/test/src/crypto/agreement/test/AllTests.cs b/crypto/test/src/crypto/agreement/test/AllTests.cs
new file mode 100644
index 000000000..ea8f438e5
--- /dev/null
+++ b/crypto/test/src/crypto/agreement/test/AllTests.cs
@@ -0,0 +1,31 @@
+using System;
+
+using NUnit.Core;
+using NUnit.Framework;
+
+using Org.BouncyCastle.Utilities.Test;
+
+namespace Org.BouncyCastle.Crypto.Agreement.Tests
+{
+ [TestFixture]
+ public class AllTests
+ {
+ public static void Main(string[] args)
+ {
+ Suite.Run(new NullListener(), NUnit.Core.TestFilter.Empty);
+ }
+
+ [Suite]
+ public static TestSuite Suite
+ {
+ get
+ {
+ TestSuite suite = new TestSuite("JPAKE Engine Tests");
+ suite.Add(new JPakeParticipantTest());
+ suite.Add(new JPakePrimeOrderGroupTest());
+ suite.Add(new JPakeUtilitiesTest());
+ return suite;
+ }
+ }
+ }
+}
diff --git a/crypto/test/src/crypto/test/JPAKEParticipantTest.cs b/crypto/test/src/crypto/agreement/test/JPAKEParticipantTest.cs
index 7c01bf237..c84264aa5 100644
--- a/crypto/test/src/crypto/test/JPAKEParticipantTest.cs
+++ b/crypto/test/src/crypto/agreement/test/JPAKEParticipantTest.cs
@@ -2,16 +2,16 @@
using NUnit.Framework;
-using Org.BouncyCastle.Crypto.Agreement.Jpake;
+using Org.BouncyCastle.Crypto.Agreement.JPake;
using Org.BouncyCastle.Crypto.Digests;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities.Test;
-namespace Org.BouncyCastle.Crypto.Tests
+namespace Org.BouncyCastle.Crypto.Agreement.Tests
{
[TestFixture]
- public class JPAKEParticipantTest
+ public class JPakeParticipantTest
: SimpleTest
{
public override void PerformTest()
@@ -26,13 +26,13 @@ namespace Org.BouncyCastle.Crypto.Tests
public override string Name
{
- get { return "JPAKEParticipant"; }
+ get { return "JPakeParticipant"; }
}
public static void Main(
string[] args)
{
- RunTest(new JPAKEParticipantTest());
+ RunTest(new JPakeParticipantTest());
}
[Test]
@@ -45,23 +45,23 @@ namespace Org.BouncyCastle.Crypto.Tests
public void TestConstruction()
{
- JPAKEPrimeOrderGroup group = JPAKEPrimeOrderGroups.SUN_JCE_1024;
+ JPakePrimeOrderGroup group = JPakePrimeOrderGroups.SUN_JCE_1024;
SecureRandom random = new SecureRandom();
IDigest digest = new Sha256Digest();
string participantId = "participantId";
char[] password = "password".ToCharArray();
// should succeed
- new JPAKEParticipant(participantId, password, group, digest, random);
+ new JPakeParticipant(participantId, password, group, digest, random);
// null participantId
try
{
- new JPAKEParticipant(null, password, group, digest, random);
+ new JPakeParticipant(null, password, group, digest, random);
Fail("failed to throw exception on null participantId");
}
- catch (NullReferenceException)
+ catch (ArgumentNullException)
{
// expected
}
@@ -69,11 +69,11 @@ namespace Org.BouncyCastle.Crypto.Tests
// null password
try
{
- new JPAKEParticipant(participantId, null, group, digest, random);
+ new JPakeParticipant(participantId, null, group, digest, random);
Fail("failed to throw exception on null password");
}
- catch (NullReferenceException)
+ catch (ArgumentNullException)
{
// expected
}
@@ -81,7 +81,7 @@ namespace Org.BouncyCastle.Crypto.Tests
// empty password
try
{
- new JPAKEParticipant(participantId, "".ToCharArray(), group, digest, random);
+ new JPakeParticipant(participantId, "".ToCharArray(), group, digest, random);
Fail("failed to throw exception on empty password");
}
@@ -93,11 +93,11 @@ namespace Org.BouncyCastle.Crypto.Tests
// null group
try
{
- new JPAKEParticipant(participantId, password, null, digest, random);
+ new JPakeParticipant(participantId, password, null, digest, random);
Fail("failed to throw exception on null group");
}
- catch (NullReferenceException)
+ catch (ArgumentNullException)
{
// expected
}
@@ -105,11 +105,11 @@ namespace Org.BouncyCastle.Crypto.Tests
// null digest
try
{
- new JPAKEParticipant(participantId, password, group, null, random);
+ new JPakeParticipant(participantId, password, group, null, random);
Fail("failed to throw exception on null digest");
}
- catch (NullReferenceException)
+ catch (ArgumentNullException)
{
// expected
}
@@ -117,11 +117,11 @@ namespace Org.BouncyCastle.Crypto.Tests
// null random
try
{
- new JPAKEParticipant(participantId, password, group, digest, null);
+ new JPakeParticipant(participantId, password, group, digest, null);
Fail("failed to throw exception on null random");
}
- catch (NullReferenceException)
+ catch (ArgumentNullException)
{
// expected
}
@@ -129,8 +129,8 @@ namespace Org.BouncyCastle.Crypto.Tests
public void TestSuccessfulExchange()
{
- JPAKEParticipant alice = CreateAlice();
- JPAKEParticipant bob = CreateBob();
+ JPakeParticipant alice = CreateAlice();
+ JPakeParticipant bob = CreateBob();
ExchangeAfterRound2Creation exchange = RunExchangeUntilRound2Creation(alice, bob);
@@ -140,8 +140,8 @@ namespace Org.BouncyCastle.Crypto.Tests
BigInteger aliceKeyingMaterial = alice.CalculateKeyingMaterial();
BigInteger bobKeyingMaterial = bob.CalculateKeyingMaterial();
- JPAKERound3Payload aliceRound3Payload = alice.CreateRound3PayloadToSend(aliceKeyingMaterial);
- JPAKERound3Payload bobRound3Payload = bob.CreateRound3PayloadToSend(bobKeyingMaterial);
+ JPakeRound3Payload aliceRound3Payload = alice.CreateRound3PayloadToSend(aliceKeyingMaterial);
+ JPakeRound3Payload bobRound3Payload = bob.CreateRound3PayloadToSend(bobKeyingMaterial);
alice.ValidateRound3PayloadReceived(bobRound3Payload, aliceKeyingMaterial);
bob.ValidateRound3PayloadReceived(aliceRound3Payload, bobKeyingMaterial);
@@ -151,8 +151,8 @@ namespace Org.BouncyCastle.Crypto.Tests
public void TestIncorrectPassword()
{
- JPAKEParticipant alice = CreateAlice();
- JPAKEParticipant bob = CreateBobWithWrongPassword();
+ JPakeParticipant alice = CreateAlice();
+ JPakeParticipant bob = CreateBobWithWrongPassword();
ExchangeAfterRound2Creation exchange = RunExchangeUntilRound2Creation(alice, bob);
@@ -162,8 +162,8 @@ namespace Org.BouncyCastle.Crypto.Tests
BigInteger aliceKeyingMaterial = alice.CalculateKeyingMaterial();
BigInteger bobKeyingMaterial = bob.CalculateKeyingMaterial();
- JPAKERound3Payload aliceRound3Payload = alice.CreateRound3PayloadToSend(aliceKeyingMaterial);
- JPAKERound3Payload bobRound3Payload = bob.CreateRound3PayloadToSend(bobKeyingMaterial);
+ JPakeRound3Payload aliceRound3Payload = alice.CreateRound3PayloadToSend(aliceKeyingMaterial);
+ JPakeRound3Payload bobRound3Payload = bob.CreateRound3PayloadToSend(bobKeyingMaterial);
try
{
@@ -190,14 +190,14 @@ namespace Org.BouncyCastle.Crypto.Tests
public void TestStateValidation()
{
- JPAKEParticipant alice = CreateAlice();
- JPAKEParticipant bob = CreateBob();
+ JPakeParticipant alice = CreateAlice();
+ JPakeParticipant bob = CreateBob();
// We're testing alice here. Bob is just used for help.
// START ROUND 1 CHECKS
- Assert.AreEqual(JPAKEParticipant.STATE_INITIALIZED, alice.State);
+ Assert.AreEqual(JPakeParticipant.STATE_INITIALIZED, alice.State);
// create round 2 before round 1
try
@@ -211,8 +211,8 @@ namespace Org.BouncyCastle.Crypto.Tests
// expected
}
- JPAKERound1Payload aliceRound1Payload = alice.CreateRound1PayloadToSend();
- Assert.AreEqual(JPAKEParticipant.STATE_ROUND_1_CREATED, alice.State);
+ JPakeRound1Payload aliceRound1Payload = alice.CreateRound1PayloadToSend();
+ Assert.AreEqual(JPakeParticipant.STATE_ROUND_1_CREATED, alice.State);
// create round 1 twice
try
@@ -250,9 +250,9 @@ namespace Org.BouncyCastle.Crypto.Tests
// expected
}
- JPAKERound1Payload bobRound1Payload = bob.CreateRound1PayloadToSend();
+ JPakeRound1Payload bobRound1Payload = bob.CreateRound1PayloadToSend();
alice.ValidateRound1PayloadReceived(bobRound1Payload);
- Assert.AreEqual(JPAKEParticipant.STATE_ROUND_1_VALIDATED, alice.State);
+ Assert.AreEqual(JPakeParticipant.STATE_ROUND_1_VALIDATED, alice.State);
// validate round 1 payload twice
try
@@ -270,8 +270,8 @@ namespace Org.BouncyCastle.Crypto.Tests
// START ROUND 2 CHECKS
- JPAKERound2Payload aliceRound2Payload = alice.CreateRound2PayloadToSend();
- Assert.AreEqual(JPAKEParticipant.STATE_ROUND_2_CREATED, alice.State);
+ JPakeRound2Payload aliceRound2Payload = alice.CreateRound2PayloadToSend();
+ Assert.AreEqual(JPakeParticipant.STATE_ROUND_2_CREATED, alice.State);
// create round 2 payload twice
try
@@ -309,9 +309,9 @@ namespace Org.BouncyCastle.Crypto.Tests
// expected
}
- JPAKERound2Payload bobRound2Payload = bob.CreateRound2PayloadToSend();
+ JPakeRound2Payload bobRound2Payload = bob.CreateRound2PayloadToSend();
alice.ValidateRound2PayloadReceived(bobRound2Payload);
- Assert.AreEqual(JPAKEParticipant.STATE_ROUND_2_VALIDATED, alice.State);
+ Assert.AreEqual(JPakeParticipant.STATE_ROUND_2_VALIDATED, alice.State);
// validate round 2 payload twice
try
@@ -342,7 +342,7 @@ namespace Org.BouncyCastle.Crypto.Tests
// START KEY CALCULATION CHECKS
BigInteger aliceKeyingMaterial = alice.CalculateKeyingMaterial();
- Assert.AreEqual(JPAKEParticipant.STATE_KEY_CALCULATED, alice.State);
+ Assert.AreEqual(JPakeParticipant.STATE_KEY_CALCULATED, alice.State);
// calculate key twice
try
@@ -360,8 +360,8 @@ namespace Org.BouncyCastle.Crypto.Tests
// START ROUND 3 CHECKS
- JPAKERound3Payload aliceRound3Payload = alice.CreateRound3PayloadToSend(aliceKeyingMaterial);
- Assert.AreEqual(JPAKEParticipant.STATE_ROUND_3_CREATED, alice.State);
+ JPakeRound3Payload aliceRound3Payload = alice.CreateRound3PayloadToSend(aliceKeyingMaterial);
+ Assert.AreEqual(JPakeParticipant.STATE_ROUND_3_CREATED, alice.State);
// create round 3 payload twice
try
@@ -375,9 +375,9 @@ namespace Org.BouncyCastle.Crypto.Tests
// expected
}
- JPAKERound3Payload bobRound3Payload = bob.CreateRound3PayloadToSend(bobKeyingMaterial);
+ JPakeRound3Payload bobRound3Payload = bob.CreateRound3PayloadToSend(bobKeyingMaterial);
alice.ValidateRound3PayloadReceived(bobRound3Payload, aliceKeyingMaterial);
- Assert.AreEqual(JPAKEParticipant.STATE_ROUND_3_VALIDATED, alice.State);
+ Assert.AreEqual(JPakeParticipant.STATE_ROUND_3_VALIDATED, alice.State);
// validate round 3 payload twice
try
@@ -398,7 +398,7 @@ namespace Org.BouncyCastle.Crypto.Tests
{
// We're testing alice here. Bob is just used for help.
- JPAKERound1Payload bobRound1Payload = CreateBob().CreateRound1PayloadToSend();
+ JPakeRound1Payload bobRound1Payload = CreateBob().CreateRound1PayloadToSend();
// should succeed
CreateAlice().ValidateRound1PayloadReceived(bobRound1Payload);
@@ -406,7 +406,7 @@ namespace Org.BouncyCastle.Crypto.Tests
// alice verifies alice's payload
try
{
- JPAKEParticipant alice = CreateAlice();
+ JPakeParticipant alice = CreateAlice();
alice.ValidateRound1PayloadReceived(alice.CreateRound1PayloadToSend());
Fail("failed to throw on participant validating own payload");
@@ -419,7 +419,7 @@ namespace Org.BouncyCastle.Crypto.Tests
// g^x4 == 1
try
{
- CreateAlice().ValidateRound1PayloadReceived(new JPAKERound1Payload(
+ CreateAlice().ValidateRound1PayloadReceived(new JPakeRound1Payload(
bobRound1Payload.ParticipantId,
bobRound1Payload.Gx1,
BigInteger.One,
@@ -436,8 +436,8 @@ namespace Org.BouncyCastle.Crypto.Tests
// zero knowledge proof for x3 fails
try
{
- JPAKERound1Payload bobRound1Payload2 = CreateBob().CreateRound1PayloadToSend();
- CreateAlice().ValidateRound1PayloadReceived(new JPAKERound1Payload(
+ JPakeRound1Payload bobRound1Payload2 = CreateBob().CreateRound1PayloadToSend();
+ CreateAlice().ValidateRound1PayloadReceived(new JPakeRound1Payload(
bobRound1Payload.ParticipantId,
bobRound1Payload.Gx1,
bobRound1Payload.Gx2,
@@ -454,8 +454,8 @@ namespace Org.BouncyCastle.Crypto.Tests
// zero knowledge proof for x4 fails
try
{
- JPAKERound1Payload bobRound1Payload2 = CreateBob().CreateRound1PayloadToSend();
- CreateAlice().ValidateRound1PayloadReceived(new JPAKERound1Payload(
+ JPakeRound1Payload bobRound1Payload2 = CreateBob().CreateRound1PayloadToSend();
+ CreateAlice().ValidateRound1PayloadReceived(new JPakeRound1Payload(
bobRound1Payload.ParticipantId,
bobRound1Payload.Gx1,
bobRound1Payload.Gx2,
@@ -508,14 +508,14 @@ namespace Org.BouncyCastle.Crypto.Tests
private class ExchangeAfterRound2Creation
{
- public JPAKEParticipant alice;
- public JPAKERound2Payload aliceRound2Payload;
- public JPAKERound2Payload bobRound2Payload;
+ public JPakeParticipant alice;
+ public JPakeRound2Payload aliceRound2Payload;
+ public JPakeRound2Payload bobRound2Payload;
public ExchangeAfterRound2Creation(
- JPAKEParticipant alice,
- JPAKERound2Payload aliceRound2Payload,
- JPAKERound2Payload bobRound2Payload)
+ JPakeParticipant alice,
+ JPakeRound2Payload aliceRound2Payload,
+ JPakeRound2Payload bobRound2Payload)
{
this.alice = alice;
this.aliceRound2Payload = aliceRound2Payload;
@@ -523,16 +523,16 @@ namespace Org.BouncyCastle.Crypto.Tests
}
}
- private ExchangeAfterRound2Creation RunExchangeUntilRound2Creation(JPAKEParticipant alice, JPAKEParticipant bob)
+ private ExchangeAfterRound2Creation RunExchangeUntilRound2Creation(JPakeParticipant alice, JPakeParticipant bob)
{
- JPAKERound1Payload aliceRound1Payload = alice.CreateRound1PayloadToSend();
- JPAKERound1Payload bobRound1Payload = bob.CreateRound1PayloadToSend();
+ JPakeRound1Payload aliceRound1Payload = alice.CreateRound1PayloadToSend();
+ JPakeRound1Payload bobRound1Payload = bob.CreateRound1PayloadToSend();
alice.ValidateRound1PayloadReceived(bobRound1Payload);
bob.ValidateRound1PayloadReceived(aliceRound1Payload);
- JPAKERound2Payload aliceRound2Payload = alice.CreateRound2PayloadToSend();
- JPAKERound2Payload bobRound2Payload = bob.CreateRound2PayloadToSend();
+ JPakeRound2Payload aliceRound2Payload = alice.CreateRound2PayloadToSend();
+ JPakeRound2Payload bobRound2Payload = bob.CreateRound2PayloadToSend();
return new ExchangeAfterRound2Creation(
alice,
@@ -540,27 +540,27 @@ namespace Org.BouncyCastle.Crypto.Tests
bobRound2Payload);
}
- private JPAKEParticipant CreateAlice()
+ private JPakeParticipant CreateAlice()
{
return CreateParticipant("alice", "password");
}
- private JPAKEParticipant CreateBob()
+ private JPakeParticipant CreateBob()
{
return CreateParticipant("bob", "password");
}
- private JPAKEParticipant CreateBobWithWrongPassword()
+ private JPakeParticipant CreateBobWithWrongPassword()
{
return CreateParticipant("bob", "wrong");
}
- private JPAKEParticipant CreateParticipant(string participantId, string password)
+ private JPakeParticipant CreateParticipant(string participantId, string password)
{
- return new JPAKEParticipant(
+ return new JPakeParticipant(
participantId,
password.ToCharArray(),
- JPAKEPrimeOrderGroups.SUN_JCE_1024);
+ JPakePrimeOrderGroups.SUN_JCE_1024);
}
}
}
diff --git a/crypto/test/src/crypto/test/JPAKEPrimeOrderGroupTest.cs b/crypto/test/src/crypto/agreement/test/JPakePrimeOrderGroupTest.cs
index d9749cb53..0f089f93c 100644
--- a/crypto/test/src/crypto/test/JPAKEPrimeOrderGroupTest.cs
+++ b/crypto/test/src/crypto/agreement/test/JPakePrimeOrderGroupTest.cs
@@ -2,14 +2,14 @@
using NUnit.Framework;
-using Org.BouncyCastle.Crypto.Agreement.Jpake;
+using Org.BouncyCastle.Crypto.Agreement.JPake;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Utilities.Test;
-namespace Org.BouncyCastle.Crypto.Tests
+namespace Org.BouncyCastle.Crypto.Agreement.Tests
{
[TestFixture]
- public class JPAKEPrimeOrderGroupTest
+ public class JPakePrimeOrderGroupTest
: SimpleTest
{
public override void PerformTest()
@@ -19,13 +19,13 @@ namespace Org.BouncyCastle.Crypto.Tests
public override string Name
{
- get { return "JPAKEPrimeOrderGroup"; }
+ get { return "JPakePrimeOrderGroup"; }
}
public static void Main(
string[] args)
{
- RunTest(new JPAKEPrimeOrderGroupTest());
+ RunTest(new JPakePrimeOrderGroupTest());
}
[Test]
@@ -41,7 +41,7 @@ namespace Org.BouncyCastle.Crypto.Tests
// p-1 not evenly divisible by q
try
{
- new JPAKEPrimeOrderGroup(BigInteger.ValueOf(7), BigInteger.ValueOf(5), BigInteger.ValueOf(6));
+ new JPakePrimeOrderGroup(BigInteger.ValueOf(7), BigInteger.ValueOf(5), BigInteger.ValueOf(6));
Fail("failed to throw exception on p-1 not evenly divisible by q");
}
@@ -53,7 +53,7 @@ namespace Org.BouncyCastle.Crypto.Tests
// g < 2
try
{
- new JPAKEPrimeOrderGroup(BigInteger.ValueOf(11), BigInteger.ValueOf(5), BigInteger.ValueOf(1));
+ new JPakePrimeOrderGroup(BigInteger.ValueOf(11), BigInteger.ValueOf(5), BigInteger.ValueOf(1));
Fail("failed to throw exception on g < 2");
}
@@ -65,7 +65,7 @@ namespace Org.BouncyCastle.Crypto.Tests
// g > p - 1
try
{
- new JPAKEPrimeOrderGroup(BigInteger.ValueOf(11), BigInteger.ValueOf(5), BigInteger.ValueOf(11));
+ new JPakePrimeOrderGroup(BigInteger.ValueOf(11), BigInteger.ValueOf(5), BigInteger.ValueOf(11));
Fail("failed to throw exception on g > p - 1");
}
@@ -77,7 +77,7 @@ namespace Org.BouncyCastle.Crypto.Tests
//g^q mod p not equal 1
try
{
- new JPAKEPrimeOrderGroup(BigInteger.ValueOf(11), BigInteger.ValueOf(5), BigInteger.ValueOf(6));
+ new JPakePrimeOrderGroup(BigInteger.ValueOf(11), BigInteger.ValueOf(5), BigInteger.ValueOf(6));
Fail("failed to throw exception on g^q mod p not equal 1");
}
@@ -89,7 +89,7 @@ namespace Org.BouncyCastle.Crypto.Tests
// p not prime
try
{
- new JPAKEPrimeOrderGroup(BigInteger.ValueOf(15), BigInteger.ValueOf(2), BigInteger.ValueOf(4));
+ new JPakePrimeOrderGroup(BigInteger.ValueOf(15), BigInteger.ValueOf(2), BigInteger.ValueOf(4));
Fail("failed to throw exception on p not prime");
}
@@ -101,7 +101,7 @@ namespace Org.BouncyCastle.Crypto.Tests
// q not prime
try
{
- new JPAKEPrimeOrderGroup(BigInteger.ValueOf(7), BigInteger.ValueOf(6), BigInteger.ValueOf(3));
+ new JPakePrimeOrderGroup(BigInteger.ValueOf(7), BigInteger.ValueOf(6), BigInteger.ValueOf(3));
Fail("failed to throw exception on q not prime");
}
@@ -111,7 +111,7 @@ namespace Org.BouncyCastle.Crypto.Tests
}
// should succeed
- new JPAKEPrimeOrderGroup(BigInteger.ValueOf(7), BigInteger.ValueOf(3), BigInteger.ValueOf(4));
+ new JPakePrimeOrderGroup(BigInteger.ValueOf(7), BigInteger.ValueOf(3), BigInteger.ValueOf(4));
}
}
}
diff --git a/crypto/test/src/crypto/test/JPAKEUtilTest.cs b/crypto/test/src/crypto/agreement/test/JPakeUtilitiesTest.cs
index 7ac54aba0..04a52cc06 100644
--- a/crypto/test/src/crypto/test/JPAKEUtilTest.cs
+++ b/crypto/test/src/crypto/agreement/test/JPakeUtilitiesTest.cs
@@ -2,16 +2,16 @@
using NUnit.Framework;
-using Org.BouncyCastle.Crypto.Agreement.Jpake;
+using Org.BouncyCastle.Crypto.Agreement.JPake;
using Org.BouncyCastle.Crypto.Digests;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities.Test;
-namespace Org.BouncyCastle.Crypto.Tests
+namespace Org.BouncyCastle.Crypto.Agreement.Tests
{
[TestFixture]
- public class JPAKEUtilTest
+ public class JPakeUtilitiesTest
: SimpleTest
{
private static readonly BigInteger Ten = BigInteger.ValueOf(10);
@@ -29,13 +29,13 @@ namespace Org.BouncyCastle.Crypto.Tests
public override string Name
{
- get { return "JPAKEUtil"; }
+ get { return "JPakeUtilities"; }
}
public static void Main(
string[] args)
{
- RunTest(new JPAKEUtilTest());
+ RunTest(new JPakeUtilitiesTest());
}
[Test]
@@ -48,11 +48,11 @@ namespace Org.BouncyCastle.Crypto.Tests
public void TestValidateGx4()
{
- JPAKEUtil.ValidateGx4(Ten);
+ JPakeUtilities.ValidateGx4(Ten);
try
{
- JPAKEUtil.ValidateGx4(BigInteger.One);
+ JPakeUtilities.ValidateGx4(BigInteger.One);
Fail("exception not thrown for g^x4 equal to 1");
}
@@ -64,11 +64,11 @@ namespace Org.BouncyCastle.Crypto.Tests
public void TestValidateGa()
{
- JPAKEUtil.ValidateGa(Ten);
+ JPakeUtilities.ValidateGa(Ten);
try
{
- JPAKEUtil.ValidateGa(BigInteger.One);
+ JPakeUtilities.ValidateGa(BigInteger.One);
Fail("exception not thrown for g^a equal to 1");
}
@@ -80,12 +80,12 @@ namespace Org.BouncyCastle.Crypto.Tests
public void TestValidateParticipantIdsDiffer()
{
- JPAKEUtil.ValidateParticipantIdsDiffer("a", "b");
- JPAKEUtil.ValidateParticipantIdsDiffer("a", "A");
+ JPakeUtilities.ValidateParticipantIdsDiffer("a", "b");
+ JPakeUtilities.ValidateParticipantIdsDiffer("a", "A");
try
{
- JPAKEUtil.ValidateParticipantIdsDiffer("a", "a");
+ JPakeUtilities.ValidateParticipantIdsDiffer("a", "a");
Fail("validate participant ids differ not throwing exception for equal participant ids");
}
@@ -97,11 +97,11 @@ namespace Org.BouncyCastle.Crypto.Tests
public void TestValidateParticipantsIdsEqual()
{
- JPAKEUtil.ValidateParticipantIdsEqual("a", "a");
+ JPakeUtilities.ValidateParticipantIdsEqual("a", "a");
try
{
- JPAKEUtil.ValidateParticipantIdsEqual("a", "b");
+ JPakeUtilities.ValidateParticipantIdsEqual("a", "b");
Fail("validate participant ids equal not throwing exception for different participant ids");
}
@@ -113,40 +113,40 @@ namespace Org.BouncyCastle.Crypto.Tests
public void TestValidateMacTag()
{
- JPAKEPrimeOrderGroup pg1 = JPAKEPrimeOrderGroups.SUN_JCE_1024;
+ JPakePrimeOrderGroup pg1 = JPakePrimeOrderGroups.SUN_JCE_1024;
SecureRandom random = new SecureRandom();
IDigest digest = new Sha256Digest();
- BigInteger x1 = JPAKEUtil.GenerateX1(pg1.Q, random);
- BigInteger x2 = JPAKEUtil.GenerateX2(pg1.Q, random);
- BigInteger x3 = JPAKEUtil.GenerateX1(pg1.Q, random);
- BigInteger x4 = JPAKEUtil.GenerateX2(pg1.Q, random);
+ BigInteger x1 = JPakeUtilities.GenerateX1(pg1.Q, random);
+ BigInteger x2 = JPakeUtilities.GenerateX2(pg1.Q, random);
+ BigInteger x3 = JPakeUtilities.GenerateX1(pg1.Q, random);
+ BigInteger x4 = JPakeUtilities.GenerateX2(pg1.Q, random);
- BigInteger gx1 = JPAKEUtil.CalculateGx(pg1.P, pg1.G, x1);
- BigInteger gx2 = JPAKEUtil.CalculateGx(pg1.P, pg1.G, x2);
- BigInteger gx3 = JPAKEUtil.CalculateGx(pg1.P, pg1.G, x3);
- BigInteger gx4 = JPAKEUtil.CalculateGx(pg1.P, pg1.G, x4);
+ BigInteger gx1 = JPakeUtilities.CalculateGx(pg1.P, pg1.G, x1);
+ BigInteger gx2 = JPakeUtilities.CalculateGx(pg1.P, pg1.G, x2);
+ BigInteger gx3 = JPakeUtilities.CalculateGx(pg1.P, pg1.G, x3);
+ BigInteger gx4 = JPakeUtilities.CalculateGx(pg1.P, pg1.G, x4);
- BigInteger gB = JPAKEUtil.CalculateGA(pg1.P, gx3, gx1, gx2);
+ BigInteger gB = JPakeUtilities.CalculateGA(pg1.P, gx3, gx1, gx2);
- BigInteger s = JPAKEUtil.CalculateS("password".ToCharArray());
+ BigInteger s = JPakeUtilities.CalculateS("password".ToCharArray());
- BigInteger xs = JPAKEUtil.CalculateX2s(pg1.Q, x4, s);
+ BigInteger xs = JPakeUtilities.CalculateX2s(pg1.Q, x4, s);
- BigInteger B = JPAKEUtil.CalculateA(pg1.P, pg1.Q, gB, xs);
+ BigInteger B = JPakeUtilities.CalculateA(pg1.P, pg1.Q, gB, xs);
- BigInteger keyingMaterial = JPAKEUtil.CalculateKeyingMaterial(pg1.P, pg1.Q, gx4, x2, s, B);
+ BigInteger keyingMaterial = JPakeUtilities.CalculateKeyingMaterial(pg1.P, pg1.Q, gx4, x2, s, B);
- BigInteger macTag = JPAKEUtil.CalculateMacTag("participantId", "partnerParticipantId", gx1, gx2, gx3, gx4, keyingMaterial, digest);
+ BigInteger macTag = JPakeUtilities.CalculateMacTag("participantId", "partnerParticipantId", gx1, gx2, gx3, gx4, keyingMaterial, digest);
// should succeed
- JPAKEUtil.ValidateMacTag("partnerParticipantId", "participantId", gx3, gx4, gx1, gx2, keyingMaterial, digest, macTag);
+ JPakeUtilities.ValidateMacTag("partnerParticipantId", "participantId", gx3, gx4, gx1, gx2, keyingMaterial, digest, macTag);
// validating own macTag (as opposed to the other party's mactag)
try
{
- JPAKEUtil.ValidateMacTag("participantId", "partnerParticipantId", gx1, gx2, gx3, gx4, keyingMaterial, digest, macTag);
+ JPakeUtilities.ValidateMacTag("participantId", "partnerParticipantId", gx1, gx2, gx3, gx4, keyingMaterial, digest, macTag);
Fail("failed to throw exception on validating own macTag (calculated partner macTag)");
}
@@ -158,7 +158,7 @@ namespace Org.BouncyCastle.Crypto.Tests
// participant ids switched
try
{
- JPAKEUtil.ValidateMacTag("participantId", "partnerParticipantId", gx3, gx4, gx1, gx2, keyingMaterial, digest, macTag);
+ JPakeUtilities.ValidateMacTag("participantId", "partnerParticipantId", gx3, gx4, gx1, gx2, keyingMaterial, digest, macTag);
Fail("failed to throw exception on validating own macTag (calculated partner macTag");
}
@@ -170,15 +170,15 @@ namespace Org.BouncyCastle.Crypto.Tests
public void TestValidateNotNull()
{
- JPAKEUtil.ValidateNotNull("a", "description");
+ JPakeUtilities.ValidateNotNull("a", "description");
try
{
- JPAKEUtil.ValidateNotNull(null, "description");
+ JPakeUtilities.ValidateNotNull(null, "description");
Fail("failed to throw exception on null");
}
- catch (NullReferenceException)
+ catch (ArgumentNullException)
{
// expected
}
@@ -186,25 +186,25 @@ namespace Org.BouncyCastle.Crypto.Tests
public void TestValidateZeroKnowledgeProof()
{
- JPAKEPrimeOrderGroup pg1 = JPAKEPrimeOrderGroups.SUN_JCE_1024;
+ JPakePrimeOrderGroup pg1 = JPakePrimeOrderGroups.SUN_JCE_1024;
SecureRandom random = new SecureRandom();
IDigest digest1 = new Sha256Digest();
- BigInteger x1 = JPAKEUtil.GenerateX1(pg1.Q, random);
- BigInteger gx1 = JPAKEUtil.CalculateGx(pg1.P, pg1.G, x1);
+ BigInteger x1 = JPakeUtilities.GenerateX1(pg1.Q, random);
+ BigInteger gx1 = JPakeUtilities.CalculateGx(pg1.P, pg1.G, x1);
string participantId1 = "participant1";
- BigInteger[] zkp1 = JPAKEUtil.CalculateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, gx1, x1, participantId1, digest1, random);
+ BigInteger[] zkp1 = JPakeUtilities.CalculateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, gx1, x1, participantId1, digest1, random);
// should succeed
- JPAKEUtil.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, gx1, zkp1, participantId1, digest1);
+ JPakeUtilities.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, gx1, zkp1, participantId1, digest1);
// wrong group
- JPAKEPrimeOrderGroup pg2 = JPAKEPrimeOrderGroups.NIST_3072;
+ JPakePrimeOrderGroup pg2 = JPakePrimeOrderGroups.NIST_3072;
try
{
- JPAKEUtil.ValidateZeroKnowledgeProof(pg2.P, pg2.Q, pg2.G, gx1, zkp1, participantId1, digest1);
+ JPakeUtilities.ValidateZeroKnowledgeProof(pg2.P, pg2.Q, pg2.G, gx1, zkp1, participantId1, digest1);
Fail("failed to throw exception on wrong prime order group");
}
@@ -217,7 +217,7 @@ namespace Org.BouncyCastle.Crypto.Tests
IDigest digest2 = new Sha1Digest();
try
{
- JPAKEUtil.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, gx1, zkp1, participantId1, digest2);
+ JPakeUtilities.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, gx1, zkp1, participantId1, digest2);
Fail("failed to throw exception on wrong digest");
}
@@ -230,7 +230,7 @@ namespace Org.BouncyCastle.Crypto.Tests
string participantId2 = "participant2";
try
{
- JPAKEUtil.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, gx1, zkp1, participantId2, digest1);
+ JPakeUtilities.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, gx1, zkp1, participantId2, digest1);
Fail("failed to throw exception on wrong participant");
}
@@ -240,11 +240,11 @@ namespace Org.BouncyCastle.Crypto.Tests
}
// wrong gx
- BigInteger x2 = JPAKEUtil.GenerateX2(pg1.Q, random);
- BigInteger gx2 = JPAKEUtil.CalculateGx(pg1.P, pg1.G, x2);
+ BigInteger x2 = JPakeUtilities.GenerateX2(pg1.Q, random);
+ BigInteger gx2 = JPakeUtilities.CalculateGx(pg1.P, pg1.G, x2);
try
{
- JPAKEUtil.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, gx2, zkp1, participantId1, digest1);
+ JPakeUtilities.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, gx2, zkp1, participantId1, digest1);
Fail("failed to throw exception on wrong gx");
}
@@ -254,10 +254,10 @@ namespace Org.BouncyCastle.Crypto.Tests
}
// wrong zkp
- BigInteger[] zkp2 = JPAKEUtil.CalculateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, gx2, x2, participantId1, digest1, random);
+ BigInteger[] zkp2 = JPakeUtilities.CalculateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, gx2, x2, participantId1, digest1, random);
try
{
- JPAKEUtil.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, gx1, zkp2, participantId1, digest1);
+ JPakeUtilities.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, gx1, zkp2, participantId1, digest1);
Fail("failed to throw exception on wrong zero knowledge proof");
}
@@ -269,7 +269,7 @@ namespace Org.BouncyCastle.Crypto.Tests
// gx <= 0
try
{
- JPAKEUtil.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, BigInteger.Zero, zkp1, participantId1, digest1);
+ JPakeUtilities.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, BigInteger.Zero, zkp1, participantId1, digest1);
Fail("failed to throw exception on g^x <= 0");
}
@@ -281,7 +281,7 @@ namespace Org.BouncyCastle.Crypto.Tests
// gx >= p
try
{
- JPAKEUtil.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, pg1.P, zkp1, participantId1, digest1);
+ JPakeUtilities.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, pg1.P, zkp1, participantId1, digest1);
Fail("failed to throw exception on g^x >= p");
}
@@ -293,7 +293,7 @@ namespace Org.BouncyCastle.Crypto.Tests
// gx mod q == 1
try
{
- JPAKEUtil.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, pg1.Q.Add(BigInteger.One), zkp1, participantId1, digest1);
+ JPakeUtilities.ValidateZeroKnowledgeProof(pg1.P, pg1.Q, pg1.G, pg1.Q.Add(BigInteger.One), zkp1, participantId1, digest1);
Fail("failed to throw exception on g^x mod q == 1");
}
|