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

📄 crypto.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 5 页
字号:
 */static struct hx509_private_key_ops *private_algs[] = {    &rsa_private_key_ops,    NULL};static hx509_private_key_ops *find_private_alg(const heim_oid *oid){    int i;    for (i = 0; private_algs[i]; i++) {	if (private_algs[i]->key_oid == NULL)	    continue;	if (der_heim_oid_cmp((*private_algs[i]->key_oid)(), oid) == 0)	    return private_algs[i];    }    return NULL;}int_hx509_verify_signature(hx509_context context,			const Certificate *signer,			const AlgorithmIdentifier *alg,			const heim_octet_string *data,			const heim_octet_string *sig){    const struct signature_alg *md;    md = find_sig_alg(&alg->algorithm);    if (md == NULL) {	hx509_clear_error_string(context);	return HX509_SIG_ALG_NO_SUPPORTED;    }    if (signer && (md->flags & PROVIDE_CONF) == 0) {	hx509_clear_error_string(context);	return HX509_CRYPTO_SIG_NO_CONF;    }    if (signer == NULL && (md->flags & REQUIRE_SIGNER)) {	    hx509_clear_error_string(context);	return HX509_CRYPTO_SIGNATURE_WITHOUT_SIGNER;    }    if (md->key_oid && signer) {	const SubjectPublicKeyInfo *spi;	spi = &signer->tbsCertificate.subjectPublicKeyInfo;	if (der_heim_oid_cmp(&spi->algorithm.algorithm, (*md->key_oid)()) != 0) {	    hx509_clear_error_string(context);	    return HX509_SIG_ALG_DONT_MATCH_KEY_ALG;	}    }    return (*md->verify_signature)(context, md, signer, alg, data, sig);}int_hx509_verify_signature_bitstring(hx509_context context,				  const Certificate *signer,				  const AlgorithmIdentifier *alg,				  const heim_octet_string *data,				  const heim_bit_string *sig){    heim_octet_string os;    if (sig->length & 7) {	hx509_set_error_string(context, 0, HX509_CRYPTO_SIG_INVALID_FORMAT,			       "signature not multiple of 8 bits");	return HX509_CRYPTO_SIG_INVALID_FORMAT;    }    os.data = sig->data;    os.length = sig->length / 8;        return _hx509_verify_signature(context, signer, alg, data, &os);}int_hx509_create_signature(hx509_context context,			const hx509_private_key signer,			const AlgorithmIdentifier *alg,			const heim_octet_string *data,			AlgorithmIdentifier *signatureAlgorithm,			heim_octet_string *sig){    const struct signature_alg *md;    if (signer && signer->ops && signer->ops->handle_alg &&	(*signer->ops->handle_alg)(signer, alg, COT_SIGN))    {	return (*signer->ops->sign)(context, signer, alg, data, 				    signatureAlgorithm, sig);    }    md = find_sig_alg(&alg->algorithm);    if (md == NULL) {	hx509_set_error_string(context, 0, HX509_SIG_ALG_NO_SUPPORTED,	    "algorithm no supported");	return HX509_SIG_ALG_NO_SUPPORTED;    }    if (signer && (md->flags & PROVIDE_CONF) == 0) {	hx509_set_error_string(context, 0, HX509_SIG_ALG_NO_SUPPORTED,	    "algorithm provides no conf");	return HX509_CRYPTO_SIG_NO_CONF;    }    return (*md->create_signature)(context, md, signer, alg, data, 				   signatureAlgorithm, sig);}int_hx509_create_signature_bitstring(hx509_context context,				  const hx509_private_key signer,				  const AlgorithmIdentifier *alg,				  const heim_octet_string *data,				  AlgorithmIdentifier *signatureAlgorithm,				  heim_bit_string *sig){    heim_octet_string os;    int ret;    ret = _hx509_create_signature(context, signer, alg,				  data, signatureAlgorithm, &os);    if (ret)	return ret;    sig->data = os.data;    sig->length = os.length * 8;    return 0;}int_hx509_public_encrypt(hx509_context context,		      const heim_octet_string *cleartext,		      const Certificate *cert,		      heim_oid *encryption_oid,		      heim_octet_string *ciphertext){    const SubjectPublicKeyInfo *spi;    unsigned char *to;    int tosize;    int ret;    RSA *rsa;    RSAPublicKey pk;    size_t size;    ciphertext->data = NULL;    ciphertext->length = 0;    spi = &cert->tbsCertificate.subjectPublicKeyInfo;    rsa = RSA_new();    if (rsa == NULL) {	hx509_set_error_string(context, 0, ENOMEM, "out of memory");	return ENOMEM;    }    ret = decode_RSAPublicKey(spi->subjectPublicKey.data,			      spi->subjectPublicKey.length / 8,			      &pk, &size);    if (ret) {	RSA_free(rsa);	hx509_set_error_string(context, 0, ret, "RSAPublicKey decode failure");	return ret;    }    rsa->n = heim_int2BN(&pk.modulus);    rsa->e = heim_int2BN(&pk.publicExponent);    free_RSAPublicKey(&pk);    if (rsa->n == NULL || rsa->e == NULL) {	RSA_free(rsa);	hx509_set_error_string(context, 0, ENOMEM, "out of memory");	return ENOMEM;    }    tosize = RSA_size(rsa);    to = malloc(tosize);    if (to == NULL) {	RSA_free(rsa);	hx509_set_error_string(context, 0, ENOMEM, "out of memory");	return ENOMEM;    }    ret = RSA_public_encrypt(cleartext->length, 			     (unsigned char *)cleartext->data, 			     to, rsa, RSA_PKCS1_PADDING);    RSA_free(rsa);    if (ret <= 0) {	free(to);	hx509_set_error_string(context, 0, HX509_CRYPTO_RSA_PUBLIC_ENCRYPT,			       "RSA public encrypt failed with %d", ret);	return HX509_CRYPTO_RSA_PUBLIC_ENCRYPT;    }    if (ret > tosize)	_hx509_abort("internal rsa decryption failure: ret > tosize");    ciphertext->length = ret;    ciphertext->data = to;    ret = der_copy_oid(oid_id_pkcs1_rsaEncryption(), encryption_oid);    if (ret) {	der_free_octet_string(ciphertext);	hx509_set_error_string(context, 0, ENOMEM, "out of memory");	return ENOMEM;    }    return 0;}int_hx509_private_key_private_decrypt(hx509_context context,				   const heim_octet_string *ciphertext,				   const heim_oid *encryption_oid,				   hx509_private_key p,				   heim_octet_string *cleartext){    int ret;    cleartext->data = NULL;    cleartext->length = 0;    if (p->private_key.rsa == NULL) {	hx509_set_error_string(context, 0, HX509_PRIVATE_KEY_MISSING,			       "Private RSA key missing");	return HX509_PRIVATE_KEY_MISSING;    }    cleartext->length = RSA_size(p->private_key.rsa);    cleartext->data = malloc(cleartext->length);    if (cleartext->data == NULL) {	hx509_set_error_string(context, 0, ENOMEM, "out of memory");	return ENOMEM;    }    ret = RSA_private_decrypt(ciphertext->length, ciphertext->data,			      cleartext->data,			      p->private_key.rsa,			      RSA_PKCS1_PADDING);    if (ret <= 0) {	der_free_octet_string(cleartext);	hx509_set_error_string(context, 0, HX509_CRYPTO_RSA_PRIVATE_DECRYPT,			       "Failed to decrypt using private key: %d", ret);	return HX509_CRYPTO_RSA_PRIVATE_DECRYPT;    }    if (cleartext->length < ret)	_hx509_abort("internal rsa decryption failure: ret > tosize");    cleartext->length = ret;    return 0;}int_hx509_parse_private_key(hx509_context context,			 const heim_oid *key_oid,			 const void *data,			 size_t len,			 hx509_private_key *private_key){    struct hx509_private_key_ops *ops;    int ret;    *private_key = NULL;    ops = find_private_alg(key_oid);    if (ops == NULL) {	hx509_clear_error_string(context);	return HX509_SIG_ALG_NO_SUPPORTED;    }    ret = _hx509_private_key_init(private_key, ops, NULL);    if (ret) {	hx509_set_error_string(context, 0, ret, "out of memory");	return ret;    }    ret = (*ops->import)(context, data, len, *private_key);    if (ret)	_hx509_private_key_free(private_key);    return ret;}/* * */int_hx509_private_key2SPKI(hx509_context context,			hx509_private_key private_key,			SubjectPublicKeyInfo *spki){    const struct hx509_private_key_ops *ops = private_key->ops;    if (ops == NULL || ops->get_spki == NULL) {	hx509_set_error_string(context, 0, HX509_UNIMPLEMENTED_OPERATION,			       "Private key have no key2SPKI function");	return HX509_UNIMPLEMENTED_OPERATION;    }    return (*ops->get_spki)(context, private_key, spki);}int_hx509_generate_private_key_init(hx509_context context,				 const heim_oid *oid,				 struct hx509_generate_private_context **ctx){    *ctx = NULL;    if (der_heim_oid_cmp(oid, oid_id_pkcs1_rsaEncryption()) != 0) {	hx509_set_error_string(context, 0, EINVAL, 			       "private key not an RSA key");	return EINVAL;    }    *ctx = calloc(1, sizeof(**ctx));    if (*ctx == NULL) {	hx509_set_error_string(context, 0, ENOMEM, "out of memory");	return ENOMEM;    }    (*ctx)->key_oid = oid;    return 0;}int_hx509_generate_private_key_is_ca(hx509_context context,				  struct hx509_generate_private_context *ctx){    ctx->isCA = 1;    return 0;}int_hx509_generate_private_key_bits(hx509_context context,				 struct hx509_generate_private_context *ctx,				 unsigned long bits){    ctx->num_bits = bits;    return 0;}void_hx509_generate_private_key_free(struct hx509_generate_private_context **ctx){    free(*ctx);    *ctx = NULL;}int_hx509_generate_private_key(hx509_context context,			    struct hx509_generate_private_context *ctx,			    hx509_private_key *private_key){    struct hx509_private_key_ops *ops;    int ret;    *private_key = NULL;    ops = find_private_alg(ctx->key_oid);    if (ops == NULL) {	hx509_clear_error_string(context);	return HX509_SIG_ALG_NO_SUPPORTED;    }    ret = _hx509_private_key_init(private_key, ops, NULL);    if (ret) {	hx509_set_error_string(context, 0, ret, "out of memory");	return ret;    }    ret = (*ops->generate_private_key)(context, ctx, *private_key);    if (ret)	_hx509_private_key_free(private_key);    return ret;}/* * */static const heim_octet_string null_entry_oid = { 2, rk_UNCONST("\x05\x00") };static const unsigned sha512_oid_tree[] = { 2, 16, 840, 1, 101, 3, 4, 2, 3 };const AlgorithmIdentifier _hx509_signature_sha512_data = {     { 9, rk_UNCONST(sha512_oid_tree) }, rk_UNCONST(&null_entry_oid)};static const unsigned sha384_oid_tree[] = { 2, 16, 840, 1, 101, 3, 4, 2, 2 };const AlgorithmIdentifier _hx509_signature_sha384_data = {     { 9, rk_UNCONST(sha384_oid_tree) }, rk_UNCONST(&null_entry_oid)};static const unsigned sha256_oid_tree[] = { 2, 16, 840, 1, 101, 3, 4, 2, 1 };const AlgorithmIdentifier _hx509_signature_sha256_data = {     { 9, rk_UNCONST(sha256_oid_tree) }, rk_UNCONST(&null_entry_oid)};static const unsigned sha1_oid_tree[] = { 1, 3, 14, 3, 2, 26 };const AlgorithmIdentifier _hx509_signature_sha1_data = {     { 6, rk_UNCONST(sha1_oid_tree) }, rk_UNCONST(&null_entry_oid)};static const unsigned md5_oid_tree[] = { 1, 2, 840, 113549, 2, 5 };const AlgorithmIdentifier _hx509_signature_md5_data = {     { 6, rk_UNCONST(md5_oid_tree) }, rk_UNCONST(&null_entry_oid)};static const unsigned md2_oid_tree[] = { 1, 2, 840, 113549, 2, 2 };const AlgorithmIdentifier _hx509_signature_md2_data = {     { 6, rk_UNCONST(md2_oid_tree) }, rk_UNCONST(&null_entry_oid)};static const unsigned rsa_with_sha512_oid[] ={ 1, 2, 840, 113549, 1, 1, 13 };const AlgorithmIdentifier _hx509_signature_rsa_with_sha512_data = {     { 7, rk_UNCONST(rsa_with_sha512_oid) }, NULL};static const unsigned rsa_with_sha384_oid[] ={ 1, 2, 840, 113549, 1, 1, 12 };const AlgorithmIdentifier _hx509_signature_rsa_with_sha384_data = {     { 7, rk_UNCONST(rsa_with_sha384_oid) }, NULL};static const unsigned rsa_with_sha256_oid[] ={ 1, 2, 840, 113549, 1, 1, 11 };const AlgorithmIdentifier _hx509_signature_rsa_with_sha256_data = {     { 7, rk_UNCONST(rsa_with_sha256_oid) }, NULL};static const unsigned rsa_with_sha1_oid[] ={ 1, 2, 840, 113549, 1, 1, 5 };const AlgorithmIdentifier _hx509_signature_rsa_with_sha1_data = {     { 7, rk_UNCONST(rsa_with_sha1_oid) }, NULL};static const unsigned rsa_with_md5_oid[] ={ 1, 2, 840, 113549, 1, 1, 4 };const AlgorithmIdentifier _hx509_signature_rsa_with_md5_data = {     { 7, rk_UNCONST(rsa_with_md5_oid) }, NULL};static const unsigned rsa_with_md2_oid[] ={ 1, 2, 840, 113549, 1, 1, 2 };const AlgorithmIdentifier _hx509_signature_rsa_with_md2_data = {     { 7, rk_UNCONST(rsa_with_md2_oid) }, NULL};static const unsigned rsa_oid[] ={ 1, 2, 840, 113549, 1, 1, 1 };const AlgorithmIdentifier _hx509_signature_rsa_data = {     { 7, rk_UNCONST(rsa_oid) }, NULL};static const unsigned rsa_pkcs1_x509_oid[] ={ 1, 2, 752, 43, 16, 1 };const AlgorithmIdentifier _hx509_signature_rsa_pkcs1_x509_data = {     { 6, rk_UNCONST(rsa_pkcs1_x509_oid) }, NULL};static const unsigned des_rsdi_ede3_cbc_oid[] ={ 1, 2, 840, 113549, 3, 7 };const AlgorithmIdentifier _hx509_des_rsdi_ede3_cbc_oid = {    { 6, rk_UNCONST(des_rsdi_ede3_cbc_oid) }, NULL};static const unsigned aes128_cbc_oid[] ={ 2, 16, 840, 1, 101, 3, 4, 1, 2 };const AlgorithmIdentifier _hx509_crypto_aes128_cbc_data = {    { 9, rk_UNCONST(aes128_cbc_oid) }, NULL};static const unsigned aes256_cbc_oid[] ={ 2, 16, 840, 1, 101, 3, 4, 1, 42 };const AlgorithmIdentifier _hx509_crypto_aes256_cbc_data = {    { 9, rk_UNCONST(aes256_cbc_oid) }, NULL};const AlgorithmIdentifier *hx509_signature_sha512(void){ return &_hx509_signature_sha512_data; }const AlgorithmIdentifier *hx509_signature_sha384(void){ return &_hx509_signature_sha384_data; }const AlgorithmIdentifier *hx509_signature_sha256(void){ return &_hx509_signature_sha256_data; }const AlgorithmIdentifier *hx509_signature_sha1(void){ return &_hx509_signature_sha1_data; }const AlgorithmIdentifier *hx509_signature_md5(void){ return &_hx509_signature_md5_data; }const AlgorithmIdentifier *hx509_signature_md2(void){ return &_hx509_signature_md2_data; }const AlgorithmIdentifier *hx509_signature_rsa_with_sha512(void){ return &_hx509_signature_rsa_with_sha512_data; }const AlgorithmIdentifier *hx509_signature_rsa_with_sha384(void){ return &_hx509_signature_rsa_with_sha384_data; }const AlgorithmIdentifier *hx509_signature_rsa_with_sha256(void){ return &_hx509_signature_rsa_with_sha256_data; }const AlgorithmIdentifier *hx509_signature_rsa_with_sha1(void){ return &_hx509_signature_rsa_with_sha1_data; }const AlgorithmIdentifier *hx509_signature_rsa_with_md5(void)

⌨️ 快捷键说明

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