RSA decryption in openssl c++

It is necessary to decrypt the information that comes from the server, which is encrypted with the client's public key and signed by the server's private key. Therefore, it must be decrypted using the client's private key and verified using the server's public key. I have all the keys. I use a server on Go. The encryption code on the server:

    label := []byte("")
    hash := sha256.New()
    verifyKey, _ := jwt.ParseRSAPublicKeyFromPEM([]byte(tokens[ip]))
    ciphertext, err := rsa.EncryptOAEP(hash, rand.Reader, verifyKey, message, label)

    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    var opts rsa.PSSOptions
    opts.SaltLength = rsa.PSSSaltLengthAuto 
    PSSmessage := message
    newhash := crypto.SHA256
    pssh := newhash.New()
    pssh.Write(PSSmessage)
    hashed := pssh.Sum(nil)

    signature, err := rsa.SignPSS(rand.Reader, private_key, newhash, hashed, &opts)

That's what I stopped at in the client, I just don't know how to do it further... :

    unsigned char* out = new unsigned char[9999];
    BIO* kbio;
    RSA* rsa = NULL;
    kbio = BIO_new_mem_buf((void*)key.c_str(), -1); 
    rsa = PEM_read_bio_RSAPrivateKey(kbio, NULL, 0, NULL);

    RSA_private_decrypt(RSA_size(rsa), data.data(),
        out, rsa, RSA_PKCS1_PSS_PADDING); // data -  std::vector<unsigned char>

    std::string out_str((char*)out);
    delete[] out;
    return out_str;

Please tell me how to do it right for me decrypt information in c++ with openssl, thanks in advance

Author: Дмитрий Минин, 2020-08-05