File: generate_test.go

package info (click to toggle)
golang-github-juju-utils 0.0~git20171220.f38c0b0-5
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 1,748 kB
  • sloc: makefile: 20
file content (76 lines) | stat: -rw-r--r-- 1,930 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Copyright 2013 Canonical Ltd.
// Licensed under the LGPLv3, see LICENCE file for details.

package ssh_test

import (
	"crypto/dsa"
	"crypto/rsa"
	"io"

	"github.com/juju/testing"
	jc "github.com/juju/testing/checkers"
	gc "gopkg.in/check.v1"

	"github.com/juju/utils/ssh"
)

type GenerateSuite struct {
	testing.IsolationSuite
}

var _ = gc.Suite(&GenerateSuite{})

var (
	pregeneratedKey   *rsa.PrivateKey
	alternativeRSAKey *rsa.PrivateKey
)

// overrideGenerateKey patches out rsa.GenerateKey to create a single testing
// key which is saved and used between tests to save computation time.
func overrideGenerateKey(c *gc.C) testing.Restorer {
	restorer := testing.PatchValue(ssh.RSAGenerateKey, func(random io.Reader, bits int) (*rsa.PrivateKey, error) {
		if pregeneratedKey != nil {
			return pregeneratedKey, nil
		}
		key, err := generateRSAKey(random)
		if err != nil {
			return nil, err
		}
		pregeneratedKey = key
		return key, nil
	})
	return restorer
}

func generateRSAKey(random io.Reader) (*rsa.PrivateKey, error) {
	// Ignore requested bits and just use 512 bits for speed
	key, err := rsa.GenerateKey(random, 512)
	if err != nil {
		return nil, err
	}
	key.Precompute()
	return key, nil
}

func generateDSAKey(random io.Reader) (*dsa.PrivateKey, error) {
	var privKey dsa.PrivateKey
	if err := dsa.GenerateParameters(&privKey.Parameters, random, dsa.L1024N160); err != nil {
		return nil, err
	}
	if err := dsa.GenerateKey(&privKey, random); err != nil {
		return nil, err
	}
	return &privKey, nil
}

func (s *GenerateSuite) TestGenerate(c *gc.C) {
	defer overrideGenerateKey(c).Restore()
	private, public, err := ssh.GenerateKey("some-comment")

	c.Check(err, jc.ErrorIsNil)
	c.Check(private, jc.HasPrefix, "-----BEGIN RSA PRIVATE KEY-----\n")
	c.Check(private, jc.HasSuffix, "-----END RSA PRIVATE KEY-----\n")
	c.Check(public, jc.HasPrefix, "ssh-rsa ")
	c.Check(public, jc.HasSuffix, " some-comment\n")
}