興味本位でGo言語に触れてみようと思う。WSLで32bit Windows実行ファイルを生成して32bit DLLを呼び出すってしてみるってのでさらに、引数とか戻り値とかに配列を使いたいんです。
例題として、いつものRijndaelにします。Rijndaelのソースはこの記事(今さらJava(Eclipse)(3))の下の方にある。
フォルダ構成はこんな感じ。
- calldll32_2
- ├── calldll32_2.go
- └── rijndael
- ├── Makefile
- ├── Makefile_64
- ├── Makefile_Lin
- ├── rijndael.c
- ├── rijndael.def
- ├── rijndael.map
- ├── rijndael_main.c
- ├── test.c
- ├── test_64.c
- └── test_Lin.c
なんとなくこちらが参考になるっちゃーなる。mkwinsyscallってのを使う前提の記事なのでズバリの記事ではない。まぁポインタを引数にするときの書き方がわかるっちゃーわかる。結果として。 で、こうなる。
calldll32_2.go
- package main
-
- import (
- "fmt"
- "syscall"
- "unsafe"
- )
-
- var (
- hdll,_=syscall.LoadLibrary("rijndael\\rijndael.dll")
- aes128encrypt,_=syscall.GetProcAddress(hdll,"AES128Encrypt")
- aes128decrypt,_=syscall.GetProcAddress(hdll,"AES128Decrypt")
- )
-
- func AES128Encrypt(plain *uint8,key *uint8,crypted *uint8)(r uint32){
- var nargs uintptr=3
- ret,_,_:=syscall.Syscall9(uintptr(aes128encrypt),
- nargs,
- uintptr(unsafe.Pointer(plain)),
- uintptr(unsafe.Pointer(key)),
- uintptr(unsafe.Pointer(crypted)),
- 0,0,0,0,0,0)
- r=uint32(ret)
- return
- }
- func AES128Decrypt(crypted *uint8,key *uint8,plain *uint8)(r uint32){
- var nargs uintptr=3
- ret,_,_:=syscall.Syscall9(uintptr(aes128decrypt),
- nargs,
- uintptr(unsafe.Pointer(crypted)),
- uintptr(unsafe.Pointer(key)),
- uintptr(unsafe.Pointer(plain)),
- 0,0,0,0,0,0)
- r=uint32(ret)
- return
- }
-
- func main() {
- plain:= [...]uint8{0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff}
- key:=[...]uint8{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}
- crypted:=[...]uint8{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
- plain_r:=[...]uint8{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
- defer syscall.FreeLibrary(hdll)
- AES128Encrypt(&plain[0],&key[0],&crypted[0])
- fmt.Printf("%02X\n", crypted)
- AES128Decrypt(&crypted[0],&key[0],&plain_r[0])
- fmt.Printf("%02X\n", plain_r)
- }
cd rijndael
make
make test
./test.exe
cd ..
GOOS=windows GOARCH=386 go run calldll32_2.go
で、rijndaelフォルダに作ってあるCによるテストコードとの一致も確認できた。
、、、全然Goしてないじゃないかー(ꐦ°᷄д°᷅)、、、って言わんでー(´•̥ ω •̥` )
0 件のコメント:
コメントを投稿