Skip to content

Commit

Permalink
Added instrumentation to CppWrapper (#172)
Browse files Browse the repository at this point in the history
* Added instrumentation to CppWrapper
  • Loading branch information
ryanlampe-msft authored Aug 19, 2023
1 parent 81a9dbc commit 31ded05
Show file tree
Hide file tree
Showing 4 changed files with 242 additions and 14 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ require (
)

require (
github.com/Microsoft/go-winio v0.6.1
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/golang-jwt/jwt/v4 v4.2.0 // indirect
github.com/golang/protobuf v1.5.3
Expand Down
3 changes: 3 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,8 @@ github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VY
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
Expand Down Expand Up @@ -604,6 +606,7 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
Expand Down
109 changes: 95 additions & 14 deletions wrapper/cpp/main.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the Apache v2.0 License.

//go:build windows
// +build windows

//
// This file contains wrapper function calls that c++ component
// can leverage to call into MocStack
Expand All @@ -17,21 +20,31 @@ import (
"github.com/microsoft/moc-sdk-for-go/services/security/authentication"
"github.com/microsoft/moc-sdk-for-go/services/security/keyvault"
"github.com/microsoft/moc-sdk-for-go/services/security/keyvault/key"
"github.com/microsoft/moc-sdk-for-go/wrapper"
"github.com/microsoft/moc/pkg/auth"
"github.com/microsoft/moc/pkg/config"
)

// This function exists to maintain backwards compatability. Please use SecurityLoginCV.
//
//export SecurityLogin
func SecurityLogin(serverName *C.char, groupName *C.char, loginFilePath *C.char, timeoutInSeconds C.int) *C.char {
return SecurityLoginCV(serverName, groupName, loginFilePath, C.CString(""), timeoutInSeconds)
}

//export SecurityLoginCV
func SecurityLoginCV(serverName *C.char, groupName *C.char, loginFilePath *C.char, cv *C.char, timeoutInSeconds C.int) *C.char {
loginconfig := auth.LoginConfig{}
err := config.LoadYAMLFile(C.GoString(loginFilePath), &loginconfig)
if err != nil {
return C.CString(err.Error())
telemetry.EmitWrapperTelemetry("SecurityLoginCV", C.GoString(cv), err.Error(), "config.LoadYAMLFile", C.GoString(serverName))
return C.CString(telemetry.FilterSensitiveData(err.Error()))
}

authenticationClient, err := authentication.NewAuthenticationClientAuthMode(C.GoString(serverName), loginconfig)
if err != nil {
return C.CString(err.Error())
telemetry.EmitWrapperTelemetry("SecurityLoginCV", C.GoString(cv), err.Error(), "authentication.NewAuthenticationClientAuthMode", C.GoString(serverName))
return C.CString(telemetry.FilterSensitiveData(err.Error()))
}

ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeoutInSeconds)*time.Second)
Expand All @@ -41,17 +54,28 @@ func SecurityLogin(serverName *C.char, groupName *C.char, loginFilePath *C.char,
// set true to auto renew
_, err = authenticationClient.LoginWithConfig(ctx, C.GoString(groupName), loginconfig, true)
if err != nil {
return C.CString(err.Error())
telemetry.EmitWrapperTelemetry("SecurityLoginCV", C.GoString(cv), err.Error(), "authenticationClient.LoginWithConfig", C.GoString(serverName))
return C.CString(telemetry.FilterSensitiveData(err.Error()))
}

//Provide moc version information after login
telemetry.EmitWrapperTelemetry("SecurityLoginCV", C.GoString(cv), "", "", C.GoString(serverName))
return nil
}

// This function exists to maintain backwards compatability. Please use KeyvaultKeyEncryptDataCV.
//
//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))
return KeyvaultKeyEncryptDataCV(serverName, groupName, keyvaultName, keyName, input, C.CString(""), timeoutInSeconds)
}

