/*
 * Copyright(C) 2008 Проект ИОК
 *
 * Этот файл содержит информацию, являющуюся
 * собственностью компании Крипто Про.
 *
 * Любая часть этого файла не может быть скопирована,
 * исправлена, переведена на другие языки,
 * локализована или модифицирована любым способом,
 * откомпилирована, передана по сети с или на
 * любую компьютерную систему без предварительного
 * заключения соглашения с компанией Крипто Про.
 */

/*!
 * \file $RCSfile$
 * \version $Revision: 127051 $
 * \date $Date:: 2015-09-09 15:08:20 +0300#$
 * \author $Author: pav $
 * \brief Функция получения уникального номера карты.
 */

#include "ric_prj.h"

/*!
 * \brief Функция получения уникального номера карты.
 * \param reader [in] контекст считывателя
 * \param card [in] контекст карты
 * \param unique_num [out] уникальный номер карты
 * \return код возврата
 * \retval ERROR_SUCCESS приложение выбрано
 * \retval (DWORD)SCARD_W_UNSUPPORTED_CARD карта вернула неожиданные данные
 * \retval "ошибки считывателя" \ref scard_error
 */
DWORD trust_unique_num( 
    TRICContext *ctx, 
    unsigned char unique_num[4] )
{
    DWORD code;
    BYTE apdu_sel[] = { 0, 0xA4, 0x00, 0x0C};
    BYTE apdu_read[] = { 0x00, 0xb0, 0x00, 0x00 };
    unsigned char data[UNI_LEN] = {0};
    size_t data_len = sizeof (data);

    code = trust_select_application(ctx);
    if( code )
	return code;

    // Select s/n file.
    code = send_apdu( ctx, apdu_sel, (unsigned char *) "\x01\x00", 2, NULL, NULL);
    if( code )
	return code;

    code = send_apdu (ctx, apdu_read, NULL, 0, data, &data_len);
    if( code )
	return code;
    memcpy(unique_num,data,4);

    // Если был select file, то вернуть его.
    if( ctx->file ) {
	size_t length;
	trust_select_file( ctx, ctx->file, &length );
    }
    return ERROR_SUCCESS;
}
/* end of file: $Id: mag_uni.c 127051 2015-09-09 12:08:20Z pav $ */
