veyron/security/agent: Make the agent a pricipal.
* The private key for the principal will have to be in a file named
privatekey.pem located in the directory VEYRON_CREDENTIALS.
* Agent server will have a underlying pricipal.
* Agent client makes rpcs to server to act as a principal.
Change-Id: I29d69c0bfbae4ef3c7530f6a4636b304d56c9cf3
diff --git a/runtimes/google/rt/sectransition/test.sh b/runtimes/google/rt/sectransition/test.sh
index b1ddf61..242da08 100755
--- a/runtimes/google/rt/sectransition/test.sh
+++ b/runtimes/google/rt/sectransition/test.sh
@@ -102,4 +102,4 @@
shell_test::pass
}
-main "$@"
+main "$@"
\ No newline at end of file
diff --git a/runtimes/google/rt/security.go b/runtimes/google/rt/security.go
index fb9935b..9295625 100644
--- a/runtimes/google/rt/security.go
+++ b/runtimes/google/rt/security.go
@@ -52,46 +52,29 @@
if rt.principal != nil {
return nil
}
- // TODO(ataly, ashankar): Check if agent environment variables are
- // specified and if so initialize principal from agent.
var err error
- if dir := os.Getenv(VeyronCredentialsEnvVar); len(dir) > 0 {
+ if len(os.Getenv(agent.FdVarName)) > 0 {
+ rt.principal, err = rt.connectToAgent()
+ return err
+ } else if dir := os.Getenv(VeyronCredentialsEnvVar); len(dir) > 0 {
// TODO(ataly, ashankar): If multiple runtimes are getting
// initialized at the same time from the same VEYRON_CREDENTIALS
// we will need some kind of locking for the credential files.
- existed := true
if rt.principal, err = vsecurity.LoadPersistentPrincipal(dir, nil); err != nil {
- existed = false
- if rt.principal, err = vsecurity.CreatePersistentPrincipal(dir, nil); err != nil {
- return err
+ if os.IsNotExist(err) {
+ if rt.principal, err = vsecurity.CreatePersistentPrincipal(dir, nil); err != nil {
+ return err
+ }
+ return vsecurity.InitDefaultBlessings(rt.principal, defaultBlessingName())
}
- }
- if !existed {
- return initDefaultBlessings(rt.principal)
+ return err
}
return nil
}
if rt.principal, err = vsecurity.NewPrincipal(); err != nil {
return err
}
- return initDefaultBlessings(rt.principal)
-}
-
-func initDefaultBlessings(p security.Principal) error {
- blessing, err := p.BlessSelf(defaultBlessingName())
- if err != nil {
- return err
- }
- if err := p.BlessingStore().SetDefault(blessing); err != nil {
- return err
- }
- if _, err := p.BlessingStore().Set(blessing, security.AllPrincipals); err != nil {
- return err
- }
- if err := p.AddToRoots(blessing); err != nil {
- return err
- }
- return nil
+ return vsecurity.InitDefaultBlessings(rt.principal, defaultBlessingName())
}
// TODO(ataly, ashankar): Get rid of this method once we get rid of
@@ -122,10 +105,7 @@
return nil
}
var err error
- if len(os.Getenv(agent.FdVarName)) > 0 {
- rt.id, err = rt.connectToAgent()
- return err
- } else if file := os.Getenv("VEYRON_IDENTITY"); len(file) > 0 {
+ if file := os.Getenv("VEYRON_IDENTITY"); len(file) > 0 {
if rt.id, err = loadIdentityFromFile(file); err != nil || rt.id == nil {
return fmt.Errorf("Could not load identity from the VEYRON_IDENTITY environment variable (%q): %v", file, err)
}
@@ -186,7 +166,7 @@
return vsecurity.LoadIdentity(f, hack)
}
-func (rt *vrt) connectToAgent() (security.PrivateID, error) {
+func (rt *vrt) connectToAgent() (security.Principal, error) {
client, err := rt.NewClient(options.VCSecurityNone)
if err != nil {
return nil, err
@@ -195,9 +175,5 @@
if err != nil {
return nil, err
}
- signer, err := agent.NewAgentSigner(client, fd, rt.NewContext())
- if err != nil {
- return nil, err
- }
- return isecurity.NewPrivateID("selfSigned", signer)
+ return agent.NewAgentPrincipal(client, fd, rt.NewContext())
}
diff --git a/security/agent/agent_test.go b/security/agent/agent_test.go
index 524a964..d3a0b39 100644
--- a/security/agent/agent_test.go
+++ b/security/agent/agent_test.go
@@ -4,85 +4,297 @@
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
- "os"
+ "errors"
"reflect"
"testing"
- "veyron.io/veyron/veyron2/options"
- "veyron.io/veyron/veyron2/rt"
- "veyron.io/veyron/veyron2/security"
-
_ "veyron.io/veyron/veyron/profiles"
"veyron.io/veyron/veyron/security/agent"
"veyron.io/veyron/veyron/security/agent/server"
+
+ "veyron.io/veyron/veyron2/options"
+ "veyron.io/veyron/veyron2/rt"
+ "veyron.io/veyron/veyron2/security"
)
-type fakesigner struct {
- key security.PublicKey
-}
-
-type testdata struct {
- server_conn os.File
- agent security.Signer
- signer fakesigner
-}
-
-func setup() *testdata {
+func setupAgent(t *testing.T, p security.Principal) security.Principal {
runtime := rt.Init()
- result := &testdata{signer: newFakeSigner()}
- sock, err := server.RunAnonymousAgent(runtime, result.signer)
+ sock, err := server.RunAnonymousAgent(runtime, p)
if err != nil {
- panic(err)
+ t.Fatal(err)
}
defer sock.Close()
client, err := runtime.NewClient(options.VCSecurityNone)
if err != nil {
- panic(err)
+ t.Fatal(err)
}
- if agent, err := agent.NewAgentSigner(client, int(sock.Fd()), runtime.NewContext()); err == nil {
- result.agent = agent
- return result
- } else {
- panic(err)
+ var agentP security.Principal
+ if agentP, err = agent.NewAgentPrincipal(client, int(sock.Fd()), runtime.NewContext()); err != nil {
+ t.Fatal(err)
+ }
+ return agentP
+}
+
+type testInfo struct {
+ Method string
+ Args V
+ Result interface{} // Result returned by the Method call.
+ Error error // If Error is not nil will be compared to the last result.
+}
+
+var addToRootsErr = errors.New("AddToRoots")
+var storeSetDefaultErr = errors.New("StoreSetDefault")
+var rootsAddErr = errors.New("RootsAdd")
+var rootsRecognizedErr = errors.New("RootsRecognized")
+
+func TestAgent(t *testing.T) {
+ var (
+ thirdPartyCaveat, discharge = newThirdPartyCaveatAndDischarge(t)
+ mockP = newMockPrincipal()
+ agent = setupAgent(t, mockP)
+ )
+ tests := []testInfo{
+ {"BlessSelf", V{"self"}, newBlessing(t, "blessing"), nil},
+ {"Bless", V{newPrincipal(t).PublicKey(), newBlessing(t, "root"), "extension", security.UnconstrainedUse()}, newBlessing(t, "root/extension"), nil},
+ {"Sign", V{make([]byte, 10)}, security.Signature{R: []byte{1}, S: []byte{1}}, nil},
+ {"MintDischarge", V{thirdPartyCaveat, security.UnconstrainedUse()}, discharge, nil},
+ {"PublicKey", V{}, mockP.PublicKey(), nil},
+ {"AddToRoots", V{newBlessing(t, "blessing")}, nil, addToRootsErr},
+ }
+ for _, test := range tests {
+ mockP.NextResult = test.Result
+ mockP.NextError = test.Error
+ runTest(t, agent, test)
+ }
+
+ store := agent.BlessingStore()
+ storeTests := []testInfo{
+ {"Set", V{newBlessing(t, "blessing"), security.BlessingPattern("test")}, newBlessing(t, "root/extension"), nil},
+ {"ForPeer", V{"test", "oink"}, newBlessing(t, "for/peer"), nil},
+ {"SetDefault", V{newBlessing(t, "blessing")}, nil, storeSetDefaultErr},
+ {"Default", V{}, newBlessing(t, "root/extension"), nil},
+ {"PublicKey", V{}, mockP.PublicKey(), nil},
+ {"DebugString", V{}, "StoreString", nil},
+ }
+ for _, test := range storeTests {
+ mockP.MockStore.NextResult = test.Result
+ mockP.MockStore.NextError = test.Error
+ runTest(t, store, test)
+ }
+
+ roots := agent.Roots()
+ rootTests := []testInfo{
+ {"Add", V{newPrincipal(t).PublicKey(), security.BlessingPattern("test")}, nil, rootsAddErr},
+ {"Recognized", V{newPrincipal(t).PublicKey(), "blessing"}, nil, rootsRecognizedErr},
+ {"DebugString", V{}, "RootsString", nil},
+ }
+ for _, test := range rootTests {
+ mockP.MockRoots.NextResult = test.Result
+ mockP.MockRoots.NextError = test.Error
+ runTest(t, roots, test)
}
}
-func TestSignature(t *testing.T) {
- td := setup()
- sig, err := td.agent.Sign(nil, []byte("abc"))
-
+func runTest(t *testing.T, receiver interface{}, test testInfo) {
+ results, err := call(receiver, test.Method, test.Args)
if err != nil {
- t.Error(err)
+ t.Errorf("failed to invoke p.%v(%#v): %v", test.Method, test.Args, err)
+ return
}
- expected := security.Signature{R: []byte{6}, S: []byte{7}}
- if !reflect.DeepEqual(sig, expected) {
- t.Errorf("Bad signature. Got\n%#v\nExpected:\n%#v", sig, expected)
+ // We only set the error value when error is the only output to ensure the real function gets called.
+ if test.Error != nil {
+ if got := results[len(results)-1]; got == nil || got.(error).Error() != test.Error.Error() {
+ t.Errorf("p.%v(%#v) returned an incorrect error: %v, expected %v", test.Method, test.Args, got, test.Error)
+ }
+ if len(results) == 1 {
+ return
+ }
+ }
+ if got := results[0]; !reflect.DeepEqual(got, test.Result) {
+ t.Errorf("p.%v(%#v) returned %v(%T) want %v(%T)", test.Method, test.Args, got, got, test.Result, test.Result)
}
}
-func TestPublicKey(t *testing.T) {
- td := setup()
- expected_key := td.signer.PublicKey()
- agent_key := td.agent.PublicKey()
- if !reflect.DeepEqual(expected_key, agent_key) {
- t.Errorf("Different keys: %v, %v", expected_key, agent_key)
- }
-}
-
-func newFakeSigner() fakesigner {
+func newMockPrincipal() *mockPrincipal {
key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
panic(err)
}
- return fakesigner{security.NewECDSAPublicKey(&key.PublicKey)}
+ pkey := security.NewECDSAPublicKey(&key.PublicKey)
+ return &mockPrincipal{
+ Key: pkey,
+ MockStore: &mockBlessingStore{Key: pkey},
+ MockRoots: &mockBlessingRoots{},
+ }
}
-func (fakesigner) Sign(message []byte) (security.Signature, error) {
- var sig security.Signature
- sig.R, sig.S = []byte{6}, []byte{7}
- return sig, nil
+type mockPrincipal struct {
+ NextError error
+ NextResult interface{}
+ Key security.PublicKey
+ MockStore *mockBlessingStore
+ MockRoots *mockBlessingRoots
}
-func (s fakesigner) PublicKey() security.PublicKey {
- return s.key
+func (p *mockPrincipal) reset() {
+ p.NextError = nil
+ p.NextResult = nil
+}
+
+func (p *mockPrincipal) Bless(security.PublicKey, security.Blessings, string, security.Caveat, ...security.Caveat) (security.Blessings, error) {
+ defer p.reset()
+ b, _ := p.NextResult.(security.Blessings)
+ return b, p.NextError
+}
+
+func (p *mockPrincipal) BlessSelf(string, ...security.Caveat) (security.Blessings, error) {
+ defer p.reset()
+ b, _ := p.NextResult.(security.Blessings)
+ return b, p.NextError
+}
+
+func (p *mockPrincipal) Sign([]byte) (sig security.Signature, err error) {
+ defer p.reset()
+ sig, _ = p.NextResult.(security.Signature)
+ err = p.NextError
+ return
+}
+
+func (p *mockPrincipal) MintDischarge(security.ThirdPartyCaveat, security.Caveat, ...security.Caveat) (security.Discharge, error) {
+ defer p.reset()
+ d, _ := p.NextResult.(security.Discharge)
+ return d, p.NextError
+}
+
+func (p *mockPrincipal) PublicKey() security.PublicKey { return p.Key }
+func (p *mockPrincipal) Roots() security.BlessingRoots { return p.MockRoots }
+func (p *mockPrincipal) BlessingStore() security.BlessingStore { return p.MockStore }
+func (p *mockPrincipal) AddToRoots(b security.Blessings) error {
+ defer p.reset()
+ return p.NextError
+}
+
+type mockBlessingStore struct {
+ NextError error
+ NextResult interface{}
+ Key security.PublicKey
+}
+
+func (s *mockBlessingStore) reset() {
+ s.NextError = nil
+ s.NextResult = nil
+}
+
+func (s *mockBlessingStore) Set(security.Blessings, security.BlessingPattern) (security.Blessings, error) {
+ defer s.reset()
+ b, _ := s.NextResult.(security.Blessings)
+ return b, s.NextError
+}
+
+func (s *mockBlessingStore) ForPeer(...string) security.Blessings {
+ defer s.reset()
+ b, _ := s.NextResult.(security.Blessings)
+ return b
+}
+
+func (s *mockBlessingStore) SetDefault(security.Blessings) error {
+ defer s.reset()
+ return s.NextError
+}
+
+func (s *mockBlessingStore) Default() security.Blessings {
+ defer s.reset()
+ b, _ := s.NextResult.(security.Blessings)
+ return b
+}
+
+func (s *mockBlessingStore) PublicKey() security.PublicKey { return s.Key }
+
+func (s *mockBlessingStore) DebugString() string {
+ defer s.reset()
+ return s.NextResult.(string)
+}
+
+type mockBlessingRoots struct {
+ NextError error
+ NextResult interface{}
+}
+
+func (r *mockBlessingRoots) reset() {
+ r.NextError = nil
+ r.NextResult = nil
+}
+
+func (r *mockBlessingRoots) Add(security.PublicKey, security.BlessingPattern) error {
+ defer r.reset()
+ return r.NextError
+}
+
+func (r *mockBlessingRoots) Recognized(security.PublicKey, string) error {
+ defer r.reset()
+ return r.NextError
+}
+
+func (r *mockBlessingRoots) DebugString() string {
+ defer r.reset()
+ return r.NextResult.(string)
+}
+
+type V []interface{}
+
+func call(receiver interface{}, method string, args V) (results []interface{}, err interface{}) {
+ defer func() {
+ err = recover()
+ }()
+ callargs := make([]reflect.Value, len(args))
+ for idx, arg := range args {
+ callargs[idx] = reflect.ValueOf(arg)
+ }
+ callresults := reflect.ValueOf(receiver).MethodByName(method).Call(callargs)
+ results = make([]interface{}, len(callresults))
+ for idx, res := range callresults {
+ results[idx] = res.Interface()
+ }
+ return
+}
+
+func newPrincipal(t *testing.T) security.Principal {
+ key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
+ if err != nil {
+ t.Fatal(err)
+ }
+ signer := security.NewInMemoryECDSASigner(key)
+ p, err := security.CreatePrincipal(signer, nil, nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+ return p
+}
+
+func newCaveat(c security.Caveat, err error) security.Caveat {
+ if err != nil {
+ panic(err)
+ }
+ return c
+}
+
+func newBlessing(t *testing.T, name string) security.Blessings {
+ b, err := newPrincipal(t).BlessSelf(name)
+ if err != nil {
+ t.Fatal(err)
+ }
+ return b
+}
+
+func newThirdPartyCaveatAndDischarge(t *testing.T) (security.ThirdPartyCaveat, security.Discharge) {
+ p := newPrincipal(t)
+ c, err := security.NewPublicKeyCaveat(p.PublicKey(), "location", security.ThirdPartyRequirements{}, newCaveat(security.MethodCaveat("method")))
+ if err != nil {
+ t.Fatal(err)
+ }
+ d, err := p.MintDischarge(c, security.UnconstrainedUse())
+ if err != nil {
+ t.Fatal(err)
+ }
+ return c, d
}
diff --git a/security/agent/agentd/main.go b/security/agent/agentd/main.go
index bcabd77..569032d 100644
--- a/security/agent/agentd/main.go
+++ b/security/agent/agentd/main.go
@@ -21,18 +21,16 @@
flag.Usage = func() {
fmt.Fprintf(os.Stderr, `Usage: %s [agent options] command command_args...
-Loads the private key specified in under privatekey.pem in VEYRON_AGENT into memory, then
+Loads the private key specified in under privatekey.pem in VEYRON_CREDENTIALS into memory, then
starts the specified command with access to the private key via the
agent protocol instead of directly reading from disk.
`, os.Args[0])
flag.PrintDefaults()
}
- // TODO(suharshs): Switch to "VEYRON_CREDENTIALS" after agent is a principal.
- // This will be the end of the old sec model here. Also change the comment above.
- dir := os.Getenv("VEYRON_AGENT")
+ dir := os.Getenv("VEYRON_CREDENTIALS")
if len(dir) == 0 {
- vlog.Fatal("VEYRON_AGENT must be set to directory")
+ vlog.Fatal("VEYRON_CREDENTIALS must be set to directory")
}
p, err := newPrincipalFromDir(dir)
@@ -96,7 +94,11 @@
return nil, fmt.Errorf("failed to read passphrase: %v", err)
}
p, err := vsecurity.CreatePersistentPrincipal(dir, []byte(pass))
- return p, err
+ if err != nil {
+ return nil, err
+ }
+ vsecurity.InitDefaultBlessings(p, "agent_principal")
+ return p, nil
}
func handlePassphrase(dir string) (security.Principal, error) {
diff --git a/security/agent/client.go b/security/agent/client.go
index e3bbfbd..f162452 100644
--- a/security/agent/client.go
+++ b/security/agent/client.go
@@ -12,7 +12,8 @@
"veyron.io/veyron/veyron2/ipc"
"veyron.io/veyron/veyron2/naming"
"veyron.io/veyron/veyron2/security"
- "veyron.io/veyron/veyron2/security/wire"
+ "veyron.io/veyron/veyron2/vdl/vdlutil"
+ "veyron.io/veyron/veyron2/vlog"
)
// FdVarName is the name of the environment variable containing
@@ -20,27 +21,39 @@
const FdVarName = "VEYRON_AGENT_FD"
type client struct {
- client ipc.Client
- name string
- ctx context.T
+ caller caller
key security.PublicKey
}
-func (c *client) call(name string, result interface{}, args ...interface{}) (err error) {
+type caller struct {
+ client ipc.Client
+ name string
+ ctx context.T
+}
+
+func (c *caller) call(name string, results []interface{}, args ...interface{}) (err error) {
var call ipc.Call
+ results = append(results, &err)
if call, err = c.client.StartCall(c.ctx, c.name, name, args); err == nil {
- if ierr := call.Finish(result, &err); ierr != nil {
+ if ierr := call.Finish(results...); ierr != nil {
err = ierr
}
}
return
}
-// NewAgentSigner returns a Signer using the PrivateKey held in a remote agent process.
+func results(inputs ...interface{}) []interface{} {
+ if len(inputs) > 0 {
+ return inputs
+ }
+ return make([]interface{}, 0)
+}
+
+// NewAgentPrincipal returns a security.Pricipal using the PrivateKey held in a remote agent process.
// 'fd' is the socket for connecting to the agent, typically obtained from
// os.GetEnv(agent.FdVarName).
// 'ctx' should not have a deadline, and should never be cancelled.
-func NewAgentSigner(c ipc.Client, fd int, ctx context.T) (security.Signer, error) {
+func NewAgentPrincipal(c ipc.Client, fd int, ctx context.T) (security.Principal, error) {
conn, err := net.FileConn(os.NewFile(uintptr(fd), "agent_client"))
if err != nil {
return nil, err
@@ -51,7 +64,13 @@
if err != nil {
return nil, err
}
- agent := &client{c, naming.JoinAddressName(naming.FormatEndpoint(addr.Network(), addr.String()), ""), ctx, nil}
+ caller := caller{
+ client: c,
+ name: naming.JoinAddressName(naming.FormatEndpoint(addr.Network(), addr.String()), ""),
+ ctx: ctx,
+ }
+
+ agent := &client{caller: caller}
if err := agent.fetchPublicKey(); err != nil {
return nil, err
}
@@ -59,23 +78,152 @@
}
func (c *client) fetchPublicKey() (err error) {
- var key wire.PublicKey
- if err = c.call("PublicKey", &key); err != nil {
+ var b []byte
+ if err = c.caller.call("PublicKey", results(&b)); err != nil {
return
}
- c.key, err = key.Decode()
+ c.key, err = security.UnmarshalPublicKey(b)
return
}
+func (c *client) Bless(key security.PublicKey, with security.Blessings, extension string, caveat security.Caveat, additionalCaveats ...security.Caveat) (security.Blessings, error) {
+ var blessings security.WireBlessings
+ marshalledKey, err := key.MarshalBinary()
+ if err != nil {
+ return nil, err
+ }
+ err = c.caller.call("Bless", results(&blessings), marshalledKey, security.MarshalBlessings(with), extension, caveat, additionalCaveats)
+ if err != nil {
+ return nil, err
+ }
+ return security.NewBlessings(blessings)
+}
+
+func (c *client) BlessSelf(name string, caveats ...security.Caveat) (security.Blessings, error) {
+ var blessings security.WireBlessings
+ err := c.caller.call("BlessSelf", results(&blessings), name, caveats)
+ if err != nil {
+ return nil, err
+ }
+ return security.NewBlessings(blessings)
+}
+
+func (c *client) Sign(message []byte) (sig security.Signature, err error) {
+ err = c.caller.call("Sign", results(&sig), message)
+ return
+}
+
+func (c *client) MintDischarge(tp security.ThirdPartyCaveat, caveat security.Caveat, additionalCaveats ...security.Caveat) (security.Discharge, error) {
+ var discharge security.Discharge
+ err := c.caller.call("MintDischarge", results(&discharge), vdlutil.Any(tp), caveat, additionalCaveats)
+ if err != nil {
+ return nil, err
+ }
+ return discharge, nil
+}
+
func (c *client) PublicKey() security.PublicKey {
return c.key
}
-func (c *client) Sign(purpose, message []byte) (sig security.Signature, err error) {
- if purpose != nil {
- err = fmt.Errorf("purpose not supported")
- return
+func (c *client) BlessingStore() security.BlessingStore {
+ return &blessingStore{c.caller, c.key}
+}
+
+func (c *client) Roots() security.BlessingRoots {
+ return &blessingRoots{c.caller}
+}
+
+func (c *client) AddToRoots(blessings security.Blessings) error {
+ return c.caller.call("AddToRoots", results(), security.MarshalBlessings(blessings))
+}
+
+type blessingStore struct {
+ caller caller
+ key security.PublicKey
+}
+
+func (b *blessingStore) Set(blessings security.Blessings, forPeers security.BlessingPattern) (security.Blessings, error) {
+ var resultBlessings security.WireBlessings
+ err := b.caller.call("BlessingStoreSet", results(&resultBlessings), security.MarshalBlessings(blessings), forPeers)
+ if err != nil {
+ return nil, err
}
- err = c.call("Sign", &sig, message)
+ return security.NewBlessings(resultBlessings)
+}
+
+func (b *blessingStore) ForPeer(peerBlessings ...string) security.Blessings {
+ var resultBlessings security.WireBlessings
+ err := b.caller.call("BlessingStoreForPeer", results(&resultBlessings), peerBlessings)
+ if err != nil {
+ vlog.Errorf("error calling BlessingStoreForPeer: %v", err)
+ return nil
+ }
+ blessings, err := security.NewBlessings(resultBlessings)
+ if err != nil {
+ vlog.Errorf("error creating Blessings from WireBlessings: %v", err)
+ return nil
+ }
+ return blessings
+}
+
+func (b *blessingStore) SetDefault(blessings security.Blessings) error {
+ return b.caller.call("BlessingStoreSetDefault", results(), security.MarshalBlessings(blessings))
+}
+
+func (b *blessingStore) Default() security.Blessings {
+ var resultBlessings security.WireBlessings
+ err := b.caller.call("BlessingStoreDefault", results(&resultBlessings))
+ if err != nil {
+ vlog.Errorf("error calling BlessingStoreDefault: %v", err)
+ return nil
+ }
+ blessings, err := security.NewBlessings(resultBlessings)
+ if err != nil {
+ vlog.Errorf("error creating Blessing from WireBlessings: %v", err)
+ return nil
+ }
+ return blessings
+}
+
+func (b *blessingStore) PublicKey() security.PublicKey {
+ return b.key
+}
+
+func (b *blessingStore) DebugString() (s string) {
+ err := b.caller.call("BlessingStoreDebugString", results(&s))
+ if err != nil {
+ s = fmt.Sprintf("error calling BlessingStoreDebugString: %v", err)
+ vlog.Errorf(s)
+ }
+ return
+}
+
+type blessingRoots struct {
+ caller caller
+}
+
+func (b *blessingRoots) Add(root security.PublicKey, pattern security.BlessingPattern) error {
+ marshalledKey, err := root.MarshalBinary()
+ if err != nil {
+ return err
+ }
+ return b.caller.call("BlessingRootsAdd", results(), marshalledKey, pattern)
+}
+
+func (b *blessingRoots) Recognized(root security.PublicKey, blessing string) error {
+ marshalledKey, err := root.MarshalBinary()
+ if err != nil {
+ return err
+ }
+ return b.caller.call("BlessingRootsAdd", results(), marshalledKey, blessing)
+}
+
+func (b *blessingRoots) DebugString() (s string) {
+ err := b.caller.call("BlessingRootsDebugString", results(&s))
+ if err != nil {
+ s = fmt.Sprintf("error calling BlessingRootsDebugString: %v", err)
+ vlog.Errorf(s)
+ }
return
}
diff --git a/security/agent/server/server.go b/security/agent/server/server.go
index 8bfa762..63aeeb3 100644
--- a/security/agent/server/server.go
+++ b/security/agent/server/server.go
@@ -11,6 +11,7 @@
package server
import (
+ "fmt"
"io"
"os"
@@ -19,26 +20,19 @@
"veyron.io/veyron/veyron2/ipc"
"veyron.io/veyron/veyron2/options"
"veyron.io/veyron/veyron2/security"
- "veyron.io/veyron/veyron2/security/wire"
+ "veyron.io/veyron/veyron2/vdl/vdlutil"
"veyron.io/veyron/veyron2/vlog"
)
-// TODO(suharshs): Remove this when replaced with principal. This is just temporary to
-// avoid having to implement a bunch of principal methods that aren't being used yet.
-type Signer interface {
- Sign(message []byte) (security.Signature, error)
- PublicKey() security.PublicKey
-}
-
type agentd struct {
- signer Signer
+ principal security.Principal
}
// RunAnonymousAgent starts the agent server listening on an
// anonymous unix domain socket. It will respond to SignatureRequests
-// using 'signer'.
+// using 'principal'.
// The returned 'client' is typically passed via cmd.ExtraFiles to a child process.
-func RunAnonymousAgent(runtime veyron2.Runtime, signer Signer) (client *os.File, err error) {
+func RunAnonymousAgent(runtime veyron2.Runtime, principal security.Principal) (client *os.File, err error) {
// VCSecurityNone is safe since we're using anonymous unix sockets.
// Only our child process can possibly communicate on the socket.
s, err := runtime.NewServer(options.VCSecurityNone)
@@ -51,7 +45,7 @@
return nil, err
}
- serverAgent := NewServerAgent(agentd{signer})
+ serverAgent := NewServerAgent(agentd{principal})
go func() {
buf := make([]byte, 1)
for {
@@ -74,11 +68,102 @@
return remote, nil
}
-func (a agentd) Sign(_ ipc.ServerContext, message []byte) (security.Signature, error) {
- return a.signer.Sign(message)
+func (a agentd) Bless(_ ipc.ServerContext, key []byte, with security.WireBlessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat) (security.WireBlessings, error) {
+ pkey, err := security.UnmarshalPublicKey(key)
+ if err != nil {
+ return security.WireBlessings{}, err
+ }
+ withBlessings, err := security.NewBlessings(with)
+ if err != nil {
+ return security.WireBlessings{}, err
+ }
+ blessings, err := a.principal.Bless(pkey, withBlessings, extension, caveat, additionalCaveats...)
+ if err != nil {
+ return security.WireBlessings{}, err
+ }
+ return security.MarshalBlessings(blessings), nil
}
-func (a agentd) PublicKey(ipc.ServerContext) (key wire.PublicKey, err error) {
- err = key.Encode(a.signer.PublicKey())
- return
+func (a agentd) BlessSelf(_ ipc.ServerContext, name string, caveats []security.Caveat) (security.WireBlessings, error) {
+ blessings, err := a.principal.BlessSelf(name, caveats...)
+ if err != nil {
+ return security.WireBlessings{}, err
+ }
+ return security.MarshalBlessings(blessings), nil
+}
+
+func (a agentd) Sign(_ ipc.ServerContext, message []byte) (security.Signature, error) {
+ return a.principal.Sign(message)
+}
+
+func (a agentd) MintDischarge(_ ipc.ServerContext, tp vdlutil.Any, caveat security.Caveat, additionalCaveats []security.Caveat) (vdlutil.Any, error) {
+ tpCaveat, ok := tp.(security.ThirdPartyCaveat)
+ if !ok {
+ return nil, fmt.Errorf("provided caveat of type %T does not implement security.ThirdPartyCaveat", tp)
+ }
+ return a.principal.MintDischarge(tpCaveat, caveat, additionalCaveats...)
+}
+
+func (a agentd) PublicKey(_ ipc.ServerContext) ([]byte, error) {
+ return a.principal.PublicKey().MarshalBinary()
+}
+
+func (a agentd) AddToRoots(_ ipc.ServerContext, wireBlessings security.WireBlessings) error {
+ blessings, err := security.NewBlessings(wireBlessings)
+ if err != nil {
+ return err
+ }
+ return a.principal.AddToRoots(blessings)
+}
+
+func (a agentd) BlessingStoreSet(_ ipc.ServerContext, wireBlessings security.WireBlessings, forPeers security.BlessingPattern) (security.WireBlessings, error) {
+ blessings, err := security.NewBlessings(wireBlessings)
+ if err != nil {
+ return security.WireBlessings{}, err
+ }
+ resultBlessings, err := a.principal.BlessingStore().Set(blessings, forPeers)
+ if err != nil {
+ return security.WireBlessings{}, err
+ }
+ return security.MarshalBlessings(resultBlessings), nil
+}
+
+func (a agentd) BlessingStoreForPeer(_ ipc.ServerContext, peerBlessings []string) (security.WireBlessings, error) {
+ return security.MarshalBlessings(a.principal.BlessingStore().ForPeer(peerBlessings...)), nil
+}
+
+func (a agentd) BlessingStoreSetDefault(_ ipc.ServerContext, wireBlessings security.WireBlessings) error {
+ blessings, err := security.NewBlessings(wireBlessings)
+ if err != nil {
+ return err
+ }
+ return a.principal.BlessingStore().SetDefault(blessings)
+}
+
+func (a agentd) BlessingStoreDebugString(_ ipc.ServerContext) (string, error) {
+ return a.principal.BlessingStore().DebugString(), nil
+}
+
+func (a agentd) BlessingStoreDefault(_ ipc.ServerContext) (security.WireBlessings, error) {
+ return security.MarshalBlessings(a.principal.BlessingStore().Default()), nil
+}
+
+func (a agentd) BlessingRootsAdd(_ ipc.ServerContext, root []byte, pattern security.BlessingPattern) error {
+ pkey, err := security.UnmarshalPublicKey(root)
+ if err != nil {
+ return err
+ }
+ return a.principal.Roots().Add(pkey, pattern)
+}
+
+func (a agentd) BlessingRootsRecognized(_ ipc.ServerContext, root []byte, blessing string) error {
+ pkey, err := security.UnmarshalPublicKey(root)
+ if err != nil {
+ return err
+ }
+ return a.principal.Roots().Recognized(pkey, blessing)
+}
+
+func (a agentd) BlessingRootsDebugString(_ ipc.ServerContext) (string, error) {
+ return a.principal.Roots().DebugString(), nil
}
diff --git a/security/agent/server/wire.vdl b/security/agent/server/wire.vdl
index 9d06e4b..6ef6f8e 100644
--- a/security/agent/server/wire.vdl
+++ b/security/agent/server/wire.vdl
@@ -1,11 +1,24 @@
package server
import (
- "veyron.io/veyron/veyron2/security"
- "veyron.io/veyron/veyron2/security/wire"
+ "veyron.io/veyron/veyron2/security"
)
type Agent interface {
- Sign(message []byte) (security.Signature, error)
- PublicKey() (wire.PublicKey, error)
+ Bless(key []byte, wit security.WireBlessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat) (security.WireBlessings, error)
+ BlessSelf(name string, caveats []security.Caveat) (security.WireBlessings, error)
+ Sign(message []byte) (security.Signature, error)
+ MintDischarge(tp any, caveat security.Caveat, additionalCaveats []security.Caveat) (any, error)
+ PublicKey() ([]byte, error)
+ AddToRoots(blessing security.WireBlessings) error
+
+ BlessingStoreSet(blessings security.WireBlessings, forPeers security.BlessingPattern) (security.WireBlessings, error)
+ BlessingStoreForPeer(peerBlessings []string) (security.WireBlessings, error)
+ BlessingStoreSetDefault(blessings security.WireBlessings) error
+ BlessingStoreDefault() (security.WireBlessings, error)
+ BlessingStoreDebugString() (string, error)
+
+ BlessingRootsAdd(root []byte, pattern security.BlessingPattern) error
+ BlessingRootsRecognized(root []byte, blessing string) error
+ BlessingRootsDebugString() (string, error)
}
diff --git a/security/agent/server/wire.vdl.go b/security/agent/server/wire.vdl.go
index 15ed863..445984a 100644
--- a/security/agent/server/wire.vdl.go
+++ b/security/agent/server/wire.vdl.go
@@ -6,8 +6,6 @@
import (
"veyron.io/veyron/veyron2/security"
- "veyron.io/veyron/veyron2/security/wire"
-
// The non-user imports are prefixed with "_gen_" to prevent collisions.
_gen_veyron2 "veyron.io/veyron/veyron2"
_gen_context "veyron.io/veyron/veyron2/context"
@@ -25,8 +23,20 @@
// Agent_ExcludingUniversal is the interface without internal framework-added methods
// to enable embedding without method collisions. Not to be used directly by clients.
type Agent_ExcludingUniversal interface {
+ Bless(ctx _gen_context.T, key []byte, wit security.WireBlessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat, opts ..._gen_ipc.CallOpt) (reply security.WireBlessings, err error)
+ BlessSelf(ctx _gen_context.T, name string, caveats []security.Caveat, opts ..._gen_ipc.CallOpt) (reply security.WireBlessings, err error)
Sign(ctx _gen_context.T, message []byte, opts ..._gen_ipc.CallOpt) (reply security.Signature, err error)
- PublicKey(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply wire.PublicKey, err error)
+ MintDischarge(ctx _gen_context.T, tp _gen_vdlutil.Any, caveat security.Caveat, additionalCaveats []security.Caveat, opts ..._gen_ipc.CallOpt) (reply _gen_vdlutil.Any, err error)
+ PublicKey(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply []byte, err error)
+ AddToRoots(ctx _gen_context.T, blessing security.WireBlessings, opts ..._gen_ipc.CallOpt) (err error)
+ BlessingStoreSet(ctx _gen_context.T, blessings security.WireBlessings, forPeers security.BlessingPattern, opts ..._gen_ipc.CallOpt) (reply security.WireBlessings, err error)
+ BlessingStoreForPeer(ctx _gen_context.T, peerBlessings []string, opts ..._gen_ipc.CallOpt) (reply security.WireBlessings, err error)
+ BlessingStoreSetDefault(ctx _gen_context.T, blessings security.WireBlessings, opts ..._gen_ipc.CallOpt) (err error)
+ BlessingStoreDefault(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply security.WireBlessings, err error)
+ BlessingStoreDebugString(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply string, err error)
+ BlessingRootsAdd(ctx _gen_context.T, root []byte, pattern security.BlessingPattern, opts ..._gen_ipc.CallOpt) (err error)
+ BlessingRootsRecognized(ctx _gen_context.T, root []byte, blessing string, opts ..._gen_ipc.CallOpt) (err error)
+ BlessingRootsDebugString(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply string, err error)
}
type Agent interface {
_gen_ipc.UniversalServiceMethods
@@ -35,8 +45,20 @@
// AgentService is the interface the server implements.
type AgentService interface {
+ Bless(context _gen_ipc.ServerContext, key []byte, wit security.WireBlessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat) (reply security.WireBlessings, err error)
+ BlessSelf(context _gen_ipc.ServerContext, name string, caveats []security.Caveat) (reply security.WireBlessings, err error)
Sign(context _gen_ipc.ServerContext, message []byte) (reply security.Signature, err error)
- PublicKey(context _gen_ipc.ServerContext) (reply wire.PublicKey, err error)
+ MintDischarge(context _gen_ipc.ServerContext, tp _gen_vdlutil.Any, caveat security.Caveat, additionalCaveats []security.Caveat) (reply _gen_vdlutil.Any, err error)
+ PublicKey(context _gen_ipc.ServerContext) (reply []byte, err error)
+ AddToRoots(context _gen_ipc.ServerContext, blessing security.WireBlessings) (err error)
+ BlessingStoreSet(context _gen_ipc.ServerContext, blessings security.WireBlessings, forPeers security.BlessingPattern) (reply security.WireBlessings, err error)
+ BlessingStoreForPeer(context _gen_ipc.ServerContext, peerBlessings []string) (reply security.WireBlessings, err error)
+ BlessingStoreSetDefault(context _gen_ipc.ServerContext, blessings security.WireBlessings) (err error)
+ BlessingStoreDefault(context _gen_ipc.ServerContext) (reply security.WireBlessings, err error)
+ BlessingStoreDebugString(context _gen_ipc.ServerContext) (reply string, err error)
+ BlessingRootsAdd(context _gen_ipc.ServerContext, root []byte, pattern security.BlessingPattern) (err error)
+ BlessingRootsRecognized(context _gen_ipc.ServerContext, root []byte, blessing string) (err error)
+ BlessingRootsDebugString(context _gen_ipc.ServerContext) (reply string, err error)
}
// BindAgent returns the client stub implementing the Agent
@@ -86,6 +108,28 @@
return _gen_veyron2.RuntimeFromContext(ctx).Client()
}
+func (__gen_c *clientStubAgent) Bless(ctx _gen_context.T, key []byte, wit security.WireBlessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat, opts ..._gen_ipc.CallOpt) (reply security.WireBlessings, err error) {
+ var call _gen_ipc.Call
+ if call, err = __gen_c.client(ctx).StartCall(ctx, __gen_c.name, "Bless", []interface{}{key, wit, extension, caveat, additionalCaveats}, opts...); err != nil {
+ return
+ }
+ if ierr := call.Finish(&reply, &err); ierr != nil {
+ err = ierr
+ }
+ return
+}
+
+func (__gen_c *clientStubAgent) BlessSelf(ctx _gen_context.T, name string, caveats []security.Caveat, opts ..._gen_ipc.CallOpt) (reply security.WireBlessings, err error) {
+ var call _gen_ipc.Call
+ if call, err = __gen_c.client(ctx).StartCall(ctx, __gen_c.name, "BlessSelf", []interface{}{name, caveats}, opts...); err != nil {
+ return
+ }
+ if ierr := call.Finish(&reply, &err); ierr != nil {
+ err = ierr
+ }
+ return
+}
+
func (__gen_c *clientStubAgent) Sign(ctx _gen_context.T, message []byte, opts ..._gen_ipc.CallOpt) (reply security.Signature, err error) {
var call _gen_ipc.Call
if call, err = __gen_c.client(ctx).StartCall(ctx, __gen_c.name, "Sign", []interface{}{message}, opts...); err != nil {
@@ -97,7 +141,18 @@
return
}
-func (__gen_c *clientStubAgent) PublicKey(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply wire.PublicKey, err error) {
+func (__gen_c *clientStubAgent) MintDischarge(ctx _gen_context.T, tp _gen_vdlutil.Any, caveat security.Caveat, additionalCaveats []security.Caveat, opts ..._gen_ipc.CallOpt) (reply _gen_vdlutil.Any, err error) {
+ var call _gen_ipc.Call
+ if call, err = __gen_c.client(ctx).StartCall(ctx, __gen_c.name, "MintDischarge", []interface{}{tp, caveat, additionalCaveats}, opts...); err != nil {
+ return
+ }
+ if ierr := call.Finish(&reply, &err); ierr != nil {
+ err = ierr
+ }
+ return
+}
+
+func (__gen_c *clientStubAgent) PublicKey(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply []byte, err error) {
var call _gen_ipc.Call
if call, err = __gen_c.client(ctx).StartCall(ctx, __gen_c.name, "PublicKey", nil, opts...); err != nil {
return
@@ -108,6 +163,105 @@
return
}
+func (__gen_c *clientStubAgent) AddToRoots(ctx _gen_context.T, blessing security.WireBlessings, opts ..._gen_ipc.CallOpt) (err error) {
+ var call _gen_ipc.Call
+ if call, err = __gen_c.client(ctx).StartCall(ctx, __gen_c.name, "AddToRoots", []interface{}{blessing}, opts...); err != nil {
+ return
+ }
+ if ierr := call.Finish(&err); ierr != nil {
+ err = ierr
+ }
+ return
+}
+
+func (__gen_c *clientStubAgent) BlessingStoreSet(ctx _gen_context.T, blessings security.WireBlessings, forPeers security.BlessingPattern, opts ..._gen_ipc.CallOpt) (reply security.WireBlessings, err error) {
+ var call _gen_ipc.Call
+ if call, err = __gen_c.client(ctx).StartCall(ctx, __gen_c.name, "BlessingStoreSet", []interface{}{blessings, forPeers}, opts...); err != nil {
+ return
+ }
+ if ierr := call.Finish(&reply, &err); ierr != nil {
+ err = ierr
+ }
+ return
+}
+
+func (__gen_c *clientStubAgent) BlessingStoreForPeer(ctx _gen_context.T, peerBlessings []string, opts ..._gen_ipc.CallOpt) (reply security.WireBlessings, err error) {
+ var call _gen_ipc.Call
+ if call, err = __gen_c.client(ctx).StartCall(ctx, __gen_c.name, "BlessingStoreForPeer", []interface{}{peerBlessings}, opts...); err != nil {
+ return
+ }
+ if ierr := call.Finish(&reply, &err); ierr != nil {
+ err = ierr
+ }
+ return
+}
+
+func (__gen_c *clientStubAgent) BlessingStoreSetDefault(ctx _gen_context.T, blessings security.WireBlessings, opts ..._gen_ipc.CallOpt) (err error) {
+ var call _gen_ipc.Call
+ if call, err = __gen_c.client(ctx).StartCall(ctx, __gen_c.name, "BlessingStoreSetDefault", []interface{}{blessings}, opts...); err != nil {
+ return
+ }
+ if ierr := call.Finish(&err); ierr != nil {
+ err = ierr
+ }
+ return
+}
+
+func (__gen_c *clientStubAgent) BlessingStoreDefault(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply security.WireBlessings, err error) {
+ var call _gen_ipc.Call
+ if call, err = __gen_c.client(ctx).StartCall(ctx, __gen_c.name, "BlessingStoreDefault", nil, opts...); err != nil {
+ return
+ }
+ if ierr := call.Finish(&reply, &err); ierr != nil {
+ err = ierr
+ }
+ return
+}
+
+func (__gen_c *clientStubAgent) BlessingStoreDebugString(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply string, err error) {
+ var call _gen_ipc.Call
+ if call, err = __gen_c.client(ctx).StartCall(ctx, __gen_c.name, "BlessingStoreDebugString", nil, opts...); err != nil {
+ return
+ }
+ if ierr := call.Finish(&reply, &err); ierr != nil {
+ err = ierr
+ }
+ return
+}
+
+func (__gen_c *clientStubAgent) BlessingRootsAdd(ctx _gen_context.T, root []byte, pattern security.BlessingPattern, opts ..._gen_ipc.CallOpt) (err error) {
+ var call _gen_ipc.Call
+ if call, err = __gen_c.client(ctx).StartCall(ctx, __gen_c.name, "BlessingRootsAdd", []interface{}{root, pattern}, opts...); err != nil {
+ return
+ }
+ if ierr := call.Finish(&err); ierr != nil {
+ err = ierr
+ }
+ return
+}
+
+func (__gen_c *clientStubAgent) BlessingRootsRecognized(ctx _gen_context.T, root []byte, blessing string, opts ..._gen_ipc.CallOpt) (err error) {
+ var call _gen_ipc.Call
+ if call, err = __gen_c.client(ctx).StartCall(ctx, __gen_c.name, "BlessingRootsRecognized", []interface{}{root, blessing}, opts...); err != nil {
+ return
+ }
+ if ierr := call.Finish(&err); ierr != nil {
+ err = ierr
+ }
+ return
+}
+
+func (__gen_c *clientStubAgent) BlessingRootsDebugString(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply string, err error) {
+ var call _gen_ipc.Call
+ if call, err = __gen_c.client(ctx).StartCall(ctx, __gen_c.name, "BlessingRootsDebugString", nil, opts...); err != nil {
+ return
+ }
+ if ierr := call.Finish(&reply, &err); ierr != nil {
+ err = ierr
+ }
+ return
+}
+
func (__gen_c *clientStubAgent) UnresolveStep(ctx _gen_context.T, opts ..._gen_ipc.CallOpt) (reply []string, err error) {
var call _gen_ipc.Call
if call, err = __gen_c.client(ctx).StartCall(ctx, __gen_c.name, "UnresolveStep", nil, opts...); err != nil {
@@ -153,10 +307,34 @@
// Note: This exhibits some weird behavior like returning a nil error if the method isn't found.
// This will change when it is replaced with Signature().
switch method {
+ case "Bless":
+ return []interface{}{}, nil
+ case "BlessSelf":
+ return []interface{}{}, nil
case "Sign":
return []interface{}{}, nil
+ case "MintDischarge":
+ return []interface{}{}, nil
case "PublicKey":
return []interface{}{}, nil
+ case "AddToRoots":
+ return []interface{}{}, nil
+ case "BlessingStoreSet":
+ return []interface{}{}, nil
+ case "BlessingStoreForPeer":
+ return []interface{}{}, nil
+ case "BlessingStoreSetDefault":
+ return []interface{}{}, nil
+ case "BlessingStoreDefault":
+ return []interface{}{}, nil
+ case "BlessingStoreDebugString":
+ return []interface{}{}, nil
+ case "BlessingRootsAdd":
+ return []interface{}{}, nil
+ case "BlessingRootsRecognized":
+ return []interface{}{}, nil
+ case "BlessingRootsDebugString":
+ return []interface{}{}, nil
default:
return nil, nil
}
@@ -164,11 +342,119 @@
func (__gen_s *ServerStubAgent) Signature(call _gen_ipc.ServerCall) (_gen_ipc.ServiceSignature, error) {
result := _gen_ipc.ServiceSignature{Methods: make(map[string]_gen_ipc.MethodSignature)}
+ result.Methods["AddToRoots"] = _gen_ipc.MethodSignature{
+ InArgs: []_gen_ipc.MethodArgument{
+ {Name: "blessing", Type: 74},
+ },
+ OutArgs: []_gen_ipc.MethodArgument{
+ {Name: "", Type: 75},
+ },
+ }
+ result.Methods["Bless"] = _gen_ipc.MethodSignature{
+ InArgs: []_gen_ipc.MethodArgument{
+ {Name: "key", Type: 66},
+ {Name: "wit", Type: 74},
+ {Name: "extension", Type: 3},
+ {Name: "caveat", Type: 67},
+ {Name: "additionalCaveats", Type: 68},
+ },
+ OutArgs: []_gen_ipc.MethodArgument{
+ {Name: "", Type: 74},
+ {Name: "", Type: 75},
+ },
+ }
+ result.Methods["BlessSelf"] = _gen_ipc.MethodSignature{
+ InArgs: []_gen_ipc.MethodArgument{
+ {Name: "name", Type: 3},
+ {Name: "caveats", Type: 68},
+ },
+ OutArgs: []_gen_ipc.MethodArgument{
+ {Name: "", Type: 74},
+ {Name: "", Type: 75},
+ },
+ }
+ result.Methods["BlessingRootsAdd"] = _gen_ipc.MethodSignature{
+ InArgs: []_gen_ipc.MethodArgument{
+ {Name: "root", Type: 66},
+ {Name: "pattern", Type: 77},
+ },
+ OutArgs: []_gen_ipc.MethodArgument{
+ {Name: "", Type: 75},
+ },
+ }
+ result.Methods["BlessingRootsDebugString"] = _gen_ipc.MethodSignature{
+ InArgs: []_gen_ipc.MethodArgument{},
+ OutArgs: []_gen_ipc.MethodArgument{
+ {Name: "", Type: 3},
+ {Name: "", Type: 75},
+ },
+ }
+ result.Methods["BlessingRootsRecognized"] = _gen_ipc.MethodSignature{
+ InArgs: []_gen_ipc.MethodArgument{
+ {Name: "root", Type: 66},
+ {Name: "blessing", Type: 3},
+ },
+ OutArgs: []_gen_ipc.MethodArgument{
+ {Name: "", Type: 75},
+ },
+ }
+ result.Methods["BlessingStoreDebugString"] = _gen_ipc.MethodSignature{
+ InArgs: []_gen_ipc.MethodArgument{},
+ OutArgs: []_gen_ipc.MethodArgument{
+ {Name: "", Type: 3},
+ {Name: "", Type: 75},
+ },
+ }
+ result.Methods["BlessingStoreDefault"] = _gen_ipc.MethodSignature{
+ InArgs: []_gen_ipc.MethodArgument{},
+ OutArgs: []_gen_ipc.MethodArgument{
+ {Name: "", Type: 74},
+ {Name: "", Type: 75},
+ },
+ }
+ result.Methods["BlessingStoreForPeer"] = _gen_ipc.MethodSignature{
+ InArgs: []_gen_ipc.MethodArgument{
+ {Name: "peerBlessings", Type: 61},
+ },
+ OutArgs: []_gen_ipc.MethodArgument{
+ {Name: "", Type: 74},
+ {Name: "", Type: 75},
+ },
+ }
+ result.Methods["BlessingStoreSet"] = _gen_ipc.MethodSignature{
+ InArgs: []_gen_ipc.MethodArgument{
+ {Name: "blessings", Type: 74},
+ {Name: "forPeers", Type: 77},
+ },
+ OutArgs: []_gen_ipc.MethodArgument{
+ {Name: "", Type: 74},
+ {Name: "", Type: 75},
+ },
+ }
+ result.Methods["BlessingStoreSetDefault"] = _gen_ipc.MethodSignature{
+ InArgs: []_gen_ipc.MethodArgument{
+ {Name: "blessings", Type: 74},
+ },
+ OutArgs: []_gen_ipc.MethodArgument{
+ {Name: "", Type: 75},
+ },
+ }
+ result.Methods["MintDischarge"] = _gen_ipc.MethodSignature{
+ InArgs: []_gen_ipc.MethodArgument{
+ {Name: "tp", Type: 76},
+ {Name: "caveat", Type: 67},
+ {Name: "additionalCaveats", Type: 68},
+ },
+ OutArgs: []_gen_ipc.MethodArgument{
+ {Name: "", Type: 76},
+ {Name: "", Type: 75},
+ },
+ }
result.Methods["PublicKey"] = _gen_ipc.MethodSignature{
InArgs: []_gen_ipc.MethodArgument{},
OutArgs: []_gen_ipc.MethodArgument{
- {Name: "", Type: 71},
- {Name: "", Type: 69},
+ {Name: "", Type: 66},
+ {Name: "", Type: 75},
},
}
result.Methods["Sign"] = _gen_ipc.MethodSignature{
@@ -176,27 +462,39 @@
{Name: "message", Type: 66},
},
OutArgs: []_gen_ipc.MethodArgument{
- {Name: "", Type: 68},
- {Name: "", Type: 69},
+ {Name: "", Type: 70},
+ {Name: "", Type: 75},
},
}
result.TypeDefs = []_gen_vdlutil.Any{
- _gen_wiretype.NamedPrimitiveType{Type: 0x32, Name: "byte", Tags: []string(nil)}, _gen_wiretype.SliceType{Elem: 0x41, Name: "", Tags: []string(nil)}, _gen_wiretype.NamedPrimitiveType{Type: 0x3, Name: "veyron.io/veyron/veyron2/security.Hash", Tags: []string(nil)}, _gen_wiretype.StructType{
+ _gen_wiretype.NamedPrimitiveType{Type: 0x32, Name: "byte", Tags: []string(nil)}, _gen_wiretype.SliceType{Elem: 0x41, Name: "", Tags: []string(nil)}, _gen_wiretype.StructType{
+ []_gen_wiretype.FieldType{
+ _gen_wiretype.FieldType{Type: 0x42, Name: "ValidatorVOM"},
+ },
+ "veyron.io/veyron/veyron2/security.Caveat", []string(nil)},
+ _gen_wiretype.SliceType{Elem: 0x43, Name: "", Tags: []string(nil)}, _gen_wiretype.NamedPrimitiveType{Type: 0x3, Name: "veyron.io/veyron/veyron2/security.Hash", Tags: []string(nil)}, _gen_wiretype.StructType{
[]_gen_wiretype.FieldType{
_gen_wiretype.FieldType{Type: 0x42, Name: "Purpose"},
- _gen_wiretype.FieldType{Type: 0x43, Name: "Hash"},
+ _gen_wiretype.FieldType{Type: 0x45, Name: "Hash"},
_gen_wiretype.FieldType{Type: 0x42, Name: "R"},
_gen_wiretype.FieldType{Type: 0x42, Name: "S"},
},
"veyron.io/veyron/veyron2/security.Signature", []string(nil)},
- _gen_wiretype.NamedPrimitiveType{Type: 0x1, Name: "error", Tags: []string(nil)}, _gen_wiretype.NamedPrimitiveType{Type: 0x32, Name: "veyron.io/veyron/veyron2/security/wire.KeyCurve", Tags: []string(nil)}, _gen_wiretype.StructType{
+ _gen_wiretype.StructType{
[]_gen_wiretype.FieldType{
- _gen_wiretype.FieldType{Type: 0x46, Name: "Curve"},
- _gen_wiretype.FieldType{Type: 0x42, Name: "XY"},
+ _gen_wiretype.FieldType{Type: 0x3, Name: "Extension"},
+ _gen_wiretype.FieldType{Type: 0x42, Name: "PublicKey"},
+ _gen_wiretype.FieldType{Type: 0x44, Name: "Caveats"},
+ _gen_wiretype.FieldType{Type: 0x46, Name: "Signature"},
},
- "veyron.io/veyron/veyron2/security/wire.PublicKey", []string(nil)},
- }
+ "veyron.io/veyron/veyron2/security.Certificate", []string(nil)},
+ _gen_wiretype.SliceType{Elem: 0x47, Name: "", Tags: []string(nil)}, _gen_wiretype.SliceType{Elem: 0x48, Name: "", Tags: []string(nil)}, _gen_wiretype.StructType{
+ []_gen_wiretype.FieldType{
+ _gen_wiretype.FieldType{Type: 0x49, Name: "CertificateChains"},
+ },
+ "veyron.io/veyron/veyron2/security.WireBlessings", []string(nil)},
+ _gen_wiretype.NamedPrimitiveType{Type: 0x1, Name: "error", Tags: []string(nil)}, _gen_wiretype.NamedPrimitiveType{Type: 0x1, Name: "anydata", Tags: []string(nil)}, _gen_wiretype.NamedPrimitiveType{Type: 0x3, Name: "veyron.io/veyron/veyron2/security.BlessingPattern", Tags: []string(nil)}}
return result, nil
}
@@ -219,12 +517,72 @@
return
}
+func (__gen_s *ServerStubAgent) Bless(call _gen_ipc.ServerCall, key []byte, wit security.WireBlessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat) (reply security.WireBlessings, err error) {
+ reply, err = __gen_s.service.Bless(call, key, wit, extension, caveat, additionalCaveats)
+ return
+}
+
+func (__gen_s *ServerStubAgent) BlessSelf(call _gen_ipc.ServerCall, name string, caveats []security.Caveat) (reply security.WireBlessings, err error) {
+ reply, err = __gen_s.service.BlessSelf(call, name, caveats)
+ return
+}
+
func (__gen_s *ServerStubAgent) Sign(call _gen_ipc.ServerCall, message []byte) (reply security.Signature, err error) {
reply, err = __gen_s.service.Sign(call, message)
return
}
-func (__gen_s *ServerStubAgent) PublicKey(call _gen_ipc.ServerCall) (reply wire.PublicKey, err error) {
+func (__gen_s *ServerStubAgent) MintDischarge(call _gen_ipc.ServerCall, tp _gen_vdlutil.Any, caveat security.Caveat, additionalCaveats []security.Caveat) (reply _gen_vdlutil.Any, err error) {
+ reply, err = __gen_s.service.MintDischarge(call, tp, caveat, additionalCaveats)
+ return
+}
+
+func (__gen_s *ServerStubAgent) PublicKey(call _gen_ipc.ServerCall) (reply []byte, err error) {
reply, err = __gen_s.service.PublicKey(call)
return
}
+
+func (__gen_s *ServerStubAgent) AddToRoots(call _gen_ipc.ServerCall, blessing security.WireBlessings) (err error) {
+ err = __gen_s.service.AddToRoots(call, blessing)
+ return
+}
+
+func (__gen_s *ServerStubAgent) BlessingStoreSet(call _gen_ipc.ServerCall, blessings security.WireBlessings, forPeers security.BlessingPattern) (reply security.WireBlessings, err error) {
+ reply, err = __gen_s.service.BlessingStoreSet(call, blessings, forPeers)
+ return
+}
+
+func (__gen_s *ServerStubAgent) BlessingStoreForPeer(call _gen_ipc.ServerCall, peerBlessings []string) (reply security.WireBlessings, err error) {
+ reply, err = __gen_s.service.BlessingStoreForPeer(call, peerBlessings)
+ return
+}
+
+func (__gen_s *ServerStubAgent) BlessingStoreSetDefault(call _gen_ipc.ServerCall, blessings security.WireBlessings) (err error) {
+ err = __gen_s.service.BlessingStoreSetDefault(call, blessings)
+ return
+}
+
+func (__gen_s *ServerStubAgent) BlessingStoreDefault(call _gen_ipc.ServerCall) (reply security.WireBlessings, err error) {
+ reply, err = __gen_s.service.BlessingStoreDefault(call)
+ return
+}
+
+func (__gen_s *ServerStubAgent) BlessingStoreDebugString(call _gen_ipc.ServerCall) (reply string, err error) {
+ reply, err = __gen_s.service.BlessingStoreDebugString(call)
+ return
+}
+
+func (__gen_s *ServerStubAgent) BlessingRootsAdd(call _gen_ipc.ServerCall, root []byte, pattern security.BlessingPattern) (err error) {
+ err = __gen_s.service.BlessingRootsAdd(call, root, pattern)
+ return
+}
+
+func (__gen_s *ServerStubAgent) BlessingRootsRecognized(call _gen_ipc.ServerCall, root []byte, blessing string) (err error) {
+ err = __gen_s.service.BlessingRootsRecognized(call, root, blessing)
+ return
+}
+
+func (__gen_s *ServerStubAgent) BlessingRootsDebugString(call _gen_ipc.ServerCall) (reply string, err error) {
+ reply, err = __gen_s.service.BlessingRootsDebugString(call)
+ return
+}
diff --git a/security/agent/test.sh b/security/agent/test.sh
index 037e5fe..b9d9ba8 100755
--- a/security/agent/test.sh
+++ b/security/agent/test.sh
@@ -23,22 +23,9 @@
cd "${WORKDIR}"
build
- # TODO(suharshs): After switching to new security model this shoudl be VEYRON_CREDENTIALS.
- export VEYRON_AGENT="$(shell::tmp_dir)"
- echo "-----BEGIN EC PRIVATE KEY-----
-MHcCAQEEIGxO3M/KmUac35mffZAVZf0PcXj2qLj4AtTIxdSrAH1AoAoGCCqGSM49
-AwEHoUQDQgAEoZ4cgHtkSzP/PeUBLIOoSJWjx7t2cAWKxj+dd3AgDct2nJujM2+c
-dwwYdDyKjhBc2nacEDlvA3AqtCMU0c97hA==
------END EC PRIVATE KEY-----" > "${VEYRON_AGENT}/privatekey.pem"
- # TODO(ashankar): Remove this block (and remove the compilation of the identity tool)
- # once the agent has been updated to comply with the new security model.
- local -r ID=$(shell::tmp_file)
- "${IDENTITY_BIN}" generate agenttest >"${ID}" || shell_test::fail "line ${LINENO}: failed to run identity"
- export VEYRON_IDENTITY="${ID}"
-
- shell_test::setup_server_test || shell_test::fail "line ${LINENO} failed to start server"
- unset VEYRON_CREDENTIALS
+ shell_test::setup_server_test || shell_test::fail "line ${LINENO} failed to setup server test"
+ export VEYRON_CREDENTIALS="$(shell::tmp_dir)"
# Test running a single app.
shell_test::start_server "${PINGPONG_BIN}" --server
@@ -47,7 +34,7 @@
RESULT=$(shell::check_result echo_identity "${OUTPUT}")
shell_test::assert_eq "${RESULT}" "0" "${LINENO}"
if [[ ! -s "${OUTPUT}" ]]; then
- shell_test::fail "line ${LINENO}: identity preserved"
+ shell_test::fail "line ${LINENO}: credentials preserved"
fi
# Test running multiple apps connecting to the same agent.
diff --git a/security/principal.go b/security/principal.go
index 8be1a27..4959486 100644
--- a/security/principal.go
+++ b/security/principal.go
@@ -89,6 +89,25 @@
return CreatePersistentPrincipal(dir, passphrase)
}
+// InitDefaultBlessings uses the provided principal to create a self blessing for name 'name',
+// sets it as default on the principal's BlessingStore and adds it as root to the principal's BlessingRoots.
+func InitDefaultBlessings(p security.Principal, name string) error {
+ blessing, err := p.BlessSelf(name)
+ if err != nil {
+ return err
+ }
+ if err := p.BlessingStore().SetDefault(blessing); err != nil {
+ return err
+ }
+ if _, err := p.BlessingStore().Set(blessing, security.AllPrincipals); err != nil {
+ return err
+ }
+ if err := p.AddToRoots(blessing); err != nil {
+ return err
+ }
+ return nil
+}
+
func removePersistentPrincipal(dir string) error {
files := []string{privateKeyFile, blessingRootsDataFile, blessingRootsSigFile, blessingStoreDataFile, blessingStoreSigFile}
for _, f := range files {
diff --git a/security/principal_test.go b/security/principal_test.go
index 8be6f25..b717f92 100644
--- a/security/principal_test.go
+++ b/security/principal_test.go
@@ -82,7 +82,7 @@
p2, err := LoadPersistentPrincipal(dir, passphrase)
if err != nil {
- t.Fatal(err)
+ t.Fatalf("%s failed: %v", message, err)
}
if !sig.Verify(p2.PublicKey(), message) {
t.Errorf("%s failed: p.PublicKey=%v, p2.PublicKey=%v", message, p.PublicKey(), p2.PublicKey())