//export KeyvaultKeyEncryptDataCV
func KeyvaultKeyEncryptDataCV(serverName *C.char, groupName *C.char, keyvaultName *C.char, keyName *C.char, input *C.char, cv *C.char, timeoutInSeconds C.int) *C.char {
keyClient, err := getKeyvaultKeyClient(C.GoString(serverName), C.GoString(cv))
// if errror occurs, return an empty string so that caller can tell between error and encrypted blob
if err != nil {
telemetry.EmitWrapperTelemetry("KeyvaultKeyEncryptDataCV", C.GoString(cv), err.Error(), "getKeyvaultKeyClient", C.GoString(serverName))
return C.CString("")
}

Expand All @@ -69,18 +93,27 @@ func KeyvaultKeyEncryptData(serverName *C.char, groupName *C.char, keyvaultName

response, err := keyClient.Encrypt(ctx, C.GoString(groupName), C.GoString(keyvaultName), C.GoString(keyName), parameters)
if err != nil {
telemetry.EmitWrapperTelemetry("KeyvaultKeyEncryptDataCV", C.GoString(cv), err.Error(), "keyClient.Encrypt", C.GoString(serverName))
return C.CString("")
}

// retrun base64 encoded string
return C.CString(*response.Result)
}

// This function exists to maintain backwards compatability. Please use KeyvaultKeyEncryptDataCV.
//
//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))
return KeyvaultKeyDecryptDataCV(serverName, groupName, keyvaultName, keyName, input, C.CString(""), timeoutInSeconds)
}

//export KeyvaultKeyDecryptDataCV
func KeyvaultKeyDecryptDataCV(serverName *C.char, groupName *C.char, keyvaultName *C.char, keyName *C.char, input *C.char, cv *C.char, timeoutInSeconds C.int) *C.char {
keyClient, err := getKeyvaultKeyClient(C.GoString(serverName), C.GoString(cv))
// if errror occurs, return an empty string so that caller can tell between error and decrypted blob
if err != nil {
telemetry.EmitWrapperTelemetry("KeyvaultKeyDecryptDataCV", C.GoString(cv), err.Error(), "getKeyvaultKeyClient", C.GoString(serverName))
return C.CString("")
}

Expand All @@ -97,16 +130,25 @@ func KeyvaultKeyDecryptData(serverName *C.char, groupName *C.char, keyvaultName

response, err := keyClient.Decrypt(ctx, C.GoString(groupName), C.GoString(keyvaultName), C.GoString(keyName), parameters)
if err != nil {
telemetry.EmitWrapperTelemetry("KeyvaultKeyDecryptDataCV", C.GoString(cv), err.Error(), "keyClient.Decrypt", C.GoString(serverName))
return C.CString("")
}

return C.CString(*response.Result)
}

// This function exists to maintain backwards compatability. Please use KeyvaultKeyExistCV.
//
//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))
return KeyvaultKeyExistCV(serverName, groupName, keyvaultName, keyName, C.CString(""), timeoutInSeconds)
}

