1 package org.kuali.common.util.ssh.impl;
2
3 import java.io.ByteArrayOutputStream;
4 import java.io.UnsupportedEncodingException;
5
6 import org.kuali.common.util.Assert;
7 import org.kuali.common.util.Encodings;
8 import org.kuali.common.util.ssh.api.SshService;
9 import org.kuali.common.util.ssh.model.Algorithm;
10 import org.kuali.common.util.ssh.model.GenerateKeyPairContext;
11 import org.kuali.common.util.ssh.model.KeyPair;
12
13 import com.jcraft.jsch.JSch;
14 import com.jcraft.jsch.JSchException;
15
16 public class DefaultSshService implements SshService {
17
18 private static final String UTF8 = Encodings.UTF8;
19 private static final int DSA = com.jcraft.jsch.KeyPair.DSA;
20 private static final int RSA = com.jcraft.jsch.KeyPair.RSA;
21
22 @Override
23 public KeyPair generateKeyPair(GenerateKeyPairContext context) {
24 Assert.noNulls(context);
25 int algorithm = (Algorithm.DSA == context.getAlgorithm()) ? DSA : RSA;
26 JSch jsch = new JSch();
27 com.jcraft.jsch.KeyPair keyPair = getKeyPair(jsch, algorithm, context.getSize());
28 String publicKey = getPublicKey(keyPair, context.getName()).trim();
29 String privateKey = getPrivateKey(keyPair);
30 String fingerprint = keyPair.getFingerPrint();
31 return new KeyPair.Builder(context.getName()).publicKey(publicKey).privateKey(privateKey).fingerprint(fingerprint).build();
32 }
33
34 protected com.jcraft.jsch.KeyPair getKeyPair(JSch jsch, int type, int size) {
35 try {
36 return com.jcraft.jsch.KeyPair.genKeyPair(jsch, type, size);
37 } catch (JSchException e) {
38 throw new IllegalStateException(e);
39 }
40 }
41
42 protected String getPrivateKey(com.jcraft.jsch.KeyPair keyPair) {
43 ByteArrayOutputStream out = new ByteArrayOutputStream();
44 keyPair.writePrivateKey(out);
45 return toUTF8String(out);
46 }
47
48 protected String getPublicKey(com.jcraft.jsch.KeyPair keyPair, String name) {
49 ByteArrayOutputStream out = new ByteArrayOutputStream();
50 keyPair.writePublicKey(out, name);
51 return toUTF8String(out);
52 }
53
54 protected String toUTF8String(ByteArrayOutputStream out) {
55 try {
56 return out.toString(UTF8);
57 } catch (UnsupportedEncodingException e) {
58 throw new IllegalStateException(e);
59 }
60 }
61 }