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

📄 loader_app.c

📁 这是DVD中伺服部分的核心代码
💻 C
📖 第 1 页 / 共 5 页
字号:
        cgc.cmd[ 7] = key_class;
        cgc.cmd[ 9] = cgc.buflen;
        cgc.cmd[10] = (0xc0 | 0x3f);

        if (ioctl(((LOADERHANDLE*)tLoader)->lFileHandle, CDROM_SEND_PACKET, &cgc) < 0)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("LoaderInitGetAgid() --GPCMD_REPORT_KEY 0x3f FAILED (%s)\n", strerror(errno)));
            DBGPRINT(DBG_ON(DBG_ERROR), ("                    --sense key: 0x%x, ASC/ASCQ: 0x%02x%02x\n", sense.sense_key, sense.asc, sense.ascq));
            loaderSetError(tLoader, errno);
            err = LOADER_FAILURE;
        }
        else
        {
            DBGPRINT(DBG_ON(DBG_TRACE), ("LoaderInitGetAgid() --GPCMD_REPORT_KEY 0x3f success\n"));
        }

        return (err);
}


/**
 * Gets the authentication grant ID (AGID) from the loader.
 *
 * @param tLoader - The loader handle.
 * @param pulAgid - Pointer to memory where AGID is stored.
 */
LOADER_ERR LoaderGetAgid(LOADER_HANDLE tLoader, BYTE *pbAgid)
{
    int    bufSize = 8;
    BYTE   bAgid;
    struct cdrom_generic_command cgc;
    struct request_sense sense;
    LOADER_ERR err = LOADER_SUCCESS;

    if ( (tLoader == NULL) || (pbAgid == NULL) )
    {
        return (LOADER_NULL_PTR);
    }

    memset(&cgc,   0, sizeof(cgc));
    memset(&sense, 0, sizeof(sense));

    bAgid = *pbAgid;

    cgc.sense   = &sense;
    cgc.buffer  = loaderBuf;
    cgc.buflen  = bufSize;
    cgc.data_direction = CGC_DATA_READ;
    cgc.timeout = HZ*5;

    cgc.cmd[ 0] = GPCMD_REPORT_KEY;
    cgc.cmd[ 9] = cgc.buflen;
    cgc.cmd[10] = (bAgid | 0x00);

    if (ioctl(((LOADERHANDLE*)tLoader)->lFileHandle, CDROM_SEND_PACKET, &cgc) < 0)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("LoaderGetAgid() --FAILED (%s)\n", strerror(errno)));
        DBGPRINT(DBG_ON(DBG_ERROR), ("                --sense key: 0x%x, ASC/ASCQ: 0x%02x%02x\n", sense.sense_key, sense.asc, sense.ascq));
        loaderSetError(tLoader, errno);
        err = LOADER_FAILURE;
    }
    else
    {
        *pbAgid = loaderBuf[7];
    }

    return (err);
}

/**
 * Retrieves the Authentication Success Flag status.
 *
 * @param tLoader - The loader handle.
 * @param pbStatus - ASF will be returned through this pointer.
 */
LOADER_ERR LoaderGetASF(LOADER_HANDLE tLoader, BYTE bAgid, BYTE *pbASF)
{
    LOADER_ERR err   = LOADER_SUCCESS;
    dvd_authinfo *ai = (dvd_authinfo *)&loaderBuf[0];

    if ( (tLoader == NULL) || (pbASF == NULL) )
    {
        return (LOADER_NULL_PTR);
    }

    ai->type       = DVD_LU_SEND_ASF;
    ai->lsasf.agid = (bAgid >> 6);
    ai->lsasf.asf  = 0;

    if (ioctl(((LOADERHANDLE*)tLoader)->lFileHandle, DVD_AUTH, ai) < 0)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("LoaderGetASF() --FAILED (%s)\n", strerror(errno)));
        loaderSetError(tLoader, errno);
        err = LOADER_FAILURE;
    }
    else
    {
        *pbASF = ai->lsasf.asf;
    }

    return (err);
}

