v.io/x/jni: jni support for new security primitives.

In particular, supports the new AccessList and BlessingPattern
implementations.

Change-Id: I13f2aa5794477b77adf9770128fefd26e088159e
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index e9c7bdb..6d48938 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -1,32 +1,24 @@
-# This is the official list of people who can contribute
-# (and typically have contributed) code to the Vanadium repository.
+# People who have agreed to one of the CLAs and can contribute patches.
 # The AUTHORS file lists the copyright holders; this file
-# lists people. For example, Google employees are listed here
+# lists people.  For example, Google employees are listed here
 # but not in AUTHORS, because Google holds the copyright.
 #
-# The submission process automatically checks to make sure
-# that people submitting code are listed in this file (by email address).
+# https://developers.google.com/open-source/cla/individual
+# https://developers.google.com/open-source/cla/corporate
 #
-# Names should be added to this file only after verifying that
-# the individual or the individual's organization has agreed to
-# the appropriate Contributor License Agreement, found here:
-#
-#     http://code.google.com/legal/individual-cla-v1.0.html
-#     http://code.google.com/legal/corporate-cla-v1.0.html
-#
-# The agreement for individuals can be filled out on the web.
-#
-# When adding J Random Contributor's name to this file,
-# either J's name or J's organization's name should be
-# added to the AUTHORS file, depending on whether the
-# individual or corporate CLA was used.
-
-# Names should be added to this file like so:
+# Names should be added to this file as:
 #     Name <email address>
-#
-# An entry with two email addresses specifies that the
-# first address should be used in the submit logs and
-# that the second address should be recognized as the
-# same person when interacting with Rietveld.
-
-# Please keep the list sorted.
+Ali Ghassemi <aghassemi@google.com>
+Ankur <ataly@google.com>
+Asim Shankar <ashankar@google.com>
+Benjamin Prosnitz <bprosnitz@google.com>
+James Ring <sjr@google.com>
+Jing Jin <jingjin@google.com>
+Jiri Simsa <jsimsa@google.com>
+Ken Ashcraft <kash@google.com>
+Matt Rosencrantz <mattr@google.com>
+Mike Burrows <m3b@google.com>
+Robin Thellend <rthellend@google.com>
+Srdjan Petrovic <spetrovic@google.com>
+Suharsh Sivakumar <suharshs@google.com>
+Todd Wang <toddw@google.com>
\ No newline at end of file
diff --git a/v23/security/access/jni.go b/v23/security/access/jni.go
index 92e4f73..98f294b 100644
--- a/v23/security/access/jni.go
+++ b/v23/security/access/jni.go
@@ -17,45 +17,32 @@
 import "C"
 
 var (
-	aclSign = jutil.ClassSign("io.v.v23.security.access.AccessList")
-
-	// Global reference for io.v.v23.security.access.ACLWrapper class.
-	jACLWrapperClass C.jclass
-	// Global reference for io.v.v23.security.access.Util class.
-	jUtilClass C.jclass
+	// Global reference for io.v.v23.security.access.AccessList class.
+	jAccessListClass C.jclass
 )
 
 func Init(jEnv interface{}) error {
-	class, err := jutil.JFindClass(jEnv, "io/v/v23/security/access/ACLWrapper")
+	class, err := jutil.JFindClass(jEnv, "io/v/v23/security/access/AccessList")
 	if err != nil {
 		return err
 	}
-	jACLWrapperClass = C.jclass(class)
-	class, err = jutil.JFindClass(jEnv, "io/v/v23/security/access/Util")
-	if err != nil {
-		return err
-	}
-	jUtilClass = C.jclass(class)
+	jAccessListClass = C.jclass(class)
 	return nil
 }
 
