001package org.kuali.common.util.ssh.impl; 002 003import java.io.ByteArrayOutputStream; 004import java.io.UnsupportedEncodingException; 005 006import org.kuali.common.util.Assert; 007import org.kuali.common.util.Encodings; 008import org.kuali.common.util.ssh.api.SshService; 009import org.kuali.common.util.ssh.model.Algorithm; 010import org.kuali.common.util.ssh.model.GenerateKeyPairContext; 011import org.kuali.common.util.ssh.model.KeyPair; 012 013import com.jcraft.jsch.JSch; 014import com.jcraft.jsch.JSchException; 015 016public class DefaultSshService implements SshService { 017 018 private static final String UTF8 = Encodings.UTF8; 019 private static final int DSA = com.jcraft.jsch.KeyPair.DSA; 020 private static final int RSA = com.jcraft.jsch.KeyPair.RSA; 021 022 @Override 023 public KeyPair generateKeyPair(GenerateKeyPairContext context) { 024 Assert.noNulls(context); 025 int algorithm = (Algorithm.DSA == context.getAlgorithm()) ? DSA : RSA; 026 JSch jsch = new JSch(); 027 com.jcraft.jsch.KeyPair keyPair = getKeyPair(jsch, algorithm, context.getSize()); 028 String publicKey = getPublicKey(keyPair, context.getName()).trim(); 029 String privateKey = getPrivateKey(keyPair); 030 String fingerprint = keyPair.getFingerPrint(); 031 return new KeyPair.Builder(context.getName()).publicKey(publicKey).privateKey(privateKey).fingerprint(fingerprint).build(); 032 } 033 034 protected com.jcraft.jsch.KeyPair getKeyPair(JSch jsch, int type, int size) { 035 try { 036 return com.jcraft.jsch.KeyPair.genKeyPair(jsch, type, size); 037 } catch (JSchException e) { 038 throw new IllegalStateException(e); 039 } 040 } 041 042 protected String getPrivateKey(com.jcraft.jsch.KeyPair keyPair) { 043 ByteArrayOutputStream out = new ByteArrayOutputStream(); 044 keyPair.writePrivateKey(out); 045 return toUTF8String(out); 046 } 047 048 protected String getPublicKey(com.jcraft.jsch.KeyPair keyPair, String name) { 049 ByteArrayOutputStream out = new ByteArrayOutputStream(); 050 keyPair.writePublicKey(out, name); 051 return toUTF8String(out); 052 } 053 054 protected String toUTF8String(ByteArrayOutputStream out) { 055 try { 056 return out.toString(UTF8); 057 } catch (UnsupportedEncodingException e) { 058 throw new IllegalStateException(e); 059 } 060 } 061}