Skip to content

Commit

Permalink
Merge remote-tracking branch 'refs/remotes/origin/main'
Browse files Browse the repository at this point in the history
  • Loading branch information
dghgit committed Dec 22, 2023
2 parents db3ae60 + 49c2391 commit b24dcaa
Show file tree
Hide file tree
Showing 7 changed files with 152 additions and 42 deletions.
10 changes: 3 additions & 7 deletions core/src/main/java/org/bouncycastle/asn1/ASN1External.java
Original file line number Diff line number Diff line change
Expand Up @@ -258,13 +258,9 @@ private static ASN1Primitive checkExternalContent(int tagNo, ASN1Primitive exter

private static ASN1Primitive getExternalContent(ASN1TaggedObject encoding)
{
int tagClass = encoding.getTagClass(), tagNo = encoding.getTagNo();
if (BERTags.CONTEXT_SPECIFIC != tagClass)
{
throw new IllegalArgumentException("invalid tag: " + ASN1Util.getTagText(tagClass, tagNo));
}
ASN1Util.checkContextTag(encoding);

switch (tagNo)
switch (encoding.getTagNo())
{
case 0:
return encoding.getExplicitBaseObject().toASN1Primitive();
Expand All @@ -273,7 +269,7 @@ private static ASN1Primitive getExternalContent(ASN1TaggedObject encoding)
case 2:
return ASN1BitString.getInstance(encoding, false);
default:
throw new IllegalArgumentException("invalid tag: " + ASN1Util.getTagText(tagClass, tagNo));
throw new IllegalArgumentException("invalid tag: " + ASN1Util.getTagText(encoding));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public static ASN1ObjectIdentifier getInstance(ASN1TaggedObject taggedObject, bo
*
* - see https://github.com/bcgit/bc-java/issues/1015
*/
if (!explicit && !taggedObject.isParsed() && BERTags.CONTEXT_SPECIFIC == taggedObject.getTagClass())
if (!explicit && !taggedObject.isParsed() && taggedObject.hasContextTag())
{
ASN1Primitive base = taggedObject.getBaseObject().toASN1Primitive();
if (!(base instanceof ASN1ObjectIdentifier))
Expand Down
52 changes: 28 additions & 24 deletions core/src/main/java/org/bouncycastle/asn1/ASN1TaggedObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,49 +51,53 @@ else if (obj instanceof byte[])

public static ASN1TaggedObject getInstance(Object obj, int tagClass)
{
if (obj == null)
{
throw new NullPointerException("'obj' cannot be null");
}
return ASN1Util.checkTagClass(checkInstance(obj), tagClass);
}

ASN1TaggedObject taggedObject = getInstance(obj);
if (tagClass != taggedObject.getTagClass())
{
throw new IllegalArgumentException("unexpected tag in getInstance: " + ASN1Util.getTagText(taggedObject));
}
public static ASN1TaggedObject getInstance(Object obj, int tagClass, int tagNo)
{
return ASN1Util.checkTag(checkInstance(obj), tagClass, tagNo);
}

return taggedObject;
public static ASN1TaggedObject getInstance(ASN1TaggedObject taggedObject, boolean declaredExplicit)
{
return ASN1Util.getExplicitContextBaseTagged(checkInstance(taggedObject, declaredExplicit));
}

public static ASN1TaggedObject getInstance(Object obj, int tagClass, int tagNo)
public static ASN1TaggedObject getInstance(ASN1TaggedObject taggedObject, int tagClass, boolean declaredExplicit)
{
return ASN1Util.getExplicitBaseTagged(checkInstance(taggedObject, declaredExplicit), tagClass);
}

public static ASN1TaggedObject getInstance(ASN1TaggedObject taggedObject, int tagClass, int tagNo,
boolean declaredExplicit)
{
return ASN1Util.getExplicitBaseTagged(checkInstance(taggedObject, declaredExplicit), tagClass, tagNo);
}

private static ASN1TaggedObject checkInstance(Object obj)
{
if (obj == null)
{
throw new NullPointerException("'obj' cannot be null");
}

ASN1TaggedObject taggedObject = getInstance(obj);
if (!taggedObject.hasTag(tagClass, tagNo))
{
throw new IllegalArgumentException("unexpected tag in getInstance: " + ASN1Util.getTagText(taggedObject));
}

return taggedObject;
return getInstance(obj);
}

public static ASN1TaggedObject getInstance(ASN1TaggedObject taggedObject, boolean declaredExplicit)
private static ASN1TaggedObject checkInstance(ASN1TaggedObject taggedObject, boolean declaredExplicit)
{
if (BERTags.CONTEXT_SPECIFIC != taggedObject.getTagClass())
if (!declaredExplicit)
{
throw new IllegalStateException("this method only valid for CONTEXT_SPECIFIC tags");
throw new IllegalArgumentException("this method not valid for implicitly tagged tagged objects");
}

if (declaredExplicit)
if (taggedObject == null)
{
return taggedObject.getExplicitBaseTagged();
throw new NullPointerException("'taggedObject' cannot be null");
}

throw new IllegalArgumentException("this method not valid for implicitly tagged tagged objects");
return taggedObject;
}

final int explicitness;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,7 @@ final ASN1Primitive fromByteArray(byte[] bytes) throws IOException

final ASN1Primitive getContextInstance(ASN1TaggedObject taggedObject, boolean declaredExplicit)
{
if (BERTags.CONTEXT_SPECIFIC != taggedObject.getTagClass())
{
throw new IllegalStateException("this method only valid for CONTEXT_SPECIFIC tags");
}

return checkedCast(taggedObject.getBaseUniversal(declaredExplicit, this));
return checkedCast(ASN1Util.checkContextTag(taggedObject).getBaseUniversal(declaredExplicit, this));
}

final ASN1Tag getTag()
Expand Down
116 changes: 116 additions & 0 deletions core/src/main/java/org/bouncycastle/asn1/ASN1Util.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@

public abstract class ASN1Util
{
static ASN1TaggedObject checkContextTag(ASN1TaggedObject taggedObject)
{
return checkTagClass(taggedObject, BERTags.CONTEXT_SPECIFIC);
}

static ASN1TaggedObjectParser checkContextTag(ASN1TaggedObjectParser taggedObjectParser)
{
return checkTagClass(taggedObjectParser, BERTags.CONTEXT_SPECIFIC);
}

static ASN1TaggedObject checkTag(ASN1TaggedObject taggedObject, int tagClass, int tagNo)
{
if (!taggedObject.hasTag(tagClass, tagNo))
Expand All @@ -26,11 +36,63 @@ static ASN1TaggedObjectParser checkTag(ASN1TaggedObjectParser taggedObjectParser
return taggedObjectParser;
}

static ASN1TaggedObject checkTagClass(ASN1TaggedObject taggedObject, int tagClass)
{
if (!taggedObject.hasTagClass(tagClass))
{
String expected = getTagClassText(tagClass);
String found = getTagClassText(taggedObject);
throw new IllegalStateException("Expected " + expected + " tag but found " + found);
}
return taggedObject;
}

static ASN1TaggedObjectParser checkTagClass(ASN1TaggedObjectParser taggedObjectParser, int tagClass)
{
if (!taggedObjectParser.hasTagClass(tagClass))
{
String expected = getTagClassText(tagClass);
String found = getTagClassText(taggedObjectParser);
throw new IllegalStateException("Expected " + expected + " tag but found " + found);
}
return taggedObjectParser;
}


/*
* Tag text methods
*/

static String getTagClassText(ASN1Tag tag)
{
return getTagClassText(tag.getTagClass());
}

public static String getTagClassText(ASN1TaggedObject taggedObject)
{
return getTagClassText(taggedObject.getTagClass());
}

public static String getTagClassText(ASN1TaggedObjectParser taggedObjectParser)
{
return getTagClassText(taggedObjectParser.getTagClass());
}

public static String getTagClassText(int tagClass)
{
switch (tagClass)
{
case BERTags.APPLICATION:
return "APPLICATION";
case BERTags.CONTEXT_SPECIFIC:
return "CONTEXT";
case BERTags.PRIVATE:
return "PRIVATE";
default:
return "UNIVERSAL";
}
}

static String getTagText(ASN1Tag tag)
{
return getTagText(tag.getTagClass(), tag.getTagNumber());
Expand Down Expand Up @@ -96,16 +158,36 @@ public static ASN1Object tryGetExplicitContextBaseObject(ASN1TaggedObject tagged
* Wrappers for ASN1TaggedObject#getExplicitBaseTagged
*/

public static ASN1TaggedObject getExplicitBaseTagged(ASN1TaggedObject taggedObject, int tagClass)
{
return checkTagClass(taggedObject, tagClass).getExplicitBaseTagged();
}

public static ASN1TaggedObject getExplicitBaseTagged(ASN1TaggedObject taggedObject, int tagClass, int tagNo)
{
return checkTag(taggedObject, tagClass, tagNo).getExplicitBaseTagged();
}

public static ASN1TaggedObject getExplicitContextBaseTagged(ASN1TaggedObject taggedObject)
{
return getExplicitBaseTagged(taggedObject, BERTags.CONTEXT_SPECIFIC);
}

public static ASN1TaggedObject getExplicitContextBaseTagged(ASN1TaggedObject taggedObject, int tagNo)
{
return getExplicitBaseTagged(taggedObject, BERTags.CONTEXT_SPECIFIC, tagNo);
}

public static ASN1TaggedObject tryGetExplicitBaseTagged(ASN1TaggedObject taggedObject, int tagClass)
{
if (!taggedObject.hasTagClass(tagClass))
{
return null;
}

return taggedObject.getExplicitBaseTagged();
}

public static ASN1TaggedObject tryGetExplicitBaseTagged(ASN1TaggedObject taggedObject, int tagClass, int tagNo)
{
if (!taggedObject.hasTag(tagClass, tagNo))
Expand All @@ -116,6 +198,11 @@ public static ASN1TaggedObject tryGetExplicitBaseTagged(ASN1TaggedObject taggedO
return taggedObject.getExplicitBaseTagged();
}

public static ASN1TaggedObject tryGetExplicitContextBaseTagged(ASN1TaggedObject taggedObject)
{
return tryGetExplicitBaseTagged(taggedObject, BERTags.CONTEXT_SPECIFIC);
}

public static ASN1TaggedObject tryGetExplicitContextBaseTagged(ASN1TaggedObject taggedObject, int tagNo)
{
return tryGetExplicitBaseTagged(taggedObject, BERTags.CONTEXT_SPECIFIC, tagNo);
Expand Down Expand Up @@ -194,18 +281,41 @@ public static ASN1Primitive tryGetContextBaseUniversal(ASN1TaggedObject taggedOb
* Wrappers for ASN1TaggedObjectParser#parseExplicitBaseTagged
*/

public static ASN1TaggedObjectParser parseExplicitBaseTagged(ASN1TaggedObjectParser taggedObjectParser,
int tagClass) throws IOException
{
return checkTagClass(taggedObjectParser, tagClass).parseExplicitBaseTagged();
}

public static ASN1TaggedObjectParser parseExplicitBaseTagged(ASN1TaggedObjectParser taggedObjectParser,
int tagClass, int tagNo) throws IOException
{
return checkTag(taggedObjectParser, tagClass, tagNo).parseExplicitBaseTagged();
}

public static ASN1TaggedObjectParser parseExplicitContextBaseTagged(ASN1TaggedObjectParser taggedObjectParser)
throws IOException
{
return parseExplicitBaseTagged(taggedObjectParser, BERTags.CONTEXT_SPECIFIC);
}

public static ASN1TaggedObjectParser parseExplicitContextBaseTagged(ASN1TaggedObjectParser taggedObjectParser,
int tagNo) throws IOException
{
return parseExplicitBaseTagged(taggedObjectParser, BERTags.CONTEXT_SPECIFIC, tagNo);
}

public static ASN1TaggedObjectParser tryParseExplicitBaseTagged(ASN1TaggedObjectParser taggedObjectParser,
int tagClass) throws IOException
{
if (!taggedObjectParser.hasTagClass(tagClass))
{
return null;
}

return taggedObjectParser.parseExplicitBaseTagged();
}

public static ASN1TaggedObjectParser tryParseExplicitBaseTagged(ASN1TaggedObjectParser taggedObjectParser,
int tagClass, int tagNo) throws IOException
{
Expand All @@ -217,6 +327,12 @@ public static ASN1TaggedObjectParser tryParseExplicitBaseTagged(ASN1TaggedObject
return taggedObjectParser.parseExplicitBaseTagged();
}

public static ASN1TaggedObjectParser tryParseExplicitContextBaseTagged(ASN1TaggedObjectParser taggedObjectParser)
throws IOException
{
return tryParseExplicitBaseTagged(taggedObjectParser, BERTags.CONTEXT_SPECIFIC);
}

public static ASN1TaggedObjectParser tryParseExplicitContextBaseTagged(ASN1TaggedObjectParser taggedObjectParser,
int tagNo) throws IOException
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ public void performTest()

ASN1TaggedObject privateSpec = (ASN1TaggedObject)ASN1Primitive.fromByteArray(sampleData);

if (BERTags.PRIVATE != privateSpec.getTagClass() || 1 != privateSpec.getTagNo())
if (!privateSpec.hasTag(BERTags.PRIVATE, 1))
{
fail("wrong tag detected");
}
Expand All @@ -111,7 +111,7 @@ public void performTest()

ASN1TaggedObject certObj = (ASN1TaggedObject)ASN1Primitive.fromByteArray(certData);

if (certObj.isExplicit() || BERTags.PRIVATE != certObj.getTagClass() || 33 != certObj.getTagNo())
if (certObj.isExplicit() || !certObj.hasTag(BERTags.PRIVATE, 33))
{
fail("parsing of certificate data failed");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.pqc.crypto.crystals.dilithium.DilithiumPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.crystals.dilithium.DilithiumPublicKeyParameters;
import org.bouncycastle.pqc.crypto.crystals.kyber.KyberPrivateKeyParameters;
import org.bouncycastle.pqc.crypto.util.PrivateKeyFactory;
import org.bouncycastle.pqc.crypto.util.PrivateKeyInfoFactory;
import org.bouncycastle.pqc.jcajce.interfaces.DilithiumPrivateKey;
Expand Down Expand Up @@ -54,7 +53,7 @@ private void init(DilithiumPrivateKeyParameters params, ASN1Set attributes)
}

/**
* Compare this SPHINCS-256 private key with another object.
* Compare this Dilithium private key with another object.
*
* @param o the other object
* @return the result of the comparison
Expand Down

0 comments on commit b24dcaa

Please sign in to comment.