001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 018 package org.apache.geronimo.crypto.jce.provider; 019 020 import java.io.ByteArrayOutputStream; 021 import java.io.IOException; 022 import java.math.BigInteger; 023 import java.security.interfaces.RSAPublicKey; 024 import java.security.spec.RSAPublicKeySpec; 025 026 import org.apache.geronimo.crypto.asn1.ASN1Sequence; 027 import org.apache.geronimo.crypto.asn1.DERNull; 028 import org.apache.geronimo.crypto.asn1.DEROutputStream; 029 import org.apache.geronimo.crypto.asn1.pkcs.PKCSObjectIdentifiers; 030 import org.apache.geronimo.crypto.asn1.x509.AlgorithmIdentifier; 031 import org.apache.geronimo.crypto.asn1.x509.RSAPublicKeyStructure; 032 import org.apache.geronimo.crypto.asn1.x509.SubjectPublicKeyInfo; 033 import org.apache.geronimo.crypto.crypto.params.RSAKeyParameters; 034 035 public class JCERSAPublicKey 036 implements RSAPublicKey 037 { 038 private BigInteger modulus; 039 private BigInteger publicExponent; 040 041 JCERSAPublicKey( 042 RSAKeyParameters key) 043 { 044 this.modulus = key.getModulus(); 045 this.publicExponent = key.getExponent(); 046 } 047 048 JCERSAPublicKey( 049 RSAPublicKeySpec spec) 050 { 051 this.modulus = spec.getModulus(); 052 this.publicExponent = spec.getPublicExponent(); 053 } 054 055 JCERSAPublicKey( 056 RSAPublicKey key) 057 { 058 this.modulus = key.getModulus(); 059 this.publicExponent = key.getPublicExponent(); 060 } 061 062 JCERSAPublicKey( 063 SubjectPublicKeyInfo info) 064 { 065 try 066 { 067 RSAPublicKeyStructure pubKey = new RSAPublicKeyStructure((ASN1Sequence)info.getPublicKey()); 068 069 this.modulus = pubKey.getModulus(); 070 this.publicExponent = pubKey.getPublicExponent(); 071 } 072 catch (IOException e) 073 { 074 throw new IllegalArgumentException("invalid info structure in RSA public key", e); 075 } 076 } 077 078 /** 079 * return the modulus. 080 * 081 * @return the modulus. 082 */ 083 public BigInteger getModulus() 084 { 085 return modulus; 086 } 087 088 /** 089 * return the public exponent. 090 * 091 * @return the public exponent. 092 */ 093 public BigInteger getPublicExponent() 094 { 095 return publicExponent; 096 } 097 098 public String getAlgorithm() 099 { 100 return "RSA"; 101 } 102 103 public String getFormat() 104 { 105 return "X.509"; 106 } 107 108 public byte[] getEncoded() 109 { 110 ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 111 DEROutputStream dOut = new DEROutputStream(bOut); 112 SubjectPublicKeyInfo info = new SubjectPublicKeyInfo(new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, new DERNull()), new RSAPublicKeyStructure(getModulus(), getPublicExponent()).getDERObject()); 113 114 try 115 { 116 dOut.writeObject(info); 117 dOut.close(); 118 } 119 catch (IOException e) 120 { 121 throw new RuntimeException("Error encoding RSA public key", e); 122 } 123 124 return bOut.toByteArray(); 125 126 } 127 128 public boolean equals(Object o) 129 { 130 if ( !(o instanceof RSAPublicKey) ) 131 { 132 return false; 133 } 134 135 if ( o == this ) 136 { 137 return true; 138 } 139 140 RSAPublicKey key = (RSAPublicKey)o; 141 142 return getModulus().equals(key.getModulus()) 143 && getPublicExponent().equals(key.getPublicExponent()); 144 } 145 146 public String toString() 147 { 148 StringBuffer buf = new StringBuffer(); 149 String nl = System.getProperty("line.separator"); 150 151 buf.append("RSA Public Key" + nl); 152 buf.append(" modulus: " + this.getModulus().toString(16) + nl); 153 buf.append(" public exponent: " + this.getPublicExponent().toString(16) + nl); 154 155 return buf.toString(); 156 } 157 }