// Handle service request, req and return response over channel (ms). // This handles the one valid service request: "SecretRequest" // and terminates the channel after the first successful request // which is not generally what would happen in most channels. // Note that in the future, we might want to use grpc rather than custom // service request/response buffers but we don't want to introduce complexity // into this example. The single request response buffer is defined in // taosupport/taosupport.proto. func HandleServiceRequest(ms *util.MessageStream, serverProgramData *taosupport.TaoProgramData, clientProgramName string, req *taosupport.SimpleMessage) (bool, error) { // The somewhat boring secret is the corresponding simpleclient's program name || 43 secret := clientProgramName + "43" if *req.RequestType == "SecretRequest" { req.Data = append(req.Data, []byte(secret)) taosupport.SendResponse(ms, req) log.Printf("HandleServiceRequest response buffer: ") taosupport.PrintMessage(req) return true, nil } else { log.Printf("HandleServiceRequest response is bad request\n") errmsg := "BadRequest" req.Err = &errmsg return false, nil } }
func main() { // This holds the cloudproxy specific data for simpleclient // including the Program Cert and Program Private key. var clientProgramData taosupport.TaoProgramData // Make sure we zero keys when we're done. defer taosupport.ClearTaoProgramData(&clientProgramData) // Parse flags flag.Parse() serverAddr = *serverHost + ":" + *serverPort // If TaoParadigm completes without error, clientProgramData contains all the // Cloudproxy information needed throughout simpleclient execution. if taosupport.TaoParadigm(simpleCfg, simpleClientPath, &clientProgramData) != nil { log.Fatalln("simpleclient: Can't establish Tao") } fmt.Printf("simpleclient: TaoParadigm complete, name: %s\n", clientProgramData.TaoName) // Open the Tao Channel using the Program key. This program does all the // standard channel negotiation and presents the secure server name after // negotiation is complete. ms, serverName, err := taosupport.OpenTaoChannel(&clientProgramData, &serverAddr) if err != nil { log.Fatalln("simpleclient: Can't establish Tao Channel") } log.Printf("simpleclient: establish Tao Channel with %s, %s\n", serverAddr, serverName) // Send a simple request and get response. // We have a simple service protobuf for requests and reponsed between // simpleclient and simpleserver. There's only on request: tell me the // secret. secretRequest := "SecretRequest" msg := new(taosupport.SimpleMessage) msg.RequestType = &secretRequest taosupport.SendRequest(ms, msg) if err != nil { log.Fatalln("simpleclient: Error in response to SendRequest\n") } respmsg, err := taosupport.GetResponse(ms) if err != nil { log.Fatalln("simpleclient: Error in response to GetResponse\n") } // This is the secret. retrieveSecret := respmsg.Data[0] // Encrypt and store the secret in simpleclient's save area. out, err := taosupport.Protect(clientProgramData.ProgramSymKeys, retrieveSecret) if err != nil { log.Fatalln("simpleclient: Error protecting data\n") } err = ioutil.WriteFile(path.Join(*simpleClientPath, "retrieved_secret"), out, os.ModePerm) if err != nil { log.Fatalln("simpleclient: error saving retrieved secret\n") } // Close down. log.Printf("simpleclient: secret is %s, done\n", retrieveSecret) }