Crypt-SMimeEngine

 view release on metacpan or  search on metacpan

SMimeEngine.xs  view on Meta::CPAN

//
//        init_status = 0;
        return 0;
    }else{
        SSL_library_init();
        OpenSSL_add_all_algorithms();
        ERR_load_crypto_strings();
    }

    // ca path existence check
    if( (dd = opendir(cert_dir)) == NULL ){
        sprintf(errstring, "Error to access to CA path: %s", cert_dir);
        destroy_ui_method();
        return 1;
    }
    closedir(dd);
    ca_dir = cert_dir;

    if (!(store = create_store())){
        destroy_ui_method();
        sprintf(errstring, "Error setting up X509_STORE object");
        return 1;
    }

    // load signer certificate
    (signer) = load_cert(cert_file);
    if(!(signer)) {
        destroy_ui_method();
        sprintf(errstring, "Error to load certificate file: %s", cert_file);
        return 1;
    }

    // load certs to add to SMIME schema during the sign process
    if(other_cert_num && other_cert_num <= MAX_CERTS){
        int i;
        other4sign = sk_X509_new_null();

        for(i=0; i<other_cert_num; i++){
            X509 *tmp;
            FILE *fp;
            if (!(fp = fopen(other_cert[i], "r")) || !(tmp = PEM_read_X509(fp, NULL, NULL, NULL))){
                destroy_ui_method();
                sprintf(errstring, "Error reading chain certificate");
                return 1;
            }
            sk_X509_push(other4sign, tmp);
            fclose(fp);
        }
    }

    sign = &sign_old;
    if( engine_name && strcmp(engine_name,"openssl") != 0 ) {
       // LOAD ENGINE HW
        eng = load_engine(engine_name, libeng_file);
        if(!(eng)) {
            destroy_ui_method();
            sprintf(errstring, "Error to load engine: %s (%s)", engine_name, libeng_file);
            return 1;
        }

        if( !(pkey = ENGINE_load_private_key(eng, key_file, ui_method, NULL)) ){
            destroy_ui_method();
            ENGINE_cleanup();
            sprintf(errstring, "Error to load private key file: %s", key_file);
            return 1;
        }
     } else {
        FILE *fp;
        if (!(fp = fopen(key_file, "r")) ||
            !(pkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL))){

            destroy_ui_method();
            sprintf(errstring, "Error to access to key file: %s", key_file);
            return 1;
        }
       close((int)(uintptr_t)fp);
     }

    init_status = 1;
    return 0;
}



/*
 * sign: sign the file "fname"
 *
 *  FIRMA
 *  /usr/local/bin/openssl smime -sign -signer /home/flazan/SMIME/CERTS/cert.pem -certfile /home/flazan/SMIME/CERTS/CnipaCA2.crt -inkey /home/flazan/SMIME/CERTS/key.pem -in /home/flazan/SMIME/MAIL/mail.txt -out /home/flazan/SMIME/MAIL/mail.txt.signed
 *
 * 1. path mail to sign (input)
 * 2. path mail signed (output)
 *
 * return 0 se ok, 1 altrimenti e imposta la var errstring
 */
int
sign_old(char *fname, char *outfname){
    BIO *biom, *out;
    PKCS7 *r;
    //STACK_OF(X509) *other = NULL;
    strcpy(errstring,"");

    if(!init_status){
        sprintf(errstring, "init must be run correctly");
        return 1;
    }


    biom = BIO_new_file(fname, "r");
    if(!biom) {
        sprintf(errstring, "Error to access to file: %s", fname);
        return 1;
    }

    //r = PKCS7_sign(signer, pkey, other, biom, PKCS7_DETACHED);
    r = PKCS7_sign(signer, pkey, other4sign, biom, PKCS7_DETACHED);
    if(!r) {
        ERR_print_errors_fp(stdout);
        sprintf(errstring, "Error to sign file %s", fname);
        BIO_free(biom);
        return 1;

SMimeEngine.xs  view on Meta::CPAN

        free(x->subject);
        free(x->serial);
        free(x->startdate);
        free(x->enddate);
        free(x->v3_email);
}

void
free_init(){
    X509_free(signer);
    sk_X509_pop_free(other4sign, X509_free);
    X509_STORE_free(store);
    EVP_PKEY_free(pkey);
    destroy_ui_method();
}

int
save_certs(char *signerfile, STACK_OF(X509) *signers){
        int i;
        BIO *tmp;
        if(!signerfile) return 1;
        tmp = BIO_new_file(signerfile, "w");
        if(!tmp) return 0;
        for(i = 0; i < sk_X509_num(signers); i++)
                PEM_write_bio_X509(tmp, sk_X509_value(signers, i));
        BIO_free(tmp);
        return 1;
}

/*
 * Restiruisce gli estremi di openssl
 *
 * Parametri
 * 0 - versione (es. OpenSSL 0.9.7i 14 Oct 2005)
 * 2 - prametri di compilazione (es. compiler: gcc -DOPENSSL_THREADS ...)
 * 3 - data compilazione (es. built on: Mon Dec  3 16:44:16 CET 2007)
 * 4 - piattaforma (es. platform: debug-linux-pentium)
 * 5 - path di installazione (es. OPENSSLDIR: \"/usr/local/openssl\")
 *
 */
int
ossl_param(int param, char **strOut){
    *strOut = (char *) SSLeay_version(param);
    return 1;
}

int
load_privk(char *prk, char *ncert){
    strcpy(errstring,"");

    if(pkey){
        EVP_PKEY_free(pkey);
    }
    if(signer){
        X509_free(signer);
    }

    // load key
    if( eng ){
        // ENGINE HW
        if( !(pkey = ENGINE_load_private_key(eng, prk, ui_method, NULL)) ){
            destroy_ui_method();
            ENGINE_cleanup();
            sprintf(errstring, "Error to load private key file: %s", prk);
            return 1;
        }
    }else{
        // ENGINE SW
        FILE *fp;
        if (!(fp = fopen(prk, "r")) ||
            !(pkey = PEM_read_PrivateKey(fp, NULL, NULL, NULL))){

            destroy_ui_method();
            sprintf(errstring, "Error to access to key file: %s", prk);
            return 1;
        }
        close((int)(uintptr_t)fp);
    }

    //load cert
    // load signer certificate
    (signer) = load_cert(ncert);
    if(!(signer)) {
        destroy_ui_method();
        sprintf(errstring, "Error to load certificate file: %s", ncert);
        return 1;
    }

    return 0;

}

/*
 * Return a selected type digest of input file
 *
 * 1 - input file path
 * 2 - hash type
 * 3 - calculated hash
 *
 * o se ok, 1 altrimenti e popola errstr
 */

int
digest(char *fname, char *dname, char **digestOut){

    const EVP_MD *dtype;
    EVP_MD_CTX *mdctx;
    int i, data_count;
    unsigned int dtype_len;
    FILE *fp;
    char *data;
    unsigned char digest_str[EVP_MAX_MD_SIZE];
    char* digestStart;
    strcpy(errstring,"");

    // initialize hash context and retrieve digest type by name
    OpenSSL_add_all_digests();
    if(!(dtype = EVP_get_digestbyname(dname))) {
        sprintf(errstring, "Unknown message digest: %s", dname);
        return 1;
    }



( run in 1.202 second using v1.01-cache-2.11-cpan-39bf76dae61 )