-//export Java_io_v_v23_security_access_ACLWrapper_nativeWrap
-func Java_io_v_v23_security_access_ACLWrapper_nativeWrap(env *C.JNIEnv, jACLWrapperClass C.jclass, jACL C.jobject) C.jobject {
-	acl, err := GoACL(env, jACL)
+//export Java_io_v_v23_security_access_AccessList_nativeCreate
+func Java_io_v_v23_security_access_AccessList_nativeCreate(env *C.JNIEnv, jAccessList C.jobject) C.jlong {
+	acl, err := GoAccessList(env, jAccessList)
 	if err != nil {
 		jutil.JThrowV(env, err)
-		return nil
+		return C.jlong(0)
 	}
-	jWrapper, err := JavaACLWrapper(env, acl)
-	if err != nil {
-		jutil.JThrowV(env, err)
-		return nil
-	}
-	return C.jobject(jWrapper)
+	jutil.GoRef(&acl) // Un-refed when the AccessList object is finalized
+	return C.jlong(jutil.PtrValue(&acl))
 }
 
-//export Java_io_v_v23_security_access_ACLWrapper_nativeIncludes
-func Java_io_v_v23_security_access_ACLWrapper_nativeIncludes(env *C.JNIEnv, jACLWrapper C.jobject, goPtr C.jlong, jBlessings C.jobjectArray) C.jboolean {
+//export Java_io_v_v23_security_access_AccessList_nativeIncludes
+func Java_io_v_v23_security_access_AccessList_nativeIncludes(env *C.JNIEnv, jAccessList C.jobject, goPtr C.jlong, jBlessings C.jobjectArray) C.jboolean {
 	blessings := jutil.GoStringArray(env, jBlessings)
 	ok := (*(*access.AccessList)(jutil.Ptr(goPtr))).Includes(blessings...)
 	if ok {
@@ -64,8 +51,8 @@
 	return C.JNI_FALSE
 }
 
-//export Java_io_v_v23_security_access_ACLWrapper_nativeAuthorize
-func Java_io_v_v23_security_access_ACLWrapper_nativeAuthorize(env *C.JNIEnv, jACLWrapper C.jobject, goPtr C.jlong, jCtx C.jobject, jCall C.jobject) {
+//export Java_io_v_v23_security_access_AccessList_nativeAuthorize
+func Java_io_v_v23_security_access_AccessList_nativeAuthorize(env *C.JNIEnv, jAccessList C.jobject, goPtr C.jlong, jCtx C.jobject, jCall C.jobject) {
 	ctx, err := jcontext.GoContext(env, jCtx)
 	if err != nil {
 		jutil.JThrowV(env, err)
@@ -81,7 +68,7 @@
 	}
 }
 
-//export Java_io_v_v23_security_access_ACLWrapper_nativeFinalize
-func Java_io_v_v23_security_access_ACLWrapper_nativeFinalize(env *C.JNIEnv, jACLWrapper C.jobject, goPtr C.jlong) {
+//export Java_io_v_v23_security_access_AccessList_nativeFinalize
+func Java_io_v_v23_security_access_AccessList_nativeFinalize(env *C.JNIEnv, jAccessList C.jobject, goPtr C.jlong) {
 	jutil.GoUnref(jutil.Ptr(goPtr))
 }
diff --git a/v23/security/access/util.go b/v23/security/access/util.go
index c5b73fc..a525d44 100644
--- a/v23/security/access/util.go
+++ b/v23/security/access/util.go
@@ -7,61 +7,18 @@
 package access
 
 import (
-	"unsafe"
-
 	"v.io/v23/security/access"
-	"v.io/v23/vom"
 	jutil "v.io/x/jni/util"
 )
 
 // #include "jni.h"
 import "C"
 
-// JavaACL converts the provided Go AccessList into a Java AccessList.
+// GoAccessList converts the provided Java AccessList into a Go AccessList.
 // NOTE: Because CGO creates package-local types and because this method may be
 // invoked from a different package, Java types are passed in an empty interface
 // and then cast into their package local types.
-func JavaACL(jEnv interface{}, acl access.AccessList) (unsafe.Pointer, error) {
-	encoded, err := vom.Encode(acl)
-	if err != nil {
-		return nil, err
-	}
-	jACL, err := jutil.CallStaticObjectMethod(jEnv, jUtilClass, "decodeACL", []jutil.Sign{jutil.ByteArraySign}, aclSign, encoded)
-	if err != nil {
-		return nil, err
-	}
-	return jACL, nil
-}
-
-// GoACL converts the provided Java AccessList into a Go AccessList.
-// NOTE: Because CGO creates package-local types and because this method may be
-// invoked from a different package, Java types are passed in an empty interface
-// and then cast into their package local types.
-func GoACL(jEnv, jACL interface{}) (access.AccessList, error) {
-	encoded, err := jutil.CallStaticByteArrayMethod(jEnv, jUtilClass, "encodeACL", []jutil.Sign{aclSign}, jACL)
-	if err != nil {
-		return access.AccessList{}, err
-	}
-	var a access.AccessList
-	if err := vom.Decode(encoded, &a); err != nil {
-		return access.AccessList{}, err
-	}
-	return a, nil
-}
-
-// JavaACLWrapper converts the provided Go AccessList into a Java ACLWrapper object.
-// NOTE: Because CGO creates package-local types and because this method may be
-// invoked from a different package, Java types are passed in an empty interface
-// and then cast into their package local types.
-func JavaACLWrapper(jEnv interface{}, acl access.AccessList) (unsafe.Pointer, error) {
-	jACL, err := JavaACL(jEnv, acl)
-	if err != nil {
-		return nil, err
-	}
-	jWrapper, err := jutil.NewObject(jEnv, jACLWrapperClass, []jutil.Sign{jutil.LongSign, aclSign}, int64(jutil.PtrValue(&acl)), jACL)
-	if err != nil {
-		return nil, err
-	}
-	jutil.GoRef(&acl) // Un-refed when the Java ACLWrapper object is finalized.
-	return jWrapper, nil
+func GoAccessList(jEnv, jAccessList interface{}) (acl access.AccessList, err error) {
+	err = jutil.GoVomCopy(jEnv, jAccessList, jAccessListClass, &acl)
+	return
 }
diff --git a/v23/security/jni.go b/v23/security/jni.go
index 31c5138..a349a9f 100644
--- a/v23/security/jni.go
+++ b/v23/security/jni.go
@@ -46,8 +46,8 @@
 	jBlessingRootsImplClass C.jclass
 	// Global reference for io.v.v23.security.CallImpl class.
 	jCallImplClass C.jclass
-	// Global reference for io.v.v23.security.BlessingPatternWrapper class.
-	jBlessingPatternWrapperClass C.jclass
+	// Global reference for io.v.v23.security.BlessingPattern class.
+	jBlessingPatternClass C.jclass
 	// Global reference for io.v.v23.security.CaveatRegistry class.
 	jCaveatRegistryClass C.jclass
 	// Global reference for io.v.v23.security.Util class.
@@ -104,11 +104,11 @@
 		return err
 	}
 	jCallImplClass = C.jclass(class)
-	class, err = jutil.JFindClass(jEnv, "io/v/v23/security/BlessingPatternWrapper")
+	class, err = jutil.JFindClass(jEnv, "io/v/v23/security/BlessingPattern")
 	if err != nil {
 		return err
 	}
-	jBlessingPatternWrapperClass = C.jclass(class)
+	jBlessingPatternClass = C.jclass(class)
 	class, err = jutil.JFindClass(jEnv, "io/v/v23/security/CaveatRegistry")
 	if err != nil {
 		return err
@@ -752,23 +752,19 @@
 	jutil.GoUnref(jutil.Ptr(goPtr))
 }
 
-//export Java_io_v_v23_security_BlessingPatternWrapper_nativeWrap
-func Java_io_v_v23_security_BlessingPatternWrapper_nativeWrap(env *C.JNIEnv, jBlessingPatternWrapperClass C.jclass, jPattern C.jobject) C.jobject {
-	pattern, err := GoBlessingPattern(env, jPattern)
+//export Java_io_v_v23_security_BlessingPattern_nativeCreate
+func Java_io_v_v23_security_BlessingPattern_nativeCreate(env *C.JNIEnv, jBlessingPattern C.jobject) C.jlong {
+	pattern, err := GoBlessingPattern(env, jBlessingPattern)
 	if err != nil {
 		jutil.JThrowV(env, err)
-		return nil
+		return C.jlong(0)
 	}
-	jWrapper, err := JavaBlessingPatternWrapper(env, pattern)
-	if err != nil {
-		jutil.JThrowV(env, err)
-		return nil
-	}
-	return C.jobject(jWrapper)
+	jutil.GoRef(&pattern) // Un-refed when the BlessingPattern object is finalized.
+	return C.jlong(jutil.PtrValue(&pattern))
 }
 
-//export Java_io_v_v23_security_BlessingPatternWrapper_nativeIsMatchedBy
-func Java_io_v_v23_security_BlessingPatternWrapper_nativeIsMatchedBy(env *C.JNIEnv, jBlessingPatternWrapper C.jobject, goPtr C.jlong, jBlessings C.jobjectArray) C.jboolean {
+//export Java_io_v_v23_security_BlessingPattern_nativeIsMatchedBy
+func Java_io_v_v23_security_BlessingPattern_nativeIsMatchedBy(env *C.JNIEnv, jBlessingPattern C.jobject, goPtr C.jlong, jBlessings C.jobjectArray) C.jboolean {
 	blessings := jutil.GoStringArray(env, jBlessings)
 	matched := (*(*security.BlessingPattern)(jutil.Ptr(goPtr))).MatchedBy(blessings...)
 	if matched {
@@ -777,8 +773,8 @@
 	return C.JNI_FALSE
 }
 
-//export Java_io_v_v23_security_BlessingPatternWrapper_nativeIsValid
-func Java_io_v_v23_security_BlessingPatternWrapper_nativeIsValid(env *C.JNIEnv, jBlessingPatternWrapper C.jobject, goPtr C.jlong) C.jboolean {
+//export Java_io_v_v23_security_BlessingPattern_nativeIsValid
+func Java_io_v_v23_security_BlessingPattern_nativeIsValid(env *C.JNIEnv, jBlessingPattern C.jobject, goPtr C.jlong) C.jboolean {
 	valid := (*(*security.BlessingPattern)(jutil.Ptr(goPtr))).IsValid()
 	if valid {
 		return C.JNI_TRUE
@@ -786,18 +782,18 @@
 	return C.JNI_FALSE
 }
 
-//export Java_io_v_v23_security_BlessingPatternWrapper_nativeMakeNonExtendable
-func Java_io_v_v23_security_BlessingPatternWrapper_nativeMakeNonExtendable(env *C.JNIEnv, jBlessingPatternWrapper C.jobject, goPtr C.jlong) C.jobject {
-	p := (*(*security.BlessingPattern)(jutil.Ptr(goPtr))).MakeNonExtendable()
-	jWrapper, err := JavaBlessingPatternWrapper(env, p)
+//export Java_io_v_v23_security_BlessingPattern_nativeMakeNonExtendable
+func Java_io_v_v23_security_BlessingPattern_nativeMakeNonExtendable(env *C.JNIEnv, jBlessingPattern C.jobject, goPtr C.jlong) C.jobject {
+	pattern := (*(*security.BlessingPattern)(jutil.Ptr(goPtr))).MakeNonExtendable()
+	jPattern, err := JavaBlessingPattern(env, pattern)
 	if err != nil {
 		jutil.JThrowV(env, err)
 		return nil
 	}
-	return C.jobject(jWrapper)
+	return C.jobject(jPattern)
 }
 
-//export Java_io_v_v23_security_BlessingPatternWrapper_nativeFinalize
-func Java_io_v_v23_security_BlessingPatternWrapper_nativeFinalize(env *C.JNIEnv, jBlessingPatternWrapper C.jobject, goPtr C.jlong) {
+//export Java_io_v_v23_security_BlessingPattern_nativeFinalize
+func Java_io_v_v23_security_BlessingPattern_nativeFinalize(env *C.JNIEnv, jBlessingPattern C.jobject, goPtr C.jlong) {
 	jutil.GoUnref(jutil.Ptr(goPtr))
 }
diff --git a/v23/security/util.go b/v23/security/util.go
index 5c2c547..4137020 100644
--- a/v23/security/util.go
+++ b/v23/security/util.go
@@ -122,25 +122,22 @@
 	return caveats, nil
 }
 
-// JavaBlessingPattern converts the provided Go BlessingPattern into Java BlessingPattern.
+// JavaBlessingPattern converts the provided Go BlessingPattern into Java
+// BlessingPattern.
 // NOTE: Because CGO creates package-local types and because this method may be
 // invoked from a different package, Java types are passed in an empty interface
 // and then cast into their package local types.
 func JavaBlessingPattern(jEnv interface{}, pattern security.BlessingPattern) (unsafe.Pointer, error) {
-	jBlessingPattern, err := jutil.CallStaticObjectMethod(jEnv, jUtilClass, "decodeBlessingPattern", []jutil.Sign{jutil.StringSign}, blessingPatternSign, string(pattern))
-	return jBlessingPattern, err
+	return jutil.JVomCopy(jEnv, pattern, jBlessingPatternClass)
 }
 
 // GoBlessingPattern converts the provided Java BlessingPattern into Go BlessingPattern.
 // NOTE: Because CGO creates package-local types and because this method may be
 // invoked from a different package, Java types are passed in an empty interface
 // and then cast into their package local types.
-func GoBlessingPattern(jEnv, jPattern interface{}) (security.BlessingPattern, error) {
-	encoded, err := jutil.CallStaticStringMethod(jEnv, jUtilClass, "encodeBlessingPattern", []jutil.Sign{blessingPatternSign}, jPattern)
-	if err != nil {
-		return security.BlessingPattern(""), err
-	}
-	return security.BlessingPattern(encoded), nil
+func GoBlessingPattern(jEnv, jPattern interface{}) (pattern security.BlessingPattern, err error) {
+	err = jutil.GoVomCopy(jEnv, jPattern, jBlessingPatternClass, &pattern)
+	return
 }
 
 // JavaPublicKey converts the provided Go PublicKey into Java PublicKey.
@@ -205,21 +202,3 @@
 	}
 	return sig, nil
 }
-
-// JavaBlessingPatternWrapper converts the provided Go BlessingPattern into a Java
-// BlessingPatternWrapper object.
-// NOTE: Because CGO creates package-local types and because this method may be
-// invoked from a different package, Java types are passed in an empty interface
-// and then cast into their package local types.
-func JavaBlessingPatternWrapper(jEnv interface{}, pattern security.BlessingPattern) (unsafe.Pointer, error) {
-	jPattern, err := JavaBlessingPattern(jEnv, pattern)
-	if err != nil {
-		return nil, err
-	}
-	jWrapper, err := jutil.NewObject(jEnv, jBlessingPatternWrapperClass, []jutil.Sign{jutil.LongSign, blessingPatternSign}, int64(jutil.PtrValue(&pattern)), jPattern)
-	if err != nil {
-		return nil, err
-	}
-	jutil.GoRef(&pattern) // Un-refed when the Java BlessingPatternWrapper object is finalized.
-	return jWrapper, nil
-}