/**
 * Report drive region settings.
 *
 * @param tLoader - The loader handle.
 *
 * @param pbRegionMask - Returns a value that indicates the logical unit's specified region.
 *        Once the drive region has been set, exactly one bit shall be set to zero to indicate the region.
 *        Each bit represents one of eight regions. If a bit is set to zero in this field, the disc can be
 *        played in the corresponding region. If a bit is set to one in this field, the disc cannot be played
 *        in the corresponding region.
 */
LOADER_ERR LoaderGetRPC(LOADER_HANDLE tLoader, BYTE *pbRegionMask)
{
    /* verify input */
    if ( (tLoader == NULL) || (pbRegionMask == NULL) )
    {
        return (LOADER_NULL_PTR);
    }

    /* The region mask is read when the loader is opened so just return the stored value */
    *pbRegionMask = ((LOADERHANDLE*)tLoader)->bRegionMask;

    return (LOADER_SUCCESS);
}

/**
 * Invalidates the current authentication grant ID in case of a failure. This
 * allows the authentication procedure to be retired.
 *
 * @param tLoader - The loader handle.
 * @param bAgid - The current authentication grant ID.
 */
LOADER_ERR LoaderInvalidateAgid(LOADER_HANDLE tLoader, BYTE bAgid)
{
    LOADER_ERR err   = LOADER_SUCCESS;
    dvd_authinfo *ai = (dvd_authinfo *)&loaderBuf[0];

    if (tLoader == NULL)
    {
        return (LOADER_NULL_PTR);
    }

    memset(ai, 0, sizeof(dvd_authinfo));

    ai->type     = DVD_INVALIDATE_AGID;
    ai->lsa.agid = bAgid >> 6;

    if (ioctl(((LOADERHANDLE*)tLoader)->lFileHandle, DVD_AUTH, ai) < 0)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("LoaderInvalidateAgid() --FAILED (%s)\n", strerror(errno)));
        loaderSetError(tLoader, errno);
        err = LOADER_FAILURE;
    }

    return (err);
}

/**
 * Gets challenge data from the loader device.
 *
 * @param tLoader - The loader handle.
 * @param bAgid - The current authentication grant ID.
 * @param pbChallenge - The challenge data byte array.
 */
LOADER_ERR LoaderGetChallenge(LOADER_HANDLE tLoader, BYTE bAgid, BYTE *pbChallenge)
{
    int bufSize = 16;
    struct cdrom_generic_command cgc;
    struct request_sense sense;
    LOADER_ERR err = LOADER_SUCCESS;

    if ( (tLoader == NULL) || (pbChallenge == NULL) )
    {
        return (LOADER_NULL_PTR);
    }

    memset(&cgc,   0, sizeof(cgc));
    memset(&sense, 0, sizeof(sense));

    cgc.sense   = &sense;
    cgc.buffer  = loaderBuf;
    cgc.buflen  = bufSize;
    cgc.data_direction = CGC_DATA_READ;
    cgc.timeout = HZ*5;

    cgc.cmd[ 0] = GPCMD_REPORT_KEY;
    cgc.cmd[ 9] = cgc.buflen;
    cgc.cmd[10] = (bAgid | 0x01);

    if (ioctl(((LOADERHANDLE*)tLoader)->lFileHandle, CDROM_SEND_PACKET, &cgc) < 0)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("LoaderGetChallenge() --FAILED (%s)\n", strerror(errno)));
        DBGPRINT(DBG_ON(DBG_ERROR), ("                     --sense key: 0x%x, ASC/ASCQ: 0x%02x%02x\n", sense.sense_key, sense.asc, sense.ascq));
        loaderSetError(tLoader, errno);
        err = LOADER_FAILURE;
    }
    else if (pbChallenge != loaderBuf) {
        /* Copy data to caller's buffer */
        memcpy(pbChallenge, loaderBuf, bufSize);
    }

    return (err);
}

