⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 privkey.c

📁 Netscape公司提供的安全套接字层
💻 C
字号:
/*  *********************************************************************
    File: privkey.c

    SSLRef 3.0 Final -- 11/19/96

    Copyright (c)1996 by Netscape Communications Corp.

    By retrieving this software you are bound by the licensing terms
    disclosed in the file "LICENSE.txt". Please read it, and if you don't
    accept the terms, delete this software.

    SSLRef 3.0 was developed by Netscape Communications Corp. of Mountain
    View, California <http://home.netscape.com/> and Consensus Development
    Corporation of Berkeley, California <http://www.consensus.com/>.

    *********************************************************************

    File: privkey.c    Extremely primitive implementation of PKCS 5 and 7

    This code is used to load the private key from a binary encoded file
    which contains a PKCS 7 message with a password-protected RSA private
    key in it.

    ****************************************************************** */

#ifndef _ASN1UTIL_H_
#include "asn1util.h"
#endif

#ifndef _SSLCRYPT_H_
#include "sslcrypt.h"
#endif

#ifndef _SSLCTX_H_
#include "sslctx.h"
#endif

#ifndef _SSLALLOC_H_
#include "sslalloc.h"
#endif

#ifndef _CRYPTYPE_H_
#include "cryptype.h"
#endif

#include <string.h>

SSLErr SSLDecodePrivateKey(SSLBuffer privateKey, SSLBuffer password, SSLRSAPrivateKey *rsakey, SSLContext *ctx);
SSLErr SSLParsePrivateKey(SSLBuffer privateKey, SSLRSAPrivateKey *rsakey, SSLContext *ctx);

#if RSAREF

	#include "deseay.h"

	static void SSLCopyIntegerToByteArray(SSLBuffer integer, uint8 *dest, uint32 destLen);

#endif /* RSAREF */

SSLErr
SSLDecodePrivateKey(SSLBuffer privateKey, SSLBuffer password, SSLRSAPrivateKey *rsakey, SSLContext *ctx)
{	SSLErr				err;
	ASN1Type			outer, pkcs7[2], encryptedData[2], encryptionAlg[2],
						desParams[2];
	SSLBuffer			hashCtx, hash1, hash2, privKeyBuf;
	uint8				md5Hash1[16], md5Hash2[16];
	sint32				iterations;
	int 				size;
	
	hash1.data = md5Hash1;
	hash1.length = 16;
	hash2.data = md5Hash2;
	hash2.length = 16;
	size = 1;
	if ((err = ASNParseBER(privateKey, &outer, &size)) != 0)
		return err;
	size = 2;
	if ((err = ASNParseBER(outer.contents, pkcs7, &size)) != 0 || size != 2)
		return err;
	if ((err = ASNParseBER(pkcs7[1].contents, encryptedData, &size)) != 0 || size != 2)
		return err;
	if ((err = ASNParseBER(encryptedData[0].contents, encryptionAlg, &size)) != 0 || size != 2)
		return err;
	if ((err = ASNParseBER(encryptionAlg[1].contents, desParams, &size)) != 0 || size != 2)
		return err;
	if ((err = ASNDecodeInteger(desParams[1].contents, &iterations)) != 0)
		return err;
	if ((err = SSLAllocBuffer(&hashCtx, SSLHashMD5.contextSize, &ctx->sysCtx)) != 0)
		return err;
	if ((err = SSLHashMD5.init(hashCtx)) != 0)
		return err;
	if ((err = SSLHashMD5.update(hashCtx, password)) != 0)
		return err;
	if ((err = SSLHashMD5.update(hashCtx, desParams[0].contents)) != 0)
		return err;
	if ((err = SSLHashMD5.final(hashCtx, hash1)) != 0)
		return err;
	while (--iterations)
	{	if ((err = SSLHashMD5.init(hashCtx)) != 0)
			return err;
		if ((err = SSLHashMD5.update(hashCtx, hash1)) != 0)
			return err;
		if ((err = SSLHashMD5.final(hashCtx, hash2)) != 0)
			return err;
		memcpy(md5Hash1, md5Hash2, 16);
	}
	if ((err = SSLFreeBuffer(&hashCtx, &ctx->sysCtx)) != 0)
		return err;
	
	privKeyBuf = encryptedData[1].contents;
	
#if RSAREF
	{	des_key_schedule	key;
		int 				i, padLength;
		
		des_set_odd_parity((des_cblock*)md5Hash1);
		des_key_sched((des_cblock*)md5Hash1,key);
		des_cbc_encrypt((des_cblock*)privKeyBuf.data,(des_cblock*)privKeyBuf.data,
						privKeyBuf.length,key,(des_cblock*)(md5Hash1+8),0);
		if (privKeyBuf.data[0] != 0x30)
			return SSLUnknownErr;
		
		padLength = privKeyBuf.data[privKeyBuf.length - 1];
		for (i = 2; i <= padLength; i++)
			if (privKeyBuf.data[privKeyBuf.length - i] != padLength)
				return SSLUnknownErr;
		
		privKeyBuf.length -= padLength;
		
		return SSLParsePrivateKey(privKeyBuf, rsakey, ctx);
	}
#elif BSAFE
	{	int 				rsaErr;
		unsigned int		outLen, totalOut;
		B_KEY_OBJ			desKey;
		B_ALGORITHM_OBJ 	des;
		B_ALGORITHM_METHOD	*chooser[] = { &AM_DES_CBC_DECRYPT, 0 };
		
		if ((rsaErr = B_CreateAlgorithmObject(&des)) != 0)
			return SSLUnknownErr;
		if ((rsaErr = B_SetAlgorithmInfo(des, AI_DES_CBCPadIV8, md5Hash1+8)) != 0)
			return SSLUnknownErr;
		if ((rsaErr = B_CreateKeyObject(&desKey)) != 0)
			return SSLUnknownErr;
		if ((rsaErr = B_SetKeyInfo(desKey, KI_DES8, md5Hash1)) != 0)
			return SSLUnknownErr;
		if ((rsaErr = B_DecryptInit(des, desKey, chooser, NO_SURR)) != 0)
			return SSLUnknownErr;
		B_DestroyKeyObject(&desKey);
		if ((rsaErr = B_DecryptUpdate(des, privKeyBuf.data, &outLen, privKeyBuf.length,
					privKeyBuf.data, privKeyBuf.length, NO_RAND, NO_SURR)) != 0)
			return SSLUnknownErr;
		totalOut = outLen;
		if ((rsaErr = B_DecryptFinal(des, privKeyBuf.data+totalOut, &outLen,
					privKeyBuf.length-totalOut, NO_RAND, NO_SURR)) != 0)
			return SSLUnknownErr;
		privKeyBuf.length = totalOut + outLen;
		B_DestroyAlgorithmObject(&des);
		
		return SSLParsePrivateKey(privKeyBuf, rsakey, ctx);
	}
#else
	#error "Neither RSAREF not BSAFE defined"
#endif
}

