| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // +build java android |
| |
| package security |
| |
| import ( |
| "v.io/v23/security" |
| "v.io/v23/uniqueid" |
| "v.io/v23/vom" |
| |
| jutil "v.io/x/jni/util" |
| ) |
| |
| // #include "jni.h" |
| import "C" |
| |
| // JavaBlessings converts the provided Go Blessings into Java Blessings. |
| func JavaBlessings(env jutil.Env, blessings security.Blessings) (jutil.Object, error) { |
| jBlessings, err := jutil.NewObject(env, jBlessingsClass, []jutil.Sign{jutil.LongSign}, int64(jutil.PtrValue(&blessings))) |
| if err != nil { |
| return jutil.NullObject, err |
| } |
| jutil.GoRef(&blessings) // Un-refed when the Java Blessings object is finalized. |
| return jBlessings, nil |
| } |
| |
| // GoBlessings converts the provided Java Blessings into Go Blessings. |
| func GoBlessings(env jutil.Env, jBlessings jutil.Object) (security.Blessings, error) { |
| if jBlessings.IsNull() { |
| return security.Blessings{}, nil |
| } |
| goPtr, err := jutil.CallLongMethod(env, jBlessings, "nativePtr", nil) |
| if err != nil { |
| return security.Blessings{}, err |
| } |
| return (*(*security.Blessings)(jutil.NativePtr(goPtr))), nil |
| } |
| |
| // GoBlessingsArray converts the provided Java Blessings array into a Go |
| // Blessings slice. |
| func GoBlessingsArray(env jutil.Env, jBlessingsArr jutil.Object) ([]security.Blessings, error) { |
| barr, err := jutil.GoObjectArray(env, jBlessingsArr) |
| if err != nil { |
| return nil, err |
| } |
| ret := make([]security.Blessings, len(barr)) |
| for i, jBlessings := range barr { |
| var err error |
| if ret[i], err = GoBlessings(env, jBlessings); err != nil { |
| return nil, err |
| } |
| } |
| return ret, nil |
| } |
| |
| // JavaWireBlessings converts the provided Go WireBlessings into Java WireBlessings. |
| func JavaWireBlessings(env jutil.Env, wire security.WireBlessings) (jutil.Object, error) { |
| return jutil.JVomCopy(env, wire, jWireBlessingsClass) |
| } |
| |
| // JavaCaveat converts the provided Go Caveat into a Java Caveat. |
| func JavaCaveat(env jutil.Env, caveat security.Caveat) (jutil.Object, error) { |
| // NOTE(spetrovic): We could call JVomCopy here, but it's painfully slow and this code is |
| // on the critical path. |
| |
| // Copy the Id field. |
| jId, err := jutil.NewObject(env, jIdClass, []jutil.Sign{jutil.ByteArraySign}, []byte(caveat.Id[:])) |
| if err != nil { |
| return jutil.NullObject, err |
| } |
| return jutil.NewObject(env, jCaveatClass, []jutil.Sign{idSign, jutil.ByteArraySign}, jId, caveat.ParamVom) |
| } |
| |
| // GoCaveat converts the provided Java Caveat into a Go Caveat. |
| func GoCaveat(env jutil.Env, jCav jutil.Object) (security.Caveat, error) { |
| // NOTE(spetrovic): We could call GoVomCopy here, but it's painfully slow and this code is |
| // on the critical path. |
| |
| // Copy the Id field. |
| jId, err := jutil.CallObjectMethod(env, jCav, "getId", nil, idSign) |
| if err != nil { |
| return security.Caveat{}, err |
| } |
| idBytes, err := jutil.CallByteArrayMethod(env, jId, "toPrimitiveArray", nil) |
| if err != nil { |
| return security.Caveat{}, err |
| } |
| var id uniqueid.Id |
| copy(id[:], idBytes[:len(id)]) |
| |
| // Copy the ParamVom field. |
| paramVom, err := jutil.CallByteArrayMethod(env, jCav, "getParamVom", nil) |
| if err != nil { |
| return security.Caveat{}, err |
| } |
| return security.Caveat{ |
| Id: id, |
| ParamVom: paramVom, |
| }, nil |
| } |
| |
| // JavaCaveatArray converts the provided Go Caveat slice into a Java Caveat array. |
| func JavaCaveatArray(env jutil.Env, caveats []security.Caveat) (jutil.Object, error) { |
| if caveats == nil { |
| return jutil.NullObject, nil |
| } |
| cavArr := make([]jutil.Object, len(caveats)) |
| for i, caveat := range caveats { |
| var err error |
| if cavArr[i], err = JavaCaveat(env, caveat); err != nil { |
| return jutil.NullObject, err |
| } |
| } |
| return jutil.JObjectArray(env, cavArr, jCaveatClass) |
| } |
| |
| // GoCaveats converts the provided Java Caveat array into a Go Caveat slice. |
| func GoCaveats(env jutil.Env, jCaveats jutil.Object) ([]security.Caveat, error) { |
| cavArr, err := jutil.GoObjectArray(env, jCaveats) |
| if err != nil { |
| return nil, err |
| } |
| ret := make([]security.Caveat, len(cavArr)) |
| for i, jCav := range cavArr { |
| var err error |
| if ret[i], err = GoCaveat(env, jCav); err != nil { |
| return nil, err |
| } |
| } |
| return ret, nil |
| } |
| |
| // JavaBlessingPattern converts the provided Go BlessingPattern into Java |
| // BlessingPattern. |
| func JavaBlessingPattern(env jutil.Env, pattern security.BlessingPattern) (jutil.Object, error) { |
| jPattern, err := jutil.NewObject(env, jBlessingPatternClass, []jutil.Sign{jutil.LongSign, jutil.StringSign}, int64(jutil.PtrValue(&pattern)), string(pattern)) |
| if err != nil { |
| return jutil.NullObject, err |
| } |
| jutil.GoRef(&pattern) // Un-refed when the Java BlessingRootsImpl is finalized. |
| return jPattern, nil |
| } |
| |
| // GoBlessingPattern converts the provided Java BlessingPattern into Go BlessingPattern. |
| func GoBlessingPattern(env jutil.Env, jPattern jutil.Object) (pattern security.BlessingPattern, err error) { |
| if jPattern.IsNull() { |
| return "", nil |
| } |
| goPtr, err := jutil.CallLongMethod(env, jPattern, "nativePtr", nil) |
| if err != nil { |
| return "", err |
| } |
| return (*(*security.BlessingPattern)(jutil.NativePtr(goPtr))), nil |
| } |
| |
| // JavaPublicKey converts the provided Go PublicKey into Java PublicKey. |
| func JavaPublicKey(env jutil.Env, key security.PublicKey) (jutil.Object, error) { |
| if key == nil { |
| return jutil.NullObject, nil |
| } |
| der, err := key.MarshalBinary() |
| if err != nil { |
| return jutil.NullObject, err |
| } |
| return JavaPublicKeyFromDER(env, der) |
| } |
| |
| // JavaPublicKeyFromDER converts a DER-encoded public key into a Java PublicKey object. |
| func JavaPublicKeyFromDER(env jutil.Env, der []byte) (jutil.Object, error) { |
| jPublicKey, err := jutil.CallStaticObjectMethod(env, jUtilClass, "decodePublicKey", []jutil.Sign{jutil.ArraySign(jutil.ByteSign)}, publicKeySign, der) |
| if err != nil { |
| return jutil.NullObject, err |
| } |
| return jPublicKey, nil |
| } |
| |
| // JavaPublicKeyToDER returns the DER-encoded representations of a Java PublicKey object. |
| func JavaPublicKeyToDER(env jutil.Env, jKey jutil.Object) ([]byte, error) { |
| return jutil.CallStaticByteArrayMethod(env, jUtilClass, "encodePublicKey", []jutil.Sign{publicKeySign}, jKey) |
| } |
| |
| // GoPublicKey converts the provided Java PublicKey into Go PublicKey. |
| func GoPublicKey(env jutil.Env, jKey jutil.Object) (security.PublicKey, error) { |
| der, err := JavaPublicKeyToDER(env, jKey) |
| if err != nil { |
| return nil, err |
| } |
| return security.UnmarshalPublicKey(der) |
| } |
| |
| // JavaSignature converts the provided Go Signature into a Java VSignature. |
| func JavaSignature(env jutil.Env, sig security.Signature) (jutil.Object, error) { |
| encoded, err := vom.Encode(sig) |
| if err != nil { |
| return jutil.NullObject, err |
| } |
| jSignature, err := jutil.CallStaticObjectMethod(env, jUtilClass, "decodeSignature", []jutil.Sign{jutil.ByteArraySign}, signatureSign, encoded) |
| if err != nil { |
| return jutil.NullObject, err |
| } |
| return jSignature, nil |
| } |
| |
| // GoSignature converts the provided Java VSignature into a Go Signature. |
| func GoSignature(env jutil.Env, jSignature jutil.Object) (security.Signature, error) { |
| encoded, err := jutil.CallStaticByteArrayMethod(env, 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 |
| } |
| |
| // GoDischarge converts the provided Java Discharge into a Go Discharge. |
| func GoDischarge(env jutil.Env, jDischarge jutil.Object) (security.Discharge, error) { |
| var discharge security.Discharge |
| if err := jutil.GoVomCopy(env, jDischarge, jDischargeClass, &discharge); err != nil { |
| return security.Discharge{}, err |
| } |
| return discharge, nil |
| } |
| |
| // JavaDischarge converts the provided Go Discharge into a Java discharge. |
| func JavaDischarge(env jutil.Env, discharge security.Discharge) (jutil.Object, error) { |
| return jutil.JVomCopy(env, discharge, jDischargeClass) |
| } |
| |
| func javaDischargeMap(env jutil.Env, discharges map[string]security.Discharge) (jutil.Object, error) { |
| objectMap := make(map[jutil.Object]jutil.Object) |
| for key, discharge := range discharges { |
| jKey := jutil.JString(env, key) |
| jDischarge, err := JavaDischarge(env, discharge) |
| if err != nil { |
| return jutil.NullObject, err |
| } |
| objectMap[jKey] = jDischarge |
| } |
| return jutil.JObjectMap(env, objectMap) |
| } |