1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/* 2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more 3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * contributor license agreements. See the NOTICE file distributed with 4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * this work for additional information regarding copyright ownership. 5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0 6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * (the "License"); you may not use this file except in compliance with 7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * the License. You may obtain a copy of the License at 8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * 9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * 11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Unless required by applicable law or agreed to in writing, software 12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * See the License for the specific language governing permissions and 15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * limitations under the License. 16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/** 198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @author Vera Y. Petrashkova 208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */ 21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.security.tests.java.security; 23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.*; 25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.cert.Certificate; 26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.tests.support.cert.MyCertificate; 28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase; 30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.Test; 32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestSuite; 33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/** 35e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * Tests for <code>KeyStore.PrivateKeyEntry</code> class constructor and methods 36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class KSPrivateKeyEntryTest extends TestCase { 39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Constructor for KSPrivateKeyEntryTest. 428d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * 43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * @param arg0 44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public KSPrivateKeyEntryTest(String arg0) { 46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes super(arg0); 47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 488d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private PrivateKey testPrivateKey; 508d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath private Certificate[] testChain; 51e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private void createParams(boolean diffCerts, boolean diffKeys) { 538d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath byte[] encoded = { (byte) 0, (byte) 1, (byte) 2, (byte) 3 }; 54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes testChain = new Certificate[5]; 55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < testChain.length; i++) { 56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes String s = (diffCerts ? Integer.toString(i) : "NEW"); 57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes testChain[i] = new MyCertificate("MY_TEST_CERTIFICATE_" 58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .concat(s), encoded); 59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 608d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath testPrivateKey = (diffKeys ? (PrivateKey) new tmpPrivateKey() : 618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath (PrivateKey) new tmpPrivateKey(testChain[0].getPublicKey().getAlgorithm())); 62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 63e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Test for <code>PrivateKeyEntry(PrivateKey privateKey, Certificate[] chain)</code> 66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * constructor 67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Assertion: throws NullPointerException when privateKey is null 68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testPrivateKeyEntry01() { 70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Certificate[] certs = new MyCertificate[1];//new Certificate[1]; 71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes PrivateKey pk = null; 72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new KeyStore.PrivateKeyEntry(pk, certs); 74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("NullPointerException must be thrown when privateKey is null"); 75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (NullPointerException e) { 76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Test for <code>PrivateKeyEntry(PrivateKey privateKey, Certificate[] chain)</code> 81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * constructor 82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Assertion: throws NullPointerException when chain is null 83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * and throws IllegalArgumentException when chain length is 0 84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testPrivateKeyEntry02() { 86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Certificate[] chain = null; 87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes PrivateKey pk = new tmpPrivateKey(); 88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new KeyStore.PrivateKeyEntry(pk, chain); 90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("NullPointerException must be thrown when chain is null"); 91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (NullPointerException e) { 92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes chain = new Certificate[0]; 95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new KeyStore.PrivateKeyEntry(pk, chain); 96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("IllegalArgumentException must be thrown when chain length is 0"); 97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (IllegalArgumentException e) { 98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 1008d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath 101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Test for <code>PrivateKeyEntry(PrivateKey privateKey, Certificate[] chain)</code> 103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * constructor 104e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * Assertion: throws IllegalArgumentException when chain contains certificates 105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * of different types 106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testPrivateKeyEntry03() { 108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes createParams(true, false); 109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new KeyStore.PrivateKeyEntry(testPrivateKey, testChain); 111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("IllegalArgumentException must be thrown when chain contains certificates of different types"); 112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } catch (IllegalArgumentException e) { 113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 115e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Test for <code>PrivateKeyEntry(PrivateKey privateKey, Certificate[] chain)</code> 118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * constructor 119e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes * Assertion: throws IllegalArgumentException when algorithm of privateKey 120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * does not match the algorithm of PublicKey in the end certificate (with 0 index) 121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testPrivateKeyEntry04() { 123e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes createParams(false, true); 124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try { 125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes new KeyStore.PrivateKeyEntry(testPrivateKey, testChain); 126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes fail("IllegalArgumentException must be thrown when key algorithms do not match"); 127e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes } catch (IllegalArgumentException e) { 128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Test for <code>getPrivateKey()</code> method 133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Assertion: returns PrivateKey object 134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testGetPrivateKey() { 136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes createParams(false, false); 137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes KeyStore.PrivateKeyEntry ksPKE = new KeyStore.PrivateKeyEntry( 138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes testPrivateKey, testChain); 139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Incorrect PrivateKey", testPrivateKey, ksPKE 140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .getPrivateKey()); 141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 142e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Test for <code>getCertificateChain()</code> method Assertion: returns 145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * array of the Certificates corresponding to chain 146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testGetCertificateChain() { 148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes createParams(false, false); 149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes KeyStore.PrivateKeyEntry ksPKE = new KeyStore.PrivateKeyEntry( 150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes testPrivateKey, testChain); 151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Certificate[] res = ksPKE.getCertificateChain(); 152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Incorrect chain length", testChain.length, res.length); 153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < res.length; i++) { 154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Incorrect chain element: " 155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes .concat(Integer.toString(i)), testChain[i], res[i]); 156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 158e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes 159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Test for <code>getCertificate()</code> method 161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Assertion: returns end Certificate (with 0 index in chain) 162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testGetCertificate() { 164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes createParams(false, false); 165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes KeyStore.PrivateKeyEntry ksPKE = new KeyStore.PrivateKeyEntry( 166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes testPrivateKey, testChain); 167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes Certificate res = ksPKE.getCertificate(); 168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertEquals("Incorrect end certificate (number 0)", testChain[0], res); 169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes /** 172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Test for <code>toString()</code> method 173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Assertion: returns non null String 174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */ 175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public void testToString() { 176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes createParams(false, false); 177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes KeyStore.PrivateKeyEntry ksPKE = new KeyStore.PrivateKeyEntry( 178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes testPrivateKey, testChain); 179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes String res = ksPKE.toString(); 180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assertNotNull("toString() returns null", res); 181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public static Test suite() { 184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return new TestSuite(KSPrivateKeyEntryTest.class); 185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private static class tmpPrivateKey implements PrivateKey { 188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes private String alg = "My algorithm"; 189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public String getAlgorithm() { 191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return alg; 192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public String getFormat() { 195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return "My Format"; 196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public byte[] getEncoded() { 199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes return new byte[1]; 200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public tmpPrivateKey() { 203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes public tmpPrivateKey(String algorithm) { 206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes super(); 207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes alg = algorithm; 208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes} 211