Tilak Sharma | d6ade0e | 2014-08-20 16:28:32 -0700 | [diff] [blame] | 1 | package security |
| 2 | |
| 3 | import ( |
| 4 | "bytes" |
Ankur | 021e38e | 2014-09-26 10:26:45 -0700 | [diff] [blame] | 5 | "crypto/ecdsa" |
| 6 | "crypto/elliptic" |
| 7 | "crypto/rand" |
Tilak Sharma | d6ade0e | 2014-08-20 16:28:32 -0700 | [diff] [blame] | 8 | "reflect" |
| 9 | "testing" |
| 10 | |
Jiri Simsa | 519c507 | 2014-09-17 21:37:57 -0700 | [diff] [blame] | 11 | "veyron.io/veyron/veyron2/security" |
Todd Wang | 34ed4c6 | 2014-11-26 15:15:52 -0800 | [diff] [blame] | 12 | "veyron.io/veyron/veyron2/vdl/vdlutil" |
Tilak Sharma | d6ade0e | 2014-08-20 16:28:32 -0700 | [diff] [blame] | 13 | ) |
| 14 | |
Ankur | 021e38e | 2014-09-26 10:26:45 -0700 | [diff] [blame] | 15 | func 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 |
Ankur | 73e7a93 | 2014-10-24 15:57:03 -0700 | [diff] [blame] | 22 | if err := SavePEMKey(&buf, key, nil); err != nil { |
Ankur | 021e38e | 2014-09-26 10:26:45 -0700 | [diff] [blame] | 23 | t.Fatalf("Failed to save ECDSA private key: %v", err) |
| 24 | } |
| 25 | |
Ankur | 73e7a93 | 2014-10-24 15:57:03 -0700 | [diff] [blame] | 26 | loadedKey, err := LoadPEMKey(&buf, nil) |
Suharsh Sivakumar | 0f35904 | 2014-10-01 22:53:45 -0700 | [diff] [blame] | 27 | if !reflect.DeepEqual(loadedKey, key) { |
| 28 | t.Fatalf("Got key %v, but want %v", loadedKey, key) |
| 29 | } |
| 30 | } |
| 31 | |
Suharsh Sivakumar | aca1c32 | 2014-10-21 11:27:32 -0700 | [diff] [blame] | 32 | func TestLoadSavePEMKeyWithPassphrase(t *testing.T) { |
Suharsh Sivakumar | 0f35904 | 2014-10-01 22:53:45 -0700 | [diff] [blame] | 33 | pass := []byte("openSesame") |
Suharsh Sivakumar | aca1c32 | 2014-10-21 11:27:32 -0700 | [diff] [blame] | 34 | incorrect_pass := []byte("wrongPassphrase") |
Suharsh Sivakumar | 0f35904 | 2014-10-01 22:53:45 -0700 | [diff] [blame] | 35 | 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 Sivakumar | aca1c32 | 2014-10-21 11:27:32 -0700 | [diff] [blame] | 40 | |
| 41 | // Test incorrect passphrase. |
Ankur | 73e7a93 | 2014-10-24 15:57:03 -0700 | [diff] [blame] | 42 | if err := SavePEMKey(&buf, key, pass); err != nil { |
Suharsh Sivakumar | 0f35904 | 2014-10-01 22:53:45 -0700 | [diff] [blame] | 43 | t.Fatalf("Failed to save ECDSA private key: %v", err) |
| 44 | } |
Ankur | 73e7a93 | 2014-10-24 15:57:03 -0700 | [diff] [blame] | 45 | loadedKey, err := LoadPEMKey(&buf, incorrect_pass) |
Suharsh Sivakumar | 6ceb430 | 2014-10-23 15:33:17 -0700 | [diff] [blame] | 46 | if loadedKey != nil && err != nil { |
| 47 | t.Errorf("expected (nil, err != nil) received (%v,%v)", loadedKey, err) |
Suharsh Sivakumar | 0f35904 | 2014-10-01 22:53:45 -0700 | [diff] [blame] | 48 | } |
| 49 | |
| 50 | // Test correct password. |
Ankur | 73e7a93 | 2014-10-24 15:57:03 -0700 | [diff] [blame] | 51 | if err := SavePEMKey(&buf, key, pass); err != nil { |
Suharsh Sivakumar | 0f35904 | 2014-10-01 22:53:45 -0700 | [diff] [blame] | 52 | t.Fatalf("Failed to save ECDSA private key: %v", err) |
| 53 | } |
Ankur | 73e7a93 | 2014-10-24 15:57:03 -0700 | [diff] [blame] | 54 | loadedKey, err = LoadPEMKey(&buf, pass) |
Ankur | 021e38e | 2014-09-26 10:26:45 -0700 | [diff] [blame] | 55 | if !reflect.DeepEqual(loadedKey, key) { |
| 56 | t.Fatalf("Got key %v, but want %v", loadedKey, key) |
| 57 | } |
Suharsh Sivakumar | aca1c32 | 2014-10-21 11:27:32 -0700 | [diff] [blame] | 58 | |
| 59 | // Test nil passphrase. |
Ankur | 73e7a93 | 2014-10-24 15:57:03 -0700 | [diff] [blame] | 60 | if err := SavePEMKey(&buf, key, pass); err != nil { |
Suharsh Sivakumar | aca1c32 | 2014-10-21 11:27:32 -0700 | [diff] [blame] | 61 | t.Fatalf("Failed to save ECDSA private key: %v", err) |
| 62 | } |
Ankur | 73e7a93 | 2014-10-24 15:57:03 -0700 | [diff] [blame] | 63 | if loadedKey, err = LoadPEMKey(&buf, nil); loadedKey != nil || err != PassphraseErr { |
Suharsh Sivakumar | 4684f4e | 2014-10-24 13:42:06 -0700 | [diff] [blame] | 64 | t.Fatalf("expected(nil, PassphraseError), instead got (%v, %v)", loadedKey, err) |
Suharsh Sivakumar | aca1c32 | 2014-10-21 11:27:32 -0700 | [diff] [blame] | 65 | } |
Ankur | 021e38e | 2014-09-26 10:26:45 -0700 | [diff] [blame] | 66 | } |
| 67 | |
Ankur | f044a8d | 2014-09-05 17:05:24 -0700 | [diff] [blame] | 68 | // fpCaveat implements security.CaveatValidator. |
| 69 | type fpCaveat struct{} |
| 70 | |
| 71 | func (fpCaveat) Validate(security.Context) error { return nil } |
| 72 | |
| 73 | // tpCaveat implements security.ThirdPartyCaveat. |
| 74 | type tpCaveat struct{} |
| 75 | |
| 76 | func (tpCaveat) Validate(security.Context) (err error) { return } |
| 77 | func (tpCaveat) ID() (id string) { return } |
| 78 | func (tpCaveat) Location() (loc string) { return } |
| 79 | func (tpCaveat) Requirements() (r security.ThirdPartyRequirements) { return } |
Ankur | 0af4d3b | 2014-09-29 17:05:21 -0700 | [diff] [blame] | 80 | func (tpCaveat) Dischargeable(security.Context) (err error) { return } |
Ankur | f044a8d | 2014-09-05 17:05:24 -0700 | [diff] [blame] | 81 | |
| 82 | func TestCaveatUtil(t *testing.T) { |
Asim Shankar | bb0f0c1 | 2014-09-09 13:32:28 -0700 | [diff] [blame] | 83 | type C []security.Caveat |
| 84 | type V []security.CaveatValidator |
| 85 | type TP []security.ThirdPartyCaveat |
Ankur | f044a8d | 2014-09-05 17:05:24 -0700 | [diff] [blame] | 86 | |
Asim Shankar | bb0f0c1 | 2014-09-09 13:32:28 -0700 | [diff] [blame] | 87 | newCaveat := func(v security.CaveatValidator) security.Caveat { |
| 88 | c, err := security.NewCaveat(v) |
Ankur | f044a8d | 2014-09-05 17:05:24 -0700 | [diff] [blame] | 89 | if err != nil { |
Asim Shankar | bb0f0c1 | 2014-09-09 13:32:28 -0700 | [diff] [blame] | 90 | t.Fatalf("failed to create Caveat from validator %T: %v", v, c) |
Ankur | f044a8d | 2014-09-05 17:05:24 -0700 | [diff] [blame] | 91 | } |
Asim Shankar | bb0f0c1 | 2014-09-09 13:32:28 -0700 | [diff] [blame] | 92 | return c |
Ankur | f044a8d | 2014-09-05 17:05:24 -0700 | [diff] [blame] | 93 | } |
Asim Shankar | bb0f0c1 | 2014-09-09 13:32:28 -0700 | [diff] [blame] | 94 | |
Ankur | f044a8d | 2014-09-05 17:05:24 -0700 | [diff] [blame] | 95 | var ( |
Asim Shankar | bb0f0c1 | 2014-09-09 13:32:28 -0700 | [diff] [blame] | 96 | fp fpCaveat |
| 97 | tp tpCaveat |
| 98 | invalid = security.Caveat{ValidatorVOM: []byte("invalid")} |
Ankur | f044a8d | 2014-09-05 17:05:24 -0700 | [diff] [blame] | 99 | ) |
| 100 | testdata := []struct { |
Asim Shankar | bb0f0c1 | 2014-09-09 13:32:28 -0700 | [diff] [blame] | 101 | caveats []security.Caveat |
Ankur | f044a8d | 2014-09-05 17:05:24 -0700 | [diff] [blame] | 102 | validators []security.CaveatValidator |
| 103 | tpCaveats []security.ThirdPartyCaveat |
| 104 | }{ |
| 105 | {nil, nil, nil}, |
Asim Shankar | bb0f0c1 | 2014-09-09 13:32:28 -0700 | [diff] [blame] | 106 | {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}}, |
Ankur | f044a8d | 2014-09-05 17:05:24 -0700 | [diff] [blame] | 109 | } |
Suharsh Sivakumar | 34e2e33 | 2014-11-19 16:29:20 -0800 | [diff] [blame] | 110 | for _, d := range testdata { |
Ankur | f044a8d | 2014-09-05 17:05:24 -0700 | [diff] [blame] | 111 | // 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 Sivakumar | 34e2e33 | 2014-11-19 16:29:20 -0800 | [diff] [blame] | 117 | t.Errorf("ThirdPartyCaveats(%v, invalid): got: %#v, want: %#v", d.caveats, got, d.tpCaveats) |
Ankur | f044a8d | 2014-09-05 17:05:24 -0700 | [diff] [blame] | 118 | continue |
| 119 | } |
| 120 | } |
| 121 | } |
| 122 | |
| 123 | func init() { |
Todd Wang | 34ed4c6 | 2014-11-26 15:15:52 -0800 | [diff] [blame] | 124 | vdlutil.Register(&fpCaveat{}) |
| 125 | vdlutil.Register(&tpCaveat{}) |
Ankur | f044a8d | 2014-09-05 17:05:24 -0700 | [diff] [blame] | 126 | } |