SEXP R_dsa_pubkey_decompose(SEXP bin){ DSA *dsa = DSA_new(); const unsigned char *ptr = RAW(bin); bail(!!d2i_DSA_PUBKEY(&dsa, &ptr, LENGTH(bin))); const BIGNUM *p, *q, *g, *pub_key; MY_DSA_get0_pqg(dsa, &p, &q, &g); MY_DSA_get0_key(dsa, &pub_key, NULL); SEXP res = PROTECT(allocVector(VECSXP, 4)); SET_VECTOR_ELT(res, 0, bignum_to_r(p)); SET_VECTOR_ELT(res, 1, bignum_to_r(q)); SET_VECTOR_ELT(res, 2, bignum_to_r(g)); SET_VECTOR_ELT(res, 3, bignum_to_r(pub_key)); UNPROTECT(1); return res; }
EVP_PKEY * isns_dsa_decode_public(const void *ptr, size_t len) { const unsigned char *der = ptr; EVP_PKEY *evp; DSA *dsa; /* Assigning ptr to a temporary variable avoids a silly * compiled warning about type-punning. */ dsa = d2i_DSA_PUBKEY(NULL, &der, len); if (dsa == NULL) return NULL; evp = EVP_PKEY_new(); EVP_PKEY_assign_DSA(evp, dsa); return evp; }