diff options
Diffstat (limited to 'src/main')
5 files changed, 79 insertions, 536 deletions
diff --git a/src/main/java/org/uic/barcode/Decoder.java b/src/main/java/org/uic/barcode/Decoder.java index 85faa4a..637bbf6 100644 --- a/src/main/java/org/uic/barcode/Decoder.java +++ b/src/main/java/org/uic/barcode/Decoder.java @@ -84,15 +84,22 @@ public class Decoder { * @throws EncodingFormatException the encoding format exception
*/
public int validateLevel1(PublicKey key) throws InvalidKeyException, NoSuchAlgorithmException, SignatureException, IllegalArgumentException, UnsupportedOperationException, IOException, EncodingFormatException {
- if (dynamicFrame != null && dynamicFrame != null) {
+ if (dynamicFrame != null) {
return dynamicFrame.validateLevel1(key) ;
- } else {
- if (staticFrame != null) {
- return Constants.LEVEL1_VALIDATION_SIG_ALG_NOT_IMPLEMENTED;
+ } else if (staticFrame != null) {
+ if (staticFrame.verifyByAlgorithmOid(key,null)) {
+ return Constants.LEVEL1_VALIDATION_OK;
+ } else {
+ return Constants.LEVEL1_VALIDATION_FRAUD;
+ }
+ } else if (ssbFrame!= null) {
+ if (ssbFrame.verifyByAlgorithmOid(key,null, null)) {
+ return Constants.LEVEL1_VALIDATION_OK;
} else {
return Constants.LEVEL1_VALIDATION_FRAUD;
}
}
+ return Constants.LEVEL1_VALIDATION_NO_SIGNATURE;
}
/**
diff --git a/src/main/java/org/uic/barcode/ssbFrame/SsbFrame.java b/src/main/java/org/uic/barcode/ssbFrame/SsbFrame.java index b473c1e..2c8f66f 100644 --- a/src/main/java/org/uic/barcode/ssbFrame/SsbFrame.java +++ b/src/main/java/org/uic/barcode/ssbFrame/SsbFrame.java @@ -1,6 +1,5 @@ package org.uic.barcode.ssbFrame; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.math.BigInteger; import java.security.InvalidKeyException; @@ -14,7 +13,6 @@ import java.security.SignatureException; import java.security.Provider.Service; import java.util.Arrays; - import org.uic.barcode.ticket.EncodingFormatException; import org.uic.barcode.utils.AlgorithmNameResolver; import org.uic.barcode.utils.SecurityUtils; @@ -83,7 +81,7 @@ public class SsbFrame { try { //check for non-standard signature encoding BigInteger[] bInts = SecurityUtils.decodeSignatureIntegerSequence(signatureBytes); - byte[] sig = SecurityUtils.encodeSignatureIntegerSequence(bInts[0],bInts[1]); + SecurityUtils.encodeSignatureIntegerSequence(bInts[0],bInts[1]); signaturePart1 = bInts[0].toByteArray(); signaturePart2 = bInts[1].toByteArray(); //decoding the entire signature was ok, so there was no split @@ -334,8 +332,20 @@ public class SsbFrame { //find the algorithm name for the signature OID String algo = null; + + BigInteger r = new BigInteger(1,signaturePart1); + BigInteger s = new BigInteger(1,signaturePart2); + byte[] signature = SecurityUtils.encodeSignatureIntegerSequence(r,s); + + String signatureAlgorithmOid = signingAlg; + + // guess the signature algorithm based on the signature size + if ((signingAlg == null || signingAlg.length() < 1) && signature != null) { + signatureAlgorithmOid = SecurityUtils.getDsaAlgorithm(signature); + } + if (prov != null) { - Service service = prov.getService("Signature",signingAlg); + Service service = prov.getService("Signature",signatureAlgorithmOid); if (service != null) { algo = service.getAlgorithm(); } @@ -343,7 +353,7 @@ public class SsbFrame { Provider[] provs = Security.getProviders(); for (Provider p : provs) { if (algo == null) { - Service service = p.getService("Signature",signingAlg); + Service service = p.getService("Signature",signatureAlgorithmOid); if (service != null) { algo = service.getAlgorithm(); } @@ -359,11 +369,6 @@ public class SsbFrame { sig.initVerify(key); sig.update(getDataForSignature()); - BigInteger r = new BigInteger(1,signaturePart1); - BigInteger s = new BigInteger(1,signaturePart2); - - byte[] signature = SecurityUtils.encodeSignatureIntegerSequence(r,s); - return sig.verify(signature); } diff --git a/src/main/java/org/uic/barcode/staticFrame/StaticFrame.java b/src/main/java/org/uic/barcode/staticFrame/StaticFrame.java index 8dc1adb..25649df 100644 --- a/src/main/java/org/uic/barcode/staticFrame/StaticFrame.java +++ b/src/main/java/org/uic/barcode/staticFrame/StaticFrame.java @@ -19,7 +19,9 @@ import java.util.zip.DataFormatException; import java.util.zip.Deflater;
import java.util.zip.Inflater;
+import org.uic.barcode.dynamicFrame.Constants;
import org.uic.barcode.ticket.EncodingFormatException;
+import org.uic.barcode.utils.SecurityUtils;
/**
@@ -660,11 +662,20 @@ public class StaticFrame { * @throws IOException
*/
public boolean verifyByAlgorithmOid(PublicKey key, String signingAlg) throws InvalidKeyException, NoSuchAlgorithmException, SignatureException, IllegalArgumentException, UnsupportedOperationException, IOException, EncodingFormatException {
+
+ String signatureAlgorithmOid = signingAlg;
+
+
+ // guess the signature algorithm based on the signature size
+ if ((signingAlg == null || signingAlg.length() < 1) && this.getSignature() != null) {
+ signatureAlgorithmOid = SecurityUtils.getDsaAlgorithm(this.getSignature());
+ }
+
//find the algorithm name for the signature OID
String algo = null;
Provider[] provs = Security.getProviders();
for (Provider prov : provs) {
- Service service = prov.getService("Signature",signingAlg);
+ Service service = prov.getService("Signature",signatureAlgorithmOid);
if (service != null) {
algo = service.getAlgorithm();
}
@@ -776,7 +787,8 @@ public class StaticFrame { if (algo == null) {
throw new NoSuchAlgorithmException("No service for algorthm found: " + signingAlg);
}
- Signature sig = Signature.getInstance(algo);
+ Signature sig = Signature.getInstance(algo,prov);
+
sig.initSign(key);
signedData = getDataForSignature();
sig.update(signedData);
diff --git a/src/main/java/org/uic/barcode/ticket/api/test/testtickets/OpenLuggageRestrictionTestTicketV3.java b/src/main/java/org/uic/barcode/ticket/api/test/testtickets/OpenLuggageRestrictionTestTicketV3.java deleted file mode 100644 index f14acfa..0000000 --- a/src/main/java/org/uic/barcode/ticket/api/test/testtickets/OpenLuggageRestrictionTestTicketV3.java +++ /dev/null @@ -1,518 +0,0 @@ -/*
- * This file was generated by openASN.1 - an open source ASN.1 toolkit for java
- *
- * openASN.1 is Copyright (C) 2007 Clayton Hoss, Marc Weyland
- *
- * openASN.1 is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation, either version 3 of
- * the License, or (at your option) any later version.
- *
- * openASN.1 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with openASN.1. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-package org.uic.barcode.ticket.api.test.testtickets;
-
-import org.uic.barcode.asn1.datatypesimpl.SequenceOfStringUTF8;
-import org.uic.barcode.asn1.datatypesimpl.SequenceOfUnrestrictedLong;
-import org.uic.barcode.ticket.api.asn.omv3.CardReferenceType;
-import org.uic.barcode.ticket.api.asn.omv3.ControlData;
-import org.uic.barcode.ticket.api.asn.omv3.CustomerStatusType;
-import org.uic.barcode.ticket.api.asn.omv3.DocumentData;
-import org.uic.barcode.ticket.api.asn.omv3.ExtensionData;
-import org.uic.barcode.ticket.api.asn.omv3.IncludedOpenTicketType;
-import org.uic.barcode.ticket.api.asn.omv3.IssuingData;
-import org.uic.barcode.ticket.api.asn.omv3.LinkMode;
-import org.uic.barcode.ticket.api.asn.omv3.OpenTicketData;
-import org.uic.barcode.ticket.api.asn.omv3.PassengerType;
-import org.uic.barcode.ticket.api.asn.omv3.RegionalValidityType;
-import org.uic.barcode.ticket.api.asn.omv3.RegisteredLuggageType;
-import org.uic.barcode.ticket.api.asn.omv3.RouteSectionType;
-import org.uic.barcode.ticket.api.asn.omv3.SequenceOfCardReferenceType;
-import org.uic.barcode.ticket.api.asn.omv3.SequenceOfCustomerStatusType;
-import org.uic.barcode.ticket.api.asn.omv3.SequenceOfDocumentData;
-import org.uic.barcode.ticket.api.asn.omv3.SequenceOfExtensionData;
-import org.uic.barcode.ticket.api.asn.omv3.SequenceOfIncludedOpenTicketType;
-import org.uic.barcode.ticket.api.asn.omv3.SequenceOfRegionalValidityType;
-import org.uic.barcode.ticket.api.asn.omv3.SequenceOfRegisteredLuggageType;
-import org.uic.barcode.ticket.api.asn.omv3.SequenceOfTariffType;
-import org.uic.barcode.ticket.api.asn.omv3.SequenceOfTicketLinkType;
-import org.uic.barcode.ticket.api.asn.omv3.SequenceOfTravelerType;
-import org.uic.barcode.ticket.api.asn.omv3.SequenceOfVatDetail;
-import org.uic.barcode.ticket.api.asn.omv3.StationPassageData;
-import org.uic.barcode.ticket.api.asn.omv3.TariffType;
-import org.uic.barcode.ticket.api.asn.omv3.TicketDetailData;
-import org.uic.barcode.ticket.api.asn.omv3.TicketLinkType;
-import org.uic.barcode.ticket.api.asn.omv3.TicketType;
-import org.uic.barcode.ticket.api.asn.omv3.TokenType;
-import org.uic.barcode.ticket.api.asn.omv3.TravelClassType;
-import org.uic.barcode.ticket.api.asn.omv3.TravelerData;
-import org.uic.barcode.ticket.api.asn.omv3.TravelerType;
-import org.uic.barcode.ticket.api.asn.omv3.UicRailTicketData;
-import org.uic.barcode.ticket.api.asn.omv3.VatDetailType;
-import org.uic.barcode.ticket.api.asn.omv3.ZoneType;
-import org.uic.barcode.ticket.api.asn.omv3.LuggageRestrictionType;
-
- public class OpenLuggageRestrictionTestTicketV3 {
-
- public static UicRailTicketData getUicTestTicket() {
- UicRailTicketData ticket = new UicRailTicketData();
- populateTicket(ticket);
- return ticket;
- }
-
- /*
-value UicRailTicketData ::= {
- issuingDetail {
- issuingYear 2018,
- issuingDay 1,
- issuingTime 600,
- specimen TRUE,
- securePaperTicket FALSE,
- activated TRUE,
- currency "EUR",
- currencyFract 2,
- issuerPNR "issuerTestPNR",
- issuedOnLine 12
- },
- travelerDetail {
- traveler {
- {
- firstName "John",
- secondName "Dow",
- idCard "12345",
- ticketHolder TRUE,
- status {
- {
- customerStatusDescr "senior"
- }
- }
- }
- },
- groupName "myGroup"
- },
- transportDocument {
- {
- token {
- tokenProviderIA5 "VDV",
- token '82DA'H
- },
- ticket openTicket : {
- returnIncluded FALSE,
- stationCodeTable stationUIC,
- validFromDay 0,
- validUntilDay 0,
- classCode first,
- vatDetail {
- {
- country 80,
- percentage 70,
- amount 10,
- vatId "IUDGTE"
- }
- },
- infoText "openTicketInfo",
- includedAddOns {
- {
- productOwnerNum 1080,
- stationCodeTable stationUIC,
- validRegion {
- zones : {
- stationCodeTable stationUIC,
- zoneId {
- 100
- }
- }
- },
- validFromDay 0,
- validFromTime 1000,
- validUntilDay 1,
- validUntilTime 1000,
- classCode second,
- tariffs {
- {
- numberOfPassengers 2,
- passengerType adult,
- restrictedToCountryOfResidence FALSE,
- restrictedToRouteSection {
- stationCodeTable stationUIC,
- fromStationNum 8000001,
- toStationNum 8010000
- }
- }
- },
- infoText "included ticket"
- }
- },
- luggage {
- maxHandLuggagePieces 2,
- maxNonHandLuggagePieces 1,
- registeredLuggage {
- {
- registrationId "IODHUV",
- maxWeight 20,
- maxSize 100
- },
- {
- registrationId "XXDHUV",
- maxWeight 21,
- maxSize 101
- }
- }
- }
- }
- },
- {
- ticket stationPassage : {
- productName "passage",
- stationCodeTable stationUIC,
- stationNameUTF8 {
- "Amsterdam"
- },
- validFromDay 0,
- validUntilDay 0,
- numberOfDaysValid 123
- }
- }
- },
- controlDetail {
- identificationByCardReference {
- {
- trailingCardIdNum 100
- }
- },
- identificationByIdCard FALSE,
- identificationByPassportId FALSE,
- passportValidationRequired FALSE,
- onlineValidationRequired FALSE,
- ageCheckRequired FALSE,
- reductionCardCheckRequired FALSE,
- infoText "cd",
- includedTickets {
- {
- referenceIA5 "UED12435867",
- issuerName "OEBB",
- issuerPNR "PNR",
- productOwnerIA5 "test",
- ticketType pass,
- linkMode onlyValidInCombination
- }
- }
- },
- extension {
- {
- extensionId "1",
- extensionData '82DA'H
- },
- {
- extensionId "2",
- extensionData '83DA'H
- }
- }
-}
-
- */
-
-
-
- public static String getEncodingHex() {
- return
- "7804404004B14374F3E7D72F2A9979F4A13A90086280B4001044A6F686"
- + "E03446F770562C99B46B01106E797769DFC81DB5E51DC9BDD5C00940"
- + "75A2560282DA1000000101E0101C4F11804281A4D5891EA450E6F706"
- + "56E5469636B6574496E666F0140AD06021B8090020080B23E8013E81"
- + "00B10008143D09003D1C8787B4B731B63AB232B2103A34B1B5B2BA28"
- + "202706933E248AB58998DC1AC588922AD62864120220103B830B9B9B"
- + "0B3B28084A0B6B9BA32B93230B696F017B4C0200805900026364015B"
- + "85D58B118B268CDAB86CDC113D1509080E84EA409D32F3E850201620"
- + "505B402C80A0F680";
-
- }
-
-
-
- private static void populateTicket(UicRailTicketData ticket) {
-
- ticket.setControlDetail(new ControlData());
- populate(ticket.getControlDetail());
-
-
- ticket.setIssuingDetail(new IssuingData());
- populateIssuingData(ticket.getIssuingDetail());
-
- TravelerData td = new TravelerData();
- populateTravelerData(td);
- ticket.setTravelerDetail(td);
-
- SequenceOfDocumentData ds = new SequenceOfDocumentData();
-
-
- //OpenTicket
- DocumentData do1 = new DocumentData();
- addOpenTicketData(do1);
- ds.add(do1);
-
- //StationPassage
- DocumentData do2 = new DocumentData();
- addStationPassage(do2);
- ds.add(do2);
-
- ticket.setTransportDocument(ds);
-
- SequenceOfExtensionData ed = new SequenceOfExtensionData();
- populateExtensionSequence(ed);
- ticket.setExtension(ed);
-
- }
-
- private static void addStationPassage(DocumentData dd) {
- TicketDetailData tdd = new TicketDetailData();
- StationPassageData sp = new StationPassageData();
- sp.setProductName("passage");
- sp.setValidFromDay(0L);
- sp.setNumberOfDaysValid(123L);
- SequenceOfStringUTF8 ss = new SequenceOfStringUTF8();
- ss.add("Amsterdam");
- sp.setStationNameUTF8(ss);
- tdd.setStationPassage(sp);
- dd.setTicket(tdd);
- }
-
- /*
- *
- * returnIncluded FALSE
- ,classCode first
- ,vatDetail {
- { country 80
- ,percentage 70
- ,amount 10
- ,vatId "IUDGTE"
- }
- }
- ,infoText "openTicketInfo"
- */
- private static void addOpenTicketData(DocumentData dd) {
- TokenType to = new TokenType();
- to.setTokenProviderIA5("VDV");
- byte[] ba = { (byte) 0x82, (byte) 0xDA };
- to.setToken(ba);
- dd.setToken(to);
-
- TicketDetailData tdd = new TicketDetailData();
- OpenTicketData otd = new OpenTicketData();
- otd.setInfoText("openTicketInfo");
- otd.setClassCode(TravelClassType.first);
- otd.setReturnIncluded(false);
-
- otd.setIncludedAddOns(new SequenceOfIncludedOpenTicketType());
- otd.getIncludedAddOns().add(getIncludedOpenTicket());
-
- otd.setVatDetails(new SequenceOfVatDetail());
- otd.getVatDetails().add(getVatDetail());
-
- otd.setLuggage(getLuggage());
-
- tdd.setOpenTicket(otd);
- dd.setTicket(tdd);
-
- }
-
- private static LuggageRestrictionType getLuggage() {
- LuggageRestrictionType l = new LuggageRestrictionType();
- l.setMaxHandLuggagePieces(2L);
- l.setMaxNonHandLuggagePieces(1L);
- l.setRegisteredLuggage(getRegisteredLuggage());
- return l;
- }
-
- private static SequenceOfRegisteredLuggageType getRegisteredLuggage() {
- SequenceOfRegisteredLuggageType sl = new SequenceOfRegisteredLuggageType();
- sl.add(getRegisteredLuggage1());
- sl.add(getRegisteredLuggage2());
- return sl;
- }
-
- private static RegisteredLuggageType getRegisteredLuggage1() {
- RegisteredLuggageType rl = new RegisteredLuggageType();
- rl.setMaxSize(100L);
- rl.setMaxWeight(20L);
- rl.setRegistrationId("IODHUV");
- return rl;
- }
-
- private static RegisteredLuggageType getRegisteredLuggage2() {
- RegisteredLuggageType rl = new RegisteredLuggageType();
- rl.setMaxSize(101L);
- rl.setMaxWeight(21L);
- rl.setRegistrationId("XXDHUV");
- return rl;
- }
-
- private static VatDetailType getVatDetail() {
- VatDetailType v = new VatDetailType();
- v.setAmount(10L);
- v.setCountry(80L);
- v.setPercentage(70L);
- v.setVatId("IUDGTE");
- return v;
- }
-
- /*
- { productOwnerNum 1080
- ,validRegion { zones : { zoneId { 100 } } }
- ,validFromDay 0
- ,validFromTime 1000
- ,validUntilDay 1
- ,validUntilTime 1000
- ,classCode second
- ,tariffs {
- { numberOfPassengers 2
- ,passengerType adult
- ,restrictedToCountryOfResidence FALSE
- ,restrictedToRouteSection { fromStationNum 8000001 , toStationNum 8010000 }
- }
- }
- ,infoText "included ticket"
- }
- */
-
- private static IncludedOpenTicketType getIncludedOpenTicket() {
- IncludedOpenTicketType t = new IncludedOpenTicketType();
- t.setClassCode(TravelClassType.second);
- t.setInfoText("included ticket");
- t.setProductOwnerNum(1080L);
- t.setValidRegion(new SequenceOfRegionalValidityType());
- t.getValidRegion().add(getZone());
- t.setValidFromDay(0L);
- t.setValidFromTime(1000L);
- t.setValidUntilDay(1L);
- t.setValidUntilTime(1000L);
- t.setTariffs(new SequenceOfTariffType());
- t.getTariffs().add(getTariff());
- return t;
- }
-
-
-
-
- private static RegionalValidityType getZone() {
-
- RegionalValidityType r = new RegionalValidityType();
- ZoneType z = new ZoneType();
- z.setZoneId(new SequenceOfUnrestrictedLong());
- z.getZoneId().add(100L);
- r.setZones(z);
- return r;
- }
-
- private static void populateTravelerData(TravelerData td) {
- td.setGroupName("myGroup");
- SequenceOfTravelerType trs = new SequenceOfTravelerType();
- TravelerType tr = new TravelerType();
- tr.setIdCard("12345");
- tr.setFirstName("John");
- tr.setSecondName("Dow");
- tr.setTicketHolder(true);
- SequenceOfCustomerStatusType ts = new SequenceOfCustomerStatusType();
- CustomerStatusType cst = new CustomerStatusType();
- cst.setCustomerStatusDescr("senior");
- ts.add(cst);
- tr.setStatus(ts);
- trs.add(tr);
- td.setTraveler(trs);
- }
-
-/*
-
- */
- private static void populateIssuingData(IssuingData issuingDetail) {
- issuingDetail.setIssuingYear(2018L);
- issuingDetail.setIssuingDay(1L);
- issuingDetail.setIssuingTime(600L);
- issuingDetail.setIssuerPNR("issuerTestPNR");
- issuingDetail.setSpecimen(true);
- issuingDetail.setSecurePaperTicket(false);
- issuingDetail.setActivated(true);
- issuingDetail.setIssuedOnLine(12L);
- }
-
-
- private static void populateExtensionSequence(SequenceOfExtensionData ed) {
- ExtensionData ed1 = new ExtensionData();
- ed1.setExtensionId("1");
- byte[] ba1 = { (byte) 0x82, (byte) 0xDA };
- ed1.setExtensionData(ba1);
- ExtensionData ed2 = new ExtensionData();
- ed2.setExtensionId("2");
- byte[] ba2 = { (byte) 0x83, (byte) 0xDA };
- ed2.setExtensionData(ba2);
- ed.add(ed1);
- ed.add(ed2);
- }
-
-
- private static void populate(ControlData controlDetail) {
- controlDetail.infoText = "cd";
- controlDetail.setAgeCheckRequired(false);
- controlDetail.setIdentificationByIdCard(false);
- controlDetail.setIdentificationByPassportId(false);
- controlDetail.setOnlineValidationRequired(false);
- controlDetail.setPassportValidationRequired(false);
- controlDetail.setReductionCardCheckRequired(false);
- controlDetail.setIdentificationByCardReference(new SequenceOfCardReferenceType());
- controlDetail.getIdentificationByCardReference().add(populateCardRefrence());
- SequenceOfTicketLinkType sit = new SequenceOfTicketLinkType();
- populateLinkedTickets(sit);
- controlDetail.setIncludedTickets(sit);
- }
-
-
- /*
- *
- */
- private static void populateLinkedTickets(SequenceOfTicketLinkType sequenceOfTicketLinkType) {
- TicketLinkType tlt = new TicketLinkType();
- tlt.productOwnerIA5="test";
- tlt.setTicketType(TicketType.pass);
- tlt.setIssuerPNR("PNR");
- tlt.setReferenceIA5("UED12435867");
- tlt.setLinkMode(LinkMode.onlyValidInCombination);
- tlt.setIssuerName("OEBB");
- sequenceOfTicketLinkType.add(tlt);
- }
-
- /*
- {
- trailingCardIdNum 100
- }
- */
- private static CardReferenceType populateCardRefrence() {
- CardReferenceType cr = new CardReferenceType();
- cr.setTrailingCardIdNum(100L);
- return cr;
- }
-
- private static TariffType getTariff() {
- TariffType t = new TariffType();
- t.setNumberOfPassengers(2L);
- t.setPassengerType(PassengerType.adult);
- t.setRestrictedToRouteSection(getRouteSection());
- t.setRestrictedToCountryOfResidence(false);
- return t;
- }
-
- private static RouteSectionType getRouteSection() {
- RouteSectionType r = new RouteSectionType();
- r.setFromStationNum(8000001L);
- r.setToStationNum(8010000L);
-
- return r;
- }
-
- }
diff --git a/src/main/java/org/uic/barcode/utils/SecurityUtils.java b/src/main/java/org/uic/barcode/utils/SecurityUtils.java index 8c981af..8f19e4b 100644 --- a/src/main/java/org/uic/barcode/utils/SecurityUtils.java +++ b/src/main/java/org/uic/barcode/utils/SecurityUtils.java @@ -15,6 +15,8 @@ import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;
+import org.uic.barcode.dynamicFrame.Constants;
+
/**
* The Class SecurityUtils.
*/
@@ -23,8 +25,8 @@ public class SecurityUtils { /**
* Find provider by public key.
*
- * @param algorithmOid the algorithm oid used to generate the key
- * @param keyBytes the encoded bytes of the public key
+ * @param keyAlgorithmOid the key algorithm oid
+ * @param keyBytes the encoded bytes of the public key
* @return the provider
*/
public static Provider findPublicKeyProvider(String keyAlgorithmOid, byte[] keyBytes) {
@@ -263,6 +265,13 @@ public class SecurityUtils { return out.toByteArray();
}
+ /**
+ * Recombine dsa signature.
+ *
+ * @param sealdata the sealdata
+ * @return the byte[]
+ * @throws IOException Signals that an I/O exception has occurred.
+ */
public static byte[] recombineDsaSignature(byte[] sealdata) throws IOException {
//check whether the encoding is wrong and the sealdata contain a signature
@@ -311,4 +320,32 @@ public class SecurityUtils { return out.toByteArray();
}
+
+ /**
+ * Gets the dsa algorithm allowed for ssb or static frame.
+ *
+ * @param bs the size of the signature
+ * @return the dsa algorithm OID
+ */
+ public static String getDsaAlgorithm(byte[] bs) {
+
+ BigInteger[] bInts = null;
+ int size = 0;
+ try {
+ bInts = decodeSignatureIntegerSequence(bs);
+ int sizeR = bInts[0].bitLength();
+ int sizeS = bInts[1].bitLength();
+ size = Math.max(sizeR,sizeS);
+ } catch (Exception e) {
+ return null;
+ }
+
+ if (size > 224) {
+ return Constants.DSA_SHA256;
+ } else if (size > 160) {
+ return Constants.DSA_SHA224;
+ } else {
+ return Constants.DSA_SHA1;
+ }
+ }
}
|