blob: 4226162b642ae4e25417892a52d3a0d9aa1e21c7 [file] [log] [blame]
// +build android
package security
import (
"unsafe"
jutil "v.io/jni/util"
"v.io/v23/security"
"v.io/v23/vom"
)
// #cgo LDFLAGS: -ljniwrapper
// #include "jni_wrapper.h"
import "C"
// JavaBlessings converts the provided Go Blessings into Java Blessings.
// 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 JavaBlessings(jEnv interface{}, blessings security.Blessings) (C.jobject, error) {
if blessings == nil {
return nil, nil
}
wire := security.MarshalBlessings(blessings)
jWire, err := JavaWireBlessings(jEnv, wire)
if err != nil {
return nil, err
}
jBlessings, err := jutil.NewObject(jEnv, jBlessingsImplClass, []jutil.Sign{jutil.LongSign, wireBlessingsSign}, int64(jutil.PtrValue(&blessings)), jWire)
if err != nil {
return nil, err
}
jutil.GoRef(&blessings) // Un-refed when the Java BlessingsImpl object is finalized.
return C.jobject(jBlessings), nil
}
// GoBlessings converts the provided Java Blessings into Go Blessings.
// 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 GoBlessings(jEnv, jBlessingsObj interface{}) (security.Blessings, error) {
jBlessings := C.jobject(unsafe.Pointer(jutil.PtrValue(jBlessingsObj)))
if jBlessings == nil {
return nil, nil
}
jWire, err := jutil.CallObjectMethod(jEnv, jBlessings, "wireFormat", nil, wireBlessingsSign)
if err != nil {
return nil, err
}
wire, err := GoWireBlessings(jEnv, jWire)
if err != nil {
return nil, err
}
return security.NewBlessings(wire)
}
// GoBlessingsArray converts the provided Java Blessings array into a Go
// Blessings slice.
// 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 GoBlessingsArray(jEnv, jBlessingsArr interface{}) ([]security.Blessings, error) {
barr := jutil.GoObjectArray(jEnv, jBlessingsArr)
ret := make([]security.Blessings, len(barr))
for i, jBlessings := range barr {
var err error
if ret[i], err = GoBlessings(jEnv, jBlessings); err != nil {
return nil, err
}
}
return ret, nil
}
// JavaWireBlessings converts the provided Go WireBlessings into Java WireBlessings.
// 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 JavaWireBlessings(jEnv interface{}, wire security.WireBlessings) (C.jobject, error) {
var err error
encoded, err := vom.Encode(wire)
if err != nil {
return nil, err
}
jWireBlessings, err := jutil.CallStaticObjectMethod(jEnv, jUtilClass, "decodeWireBlessings", []jutil.Sign{jutil.ByteArraySign}, wireBlessingsSign, encoded)
if err != nil {
return nil, err
}
return C.jobject(jWireBlessings), nil
}
// GoWireBlessings converts the provided Java WireBlessings into Go WireBlessings.
// 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 GoWireBlessings(jEnv, jWireBless interface{}) (security.WireBlessings, error) {
jWireBlessings := getObject(jWireBless)
encoded, err := jutil.CallStaticByteArrayMethod(jEnv, jUtilClass, "encodeWireBlessings", []jutil.Sign{wireBlessingsSign}, jWireBlessings)
if err != nil {
return security.WireBlessings{}, err
}
var wire security.WireBlessings
if err := vom.Decode(encoded, &wire); err != nil {
return security.WireBlessings{}, err
}
return wire, nil
}
// JavaCaveat converts the provided Go Caveat into a Java Caveat.
// 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 JavaCaveat(jEnv interface{}, caveat security.Caveat) (C.jobject, error) {
encoded, err := vom.Encode(caveat)
if err != nil {
return nil, err
}
jCaveat, err := jutil.CallStaticObjectMethod(jEnv, jUtilClass, "decodeCaveat", []jutil.Sign{jutil.ByteArraySign}, caveatSign, encoded)
if err != nil {
return nil, err
}
return C.jobject(jCaveat), nil
}
// GoCaveat converts the provided Java Caveat into a Go Caveat.
// 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 GoCaveat(jEnv, jCav interface{}) (security.Caveat, error) {
jCaveat := getObject(jCav)
encoded, err := jutil.CallStaticByteArrayMethod(jEnv, jUtilClass, "encodeCaveat", []jutil.Sign{caveatSign}, jCaveat)
if err != nil {
return security.Caveat{}, err
}
var caveat security.Caveat
if err := vom.Decode(encoded, &caveat); err != nil {
return security.Caveat{}, err
}
return caveat, nil
}
// JavaCaveats converts the provided Go Caveat slice into a Java Caveat array.
// 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 JavaCaveats(jEnv interface{}, caveats []security.Caveat) (C.jobjectArray, error) {
cavarr := make([]interface{}, len(caveats))
for i, caveat := range caveats {
var err error
if cavarr[i], err = JavaCaveat(jEnv, caveat); err != nil {
return nil, err
}
}
jCaveats := jutil.JObjectArray(jEnv, cavarr, jCaveatClass)
return C.jobjectArray(jCaveats), nil
}
// GoCaveats converts the provided Java Caveat array into a Go Caveat slice.
// 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 GoCaveats(jEnv, jCaveats interface{}) ([]security.Caveat, error) {
cavarr := jutil.GoObjectArray(jEnv, jCaveats)
caveats := make([]security.Caveat, len(cavarr))
for i, jCaveat := range cavarr {
var err error
if caveats[i], err = GoCaveat(jEnv, jCaveat); err != nil {
return nil, err
}
}
return caveats, nil
}
// 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) (C.jobject, error) {
jBlessingPattern, err := jutil.CallStaticObjectMethod(jEnv, jUtilClass, "decodeBlessingPattern", []jutil.Sign{jutil.StringSign}, blessingPatternSign, string(pattern))
return C.jobject(jBlessingPattern), err
}
// 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, jPatt interface{}) (security.BlessingPattern, error) {
jPattern := getObject(jPatt)
encoded, err := jutil.CallStaticStringMethod(jEnv, jUtilClass, "encodeBlessingPattern", []jutil.Sign{blessingPatternSign}, jPattern)
if err != nil {
return security.BlessingPattern(""), err
}
return security.BlessingPattern(encoded), nil
}
// JavaPublicKey converts the provided Go PublicKey into Java PublicKey.
// 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 JavaPublicKey(jEnv interface{}, key security.PublicKey) (C.jobject, error) {
if key == nil {
return nil, nil
}
encoded, err := key.MarshalBinary()
if err != nil {
return nil, err
}
jPublicKey, err := jutil.CallStaticObjectMethod(jEnv, jUtilClass, "decodePublicKey", []jutil.Sign{jutil.ArraySign(jutil.ByteSign)}, publicKeySign, encoded)
if err != nil {
return nil, err
}
return C.jobject(jPublicKey), nil
}
// GoPublicKey converts the provided Java PublicKey into Go PublicKey.
// 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 GoPublicKey(jEnv, jKey interface{}) (security.PublicKey, error) {
jPublicKey := getObject(jKey)
encoded, err := jutil.CallStaticByteArrayMethod(jEnv, jUtilClass, "encodePublicKey", []jutil.Sign{publicKeySign}, jPublicKey)
if err != nil {
return nil, err
}
return security.UnmarshalPublicKey(encoded)
}
// JavaSignature converts the provided Go Signature into a Java Signature.
// 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 JavaSignature(jEnv interface{}, sig security.Signature) (C.jobject, error) {
encoded, err := vom.Encode(sig)
if err != nil {
return nil, err
}
jSignature, err := jutil.CallStaticObjectMethod(jEnv, jUtilClass, "decodeSignature", []jutil.Sign{jutil.ByteArraySign}, signatureSign, encoded)
if err != nil {
return nil, err
}
return C.jobject(jSignature), nil
}
// GoSignature converts the provided Java Signature into a Go Signature.
// 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 GoSignature(jEnv, jSig interface{}) (security.Signature, error) {
jSignature := getObject(jSig)
encoded, err := jutil.CallStaticByteArrayMethod(jEnv, jUtilClass, "encodeSignature", []jutil.Sign{signatureSign}, jSignature)
if err != nil {
return security.Signature{}, err
}
var sig security.Signature
if err := vom.Decode(encoded, &sig); err != nil {
return security.Signature{}, err
}
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) (C.jobject, 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 C.jobject(jWrapper), nil
}
func getObject(jObj interface{}) C.jobject {
return C.jobject(unsafe.Pointer(jutil.PtrValue(jObj)))
}