32bit DLLを64bitアプリからcallすることはできません(ちなみに逆もできません)。需要はあるけど面倒なこの課題に取り組む。
これみてちょ。
PATH="$PATH:$HOME/go/bin"
mkdir grpctry4
cd grpctry4
mkdir proto
mkdir server
mkdir client
go mod init grpc/grpctry4
- syntax = "proto3";
- package grpctry4;
- option go_package = "./proto";
- service MyAESEncrypter {
- rpc AESEncrypt (Plain_and_Key) returns (Cipher) {}
- }
-
- message Plain_and_Key {
- bytes plain=1;
- bytes key=2;
- }
-
- message Cipher {
- bytes result=1;
- }
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative proto/grpctry4.proto
go get google.golang.org/grpc
- package main
-
- import (
- "context"
- "flag"
- "fmt"
- "log"
- "net"
- "syscall"
- "unsafe"
-
- pb "grpc/grpctry4/proto"
-
- "google.golang.org/grpc"
- )
-
- var (
- hdll, _ = syscall.LoadLibrary("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
- }
-
- var (
- port = flag.Int("port", 50051, "The server port")
- )
-
- type server struct {
- pb.UnimplementedMyAESEncrypterServer
- }
-
- func (s *server) AESEncrypt(_ context.Context, in *pb.PlainAnd_Key) (*pb.Cipher, error) {
- var d1 []byte = in.GetPlain()
- var d2 []byte = in.GetKey()
- var d1arr [16]byte = *(*[16]byte)(d1[:16])
- var d2arr [16]byte = *(*[16]byte)(d2[:16])
- var d3arr [16]byte
- //defer syscall.FreeLibrary(hdll)
- AES128Encrypt(&d1arr[0], &d2arr[0], &d3arr[0])
- return &pb.Cipher{Result: d3arr[:]}, nil
- }
- func main() {
- flag.Parse()
- lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
- if err != nil {
- log.Fatalf("failed to listen: %v", err)
- }
- s := grpc.NewServer()
- pb.RegisterMyAESEncrypterServer(s, &server{})
- log.Printf("server listening at %v", lis.Addr())
- if err := s.Serve(lis); err != nil {
- log.Fatalf("failed to serve: %v", err)
- }
- defer syscall.FreeLibrary(hdll)
- }
cd server
GOOS=windows GOARCH=386 go build -o ../grpctry4_server.exe main.go
cd ..
- package main
-
- /*
- #include <stdint.h>
- */
- import "C"
-
- import (
- "context"
- "flag"
- "fmt"
- "log"
- "os/exec"
- "time"
- "unsafe"
-
- pb "grpc/grpctry4/proto"
-
- "google.golang.org/grpc"
- "google.golang.org/grpc/credentials/insecure"
- )
-
- var (
- addr = flag.String("addr", "localhost:50051", "the address to connect to")
- )
- var cmd *exec.Cmd
-
- func init() {
- srv_start_cmd := "./grpctry4_server.exe"
- src_start_arg := ""
- cmd = exec.Command(srv_start_cmd, src_start_arg)
- cmd.Start()
- fmt.Println(cmd.Process.Pid)
- }
-
- type arr16 struct {
- v [16]C.uint8_t
- }
-
- //export AES128Encrypt
- func AES128Encrypt(cp *C.uint8_t, ck *C.uint8_t, cc *C.uint8_t) {
- acp := (*arr16)(unsafe.Pointer(cp))
- ack := (*arr16)(unsafe.Pointer(ck))
- acc := (*arr16)(unsafe.Pointer(cc))
- ppp := []byte{}
- kkk := []byte{}
- ccc := []byte{}
- for i := 0; i < 16; i++ {
- ppp = append(ppp, (uint8)((*acp).v[i]))
- kkk = append(kkk, (uint8)((*ack).v[i]))
- }
- defer cmd.Process.Kill()
- // Set up a connection to the server.
- dialOpts := []grpc.DialOption{
- grpc.WithTransportCredentials(insecure.NewCredentials()),
- grpc.WithDefaultCallOptions(grpc.WaitForReady(true)),
- }
- conn, err := grpc.NewClient(*addr, dialOpts...)
- if err != nil {
- log.Fatalf("did not connect: %v", err)
- }
- defer conn.Close()
- c := pb.NewMyAESEncrypterClient(conn)
- // Contact the server and print out its response.
- ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
- defer cancel()
- r, err := c.AESEncrypt(ctx, &pb.PlainAnd_Key{Plain: ppp, Key: kkk})
- if err != nil {
- log.Fatalf("could not greet: %v", err)
- }
- ccc = r.GetResult()
- for i := 0; i < 16; i++ {
- (*acc).v[i] = (C.uint8_t)(ccc[i])
- }
- }
- func main() {
- /*
- p := [...]C.uint8_t{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}
- k := [...]C.uint8_t{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}
- c := [...]C.uint8_t{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
- fmt.Printf("% 02X\n", p)
- fmt.Printf("% 02X\n", k)
- AES128Encrypt_grpcexec(&p[0], &k[0], &c[0])
- fmt.Printf("% 02X\n", c)
- */
- }
- OPT_CC= CC=x86_64-w64-mingw32-gcc
- #OPT_CC= CC=i686-w64-mingw32-gcc
- OPT_CGO= CGO_ENABLED=1
- OPT_OS= GOOS=windows
- OPT_ARCH= GOARCH=amd64
- #OPT_ARCH= GOARCH=386
- GOFLAGS=build -buildmode=c-shared
- #GOFLAGS=build -ldflags "-s -w" -buildmode=c-shared
- GO=go
- #SRCS=dll64wdllmain.go dllmain.go
- SRCS=main.go
- TARGET=../grpctry4_client.dll
-
- $(TARGET) : $(SRCS)
- $(OPT_CC) $(OPT_CGO) $(OPT_OS) $(OPT_ARCH) $(GO) $(GOFLAGS) -o $(TARGET) $(SRCS)
-
- clean :
- rm $(TARGET)
cd client
make
cd ..
- #include <stdio.h>
- #include <stdint.h>
- #include <windows.h>
- typedef int (__stdcall *AES128Encrypt_type)(uint8_t* a,uint8_t* b,uint8_t* c);
- HMODULE dll;
- AES128Encrypt_type AES128Encrypt;
-
- int main(int argc,char** argv){
- int r,i;
- uint8_t aa[16]={0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
- uint8_t bb[16]={0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
- uint8_t cc[16]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
- dll=LoadLibrary("grpctry4_client.dll");
- AES128Encrypt=(AES128Encrypt_type)GetProcAddress(dll,"AES128Encrypt");
- for(i=0;i<16;i++){
- printf("%02x",aa[i]);
- }
- printf("\n");
- for(i=0;i<16;i++){
- printf("%02x",bb[i]);
- }
- printf("\n");
- r=AES128Encrypt(aa,bb,cc);
- for(i=0;i<16;i++){
- printf("%02x",cc[i]);
- }
- printf("\n");
- return 0;
- }
x86_64-w64-mingw32-gcc grpctry4_test_64.c
- .
- ├── a.exe
- ├── client
- │ ├── Makefile
- │ ├── dllmain.h
- │ └── main.go
- ├── go.mod
- ├── go.sum
- ├── grpctry4_client.dll
- ├── grpctry4_client.h
- ├── grpctry4_server.exe
- ├── grpctry4_test_64.c
- ├── proto
- │ ├── grpctry4.pb.go
- │ ├── grpctry4.proto
- │ └── grpctry4_grpc.pb.go
- ├── rijndael.dll
- └── server
- └── main.go
./a.exe
PATH="$PATH:$HOME/go/bin"
mkdir grpctry3
cd grpctry3
mkdir proto
mkdir server
mkdir client
go mod init grpc/grpctry3
- syntax = "proto3";
- package grpctry3;
- option go_package = "./proto";
- service MyAESEncrypter {
- rpc AESEncrypt (Plain_and_Key) returns (Cipher) {}
- }
-
- message Plain_and_Key {
- bytes plain=1;
- bytes key=2;
- }
-
- message Cipher {
- bytes result=1;
- }
- package main
-
- import (
- "context"
- "flag"
- "fmt"
- "log"
- "net"
- "syscall"
- "unsafe"
-
- pb "grpc/grpctry3/proto"
-
- "google.golang.org/grpc"
- )
-
- var (
- hdll, _ = syscall.LoadLibrary("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
- }
-
- var (
- port = flag.Int("port", 50051, "The server port")
- )
-
- type server struct {
- pb.UnimplementedMyAESEncrypterServer
- }
-
- func (s *server) AESEncrypt(_ context.Context, in *pb.PlainAnd_Key) (*pb.Cipher, error) {
- var d1 []byte = in.GetPlain()
- var d2 []byte = in.GetKey()
- var d1arr [16]byte = *(*[16]byte)(d1[:16])
- var d2arr [16]byte = *(*[16]byte)(d2[:16])
- var d3arr [16]byte
- //defer syscall.FreeLibrary(hdll)
- AES128Encrypt(&d1arr[0], &d2arr[0], &d3arr[0])
- return &pb.Cipher{Result: d3arr[:]}, nil
- }
- func main() {
- flag.Parse()
- lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
- if err != nil {
- log.Fatalf("failed to listen: %v", err)
- }
- s := grpc.NewServer()
- pb.RegisterMyAESEncrypterServer(s, &server{})
- log.Printf("server listening at %v", lis.Addr())
- if err := s.Serve(lis); err != nil {
- log.Fatalf("failed to serve: %v", err)
- }
- defer syscall.FreeLibrary(hdll)
- }
- package main
-
- /*
- #include <stdint.h>
- */
- import "C"
-
- import (
- "context"
- "flag"
- "fmt"
- "log"
- "os/exec"
- "time"
- "unsafe"
-
- pb "grpc/grpctry3/proto"
-
- "google.golang.org/grpc"
- "google.golang.org/grpc/credentials/insecure"
- )
-
- var (
- addr = flag.String("addr", "localhost:50051", "the address to connect to")
- )
- var cmd *exec.Cmd
-
- func init() {
- srv_start_cmd := "./grpctry3_server.exe"
- src_start_arg := ""
- cmd = exec.Command(srv_start_cmd, src_start_arg)
- cmd.Start()
- fmt.Println(cmd.Process.Pid)
- }
-
- type arr16 struct {
- v [16]C.uint8_t
- }
-
- func AES128Encrypt_grpcexec(cp *C.uint8_t, ck *C.uint8_t, cc *C.uint8_t) {
- acp := (*arr16)(unsafe.Pointer(cp))
- ack := (*arr16)(unsafe.Pointer(ck))
- acc := (*arr16)(unsafe.Pointer(cc))
- ppp := []byte{}
- kkk := []byte{}
- ccc := []byte{}
- for i := 0; i < 16; i++ {
- ppp = append(ppp, (uint8)((*acp).v[i]))
- kkk = append(kkk, (uint8)((*ack).v[i]))
- }
- defer cmd.Process.Kill()
-
- // Set up a connection to the server.
- dialOpts := []grpc.DialOption{
- grpc.WithTransportCredentials(insecure.NewCredentials()),
- grpc.WithDefaultCallOptions(grpc.WaitForReady(true)),
- }
-
- conn, err := grpc.NewClient(*addr, dialOpts...)
- if err != nil {
- log.Fatalf("did not connect: %v", err)
- }
- defer conn.Close()
- c := pb.NewMyAESEncrypterClient(conn)
-
- // Contact the server and print out its response.
- ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
- defer cancel()
- r, err := c.AESEncrypt(ctx, &pb.PlainAnd_Key{Plain: ppp, Key: kkk})
- if err != nil {
- log.Fatalf("could not greet: %v", err)
- }
- ccc = r.GetResult()
- for i := 0; i < 16; i++ {
- (*acc).v[i] = (C.uint8_t)(ccc[i])
- }
- }
- func main() {
- p := [...]C.uint8_t{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}
- k := [...]C.uint8_t{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}
- c := [...]C.uint8_t{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
- fmt.Printf("% 02X\n", p)
- fmt.Printf("% 02X\n", k)
- AES128Encrypt_grpcexec(&p[0], &k[0], &c[0])
- fmt.Printf("% 02X\n", c)
- }
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative proto/grpctry3.proto
go get google.golang.org/grpc
cd server
GOOS=windows GOARCH=386 go build -o ../grpctry3_server.exe main.go
cd ..
cd client
CC=x86_64-w64-mingw32-gcc CGO_ENABLED=1 GOOS=windows GOARCH=amd64 go build -o ../grpctry3_client.exe main.go
cd ..
- .
- ├── client
- │ └── main.go
- ├── go.mod
- ├── go.sum
- ├── grpctry3_client.exe
- ├── grpctry3_server.exe
- ├── proto
- │ ├── grpctry3.pb.go
- │ ├── grpctry3.proto
- │ └── grpctry3_grpc.pb.go
- ├── rijndael.dll
- └── server
- └── main.go
- #include <Flash.h>
-
- const uint8_t test1[] PROGMEM_SECTION1={
- 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff
- };
-
- const uint8_t test2[] PROGMEM_SECTION2={
- 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f
- };
-
- const uint8_t test3[] PROGMEM_SECTION3={
- 0x69, 0xC4, 0xE0, 0xD8, 0x6A, 0x7B, 0x04, 0x30, 0xD8, 0xCD, 0xB7, 0x80, 0x70, 0xB4, 0xC5, 0x5A
- };
-
- uint8_t v[16];
-
- void setup(){
- uint8_t i;
- uint32_t adr1,adr2,adr3;
- adr1=0x00008000;
- adr2=0x00010000;
- adr3=0x00018000;
- char buf[80];
- Serial2.begin(115200);
- while (!Serial2 && millis() < 5000);
- Serial2.println((uint32_t)(&test1[0]),HEX);
- Serial2.println((uint32_t)(&test2[0]),HEX);
- Serial2.println((uint32_t)(&test3[0]),HEX);
- for(i=0;i<16;i++){
- v[i]=Flash.readByte(adr1+i);
- }
- sprintf(buf,"%08lX : ",adr1);Serial2.print(buf);
- for(i=0;i<16;i++){
- sprintf(buf,"%02X ",v[i]);Serial2.print(buf);
- }
- Serial2.println("");
-
- for(i=0;i<16;i++){
- v[i]=Flash.readByte(adr2+i);
- }
- sprintf(buf,"%08lX : ",adr2);Serial2.print(buf);
- for(i=0;i<16;i++){
- sprintf(buf,"%02X ",v[i]);Serial2.print(buf);
- }
- Serial2.println("");
-
- for(i=0;i<16;i++){
- v[i]=Flash.readByte(adr3+i);
- }
- sprintf(buf,"%08lX : ",adr3);Serial2.print(buf);
- for(i=0;i<16;i++){
- sprintf(buf,"%02X ",v[i]);Serial2.print(buf);
- }
- Serial2.println("");
-
- }
- void loop(){
-
- }
- {
- "configuration": "chip=avr128db28,clock=16crystal,bodvoltage=1v9,bodmode=disabled,resetpin=reset,entrycond=default,millis=tcb2,printf=default,attach=allenabled,mvioopti=enabled,startuptime=64,wiremode=mors,bootloaderusart=ser2,WDTtimeout=disabled,WDTwindow=disabled,flmap=lockdefault",
- "output": "./build",
- "board": "DxCore:megaavr:avrdbopti",
- "sketch": "upperpgmtry1.ino",
- "port": "/dev/ttyUSB0"
- }
mkdir grpctry2
cd grpctry2
mkdir proto
mkdir server
mkdir client
go mod init grpc/grpctry2
- syntax = "proto3";
- package grpctry2;
- option go_package = "./proto";
- service MyAESEncrypter {
- rpc AESEncrypt (Plain_and_Key) returns (Cipher) {}
- }
-
- message Plain_and_Key {
- bytes plain=1;
- bytes key=2;
- }
-
- message Cipher {
- bytes result=1;
- }
echo $PATH | grep go
PATH="$PATH:$HOME/go/bin"
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative proto/grpctry2.proto
- package main
-
- import (
- "context"
- "flag"
- "fmt"
- "log"
- "time"
-
- pb "grpc/grpctry2/proto"
-
- "google.golang.org/grpc"
- "google.golang.org/grpc/credentials/insecure"
- )
-
- var (
- addr = flag.String("addr", "localhost:50051", "the address to connect to")
- )
-
- func main() {
- p := []byte{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}
- k := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}
- flag.Parse()
- // Set up a connection to the server.
- conn, err := grpc.NewClient(*addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
- if err != nil {
- log.Fatalf("did not connect: %v", err)
- }
- defer conn.Close()
- c := pb.NewMyAESEncrypterClient(conn)
-
- // Contact the server and print out its response.
- ctx, cancel := context.WithTimeout(context.Background(), time.Second)
- defer cancel()
- r, err := c.AESEncrypt(ctx, &pb.PlainAnd_Key{Plain: p, Key: k})
- if err != nil {
- log.Fatalf("could not greet: %v", err)
- }
- var res []byte = r.GetResult()
- fmt.Printf("% 02X\n", res)
- }
go get google.golang.org/grpc
cd client
GOOS=windows GOARCH=amd64 go build -o ../grpctry2_client.exe main.go
cd ..
- package main
- import (
- "context"
- "flag"
- "fmt"
- "log"
- "net"
-
- pb "grpc/grpctry2/proto"
-
- "google.golang.org/grpc"
- )
-
- var (
- port = flag.Int("port", 50051, "The server port")
- )
-
- // server is used to implement helloworld.GreeterServer.
- type server struct {
- pb.UnimplementedMyAESEncrypterServer
- }
-
- // SayHello implements helloworld.GreeterServer
- func (s *server) AESEncrypt(_ context.Context, in *pb.PlainAnd_Key) (*pb.Cipher, error) {
- var d1 []byte = in.GetPlain()
- var d2 []byte = in.GetKey()
- d3 := []byte{}
- for i := 0; i < 16; i++ {
- d3 = append(d3, d1[i]^d2[i])
- }
-
- return &pb.Cipher{Result: d3}, nil
- }
- func main() {
- flag.Parse()
- lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
- if err != nil {
- log.Fatalf("failed to listen: %v", err)
- }
- s := grpc.NewServer()
- pb.RegisterMyAESEncrypterServer(s, &server{})
- log.Printf("server listening at %v", lis.Addr())
- if err := s.Serve(lis); err != nil {
- log.Fatalf("failed to serve: %v", err)
- }
- }
cd server
GOOS=windows GOARCH=386 go build -o ../grpctry2_server.exe main.go
cd ..
- package main
-
- import (
- "context"
- "flag"
- "fmt"
- "log"
- "net"
- "syscall"
- "unsafe"
-
- pb "grpc/grpctry2/proto"
-
- "google.golang.org/grpc"
- )
-
- var (
- hdll, _ = syscall.LoadLibrary("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
- }
-
- var (
- port = flag.Int("port", 50051, "The server port")
- )
-
- type server struct {
- pb.UnimplementedMyAESEncrypterServer
- }
-
- func (s *server) AESEncrypt(_ context.Context, in *pb.PlainAnd_Key) (*pb.Cipher, error) {
- var d1 []byte = in.GetPlain()
- var d2 []byte = in.GetKey()
- var d1arr [16]byte = *(*[16]byte)(d1[:16])
- var d2arr [16]byte = *(*[16]byte)(d2[:16])
- var d3arr [16]byte
- defer syscall.FreeLibrary(hdll)
- AES128Encrypt(&d1arr[0], &d2arr[0], &d3arr[0])
- return &pb.Cipher{Result: d3arr[:]}, nil
- }
- func main() {
- flag.Parse()
- lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
- if err != nil {
- log.Fatalf("failed to listen: %v", err)
- }
- s := grpc.NewServer()
- pb.RegisterMyAESEncrypterServer(s, &server{})
- log.Printf("server listening at %v", lis.Addr())
- if err := s.Serve(lis); err != nil {
- log.Fatalf("failed to serve: %v", err)
- }
- }
mkdir grpctry1
cd grpctry1
mkdir proto
mkdir server
mkdir client
go mod init grpc/grpctry1
- syntax = "proto3";
- package grpctry1;
- option go_package = "./proto";
- service MyConnector {
- rpc Connect (ConnectRequest) returns (ConnectReply) {}
- }
-
- message ConnectRequest {
- bytes data_in1=1;
- bytes data_in2=2;
- }
-
- message ConnectReply {
- bytes data_out=1;
- }
- package main
-
- import (
- "context"
- "flag"
- "fmt"
- "log"
- "net"
-
- pb "grpc/grpctry1/proto"
-
- "google.golang.org/grpc"
- )
-
- var (
- port = flag.Int("port", 50051, "The server port")
- )
-
- // server is used to implement helloworld.GreeterServer.
- type server struct {
- pb.UnimplementedMyConnectorServer
- }
-
- // SayHello implements helloworld.GreeterServer
- func (s *server) Connect(_ context.Context, in *pb.ConnectRequest) (*pb.ConnectReply, error) {
- var d1 []byte = in.GetDataIn1()
- var d2 []byte = in.GetDataIn2()
- d3 := []byte{}
- for i := 0; i < 16; i++ {
- d3 = append(d3, d1[i])
- }
- log.Println("")
- for i := 0; i < 16; i++ {
- d3 = append(d3, d2[i])
- }
-
- return &pb.ConnectReply{DataOut: d3}, nil
- }
- func main() {
- flag.Parse()
- lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
- if err != nil {
- log.Fatalf("failed to listen: %v", err)
- }
- s := grpc.NewServer()
- pb.RegisterMyConnectorServer(s, &server{})
- log.Printf("server listening at %v", lis.Addr())
- if err := s.Serve(lis); err != nil {
- log.Fatalf("failed to serve: %v", err)
- }
- }
- package main
-
- import (
- "context"
- "flag"
- "fmt"
- "log"
- "time"
-
- pb "grpc/grpctry1/proto"
-
- "google.golang.org/grpc"
- "google.golang.org/grpc/credentials/insecure"
- )
-
- var (
- addr = flag.String("addr", "localhost:50051", "the address to connect to")
- )
-
- func main() {
- d1 := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
- d2 := []byte{1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8}
- flag.Parse()
- // Set up a connection to the server.
- conn, err := grpc.NewClient(*addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
- if err != nil {
- log.Fatalf("did not connect: %v", err)
- }
- defer conn.Close()
- c := pb.NewMyConnectorClient(conn)
-
- // Contact the server and print out its response.
- ctx, cancel := context.WithTimeout(context.Background(), time.Second)
- defer cancel()
- r, err := c.Connect(ctx, &pb.ConnectRequest{DataIn1: d1, DataIn2: d2})
- if err != nil {
- log.Fatalf("could not greet: %v", err)
- }
- var d3 []byte = r.GetDataOut()
- fmt.Printf("% 02X\n", d3)
- }
option go_package = "./proto";
pb "grpc/grpctry1/proto"
pb "grpc/grpctry1/proto"
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative proto/grpctry1.proto
go run server/main.go
go get google.golang.org/grpc
cd server
GOOS=windows GOARCH=amd64 go build -o grpctry1_server.exe main.go
cd ../client
GOOS=windows GOARCH=amd64 go build -o grpctry1_client.exe main.go
cd ..