I'm making an RPC call using a Java library, I'm taking refrence from a GO code which I need to convert to java. I fairly know nothing about the go syntax. Can anyone help me describe the following code :
Params: []interface{}{
from, // first parameter is address to send from (where the ZEC comes from)
[]interface{}{
map[string]interface{}{
"amount": msgval,
"address": to,
"memo": hex.EncodeToString([]byte(msg)),
},
},
Below is how, I'm trying the equivalent Java code :
Map<String,Object> params = new HashMap<>();
params.put( "from", fromAddress );
params.put( "amount", 1.0000 );
params.put( "address", toAddress );
params.put( "memo", hexMessage );
Below is the argument description :
This is an Asynchronous RPC call. Send funds from an address to multiple outputs. The address can be a taddr or a zaddr. Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay. Each output address can be in taddr or zaddr format. When sending to a zaddr, you also have the option of of attaching a memo in hexadecimal format.
Is this correct?
Params: []interface{}{
from, // first parameter is address to send from (where the ZEC comes from)
[]interface{}{
map[string]interface{}{
"amount": msgval,
"address": to,
"memo": hex.EncodeToString([]byte(msg)),
},
},
Reads roughly like this pseudocode:
Params => Array<Object>(
$from,
Array<Object>(
Hash<String, Object>(
"amount" => msgval,
"address" => to,
"memo" => hex.EncodeToString(msg),
)
)
)
So, whatever to put in Params
is
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"fmt"
"io/ioutil"
)
func main() {
secret := `pmhEIVuc+ZrrJalQolxyDITZo7PqnTzluZJnKJWEJzXOWgHpDpx+/ijstSJ0wQPllQcjoIJ7yG3Q7HTq6KEeH18VfmAfRCFIzm/pGeNYvckGxHmXJLaZvq4uZB3Nx2nh1WCGw4Zsxy9RLrGMm8IslvzM5T8i/8+cFoM9gvsk9WQq3vyc8j/8lwGE1lHvhD0dmxpKzTDGhP3h5M+H6VACTP77Kz1blO1Oyn/rE7xaqr+zWDEkq/OBSqvZrTxGpJbPt+GcJq9yqq8gQu0ks6h3SEcEtZRmO9kL/UY62XmMgKiQe+1sKO/fpIetDqf4/2Bf5C2SEF2X0BtBG47hC9oLwipgfPtjto8RBFpIcFxJgP75V39lBTAWIMXPNec7b+OWdx/4Fqdj9lvVJV8ez1WIBzCVUVRbBpxz6rbqv3sKhn2xHYkFNENniPLVRIkn1QgGO7HOe7H0yClWjEEoJsSIvxdqIXRAKqdtfLPDL8dSMxSqmjxfOn7fZ51N42JwLWH3bdhScVFpFekl4pXUIOHMjpXPvxPwF9s2s9VQtXO7f9i8f3K5qBOBXbeVmSch2kxF6V+y0gABCcJ8yuMOgYUKdq05aAecSm3UfNcej3ygRXrpeBpuwrG4zHh6Y4CVB2l5d5FnZBnU6uFP3UgeyUIkxw/pxfF8fDc9oNDjvx9koSU=`
content := `+oY3RKkVzstJjpaBz523z9960f/KKNfV1hrYW9bUVJ0AMwwQQfa0Zi09VH3WGac8qPpZkRodMxBIMl7suYD8ck95JI4K1mnO84nacf9sh0y8577N0zYWfhaIaapiFi/ZbX3J0aJr3gMjSk+/fIjXw99kTjZEEyDtvqyvc8K8XDaa4uQbAz10Vpf61+6I7cPKfXmdWUD53ZLweoLQZfLhnH1XK3bheX6SKRR33N/NzEwE/qbaANs2f6OL7HhjyiR58BEjg+At9c26pD5n170JoadgKVjsLZk0L2+2zMJKHuxnjtm8KxqimObZB2riIXmobA2tZmQQBx2CQGwDeqeUkxbO+uxxfb4sWKeViU90QpfDNqCTELiTkS0KnVpadzSt908rdx7w3lFuIDbqZXwClutORdASz2s1t856aLnT89UT1Tm25MWcX0kAGIaw8xYwOdoUEyk0g+4d0ZVcGUDFlU2L/8mQ9jG4YTAm/9dQH57o1s+2wTuRpmltdhAXVA==`
dec, err := Decrypt("./test.private.txt", secret, content)
if err != nil {
fmt.Println(err)
}
fmt.Println(dec)
}
// Decrypt RSA-OAEP-256 + AES-256-GCM
func Decrypt(file, encSecret, encData string) (string, error) {
// PREPARE PRIVATE KEY
data, err := ioutil.ReadFile(file)
if err != nil {
return "", err
}
block, _ := pem.Decode(data)
if block == nil {
return "", fmt.Errorf("block nil")
}
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return "", err
}
// fmt.Printf("PRIVATE ==\n%s\n==\n", base64.StdEncoding.EncodeToString(block.Bytes))
// DECRYPT RSA-OAEP-256 --> SECRET
bsecret, _ := base64.StdEncoding.DecodeString(encSecret)
secret, err := rsa.DecryptOAEP(
sha256.New(),
rand.Reader,
priv,
bsecret,
nil,
)
fmt.Println(len(secret), "SECRET: ", string(secret))
// PREPARE AES-GCM CIPHER
cipherBlock, err := aes.NewCipher(secret)
if err != nil {
return "", err
}
aesgcm, err := cipher.NewGCM(cipherBlock)
if err != nil {
return "", err
}
// DECRYPT AES-256-GCM
decoded, _ := base64.StdEncoding.DecodeString(encData)
bnonce := decoded[len(decoded)-12:] // last 12 bytes
btext := decoded[:len(decoded)-12] // the rest of bytes
plaintext, err := aesgcm.Open(nil, bnonce, btext, nil)
if err != nil {
return "", err
}
fmt.Println(len(bnonce), "NONCE BASE64:", base64.StdEncoding.EncodeToString(bnonce))
fmt.Println(len(btext), "CIPHER BASE64:", base64.StdEncoding.EncodeToString(btext))
return string(plaintext), nil
}