Home | History | Annotate | Download | only in jsse
      1 /*
      2  *  Licensed to the Apache Software Foundation (ASF) under one or more
      3  *  contributor license agreements.  See the NOTICE file distributed with
      4  *  this work for additional information regarding copyright ownership.
      5  *  The ASF licenses this file to You under the Apache License, Version 2.0
      6  *  (the "License"); you may not use this file except in compliance with
      7  *  the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  */
     17 
     18 package org.apache.harmony.xnet.tests.provider.jsse;
     19 
     20 import java.security.InvalidKeyException;
     21 import java.security.KeyFactory;
     22 import java.security.NoSuchAlgorithmException;
     23 import java.security.NoSuchProviderException;
     24 import java.security.PrivateKey;
     25 import java.security.PublicKey;
     26 import java.security.SignatureException;
     27 import java.security.cert.Certificate;
     28 import java.security.cert.CertificateException;
     29 import java.security.spec.PKCS8EncodedKeySpec;
     30 import java.security.spec.X509EncodedKeySpec;
     31 
     32 import junit.framework.TestCase;
     33 
     34 import org.apache.harmony.luni.util.Base64;
     35 import org.apache.harmony.xnet.provider.jsse.DigitalSignature;
     36 
     37 /**
     38  * Tests for <code>DigitalSignature</code>class
     39  */
     40 public class DigitalSignatureTest extends TestCase {
     41 
     42     public void test_Sign() throws Exception {
     43 
     44         // Regression for HARMONY-2029
     45         // data arrays were taken from HARMONY-2125
     46 
     47         byte[] b64PublicKeySpec = ("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk7q/qebK6/tSLydRUCAvwcqRlS95aau5"
     48                 + "xj2fFpLRYYG0avuO0qXn14HNmoC8kztk66Q+4oZS9SkQYwr24x+9ide0s9xfjQ5ohDpY6P+mtD6k"
     49                 + "0piKwYmLXtqi7BTgpgoDXtYi6VJYzvBxLhe050vi1lUNe2iCl/jsU4IcBCcOjV4CwbTDRhq6PzT7"
     50                 + "70uWtMhAV28E/jcszlyxHYZ5qK0wp8BoBdcNQf3tihBuQkrsv57z94tbEJxg5JeMOl1aWVtw6LLR"
     51                 + "K2GQBaDrwvy7R4FA2oOc/JS9PsiT0ieKO1dhPGmqJDaVMlZMFeUY41hTzU3BAmcjYBWQI2oNqHRv"
     52                 + "ya9tUQIDAQAB").getBytes("UTF-8");
     53 
     54         byte[] b64PrivateKeySpec = ("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCTur+p5srr+1IvJ1FQIC/BypGV"
     55                 + "L3lpq7nGPZ8WktFhgbRq+47SpefXgc2agLyTO2TrpD7ihlL1KRBjCvbjH72J17Sz3F+NDmiEOljo"
     56                 + "/6a0PqTSmIrBiYte2qLsFOCmCgNe1iLpUljO8HEuF7TnS+LWVQ17aIKX+OxTghwEJw6NXgLBtMNG"
     57                 + "Gro/NPvvS5a0yEBXbwT+NyzOXLEdhnmorTCnwGgF1w1B/e2KEG5CSuy/nvP3i1sQnGDkl4w6XVpZ"
     58                 + "W3DostErYZAFoOvC/LtHgUDag5z8lL0+yJPSJ4o7V2E8aaokNpUyVkwV5RjjWFPNTcECZyNgFZAj"
     59                 + "ag2odG/Jr21RAgMBAAECggEAJevfPUbQOilGXHJUTiQk/jL4kfogyX5absfsqYfAla4M2RWAARSz"
     60                 + "Yb+hPpLjVUv+yPpdZhqi+umymin7XCwOpG6ppS3hnTzgmWi83/qYGVanSqP7olijXRL0lXN6g0S4"
     61                 + "vsRrK8eGooBYHUPanTD+ppQopNAcDdTJHVqdxHceJi1gum4c3yZmoe510TjlqpOezAO6B0N1dfJf"
     62                 + "KEIQjMdlWgKRq2WNzPDFO8Luhyg40PoTcoWZRhKWV5xPBmq4ew4epxuZpNnuVIzxs9gpjuK55xFg"
     63                 + "ukXyyhmjsfJzdRs/9kToJdGU3prxf716fk+7OgzgdfWTXK0/uVBE9JIUPBxuAQKBgQDvT+jtTLYN"
     64                 + "781CujruJUGIn5HHAsqzs1PuKhXS3Nb/+UPkdz0SK3BqReDWIF7db5bxcDDsbfe+OP90DGhd5O6w"
     65                 + "QbuWA7PdyUJiz2tZ2gBZwvfKYJ/N45KYrFv+f2YmIqhS8lOCV9OoU1/snn8kHRa/UlFfWc8sXSub"
     66                 + "frWjPAT+4QKBgQCeB/KHW5nv0vjifx3afxo6ZPfD4QOtDRkG9mduzJFkFE5pFFuaLVMHuXph+RFL"
     67                 + "/vxcukEZOdBBy0/srXN5PV/1kwrhXcRh5YUq8UHF4ExYctCnSn0NbMPazVHY5HSCVwWdNrMk3jIb"
     68                 + "vNBnTMXtoi7XpSDHM3nk4mF41KZc8nRscQKBgQCQyMXhm8GhWO3UaxtwLTYi1He78aJ1ag9jTi75"
     69                 + "7gZdw48h0EowjftrMG/A3MDIM9UcqYXP5RA4E//pVABonjMSjBJTxlWx3yu84ETQjaYcqGqGFENa"
     70                 + "q05r9AuMQ8OnWtx/ooCHoV86vYaRf6roTHkQs1rr10gSTSQu5VA7O/rBwQKBgElAUdEgSqh52FfU"
     71                 + "qFfhVpz+tEIdiQCr84/go20ecb48E2RtxVAf9j68YNgNBVF+rielRguVWs1EmpWQiNgH9PT15bM1"
     72                 + "LZRbOXEAR4abQ4g0IDeLNZAFfHttdKTesIrCH54R/tP2Eq/8w3U+hvhxltjqd9keKUBJFvlVSJAI"
     73                 + "6qJhAoGBAJU8ET4NHv4/AS3SiTcg65TE4ktrTsVZixNYVORE32bFZCZClWLI2aUattiIk8UqvG74"
     74                 + "wugnxUGk8tJMcw1J/gh+UlnGrX7HqiWTCzEyepOiDQV3NkOQ+9z9WeQNNUtQyIFZZB4wQHaH21BB"
     75                 + "a1kmrzyqihpAVWrpBOJCipel8S0X").getBytes("UTF-8");
     76 
     77         // Create public/private keys and certificate
     78         KeyFactory keyFactory = KeyFactory.getInstance("RSA");
     79         PrivateKey privateKey = keyFactory
     80                 .generatePrivate(new PKCS8EncodedKeySpec(Base64
     81                         .decode(b64PrivateKeySpec)));
     82         final PublicKey publicKey = keyFactory
     83                 .generatePublic(new X509EncodedKeySpec(Base64
     84                         .decode(b64PublicKeySpec)));
     85 
     86         @SuppressWarnings("serial")
     87         Certificate cert = new Certificate("myType") {
     88 
     89             @Override
     90             public PublicKey getPublicKey() {
     91                 return publicKey;
     92             }
     93 
     94             @Override
     95             public byte[] getEncoded() {
     96                 return null;
     97             }
     98 
     99             @Override
    100             public String toString() {
    101                 return null;
    102             }
    103 
    104             @Override
    105             public void verify(PublicKey key) throws CertificateException,
    106                     NoSuchAlgorithmException, InvalidKeyException,
    107                     NoSuchProviderException, SignatureException {
    108             }
    109 
    110             @Override
    111             public void verify(PublicKey key, String sigProvider)
    112                     throws CertificateException, NoSuchAlgorithmException,
    113                     InvalidKeyException, NoSuchProviderException,
    114                     SignatureException {
    115             }
    116         };
    117 
    118         // Sign first: init DigitalSignature with md5 and sha1
    119         // CipherSuite.KeyExchange_RSA_EXPORT == 2
    120         DigitalSignature dsig = new DigitalSignature(2);
    121 
    122         dsig.init(privateKey);
    123 
    124         byte[] md5 = new byte[] {
    125                 0x00, // <=== this is a problem byte (see HARMONY-2125)
    126                 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
    127                 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
    128 
    129         byte[] sha1 = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
    130                 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
    131                 0x11, 0x12, 0x13 };
    132 
    133         dsig.setMD5(md5);
    134         dsig.setSHA(sha1);
    135 
    136         byte[] enc = dsig.sign();
    137 
    138         // Now let's verify
    139         dsig.init(cert);
    140         assertTrue(dsig.verifySignature(enc));
    141     }
    142 }
    143