Index: services/vanadium/security/principal.go |
diff --git a/services/vanadium/security/principal.go b/services/vanadium/security/principal.go |
new file mode 100644 |
index 0000000000000000000000000000000000000000..31cbb390e66b974556964fd9b7f5fd63d8c05e57 |
--- /dev/null |
+++ b/services/vanadium/security/principal.go |
@@ -0,0 +1,77 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package main |
+ |
+import ( |
+ "crypto/ecdsa" |
+ "crypto/elliptic" |
+ "crypto/rand" |
+ "fmt" |
+ "sync" |
+ |
+ vpkg "mojo/services/vanadium/security/interfaces/principal" |
+) |
+ |
+type principal struct { |
+ private *ecdsa.PrivateKey |
+ mu sync.Mutex |
+ blessings map[vpkg.UserId]*wireBlessings // GUARDED_BY(mu) |
+ curr *vpkg.UserId // GUARDED_BY(mu) |
+} |
+ |
+func (p *principal) publicKey() publicKey { |
+ return newECDSAPublicKey(&p.private.PublicKey) |
+} |
+ |
+func (p *principal) currentBlessing() *wireBlessings { |
+ p.mu.Lock() |
+ defer p.mu.Unlock() |
+ if p.curr == nil { |
+ return nil |
+ } |
+ return p.blessings[*p.curr] |
+} |
+ |
+func (p *principal) users() ([]vpkg.UserId, *vpkg.UserId) { |
+ p.mu.Lock() |
+ defer p.mu.Unlock() |
+ var users []vpkg.UserId |
+ for id, _ := range p.blessings { |
+ users = append(users, id) |
+ } |
+ return users, p.curr |
+} |
+ |
+func (p *principal) addUser(id vpkg.UserId, blessing *wireBlessings) { |
+ p.mu.Lock() |
+ defer p.mu.Unlock() |
+ p.blessings[id] = blessing |
+ p.curr = &id |
+} |
+ |
+func (p *principal) setCurrentUser(id vpkg.UserId) (err *string) { |
+ p.mu.Lock() |
+ defer p.mu.Unlock() |
+ if _, ok := p.blessings[id]; !ok { |
+ str := fmt.Sprintf("UserId %v does not exist", id) |
+ return &str |
+ } |
+ p.curr = &id |
+ return |
+} |
+ |
+func (p *principal) unsetCurrentUser() { |
+ p.mu.Lock() |
+ defer p.mu.Unlock() |
+ p.curr = nil |
+} |
+ |
+func newPrincipal() (*principal, error) { |
+ priv, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) |
+ if err != nil { |
+ return nil, err |
+ } |
+ return &principal{private: priv, blessings: make(map[vpkg.UserId]*wireBlessings)}, nil |
+} |