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 18package org.apache.harmony.xnet.tests.provider.jsse; 19 20import java.security.InvalidKeyException; 21import java.security.KeyFactory; 22import java.security.NoSuchAlgorithmException; 23import java.security.NoSuchProviderException; 24import java.security.PrivateKey; 25import java.security.PublicKey; 26import java.security.SignatureException; 27import java.security.cert.Certificate; 28import java.security.cert.CertificateException; 29import java.security.spec.PKCS8EncodedKeySpec; 30import java.security.spec.X509EncodedKeySpec; 31 32import junit.framework.TestCase; 33 34import org.apache.harmony.luni.util.Base64; 35import org.apache.harmony.xnet.provider.jsse.DigitalSignature; 36 37/** 38 * Tests for <code>DigitalSignature</code>class 39 */ 40public 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