github.com/0chain/gosdk@v1.17.11/winsdk/sdk.go (about) 1 package main 2 3 /* 4 #include <stdlib.h> 5 */ 6 import ( 7 "C" 8 ) 9 10 import ( 11 "encoding/json" 12 "errors" 13 "os" 14 "path" 15 16 "github.com/0chain/gosdk/zboxapi" 17 "github.com/0chain/gosdk/zboxcore/client" 18 l "github.com/0chain/gosdk/zboxcore/logger" 19 "github.com/0chain/gosdk/zboxcore/sdk" 20 "github.com/0chain/gosdk/zboxcore/zboxutil" 21 "github.com/0chain/gosdk/zcncore" 22 23 "github.com/0chain/gosdk/core/conf" 24 "github.com/0chain/gosdk/core/encryption" 25 "github.com/0chain/gosdk/core/logger" 26 "github.com/0chain/gosdk/core/sys" 27 "github.com/0chain/gosdk/core/zcncrypto" 28 ) 29 30 var log logger.Logger 31 32 func main() { 33 } 34 35 // SetLogFile - set log file 36 // ## Inputs 37 // - file: the full path of log file 38 // 39 //export SetLogFile 40 func SetLogFile(file *C.char) *C.char { 41 defer func() { 42 if r := recover(); r != nil { 43 log.Error("win: crash ", r) 44 } 45 }() 46 47 f, err := os.OpenFile(C.GoString(file), os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) 48 if err != nil { 49 return WithJSON(false, err) 50 } 51 52 sdk.GetLogger().SetLevel(logger.DEBUG) 53 sdk.GetLogger().SetLogFile(f, true) 54 55 zcncore.GetLogger().SetLevel(logger.DEBUG) 56 zcncore.GetLogger().SetLogFile(f, true) 57 58 zboxutil.GetLogger().SetLevel(logger.DEBUG) 59 zboxutil.GetLogger().SetLogFile(f, true) 60 61 zboxapi.GetLogger().SetLevel(logger.DEBUG) 62 zboxapi.GetLogger().SetLogFile(f, true) 63 64 log.SetLogFile(f, true) 65 log.SetLevel(logger.DEBUG) 66 67 return WithJSON(true, nil) 68 } 69 70 // InitSDKs - init zcncore sdk and zboxapi client from config 71 // - configJson 72 // { 73 // "block_worker": "https://dev.0chain.net/dns", 74 // "signature_scheme": "bls0chain", 75 // "min_submit": 50, 76 // "min_confirmation": 50, 77 // "confirmation_chain_length": 3, 78 // "max_txn_query": 5, 79 // "query_sleep_time": 5, 80 // "preferred_blobbers": ["https://dev.0chain.net/blobber02","https://dev.0chain.net/blobber03"], 81 // "chain_id":"0afc093ffb509f059c55478bc1a60351cef7b4e9c008a53a6cc8241ca8617dfe", 82 // "ethereum_node":"https://ropsten.infura.io/v3/xxxxxxxxxxxxxxx", 83 // "zbox_host":"https://0box.dev.0chain.net", 84 // "zbox_app_type":"vult", 85 // "sharder_consensous": 2, 86 // } 87 // 88 //export InitSDKs 89 func InitSDKs(configJson *C.char) *C.char { 90 defer func() { 91 if r := recover(); r != nil { 92 log.Error("win: crash ", r) 93 } 94 }() 95 96 l.Logger.Info("Start InitSDKs") 97 98 configJs := C.GoString(configJson) 99 100 configObj := &conf.Config{} 101 102 l.Logger.Info("cfg: ", configJs) 103 err := json.Unmarshal([]byte(configJs), configObj) 104 if err != nil { 105 l.Logger.Error(err) 106 return WithJSON(false, err) 107 } 108 109 err = zcncore.InitZCNSDK(configObj.BlockWorker, configObj.SignatureScheme, func(cc *zcncore.ChainConfig) error { 110 cc.BlockWorker = configObj.BlockWorker 111 cc.ChainID = configObj.ChainID 112 cc.ConfirmationChainLength = configObj.ConfirmationChainLength 113 cc.MinConfirmation = configObj.MinConfirmation 114 cc.EthNode = configObj.EthereumNode 115 cc.MinSubmit = configObj.MinSubmit 116 cc.SharderConsensous = configObj.SharderConsensous 117 cc.SignatureScheme = configObj.SignatureScheme 118 119 return nil 120 }) 121 if err != nil { 122 l.Logger.Error(err, configJs) 123 return WithJSON(false, err) 124 } 125 126 l.Logger.Info("InitZCNSDK success") 127 l.Logger.Info(configObj.BlockWorker) 128 l.Logger.Info(configObj.ChainID) 129 l.Logger.Info(configObj.SignatureScheme) 130 l.Logger.Info(configObj.PreferredBlobbers) 131 132 if zboxApiClient == nil { 133 zboxApiClient = zboxapi.NewClient() 134 } 135 136 zboxApiClient.SetRequest(configObj.ZboxHost, configObj.ZboxAppType) 137 l.Logger.Info("Init ZBoxAPI Client success") 138 139 return WithJSON(true, nil) 140 } 141 142 // InitWallet - init wallet for storage sdk and zboxapi client 143 // - clientJson 144 // { 145 // "client_id":"8f6ce6457fc04cfb4eb67b5ce3162fe2b85f66ef81db9d1a9eaa4ffe1d2359e0", 146 // "client_key":"c8c88854822a1039c5a74bdb8c025081a64b17f52edd463fbecb9d4a42d15608f93b5434e926d67a828b88e63293b6aedbaf0042c7020d0a96d2e2f17d3779a4", 147 // "keys":[ 148 // { 149 // "public_key":"c8c88854822a1039c5a74bdb8c025081a64b17f52edd463fbecb9d4a42d15608f93b5434e926d67a828b88e63293b6aedbaf0042c7020d0a96d2e2f17d3779a4", 150 // "private_key":"72f480d4b1e7fb76e04327b7c2348a99a64f0ff2c5ebc3334a002aa2e66e8506" 151 // }], 152 // "mnemonics":"abandon mercy into make powder fashion butter ignore blade vanish plastic shock learn nephew matrix indoor surge document motor group barely offer pottery antenna", 153 // "version":"1.0", 154 // "date_created":"1668667145", 155 // "nonce":0 156 // } 157 // 158 //export InitWallet 159 func InitWallet(clientJson *C.char) *C.char { 160 defer func() { 161 if r := recover(); r != nil { 162 log.Error("win: crash ", r) 163 } 164 }() 165 l.Logger.Info("Start InitStorageSDK") 166 167 clientJs := C.GoString(clientJson) 168 169 configObj, err := conf.GetClientConfig() 170 if err != nil { 171 l.Logger.Error(err) 172 return WithJSON(false, err) 173 } 174 175 err = sdk.InitStorageSDK(clientJs, configObj.BlockWorker, configObj.ChainID, configObj.SignatureScheme, configObj.PreferredBlobbers, 0) 176 if err != nil { 177 l.Logger.Error(err, clientJs) 178 return WithJSON(false, err) 179 } 180 l.Logger.Info("InitStorageSDK success") 181 182 c := client.GetClient() 183 if c != nil { 184 zboxApiClient.SetWallet(client.GetClientID(), client.GetClientPrivateKey(), client.GetClientPublicKey()) 185 l.Logger.Info("InitZboxApiClient success") 186 } else { 187 l.Logger.Info("InitZboxApiClient skipped") 188 } 189 190 l.Logger.Info("InitSDKs successful") 191 return WithJSON(true, nil) 192 } 193 194 var ErrInvalidSignatureScheme = errors.New("invalid_signature_scheme") 195 196 // SignRequest sign data with private key and scheme 197 // 198 // return 199 // { 200 // "error":"", 201 // "result":"xxx", 202 // } 203 // 204 //export SignRequest 205 func SignRequest(privateKey, signatureScheme, data *C.char) *C.char { 206 defer func() { 207 if r := recover(); r != nil { 208 log.Error("win: crash ", r) 209 } 210 }() 211 key := C.GoString(privateKey) 212 scheme := C.GoString(signatureScheme) 213 d := C.GoString(data) 214 215 hash := encryption.Hash(d) 216 217 return WithJSON(sys.Sign(hash, scheme, []sys.KeyPair{{ 218 PrivateKey: key, 219 }})) 220 } 221 222 // VerifySignature verify signature with public key, schema and data 223 // return 224 // 225 // { 226 // "error":"", 227 // "result":true, 228 // } 229 // 230 //export VerifySignature 231 func VerifySignature(publicKey, signatureScheme string, data string, signature string) *C.char { 232 defer func() { 233 if r := recover(); r != nil { 234 log.Error("win: crash ", r) 235 } 236 }() 237 hash := encryption.Hash(data) 238 239 signScheme := zcncrypto.NewSignatureScheme(signatureScheme) 240 if signScheme != nil { 241 err := signScheme.SetPublicKey(publicKey) 242 if err != nil { 243 return WithJSON(false, err) 244 } 245 return WithJSON(signScheme.Verify(signature, hash)) 246 } 247 return WithJSON(false, ErrInvalidSignatureScheme) 248 } 249 250 // CryptoJsEncrypt encrypt message with AES+CCB 251 // 252 // return 253 // { 254 // "error":"", 255 // "result":"xxx", 256 // } 257 // 258 //export CryptoJsEncrypt 259 func CryptoJsEncrypt(passphrase, message *C.char) *C.char { 260 defer func() { 261 if r := recover(); r != nil { 262 log.Error("win: crash ", r) 263 } 264 }() 265 pass := C.GoString(passphrase) 266 msg := C.GoString(message) 267 268 return WithJSON(zcncore.CryptoJsEncrypt(pass, msg)) 269 } 270 271 // CryptoJsDecrypt decrypt message with AES+CCB 272 // 273 // return 274 // { 275 // "error":"", 276 // "result":"xxx", 277 // } 278 // 279 //export CryptoJsDecrypt 280 func CryptoJsDecrypt(passphrase, encryptedMessage *C.char) *C.char { 281 defer func() { 282 if r := recover(); r != nil { 283 log.Error("win: crash ", r) 284 } 285 }() 286 pass := C.GoString(passphrase) 287 msg := C.GoString(encryptedMessage) 288 289 return WithJSON(zcncore.CryptoJsDecrypt(pass, msg)) 290 } 291 292 // GetPublicEncryptionKey get public encryption key by mnemonic 293 // 294 // return 295 // { 296 // "error":"", 297 // "result":"xxxx", 298 // } 299 // 300 //export GetPublicEncryptionKey 301 func GetPublicEncryptionKey(mnemonics *C.char) *C.char { 302 defer func() { 303 if r := recover(); r != nil { 304 log.Error("win: crash ", r) 305 } 306 }() 307 m := C.GoString(mnemonics) 308 return WithJSON(zcncore.GetPublicEncryptionKey(m)) 309 } 310 311 // GetLookupHash get lookup hash with allocation id and path 312 // ## Inputs: 313 // - allocationID 314 // - path 315 // return 316 // { 317 // "error":"", 318 // "result":"xxxx", 319 // } 320 // 321 //export GetLookupHash 322 func GetLookupHash(allocationID *C.char, path *C.char) *C.char { 323 defer func() { 324 if r := recover(); r != nil { 325 log.Error("win: crash ", r) 326 } 327 }() 328 hash := getLookupHash(C.GoString(allocationID), C.GoString(path)) 329 return WithJSON(hash, nil) 330 } 331 332 // SetFFmpeg set the full file name of ffmpeg.exe 333 // ## Inputs: 334 // - fullFileName 335 // return 336 // { 337 // "error":"", 338 // "result":true, 339 // } 340 // 341 //export SetFFmpeg 342 func SetFFmpeg(fullFileName *C.char) *C.char { 343 defer func() { 344 if r := recover(); r != nil { 345 log.Error("win: crash ", r) 346 } 347 }() 348 f := C.GoString(fullFileName) 349 350 _, err := os.Stat(f) 351 if os.IsNotExist(err) { 352 return WithJSON(false, err) 353 } 354 sdk.CmdFFmpeg = C.GoString(fullFileName) 355 return WithJSON(true, nil) 356 } 357 358 // GetFileContentType get content/MIME type of file 359 // ## Inputs: 360 // - fullFileName 361 // return 362 // { 363 // "error":"", 364 // "result":true, 365 // } 366 // 367 //export GetFileContentType 368 func GetFileContentType(file *C.char) *C.char { 369 defer func() { 370 if r := recover(); r != nil { 371 log.Error("win: crash ", r) 372 } 373 }() 374 fileName := C.GoString(file) 375 f, err := os.Open(fileName) 376 if err != nil { 377 log.Error("win: ", err) 378 return WithJSON("", err) 379 } 380 defer f.Close() 381 382 mime, err := zboxutil.GetFileContentType(path.Ext(fileName), f) 383 if err != nil { 384 return WithJSON("", err) 385 } 386 387 return WithJSON(mime, nil) 388 }