197 lines
11 KiB
Java
197 lines
11 KiB
Java
|
package org.bouncycastle.crypto.examples;
|
||
|
|
||
|
import com.airbnb.deeplinkdispatch.UrlTreeKt;
|
||
|
import java.io.PrintStream;
|
||
|
import java.math.BigInteger;
|
||
|
import java.security.SecureRandom;
|
||
|
import org.bouncycastle.crypto.CryptoException;
|
||
|
import org.bouncycastle.crypto.agreement.jpake.JPAKEParticipant;
|
||
|
import org.bouncycastle.crypto.agreement.jpake.JPAKEPrimeOrderGroup;
|
||
|
import org.bouncycastle.crypto.agreement.jpake.JPAKEPrimeOrderGroups;
|
||
|
import org.bouncycastle.crypto.agreement.jpake.JPAKERound1Payload;
|
||
|
import org.bouncycastle.crypto.agreement.jpake.JPAKERound2Payload;
|
||
|
import org.bouncycastle.crypto.agreement.jpake.JPAKERound3Payload;
|
||
|
import org.bouncycastle.crypto.digests.SHA256Digest;
|
||
|
|
||
|
/* loaded from: classes6.dex */
|
||
|
public class JPAKEExample {
|
||
|
public static void main(String[] strArr) throws CryptoException {
|
||
|
JPAKEPrimeOrderGroup jPAKEPrimeOrderGroup = JPAKEPrimeOrderGroups.NIST_3072;
|
||
|
BigInteger p = jPAKEPrimeOrderGroup.getP();
|
||
|
BigInteger q = jPAKEPrimeOrderGroup.getQ();
|
||
|
BigInteger g = jPAKEPrimeOrderGroup.getG();
|
||
|
System.out.println("********* Initialization **********");
|
||
|
System.out.println("Public parameters for the cyclic group:");
|
||
|
PrintStream printStream = System.out;
|
||
|
StringBuilder sb = new StringBuilder("p (");
|
||
|
sb.append(p.bitLength());
|
||
|
sb.append(" bits): ");
|
||
|
sb.append(p.toString(16));
|
||
|
printStream.println(sb.toString());
|
||
|
PrintStream printStream2 = System.out;
|
||
|
StringBuilder sb2 = new StringBuilder("q (");
|
||
|
sb2.append(q.bitLength());
|
||
|
sb2.append(" bits): ");
|
||
|
sb2.append(q.toString(16));
|
||
|
printStream2.println(sb2.toString());
|
||
|
PrintStream printStream3 = System.out;
|
||
|
StringBuilder sb3 = new StringBuilder("g (");
|
||
|
sb3.append(p.bitLength());
|
||
|
sb3.append(" bits): ");
|
||
|
sb3.append(g.toString(16));
|
||
|
printStream3.println(sb3.toString());
|
||
|
PrintStream printStream4 = System.out;
|
||
|
StringBuilder sb4 = new StringBuilder("p mod q = ");
|
||
|
sb4.append(p.mod(q).toString(16));
|
||
|
printStream4.println(sb4.toString());
|
||
|
PrintStream printStream5 = System.out;
|
||
|
StringBuilder sb5 = new StringBuilder("g^{q} mod p = ");
|
||
|
sb5.append(g.modPow(q, p).toString(16));
|
||
|
printStream5.println(sb5.toString());
|
||
|
System.out.println("");
|
||
|
System.out.println("(Secret passwords used by Alice and Bob: \"password\" and \"password\")\n");
|
||
|
SHA256Digest sHA256Digest = new SHA256Digest();
|
||
|
SecureRandom secureRandom = new SecureRandom();
|
||
|
JPAKEParticipant jPAKEParticipant = new JPAKEParticipant("alice", "password".toCharArray(), jPAKEPrimeOrderGroup, sHA256Digest, secureRandom);
|
||
|
JPAKEParticipant jPAKEParticipant2 = new JPAKEParticipant("bob", "password".toCharArray(), jPAKEPrimeOrderGroup, sHA256Digest, secureRandom);
|
||
|
JPAKERound1Payload createRound1PayloadToSend = jPAKEParticipant.createRound1PayloadToSend();
|
||
|
JPAKERound1Payload createRound1PayloadToSend2 = jPAKEParticipant2.createRound1PayloadToSend();
|
||
|
System.out.println("************ Round 1 **************");
|
||
|
System.out.println("Alice sends to Bob: ");
|
||
|
PrintStream printStream6 = System.out;
|
||
|
StringBuilder sb6 = new StringBuilder("g^{x1}=");
|
||
|
sb6.append(createRound1PayloadToSend.getGx1().toString(16));
|
||
|
printStream6.println(sb6.toString());
|
||
|
PrintStream printStream7 = System.out;
|
||
|
StringBuilder sb7 = new StringBuilder("g^{x2}=");
|
||
|
sb7.append(createRound1PayloadToSend.getGx2().toString(16));
|
||
|
printStream7.println(sb7.toString());
|
||
|
PrintStream printStream8 = System.out;
|
||
|
StringBuilder sb8 = new StringBuilder("KP{x1}={");
|
||
|
sb8.append(createRound1PayloadToSend.getKnowledgeProofForX1()[0].toString(16));
|
||
|
sb8.append("};{");
|
||
|
sb8.append(createRound1PayloadToSend.getKnowledgeProofForX1()[1].toString(16));
|
||
|
sb8.append(UrlTreeKt.componentParamSuffix);
|
||
|
printStream8.println(sb8.toString());
|
||
|
PrintStream printStream9 = System.out;
|
||
|
StringBuilder sb9 = new StringBuilder("KP{x2}={");
|
||
|
sb9.append(createRound1PayloadToSend.getKnowledgeProofForX2()[0].toString(16));
|
||
|
sb9.append("};{");
|
||
|
sb9.append(createRound1PayloadToSend.getKnowledgeProofForX2()[1].toString(16));
|
||
|
sb9.append(UrlTreeKt.componentParamSuffix);
|
||
|
printStream9.println(sb9.toString());
|
||
|
System.out.println("");
|
||
|
System.out.println("Bob sends to Alice: ");
|
||
|
PrintStream printStream10 = System.out;
|
||
|
StringBuilder sb10 = new StringBuilder("g^{x3}=");
|
||
|
sb10.append(createRound1PayloadToSend2.getGx1().toString(16));
|
||
|
printStream10.println(sb10.toString());
|
||
|
PrintStream printStream11 = System.out;
|
||
|
StringBuilder sb11 = new StringBuilder("g^{x4}=");
|
||
|
sb11.append(createRound1PayloadToSend2.getGx2().toString(16));
|
||
|
printStream11.println(sb11.toString());
|
||
|
PrintStream printStream12 = System.out;
|
||
|
StringBuilder sb12 = new StringBuilder("KP{x3}={");
|
||
|
sb12.append(createRound1PayloadToSend2.getKnowledgeProofForX1()[0].toString(16));
|
||
|
sb12.append("};{");
|
||
|
sb12.append(createRound1PayloadToSend2.getKnowledgeProofForX1()[1].toString(16));
|
||
|
sb12.append(UrlTreeKt.componentParamSuffix);
|
||
|
printStream12.println(sb12.toString());
|
||
|
PrintStream printStream13 = System.out;
|
||
|
StringBuilder sb13 = new StringBuilder("KP{x4}={");
|
||
|
sb13.append(createRound1PayloadToSend2.getKnowledgeProofForX2()[0].toString(16));
|
||
|
sb13.append("};{");
|
||
|
sb13.append(createRound1PayloadToSend2.getKnowledgeProofForX2()[1].toString(16));
|
||
|
sb13.append(UrlTreeKt.componentParamSuffix);
|
||
|
printStream13.println(sb13.toString());
|
||
|
System.out.println("");
|
||
|
jPAKEParticipant.validateRound1PayloadReceived(createRound1PayloadToSend2);
|
||
|
System.out.println("Alice checks g^{x4}!=1: OK");
|
||
|
System.out.println("Alice checks KP{x3}: OK");
|
||
|
System.out.println("Alice checks KP{x4}: OK");
|
||
|
System.out.println("");
|
||
|
jPAKEParticipant2.validateRound1PayloadReceived(createRound1PayloadToSend);
|
||
|
System.out.println("Bob checks g^{x2}!=1: OK");
|
||
|
System.out.println("Bob checks KP{x1},: OK");
|
||
|
System.out.println("Bob checks KP{x2},: OK");
|
||
|
System.out.println("");
|
||
|
JPAKERound2Payload createRound2PayloadToSend = jPAKEParticipant.createRound2PayloadToSend();
|
||
|
JPAKERound2Payload createRound2PayloadToSend2 = jPAKEParticipant2.createRound2PayloadToSend();
|
||
|
System.out.println("************ Round 2 **************");
|
||
|
System.out.println("Alice sends to Bob: ");
|
||
|
PrintStream printStream14 = System.out;
|
||
|
StringBuilder sb14 = new StringBuilder("A=");
|
||
|
sb14.append(createRound2PayloadToSend.getA().toString(16));
|
||
|
printStream14.println(sb14.toString());
|
||
|
PrintStream printStream15 = System.out;
|
||
|
StringBuilder sb15 = new StringBuilder("KP{x2*s}={");
|
||
|
sb15.append(createRound2PayloadToSend.getKnowledgeProofForX2s()[0].toString(16));
|
||
|
sb15.append("},{");
|
||
|
sb15.append(createRound2PayloadToSend.getKnowledgeProofForX2s()[1].toString(16));
|
||
|
sb15.append(UrlTreeKt.componentParamSuffix);
|
||
|
printStream15.println(sb15.toString());
|
||
|
System.out.println("");
|
||
|
System.out.println("Bob sends to Alice");
|
||
|
PrintStream printStream16 = System.out;
|
||
|
StringBuilder sb16 = new StringBuilder("B=");
|
||
|
sb16.append(createRound2PayloadToSend2.getA().toString(16));
|
||
|
printStream16.println(sb16.toString());
|
||
|
PrintStream printStream17 = System.out;
|
||
|
StringBuilder sb17 = new StringBuilder("KP{x4*s}={");
|
||
|
sb17.append(createRound2PayloadToSend2.getKnowledgeProofForX2s()[0].toString(16));
|
||
|
sb17.append("},{");
|
||
|
sb17.append(createRound2PayloadToSend2.getKnowledgeProofForX2s()[1].toString(16));
|
||
|
sb17.append(UrlTreeKt.componentParamSuffix);
|
||
|
printStream17.println(sb17.toString());
|
||
|
System.out.println("");
|
||
|
jPAKEParticipant.validateRound2PayloadReceived(createRound2PayloadToSend2);
|
||
|
System.out.println("Alice checks KP{x4*s}: OK\n");
|
||
|
jPAKEParticipant2.validateRound2PayloadReceived(createRound2PayloadToSend);
|
||
|
System.out.println("Bob checks KP{x2*s}: OK\n");
|
||
|
BigInteger calculateKeyingMaterial = jPAKEParticipant.calculateKeyingMaterial();
|
||
|
BigInteger calculateKeyingMaterial2 = jPAKEParticipant2.calculateKeyingMaterial();
|
||
|
System.out.println("********* After round 2 ***********");
|
||
|
PrintStream printStream18 = System.out;
|
||
|
StringBuilder sb18 = new StringBuilder("Alice computes key material \t K=");
|
||
|
sb18.append(calculateKeyingMaterial.toString(16));
|
||
|
printStream18.println(sb18.toString());
|
||
|
PrintStream printStream19 = System.out;
|
||
|
StringBuilder sb19 = new StringBuilder("Bob computes key material \t K=");
|
||
|
sb19.append(calculateKeyingMaterial2.toString(16));
|
||
|
printStream19.println(sb19.toString());
|
||
|
System.out.println();
|
||
|
deriveSessionKey(calculateKeyingMaterial);
|
||
|
deriveSessionKey(calculateKeyingMaterial2);
|
||
|
JPAKERound3Payload createRound3PayloadToSend = jPAKEParticipant.createRound3PayloadToSend(calculateKeyingMaterial);
|
||
|
JPAKERound3Payload createRound3PayloadToSend2 = jPAKEParticipant2.createRound3PayloadToSend(calculateKeyingMaterial2);
|
||
|
System.out.println("************ Round 3 **************");
|
||
|
System.out.println("Alice sends to Bob: ");
|
||
|
PrintStream printStream20 = System.out;
|
||
|
StringBuilder sb20 = new StringBuilder("MacTag=");
|
||
|
sb20.append(createRound3PayloadToSend.getMacTag().toString(16));
|
||
|
printStream20.println(sb20.toString());
|
||
|
System.out.println("");
|
||
|
System.out.println("Bob sends to Alice: ");
|
||
|
PrintStream printStream21 = System.out;
|
||
|
StringBuilder sb21 = new StringBuilder("MacTag=");
|
||
|
sb21.append(createRound3PayloadToSend2.getMacTag().toString(16));
|
||
|
printStream21.println(sb21.toString());
|
||
|
System.out.println("");
|
||
|
jPAKEParticipant.validateRound3PayloadReceived(createRound3PayloadToSend2, calculateKeyingMaterial);
|
||
|
System.out.println("Alice checks MacTag: OK\n");
|
||
|
jPAKEParticipant2.validateRound3PayloadReceived(createRound3PayloadToSend, calculateKeyingMaterial2);
|
||
|
System.out.println("Bob checks MacTag: OK\n");
|
||
|
System.out.println();
|
||
|
System.out.println("MacTags validated, therefore the keying material matches.");
|
||
|
}
|
||
|
|
||
|
private static BigInteger deriveSessionKey(BigInteger bigInteger) {
|
||
|
SHA256Digest sHA256Digest = new SHA256Digest();
|
||
|
byte[] byteArray = bigInteger.toByteArray();
|
||
|
byte[] bArr = new byte[sHA256Digest.getDigestSize()];
|
||
|
sHA256Digest.update(byteArray, 0, byteArray.length);
|
||
|
sHA256Digest.doFinal(bArr, 0);
|
||
|
return new BigInteger(bArr);
|
||
|
}
|
||
|
}
|