sl@0: /* evp_pbe.c */ sl@0: /* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL sl@0: * project 1999. sl@0: */ sl@0: /* ==================================================================== sl@0: * Copyright (c) 1999 The OpenSSL Project. All rights reserved. sl@0: * sl@0: * Redistribution and use in source and binary forms, with or without sl@0: * modification, are permitted provided that the following conditions sl@0: * are met: sl@0: * sl@0: * 1. Redistributions of source code must retain the above copyright sl@0: * notice, this list of conditions and the following disclaimer. sl@0: * sl@0: * 2. Redistributions in binary form must reproduce the above copyright sl@0: * notice, this list of conditions and the following disclaimer in sl@0: * the documentation and/or other materials provided with the sl@0: * distribution. sl@0: * sl@0: * 3. All advertising materials mentioning features or use of this sl@0: * software must display the following acknowledgment: sl@0: * "This product includes software developed by the OpenSSL Project sl@0: * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" sl@0: * sl@0: * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to sl@0: * endorse or promote products derived from this software without sl@0: * prior written permission. For written permission, please contact sl@0: * licensing@OpenSSL.org. sl@0: * sl@0: * 5. Products derived from this software may not be called "OpenSSL" sl@0: * nor may "OpenSSL" appear in their names without prior written sl@0: * permission of the OpenSSL Project. sl@0: * sl@0: * 6. Redistributions of any form whatsoever must retain the following sl@0: * acknowledgment: sl@0: * "This product includes software developed by the OpenSSL Project sl@0: * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" sl@0: * sl@0: * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY sl@0: * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE sl@0: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR sl@0: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR sl@0: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, sl@0: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT sl@0: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; sl@0: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) sl@0: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, sl@0: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) sl@0: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED sl@0: * OF THE POSSIBILITY OF SUCH DAMAGE. sl@0: * ==================================================================== sl@0: * sl@0: * This product includes cryptographic software written by Eric Young sl@0: * (eay@cryptsoft.com). This product includes software written by Tim sl@0: * Hudson (tjh@cryptsoft.com). sl@0: * sl@0: */ sl@0: /* sl@0: © Portions copyright (c) 2006 Nokia Corporation. All rights reserved. sl@0: */ sl@0: sl@0: sl@0: #include sl@0: #include "cryptlib.h" sl@0: #include sl@0: #include sl@0: #if (defined(SYMBIAN) && (defined(__WINSCW__) || defined(__WINS__))) sl@0: #include "libcrypto_wsd_macros.h" sl@0: #include "libcrypto_wsd.h" sl@0: #endif sl@0: sl@0: sl@0: sl@0: #ifndef EMULATOR sl@0: /* Password based encryption (PBE) functions */ sl@0: sl@0: static STACK *pbe_algs; sl@0: #else sl@0: GET_STATIC_VAR_FROM_TLS(pbe_algs,evp_pbe,STACK *) sl@0: #define pbe_algs (*GET_WSD_VAR_NAME(pbe_algs,evp_pbe,s)()) sl@0: #endif sl@0: sl@0: /* Setup a cipher context from a PBE algorithm */ sl@0: sl@0: typedef struct { sl@0: int pbe_nid; sl@0: const EVP_CIPHER *cipher; sl@0: const EVP_MD *md; sl@0: EVP_PBE_KEYGEN *keygen; sl@0: } EVP_PBE_CTL; sl@0: sl@0: EXPORT_C int EVP_PBE_CipherInit(ASN1_OBJECT *pbe_obj, const char *pass, int passlen, sl@0: ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de) sl@0: { sl@0: sl@0: EVP_PBE_CTL *pbetmp, pbelu; sl@0: int i; sl@0: pbelu.pbe_nid = OBJ_obj2nid(pbe_obj); sl@0: if (pbelu.pbe_nid != NID_undef) i = sk_find(pbe_algs, (char *)&pbelu); sl@0: else i = -1; sl@0: sl@0: if (i == -1) { sl@0: char obj_tmp[80]; sl@0: EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_UNKNOWN_PBE_ALGORITHM); sl@0: if (!pbe_obj) BUF_strlcpy (obj_tmp, "NULL", sizeof obj_tmp); sl@0: else i2t_ASN1_OBJECT(obj_tmp, sizeof obj_tmp, pbe_obj); sl@0: ERR_add_error_data(2, "TYPE=", obj_tmp); sl@0: return 0; sl@0: } sl@0: if(!pass) passlen = 0; sl@0: else if (passlen == -1) passlen = strlen(pass); sl@0: pbetmp = (EVP_PBE_CTL *)sk_value (pbe_algs, i); sl@0: i = (*pbetmp->keygen)(ctx, pass, passlen, param, pbetmp->cipher, sl@0: pbetmp->md, en_de); sl@0: if (!i) { sl@0: EVPerr(EVP_F_EVP_PBE_CIPHERINIT,EVP_R_KEYGEN_FAILURE); sl@0: return 0; sl@0: } sl@0: return 1; sl@0: } sl@0: sl@0: static int pbe_cmp(const char * const *a, const char * const *b) sl@0: { sl@0: const EVP_PBE_CTL * const *pbe1 = (const EVP_PBE_CTL * const *) a, sl@0: * const *pbe2 = (const EVP_PBE_CTL * const *)b; sl@0: return ((*pbe1)->pbe_nid - (*pbe2)->pbe_nid); sl@0: } sl@0: sl@0: /* Add a PBE algorithm */ sl@0: sl@0: EXPORT_C int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md, sl@0: EVP_PBE_KEYGEN *keygen) sl@0: { sl@0: EVP_PBE_CTL *pbe_tmp; sl@0: if (!pbe_algs) pbe_algs = sk_new(pbe_cmp); sl@0: if (!(pbe_tmp = (EVP_PBE_CTL*) OPENSSL_malloc (sizeof(EVP_PBE_CTL)))) { sl@0: EVPerr(EVP_F_EVP_PBE_ALG_ADD,ERR_R_MALLOC_FAILURE); sl@0: return 0; sl@0: } sl@0: pbe_tmp->pbe_nid = nid; sl@0: pbe_tmp->cipher = cipher; sl@0: pbe_tmp->md = md; sl@0: pbe_tmp->keygen = keygen; sl@0: sk_push (pbe_algs, (char *)pbe_tmp); sl@0: return 1; sl@0: } sl@0: sl@0: EXPORT_C void EVP_PBE_cleanup(void) sl@0: { sl@0: sk_pop_free(pbe_algs, OPENSSL_freeFunc); sl@0: pbe_algs = NULL; sl@0: }