Merge pull request #101 from microsoft/user/dama/wrapperdll
Initial code change for Moc sdk wrapper for cpp
This commit is contained in:
Коммит
f655ec0e06
|
@ -30,6 +30,7 @@ jobs:
|
|||
displayName: 'Set up the Go workspace'
|
||||
|
||||
- script: |
|
||||
sudo apt-get install gcc-mingw-w64
|
||||
mkdir manifest
|
||||
make all
|
||||
workingDirectory: '$(System.DefaultWorkingDirectory)'
|
||||
|
|
8
Makefile
8
Makefile
|
@ -7,6 +7,13 @@ GOHOSTOS=$(strip $(shell $(GOCMD) env get GOHOSTOS))
|
|||
TAG ?= $(shell git describe --tags)
|
||||
COMMIT ?= $(shell git describe --always)
|
||||
BUILD_DATE ?= $(shell date -u +%m/%d/%Y)
|
||||
|
||||
BIN_DIR=bin
|
||||
LD_FLAGS_WINDOWS_CSHARED=-extldflags=-Wl,--out-implib=MocCppWrapper.lib
|
||||
CPP_WRAPPER_NAME=MocCppWrapper
|
||||
CPP_WRAPPER_EXT=.dll
|
||||
CPP_WRAPPER_OUT=$(BIN_DIR)/$(CPP_WRAPPER_NAME)$(CPP_WRAPPER_EXT)
|
||||
|
||||
# Private repo workaround
|
||||
export GOPRIVATE = github.com/microsoft
|
||||
# Active module mode, as we use go modules to manage dependencies
|
||||
|
@ -25,6 +32,7 @@ vendor:
|
|||
|
||||
build:
|
||||
GOARCH=amd64 go build -v ./...
|
||||
GOARCH=amd64 GOOS=windows CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc $(GOBUILD) -buildmode=c-shared -o $(CPP_WRAPPER_OUT) -ldflags="$(LD_FLAGS_WINDOWS_CSHARED)" github.com/microsoft/moc-sdk-for-go/wrapper/cpp/
|
||||
|
||||
test:
|
||||
GOARCH=amd64 go test -v ./...
|
||||
|
|
|
@ -0,0 +1,142 @@
|
|||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the Apache v2.0 License.
|
||||
|
||||
//
|
||||
// This file contains wrapper function calls that c++ component
|
||||
// can leverage to call into MocStack
|
||||
//
|
||||
|
||||
package main
|
||||
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
"github.com/microsoft/moc/pkg/auth"
|
||||
"github.com/microsoft/moc-sdk-for-go/services/security/keyvault"
|
||||
"github.com/microsoft/moc-sdk-for-go/services/security/keyvault/key"
|
||||
)
|
||||
|
||||
//export KeyvaultKeyEncryptData
|
||||
func KeyvaultKeyEncryptData(serverName *C.char, groupName *C.char, keyvaultName *C.char, keyName *C.char, input *C.char, timeoutInSeconds C.int) *C.char {
|
||||
keyClient, err := getKeyvaultKeyClient(C.GoString(serverName))
|
||||
if err != nil {
|
||||
return C.CString(err.Error())
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeoutInSeconds)*time.Second)
|
||||
defer cancel()
|
||||
|
||||
// input is base64 encoded
|
||||
var value string
|
||||
value = C.GoString(input)
|
||||
|
||||
parameters := &keyvault.KeyOperationsParameters{
|
||||
Value: &value,
|
||||
Algorithm: keyvault.A256KW,
|
||||
}
|
||||
|
||||
response, err := keyClient.Encrypt(ctx, C.GoString(groupName), C.GoString(keyvaultName), C.GoString(keyName), parameters)
|
||||
if err != nil {
|
||||
return C.CString(err.Error())
|
||||
}
|
||||
|
||||
// retrun base64 encoded string
|
||||
return C.CString(*response.Result)
|
||||
}
|
||||
|
||||
//export KeyvaultKeyDecryptData
|
||||
func KeyvaultKeyDecryptData(serverName *C.char, groupName *C.char, keyvaultName *C.char, keyName *C.char, input *C.char, timeoutInSeconds C.int) *C.char {
|
||||
keyClient, err := getKeyvaultKeyClient(C.GoString(serverName))
|
||||
if err != nil {
|
||||
return C.CString(err.Error())
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeoutInSeconds)*time.Second)
|
||||
defer cancel()
|
||||
|
||||
var value string
|
||||
value = C.GoString(input)
|
||||
|
||||
parameters := &keyvault.KeyOperationsParameters{
|
||||
Value: &value,
|
||||
Algorithm: keyvault.A256KW,
|
||||
}
|
||||
|
||||
response, err := keyClient.Decrypt(ctx, C.GoString(groupName), C.GoString(keyvaultName), C.GoString(keyName), parameters)
|
||||
if err != nil {
|
||||
return C.CString(err.Error())
|
||||
}
|
||||
|
||||
return C.CString(*response.Result)
|
||||
}
|
||||
|
||||
//export KeyvaultKeyExist
|
||||
func KeyvaultKeyExist(serverName *C.char, groupName *C.char, keyvaultName *C.char, keyName *C.char, timeoutInSeconds C.int) C.int {
|
||||
keyClient, err := getKeyvaultKeyClient(C.GoString(serverName))
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeoutInSeconds)*time.Second)
|
||||
defer cancel()
|
||||
|
||||
keys, err := keyClient.Get(ctx, C.GoString(groupName), C.GoString(keyvaultName), C.GoString(keyName))
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
|
||||
// check the length and return 1 (means key exists) if there is more than one key
|
||||
if keys != nil && len(*keys) > 0 {
|
||||
return 1
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
//export KeyvaultKeyCreateOrUpdate
|
||||
func KeyvaultKeyCreateOrUpdate(serverName *C.char, groupName *C.char, keyvaultName *C.char, keyName *C.char, keyTypeName *C.char, timeoutInSeconds C.int) *C.char {
|
||||
keyClient, err := getKeyvaultKeyClient(C.GoString(serverName))
|
||||
if err != nil {
|
||||
return C.CString(err.Error())
|
||||
}
|
||||
|
||||
var kvConfig *keyvault.Key
|
||||
kvConfig = &keyvault.Key{}
|
||||
|
||||
var keyNameString string
|
||||
keyNameString = C.GoString(keyName)
|
||||
kvConfig.Name = &keyNameString
|
||||
kvConfig.KeyProperties = &keyvault.KeyProperties{}
|
||||
|
||||
kvConfig.KeyType = keyvault.JSONWebKeyType(C.GoString(keyTypeName))
|
||||
var keySize int32
|
||||
keySize =256 // hardcode for AES key
|
||||
kvConfig.KeySize = &keySize
|
||||
|
||||
var keyRotation int64
|
||||
keyRotation = -1
|
||||
kvConfig.KeyRotationFrequencyInSeconds = &keyRotation // -1 means disable key rotation
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeoutInSeconds)*time.Second)
|
||||
defer cancel()
|
||||
|
||||
_, err = keyClient.CreateOrUpdate(ctx, C.GoString(groupName), C.GoString(keyvaultName), C.GoString(keyName), kvConfig)
|
||||
if err != nil {
|
||||
return C.CString(err.Error())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func getKeyvaultKeyClient(serverName string) (*key.KeyClient, error) {
|
||||
authorizer, err := auth.NewAuthorizerFromEnvironment(serverName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return key.NewKeyClient(serverName, authorizer)
|
||||
}
|
||||
|
||||
func main() {}
|
Загрузка…
Ссылка в новой задаче