Beispiel #1
0
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);
}
Beispiel #4
0
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);
}
Beispiel #5
0
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;
}
Beispiel #6
0
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(&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);
}