Merge pull request #101 from microsoft/user/dama/wrapperdll

Initial code change for Moc sdk wrapper for cpp
This commit is contained in:
Dan Ma 2022-03-24 13:36:33 -07:00 коммит произвёл GitHub
Родитель 4a91616527 401ebe6acf
Коммит f655ec0e06
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 151 добавлений и 0 удалений

Просмотреть файл

@ -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)'

Просмотреть файл

@ -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 ./...

142
wrapper/cpp/main.go Normal file
Просмотреть файл

@ -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() {}