]> WPIA git - gigi.git/commitdiff
Merge "fix: spelling"
authorBenny Baumann <BenBE1987@gmx.net>
Wed, 17 Jan 2018 08:33:53 +0000 (09:33 +0100)
committerGerrit Code Review <gigi-system@dogcraft.de>
Wed, 17 Jan 2018 08:33:53 +0000 (09:33 +0100)
17 files changed:
src/club/wpia/gigi/Gigi.java
src/club/wpia/gigi/api/APIPoint.java
src/club/wpia/gigi/api/CATSResolve.java
src/club/wpia/gigi/api/FindAgent.java
src/club/wpia/gigi/api/RevokeCertificate.java
src/club/wpia/gigi/dbObjects/Certificate.java
src/club/wpia/gigi/dbObjects/CertificateOwner.java
src/club/wpia/gigi/ocsp/OCSPIssuer.java
src/club/wpia/gigi/pages/LoginPage.java
src/club/wpia/gigi/pages/account/certs/CertificateModificationForm.java
src/club/wpia/gigi/pages/account/certs/Certificates.java
src/club/wpia/gigi/pages/main/KeyCompromiseForm.java
src/club/wpia/gigi/ping/SSLPinger.java
tests/club/wpia/gigi/TestCertificate.java
tests/club/wpia/gigi/dbObjects/TestSerialNormalization.java [new file with mode: 0644]
tests/club/wpia/gigi/pages/account/TestCertificateAdd.java
tests/club/wpia/gigi/pages/main/KeyCompromiseTest.java

index 00993b52aa06fa889cc4185207ca87778479a2a2..de3a5d0fa19f3d928a07d83babd492783da200e9 100644 (file)
@@ -3,6 +3,7 @@ package club.wpia.gigi;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.UnsupportedEncodingException;
+import java.math.BigInteger;
 import java.security.KeyStore;
 import java.security.cert.X509Certificate;
 import java.util.Calendar;
@@ -357,11 +358,11 @@ public final class Gigi extends HttpServlet {
             return;
         }
         HttpSession hs = req.getSession();
