diff options
Diffstat (limited to 'core/src/main/java/org/bouncycastle/asn1/eac/RSAPublicKey.java')
-rw-r--r-- | core/src/main/java/org/bouncycastle/asn1/eac/RSAPublicKey.java | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/core/src/main/java/org/bouncycastle/asn1/eac/RSAPublicKey.java b/core/src/main/java/org/bouncycastle/asn1/eac/RSAPublicKey.java new file mode 100644 index 00000000..7c851699 --- /dev/null +++ b/core/src/main/java/org/bouncycastle/asn1/eac/RSAPublicKey.java @@ -0,0 +1,121 @@ +package org.bouncycastle.asn1.eac; + +import java.math.BigInteger; +import java.util.Enumeration; + +import org.bouncycastle.asn1.ASN1EncodableVector; +import org.bouncycastle.asn1.ASN1ObjectIdentifier; +import org.bouncycastle.asn1.ASN1Primitive; +import org.bouncycastle.asn1.ASN1Sequence; +import org.bouncycastle.asn1.DERSequence; + + +/** + * an Iso7816RSAPublicKeyStructure structure. + * <p/> + * <pre> + * Certificate Holder Authorization ::= SEQUENCE { + * // modulus should be at least 1024bit and a multiple of 512. + * DERTaggedObject modulus, + * // access rights exponent + * DERTaggedObject accessRights, + * } + * </pre> + */ +public class RSAPublicKey + extends PublicKeyDataObject +{ + private ASN1ObjectIdentifier usage; + private BigInteger modulus; + private BigInteger exponent; + private int valid = 0; + private static int modulusValid = 0x01; + private static int exponentValid = 0x02; + + RSAPublicKey(ASN1Sequence seq) + { + Enumeration en = seq.getObjects(); + + this.usage = ASN1ObjectIdentifier.getInstance(en.nextElement()); + + while (en.hasMoreElements()) + { + UnsignedInteger val = UnsignedInteger.getInstance(en.nextElement()); + + switch (val.getTagNo()) + { + case 0x1: + setModulus(val); + break; + case 0x2: + setExponent(val); + break; + default: + throw new IllegalArgumentException("Unknown DERTaggedObject :" + val.getTagNo() + "-> not an Iso7816RSAPublicKeyStructure"); + } + } + if (valid != 0x3) + { + throw new IllegalArgumentException("missing argument -> not an Iso7816RSAPublicKeyStructure"); + } + } + + public RSAPublicKey(ASN1ObjectIdentifier usage, BigInteger modulus, BigInteger exponent) + { + this.usage = usage; + this.modulus = modulus; + this.exponent = exponent; + } + + public ASN1ObjectIdentifier getUsage() + { + return usage; + } + + public BigInteger getModulus() + { + return modulus; + } + + public BigInteger getPublicExponent() + { + return exponent; + } + + private void setModulus(UnsignedInteger modulus) + { + if ((valid & modulusValid) == 0) + { + valid |= modulusValid; + this.modulus = modulus.getValue(); + } + else + { + throw new IllegalArgumentException("Modulus already set"); + } + } + + private void setExponent(UnsignedInteger exponent) + { + if ((valid & exponentValid) == 0) + { + valid |= exponentValid; + this.exponent = exponent.getValue(); + } + else + { + throw new IllegalArgumentException("Exponent already set"); + } + } + + public ASN1Primitive toASN1Primitive() + { + ASN1EncodableVector v = new ASN1EncodableVector(); + + v.add(usage); + v.add(new UnsignedInteger(0x01, getModulus())); + v.add(new UnsignedInteger(0x02, getPublicExponent())); + + return new DERSequence(v); + } +} |