/**
 * Sends challenge data to the loader device.
 *
 * @param tLoader - The loader handle.
 * @param bAgid - The current authentication grant ID.
 * @param pbChallenge - The challenge data byte array.
 */
LOADER_ERR LoaderSendChallenge(LOADER_HANDLE tLoader, BYTE bAgid, BYTE *pbChallenge)
{
    int bufSize = 16;
    struct cdrom_generic_command cgc;
    struct request_sense sense;
    LOADER_ERR err = LOADER_SUCCESS;

    if ( (tLoader == NULL) || (pbChallenge == NULL) )
    {
        return (LOADER_NULL_PTR);
    }

    memset(&cgc,   0, sizeof(cgc));
    memset(&sense, 0, sizeof(sense));

    cgc.sense   = &sense;
    cgc.buffer  = loaderBuf;
    cgc.buflen  = bufSize;
    cgc.data_direction = CGC_DATA_WRITE;
    cgc.timeout = HZ*5;

    cgc.cmd[ 0] = GPCMD_SEND_KEY;
    cgc.cmd[ 9] = cgc.buflen;
    cgc.cmd[10] = (bAgid | 0x01);

    if (pbChallenge != loaderBuf)
    {
        /* copy challenge data to the DMA buffer */
        memcpy(loaderBuf, pbChallenge, bufSize);
    }

    if (ioctl(((LOADERHANDLE*)tLoader)->lFileHandle, CDROM_SEND_PACKET, &cgc) < 0)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("LoaderSendChallenge() --FAILED (%s)\n", strerror(errno)));
        DBGPRINT(DBG_ON(DBG_ERROR), ("                      --sense key: 0x%x, ASC/ASCQ: 0x%02x%02x\n", sense.sense_key, sense.asc, sense.ascq));
        loaderSetError(tLoader, errno);
        err = LOADER_FAILURE;
    }

    return (err);
}

/**
 * Retrieves the first key from the loader device during the authentication
 * process.
 *
 * @param tLoader - The loader handle.
 * @param bAgid - The current authentication grant ID.
 * @param pbKey - The key data byte array.
 */
LOADER_ERR LoaderGetKey1(LOADER_HANDLE tLoader, BYTE bAgid, BYTE *pbKey)
{
    int bufSize = 12;
    struct cdrom_generic_command cgc;
    struct request_sense sense;
    LOADER_ERR err = LOADER_SUCCESS;

    if ( (tLoader == NULL) || (pbKey == NULL) )
    {
        return (LOADER_NULL_PTR);
    }

    memset(&cgc,   0, sizeof(cgc));
    memset(&sense, 0, sizeof(sense));

    cgc.sense   = &sense;
    cgc.buffer  = loaderBuf;
    cgc.buflen  = bufSize;
    cgc.data_direction = CGC_DATA_READ;
    cgc.timeout = HZ*5;

    cgc.cmd[ 0] = GPCMD_REPORT_KEY;
    cgc.cmd[ 9] = cgc.buflen;
    cgc.cmd[10] = (bAgid | 0x02);

    if (ioctl(((LOADERHANDLE*)tLoader)->lFileHandle, CDROM_SEND_PACKET, &cgc) < 0)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("LoaderGetKey1() --FAILED (%s)\n", strerror(errno)));
        DBGPRINT(DBG_ON(DBG_ERROR), ("                --sense key: 0x%x, ASC/ASCQ: 0x%02x%02x\n", sense.sense_key, sense.asc, sense.ascq));
        loaderSetError(tLoader, errno);
        err = LOADER_FAILURE;
    }
    else if (pbKey != loaderBuf) {
        /* copy data to user buffer */
        memcpy(pbKey, loaderBuf, bufSize);
    }

    return (err);
}

