CryptoAnalysis icon indicating copy to clipboard operation
CryptoAnalysis copied to clipboard

OR-ing of 2 or 3 predicates only works for ENSURE section with non-conditional predicates

Open rakshitkr opened this issue 5 years ago • 2 comments

The below test case verifies the usage of GCMBlockCipher with AEADParameters OR ParametersWithIV. But the test case is failing currently since the ENSURES section in GCMBlockCipher has the conditional predicate generatedGCMBlockCipherMode[this] after Cons;.

@Test
	public void testORingTwoPredicates2() throws GeneralSecurityException, IllegalStateException, InvalidCipherTextException {
		SecureRandom random = new SecureRandom();
		byte[] genSeed = random.generateSeed(128);
		KeyParameter keyParam = new KeyParameter(genSeed);
		byte[] nonce = random.generateSeed(128);
		AEADParameters aeadParam = new AEADParameters(keyParam, 128, nonce);
		Assertions.hasEnsuredPredicate(aeadParam);
		Assertions.mustBeInAcceptingState(aeadParam);
		AESEngine engine = new AESEngine();
		Assertions.hasEnsuredPredicate(engine);
		byte[] input = new byte[100];
		byte[] output = new byte[100];
		
		GCMBlockCipher cipher1 = new GCMBlockCipher(engine);
		cipher1.init(false, aeadParam);
		cipher1.processAADBytes(input, 0, input.length);
		cipher1.doFinal(output, 0);
		Assertions.hasEnsuredPredicate(cipher1);
		Assertions.mustBeInAcceptingState(cipher1);
		
		ParametersWithIV ivParam = new ParametersWithIV(keyParam, genSeed);
		Assertions.hasEnsuredPredicate(ivParam);
		Assertions.mustBeInAcceptingState(ivParam);
		
		GCMBlockCipher cipher2 = new GCMBlockCipher(engine);
		cipher2.init(false, ivParam);
//		cipher2.processAADBytes(input, 0, input.length);
//		cipher2.doFinal(output, 0);
		Assertions.hasEnsuredPredicate(cipher2);
		Assertions.mustNotBeInAcceptingState(cipher2);	
	}

OUTPUT

Expected a predicate for cipher1 (BouncyCastlesUsagePatternTest.testORingTwoPredicates4) @ staticinvoke <test.assertions.Assertions: void hasEnsuredPredicate(java.lang.Object)>(cipher1)
Expected a predicate for cipher2 (BouncyCastlesUsagePatternTest.testORingTwoPredicates4) @ staticinvoke <test.assertions.Assertions: void hasEnsuredPredicate(java.lang.Object)>(cipher2)

However, when this conditional predicate is changed into normal predicate and the method calls in testORingTwoPredicates2 are modified as below, the test case passes. This verifies that the OR operator currently works for rules with non-conditional predicates in ENSURES section

...
		GCMBlockCipher cipher2 = new GCMBlockCipher(engine);
		cipher2.init(false, ivParam);
		cipher2.processAADBytes(input, 0, input.length); // because now `generatedGCMBlockCipherMode` predicate is only generated after `Cons, init, process+, doFinal`
		cipher2.doFinal(output, 0);
		Assertions.hasEnsuredPredicate(cipher2);
		Assertions.mustBeInAcceptingState(cipher2);
...
```	

rakshitkr avatar Feb 03 '20 19:02 rakshitkr

@kruegers I've added test cases for verifying OR-ing predicates in the pull request #214

rakshitkr avatar Feb 03 '20 20:02 rakshitkr

The reason for the above behaviour was because the next method call i.e. init from ORDER section is negating the ensured predicate generatedGCMBlockCipherMode generated after constructor call of GCMBlockCipher. However when the conditional predicate is changed to normal predicate namely generatedGCMBlockCipherMode[this]; then the corresponding predicate is only generated after last method call in ORDER section i.e. doFinal. Since we have Assertions.hasEnsuredPredicate immediately after this method call, both the assertions results to true.

rakshitkr avatar Feb 07 '20 21:02 rakshitkr