-        String clientSerial = (String) hs.getAttribute(CERT_SERIAL);
+        BigInteger clientSerial = (BigInteger) hs.getAttribute(CERT_SERIAL);
         if (clientSerial != null) {
             X509Certificate[] cert = (X509Certificate[]) req.getAttribute("javax.servlet.request.X509Certificate");
             if (cert == null || cert[0] == null//
-                    || !cert[0].getSerialNumber().toString(16).toLowerCase().equals(clientSerial) //
+                    || !cert[0].getSerialNumber().equals(clientSerial) //
                     || !cert[0].getIssuerDN().equals(hs.getAttribute(CERT_ISSUER))) {
                 hs.invalidate();
                 resp.sendError(403, "Certificate mismatch.");
index 737426a733fa8bf7d22cc21f267e3911bd509693..f089e84ec9bcc3b916c9b575515f70b7ca6353cb 100644 (file)
@@ -1,6 +1,7 @@
 package club.wpia.gigi.api;
 
 import java.io.IOException;
+import java.math.BigInteger;
 import java.security.cert.X509Certificate;
 
 import javax.servlet.http.HttpServletRequest;
@@ -19,7 +20,7 @@ public abstract class APIPoint {
             resp.sendError(403, "Error, cert authing required. No cert found.");
             return;
         }
-        String serial = LoginPage.extractSerialFormCert(cert);
+        BigInteger serial = LoginPage.extractSerialFormCert(cert);
         Certificate clientCert = Certificate.getBySerial(serial);
         CertificateOwner u = CertificateOwner.getByEnabledSerial(serial);
         if (u == null || clientCert == null) {
index f326fb4e45c2fd4efb09be45dc3b1e758910ee50..51165d1c3f34d69d0afbd83adcdd17354a756d6e 100644 (file)
@@ -1,10 +1,12 @@
 package club.wpia.gigi.api;
 
 import java.io.IOException;
+import java.math.BigInteger;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import club.wpia.gigi.GigiApiException;
 import club.wpia.gigi.dbObjects.Certificate;
 import club.wpia.gigi.dbObjects.CertificateOwner;
 import club.wpia.gigi.dbObjects.Organisation;
@@ -22,13 +24,19 @@ public class CATSResolve extends CATSRestrictedApi {
             resp.sendError(500, "Error, requires a serial parameter");
             return;
         }
-        target = target.toLowerCase();
-        Certificate clientCert = Certificate.getBySerial(target);
+        BigInteger targetSerial;
+        try {
+            targetSerial = Certificate.normalizeSerial(target);
+        } catch (GigiApiException e) {
+            resp.sendError(500, "Error, requires valid serial");
+            return;
+        }
+        Certificate clientCert = Certificate.getBySerial(targetSerial);
         if (clientCert == null) {
             resp.sendError(500, "Error, requires valid serial");
             return;
         }
-        CertificateOwner o = CertificateOwner.getByEnabledSerial(target);
+        CertificateOwner o = CertificateOwner.getByEnabledSerial(targetSerial);
         if (o instanceof Organisation) {
             Organisation org = (Organisation) o;
             if (org.isSelfOrganisation()) {
index 5ebf15ab8e23e6c082b073301c340da2540f6bdc..d37ccbb73b0455cc7d4da87a02d1f3407b6e7112 100644 (file)
@@ -2,6 +2,7 @@ package club.wpia.gigi.api;
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.math.BigInteger;
 import java.util.HashMap;
 
 import javax.servlet.http.HttpServletRequest;
@@ -49,11 +50,11 @@ public class FindAgent extends APIPoint {
         String pi = req.getPathInfo();
         if (pi.equals(PATH_RESOLVE)) {
             String serial = req.getParameter("serial");
-            if (serial == null) {
+            if (serial == null || serial.isEmpty()) {
                 resp.sendError(500, "Error, requires serial");
                 return;
             }
-            Certificate c = Certificate.getBySerial(serial);
+            Certificate c = Certificate.getBySerial(new BigInteger(serial, 16));
             if (c == null) {
                 resp.sendError(500, "Error, requires serial");
                 return;
index 5259fb02370ede6b48cc952128847e75831ba35b..81e57cfbbf3ec23a184bf4f7710ffad0d960b4c1 100644 (file)
@@ -1,6 +1,7 @@
 package club.wpia.gigi.api;
 
 import java.io.IOException;
+import java.math.BigInteger;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -29,12 +30,12 @@ public class RevokeCertificate extends APIPoint {
         }
 
         String tserial = req.getParameter("serial");
-        if (tserial == null) {
+        if (tserial == null || tserial.isEmpty()) {
             resp.sendError(500, "Error, no Serial found");
             return;
         }
 
-        Certificate c = Certificate.getBySerial(tserial);
+        Certificate c = Certificate.getBySerial(new BigInteger(tserial, 16));
         if (c == null || c.getOwner() != u) {
             resp.sendError(403, "Access Denied");
             return;
index 825b33928729804cd5cf112a92837ad5669df98b..28c32088fd1f09e302f0327f2168f534215c9650 100644 (file)
@@ -2,7 +2,9 @@ package club.wpia.gigi.dbObjects;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.math.BigInteger;
 import java.security.GeneralSecurityException;
+import java.security.cert.CertificateException;
 import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
 import java.sql.Date;
@@ -164,6 +166,10 @@ public class Certificate implements IdCachable {
 
     private String description = "";
 
+    public static final TranslateCommand NOT_LOADED = new TranslateCommand("Certificate could not be loaded");
+
+    public static final TranslateCommand NOT_PARSED = new TranslateCommand("Certificate could not be parsed");
+
     /**
      * Creates a new Certificate. WARNING: this is an internal API. Creating
      * certificates for users must be done using the {@link CertificateRequest}
@@ -407,12 +413,12 @@ public class Certificate implements IdCachable {
 
     private static final String CONCAT = "string_agg(concat('/', `name`, '=', REPLACE(REPLACE(value, '\\\\', '\\\\\\\\'), '/', '\\\\/')), '')";
 
-    public synchronized static Certificate getBySerial(String serial) {
-        if (serial == null || "".equals(serial)) {
+    public synchronized static Certificate getBySerial(BigInteger serial) {
+        if (serial == null) {
             return null;
         }
         try (GigiPreparedStatement ps = new GigiPreparedStatement("SELECT certs.id, " + CONCAT + " as `subject`, `md`,`memid`, `profile`, `certs`.`serial`, `certs`.`description` FROM `certs` LEFT JOIN `certAvas` ON `certAvas`.`certId`=`certs`.`id` WHERE `serial`=? GROUP BY `certs`.`id`")) {
-            ps.setString(1, serial);
+            ps.setString(1, serial.toString(16));
             GigiResultSet rs = ps.executeQuery();
             if ( !rs.next()) {
                 return null;
@@ -582,4 +588,56 @@ public class Certificate implements IdCachable {
     public String getDescription() {
         return description;
     }
+
+    public static Certificate locateCertificate(String serial, String certData) throws GigiApiException {
+        if (serial != null && !serial.isEmpty()) {
+            return getBySerial(normalizeSerial(serial));
+        }
+
+        if (certData != null && !certData.isEmpty()) {
+            final byte[] supplied;
+            final X509Certificate c0;
+            try {
+                supplied = PEM.decode("CERTIFICATE", certData);
+                c0 = (X509Certificate) CertificateFactory.getInstance("X509").generateCertificate(new ByteArrayInputStream(supplied));
+            } catch (IllegalArgumentException e1) {
+                throw new GigiApiException(NOT_PARSED);
+            } catch (CertificateException e1) {
+                throw new GigiApiException(NOT_PARSED);
+            }
+            try {
+                Certificate c = getBySerial(c0.getSerialNumber());
+                if (c == null) {
+                    return null;
+                }
+                X509Certificate cert = c.cert();
+                if ( !Arrays.equals(supplied, cert.getEncoded())) {
+                    return null;
+                }
+                return c;
+            } catch (IOException e) {
+                throw new GigiApiException(NOT_LOADED);
+            } catch (GeneralSecurityException e) {
+                throw new GigiApiException(NOT_LOADED);
+            }
+        }
+        throw new GigiApiException("No information to identify the correct certificate was provided.");
+    }
+
+    public static BigInteger normalizeSerial(String serial) throws GigiApiException {
+        serial = serial.replace(" ", "");
+        serial = serial.toLowerCase();
+        if (serial.matches("[0-9a-f]{2}(:[0-9a-f]{2})*")) {
+            serial = serial.replace(":", "");
+        }
+        int idx = 0;
+        while (idx < serial.length() && serial.charAt(idx) == '0') {
+            idx++;
+        }
+        serial = serial.substring(idx);
+        if ( !serial.matches("[0-9a-f]+")) {
+            throw new GigiApiException("Malformed serial");
+        }
+        return new BigInteger(serial, 16);
+    }
 }
index 007d98d3a1092c7d5401c9ba3014f0e676f62bef..72e5a81672762a74510cfbe7743dda61f19d2231 100644 (file)
@@ -5,6 +5,7 @@ import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.ObjectStreamException;
 import java.io.Serializable;
+import java.math.BigInteger;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -139,9 +140,9 @@ public abstract class CertificateOwner implements IdCachable, Serializable {
         }
     }
 
-    public static CertificateOwner getByEnabledSerial(String serial) {
+    public static CertificateOwner getByEnabledSerial(BigInteger serial) {
         try (GigiPreparedStatement prep = new GigiPreparedStatement("SELECT `memid` FROM `certs` INNER JOIN `logincerts` ON `logincerts`.`id`=`certs`.`id` WHERE serial=? AND `revoked` is NULL")) {
-            prep.setString(1, serial);
+            prep.setString(1, serial.toString(16));
             GigiResultSet res = prep.executeQuery();
             if (res.next()) {
                 return getById(res.getInt(1));
index 29fb527c50708887ad388f176ad2c5830307c8b4..23bbdbc974926e871a15a61b6f6e04fe4c0020db 100644 (file)
@@ -80,7 +80,7 @@ public class OCSPIssuer {
      *             if encoding fails
      */
     public byte[] respondBytes(OCSPRequest req, CertId id) throws GeneralSecurityException, IOException {
-        Certificate tcert = Certificate.getBySerial(id.getSerialNumber().toString(16).toLowerCase());
+        Certificate tcert = Certificate.getBySerial(id.getSerialNumber());
         if (tcert == null) {
             return OCSPResponse.invalid();
         }
index 69b93863366d5b1928cee228812756e169478022..b0ed6e69397dcaa4cd313752eed3e473c405f643 100644 (file)
@@ -4,6 +4,7 @@ import static club.wpia.gigi.Gigi.*;
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.math.BigInteger;
 import java.security.cert.X509Certificate;
 import java.util.Map;
 
@@ -152,7 +153,7 @@ public class LoginPage extends Page {
     }
 
     private void tryAuthWithCertificate(HttpServletRequest req, X509Certificate x509Certificate) {
-        String serial = extractSerialFormCert(x509Certificate);
+        BigInteger serial = extractSerialFormCert(x509Certificate);
         User user = fetchUserBySerial(serial);
         if (user == null) {
             return;
@@ -163,15 +164,11 @@ public class LoginPage extends Page {
         req.getSession().setAttribute(LOGIN_METHOD, new TranslateCommand("Certificate"));
     }
 
-    public static String extractSerialFormCert(X509Certificate x509Certificate) {
-        return x509Certificate.getSerialNumber().toString(16).toLowerCase();
+    public static BigInteger extractSerialFormCert(X509Certificate x509Certificate) {
+        return x509Certificate.getSerialNumber();
     }
 
-    public static User fetchUserBySerial(String serial) {
-        if ( !serial.matches("[a-f0-9]+")) {
-            throw new Error("serial malformed.");
-        }
-
+    public static User fetchUserBySerial(BigInteger serial) {
         CertificateOwner o = CertificateOwner.getByEnabledSerial(serial);
         if (o == null || !(o instanceof User)) {
             return null;
index 6d6cc8b510491526b0fce20264569bf816a5d593..7ca73eb05908c3bc3c4c999f70fa0e9194855312 100644 (file)
@@ -1,6 +1,7 @@
 package club.wpia.gigi.pages.account.certs;
 
 import java.io.PrintWriter;
+import java.math.BigInteger;
 import java.util.LinkedList;
 import java.util.Map;
 
@@ -45,7 +46,7 @@ public class CertificateModificationForm extends Form {
         }
         LinkedList<Job> revokes = new LinkedList<Job>();
         for (String serial : certs) {
-            Certificate c = Certificate.getBySerial(serial);
+            Certificate c = Certificate.getBySerial(new BigInteger(serial, 16));
             if (c == null || c.getOwner() != target) {
                 continue;
             }
index 62322554361348c2d91a0cedef772b52b1e054e9..40faa1f147960aac822378e0b746109abc59ba3f 100644 (file)
@@ -2,6 +2,7 @@ package club.wpia.gigi.pages.account.certs;
 
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.math.BigInteger;
 import java.net.URLEncoder;
 import java.security.GeneralSecurityException;
 import java.security.cert.X509Certificate;
@@ -72,7 +73,7 @@ public class Certificates extends Page implements HandlesMixedRequest {
             cer = true;
             pi = pi.substring(0, pi.length() - 4);
         }
-        String serial = pi;
+        BigInteger serial = new BigInteger(pi, 16);
         try {
             Certificate c = Certificate.getBySerial(serial);
             if (c == null || ( !support && LoginPage.getAuthorizationContext(req).getTarget().getId() != c.getOwner().getId())) {
@@ -144,7 +145,7 @@ public class Certificates extends Page implements HandlesMixedRequest {
             pi = pi.substring(1);
 
             String serial = pi;
-            Certificate c = Certificate.getBySerial(serial);
+            Certificate c = Certificate.getBySerial(new BigInteger(serial, 16));
             Language l = LoginPage.getLanguage(req);
 
             if (c == null || ( !support && LoginPage.getAuthorizationContext(req).getTarget().getId() != c.getOwner().getId())) {
index 84af8c315f2fbf846aba7c742c074e0b32dc220c..e0690844d69189034628fb5a4cc2ce571918b103 100644 (file)
@@ -1,6 +1,5 @@
 package club.wpia.gigi.pages.main;
 
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.UnsupportedEncodingException;
@@ -8,12 +7,9 @@ import java.security.GeneralSecurityException;
 import java.security.KeyFactory;
 import java.security.PrivateKey;
 import java.security.Signature;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateFactory;
 import java.security.cert.X509Certificate;
 import java.security.interfaces.RSAPrivateKey;
 import java.security.spec.PKCS8EncodedKeySpec;
-import java.util.Arrays;
 import java.util.Base64;
 import java.util.HashMap;
 import java.util.Locale;
@@ -52,8 +48,6 @@ public class KeyCompromiseForm extends Form {
 
     public static final String CHALLENGE_PREFIX = "This private key has been compromised. Challenge: ";
 
-    public static final TranslateCommand NOT_LOADED = new TranslateCommand("Certificate could not be loaded");
-
     public static final TranslateCommand NOT_FOUND = new TranslateCommand("Certificate to revoke not found");
 
     private static final MailTemplate revocationNotice = new MailTemplate(KeyCompromiseForm.class.getResource("RevocationNotice.templ"));
@@ -68,47 +62,23 @@ public class KeyCompromiseForm extends Form {
         if (RATE_LIMIT.isLimitExceeded(req.getRemoteAddr())) {
             throw new RateLimitException();
         }
-        Certificate c = null;
-        X509Certificate cert = null;
-        String serial = req.getParameter("serial");
-        String certData = req.getParameter("cert");
-        if (serial != null && !serial.isEmpty()) {
-            c = fetchCertificate(serial);
-            try {
-                cert = c.cert();
-            } catch (IOException e) {
-                throw new PermamentFormException(new GigiApiException(NOT_LOADED));
-            } catch (GeneralSecurityException e) {
-                throw new PermamentFormException(new GigiApiException(NOT_LOADED));
-            }
-        }
-        if (certData != null && !certData.isEmpty()) {
-            X509Certificate c0;
-            byte[] supplied;
-            try {
-                supplied = PEM.decode("CERTIFICATE", certData);
-                c0 = (X509Certificate) CertificateFactory.getInstance("X509").generateCertificate(new ByteArrayInputStream(supplied));
-            } catch (IllegalArgumentException e1) {
-                throw new PermamentFormException(new GigiApiException("Your certificate could not be parsed"));
-            } catch (CertificateException e1) {
-                throw new PermamentFormException(new GigiApiException("Your certificate could not be parsed"));
-            }
-            try {
-                String ser = c0.getSerialNumber().toString(16);
-                c = fetchCertificate(ser);
-                cert = c.cert();
-                if ( !Arrays.equals(supplied, cert.getEncoded())) {
-                    throw new PermamentFormException(new GigiApiException(NOT_FOUND));
-                }
-            } catch (IOException e) {
-                throw new PermamentFormException(new GigiApiException(NOT_LOADED));
-            } catch (GeneralSecurityException e) {
-                throw new PermamentFormException(new GigiApiException(NOT_LOADED));
+        Certificate c;
+        try {
+            c = Certificate.locateCertificate(req.getParameter("serial"), req.getParameter("cert"));
+            if (c == null) {
+                throw new GigiApiException(NOT_FOUND);
             }
+        } catch (GigiApiException e) {
+            throw new PermamentFormException(e);
         }
-        if (c == null) {
-            throw new PermamentFormException(new GigiApiException("No certificate identification information provided"));
+
+        X509Certificate cert;
+        try {
+            cert = c.cert();
+        } catch (IOException | GeneralSecurityException e) {
+            throw new PermamentFormException(new GigiApiException(Certificate.NOT_LOADED));
         }
+
         if (c.getStatus() == CertificateStatus.REVOKED) {
             return new SuccessMessageResult(new TranslateCommand("Certificate had already been revoked"));
         }
@@ -219,21 +189,6 @@ public class KeyCompromiseForm extends Form {
         return signature;
     }
 
-    private Certificate fetchCertificate(String serial) {
-        Certificate c;
-        serial = serial.trim().toLowerCase();
-        int idx = 0;
-        while (idx < serial.length() && serial.charAt(idx) == '0') {
-            idx++;
-        }
-        serial = serial.substring(idx);
-        c = Certificate.getBySerial(serial);
-        if (c == null) {
-            throw new PermamentFormException(new GigiApiException(NOT_FOUND));
-        }
-        return c;
-    }
-
     @Override
     protected void outputContent(PrintWriter out, Language l, Map<String, Object> vars) {
         vars.put("challenge", challenge);
index 97fb30da00538095c10a90c2bf20659e6337b9de..a2de227f85037c7586faa5e05add7949761458e3 100644 (file)
@@ -259,7 +259,7 @@ public class SSLPinger extends DomainPinger {
             }
 
             BigInteger serial = first.getSerialNumber();
-            Certificate c = Certificate.getBySerial(serial.toString(16));
+            Certificate c = Certificate.getBySerial(serial);
             if (c == null) {
                 return "Certificate not found: Serial " + serial.toString(16) + " missing.";
             }
index d76c5140cc348b6f4a4fe34f486dc4b3f25bf68d..fb5ca6f6667ee2de8f818ca4afd3c795f3491e19 100644 (file)
@@ -3,6 +3,7 @@ package club.wpia.gigi;
 import static org.junit.Assert.*;
 
 import java.io.IOException;
+import java.math.BigInteger;
 import java.security.GeneralSecurityException;
 import java.security.KeyPair;
 import java.security.PrivateKey;
@@ -80,7 +81,7 @@ public class TestCertificate extends ManagedTest {
 
         testFails(CertificateStatus.ISSUED, c);
 
-        Certificate c2 = Certificate.getBySerial(c.getSerial());
+        Certificate c2 = Certificate.getBySerial(new BigInteger(c.getSerial(), 16));
         assertNotNull(c2);
         assertEquals(2, c2.getSANs().size());
         assertEquals(c.getSANs().get(0).getName(), c2.getSANs().get(0).getName());
diff --git a/tests/club/wpia/gigi/dbObjects/TestSerialNormalization.java b/tests/club/wpia/gigi/dbObjects/TestSerialNormalization.java
new file mode 100644 (file)
index 0000000..276a8ab
--- /dev/null
@@ -0,0 +1,76 @@
+package club.wpia.gigi.dbObjects;
+
+import static org.junit.Assert.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import club.wpia.gigi.GigiApiException;
+
+@RunWith(Parameterized.class)
+public class TestSerialNormalization {
+
+    private final String input;
+
+    private final String normalized;
+
+    @Parameters
+    public static List<String[]> params() {
+        return Arrays.asList(new String[] {
+                "dead00beef", "dead00beef"
+        }, new String[] {
+                "Dead00beef", "dead00beef"
+        }, new String[] {
+                "DEAD00BEEF", "dead00beef"
+        }, new String[] {
+                "00DEAD00BEEF", "dead00beef"
+        }, new String[] {
+                " 00dead00beef", "dead00beef"
+        }, new String[] {
+                "00dead00beef ", "dead00beef"
+        }, new String[] {
+                " 00dead00beef ", "dead00beef"
+        }, new String[] {
+                " 00dead 00beef ", "dead00beef"
+        }, new String[] {
+                " 00d ead 00beef ", "dead00beef"
+        }, new String[] {
+                "de:ad:00:be:ef", "dead00beef"
+        }, new String[] {
+                "00:de:ad:03:be:ef", "dead03beef"
+        }, new String[] {
+                "08:15:47:11", "8154711"
+        }, new String[] {
+                " 00:de:Ad:43:be:ef ", "dead43beef"
+        }, new String[] {
+                "00:de:ad:43:beef", null
+        }, new String[] {
+                "g", null
+        }, new String[] {
+                ".", null
+        });
+    }
+
+    public TestSerialNormalization(String input, String normalized) {
+        this.input = input;
+        this.normalized = normalized;
+    }
+
+    @Test
+    public void testNormalize() throws GigiApiException {
+        if (normalized == null) {
+            try {
+                Certificate.normalizeSerial(input);
+                fail("malformed serial accepted");
+            } catch (GigiApiException e) {
+                return;
+            }
+        }
+        assertEquals(normalized, Certificate.normalizeSerial(input).toString(16));
+    }
+}
index 949085c47487a4d94a2253c759dd0fac5749f48e..0d83f301f0320db78b5717647f29609df5557017 100644 (file)
@@ -401,10 +401,10 @@ public class TestCertificateAdd extends ClientTest {
     @Test
     public void testSetLoginEnabled() throws IOException, GeneralSecurityException {
         X509Certificate parsedLoginNotEnabled = createCertWithValidity("&validFrom=now&validity=1m", false);
-        assertNull(CertificateOwner.getByEnabledSerial(parsedLoginNotEnabled.getSerialNumber().toString(16).toLowerCase()));
+        assertNull(CertificateOwner.getByEnabledSerial(parsedLoginNotEnabled.getSerialNumber()));
 
         X509Certificate parsedLoginEnabled = createCertWithValidity("&validFrom=now&validity=1m", true);
-        assertEquals(u, CertificateOwner.getByEnabledSerial(parsedLoginEnabled.getSerialNumber().toString(16).toLowerCase()));
+        assertEquals(u, CertificateOwner.getByEnabledSerial(parsedLoginEnabled.getSerialNumber()));
     }
 
     @Test
index 49ffd80128d268e648068dd078bcd4796a3daeac..406590d2d161ba4c32ac6da90cee0b2f4c449b35 100644 (file)
@@ -96,18 +96,18 @@ public class KeyCompromiseTest extends ClientTest {
                 params("cert=%cert&priv=%priv", null),// cert+key
                 params("serial=%serial&signature=%signature", null),
                 // Zero serial
-                params("serial=0000&priv=%priv", NOT_FOUND),
-                params("serial=0lkd&priv=%priv", NOT_FOUND),
+                params("serial=0000&priv=%priv", "Malformed serial"),
+                params("serial=0lkd&priv=%priv", "Malformed serial"),
                 // tampered cert
                 params("cert=%tamperedCert&priv=%priv", "not be parsed"),
                 params("cert=%cert&priv=%tamperedPriv", "Private Key is malformed"),
                 params("serial=1&priv=%priv", NOT_FOUND),
                 params("serial=1%serial&priv=%priv", NOT_FOUND),
                 // missing certificate identification
-                params("serial=&cert=&priv=%priv", "identification"),
-                params("cert=&priv=%priv", "identification"),
-                params("serial=&priv=%priv", "identification"),
-                params("priv=%priv", "identification"),
+                params("serial=&cert=&priv=%priv", "No information to identify"),
+                params("cert=&priv=%priv", "No information to identify"),
+                params("serial=&priv=%priv", "No information to identify"),
+                params("priv=%priv", "No information to identify"),
                 // sign missing
                 params("serial=%serial&priv=&signature=", "No verification"),
                 params("serial=%serial&signature=", "No verification"),
@@ -115,7 +115,7 @@ public class KeyCompromiseTest extends ClientTest {
                 params("serial=%serial", "No verification"),
                 params("cert=%cert&signature=%tamperedSignature", "Verification does not match"),
 
-                params("cert=-_&signature=%signature", "certificate could not be parsed"),
+                params("cert=-_&signature=%signature", "Certificate could not be parsed"),
                 params("cert=%cert&signature=-_", "Signature is malformed"),
                 params("cert=%cert&priv=-_", "Private Key is malformed"),
         };