📄 loader_app.c
字号:
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 + -