Added some basic functionality for creating and loading private and public keys.
This commit is contained in:
		
							parent
							
								
									0919fef40d
								
							
						
					
					
						commit
						a842df2410
					
				
							
								
								
									
										61
									
								
								keys.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								keys.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,61 @@
 | 
				
			|||||||
 | 
					package easyssh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"crypto/rand"
 | 
				
			||||||
 | 
						"crypto/rsa"
 | 
				
			||||||
 | 
						"crypto/x509"
 | 
				
			||||||
 | 
						"encoding/pem"
 | 
				
			||||||
 | 
						"io"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"golang.org/x/crypto/ssh"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CreateKeyPairFiles is the equivalent of running 'ssh-keygen -t rsa"'
 | 
				
			||||||
 | 
					func CreateKeyPairFiles(publicKeyPath, privateKeyPath string) error {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						privateKeyFile, err := os.Create(privateKeyPath)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer privateKeyFile.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						publicKeyFile, err := os.Create(publicKeyPath)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						defer publicKeyFile.Close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return CreateKeyPair(publicKeyFile, privateKeyFile)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CreateKeyPair creates a new SSH Key Pair writing the formatted keys to the corresponding io.Writers
 | 
				
			||||||
 | 
					func CreateKeyPair(publicKey, privateKey io.Writer) (err error) {
 | 
				
			||||||
 | 
						k, err := rsa.GenerateKey(rand.Reader, 1024)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						privatePEM := &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(k)}
 | 
				
			||||||
 | 
						err = pem.Encode(privateKey, privatePEM)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						public, err := ssh.NewPublicKey(&k.PublicKey)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err = publicKey.Write(ssh.MarshalAuthorizedKey(public))
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// LoadPrivateKey loads a file at the provided path and attempts to load it into an ssh.Signer that can be used for SSH servers
 | 
				
			||||||
 | 
					func LoadPrivateKey(filePath string) (ssh.Signer, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						privateBytes, err := ioutil.ReadFile(filePath)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ssh.ParsePrivateKey(privateBytes)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user