SSLErr
SSLParsePrivateKey(SSLBuffer privateKey, SSLRSAPrivateKey *key, SSLContext *ctx)
{	SSLErr		err;
	ASN1Type	outer, privKeyInfo[4], rsaKeyOuter, rsaKey[9];
	int 		count;
	
	count = 1;
	if ((err = ASNParseBER(privateKey, &outer, &count)) != 0 || count != 1)
		return err;
	count = 4;
	if ((err = ASNParseBER(outer.contents, privKeyInfo, &count)) != 0 || count < 3)
		return err;
	count = 1;
	if ((err = ASNParseBER(privKeyInfo[2].contents, &rsaKeyOuter, &count)) != 0 || count != 1)
		return err;
	count = 9;
	if ((err = ASNParseBER(rsaKeyOuter.contents, rsaKey, &count)) != 0 || count != 9)
		return err;
	
#if RSAREF
	{	int 		bitAdjust;
		uint8		c;
		
		memset(key, 0, sizeof(R_RSA_PRIVATE_KEY));
		SSLCopyIntegerToByteArray(rsaKey[1].contents, key->modulus, sizeof(key->modulus));
		SSLCopyIntegerToByteArray(rsaKey[2].contents, key->publicExponent, sizeof(key->publicExponent));
		SSLCopyIntegerToByteArray(rsaKey[3].contents, key->exponent, sizeof(key->exponent));
		SSLCopyIntegerToByteArray(rsaKey[4].contents, key->prime[0], sizeof(key->prime[0]));
		SSLCopyIntegerToByteArray(rsaKey[5].contents, key->prime[1], sizeof(key->prime[1]));
		SSLCopyIntegerToByteArray(rsaKey[6].contents, key->primeExponent[0], sizeof(key->primeExponent[0]));
		SSLCopyIntegerToByteArray(rsaKey[7].contents, key->primeExponent[1], sizeof(key->primeExponent[1]));
		SSLCopyIntegerToByteArray(rsaKey[8].contents, key->coefficient, sizeof(key->coefficient));
		
		c = rsaKey[1].contents.data[0];
		
		bitAdjust = 8;
		while (c != 0)
		{	--bitAdjust;
			c >>= 1;
		}
		key->bits = rsaKey[1].contents.length * 8 - bitAdjust;
	}
#elif BSAFE
	{	A_PKCS_RSA_PRIVATE_KEY	privKey;
		int 					rsaErr;
	
#define COPY_SSLBUFFER_TO_ITEM(b,i) i.data = b.data; i.len = b.length;
	
		COPY_SSLBUFFER_TO_ITEM(rsaKey[1].contents, privKey.modulus);
		COPY_SSLBUFFER_TO_ITEM(rsaKey[2].contents, privKey.publicExponent);
		COPY_SSLBUFFER_TO_ITEM(rsaKey[3].contents, privKey.privateExponent);
		COPY_SSLBUFFER_TO_ITEM(rsaKey[4].contents, privKey.prime[0]);
		COPY_SSLBUFFER_TO_ITEM(rsaKey[5].contents, privKey.prime[1]);
		COPY_SSLBUFFER_TO_ITEM(rsaKey[6].contents, privKey.primeExponent[0]);
		COPY_SSLBUFFER_TO_ITEM(rsaKey[7].contents, privKey.primeExponent[1]);
		COPY_SSLBUFFER_TO_ITEM(rsaKey[8].contents, privKey.coefficient);
		
		if ((rsaErr = B_CreateKeyObject(key)) != 0)
			return SSLUnknownErr;
		if ((rsaErr = B_SetKeyInfo(*key, KI_PKCS_RSAPrivate, (POINTER)&privKey)) != 0)
			return SSLUnknownErr;
	}	
#endif
	return SSLNoErr;
}

#if RSAREF
static void
SSLCopyIntegerToByteArray(SSLBuffer integer, uint8 *dest, uint32 destLen)
{	if (integer.data[0] == 0)
		memcpy(dest + destLen - (integer.length - 1), integer.data + 1, integer.length - 1);
	else
		memcpy(dest + destLen - integer.length, integer.data, integer.length);
}
#endif /* RSAREF */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -