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: /**
019: * @author Alexander Y. Kleymenov
020: * @version $Revision$
021: */package org.apache.harmony.security.x509;
022:
023: import java.util.Arrays;
024:
025: import org.apache.harmony.security.asn1.ASN1Any;
026: import org.apache.harmony.security.asn1.ASN1Oid;
027: import org.apache.harmony.security.asn1.ASN1Sequence;
028: import org.apache.harmony.security.asn1.ASN1Type;
029: import org.apache.harmony.security.asn1.BerInputStream;
030: import org.apache.harmony.security.asn1.ObjectIdentifier;
031: import org.apache.harmony.security.utils.AlgNameMapper;
032:
033: /**
034: * The class encapsulates the ASN.1 DER encoding/decoding work
035: * with the Algorithm Identifier which is a part of X.509 certificate
036: * (as specified in RFC 3280 -
037: * Internet X.509 Public Key Infrastructure.
038: * Certificate and Certificate Revocation List (CRL) Profile.
039: * http://www.ietf.org/rfc/rfc3280.txt):
040: *
041: * <pre>
042: * AlgorithmIdentifier ::= SEQUENCE {
043: * algorithm OBJECT IDENTIFIER,
044: * parameters ANY DEFINED BY algorithm OPTIONAL
045: * }
046: * </pre>
047: */
048: public class AlgorithmIdentifier {
049:
050: // the value of algorithm field
051: private String algorithm;
052: // the name of the algorithm
053: private String algorithmName;
054: // the value of parameters field
055: private byte[] parameters;
056: // the encoding of AlgorithmIdentifier value
057: private byte[] encoding;
058:
059: /**
060: * TODO
061: * @param algorithm: String
062: */
063: public AlgorithmIdentifier(String algorithm) {
064: this (algorithm, null, null);
065: }
066:
067: /**
068: * TODO
069: * @param algorithm: String
070: * @param parameters: byte[]
071: */
072: public AlgorithmIdentifier(String algorithm, byte[] parameters) {
073: this (algorithm, parameters, null);
074: }
075:
076: //
077: // TODO
078: // @param algorithm: String
079: // @param parameters: byte[]
080: // @param encoding: byte[]
081: //
082: private AlgorithmIdentifier(String algorithm, byte[] parameters,
083: byte[] encoding) {
084: this .algorithm = algorithm;
085: this .parameters = parameters;
086: this .encoding = encoding;
087: }
088:
089: /**
090: * Returns the value of algorithm field of the structure.
091: * @return algorithm
092: */
093: public String getAlgorithm() {
094: return algorithm;
095: }
096:
097: /**
098: * Returns the name of the algorithm corresponding to
099: * its OID. If there is no the such correspondence,
100: * algorithm OID is returned.
101: * @return algorithm
102: */
103: public String getAlgorithmName() {
104: if (algorithmName == null) {
105: algorithmName = AlgNameMapper.map2AlgName(algorithm);
106: if (algorithmName == null) {
107: algorithmName = algorithm;
108: }
109: }
110: return algorithmName;
111: }
112:
113: /**
114: * Returns the value of parameters field of the structure.
115: * @return parameters
116: */
117: public byte[] getParameters() {
118: return parameters;
119: }
120:
121: /**
122: * Returns ASN.1 encoded form of this X.509 AlgorithmIdentifier value.
123: * @return a byte array containing ASN.1 encode form.
124: */
125: public byte[] getEncoded() {
126: if (encoding == null) {
127: encoding = ASN1.encode(this );
128: }
129: return encoding;
130: }
131:
132: public boolean equals(Object ai) {
133: if (!(ai instanceof AlgorithmIdentifier)) {
134: return false;
135: }
136: AlgorithmIdentifier algid = (AlgorithmIdentifier) ai;
137: return (algorithm.equals(algid.algorithm))
138: && ((parameters == null) ? algid.parameters == null
139: : Arrays.equals(parameters, algid.parameters));
140: }
141:
142: public int hashCode() {
143: return algorithm.hashCode() * 37
144: + (parameters != null ? parameters.hashCode() : 0);
145: }
146:
147: /**
148: * Places the string representation into the StringBuffer object.
149: */
150: public void dumpValue(StringBuffer buffer) {
151: buffer.append(getAlgorithmName());
152: if (parameters == null) {
153: buffer.append(", no params, "); //$NON-NLS-1$
154: } else {
155: buffer.append(", params unparsed, "); //$NON-NLS-1$
156: }
157: buffer.append("OID = "); //$NON-NLS-1$
158: buffer.append(getAlgorithm());
159: }
160:
161: /**
162: * Custom AlgorithmIdentifier DER encoder/decoder
163: */
164: public static final ASN1Sequence ASN1 = new ASN1Sequence(
165: new ASN1Type[] { ASN1Oid.getInstance(),
166: ASN1Any.getInstance() }) {
167: {
168: setOptional(1); // parameters are optional
169: }
170:
171: protected Object getDecodedObject(BerInputStream in) {
172: Object[] values = (Object[]) in.content;
173: return new AlgorithmIdentifier(ObjectIdentifier
174: .toString((int[]) values[0]), (byte[]) values[1]);
175: }
176:
177: protected void getValues(Object object, Object[] values) {
178:
179: AlgorithmIdentifier aID = (AlgorithmIdentifier) object;
180:
181: values[0] = ObjectIdentifier.toIntArray(aID.getAlgorithm());
182: values[1] = aID.getParameters();
183: }
184: };
185:
186: }
|