int i2d_DSA_PUBKEY_backwards(DSA *dsa, unsigned char **ptr) { unsigned char *buf; int len; len = i2d_DSA_PUBKEY(dsa, NULL); if (len < 0) return 0; *ptr = buf = OPENSSL_malloc(len); return i2d_DSA_PUBKEY(dsa, &buf); }
// See https://tools.ietf.org/html/rfc4253: ... the "ssh-dss" key format has ... SEXP R_dsa_pubkey_build(SEXP p, SEXP q, SEXP g, SEXP y){ DSA *dsa = DSA_new(); MY_DSA_set0_pqg(dsa, new_bignum_from_r(p), new_bignum_from_r(q), new_bignum_from_r(g)); MY_DSA_set0_key(dsa, new_bignum_from_r(y), NULL); unsigned char *buf = NULL; int len = i2d_DSA_PUBKEY(dsa, &buf); bail(len); DSA_free(dsa); SEXP res = allocVector(RAWSXP, len); memcpy(RAW(res), buf, len); OPENSSL_free(buf); return res; }
int isns_dsa_encode_public(EVP_PKEY *pkey, void **ptr, size_t *len) { int bytes; *ptr = NULL; bytes = i2d_DSA_PUBKEY(EVP_PKEY_get0_DSA(pkey), (unsigned char **) ptr); if (bytes < 0) return 0; *len = bytes; return 1; }