blob: 194443f78d939115f3e248d8a1795b07b32503bc [file] [log] [blame]
Tilak Sharmad6ade0e2014-08-20 16:28:32 -07001package security
2
3import (
4 "bytes"
Ankur021e38e2014-09-26 10:26:45 -07005 "crypto/ecdsa"
6 "crypto/elliptic"
7 "crypto/rand"
Tilak Sharmad6ade0e2014-08-20 16:28:32 -07008 "reflect"
9 "testing"
10
Jiri Simsa519c5072014-09-17 21:37:57 -070011 "veyron.io/veyron/veyron2/security"
Todd Wang34ed4c62014-11-26 15:15:52 -080012 "veyron.io/veyron/veyron2/vdl/vdlutil"
Tilak Sharmad6ade0e2014-08-20 16:28:32 -070013)
14
Ankur021e38e2014-09-26 10:26:45 -070015func TestLoadSavePEMKey(t *testing.T) {
16 key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
17 if err != nil {
18 t.Fatalf("Failed ecdsa.GenerateKey: %v", err)
19 }
20
21 var buf bytes.Buffer
Ankur73e7a932014-10-24 15:57:03 -070022 if err := SavePEMKey(&buf, key, nil); err != nil {
Ankur021e38e2014-09-26 10:26:45 -070023 t.Fatalf("Failed to save ECDSA private key: %v", err)
24 }
25
Ankur73e7a932014-10-24 15:57:03 -070026 loadedKey, err := LoadPEMKey(&buf, nil)
Suharsh Sivakumar0f359042014-10-01 22:53:45 -070027 if !reflect.DeepEqual(loadedKey, key) {
28 t.Fatalf("Got key %v, but want %v", loadedKey, key)
29 }
30}
31
Suharsh Sivakumaraca1c322014-10-21 11:27:32 -070032func TestLoadSavePEMKeyWithPassphrase(t *testing.T) {
Suharsh Sivakumar0f359042014-10-01 22:53:45 -070033 pass := []byte("openSesame")
Suharsh Sivakumaraca1c322014-10-21 11:27:32 -070034 incorrect_pass := []byte("wrongPassphrase")
Suharsh Sivakumar0f359042014-10-01 22:53:45 -070035 key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
36 if err != nil {
37 t.Fatalf("Failed ecdsa.GenerateKey: %v", err)
38 }
39 var buf bytes.Buffer
Suharsh Sivakumaraca1c322014-10-21 11:27:32 -070040
41 // Test incorrect passphrase.
Ankur73e7a932014-10-24 15:57:03 -070042 if err := SavePEMKey(&buf, key, pass); err != nil {
Suharsh Sivakumar0f359042014-10-01 22:53:45 -070043 t.Fatalf("Failed to save ECDSA private key: %v", err)
44 }
Ankur73e7a932014-10-24 15:57:03 -070045 loadedKey, err := LoadPEMKey(&buf, incorrect_pass)
Suharsh Sivakumar6ceb4302014-10-23 15:33:17 -070046 if loadedKey != nil && err != nil {
47 t.Errorf("expected (nil, err != nil) received (%v,%v)", loadedKey, err)
Suharsh Sivakumar0f359042014-10-01 22:53:45 -070048 }
49
50 // Test correct password.
Ankur73e7a932014-10-24 15:57:03 -070051 if err := SavePEMKey(&buf, key, pass); err != nil {
Suharsh Sivakumar0f359042014-10-01 22:53:45 -070052 t.Fatalf("Failed to save ECDSA private key: %v", err)
53 }
Ankur73e7a932014-10-24 15:57:03 -070054 loadedKey, err = LoadPEMKey(&buf, pass)
Ankur021e38e2014-09-26 10:26:45 -070055 if !reflect.DeepEqual(loadedKey, key) {
56 t.Fatalf("Got key %v, but want %v", loadedKey, key)
57 }
Suharsh Sivakumaraca1c322014-10-21 11:27:32 -070058
59 // Test nil passphrase.
Ankur73e7a932014-10-24 15:57:03 -070060 if err := SavePEMKey(&buf, key, pass); err != nil {
Suharsh Sivakumaraca1c322014-10-21 11:27:32 -070061 t.Fatalf("Failed to save ECDSA private key: %v", err)
62 }
Ankur73e7a932014-10-24 15:57:03 -070063 if loadedKey, err = LoadPEMKey(&buf, nil); loadedKey != nil || err != PassphraseErr {
Suharsh Sivakumar4684f4e2014-10-24 13:42:06 -070064 t.Fatalf("expected(nil, PassphraseError), instead got (%v, %v)", loadedKey, err)
Suharsh Sivakumaraca1c322014-10-21 11:27:32 -070065 }
Ankur021e38e2014-09-26 10:26:45 -070066}
67
Ankurf044a8d2014-09-05 17:05:24 -070068// fpCaveat implements security.CaveatValidator.
69type fpCaveat struct{}
70
71func (fpCaveat) Validate(security.Context) error { return nil }
72
73// tpCaveat implements security.ThirdPartyCaveat.
74type tpCaveat struct{}
75
76func (tpCaveat) Validate(security.Context) (err error) { return }
77func (tpCaveat) ID() (id string) { return }
78func (tpCaveat) Location() (loc string) { return }
79func (tpCaveat) Requirements() (r security.ThirdPartyRequirements) { return }
Ankur0af4d3b2014-09-29 17:05:21 -070080func (tpCaveat) Dischargeable(security.Context) (err error) { return }
Ankurf044a8d2014-09-05 17:05:24 -070081
82func TestCaveatUtil(t *testing.T) {
Asim Shankarbb0f0c12014-09-09 13:32:28 -070083 type C []security.Caveat
84 type V []security.CaveatValidator
85 type TP []security.ThirdPartyCaveat
Ankurf044a8d2014-09-05 17:05:24 -070086
Asim Shankarbb0f0c12014-09-09 13:32:28 -070087 newCaveat := func(v security.CaveatValidator) security.Caveat {
88 c, err := security.NewCaveat(v)
Ankurf044a8d2014-09-05 17:05:24 -070089 if err != nil {
Asim Shankarbb0f0c12014-09-09 13:32:28 -070090 t.Fatalf("failed to create Caveat from validator %T: %v", v, c)
Ankurf044a8d2014-09-05 17:05:24 -070091 }
Asim Shankarbb0f0c12014-09-09 13:32:28 -070092 return c
Ankurf044a8d2014-09-05 17:05:24 -070093 }
Asim Shankarbb0f0c12014-09-09 13:32:28 -070094
Ankurf044a8d2014-09-05 17:05:24 -070095 var (
Asim Shankarbb0f0c12014-09-09 13:32:28 -070096 fp fpCaveat
97 tp tpCaveat
98 invalid = security.Caveat{ValidatorVOM: []byte("invalid")}
Ankurf044a8d2014-09-05 17:05:24 -070099 )
100 testdata := []struct {
Asim Shankarbb0f0c12014-09-09 13:32:28 -0700101 caveats []security.Caveat
Ankurf044a8d2014-09-05 17:05:24 -0700102 validators []security.CaveatValidator
103 tpCaveats []security.ThirdPartyCaveat
104 }{
105 {nil, nil, nil},
Asim Shankarbb0f0c12014-09-09 13:32:28 -0700106 {C{newCaveat(fp)}, V{fp}, nil},
107 {C{newCaveat(tp)}, V{tp}, TP{tp}},
108 {C{newCaveat(fp), newCaveat(tp)}, V{fp, tp}, TP{tp}},
Ankurf044a8d2014-09-05 17:05:24 -0700109 }
Suharsh Sivakumar34e2e332014-11-19 16:29:20 -0800110 for _, d := range testdata {
Ankurf044a8d2014-09-05 17:05:24 -0700111 // Test ThirdPartyCaveats.
112 if got := ThirdPartyCaveats(d.caveats...); !reflect.DeepEqual(got, d.tpCaveats) {
113 t.Errorf("ThirdPartyCaveats(%v): got: %#v, want: %#v", d.caveats, got, d.tpCaveats)
114 continue
115 }
116 if got := ThirdPartyCaveats(append(d.caveats, invalid)...); !reflect.DeepEqual(got, d.tpCaveats) {
Suharsh Sivakumar34e2e332014-11-19 16:29:20 -0800117 t.Errorf("ThirdPartyCaveats(%v, invalid): got: %#v, want: %#v", d.caveats, got, d.tpCaveats)
Ankurf044a8d2014-09-05 17:05:24 -0700118 continue
119 }
120 }
121}
122
123func init() {
Todd Wang34ed4c62014-11-26 15:15:52 -0800124 vdlutil.Register(&fpCaveat{})
125 vdlutil.Register(&tpCaveat{})
Ankurf044a8d2014-09-05 17:05:24 -0700126}