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..cf9729eb95379bee4555200cceb34cccbd0d33f5 |
--- /dev/null |
+++ b/services/vanadium/security/principal.go |
@@ -0,0 +1,69 @@ |
+// 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" |
+ "reflect" |
+ "sync" |
+ |
+ vpkg "mojo/services/vanadium/security/interfaces/principal" |
+) |
+ |
+type principal struct { |
+ private *ecdsa.PrivateKey |
+ mu sync.Mutex |
+ userList []vpkg.User // GUARDED_BY(mu) |
+ curr *vpkg.User // GUARDED_BY(mu) |
+} |
+ |
+func (p *principal) publicKey() publicKey { |
+ return newECDSAPublicKey(&p.private.PublicKey) |
+} |
+ |
+func (p *principal) users() []vpkg.User { |
+ p.mu.Lock() |
+ defer p.mu.Unlock() |
+ userList := make([]vpkg.User, len(p.userList)) |
+ copy(userList, p.userList) |
+ return userList |
+} |
+ |
+func (p *principal) addUser(user vpkg.User) { |
+ p.mu.Lock() |
+ defer p.mu.Unlock() |
+ p.userList = append(p.userList, user) |
+ p.curr = &user |
+} |
+ |
+func (p *principal) setCurrentUser(user vpkg.User) (err *string) { |
+ p.mu.Lock() |
+ defer p.mu.Unlock() |
+ for _, u := range p.userList { |
+ if !reflect.DeepEqual(u, user) { |
+ str := fmt.Sprintf("User %v does not exist", user) |
+ return &str |
+ } |
+ } |
+ p.curr = &user |
+ return |
+} |
+ |
+func (p *principal) clearCurrentUser() { |
+ 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}, nil |
+} |