1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 1999-2021 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include <stdio.h> 11e1051a39Sopenharmony_ci#include "internal/cryptlib.h" 12e1051a39Sopenharmony_ci#include <openssl/x509.h> 13e1051a39Sopenharmony_ci 14e1051a39Sopenharmony_ciint NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey) 15e1051a39Sopenharmony_ci{ 16e1051a39Sopenharmony_ci if ((x == NULL) || (x->spkac == NULL)) 17e1051a39Sopenharmony_ci return 0; 18e1051a39Sopenharmony_ci return X509_PUBKEY_set(&(x->spkac->pubkey), pkey); 19e1051a39Sopenharmony_ci} 20e1051a39Sopenharmony_ci 21e1051a39Sopenharmony_ciEVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x) 22e1051a39Sopenharmony_ci{ 23e1051a39Sopenharmony_ci if ((x == NULL) || (x->spkac == NULL)) 24e1051a39Sopenharmony_ci return NULL; 25e1051a39Sopenharmony_ci return X509_PUBKEY_get(x->spkac->pubkey); 26e1051a39Sopenharmony_ci} 27e1051a39Sopenharmony_ci 28e1051a39Sopenharmony_ci/* Load a Netscape SPKI from a base64 encoded string */ 29e1051a39Sopenharmony_ci 30e1051a39Sopenharmony_ciNETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len) 31e1051a39Sopenharmony_ci{ 32e1051a39Sopenharmony_ci unsigned char *spki_der; 33e1051a39Sopenharmony_ci const unsigned char *p; 34e1051a39Sopenharmony_ci int spki_len; 35e1051a39Sopenharmony_ci NETSCAPE_SPKI *spki; 36e1051a39Sopenharmony_ci if (len <= 0) 37e1051a39Sopenharmony_ci len = strlen(str); 38e1051a39Sopenharmony_ci if ((spki_der = OPENSSL_malloc(len + 1)) == NULL) { 39e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_X509, ERR_R_MALLOC_FAILURE); 40e1051a39Sopenharmony_ci return NULL; 41e1051a39Sopenharmony_ci } 42e1051a39Sopenharmony_ci spki_len = EVP_DecodeBlock(spki_der, (const unsigned char *)str, len); 43e1051a39Sopenharmony_ci if (spki_len < 0) { 44e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_X509, X509_R_BASE64_DECODE_ERROR); 45e1051a39Sopenharmony_ci OPENSSL_free(spki_der); 46e1051a39Sopenharmony_ci return NULL; 47e1051a39Sopenharmony_ci } 48e1051a39Sopenharmony_ci p = spki_der; 49e1051a39Sopenharmony_ci spki = d2i_NETSCAPE_SPKI(NULL, &p, spki_len); 50e1051a39Sopenharmony_ci OPENSSL_free(spki_der); 51e1051a39Sopenharmony_ci return spki; 52e1051a39Sopenharmony_ci} 53e1051a39Sopenharmony_ci 54e1051a39Sopenharmony_ci/* Generate a base64 encoded string from an SPKI */ 55e1051a39Sopenharmony_ci 56e1051a39Sopenharmony_cichar *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *spki) 57e1051a39Sopenharmony_ci{ 58e1051a39Sopenharmony_ci unsigned char *der_spki, *p; 59e1051a39Sopenharmony_ci char *b64_str; 60e1051a39Sopenharmony_ci int der_len; 61e1051a39Sopenharmony_ci 62e1051a39Sopenharmony_ci der_len = i2d_NETSCAPE_SPKI(spki, NULL); 63e1051a39Sopenharmony_ci if (der_len <= 0) 64e1051a39Sopenharmony_ci return NULL; 65e1051a39Sopenharmony_ci der_spki = OPENSSL_malloc(der_len); 66e1051a39Sopenharmony_ci b64_str = OPENSSL_malloc(der_len * 2); 67e1051a39Sopenharmony_ci if (der_spki == NULL || b64_str == NULL) { 68e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_X509, ERR_R_MALLOC_FAILURE); 69e1051a39Sopenharmony_ci OPENSSL_free(der_spki); 70e1051a39Sopenharmony_ci OPENSSL_free(b64_str); 71e1051a39Sopenharmony_ci return NULL; 72e1051a39Sopenharmony_ci } 73e1051a39Sopenharmony_ci p = der_spki; 74e1051a39Sopenharmony_ci i2d_NETSCAPE_SPKI(spki, &p); 75e1051a39Sopenharmony_ci EVP_EncodeBlock((unsigned char *)b64_str, der_spki, der_len); 76e1051a39Sopenharmony_ci OPENSSL_free(der_spki); 77e1051a39Sopenharmony_ci return b64_str; 78e1051a39Sopenharmony_ci} 79