/**
 * Sends the encrypted second key to the loader device during the
 * authentication process.
 *
 * @param tLoader - The loader handle.
 * @param bAgid - The current authentication grant ID.
 * @param pbKey - The key data byte array.
 */
LOADER_ERR LoaderSendKey2(LOADER_HANDLE tLoader, BYTE bAgid, BYTE *pbKey)
{
    int bufSize = 12;
    struct cdrom_generic_command cgc;
    struct request_sense sense;
    LOADER_ERR err = LOADER_SUCCESS;

    if ( (tLoader == NULL) || (pbKey == NULL) )
    {
        return (LOADER_NULL_PTR);
    }

    memset(&cgc,   0, sizeof(cgc));
    memset(&sense, 0, sizeof(sense));

    cgc.sense   = &sense;
    cgc.buffer  = loaderBuf;
    cgc.buflen  = bufSize;
    cgc.data_direction = CGC_DATA_WRITE;
    cgc.timeout = HZ*5;

    cgc.cmd[ 0] = GPCMD_SEND_KEY;
    cgc.cmd[ 9] = cgc.buflen;
    cgc.cmd[10] = (bAgid | 0x03);

    if (pbKey != loaderBuf)
    {
        /* copy key data to DMA buffer */
        memcpy(loaderBuf, pbKey, bufSize);
    }

    if (ioctl(((LOADERHANDLE*)tLoader)->lFileHandle, CDROM_SEND_PACKET, &cgc) < 0)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("LoaderSendKey2() --FAILED (%s)\n", strerror(errno)));
        DBGPRINT(DBG_ON(DBG_ERROR), ("                 --sense key: 0x%x, ASC/ASCQ: 0x%02x%02x\n", sense.sense_key, sense.asc, sense.ascq));
        loaderSetError(tLoader, errno);
        err = LOADER_FAILURE;
    }

    return (err);
}

/**
 * Retrieves the disc key from the loader device.
 *
 * @param tLoader - The loader handle.
 * @param bAgid - The current authentication grant ID.
 * @param pbRawKey - The unencrypted key data byte array.
 */
LOADER_ERR LoaderReadDiscKey(LOADER_HANDLE tLoader, BYTE bAgid, BYTE pbRawKey[LDR_BUF_SIZE])
{
    LOADER_ERR err    = LOADER_SUCCESS;

    if ( (tLoader == NULL) || (pbRawKey == NULL) )
    {
        return (LOADER_NULL_PTR);
    }

    err = LoaderReadDiscStruct(tLoader,
                               bAgid,
                               0,
                               0,
                               0x02,        /* read Disc Key */
                               loaderBuf,
                               LDR_BUF_SIZE);

    if (err != LOADER_SUCCESS)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("LoaderReadDiscKey() --FAILED\n"));
    }
    else if (pbRawKey != loaderBuf) {
        /* copy key data to user's buffer */
        memcpy(pbRawKey, loaderBuf, LDR_BUF_SIZE);
    }

    return (err);
}

LOADER_ERR LoaderReadCopyrightType(LOADER_HANDLE tLoader, BYTE *pbType)
{
    LOADER_ERR err = LOADER_SUCCESS;

    if ( (tLoader == NULL) || (pbType == NULL) )
    {
        return (LOADER_NULL_PTR);
    }

    err = LoaderReadDiscStruct(tLoader,
                               0, // Since format code is 0x01, agid is not required, use a dummy value
                               0,
                               0,
                               0x01,        /* read Disc Key */
                               loaderBuf,
                               LDR_BUF_SIZE);

    if (err != LOADER_SUCCESS)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("LoaderReadCopyrightType(): LoaderReadDiscStruct() -- FAILED (%s)\n", strerror(errno)));
    }

    *pbType = loaderBuf[4];

    return (err);

}

/**
 * Retrieves the title key from the loader device.
 *
 * @param tLoader - The loader handle.
 * @param bAgid - The current authentication grant ID.

⌨️ 快捷键说明

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