blob: 96c21bd5f5310c85da71e0fb0feb23efff819975 [file] [log] [blame]
package vc
import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"fmt"
isecurity "veyron.io/veyron/veyron/runtimes/google/security"
"veyron.io/veyron/veyron2/security"
"veyron.io/veyron/veyron2/vlog"
)
var anonymousID security.PrivateID
var anonymousPrincipal security.Principal
func init() {
key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
vlog.Fatalf("could not create private key for anonymous principal: %v", err)
}
store := &anonymousBlessingStore{k: security.NewECDSAPublicKey(&key.PublicKey)}
if anonymousPrincipal, err = security.CreatePrincipal(security.NewInMemoryECDSASigner(key), store, nil); err != nil {
vlog.Fatalf("could not create anonymous principal: %v", err)
}
if store.b, err = anonymousPrincipal.BlessSelf("anonymous"); err != nil {
vlog.Fatalf("failed to generate the one blessing to be used by the anonymous principal: %v", err)
}
if anonymousID, err = isecurity.NewPrivateID("anonymous", nil); err != nil {
vlog.Fatalf("could not create anonymousID for IPCs: %v", err)
}
}
// TODO(ashankar,ataly): Figure out what to do with this!
// (Most likely move the BlessingStore implementation from veyron/runtimes/google/rt to veyron/security
// and use that?)
type anonymousBlessingStore struct {
k security.PublicKey
b security.Blessings
}
func (s *anonymousBlessingStore) Set(security.Blessings, security.BlessingPattern) (security.Blessings, error) {
return nil, fmt.Errorf("cannot store blessings with an anonymous principal")
}
func (s *anonymousBlessingStore) ForPeer(...string) security.Blessings {
return s.b
}
func (s *anonymousBlessingStore) SetDefault(security.Blessings) error {
return fmt.Errorf("cannot change default blessing associated with the anonymous principal")
}
func (s *anonymousBlessingStore) Default() security.Blessings {
return s.b
}
func (s *anonymousBlessingStore) PublicKey() security.PublicKey {
return s.k
}
func (anonymousBlessingStore) DebugString() string {
return "anonymous BlessingStore"
}