//export KeyvaultKeyExistCV
func KeyvaultKeyExistCV(serverName *C.char, groupName *C.char, keyvaultName *C.char, keyName *C.char, cv *C.char, timeoutInSeconds C.int) C.int {
keyClient, err := getKeyvaultKeyClient(C.GoString(serverName), C.GoString(cv))
if err != nil {
telemetry.EmitWrapperTelemetry("KeyvaultKeyExistCV", C.GoString(cv), err.Error(), "getKeyvaultKeyClient", C.GoString(serverName))
return 0
}

Expand All @@ -115,6 +157,7 @@ func KeyvaultKeyExist(serverName *C.char, groupName *C.char, keyvaultName *C.cha

keys, err := keyClient.Get(ctx, C.GoString(groupName), C.GoString(keyvaultName), C.GoString(keyName))
if err != nil {
telemetry.EmitWrapperTelemetry("KeyvaultKeyExistCV", C.GoString(cv), err.Error(), "keyClient.Get", C.GoString(serverName))
return 0
}

Expand All @@ -126,11 +169,19 @@ func KeyvaultKeyExist(serverName *C.char, groupName *C.char, keyvaultName *C.cha
return 0
}

// This function exists to maintain backwards compatability. Please use KeyvaultKeyExistCV.
//
//export KeyvaultKeyCreateOrUpdate
func KeyvaultKeyCreateOrUpdate(serverName *C.char, groupName *C.char, keyvaultName *C.char, keyName *C.char, keyTypeName *C.char, keySize C.int, timeoutInSeconds C.int) *C.char {
keyClient, err := getKeyvaultKeyClient(C.GoString(serverName))
return KeyvaultKeyCreateOrUpdateCV(serverName, groupName, keyvaultName, keyName, keyTypeName, keySize, C.CString(""), timeoutInSeconds)
}

//export KeyvaultKeyCreateOrUpdateCV
func KeyvaultKeyCreateOrUpdateCV(serverName *C.char, groupName *C.char, keyvaultName *C.char, keyName *C.char, keyTypeName *C.char, keySize C.int, correlationVector *C.char, timeoutInSeconds C.int) *C.char {
keyClient, err := getKeyvaultKeyClient(C.GoString(serverName), C.GoString(correlationVector))
if err != nil {
return C.CString(err.Error())
telemetry.EmitWrapperTelemetry("KeyvaultKeyCreateOrUpdateCV", C.GoString(correlationVector), err.Error(), "getKeyvaultKeyClient", C.GoString(serverName))
return C.CString(telemetry.FilterSensitiveData(err.Error()))
}

var kvConfig *keyvault.Key
Expand All @@ -155,17 +206,27 @@ func KeyvaultKeyCreateOrUpdate(serverName *C.char, groupName *C.char, keyvaultNa

_, err = keyClient.CreateOrUpdate(ctx, C.GoString(groupName), C.GoString(keyvaultName), C.GoString(keyName), kvConfig)
if err != nil {
return C.CString(err.Error())
telemetry.EmitWrapperTelemetry("KeyvaultKeyCreateOrUpdateCV", C.GoString(correlationVector), err.Error(), "keyClient.CreateOrUpdate", C.GoString(serverName))
//This return cannot be empty!
return C.CString(telemetry.FilterSensitiveData(err.Error()))
}

return nil
}

// This function exists to maintain backwards compatability. Please use KeyvaultKeySignDataCV.
//
//export KeyvaultKeySignData
func KeyvaultKeySignData(serverName *C.char, groupName *C.char, keyvaultName *C.char, keyName *C.char, input *C.char, algorithm *C.char, timeoutInSeconds C.int) *C.char {
keyClient, err := getKeyvaultKeyClient(C.GoString(serverName))
return KeyvaultKeySignDataCV(serverName, groupName, keyvaultName, keyName, input, algorithm, C.CString(""), timeoutInSeconds)
}

//export KeyvaultKeySignDataCV
func KeyvaultKeySignDataCV(serverName *C.char, groupName *C.char, keyvaultName *C.char, keyName *C.char, input *C.char, algorithm *C.char, cv *C.char, timeoutInSeconds C.int) *C.char {
keyClient, err := getKeyvaultKeyClient(C.GoString(serverName), C.GoString(cv))
// if errror occurs, return an empty string so that caller can tell between error and decrypted blob
if err != nil {
telemetry.EmitWrapperTelemetry("KeyvaultKeySignDataCV", C.GoString(cv), err.Error(), "getKeyvaultKeyClient", C.GoString(serverName))
return C.CString("")
}

Expand All @@ -183,18 +244,27 @@ func KeyvaultKeySignData(serverName *C.char, groupName *C.char, keyvaultName *C.

response, err := keyClient.Sign(ctx, C.GoString(groupName), C.GoString(keyvaultName), C.GoString(keyName), parameters)
if err != nil {
telemetry.EmitWrapperTelemetry("KeyvaultKeySignDataCV", C.GoString(cv), err.Error(), "keyClient.Sign", C.GoString(serverName))
return C.CString("")
}

// retrun base64 encoded string
return C.CString(*response.Result)
}

// This function exists to maintain backwards compatability. Please use KeyvaultKeyVerifyDataCV.
//
//export KeyvaultKeyVerifyData
func KeyvaultKeyVerifyData(serverName *C.char, groupName *C.char, keyvaultName *C.char, keyName *C.char, digest *C.char, signature *C.char, algorithm *C.char, timeoutInSeconds C.int) (ret C.int) {
keyClient, err := getKeyvaultKeyClient(C.GoString(serverName))
return KeyvaultKeyVerifyDataCV(serverName, groupName, keyvaultName, keyName, digest, signature, algorithm, C.CString(""), timeoutInSeconds)
}

//export KeyvaultKeyVerifyDataCV
func KeyvaultKeyVerifyDataCV(serverName *C.char, groupName *C.char, keyvaultName *C.char, keyName *C.char, digest *C.char, signature *C.char, algorithm *C.char, cv *C.char, timeoutInSeconds C.int) (ret C.int) {
keyClient, err := getKeyvaultKeyClient(C.GoString(serverName), C.GoString(cv))
// if errror occurs, return an empty string so that caller can tell between error and decrypted blob
if err != nil {
telemetry.EmitWrapperTelemetry("KeyvaultKeyVerifyDataCV", C.GoString(cv), err.Error(), "getKeyvaultKeyClient", C.GoString(serverName))
return 0
}

Expand All @@ -216,6 +286,7 @@ func KeyvaultKeyVerifyData(serverName *C.char, groupName *C.char, keyvaultName *

response, err := keyClient.Verify(ctx, C.GoString(groupName), C.GoString(keyvaultName), C.GoString(keyName), parameters)
if err != nil {
telemetry.EmitWrapperTelemetry("KeyvaultKeyVerifyDataCV", C.GoString(cv), err.Error(), "keyClient.Verify", C.GoString(serverName))
return C.int(0)
}

Expand All @@ -227,10 +298,18 @@ func KeyvaultKeyVerifyData(serverName *C.char, groupName *C.char, keyvaultName *
}
}

// This function exists to maintain backwards compatability. Please use KeyvaultGetPublicKeyCV.
//
//export KeyvaultGetPublicKey
func KeyvaultGetPublicKey(serverName *C.char, groupName *C.char, keyvaultName *C.char, keyName *C.char, timeoutInSeconds C.int) *C.char {
keyClient, err := getKeyvaultKeyClient(C.GoString(serverName))
return KeyvaultGetPublicKeyCV(serverName, groupName, keyvaultName, keyName, C.CString(""), timeoutInSeconds)
}

//export KeyvaultGetPublicKeyCV
func KeyvaultGetPublicKeyCV(serverName *C.char, groupName *C.char, keyvaultName *C.char, keyName *C.char, cv *C.char, timeoutInSeconds C.int) *C.char {
keyClient, err := getKeyvaultKeyClient(C.GoString(serverName), C.GoString(cv))
if err != nil {
telemetry.EmitWrapperTelemetry("KeyvaultGetPublicKeyCV", C.GoString(cv), err.Error(), "getKeyvaultKeyClient", C.GoString(serverName))
return C.CString("")
}

Expand All @@ -239,10 +318,11 @@ func KeyvaultGetPublicKey(serverName *C.char, groupName *C.char, keyvaultName *C

keys, err := keyClient.Get(ctx, C.GoString(groupName), C.GoString(keyvaultName), C.GoString(keyName))
if err != nil {
telemetry.EmitWrapperTelemetry("KeyvaultGetPublicKeyCV", C.GoString(cv), err.Error(), "keyClient.Get", C.GoString(serverName))
return C.CString("")
}

// check the length and return 1 (means key exists) if there is more than one key
// check the length of the key, if it is zero or we don't have any keys, there is no public key to return
if keys == nil || len(*keys) <= 0 {
return C.CString("")
}
Expand All @@ -252,9 +332,10 @@ func KeyvaultGetPublicKey(serverName *C.char, groupName *C.char, keyvaultName *C
return C.CString(*pemPkcs1KeyPub)
}

func getKeyvaultKeyClient(serverName string) (*key.KeyClient, error) {
func getKeyvaultKeyClient(serverName string, cv string) (*key.KeyClient, error) {
authorizer, err := auth.NewAuthorizerFromEnvironment(serverName)
if err != nil {
telemetry.EmitWrapperTelemetry("getKeyvaultKeyClient", cv, err.Error(), "auth.NewAuthorizerFromEnvironment", serverName)
return nil, err
}

Expand Down
Loading

0 comments on commit 31ded05

Please sign in to comment.