2025年2月1日土曜日

Go言語入門(5)

 

興味本位で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
  1. package main
  2.  
  3. import (
  4.     "fmt"
  5.     "syscall"
  6.     "unsafe"
  7. )
  8.  
  9. var (
  10.     hdll,_=syscall.LoadLibrary("rijndael\\rijndael.dll")
  11.     aes128encrypt,_=syscall.GetProcAddress(hdll,"AES128Encrypt")
  12.     aes128decrypt,_=syscall.GetProcAddress(hdll,"AES128Decrypt")
  13. )
  14.  
  15. func AES128Encrypt(plain *uint8,key *uint8,crypted *uint8)(r uint32){
  16.     var nargs uintptr=3
  17.     ret,_,_:=syscall.Syscall9(uintptr(aes128encrypt),
  18.     nargs,
  19.     uintptr(unsafe.Pointer(plain)),
  20.     uintptr(unsafe.Pointer(key)),
  21.     uintptr(unsafe.Pointer(crypted)),
  22.     0,0,0,0,0,0)
  23.     r=uint32(ret)
  24.     return
  25. }
  26. func AES128Decrypt(crypted *uint8,key *uint8,plain *uint8)(r uint32){
  27.     var nargs uintptr=3
  28.     ret,_,_:=syscall.Syscall9(uintptr(aes128decrypt),
  29.     nargs,
  30.     uintptr(unsafe.Pointer(crypted)),
  31.     uintptr(unsafe.Pointer(key)),
  32.     uintptr(unsafe.Pointer(plain)),
  33.     0,0,0,0,0,0)
  34.     r=uint32(ret)
  35.     return
  36. }
  37.  
  38. func main() {
  39.     plain:= [...]uint8{0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff}
  40.     key:=[...]uint8{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f}
  41.     crypted:=[...]uint8{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
  42.     plain_r:=[...]uint8{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}
  43.     defer syscall.FreeLibrary(hdll)
  44.     AES128Encrypt(&plain[0],&key[0],&crypted[0])
  45.     fmt.Printf("%02X\n", crypted)
  46.     AES128Decrypt(&crypted[0],&key[0],&plain_r[0])
  47.     fmt.Printf("%02X\n", plain_r)
  48. }
では、実行してみる。
cd rijndael
make
make test
./test.exe
cd ..
GOOS=windows GOARCH=386 go run calldll32_2.go
で、rijndaelフォルダに作ってあるCによるテストコードとの一致も確認できた。

、、、全然Goしてないじゃないかー(ꐦ°᷄д°᷅)、、、って言わんでー(´•̥ ω •̥` )

0 件のコメント:

コメントを投稿