int sc_pkcs15_read_data_object(struct sc_pkcs15_card *p15card, const struct sc_pkcs15_data_info *info, struct sc_pkcs15_data **data_object_out) { struct sc_context *ctx = p15card->card->ctx; struct sc_pkcs15_data *data_object; struct sc_pkcs15_der der; int r; LOG_FUNC_CALLED(ctx); if (!info || !data_object_out) LOG_FUNC_RETURN(ctx, SC_ERROR_INVALID_ARGUMENTS); if (!info->data.value) { r = sc_pkcs15_read_file(p15card, &info->path, &info->data.value, &info->data.len); LOG_TEST_RET(ctx, r, "Cannot get DATA object data"); } sc_der_copy(&der, &info->data); data_object = calloc(sizeof(struct sc_pkcs15_data), 1); if (!data_object && !der.value) LOG_TEST_RET(ctx, SC_ERROR_OUT_OF_MEMORY, "Cannot allocate memory for data object"); data_object->data = der.value; data_object->data_len = der.len; *data_object_out = data_object; LOG_FUNC_RETURN(ctx,SC_SUCCESS); }
sc_pkcs15_der_t *der_copy_constructor( const sc_pkcs15_der_t *der ) { sc_pkcs15_der_t *result = NULL; if(!der) return NULL; result = calloc(1, sizeof(sc_pkcs15_der_t)); if(!result) return NULL; sc_der_copy(result, der); return result; }
int card_sync_virtual_fs_to_card_filter_pukey( sc_card_t *card, struct _virtual_file_t *virtual_file, virtual_fs_t *virtual_fs, sc_pkcs15_object_t *obj ) { int r = SC_SUCCESS; struct sc_pkcs15_pubkey_info *pukey = NULL; sc_pkcs15_der_t *der = NULL; sc_path_t *path = NULL; sc_pkcs15_id_t *ckaid = NULL; SC_FUNC_CALLED(card->ctx, 1); if(!card || !virtual_file) return SC_ERROR_INVALID_ARGUMENTS; pukey = (struct sc_pkcs15_pubkey_info *) obj->data; if(pukey) { sc_pkcs15_free_object_content(obj); /* try to find an old der if present */ der = map_id_to_der_find(DRVDATA(card)->pukdf_card_ckaid_to_card_der_map, &pukey->id); if(der) { sc_der_copy(&obj->content, der); } path = map_path_to_path_find(DRVDATA(card)->virtual_fs_to_card_path_map, &pukey->path); if(path) { /* replace path data */ memcpy(&pukey->path, path, sizeof(sc_path_t)); } ckaid = map_opensc_id_to_id_find(DRVDATA(card)->virtual_fs_to_card_ckaid_map, &pukey->id); if(ckaid) { /* replace ckaid */ memcpy(&pukey->id, ckaid, sizeof(struct sc_pkcs15_id)); } /* add manual flags */ pukey->native = 0x01; pukey->access_flags |= SC_PKCS15_PRKEY_ACCESS_LOCAL; pukey->access_flags |= SC_PKCS15_PRKEY_ACCESS_EXTRACTABLE; pukey->key_reference = pukey->path.value[pukey->path.len-1]; } else { sc_debug(card->ctx,SC_LOG_DEBUG_VERBOSE, "Pointer to pukey info was empty"); } SC_FUNC_RETURN(card->ctx, 1, r); }
int sc_pkcs15_read_certificate(struct sc_pkcs15_card *p15card, const struct sc_pkcs15_cert_info *info, struct sc_pkcs15_cert **cert_out) { struct sc_context *ctx = NULL; struct sc_pkcs15_cert *cert = NULL; struct sc_pkcs15_der der; int r; assert(p15card != NULL && info != NULL && cert_out != NULL); ctx = p15card->card->ctx; LOG_FUNC_CALLED(ctx); if (info->value.len && info->value.value) { sc_der_copy(&der, &info->value); } else if (info->path.len) { r = sc_pkcs15_read_file(p15card, &info->path, &der.value, &der.len); LOG_TEST_RET(ctx, r, "Unable to read certificate file."); } else { LOG_FUNC_RETURN(ctx, SC_ERROR_OBJECT_NOT_FOUND); } cert = malloc(sizeof(struct sc_pkcs15_cert)); if (cert == NULL) { free(der.value); LOG_FUNC_RETURN(ctx, SC_ERROR_OUT_OF_MEMORY); } memset(cert, 0, sizeof(struct sc_pkcs15_cert)); if (parse_x509_cert(ctx, &der, cert)) { free(der.value); sc_pkcs15_free_certificate(cert); LOG_FUNC_RETURN(ctx, SC_ERROR_INVALID_ASN1_OBJECT); } free(der.value); *cert_out = cert; LOG_FUNC_RETURN(ctx, SC_SUCCESS); }
int sc_pkcs15_read_certificate(struct sc_pkcs15_card *p15card, const struct sc_pkcs15_cert_info *info, struct sc_pkcs15_cert **cert_out) { struct sc_pkcs15_cert *cert; struct sc_pkcs15_der der; int r; assert(p15card != NULL && info != NULL && cert_out != NULL); LOG_FUNC_CALLED(p15card->card->ctx); if (info->value.len && info->value.value) { sc_der_copy(&der, &info->value); } else if (info->path.len) { r = sc_pkcs15_read_file(p15card, &info->path, &der.value, &der.len); if (r) return r; } else { return SC_ERROR_OBJECT_NOT_FOUND; } cert = malloc(sizeof(struct sc_pkcs15_cert)); if (cert == NULL) { free(der.value); return SC_ERROR_OUT_OF_MEMORY; } memset(cert, 0, sizeof(struct sc_pkcs15_cert)); if (parse_x509_cert(p15card->card->ctx, der.value, der.len, cert)) { free(der.value); sc_pkcs15_free_certificate(cert); return SC_ERROR_INVALID_ASN1_OBJECT; } cert->data = der; *cert_out = cert; return SC_SUCCESS; }
int sc_pkcs15_read_certificate(struct sc_pkcs15_card *p15card, const struct sc_pkcs15_cert_info *info, struct sc_pkcs15_cert **cert_out) { int r; struct sc_pkcs15_cert *cert; u8 *data = NULL; size_t len; assert(p15card != NULL && info != NULL && cert_out != NULL); SC_FUNC_CALLED(p15card->card->ctx, SC_LOG_DEBUG_VERBOSE); if (info->path.len) { r = sc_pkcs15_read_file(p15card, &info->path, &data, &len, NULL); if (r) return r; } else { sc_pkcs15_der_t copy; sc_der_copy(©, &info->value); data = copy.value; len = copy.len; } cert = malloc(sizeof(struct sc_pkcs15_cert)); if (cert == NULL) { free(data); return SC_ERROR_OUT_OF_MEMORY; } memset(cert, 0, sizeof(struct sc_pkcs15_cert)); if (parse_x509_cert(p15card->card->ctx, data, len, cert)) { free(data); sc_pkcs15_free_certificate(cert); return SC_ERROR_INVALID_ASN1_OBJECT; } cert->data = data; *cert_out = cert; return 0; }
int card_sync_virtual_fs_to_card_filter_cert( sc_card_t *card, struct _virtual_file_t *virtual_file, virtual_fs_t *virtual_fs, sc_pkcs15_object_t *obj ) { int r = SC_SUCCESS; struct sc_pkcs15_cert_info *cert = NULL; sc_pkcs15_der_t *der = NULL; sc_path_t *path = NULL; sc_pkcs15_id_t *ckaid = NULL; struct _virtual_file_t *tmp_vf=NULL; unsigned char *compressed_data = NULL; size_t compressed_data_length = 0; SC_FUNC_CALLED(card->ctx, 1); if(!card || !virtual_file) return SC_ERROR_INVALID_ARGUMENTS; cert = (struct sc_pkcs15_cert_info *) obj->data; if(cert) { sc_pkcs15_free_object_content(obj); /* try to find an old der if present */ der = map_id_to_der_find(DRVDATA(card)->cdf_card_ckaid_to_card_der_map, &cert->id); if(der) { sc_der_copy(&obj->content, der); } path = map_path_to_path_find(DRVDATA(card)->virtual_fs_to_card_path_map, &cert->path); if(path) { /* replace path data */ memcpy(&cert->path, path, sizeof(sc_path_t)); tmp_vf=virtual_fs_find_by_path(virtual_fs, &cert->path); if(!tmp_vf) { r = SC_ERROR_INVALID_DATA; goto end; } r = file_compress_data(card, tmp_vf->data, tmp_vf->data_size, &compressed_data, &compressed_data_length); if(r!=SC_SUCCESS) goto end; /* certificate file has an info header */ cert->path.count = compressed_data_length+8; } ckaid = map_opensc_id_to_id_find(DRVDATA(card)->virtual_fs_to_card_ckaid_map, &cert->id); if(ckaid) { /* replace ckaid */ memcpy(&cert->id, ckaid, sizeof(struct sc_pkcs15_id)); } else { ckaid = map_path_to_id_find(DRVDATA(card)->card_path_to_card_ckaid_map, &cert->path); if (ckaid) { /* replace ckaid */ memcpy(&cert->id, ckaid, sizeof(struct sc_pkcs15_id)); } } } end: if(compressed_data) { free(compressed_data); compressed_data = NULL; } SC_FUNC_RETURN(card->ctx, 1, r); }