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}