mirrored from https://www.bouncycastle.org/repositories/bc-java
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
minor typos, Java 1.3 fixes from 1.79 branch
- Loading branch information
Showing
16 changed files
with
1,473 additions
and
136 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
109 changes: 109 additions & 0 deletions
109
core/src/main/jdk1.3/org/bouncycastle/util/io/pem/PemReader.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
package org.bouncycastle.util.io.pem; | ||
|
||
import java.io.BufferedReader; | ||
import java.io.IOException; | ||
import java.io.Reader; | ||
import java.util.ArrayList; | ||
import java.util.List; | ||
//import java.util.logging.Level; | ||
//import java.util.logging.Logger; | ||
|
||
import org.bouncycastle.util.encoders.Base64; | ||
|
||
/** | ||
* A generic PEM reader, based on the format outlined in RFC 1421 | ||
*/ | ||
public class PemReader | ||
extends BufferedReader | ||
{ | ||
public static final String LAX_PEM_PARSING_SYSTEM_PROPERTY_NAME = "org.bouncycastle.pemreader.lax"; | ||
|
||
private static final String BEGIN = "-----BEGIN "; | ||
private static final String END = "-----END "; | ||
//private static final Logger LOG = Logger.getLogger(PemReader.class.getName()); | ||
|
||
public PemReader(Reader reader) | ||
{ | ||
super(reader); | ||
} | ||
|
||
/** | ||
* Read the next PEM object as a blob of raw data with header information. | ||
* | ||
* @return the next object in the stream, null if no objects left. | ||
* @throws IOException in case of a parse error. | ||
*/ | ||
public PemObject readPemObject() | ||
throws IOException | ||
{ | ||
String line = readLine(); | ||
|
||
while (line != null && !line.startsWith(BEGIN)) | ||
{ | ||
line = readLine(); | ||
} | ||
|
||
if (line != null) | ||
{ | ||
line = line.substring(BEGIN.length()).trim(); | ||
int index = line.indexOf('-'); | ||
|
||
if (index > 0 && line.endsWith("-----") && (line.length() - index) == 5) | ||
{ | ||
String type = line.substring(0, index); | ||
|
||
return loadObject(type); | ||
} | ||
} | ||
|
||
return null; | ||
} | ||
|
||
private PemObject loadObject(String type) | ||
throws IOException | ||
{ | ||
String line; | ||
String endMarker = END + type + "-----"; | ||
StringBuffer buf = new StringBuffer(); | ||
List headers = new ArrayList(); | ||
|
||
while ((line = readLine()) != null) | ||
{ | ||
int index = line.indexOf(':'); | ||
if (index >= 0) | ||
{ | ||
String hdr = line.substring(0, index); | ||
String value = line.substring(index + 1).trim(); | ||
|
||
headers.add(new PemHeader(hdr, value)); | ||
|
||
continue; | ||
} | ||
|
||
if (System.getProperty(LAX_PEM_PARSING_SYSTEM_PROPERTY_NAME, "false").equalsIgnoreCase("true")) | ||
{ | ||
String trimmedLine = line.trim(); | ||
//if (!trimmedLine.equals(line) && LOG.isLoggable(Level.WARNING)) | ||
//{ | ||
//LOG.log(Level.WARNING, "PEM object contains whitespaces on -----END line", new Exception("trace")); | ||
//} | ||
line = trimmedLine; | ||
} | ||
|
||
if (line.indexOf(endMarker) == 0) | ||
{ | ||
break; | ||
} | ||
|
||
buf.append(line.trim()); | ||
} | ||
|
||
if (line == null) | ||
{ | ||
throw new IOException(endMarker + " not found"); | ||
} | ||
|
||
return new PemObject(type, headers, Base64.decode(buf.toString())); | ||
} | ||
|
||
} |
188 changes: 188 additions & 0 deletions
188
core/src/test/jdk1.3/org/bouncycastle/crypto/test/CipherTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,188 @@ | ||
package org.bouncycastle.crypto.test; | ||
|
||
import java.security.SecureRandom; | ||
|
||
import org.bouncycastle.crypto.BlockCipher; | ||
import org.bouncycastle.crypto.CipherKeyGenerator; | ||
import org.bouncycastle.crypto.DataLengthException; | ||
import org.bouncycastle.crypto.InvalidCipherTextException; | ||
import org.bouncycastle.crypto.KeyGenerationParameters; | ||
import org.bouncycastle.crypto.modes.AEADCipher; | ||
import org.bouncycastle.crypto.params.KeyParameter; | ||
import org.bouncycastle.crypto.params.ParametersWithIV; | ||
import org.bouncycastle.util.Arrays; | ||
import org.bouncycastle.util.test.SimpleTest; | ||
|
||
public abstract class CipherTest | ||
extends SimpleTest | ||
{ | ||
private SimpleTest[] _tests; | ||
private BlockCipher _engine; | ||
private KeyParameter _validKey; | ||
|
||
// protected CipherTest( | ||
// SimpleTest[] tests) | ||
// { | ||
// _tests = tests; | ||
// } | ||
|
||
protected CipherTest( | ||
SimpleTest[] tests, | ||
BlockCipher engine, | ||
KeyParameter validKey) | ||
{ | ||
_tests = tests; | ||
_engine = engine; | ||
_validKey = validKey; | ||
} | ||
|
||
public abstract String getName(); | ||
|
||
public void performTest() | ||
throws Exception | ||
{ | ||
for (int i = 0; i != _tests.length; i++) | ||
{ | ||
_tests[i].performTest(); | ||
} | ||
|
||
if (_engine != null) | ||
{ | ||
// | ||
// state tests | ||
// | ||
byte[] buf = new byte[128]; | ||
|
||
try | ||
{ | ||
_engine.processBlock(buf, 0, buf, 0); | ||
|
||
fail("failed initialisation check"); | ||
} | ||
catch (IllegalStateException e) | ||
{ | ||
// expected | ||
} | ||
|
||
bufferSizeCheck((_engine)); | ||
} | ||
} | ||
|
||
private void bufferSizeCheck( | ||
BlockCipher engine) | ||
{ | ||
byte[] correctBuf = new byte[engine.getBlockSize()]; | ||
byte[] shortBuf = new byte[correctBuf.length / 2]; | ||
|
||
engine.init(true, _validKey); | ||
|
||
try | ||
{ | ||
engine.processBlock(shortBuf, 0, correctBuf, 0); | ||
|
||
fail("failed short input check"); | ||
} | ||
catch (DataLengthException e) | ||
{ | ||
// expected | ||
} | ||
|
||
try | ||
{ | ||
engine.processBlock(correctBuf, 0, shortBuf, 0); | ||
|
||
fail("failed short output check"); | ||
} | ||
catch (DataLengthException e) | ||
{ | ||
// expected | ||
} | ||
|
||
engine.init(false, _validKey); | ||
|
||
try | ||
{ | ||
engine.processBlock(shortBuf, 0, correctBuf, 0); | ||
|
||
fail("failed short input check"); | ||
} | ||
catch (DataLengthException e) | ||
{ | ||
// expected | ||
} | ||
|
||
try | ||
{ | ||
engine.processBlock(correctBuf, 0, shortBuf, 0); | ||
|
||
fail("failed short output check"); | ||
} | ||
catch (DataLengthException e) | ||
{ | ||
// expected | ||
} | ||
} | ||
|
||
interface Instace | ||
{ | ||
AEADCipher CreateInstace(); | ||
} | ||
|
||
static void checkCipher(int aeadLen, int ivLen, int msgLen, Instace instace) | ||
{ | ||
AEADCipher pCipher = instace.CreateInstace(); | ||
|
||
try | ||
{ | ||
/* Obtain some random data */ | ||
final byte[] myData = new byte[msgLen]; | ||
final SecureRandom myRandom = new SecureRandom(); | ||
myRandom.nextBytes(myData); | ||
|
||
/* Obtain some random AEAD */ | ||
final byte[] myAEAD = new byte[aeadLen]; | ||
myRandom.nextBytes(myAEAD); | ||
|
||
/* Create the Key parameters */ | ||
final CipherKeyGenerator myGenerator = new CipherKeyGenerator(); | ||
final KeyGenerationParameters myGenParams = new KeyGenerationParameters(myRandom, 128); | ||
myGenerator.init(myGenParams); | ||
final byte[] myKey = myGenerator.generateKey(); | ||
final KeyParameter myKeyParams = new KeyParameter(myKey); | ||
|
||
/* Create the nonce */ | ||
final byte[] myNonce = new byte[ivLen]; | ||
myRandom.nextBytes(myNonce); | ||
final ParametersWithIV myParams = new ParametersWithIV(myKeyParams, myNonce); | ||
|
||
/* Initialise the cipher for encryption */ | ||
pCipher.init(true, myParams); | ||
final int myMaxOutLen = pCipher.getOutputSize(msgLen); | ||
final byte[] myEncrypted = new byte[myMaxOutLen]; | ||
pCipher.processAADBytes(myAEAD, 0, aeadLen); | ||
int myOutLen = pCipher.processBytes(myData, 0, msgLen, myEncrypted, 0); | ||
myOutLen += pCipher.doFinal(myEncrypted, myOutLen); | ||
|
||
/* Note that myOutLen is too large by DATALEN */ | ||
pCipher = instace.CreateInstace(); | ||
/* Initialise the cipher for decryption */ | ||
pCipher.init(false, myParams); | ||
final int myMaxClearLen = pCipher.getOutputSize(myOutLen); | ||
final byte[] myDecrypted = new byte[myMaxClearLen]; | ||
pCipher.processAADBytes(myAEAD, 0, aeadLen); | ||
int myClearLen = pCipher.processBytes(myEncrypted, 0, myEncrypted.length, myDecrypted, 0); | ||
myClearLen += pCipher.doFinal(myDecrypted, myClearLen); | ||
final byte[] myResult = Arrays.copyOf(myDecrypted, msgLen); | ||
|
||
/* Check that we have the same result */ | ||
if (!Arrays.areEqual(myData, myResult)) | ||
{ | ||
System.out.println("Cipher " + pCipher.getAlgorithmName() + " failed"); | ||
} | ||
} | ||
catch (InvalidCipherTextException e) | ||
{ | ||
throw new RuntimeException(e.toString()); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.