/* * * Copyright (c) 2013 - 2017 Lijun Liao * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License version 3 * as published by the Free Software Foundation with the addition of the * following permission added to Section 15 as permitted in Section 7(a): * * FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY * THE AUTHOR LIJUN LIAO. LIJUN LIAO DISCLAIMS THE WARRANTY OF NON INFRINGEMENT * OF THIRD PARTY RIGHTS. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License. * * You can be released from the requirements of the license by purchasing * a commercial license. Buying such a license is mandatory as soon as you * develop commercial activities involving the XiPKI software without * disclosing the source code of your own applications. * * For more information, please contact Lijun Liao at this * address: lijun.liao@gmail.com */ package org.xipki.pki.ca.client.shell.loadtest; import org.bouncycastle.asn1.ASN1ObjectIdentifier; import org.bouncycastle.asn1.DERUTF8String; import org.bouncycastle.asn1.x500.RDN; import org.bouncycastle.asn1.x500.X500Name; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; import org.xipki.commons.common.util.ParamUtil; import org.xipki.commons.security.ObjectIdentifiers; import org.xipki.commons.security.util.X509Util; /** * @author Lijun Liao * @since 2.0.0 */ public class LoadTestEntry { public enum RandomDn { GIVENNAME, SURNAME, STREET, POSTALCODE, O, OU, CN; public static RandomDn getInstance(final String text) { ParamUtil.requireNonNull("text", text); for (RandomDn value : values()) { if (value.name().equalsIgnoreCase(text)) { return value; } } return null; } } // enum RandomDN private static class IncreasableSubject { private final X500Name subjectTemplate; private final ASN1ObjectIdentifier subjectRdnForIncrement; private IncreasableSubject(final String subjectTemplate, final RandomDn randomDn) { ParamUtil.requireNonBlank("subjectTemplate", subjectTemplate); ParamUtil.requireNonNull("randomDn", randomDn); this.subjectTemplate = new X500Name(subjectTemplate); switch (randomDn) { case GIVENNAME: this.subjectRdnForIncrement = ObjectIdentifiers.DN_GIVENNAME; break; case SURNAME: this.subjectRdnForIncrement = ObjectIdentifiers.DN_SURNAME; break; case STREET: this.subjectRdnForIncrement = ObjectIdentifiers.DN_STREET; break; case POSTALCODE: this.subjectRdnForIncrement = ObjectIdentifiers.DN_POSTAL_CODE; break; case O: this.subjectRdnForIncrement = ObjectIdentifiers.DN_O; break; case OU: this.subjectRdnForIncrement = ObjectIdentifiers.DN_OU; break; case CN: this.subjectRdnForIncrement = ObjectIdentifiers.DN_CN; break; default: throw new RuntimeException("should not reach here, unknown randomDn " + randomDn); } if (this.subjectRdnForIncrement != null && this.subjectTemplate.getRDNs(this.subjectRdnForIncrement).length == 0) { throw new IllegalArgumentException("subjectTemplate does not contain DN field " + ObjectIdentifiers.oidToDisplayName(this.subjectRdnForIncrement)); } } private X500Name getX500Name(final long index) { RDN[] baseRdns = subjectTemplate.getRDNs(); final int n = baseRdns.length; RDN[] newRdns = new RDN[n]; boolean incremented = false; for (int i = 0; i < n; i++) { RDN rdn = baseRdns[i]; if (!incremented) { if (rdn.getFirst().getType().equals(subjectRdnForIncrement)) { String text = X509Util.rdnValueToString(rdn.getFirst().getValue()); rdn = new RDN(subjectRdnForIncrement, new DERUTF8String(text + index)); incremented = true; } } newRdns[i] = rdn; } return new X500Name(newRdns); } } // class IncreasableSubject private final String certprofile; private final KeyEntry keyEntry; private final IncreasableSubject subject; public LoadTestEntry(final String certprofile, final KeyEntry keyEntry, final String subjectTemplate, final RandomDn randomDn) { this.certprofile = ParamUtil.requireNonBlank("certprofile", certprofile); this.keyEntry = ParamUtil.requireNonNull("keyEntry", keyEntry); this.subject = new IncreasableSubject(subjectTemplate, randomDn); } public SubjectPublicKeyInfo getSubjectPublicKeyInfo() { return keyEntry.getSubjectPublicKeyInfo(); } public X500Name getX500Name(final long index) { return subject.getX500Name(index); } public String getCertprofile() { return certprofile; } }