diff --git a/Common/DtaAnnotatedDump.h b/Common/DtaAnnotatedDump.h
index 2749365b..aec06ff5 100644
--- a/Common/DtaAnnotatedDump.h
+++ b/Common/DtaAnnotatedDump.h
@@ -20,7 +20,7 @@ along with sedutil. If not, see .
#pragma pack(push,1)
-typedef union
+typedef union _CAtomHeader
{
// four bytes in big endian (network) byte order
uint8_t all[4];
diff --git a/Common/DtaDev.cpp b/Common/DtaDev.cpp
index 0dbc3b13..f581ba46 100644
--- a/Common/DtaDev.cpp
+++ b/Common/DtaDev.cpp
@@ -44,6 +44,26 @@ DtaDev::DtaDev()
DtaDev::~DtaDev()
{
}
+uint8_t DtaDev::isRuby1()
+{
+ LOG(D1) << "Entering DtaDev::isRuby1 " << (uint16_t) disk_info.Ruby10;
+ return disk_info.Ruby10;
+}
+uint8_t DtaDev::isPyrite2()
+{
+ LOG(D1) << "Entering DtaDev::isPyrite2 " << (uint16_t) disk_info.Pyrite20;
+ return disk_info.Pyrite20;
+}
+uint8_t DtaDev::isPyrite1()
+{
+ LOG(D1) << "Entering DtaDev::isPyrite1 " << (uint16_t) disk_info.Pyrite10;
+ return disk_info.Pyrite10;
+}
+uint8_t DtaDev::isOpalite()
+{
+ LOG(D1) << "Entering DtaDev::isOpalite " << (uint16_t) disk_info.Opalite;
+ return disk_info.Opalite;
+}
uint8_t DtaDev::isOpal2()
{
LOG(D1) << "Entering DtaDev::isOpal2 " << (uint16_t) disk_info.OPAL20;
@@ -80,6 +100,11 @@ uint8_t DtaDev::MBRDone()
LOG(D1) << "Entering DtaDev::MBRDone" << (uint16_t)disk_info.Locking_MBRDone;
return disk_info.Locking_MBRDone;
}
+uint8_t DtaDev::MBRAbsent()
+{
+ LOG(D1) << "Entering DtaDev::MBRAbsent" << (uint16_t)disk_info.Locking_MBRAbsent;
+ return disk_info.Locking_MBRAbsent;
+}
uint8_t DtaDev::Locked()
{
LOG(D1) << "Entering DtaDev::Locked" << (uint16_t)disk_info.Locking_locked;
@@ -114,6 +139,8 @@ void DtaDev::discovery0()
uint8_t * epos, *cpos;
Discovery0Header * hdr;
Discovery0Features * body;
+ uint32_t len;
+
d0Response = discovery0buffer + IO_BUFFER_ALIGNMENT;
d0Response = (void *)((uintptr_t)d0Response & (uintptr_t)~(IO_BUFFER_ALIGNMENT - 1));
memset(d0Response, 0, MIN_BUFFER_LENGTH);
@@ -124,9 +151,14 @@ void DtaDev::discovery0()
epos = cpos = (uint8_t *) d0Response;
hdr = (Discovery0Header *) d0Response;
+ len = SWAP32(hdr->length);
+ if (len > MIN_BUFFER_LENGTH) {
+ LOG(D) << "Too long Discovery0 response: " << SWAP32(hdr->length);
+ len = MIN_BUFFER_LENGTH;
+ }
LOG(D3) << "Dumping D0Response";
- IFLOG(D3) DtaHexDump(hdr, SWAP32(hdr->length));
- epos = epos + SWAP32(hdr->length);
+ IFLOG(D3) DtaHexDump(hdr, len);
+ epos = epos + len;
cpos = cpos + 48; // TODO: check header version
do {
@@ -148,6 +180,7 @@ void DtaDev::discovery0()
disk_info.Locking_lockingSupported = body->locking.lockingSupported;
disk_info.Locking_MBRDone = body->locking.MBRDone;
disk_info.Locking_MBREnabled = body->locking.MBREnabled;
+ disk_info.Locking_MBRAbsent = body->locking.MBRAbsent;
disk_info.Locking_mediaEncrypt = body->locking.mediaEncryption;
break;
case FC_GEOMETRY: /* Geometry Features */
@@ -157,6 +190,11 @@ void DtaDev::discovery0()
disk_info.Geometry_logicalBlockSize = SWAP32(body->geometry.logicalBlockSize);
disk_info.Geometry_lowestAlignedLBA = SWAP64(body->geometry.lowestAlighedLBA);
break;
+ case FC_SECUREMSG: /* Secure Messaging */
+ disk_info.SecureMsg = 1;
+ disk_info.SecureMsg_activated = body->secureMsg.activated;
+ disk_info.SecureMsg_numberOfSPs = SWAP16(body->secureMsg.numberOfSPs);
+ break;
case FC_ENTERPRISE: /* Enterprise SSC */
disk_info.Enterprise = 1;
disk_info.ANY_OPAL_SSC = 1;
@@ -169,6 +207,7 @@ void DtaDev::discovery0()
disk_info.ANY_OPAL_SSC = 1;
disk_info.OPAL10_basecomID = SWAP16(body->opalv100.baseComID);
disk_info.OPAL10_numcomIDs = SWAP16(body->opalv100.numberComIDs);
+ disk_info.OPAL10_rangeCrossing = body->opalv100.rangeCrossing;
break;
case FC_SINGLEUSER: /* Single User Mode */
disk_info.SingleUser = 1;
@@ -194,6 +233,69 @@ void DtaDev::discovery0()
disk_info.OPAL20_numUsers = SWAP16(body->opalv200.numlockingUserAuth);
disk_info.OPAL20_rangeCrossing = body->opalv200.rangeCrossing;
break;
+ case FC_BLOCKSID: /* Block SID Authentication */
+ disk_info.BlockSID = 1;
+ disk_info.BlockSID_SIDBlockedState = body->blockSID.SIDBlockedState;
+ disk_info.BlockSID_SIDValueState = body->blockSID.SIDValueState;
+ disk_info.BlockSID_HardwareReset = body->blockSID.HardwareReset;
+ break;
+ case FC_NAMESPACE: /* Namespace */
+ disk_info.Namespace = 1;
+ disk_info.Namespace_MaximumKeyCount = SWAP32(body->ns.MaximumKeyCount);
+ disk_info.Namespace_UnusedKeyCount = SWAP32(body->ns.UnusedKeyCount);
+ disk_info.Namespace_MaximumRangesPerNamespace = SWAP32(body->ns.MaximumRangesPerNamespace);
+ break;
+ case FC_OPALITE: /* Opalite */
+ disk_info.Opalite = 1;
+ disk_info.ANY_OPAL_SSC = 1;
+ disk_info.Opalite_basecomID = SWAP16(body->opalite.baseCommID);
+ disk_info.Opalite_numcomIDs = SWAP16(body->opalite.numCommIDs);
+ disk_info.Opalite_initialPIN = body->opalite.initialPIN;
+ disk_info.Opalite_revertedPIN = body->opalite.revertedPIN;
+ break;
+ case FC_PYRITEV100: /* Pyrite V100 */
+ disk_info.Pyrite10 = 1;
+ disk_info.ANY_OPAL_SSC = 1;
+ disk_info.Pyrite10_basecomID = SWAP16(body->pyrite10.baseCommID);
+ disk_info.Pyrite10_numcomIDs = SWAP16(body->pyrite10.numCommIDs);
+ disk_info.Pyrite10_initialPIN = body->pyrite10.initialPIN;
+ disk_info.Pyrite10_revertedPIN = body->pyrite10.revertedPIN;
+ break;
+ case FC_PYRITEV200: /* Pyrite V200 */
+ disk_info.Pyrite20 = 1;
+ disk_info.ANY_OPAL_SSC = 1;
+ disk_info.Pyrite20_basecomID = SWAP16(body->pyrite20.baseCommID);
+ disk_info.Pyrite20_numcomIDs = SWAP16(body->pyrite20.numCommIDs);
+ disk_info.Pyrite20_initialPIN = body->pyrite20.initialPIN;
+ disk_info.Pyrite20_revertedPIN = body->pyrite20.revertedPIN;
+ break;
+ case FC_RUBYV100: /* Ruby V1.00 */
+ disk_info.Ruby10 = 1;
+ disk_info.ANY_OPAL_SSC = 1;
+ disk_info.Ruby10_basecomID = SWAP16(body->ruby10.baseCommID);
+ disk_info.Ruby10_numcomIDs = SWAP16(body->ruby10.numCommIDs);
+ disk_info.Ruby10_rangeCrossing = body->ruby10.rangeCrossing;
+ disk_info.Ruby10_numAdmins = SWAP16(body->ruby10.numlockingAdminAuth);
+ disk_info.Ruby10_numUsers = SWAP16(body->ruby10.numlockingUserAuth);
+ disk_info.Ruby10_initialPIN = body->ruby10.initialPIN;
+ disk_info.Ruby10_revertedPIN = body->ruby10.revertedPIN;
+ disk_info.Ruby10_PINonTPerRevert = body->ruby10.PINonTPerRevert;
+ break;
+ case FC_DATAREM: /* Supported Data Removal Mechanism */
+ disk_info.DataRem = 1;
+ disk_info.DataRem_processing = body->dataRem.processing;
+ disk_info.DataRem_supported = body->dataRem.supported;
+ disk_info.DataRem_format = body->dataRem.format;
+ for (int i = 0; i < 6; i++)
+ disk_info.DataRem_time[i] = SWAP16(body->dataRem.time[i]);
+ break;
+ case FC_NSGEOMETRY: /* Namespace Geometry Reporting */
+ disk_info.NSGeometry = 1;
+ disk_info.NSGeometry_align = body->nsgeometry.align;
+ disk_info.NSGeometry_alignmentGranularity = SWAP64(body->nsgeometry.alignmentGranularity);
+ disk_info.NSGeometry_logicalBlockSize = SWAP32(body->nsgeometry.logicalBlockSize);
+ disk_info.NSGeometry_lowestAlignedLBA = SWAP64(body->nsgeometry.lowestAlighedLBA);
+ break;
default:
if (0xbfff < (SWAP16(body->TPer.featureCode))) {
// silently ignore vendor specific segments as there is no public doc on them
@@ -240,6 +342,7 @@ void DtaDev::puke()
<< "LockingSupported = " << (disk_info.Locking_lockingSupported ? "Y, " : "N, ");
cout << "MBRDone = " << (disk_info.Locking_MBRDone ? "Y, " : "N, ")
<< "MBREnabled = " << (disk_info.Locking_MBREnabled ? "Y, " : "N, ")
+ << "MBRAbsent = " << (disk_info.Locking_MBRAbsent ? "Y, " : "N, ")
<< "MediaEncrypt = " << (disk_info.Locking_mediaEncrypt ? "Y" : "N")
<< std::endl;
}
@@ -256,6 +359,13 @@ void DtaDev::puke()
<< ", Lowest Aligned LBA = " << disk_info.Geometry_lowestAlignedLBA
<< std::endl;
}
+ if (disk_info.SecureMsg) {
+
+ cout << "Secure Messaging function (" << HEXON(4) << FC_SECUREMSG << HEXOFF << ")" << std::endl;
+ cout << " Activated = " << (disk_info.SecureMsg_activated ? "Y, " : "N, ")
+ << "Number of SPs = " << disk_info.SecureMsg_numberOfSPs
+ << std::endl;
+ }
if (disk_info.Enterprise) {
cout << "Enterprise function (" << HEXON(4) << FC_ENTERPRISE << HEXOFF << ")" << std::endl;
cout << " Range crossing = " << (disk_info.Enterprise_rangeCrossing ? "Y, " : "N, ")
@@ -265,8 +375,9 @@ void DtaDev::puke()
}
if (disk_info.OPAL10) {
cout << "Opal V1.0 function (" << HEXON(4) << FC_OPALV100 << HEXOFF << ")" << std::endl;
- cout << "Base comID = " << HEXON(4) << disk_info.OPAL10_basecomID << HEXOFF
+ cout << " Base comID = " << HEXON(4) << disk_info.OPAL10_basecomID << HEXOFF
<< ", comIDs = " << disk_info.OPAL10_numcomIDs
+ << ", Range Crossing = " << (disk_info.OPAL10_rangeCrossing ? "Y" : "N")
<< std::endl;
}
if (disk_info.SingleUser) {
@@ -288,8 +399,8 @@ void DtaDev::puke()
if (disk_info.OPAL20) {
cout << "OPAL 2.0 function (" << HEXON(4) << FC_OPALV200 << ")" << HEXOFF << std::endl;
cout << " Base comID = " << HEXON(4) << disk_info.OPAL20_basecomID << HEXOFF;
- cout << ", Initial PIN = " << HEXON(2) << disk_info.OPAL20_initialPIN << HEXOFF;
- cout << ", Reverted PIN = " << HEXON(2) << disk_info.OPAL20_revertedPIN << HEXOFF;
+ cout << ", Initial PIN = " << HEXON(2) << static_cast(disk_info.OPAL20_initialPIN) << HEXOFF;
+ cout << ", Reverted PIN = " << HEXON(2) << static_cast(disk_info.OPAL20_revertedPIN) << HEXOFF;
cout << ", comIDs = " << disk_info.OPAL20_numcomIDs;
cout << std::endl;
cout << " Locking Admins = " << disk_info.OPAL20_numAdmins;
@@ -297,6 +408,82 @@ void DtaDev::puke()
cout << ", Range Crossing = " << (disk_info.OPAL20_rangeCrossing ? "Y" : "N");
cout << std::endl;
}
+ if (disk_info.BlockSID) {
+ cout << "Block SID Authentication function (" << HEXON(4) << FC_BLOCKSID << ")" << HEXOFF << std::endl;
+ cout << " SID Blocked State = " << (disk_info.BlockSID_SIDBlockedState ? "Y" : "N");
+ cout << ", SID Value State = " << (disk_info.BlockSID_SIDValueState ? "Y" : "N");
+ cout << ", Hardware Reset = " << (disk_info.BlockSID_HardwareReset ? "Y" : "N");
+ cout << std::endl;
+ }
+ if (disk_info.Namespace) {
+ cout << "Namespace function (" << HEXON(4) << FC_NAMESPACE << ")" << HEXOFF << std::endl;
+ cout << " Maximum Key Count = " << disk_info.Namespace_MaximumKeyCount;
+ cout << ", Unused Key Count = " << disk_info.Namespace_UnusedKeyCount;
+ cout << ", Maximum Ranges Per Namespace = " << disk_info.Namespace_MaximumRangesPerNamespace;
+ cout << std::endl;
+ }
+ if (disk_info.Opalite) {
+ cout << "Opalite function (" << HEXON(4) << FC_OPALITE << ")" << HEXOFF << std::endl;
+ cout << " Base comID = " << HEXON(4) << disk_info.Opalite_basecomID << HEXOFF;
+ cout << ", comIDs = " << disk_info.Opalite_numcomIDs;
+ cout << ", Initial PIN = " << HEXON(2) << disk_info.Opalite_initialPIN << HEXOFF;
+ cout << ", Reverted PIN = " << HEXON(2) << disk_info.Opalite_revertedPIN << HEXOFF;
+ cout << std::endl;
+ }
+ if (disk_info.Pyrite10) {
+ cout << "Pyrite 1.0 function (" << HEXON(4) << FC_PYRITEV100 << ")" << HEXOFF << std::endl;
+ cout << " Base comID = " << HEXON(4) << disk_info.Pyrite10_basecomID << HEXOFF;
+ cout << ", comIDs = " << disk_info.Pyrite10_numcomIDs;
+ cout << ", Initial PIN = " << HEXON(2) << disk_info.Pyrite10_initialPIN << HEXOFF;
+ cout << ", Reverted PIN = " << HEXON(2) << disk_info.Pyrite10_revertedPIN << HEXOFF;
+ cout << std::endl;
+ }
+ if (disk_info.Pyrite20) {
+ cout << "Pyrite 2.0 function (" << HEXON(4) << FC_PYRITEV200 << ")" << HEXOFF << std::endl;
+ cout << " Base comID = " << HEXON(4) << disk_info.Pyrite20_basecomID << HEXOFF;
+ cout << ", comIDs = " << disk_info.Pyrite20_numcomIDs;
+ cout << ", Initial PIN = " << HEXON(2) << disk_info.Pyrite20_initialPIN << HEXOFF;
+ cout << ", Reverted PIN = " << HEXON(2) << disk_info.Pyrite20_revertedPIN << HEXOFF;
+ cout << std::endl;
+ }
+ if (disk_info.Ruby10) {
+ cout << "Ruby 1.0 function (" << HEXON(4) << FC_RUBYV100 << ")" << HEXOFF << std::endl;
+ cout << " Base comID = " << HEXON(4) << disk_info.Ruby10_basecomID << HEXOFF;
+ cout << ", comIDs = " << disk_info.Ruby10_numcomIDs;
+ cout << ", Initial PIN = " << HEXON(2) << disk_info.Ruby10_initialPIN << HEXOFF;
+ cout << ", Reverted PIN = " << HEXON(2) << disk_info.Ruby10_revertedPIN << HEXOFF;
+ cout << ", PINonTPerRevert = " << HEXON(2) << disk_info.Ruby10_PINonTPerRevert << HEXOFF;
+ cout << std::endl;
+ cout << " Locking Admins = " << disk_info.Ruby10_numAdmins;
+ cout << ", Locking Users = " << disk_info.Ruby10_numUsers;
+ cout << ", Range Crossing = " << (disk_info.Ruby10_rangeCrossing ? "Y" : "N");
+ cout << std::endl;
+ }
+ if (disk_info.DataRem) {
+ cout << "Supported Data Removal Mechanism function (" << HEXON(4) << FC_DATAREM << ")" << HEXOFF << std::endl;
+ cout << " Processing = " << (disk_info.DataRem_processing ? "Y" : "N");
+ string types[6] = { "Overwrite", "Block", "Crypto", "Unmap", "Reset Write Pointers", "Vendor Specific" };
+ for (int i = 0; i < 6; i++) {
+ if ((disk_info.DataRem_supported & (1 << i)) == 0)
+ continue;
+ cout << ", " << types[i];
+ cout << " = " << (disk_info.DataRem_time[i] * 2) <<
+ (((disk_info.DataRem_format & (1 << i)) == 0) ? "s " : "m ");
+ }
+ cout << std::endl;
+ }
+ if (disk_info.NSGeometry) {
+ cout << "Namespace Geometry function (" << HEXON(4) << FC_NSGEOMETRY << HEXOFF << ")" << std::endl;
+ cout << " Align = " << (disk_info.NSGeometry_align ? "Y, " : "N, ")
+ << "Alignment Granularity = " << disk_info.NSGeometry_alignmentGranularity
+ << " (" << // display bytes
+ (disk_info.NSGeometry_alignmentGranularity *
+ disk_info.NSGeometry_logicalBlockSize)
+ << ")"
+ << ", Logical Block size = " << disk_info.NSGeometry_logicalBlockSize
+ << ", Lowest Aligned LBA = " << disk_info.NSGeometry_lowestAlignedLBA
+ << std::endl;
+ }
if (disk_info.Unknown)
cout << "**** " << (uint16_t)disk_info.Unknown << " **** Unknown function codes IGNORED " << std::endl;
}
diff --git a/Common/DtaDev.h b/Common/DtaDev.h
index 473f7bd0..04096a2a 100644
--- a/Common/DtaDev.h
+++ b/Common/DtaDev.h
@@ -38,6 +38,14 @@ class DtaDev {
DtaDev();
/** Default destructor, does nothing*/
virtual ~DtaDev();
+ /** Does the device conform to the Ruby 1.0 SSC */
+ uint8_t isRuby1();
+ /** Does the device conform to the Pyrite 2.0 SSC */
+ uint8_t isPyrite2();
+ /** Does the device conform to the Pyrite 1.0 SSC */
+ uint8_t isPyrite1();
+ /** Does the device conform to the Opalite SSC */
+ uint8_t isOpalite();
/** Does the device conform to the OPAL 2.0 SSC */
uint8_t isOpal2();
/** Does the device conform to the OPAL 1.0 SSC */
@@ -50,6 +58,8 @@ class DtaDev {
uint8_t MBREnabled();
/** Is the MBRDone flag set */
uint8_t MBRDone();
+ /** Is the MBRAbsent flag set */
+ uint8_t MBRAbsent();
/** Is the Locked flag set */
uint8_t Locked();
/** Is the Locking SP enabled */
@@ -251,16 +261,16 @@ class DtaDev {
virtual uint8_t eraseLockingRange(uint8_t lockingrange, char * password) = 0;
/** Dumps an object for diagnostic purposes
* @param sp index into the OPALUID table for the SP the object is in
- * @param auth the authority ti use for the dump
- * @param pass the password for the suthority
+ * @param auth the authority to use for the dump
+ * @param pass the password for the authority
* @param objID the UID of the object to dump
* */
virtual uint8_t objDump(char *sp, char * auth, char *pass,
char * objID) = 0;
/** Issue any command to the drive for diagnostic purposes
* @param sp index into the OPALUID table for the SP the object is in
- * @param auth the authority ti use for the dump
- * @param pass the password for the suthority
+ * @param auth the authority to use for the dump
+ * @param pass the password for the authority
* @param invoker caller of the method
* @param method the method to call
* @param plist the parameter list for the command
diff --git a/Common/DtaDevEnterprise.cpp b/Common/DtaDevEnterprise.cpp
index ae649ec5..bdc169a7 100644
--- a/Common/DtaDevEnterprise.cpp
+++ b/Common/DtaDevEnterprise.cpp
@@ -365,13 +365,13 @@ uint8_t DtaDevEnterprise::revertLockingSP(char * password, uint8_t keep)
cmd->addToken(OPAL_TOKEN::ENDNAME);
cmd->addToken(OPAL_TOKEN::ENDLIST);
cmd->complete();
- session->expectAbort();
if ((lastRC = session->sendCommand(cmd, response)) != 0) {
delete cmd;
delete session;
return lastRC;
}
LOG(I) << "revertLockingSP completed successfully";
+ session->expectAbort();
delete cmd;
delete session;
LOG(D1) << "Exiting DtaDevEnterprise::revertLockingSP()";
@@ -435,28 +435,20 @@ uint8_t DtaDevEnterprise::setPassword(char * password, char * userid, char * new
return lastRC;
}
+ std::vector hash;
if ((newpassword == NULL) || (*newpassword == '\0')) {
- std::vector tmppwd;
-
- tmppwd.push_back(0xd0);
- tmppwd.push_back((uint8_t)strnlen(newpwd, 255));
+ hash.push_back(0xd0);
+ hash.push_back((uint8_t)strnlen(newpwd, 255));
for (unsigned int i = 0; i < strnlen(newpwd, 255); i++) {
- tmppwd.push_back(newpwd[i]);
- }
-
- if ((lastRC = setTable(usercpin, "PIN", tmppwd)) != 0) {
- LOG(E) << "Unable to set user " << userid << " new password ";
- delete session;
- return lastRC;
+ hash.push_back(newpwd[i]);
}
} else {
- std::vector hash;
DtaHashPwd(hash, newpwd, this);
- if ((lastRC = setTable(usercpin, "PIN", hash)) != 0) {
- LOG(E) << "Unable to set user " << userid << " new password ";
- delete session;
- return lastRC;
- }
+ }
+ if ((lastRC = setTable(usercpin, "PIN", hash)) != 0) {
+ LOG(E) << "Unable to set user " << userid << " new password ";
+ delete session;
+ return lastRC;
}
LOG(I) << userid << " password changed";
delete session;
@@ -897,13 +889,13 @@ uint8_t DtaDevEnterprise::revertTPer(char * password, uint8_t PSID, uint8_t Admi
cmd->addToken(OPAL_TOKEN::STARTLIST);
cmd->addToken(OPAL_TOKEN::ENDLIST);
cmd->complete();
- session->expectAbort();
if ((lastRC = session->sendCommand(cmd, response)) != 0) {
delete cmd;
delete session;
return lastRC;
}
LOG(I) << "revertTper completed successfully";
+ session->expectAbort();
delete cmd;
delete session;
LOG(D1) << "Exiting DtaDevEnterprise::revertTPer()";
@@ -1182,7 +1174,7 @@ uint8_t DtaDevEnterprise::initLSPUsers(char * defaultPassword, char * newPasswor
delete session;
return lastRC;
}
- LOG(I) << "EraseMaster password set";
+ LOG(I) << "EraseMaster password set";
delete session;
// look up MaxRanges
uint16_t MaxRanges = 0;
@@ -1274,57 +1266,53 @@ uint8_t DtaDevEnterprise::setSIDPassword(char * oldpassword, char * newpassword,
{
LOG(D1) << "Entering DtaDevEnterprise::setSIDPassword()";
uint8_t lastRC;
+ string defaultPassword;
+ char *pwd = oldpassword, *newpwd = newpassword;
- vector user;
- set8(user, OPALUID[OPAL_SID_UID]);
+ std::vector user;
+ set8(user, OPALUID[OPAL_SID_UID]);
- vector usercpin;
- set8(usercpin, OPALUID[OPAL_C_PIN_SID]);
+ std::vector usercpin;
+ set8(usercpin, OPALUID[OPAL_C_PIN_SID]);
- if (*oldpassword == '\0')
- {
+ if ((oldpassword == NULL) || (*oldpassword == '\0') ||
+ (newpassword == NULL) || (*newpassword == '\0')) {
if ((lastRC = getDefaultPassword()) != 0) {
- LOG(E) << "setPassword failed to retrieve MSID";
+ LOG(E) << "setSIDPassword failed to retrieve MSID";
return lastRC;
}
- string defaultPassword = response.getString(5);
- session = new DtaSession(this);
- if (session == NULL) {
- LOG(E) << "Unable to create session object ";
- return DTAERROR_OBJECT_CREATE_FAILED;
+ defaultPassword = response.getString(5);
+ if ((oldpassword == NULL) || (*oldpassword == '\0')) {
+ pwd = (char *)defaultPassword.c_str();
+ hasholdpwd = 0;
}
- session->dontHashPwd();
- if ((lastRC = session->start(OPAL_UID::OPAL_ADMINSP_UID, (char *)defaultPassword.c_str(), user)) != 0) {
- delete session;
- return lastRC;
+
+ if ((newpassword == NULL) || (*newpassword == '\0')) {
+ newpwd = (char *)defaultPassword.c_str();
+ hashnewpwd = 0;
}
}
- else
- {
- session = new DtaSession(this);
- if (session == NULL) {
- LOG(E) << "Unable to create session object ";
- return DTAERROR_OBJECT_CREATE_FAILED;
- }
- session->dontHashPwd();
- if (!hasholdpwd) session->dontHashPwd();
- if ((lastRC = session->start(OPAL_UID::OPAL_ADMINSP_UID, oldpassword, user)) != 0) {
- delete session;
- return lastRC;
- }
+
+ session = new DtaSession(this);
+ if (session == NULL) {
+ LOG(E) << "Unable to create session object ";
+ return DTAERROR_OBJECT_CREATE_FAILED;
}
- vector hash;
- if (hashnewpwd)
- {
- DtaHashPwd(hash, newpassword, this);
+ if (!hasholdpwd)
+ session->dontHashPwd();
+ if ((lastRC = session->start(OPAL_UID::OPAL_ADMINSP_UID, pwd, user)) != 0) {
+ delete session;
+ return lastRC;
}
- else
- {
+
+ std::vector hash;
+ if (hashnewpwd) {
+ DtaHashPwd(hash, newpwd, this);
+ } else {
hash.push_back(0xd0);
- hash.push_back((uint8_t)strnlen(newpassword, 255));
- for (uint16_t i = 0; i < strnlen(newpassword, 255); i++)
- {
- hash.push_back(newpassword[i]);
+ hash.push_back((uint8_t)strnlen(newpwd, 255));
+ for (uint16_t i = 0; i < strnlen(newpwd, 255); i++) {
+ hash.push_back(newpwd[i]);
}
}
if ((lastRC = setTable(usercpin, "PIN", hash)) != 0) {
@@ -1332,6 +1320,7 @@ uint8_t DtaDevEnterprise::setSIDPassword(char * oldpassword, char * newpassword,
delete session;
return lastRC;
}
+ LOG(I) << "SID password changed";
delete session;
LOG(D1) << "Exiting DtaDevEnterprise::setSIDPassword()";
return 0;
diff --git a/Common/DtaDevEnterprise.h b/Common/DtaDevEnterprise.h
index 5350da5c..3d60b581 100644
--- a/Common/DtaDevEnterprise.h
+++ b/Common/DtaDevEnterprise.h
@@ -188,15 +188,15 @@ class DtaDevEnterprise : public DtaDevOS {
void puke();
/** Dumps an object for diagnostic purposes
* @param sp index into the OPALUID table for the SP the object is in
- * @param auth the authority ti use for the dump
- * @param pass the password for the suthority
+ * @param auth the authority to use for the dump
+ * @param pass the password for the authority
* @param objID the UID of the object to dump
* */
uint8_t objDump(char *sp, char * auth, char *pass, char * objID);
/** Issue any command to the drive for diagnostic purposes
* @param sp index into the OPALUID table for the SP the object is in
- * @param hexauth the authority ti use for the dump
- * @param pass the password for the suthority
+ * @param hexauth the authority to use for the dump
+ * @param pass the password for the authority
* @param hexinvokingUID caller of the method
* @param hexmethod the method to call
* @param hexparms the parameter list for the command
diff --git a/Common/DtaDevGeneric.h b/Common/DtaDevGeneric.h
index 9f5f9752..e4eedd16 100644
--- a/Common/DtaDevGeneric.h
+++ b/Common/DtaDevGeneric.h
@@ -195,16 +195,16 @@ class DtaDevGeneric : public DtaDevOS {
virtual uint8_t eraseLockingRange(uint8_t lockingrange, char * password);
/** Dumps an object for diagnostic purposes
* @param sp index into the OPALUID table for the SP the object is in
- * @param auth the authority ti use for the dump
- * @param pass the password for the suthority
+ * @param auth the authority to use for the dump
+ * @param pass the password for the authority
* @param objID the UID of the object to dump
*/
uint8_t objDump(char *sp, char * auth, char *pass,
char * objID) ;
/** Issue any command to the drive for diagnostic purposes
* @param sp index into the OPALUID table for the SP the object is in
- * @param auth the authority ti use for the dump
- * @param pass the password for the suthority
+ * @param auth the authority to use for the dump
+ * @param pass the password for the authority
* @param invoker caller of the method
* @param method the method to call
* @param plist the parameter list for the command
diff --git a/Common/DtaDevOpal.cpp b/Common/DtaDevOpal.cpp
index 1cb5701a..0c190708 100644
--- a/Common/DtaDevOpal.cpp
+++ b/Common/DtaDevOpal.cpp
@@ -33,6 +33,7 @@ along with sedutil. If not, see .
#include "DtaResponse.h"
#include "DtaSession.h"
#include "DtaHexDump.h"
+#include "DtaAnnotatedDump.h"
using namespace std;
@@ -70,13 +71,8 @@ uint8_t DtaDevOpal::initialSetup(char * password)
LOG(E) << "Initial setup failed - unable to set global locking range RW";
return lastRC;
}
- if ((lastRC = setMBRDone(1, password)) != 0){
- LOG(E) << "Initial setup failed - unable to Enable MBR shadow";
- return lastRC;
- }
- if ((lastRC = setMBREnable(1, password)) != 0){
- LOG(E) << "Initial setup failed - unable to Enable MBR shadow";
- return lastRC;
+ if (!MBRAbsent()) {
+ setMBREnable(1, password);
}
LOG(I) << "Initial setup of TPer complete on " << dev;
@@ -211,6 +207,7 @@ DtaDevOpal::lrStatus_t DtaDevOpal::getLockingRange_status(uint8_t lockingrange,
}
uint8_t DtaDevOpal::listLockingRanges(char * password, int16_t rangeid)
{
+ uint32_t i, numRanges;
uint8_t lastRC;
LOG(D1) << "Entering DtaDevOpal:listLockingRanges()" << rangeid;
vector LR;
@@ -228,23 +225,29 @@ uint8_t DtaDevOpal::listLockingRanges(char * password, int16_t rangeid)
delete session;
return lastRC;
}
- vector table;
- table.push_back(OPAL_SHORT_ATOM::BYTESTRING8);
- for (int i = 0; i < 8; i++) {
- table.push_back(OPALUID[OPAL_UID::OPAL_LOCKING_INFO_TABLE][i]);
- }
- if ((lastRC = getTable(table, _OPAL_TOKEN::MAXRANGES, _OPAL_TOKEN::MAXRANGES)) != 0) {
- delete session;
- return lastRC;
- }
- if (response.tokenIs(4) != _OPAL_TOKEN::DTA_TOKENID_UINT) {
- LOG(E) << "Unable to determine number of ranges ";
- delete session;
- return DTAERROR_NO_LOCKING_INFO;
+ if (rangeid == -1) {
+ vector table;
+ table.push_back(OPAL_SHORT_ATOM::BYTESTRING8);
+ for (int i = 0; i < 8; i++) {
+ table.push_back(OPALUID[OPAL_UID::OPAL_LOCKING_INFO_TABLE][i]);
+ }
+ if ((lastRC = getTable(table, _OPAL_TOKEN::MAXRANGES, _OPAL_TOKEN::MAXRANGES)) != 0) {
+ delete session;
+ return lastRC;
+ }
+ if (response.tokenIs(4) != _OPAL_TOKEN::DTA_TOKENID_UINT) {
+ LOG(E) << "Unable to determine number of ranges ";
+ delete session;
+ return DTAERROR_NO_LOCKING_INFO;
+ }
+ numRanges = response.getUint32(4) + 1;
+ i = 0;
+ } else {
+ numRanges = rangeid + 1;
+ i = rangeid;
}
LOG(I) << "Locking Range Configuration for " << dev;
- uint32_t numRanges = response.getUint32(4) + 1;
- for (uint32_t i = 0; i < numRanges; i++){
+ for (; i < numRanges; i++){
if(0 != i) LR[8] = i & 0xff;
if ((lastRC = getTable(LR, _OPAL_TOKEN::RANGESTART, _OPAL_TOKEN::WRITELOCKED)) != 0) {
delete session;
@@ -638,6 +641,7 @@ uint8_t DtaDevOpal::revertLockingSP(char * password, uint8_t keep)
// empty list returned so rely on method status
LOG(I) << "Revert LockingSP complete";
session->expectAbort();
+ delete cmd;
delete session;
LOG(D1) << "Exiting DtaDevOpal::revertLockingSP()";
return 0;
@@ -1110,13 +1114,13 @@ uint8_t DtaDevOpal::revertTPer(char * password, uint8_t PSID, uint8_t AdminSP)
cmd->addToken(OPAL_TOKEN::STARTLIST);
cmd->addToken(OPAL_TOKEN::ENDLIST);
cmd->complete();
- session->expectAbort();
if ((lastRC = session->sendCommand(cmd, response)) != 0) {
delete cmd;
delete session;
return lastRC;
}
LOG(I) << "revertTper completed successfully";
+ session->expectAbort();
delete cmd;
delete session;
LOG(D1) << "Exiting DtaDevOpal::revertTPer()";
@@ -1484,6 +1488,7 @@ uint8_t DtaDevOpal::setSIDPassword(char * oldpassword, char * newpassword,
delete session;
return lastRC;
}
+ LOG(I) << "SID password changed";
delete session;
LOG(D1) << "Exiting DtaDevOpal::setSIDPassword()";
return 0;
@@ -1567,6 +1572,7 @@ uint8_t DtaDevOpal::exec(DtaCommand * cmd, DtaResponse & resp, uint8_t protocol)
uint8_t lastRC;
OPALHeader * hdr = (OPALHeader *) cmd->getCmdBuffer();
LOG(D3) << endl << "Dumping command buffer";
+ IFLOG(D) DtaAnnotatedDump(IF_SEND, cmd->getCmdBuffer(), cmd->outputBufferSize());
IFLOG(D3) DtaHexDump(cmd->getCmdBuffer(), SWAP32(hdr->cp.length) + sizeof (OPALComPacket));
if((lastRC = sendCmd(IF_SEND, protocol, comID(), cmd->getCmdBuffer(), cmd->outputBufferSize())) != 0) {
LOG(E) << "Command failed on send " << (uint16_t) lastRC;
@@ -1581,6 +1587,7 @@ uint8_t DtaDevOpal::exec(DtaCommand * cmd, DtaResponse & resp, uint8_t protocol)
}
while ((0 != hdr->cp.outstandingData) && (0 == hdr->cp.minTransfer));
LOG(D3) << std::endl << "Dumping reply buffer";
+ IFLOG(D) DtaAnnotatedDump(IF_RECV, cmd->getRespBuffer(), SWAP32(hdr->cp.length) + sizeof (OPALComPacket));
IFLOG(D3) DtaHexDump(cmd->getRespBuffer(), SWAP32(hdr->cp.length) + sizeof (OPALComPacket));
if (0 != lastRC) {
LOG(E) << "Command failed on recv" << (uint16_t) lastRC;
diff --git a/Common/DtaDevOpal.h b/Common/DtaDevOpal.h
index 60004db4..33bc357f 100644
--- a/Common/DtaDevOpal.h
+++ b/Common/DtaDevOpal.h
@@ -243,16 +243,16 @@ class DtaDevOpal : public DtaDevOS {
void puke();
/** Dumps an object for diagnostic purposes
* @param sp index into the OPALUID table for the SP the object is in
- * @param auth the authority ti use for the dump
- * @param pass the password for the suthority
+ * @param auth the authority to use for the dump
+ * @param pass the password for the authority
* @param objID the UID of the object to dump
* */
uint8_t objDump(char *sp, char * auth, char *pass,
char * objID);
/** Issue any command to the drive for diagnostic purposes
* @param sp index into the OPALUID table for the SP the object is in
- * @param auth the authority ti use for the dump
- * @param pass the password for the suthority
+ * @param auth the authority to use for the dump
+ * @param pass the password for the authority
* @param invoker caller of the method
* @param method the method to call
* @param plist the parameter list for the command
diff --git a/Common/DtaDevOpalite.cpp b/Common/DtaDevOpalite.cpp
new file mode 100644
index 00000000..1443f8c5
--- /dev/null
+++ b/Common/DtaDevOpalite.cpp
@@ -0,0 +1,35 @@
+/* C:B**************************************************************************
+This software is Copyright 2014-2017 Bright Plaza Inc.
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+
+#include "DtaDevOpalite.h"
+
+using namespace std;
+
+
+DtaDevOpalite::DtaDevOpalite (const char * devref)
+{
+ DtaDevOpal::init(devref);
+ assert(isOpalite());
+}
+
+DtaDevOpalite::~DtaDevOpalite()
+{
+}
+uint16_t DtaDevOpalite::comID() { return disk_info.Opalite_basecomID; }
diff --git a/Common/DtaDevOpalite.h b/Common/DtaDevOpalite.h
new file mode 100644
index 00000000..7eec2ecf
--- /dev/null
+++ b/Common/DtaDevOpalite.h
@@ -0,0 +1,34 @@
+/* C:B**************************************************************************
+This software is Copyright 2014-2017 Bright Plaza Inc.
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+#pragma once
+#include "os.h"
+#include "DtaDevOpal.h"
+
+using namespace std;
+/** Class representing a disk device, this class is represents a disk that conforms
+* to the Opalite SSC
+*/
+class DtaDevOpalite : public DtaDevOpal {
+public:
+ DtaDevOpalite(const char * devref);
+ ~DtaDevOpalite();
+ /** return the communication ID to be used with this device */
+ uint16_t comID();
+};
\ No newline at end of file
diff --git a/Common/DtaDevPyrite1.cpp b/Common/DtaDevPyrite1.cpp
new file mode 100644
index 00000000..fde0d2d4
--- /dev/null
+++ b/Common/DtaDevPyrite1.cpp
@@ -0,0 +1,35 @@
+/* C:B**************************************************************************
+This software is Copyright 2014-2017 Bright Plaza Inc.
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+
+#include "DtaDevPyrite1.h"
+
+using namespace std;
+
+
+DtaDevPyrite1::DtaDevPyrite1 (const char * devref)
+{
+ DtaDevOpal::init(devref);
+ assert(isPyrite1());
+}
+
+DtaDevPyrite1::~DtaDevPyrite1()
+{
+}
+uint16_t DtaDevPyrite1::comID() { return disk_info.Pyrite10_basecomID; }
diff --git a/Common/DtaDevPyrite1.h b/Common/DtaDevPyrite1.h
new file mode 100644
index 00000000..52473e9d
--- /dev/null
+++ b/Common/DtaDevPyrite1.h
@@ -0,0 +1,35 @@
+/* C:B**************************************************************************
+This software is Copyright 2014-2017 Bright Plaza Inc.
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+#pragma once
+#include "os.h"
+#include "DtaDevOpal.h"
+
+using namespace std;
+/** Class representing a disk device, this class is represents a disk that conforms
+* to the Pyrite 1.0 SSC
+*/
+class DtaDevPyrite1 : public DtaDevOpal {
+public:
+ DtaDevPyrite1(const char * devref);
+ ~DtaDevPyrite1();
+ /** return the communication ID to be used with this device */
+ uint16_t comID();
+
+};
\ No newline at end of file
diff --git a/Common/DtaDevPyrite2.cpp b/Common/DtaDevPyrite2.cpp
new file mode 100644
index 00000000..f25cb471
--- /dev/null
+++ b/Common/DtaDevPyrite2.cpp
@@ -0,0 +1,35 @@
+/* C:B**************************************************************************
+This software is Copyright 2014-2017 Bright Plaza Inc.
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+
+#include "DtaDevPyrite2.h"
+
+using namespace std;
+
+
+DtaDevPyrite2::DtaDevPyrite2 (const char * devref)
+{
+ DtaDevOpal::init(devref);
+ assert(isPyrite2());
+}
+
+DtaDevPyrite2::~DtaDevPyrite2()
+{
+}
+uint16_t DtaDevPyrite2::comID() { return disk_info.Pyrite20_basecomID; }
diff --git a/Common/DtaDevPyrite2.h b/Common/DtaDevPyrite2.h
new file mode 100644
index 00000000..16c34c2b
--- /dev/null
+++ b/Common/DtaDevPyrite2.h
@@ -0,0 +1,35 @@
+/* C:B**************************************************************************
+This software is Copyright 2014-2017 Bright Plaza Inc.
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+#pragma once
+#include "os.h"
+#include "DtaDevOpal.h"
+
+using namespace std;
+/** Class representing a disk device, this class is represents a disk that conforms
+* to the Pyrite 2.0 SSC
+*/
+class DtaDevPyrite2 : public DtaDevOpal {
+public:
+ DtaDevPyrite2(const char * devref);
+ ~DtaDevPyrite2();
+ /** return the communication ID to be used with this device */
+ uint16_t comID();
+
+};
\ No newline at end of file
diff --git a/Common/DtaDevRuby1.cpp b/Common/DtaDevRuby1.cpp
new file mode 100644
index 00000000..9a8b4e52
--- /dev/null
+++ b/Common/DtaDevRuby1.cpp
@@ -0,0 +1,35 @@
+/* C:B**************************************************************************
+This software is Copyright 2014-2017 Bright Plaza Inc.
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+
+#include "DtaDevRuby1.h"
+
+using namespace std;
+
+
+DtaDevRuby1::DtaDevRuby1 (const char * devref)
+{
+ DtaDevOpal::init(devref);
+ assert(isRuby1());
+}
+
+DtaDevRuby1::~DtaDevRuby1()
+{
+}
+uint16_t DtaDevRuby1::comID() { return disk_info.Ruby10_basecomID; }
diff --git a/Common/DtaDevRuby1.h b/Common/DtaDevRuby1.h
new file mode 100644
index 00000000..c1c8be40
--- /dev/null
+++ b/Common/DtaDevRuby1.h
@@ -0,0 +1,38 @@
+/* C:B**************************************************************************
+This software is Copyright 2014-2017 Bright Plaza Inc.
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+#pragma once
+#include "os.h"
+#include "DtaDevOpal.h"
+
+using namespace std;
+/** Class representing a disk device, this class is represents a disk that conforms
+* to the OPAL 2.0 SSC
+*
+* testing so far indicates that the functions implemented in this program
+* function the same in OPAL 1.0 and Opal 2.0
+*/
+class DtaDevRuby1 : public DtaDevOpal {
+public:
+ DtaDevRuby1(const char * devref);
+ ~DtaDevRuby1();
+ /** return the communication ID to be used with this device */
+ uint16_t comID();
+
+};
\ No newline at end of file
diff --git a/Common/DtaOptions.cpp b/Common/DtaOptions.cpp
index a80be931..dec912e1 100644
--- a/Common/DtaOptions.cpp
+++ b/Common/DtaOptions.cpp
@@ -25,7 +25,7 @@ void usage()
{
printf("sedutil v%s Copyright 2014-2017 Bright Plaza Inc. \n", GIT_VERSION);
printf("a utility to manage self encrypting drives that conform\n");
- printf("to the Trusted Computing Group OPAL 2.0 SSC specification\n");
+ printf("to the TCG Enterprise, Opal, Opalite and Pyrite SSC specs\n");
printf("General Usage: (see readme for extended commandset)\n");
printf("sedutil-cli <-v> <-n> \n");
printf("-v (optional) increase verbosity, one to five v's\n");
@@ -49,10 +49,10 @@ void usage()
printf(" Rekey Locking Range\n");
printf("--setBandsEnabled \n");
printf(" Set Enabled for all Locking Ranges\n");
- printf(" (passwort = \"\" for MSID) \n");
+ printf(" (password = \"\" for MSID) \n");
printf("--setBandEnabled <0...n> \n");
printf(" Set Enabled for Locking Range[n]\n");
- printf(" (passwort = \"\" for MSID) \n");
+ printf(" (password = \"\" for MSID) \n");
printf("--eraseLockingRange <0...n> \n");
printf(" Erase a Locking Range\n");
printf(" 0 = GLobal 1..n = LRn \n");
@@ -64,11 +64,10 @@ void usage()
printf(" is new SID and Admin1 password\n");
printf("--setSIDPassword \n");
printf(" Change the SID password\n");
- printf("--setAdmin1Pwd \n");
- printf(" Change the Admin1 password\n");
printf("--setPassword \n");
- printf(" Change the Enterprise password for userid\n");
- printf(" \"EraseMaster\" or \"BandMaster\", 0 <= n <= 1023\n");
+ printf(" Change password for userid:\n");
+ printf(" Enteprise: \"EraseMaster\" or \"BandMaster\"\n");
+ printf(" Opal: \"Admin\" or \"User\"\n");
printf("--setLockingRange <0...n> \n");
printf(" Set the status of a Locking Range\n");
printf(" 0 = GLobal 1..n = LRn \n");
@@ -91,15 +90,20 @@ void usage()
printf(" deactivate the Locking SP \n");
printf(" without erasing the data \n");
printf(" on GLOBAL RANGE *ONLY* \n");
- printf("--yesIreallywanttoERASEALLmydatausingthePSID \n");
- printf(" revert the device using the PSID *ERASING* *ALL* the data \n");
+ printf("--PSIDrevert \n");
+ printf("--yesIreallywanttoERASEALLmydatausingthePSID \n");
+ printf(" revert the device using the PSID *ERASING*\n");
+ printf(" *ALL* the data\n");
+ printf("--PSIDrevertAdminSP \n");
+ printf(" Alike to PSIDrevert, but on Enterprise calls\n");
+ printf(" AdminSP->Revert instead of ThisSP->RevertSP\n");
printf("--printDefaultPassword \n");
printf(" print MSID \n");
printf("\n");
printf("Examples \n");
printf("sedutil-cli --scan \n");
printf("sedutil-cli --query %s \n", DEVICEEXAMPLE);
- printf("sedutil-cli --yesIreallywanttoERASEALLmydatausingthePSID %s \n", DEVICEEXAMPLE);
+ printf("sedutil-cli --yesIreallywanttoERASEALLmydatausingthePSID %s \n", DEVICEEXAMPLE);
printf("sedutil-cli --initialSetup %s \n", DEVICEEXAMPLE);
return;
}
@@ -126,6 +130,7 @@ uint8_t DtaOptions(int argc, char * argv[], DTA_OPTIONS * opts)
loggingLevel += (uint16_t)(strlen(argv[i]) - 1);
if (loggingLevel > 7) loggingLevel = 7;
CLog::Level() = CLog::FromInt(loggingLevel);
+ RCLog::Level() = RCLog::FromInt(loggingLevel);
LOG(D) << "Log level set to " << CLog::ToString(CLog::FromInt(loggingLevel));
LOG(D) << "sedutil version : " << GIT_VERSION;
}
@@ -139,6 +144,18 @@ uint8_t DtaOptions(int argc, char * argv[], DTA_OPTIONS * opts)
opts->output_format = sedutilNormal;
outputFormat = sedutilNormal;
}
+ else if (!(strcmp("-d", argv[i]))) {
+ if (i+1 < argc && !strcmp("nvme", argv[i+1])) {
+ g_force_dev = FORCE_DEV_NVME;
+ } else if (i+1 < argc && !strcmp("scsi", argv[i+1])) {
+ g_force_dev = FORCE_DEV_SCSI;
+ } else {
+ LOG(E) << "Argument " << (uint16_t) i << " (" << argv[i] << ") requires nvme|scsi";
+ return DTAERROR_INVALID_COMMAND;
+ }
+ i++;
+ baseOptions += 2;
+ }
else if (!(('-' == argv[i][0]) && ('-' == argv[i][1])) &&
(0 == opts->action))
{
diff --git a/Common/DtaOptions.h b/Common/DtaOptions.h
index c012af1d..aad1b324 100644
--- a/Common/DtaOptions.h
+++ b/Common/DtaOptions.h
@@ -28,6 +28,15 @@ typedef enum _sedutiloutput {
sedutilJSON
} sedutiloutput;
+/*
+ * Force disk type: '-d' flag
+ */
+#define FORCE_DEV_NONE 0
+#define FORCE_DEV_NVME 1
+#define FORCE_DEV_SCSI 2
+
+extern uint8_t g_force_dev; /** force device type */
+
/** Structure representing the command line issued to the program */
typedef struct _DTA_OPTIONS {
uint8_t password; /**< password supplied */
diff --git a/Common/DtaSession.cpp b/Common/DtaSession.cpp
index e7b51a14..e1d3a1ad 100644
--- a/Common/DtaSession.cpp
+++ b/Common/DtaSession.cpp
@@ -98,8 +98,10 @@ DtaSession::start(OPAL_UID SP, char * HostChallenge, vector SignAuthori
{
LOG(D1) << "Entering DtaSession::startSession ";
vector hash;
+ int settimeout = d->isEprise();
lastRC = 0;
+again:
DtaCommand *cmd = new DtaCommand();
if (NULL == cmd) {
LOG(E) << "Unable to create session object ";
@@ -131,7 +133,7 @@ DtaSession::start(OPAL_UID SP, char * HostChallenge, vector SignAuthori
// w/o the timeout the session may wedge and require a power-cycle,
// e.g., when interrupted by ^C. 60 seconds is inconveniently long,
// but revert may require that long to complete.
- if (d->isEprise()) {
+ if (settimeout) {
cmd->addToken(OPAL_TOKEN::STARTNAME);
cmd->addToken("SessionTimeout");
cmd->addToken(60000);
@@ -140,9 +142,14 @@ DtaSession::start(OPAL_UID SP, char * HostChallenge, vector SignAuthori
cmd->addToken(OPAL_TOKEN::ENDLIST); // ] (Close Bracket)
cmd->complete();
- if ((lastRC = sendCommand(cmd, response)) != 0) {
- LOG(E) << "Session start failed rc = " << (int)lastRC;
+ if ((lastRC = sendCommand(cmd, response, FALSE)) != 0) {
delete cmd;
+ if (settimeout) {
+ LOG(D2) << "Session start with timeout failed rc = " << (int)lastRC;
+ settimeout = 0;
+ goto again;
+ }
+ LOG(E) << "Session start failed rc = " << (int)lastRC;
return lastRC;
}
// call user method SL HSN TSN EL EOD SL 00 00 00 EL
@@ -203,8 +210,10 @@ DtaSession::authenticate(vector Authority, char * Challenge)
return 0;
}
uint8_t
-DtaSession::sendCommand(DtaCommand * cmd, DtaResponse & response)
+DtaSession::sendCommand(DtaCommand * cmd, DtaResponse & response, bool logerr)
{
+ enum TLogLevel l = logerr ? E : D1;
+
LOG(D1) << "Entering DtaSession::sendCommand()";
cmd->setHSN(HSN);
cmd->setTSN(TSN);
@@ -213,7 +222,7 @@ DtaSession::sendCommand(DtaCommand * cmd, DtaResponse & response)
uint8_t exec_rc = d->exec(cmd, response, SecurityProtocol);
if (0 != exec_rc)
{
- LOG(E) << "Command failed on exec " << (uint16_t) exec_rc;
+ LOG(l) << "Command failed on exec " << (uint16_t) exec_rc;
return exec_rc;
}
/*
@@ -221,10 +230,16 @@ DtaSession::sendCommand(DtaCommand * cmd, DtaResponse & response)
* have a sane reply to work with
*/
// zero lengths -- these are big endian but it doesn't matter for uint = 0
+ if ((0 == response.h.cp.outstandingData) &&
+ (0 == response.h.cp.minTransfer) &&
+ (0 == response.h.cp.length)) {
+ LOG(D1) << "All Response(s) returned – no further data, request parsing error";
+ return DTAERROR_COMMAND_ERROR;
+ }
if ((0 == response.h.cp.length) ||
(0 == response.h.pkt.length) ||
(0 == response.h.subpkt.length)) {
- LOG(E) << "One or more header fields have 0 length";
+ LOG(l) << "One or more header fields have 0 length";
return DTAERROR_COMMAND_ERROR;
}
// if we get an endsession response return 0
@@ -235,11 +250,11 @@ DtaSession::sendCommand(DtaCommand * cmd, DtaResponse & response)
if (!((OPAL_TOKEN::ENDLIST == response.tokenIs(response.getTokenCount() - 1)) &&
(OPAL_TOKEN::STARTLIST == response.tokenIs(response.getTokenCount() - 5)))) {
// no method status so we hope we reported the error someplace else
- LOG(E) << "Method Status missing";
+ LOG(l) << "Method Status missing";
return DTAERROR_NO_METHOD_STATUS;
}
if (OPALSTATUSCODE::SUCCESS != response.getUint8(response.getTokenCount() - 4)) {
- LOG(E) << "method status code " <<
+ LOG(l) << "method status code " <<
methodStatus(response.getUint8(response.getTokenCount() - 4));
}
return response.getUint8(response.getTokenCount() - 4);
@@ -255,14 +270,14 @@ DtaSession::setProtocol(uint8_t value)
void
DtaSession::dontHashPwd()
{
- LOG(D1) << "Entering DtaSession::setProtocol";
+ LOG(D1) << "Entering DtaSession::dontHashPwd";
hashPwd = 0;
}
void
DtaSession::expectAbort()
{
- LOG(D1) << "Entering DtaSession::methodStatus()";
+ LOG(D1) << "Entering DtaSession::expectAbort()";
willAbort = 1;
}
diff --git a/Common/DtaSession.h b/Common/DtaSession.h
index bd8953b6..b280720b 100644
--- a/Common/DtaSession.h
+++ b/Common/DtaSession.h
@@ -84,8 +84,9 @@ class DtaSession {
/** send a command to the device in this session
* @param cmd The DtaCommand object
* @param response The MesdResponse object
+ * @param logerr Log errors or leave them to caller
*/
- uint8_t sendCommand(DtaCommand * cmd, DtaResponse & response);
+ uint8_t sendCommand(DtaCommand * cmd, DtaResponse & response, bool logerr = TRUE);
private:
/** Default constructor, private should never be called */
DtaSession();
diff --git a/Common/DtaStructures.h b/Common/DtaStructures.h
index f6a61bc3..6559a01b 100644
--- a/Common/DtaStructures.h
+++ b/Common/DtaStructures.h
@@ -21,14 +21,24 @@ along with sedutil. If not, see .
#pragma pack(push)
#pragma pack(1)
-#define FC_TPER 0x0001
-#define FC_LOCKING 0x0002
-#define FC_GEOMETRY 0x0003
-#define FC_ENTERPRISE 0x0100
-#define FC_DATASTORE 0x0202
-#define FC_SINGLEUSER 0x0201
-#define FC_OPALV100 0x0200
-#define FC_OPALV200 0x0203
+#define FC_TPER 0x0001 /* TPer */
+#define FC_LOCKING 0x0002 /* Locking */
+#define FC_GEOMETRY 0x0003 /* Geometry Reporting */
+#define FC_SECUREMSG 0x0004 /* Secure Messaging */
+#define FC_ENTERPRISE 0x0100 /* Enterprise SSC */
+#define FC_OPALV100 0x0200 /* Opal SSC V1.00 */
+#define FC_SINGLEUSER 0x0201 /* Single User Mode */
+#define FC_DATASTORE 0x0202 /* DataStore Table */
+#define FC_OPALV200 0x0203 /* Opal SSC V2.00 */
+#define FC_OPALITE 0x0301 /* Opalite SSC */
+#define FC_PYRITEV100 0x0302 /* Pyrite SSC V1.00 */
+#define FC_PYRITEV200 0x0303 /* Pyrite SSC V2.00 */
+#define FC_RUBYV100 0x0304 /* Ruby SSC V1.00 */
+#define FC_LOCKINGLBA 0x0401 /* Locking LBA Ranges Control */
+#define FC_BLOCKSID 0x0402 /* Block SID Authentication */
+#define FC_NAMESPACE 0x0403 /* Configurable Namespace Locking*/
+#define FC_DATAREM 0x0404 /* Supported Data Removal Mechanism */
+#define FC_NSGEOMETRY 0x0405 /* Namespace Geometry Reporting */
/** The Discovery 0 Header. As defined in
* Opal SSC Documentation
*/
@@ -83,8 +93,8 @@ typedef struct _Discovery0LockingFeatures {
uint8_t version : 4;
uint8_t length;
/* Big endian
- uint8_t reserved01 : 1;
uint8_t reserved02 : 1;
+ uint8_t MBRAbsent : 1;
uint8_t MBRDone : 1;
uint8_t MBREnabled : 1;
uint8_t mediaEncryption : 1;
@@ -98,7 +108,7 @@ typedef struct _Discovery0LockingFeatures {
uint8_t mediaEncryption : 1;
uint8_t MBREnabled : 1;
uint8_t MBRDone : 1;
- uint8_t reserved01 : 1;
+ uint8_t MBRAbsent : 1;
uint8_t reserved02 : 1;
uint32_t reserved03;
@@ -127,6 +137,23 @@ typedef struct _Discovery0GeometryFeatures {
uint64_t lowestAlighedLBA;
} Discovery0GeometryFeatures;
+/** Secure Messaging Feature Descriptor
+ */
+typedef struct _Discovery0SecureMsgFeatures {
+ uint16_t featureCode; /* 0x0004 */
+ uint8_t reserved_v : 4;
+ uint8_t version : 4;
+ uint8_t length;
+ /* big Endian
+ uint8_t activated : 1;
+ uint8_t reserved01 : 7;
+ */
+ uint8_t reserved01 : 7;
+ uint8_t activated : 1;
+ uint8_t reserved02[3];
+ uint16_t numberOfSPs;
+} Discovery0SecureMsgFeatures;
+
/** Enterprise SSC Feature
*/
typedef struct _Discovery0EnterpriseSSC {
@@ -158,6 +185,12 @@ typedef struct _Discovery0OpalV100 {
uint8_t length;
uint16_t baseComID;
uint16_t numberComIDs;
+ /* big endian
+ uint8_t reserved01 : 7;
+ uint8_t rangeCrossing : 1;
+ */
+ uint8_t rangeCrossing : 1;
+ uint8_t reserved01 : 7;
} Discovery0OpalV100;
/** Single User Mode feature
*/
@@ -219,16 +252,159 @@ typedef struct _Discovery0OPALV200 {
uint8_t reserved02;
uint32_t reserved03;
} Discovery0OPALV200;
+
+/** Block SID Authentication feature
+ */
+typedef struct _Discovery0BlockSID {
+ uint16_t featureCode; /* 0x0402 */
+ uint8_t reserved_v : 4;
+ uint8_t version : 4;
+ uint8_t length;
+ /* big endian
+ uint8_t reserved01 : 6;
+ uint8_t SIDBlockedState : 1;
+ uint8_t SIDValueState : 1;
+ */
+ uint8_t SIDValueState : 1;
+ uint8_t SIDBlockedState : 1;
+ uint8_t reserved01 : 6;
+
+ /* big endian
+ uint8_t reserved01 : 7;
+ uint8_t HardwareReset : 1;
+ */
+ uint8_t HardwareReset : 1;
+ uint8_t reserved02 : 7;
+} Discovery0BlockSID;
+
+/** Namespace feature
+ */
+typedef struct _Discovery0Namespace {
+ uint16_t featureCode; /* 0x0403 */
+ uint8_t reserved_v : 4;
+ uint8_t version : 4;
+ uint8_t length;
+ /* big endian
+ uint8_t rangeCapable : 1;
+ uint8_t rangePresent : 1;
+ uint8_t reserved01 : 6;
+ */
+ uint8_t reserved01 : 6;
+ uint8_t rangePresent : 1;
+ uint8_t rangeCapable : 1;
+
+ uint8_t reserved02[3];
+ uint32_t MaximumKeyCount;
+ uint32_t UnusedKeyCount;
+ uint32_t MaximumRangesPerNamespace;
+} Discovery0Namespace;
+
+/** Opalite feature
+ */
+typedef struct _Discovery0Opalite {
+ uint16_t featureCode; /* 0x0301 */
+ uint8_t reserved_v : 4;
+ uint8_t version : 4;
+ uint8_t length;
+ uint16_t baseCommID;
+ uint16_t numCommIDs;
+ uint8_t reserved01[5];
+ uint8_t initialPIN;
+ uint8_t revertedPIN;
+ uint8_t reserved02;
+ uint32_t reserved03;
+} Discovery0Opalite;
+
+/** Pyrite 1.0 feature
+ */
+typedef struct _Discovery0Pyrite10 {
+ uint16_t featureCode; /* 0x0302 */
+ uint8_t reserved_v : 4;
+ uint8_t version : 4;
+ uint8_t length;
+ uint16_t baseCommID;
+ uint16_t numCommIDs;
+ uint8_t reserved01[5];
+ uint8_t initialPIN;
+ uint8_t revertedPIN;
+ uint8_t reserved02;
+ uint32_t reserved03;
+} Discovery0Pyrite10;
+
+/** Pyrite 2.0 feature
+ */
+typedef struct _Discovery0Pyrite20 {
+ uint16_t featureCode; /* 0x0303 */
+ uint8_t reserved_v : 4;
+ uint8_t version : 4;
+ uint8_t length;
+ uint16_t baseCommID;
+ uint16_t numCommIDs;
+ uint8_t reserved01[5];
+ uint8_t initialPIN;
+ uint8_t revertedPIN;
+ uint8_t reserved02;
+ uint32_t reserved03;
+} Discovery0Pyrite20;
+
+/** Ruby 1.0 feature
+ */
+typedef struct _Discovery0Ruby10 {
+ uint16_t featureCode; /* 0x0304 */
+ uint8_t reserved_v : 4;
+ uint8_t version : 4;
+ uint8_t length;
+ uint16_t baseCommID;
+ uint16_t numCommIDs;
+ /* big endian
+ uint8_t reserved01 : 7;
+ uint8_t rangeCrossing : 1;
+ */
+ uint8_t rangeCrossing : 1;
+ uint8_t reserved01 : 7;
+
+ uint16_t numlockingAdminAuth;
+ uint16_t numlockingUserAuth;
+ uint8_t initialPIN;
+ uint8_t revertedPIN;
+ uint8_t PINonTPerRevert;
+ uint8_t reserved02[5];
+} Discovery0Ruby10;
+
+/** Supported Data Removal Mechanism feature
+ */
+typedef struct _Discovery0DataRem {
+ uint16_t featureCode; /* 0x0404 */
+ uint8_t reserved_v : 4;
+ uint8_t version : 4;
+ uint8_t length;
+ uint8_t reserved01;
+ uint8_t processing;
+ uint8_t supported;
+ uint8_t format;
+ uint16_t time[6];
+ uint8_t reserved02[16];
+} Discovery0DataRem;
+
/** Union of features used to parse the discovery 0 response */
union Discovery0Features {
Discovery0TPerFeatures TPer;
Discovery0LockingFeatures locking;
Discovery0GeometryFeatures geometry;
+ Discovery0SecureMsgFeatures secureMsg;
Discovery0EnterpriseSSC enterpriseSSC;
Discovery0SingleUserMode singleUserMode;
Discovery0OPALV200 opalv200;
Discovery0OpalV100 opalv100;
Discovery0DatastoreTable datastore;
+ Discovery0BlockSID blockSID;
+ Discovery0Namespace ns;
+ Discovery0Opalite opalite;
+ Discovery0Pyrite10 pyrite10;
+ Discovery0Pyrite20 pyrite20;
+ Discovery0Ruby10 ruby10;
+ Discovery0DataRem dataRem;
+ Discovery0GeometryFeatures nsgeometry;
};
/** ComPacket (header) for transmissions. */
@@ -287,6 +463,7 @@ typedef struct _OPAL_DiskInfo {
uint8_t TPer : 1;
uint8_t Locking : 1;
uint8_t Geometry : 1;
+ uint8_t SecureMsg : 1;
uint8_t Enterprise : 1;
uint8_t SingleUser : 1;
uint8_t DataStore : 1;
@@ -294,6 +471,14 @@ typedef struct _OPAL_DiskInfo {
uint8_t OPAL10 : 1;
uint8_t Properties : 1;
uint8_t ANY_OPAL_SSC : 1;
+ uint8_t BlockSID : 1;
+ uint8_t Namespace : 1;
+ uint8_t Opalite : 1;
+ uint8_t Pyrite10 : 1;
+ uint8_t Pyrite20 : 1;
+ uint8_t Ruby10 : 1;
+ uint8_t DataRem : 1;
+ uint8_t NSGeometry : 1;
// values ONLY VALID IF FUNCTION ABOVE IS TRUE!!!!!
uint8_t TPer_ACKNACK : 1;
uint8_t TPer_async : 1;
@@ -306,11 +491,14 @@ typedef struct _OPAL_DiskInfo {
uint8_t Locking_lockingSupported : 1;
uint8_t Locking_MBRDone : 1;
uint8_t Locking_MBREnabled : 1;
+ uint8_t Locking_MBRAbsent : 1;
uint8_t Locking_mediaEncrypt : 1;
uint8_t Geometry_align : 1;
uint64_t Geometry_alignmentGranularity;
uint32_t Geometry_logicalBlockSize;
uint64_t Geometry_lowestAlignedLBA;
+ uint8_t SecureMsg_activated : 1;
+ uint16_t SecureMsg_numberOfSPs;
uint8_t Enterprise_rangeCrossing : 1;
uint16_t Enterprise_basecomID;
uint16_t Enterprise_numcomID;
@@ -323,6 +511,7 @@ typedef struct _OPAL_DiskInfo {
uint32_t DataStore_alignment;
uint16_t OPAL10_basecomID;
uint16_t OPAL10_numcomIDs;
+ uint8_t OPAL10_rangeCrossing;
uint16_t OPAL20_basecomID;
uint16_t OPAL20_numcomIDs;
uint8_t OPAL20_initialPIN;
@@ -330,6 +519,40 @@ typedef struct _OPAL_DiskInfo {
uint16_t OPAL20_numAdmins;
uint16_t OPAL20_numUsers;
uint8_t OPAL20_rangeCrossing;
+ uint8_t BlockSID_SIDBlockedState;
+ uint8_t BlockSID_SIDValueState;
+ uint8_t BlockSID_HardwareReset;
+ uint32_t Namespace_MaximumKeyCount;
+ uint32_t Namespace_UnusedKeyCount;
+ uint32_t Namespace_MaximumRangesPerNamespace;
+ uint16_t Opalite_basecomID;
+ uint16_t Opalite_numcomIDs;
+ uint8_t Opalite_initialPIN;
+ uint8_t Opalite_revertedPIN;
+ uint16_t Pyrite10_basecomID;
+ uint16_t Pyrite10_numcomIDs;
+ uint8_t Pyrite10_initialPIN;
+ uint8_t Pyrite10_revertedPIN;
+ uint16_t Pyrite20_basecomID;
+ uint16_t Pyrite20_numcomIDs;
+ uint8_t Pyrite20_initialPIN;
+ uint8_t Pyrite20_revertedPIN;
+ uint16_t Ruby10_basecomID;
+ uint16_t Ruby10_numcomIDs;
+ uint16_t Ruby10_numAdmins;
+ uint16_t Ruby10_numUsers;
+ uint8_t Ruby10_initialPIN;
+ uint8_t Ruby10_revertedPIN;
+ uint8_t Ruby10_PINonTPerRevert;
+ uint8_t Ruby10_rangeCrossing;
+ uint8_t DataRem_processing;
+ uint8_t DataRem_supported;
+ uint8_t DataRem_format;
+ uint16_t DataRem_time[6];
+ uint8_t NSGeometry_align : 1;
+ uint64_t NSGeometry_alignmentGranularity;
+ uint32_t NSGeometry_logicalBlockSize;
+ uint64_t NSGeometry_lowestAlignedLBA;
// IDENTIFY information
DTA_DEVICE_TYPE devType;
uint8_t serialNum[20];
@@ -349,6 +572,8 @@ typedef struct _IDENTIFY_RESPONSE {
uint8_t reserved3[6];
uint8_t firmwareRev[8];
uint8_t modelNum[40];
+ uint16_t sectors_intr;
+ uint16_t tcg;
} IDENTIFY_RESPONSE;
@@ -453,4 +678,4 @@ class CScsiCmdSecurityProtocolOut
uint8_t m_Control; // 11
}; // 12
-#pragma pack(pop)
\ No newline at end of file
+#pragma pack(pop)
diff --git a/Common/sedutil.cpp b/Common/sedutil.cpp
index fe6df19a..270709e9 100644
--- a/Common/sedutil.cpp
+++ b/Common/sedutil.cpp
@@ -25,6 +25,10 @@ along with sedutil. If not, see .
#include "DtaDevGeneric.h"
#include "DtaDevOpal1.h"
#include "DtaDevOpal2.h"
+#include "DtaDevOpalite.h"
+#include "DtaDevPyrite1.h"
+#include "DtaDevPyrite2.h"
+#include "DtaDevRuby1.h"
#include "DtaDevEnterprise.h"
using namespace std;
@@ -39,10 +43,12 @@ int isValidSEDDisk(char *devname)
if (d->isPresent()) {
printf("%s", devname);
if (d->isAnySSC())
- printf(" SED %s%s%s ", (d->isOpal1() ? "1" : "-"),
- (d->isOpal2() ? "2" : "-"), (d->isEprise() ? "E" : "-"));
+ printf(" SED %s%s%s%s%s%s%s ", (d->isOpal1() ? "1" : "-"),
+ (d->isOpal2() ? "2" : "-"), (d->isEprise() ? "E" : "-"),
+ (d->isOpalite() ? "L" : "-"), (d->isPyrite1() ? "p" : "-"),
+ (d->isPyrite2() ? "P" : "-"), (d->isRuby1() ? "r" : "-"));
else
- printf("%s", " NO --- ");
+ printf("%s", " NO ------- ");
cout << d->getModelNum() << " " << d->getFirmwareRev();
cout << std::endl;
}
@@ -72,8 +78,16 @@ int main(int argc, char * argv[])
delete tempDev;
return DTAERROR_COMMAND_ERROR;
}
- if (tempDev->isOpal2())
+ if (tempDev->isRuby1())
+ d = new DtaDevRuby1(argv[opts.device]);
+ else if (tempDev->isOpal2())
d = new DtaDevOpal2(argv[opts.device]);
+ else if (tempDev->isOpalite())
+ d = new DtaDevOpalite(argv[opts.device]);
+ else if (tempDev->isPyrite1())
+ d = new DtaDevPyrite1(argv[opts.device]);
+ else if (tempDev->isPyrite2())
+ d = new DtaDevPyrite2(argv[opts.device]);
else
if (tempDev->isOpal1())
d = new DtaDevOpal1(argv[opts.device]);
@@ -110,7 +124,7 @@ int main(int argc, char * argv[])
return d->setSIDPassword(argv[opts.password], argv[opts.newpassword]);
break;
case sedutiloption::setAdmin1Pwd:
- LOG(D) << "Performing setPAdmin1Pwd ";
+ LOG(D) << "Performing setAdmin1Pwd ";
return d->setPassword(argv[opts.password], (char *) "Admin1",
argv[opts.newpassword]);
break;
@@ -137,7 +151,7 @@ int main(int argc, char * argv[])
argv[opts.password]));
break;
case sedutiloption::readonlyLockingRange:
- LOG(D) << "Enabling Locking Range " << (uint16_t)opts.lockingrange;
+ LOG(D) << "Enabling Locking Range " << (uint16_t)opts.lockingrange << " read-only";
return (d->configureLockingRange(opts.lockingrange,
DTA_WRITELOCKINGENABLED, argv[opts.password]));
break;
diff --git a/LinuxPBA/UnlockSEDs.cpp b/LinuxPBA/UnlockSEDs.cpp
index 5daa2b9e..4f42e577 100644
--- a/LinuxPBA/UnlockSEDs.cpp
+++ b/LinuxPBA/UnlockSEDs.cpp
@@ -22,6 +22,10 @@ along with sedutil. If not, see .
#include "DtaDevGeneric.h"
#include "DtaDevOpal1.h"
#include "DtaDevOpal2.h"
+#include "DtaDevOpalite.h"
+#include "DtaDevPyrite1.h"
+#include "DtaDevPyrite2.h"
+#include "DtaDevRuby1.h"
#include
#include
@@ -62,14 +66,24 @@ uint8_t UnlockSEDs(char * password) {
if (!tempDev->isPresent()) {
break;
}
- if ((!tempDev->isOpal1()) && (!tempDev->isOpal2())) {
+ if ((!tempDev->isOpal1()) && (!tempDev->isOpal2()) &&
+ (!tempDev->isOpalite()) && (!tempDev->isPyrite1()) &&
+ (!tempDev->isPyrite2()) && (!tempDev->isRuby1())) {
printf("Drive %-10s %-40s not OPAL \n", devref, tempDev->getModelNum());
delete tempDev;
continue;
}
- if (tempDev->isOpal2())
+ if (tempDev->isRuby1())
+ d = new DtaDevRuby1(devref);
+ else if (tempDev->isOpal2())
d = new DtaDevOpal2(devref);
+ else if (tempDev->isOpalite())
+ d = new DtaDevOpalite(devref);
+ else if (tempDev->isPyrite2())
+ d = new DtaDevPyrite2(devref);
+ else if (tempDev->isPyrite1())
+ d = new DtaDevPyrite1(devref);
else
d = new DtaDevOpal1(devref);
delete tempDev;
diff --git a/LinuxPBA/nbproject/Makefile-Debug.mk b/LinuxPBA/nbproject/Makefile-Debug.mk
index 1f037414..cbb48ab5 100644
--- a/LinuxPBA/nbproject/Makefile-Debug.mk
+++ b/LinuxPBA/nbproject/Makefile-Debug.mk
@@ -41,6 +41,10 @@ OBJECTFILES= \
${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal.o \
${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal1.o \
${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal2.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpalite.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite1.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite2.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevRuby1.o \
${OBJECTDIR}/_ext/7daaf93a/DtaHashPwd.o \
${OBJECTDIR}/_ext/7daaf93a/DtaHexDump.o \
${OBJECTDIR}/_ext/7daaf93a/DtaResponse.o \
@@ -112,6 +116,26 @@ ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal2.o: ../Common/DtaDevOpal2.cpp
${RM} "$@.d"
$(COMPILE.cc) -g -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal2.o ../Common/DtaDevOpal2.cpp
+${OBJECTDIR}/_ext/7daaf93a/DtaDevOpalite.o: ../Common/DtaDevOpalite.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -g -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpalite.o ../Common/DtaDevOpalite.cpp
+
+${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite1.o: ../Common/DtaDevPyrite1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -g -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite1.o ../Common/DtaDevPyrite1.cpp
+
+${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite2.o: ../Common/DtaDevPyrite2.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -g -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite2.o ../Common/DtaDevPyrite2.cpp
+
+${OBJECTDIR}/_ext/7daaf93a/DtaDevRuby1.o: ../Common/DtaDevRuby1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -g -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevRuby1.o ../Common/DtaDevRuby1.cpp
+
${OBJECTDIR}/_ext/7daaf93a/DtaHashPwd.o: ../Common/DtaHashPwd.cpp
${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
${RM} "$@.d"
diff --git a/LinuxPBA/nbproject/Makefile-Debug_x86_64.mk b/LinuxPBA/nbproject/Makefile-Debug_x86_64.mk
index e03f2708..f17c77e4 100644
--- a/LinuxPBA/nbproject/Makefile-Debug_x86_64.mk
+++ b/LinuxPBA/nbproject/Makefile-Debug_x86_64.mk
@@ -41,6 +41,10 @@ OBJECTFILES= \
${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal.o \
${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal1.o \
${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal2.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpalite.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite1.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite2.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevRuby1.o \
${OBJECTDIR}/_ext/7daaf93a/DtaHashPwd.o \
${OBJECTDIR}/_ext/7daaf93a/DtaHexDump.o \
${OBJECTDIR}/_ext/7daaf93a/DtaResponse.o \
@@ -112,6 +116,26 @@ ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal2.o: ../Common/DtaDevOpal2.cpp
${RM} "$@.d"
$(COMPILE.cc) -g -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal2.o ../Common/DtaDevOpal2.cpp
+${OBJECTDIR}/_ext/7daaf93a/DtaDevOpalite.o: ../Common/DtaDevOpalite.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -g -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpalite.o ../Common/DtaDevOpalite.cpp
+
+${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite1.o: ../Common/DtaDevPyrite1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -g -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite1.o ../Common/DtaDevPyrite1.cpp
+
+${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite2.o: ../Common/DtaDevPyrite2.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -g -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite2.o ../Common/DtaDevPyrite2.cpp
+
+${OBJECTDIR}/_ext/7daaf93a/DtaDevRuby1.o: ../Common/DtaDevRuby1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -g -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevRuby1.o ../Common/DtaDevRuby1.cpp
+
${OBJECTDIR}/_ext/7daaf93a/DtaHashPwd.o: ../Common/DtaHashPwd.cpp
${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
${RM} "$@.d"
diff --git a/LinuxPBA/nbproject/Makefile-Release.mk b/LinuxPBA/nbproject/Makefile-Release.mk
index 0835c376..a8ffd152 100644
--- a/LinuxPBA/nbproject/Makefile-Release.mk
+++ b/LinuxPBA/nbproject/Makefile-Release.mk
@@ -41,6 +41,10 @@ OBJECTFILES= \
${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal.o \
${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal1.o \
${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal2.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpalite.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite1.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite2.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevRuby1.o \
${OBJECTDIR}/_ext/7daaf93a/DtaHashPwd.o \
${OBJECTDIR}/_ext/7daaf93a/DtaHexDump.o \
${OBJECTDIR}/_ext/7daaf93a/DtaResponse.o \
@@ -112,6 +116,26 @@ ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal2.o: ../Common/DtaDevOpal2.cpp
${RM} "$@.d"
$(COMPILE.cc) -O2 -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal2.o ../Common/DtaDevOpal2.cpp
+${OBJECTDIR}/_ext/7daaf93a/DtaDevOpalite.o: ../Common/DtaDevOpalite.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -O2 -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpalite.o ../Common/DtaDevOpalite.cpp
+
+${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite1.o: ../Common/DtaDevPyrite1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -O2 -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite1.o ../Common/DtaDevPyrite1.cpp
+
+${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite2.o: ../Common/DtaDevPyrite2.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -O2 -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite2.o ../Common/DtaDevPyrite2.cpp
+
+${OBJECTDIR}/_ext/7daaf93a/DtaDevRuby1.o: ../Common/DtaDevRuby1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -O2 -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevRuby1.o ../Common/DtaDevRuby1.cpp
+
${OBJECTDIR}/_ext/7daaf93a/DtaHashPwd.o: ../Common/DtaHashPwd.cpp
${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
${RM} "$@.d"
diff --git a/LinuxPBA/nbproject/Makefile-Release_x86_64.mk b/LinuxPBA/nbproject/Makefile-Release_x86_64.mk
index 8f253de7..846ecbf8 100644
--- a/LinuxPBA/nbproject/Makefile-Release_x86_64.mk
+++ b/LinuxPBA/nbproject/Makefile-Release_x86_64.mk
@@ -41,6 +41,10 @@ OBJECTFILES= \
${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal.o \
${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal1.o \
${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal2.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpalite.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite1.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite2.o \
+ ${OBJECTDIR}/_ext/7daaf93a/DtaDevRuby1.o \
${OBJECTDIR}/_ext/7daaf93a/DtaHashPwd.o \
${OBJECTDIR}/_ext/7daaf93a/DtaHexDump.o \
${OBJECTDIR}/_ext/7daaf93a/DtaResponse.o \
@@ -112,6 +116,26 @@ ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal2.o: ../Common/DtaDevOpal2.cpp
${RM} "$@.d"
$(COMPILE.cc) -O2 -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpal2.o ../Common/DtaDevOpal2.cpp
+${OBJECTDIR}/_ext/7daaf93a/DtaDevOpalite.o: ../Common/DtaDevOpalite.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -O2 -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevOpalite.o ../Common/DtaDevOpalite.cpp
+
+${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite1.o: ../Common/DtaDevPyrite1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -O2 -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite1.o ../Common/DtaDevPyrite1.cpp
+
+${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite2.o: ../Common/DtaDevPyrite2.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -O2 -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevPyrite2.o ../Common/DtaDevPyrite2.cpp
+
+${OBJECTDIR}/_ext/7daaf93a/DtaDevRuby1.o: ../Common/DtaDevRuby1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
+ ${RM} "$@.d"
+ $(COMPILE.cc) -O2 -Werror -I../linux -I../Common -I../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7daaf93a/DtaDevRuby1.o ../Common/DtaDevRuby1.cpp
+
${OBJECTDIR}/_ext/7daaf93a/DtaHashPwd.o: ../Common/DtaHashPwd.cpp
${MKDIR} -p ${OBJECTDIR}/_ext/7daaf93a
${RM} "$@.d"
diff --git a/LinuxPBA/nbproject/configurations.xml b/LinuxPBA/nbproject/configurations.xml
index 3bd6e58d..4f6ac5b8 100644
--- a/LinuxPBA/nbproject/configurations.xml
+++ b/LinuxPBA/nbproject/configurations.xml
@@ -30,6 +30,10 @@
../Common/DtaDevOpal.cpp
../Common/DtaDevOpal1.cpp
../Common/DtaDevOpal2.cpp
+ ../Common/DtaDevOpalite.cpp
+ ../Common/DtaDevPyrite1.cpp
+ ../Common/DtaDevPyrite2.cpp
+ ../Common/DtaDevRuby1.cpp
../Common/DtaHashPwd.cpp
../Common/DtaHexDump.cpp
../Common/DtaResponse.cpp
@@ -97,6 +101,14 @@
-
+ -
+
+ -
+
+ -
+
+ -
+
-
-
@@ -182,6 +194,14 @@
-
+ -
+
+ -
+
+ -
+
+ -
+
-
-
@@ -270,6 +290,14 @@
-
+ -
+
+ -
+
+ -
+
+ -
+
-
-
@@ -347,6 +375,14 @@
-
+ -
+
+ -
+
+ -
+
+ -
+
-
-
diff --git a/Makefile.am b/Makefile.am
index f32e4f1d..bd08c382 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -9,6 +9,10 @@ SEDUTIL_COMMON_CODE = \
Common/DtaDevGeneric.cpp Common/DtaDevGeneric.h \
Common/DtaDevOpal1.cpp Common/DtaDevOpal1.h \
Common/DtaDevOpal2.cpp Common/DtaDevOpal2.h \
+ Common/DtaDevOpalite.cpp Common/DtaDevOpalite.h \
+ Common/DtaDevPyrite1.cpp Common/DtaDevPyrite1.h \
+ Common/DtaDevPyrite2.cpp Common/DtaDevPyrite2.h \
+ Common/DtaDevRuby1.cpp Common/DtaDevRuby1.h \
Common/DtaDevOpal.cpp Common/DtaDevOpal.h \
Common/DtaDiskType.cpp Common/DtaDiskType.h \
Common/DtaHashPwd.cpp Common/DtaHashPwd.h \
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 00000000..56097bfa
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,5 @@
+sedutil (1.12-0) unstable; urgency=medium
+
+ * Initial release
+
+ -- Waqar Ahmed Tue, 19 Nov 2020 16:16:44 +0500
diff --git a/debian/control b/debian/control
new file mode 100644
index 00000000..72b91f53
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,18 @@
+Source: sedutil
+Section: admin
+Priority: optional
+Maintainer: Waqar Ahmed
+Build-Depends: build-essential,
+ make,
+ debhelper-compat (= 12),
+ gcc-multilib,
+ g++-multilib
+Standards-Version: 4.4.0
+Homepage: https://github.com/Drive-Trust-Alliance/sedutil
+
+Package: sedutil
+Architecture: any
+Depends: ${misc:Depends}, ${shlibs:Depends}
+Description: The Drive Trust Alliance Self Encrypting Drive Utility
+ This program allows you to enable the locking in SED's that comply
+ with the TCG OPAL 2.00 standard on bios machines.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 00000000..20cf9344
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,69 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+
+Files: *
+Copyright: 2014-2017, Bright Plaza Inc
+License: UnknownCopyrighted
+
+Files: Common/*
+Copyright: 2014-2017, Bright Plaza Inc
+ 2007, Free Software Foundation, Inc.
+ 2017, Spectra Logic Corporation
+License: GPL-3+
+
+Files: LinuxPBA/GetPassPhrase.cpp
+ LinuxPBA/GetPassPhrase.h
+ LinuxPBA/LinuxPBA.cpp
+ LinuxPBA/UnlockSEDs.cpp
+ LinuxPBA/UnlockSEDs.h
+ README.md
+ freebsd/DtaDevFreeBSDCAM.cpp
+ freebsd/DtaDevFreeBSDCAM.h
+ freebsd/DtaDevFreeBSDDrive.h
+ freebsd/DtaDevFreeBSDNvme.cpp
+ freebsd/DtaDevFreeBSDNvme.h
+ freebsd/DtaDevOS.cpp
+ freebsd/DtaDevOS.h
+ freebsd/os.h
+ linux/DtaDevLinuxDrive.h
+ linux/DtaDevLinuxNvme.cpp
+ linux/DtaDevLinuxNvme.h
+ linux/DtaDevLinuxSata.cpp
+ linux/DtaDevLinuxSata.h
+ linux/DtaDevOS.cpp
+ linux/DtaDevOS.h
+ linux/os.h
+ windows/DtaDevOS.cpp
+ windows/DtaDevOS.h
+ windows/DtaDiskATA.cpp
+ windows/DtaDiskATA.h
+ windows/DtaDiskNVMe.cpp
+ windows/DtaDiskNVMe.h
+ windows/DtaDiskUSB.cpp
+ windows/DtaDiskUSB.h
+ windows/ReadMe_Windows.txt
+Copyright: 2016-2018, Alexander Motin
+ 2014-2017, Bright Plaza Inc
+License: GPL-3+
+
+Files: Common/pbkdf2/*
+License: CC0
+
+Files: Common/pbkdf2/COPYING
+ Common/pbkdf2/handy.h
+License: GPL-3+
+Comment: No explicit license found, using license(s) from:
+ Common/LICENSE.txt
+
+Files: Common/log.h
+Copyright: 2007, Petru Marginean
+ laws, the author or authors
+License: Unlicense
+
+Files: debian/*
+License: GPL-3+
+
+License: CC0
+
+License: GPL-3+
+
+License: Unlicense
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 00000000..ce1f60df
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,25 @@
+#!/usr/bin/make -f
+export DH_VERBOSE = 1
+
+%:
+ dh $@
+
+override_dh_auto_build:
+ sh -c "\
+ cd linux/CLI || exit 1; \
+ gmake || exit 1; \
+ "
+
+override_dh_auto_install:
+ sh -c "\
+ mkdir -p debian/sedutil/usr/local/bin; \
+ cp -a linux/CLI/dist/Debug_i686/GNU-Linux/sedutil-cli debian/sedutil/usr/local/bin/; \
+ "
+
+override_dh_shlibdeps:
+
+override_dh_usrlocal:
+
+override_dh_auto_clean:
+
+override_dh_auto_test:
diff --git a/debian/sedutil.manpages b/debian/sedutil.manpages
new file mode 100644
index 00000000..f3be157d
--- /dev/null
+++ b/debian/sedutil.manpages
@@ -0,0 +1 @@
+docs/sedutil-cli.8
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 00000000..163aaf8d
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/debian/source/lintian-overrides b/debian/source/lintian-overrides
new file mode 100644
index 00000000..463abe97
--- /dev/null
+++ b/debian/source/lintian-overrides
@@ -0,0 +1 @@
+source-is-missing
diff --git a/docs/sedutil-cli.8 b/docs/sedutil-cli.8
index 06554b38..f977abea 100644
--- a/docs/sedutil-cli.8
+++ b/docs/sedutil-cli.8
@@ -1,14 +1,15 @@
.\" Manpage for sedutil-cli.
.TH SEDUTIL\-CLI 8 "18 Feb 2016" "0.12" "sedutil-cli man page"
.SH NAME
-sedutil-cli \- util to manage TCG Opal 2.0 self encrypting drives
+sedutil-cli \- util to manage TCG Storage self encrypting drives
.SH SYNOPSIS
sedutil\-cli <\-v> <\-n>
.SH DESCRIPTION
sedutil-cli is a utility to manage self encrypting drives that conform
-to the Trusted Computing Group (TCG) OPAL 2.0 SSC specification.
+to the Trusted Computing Group (TCG) Enterprise, Opal, Opalite and
+Pyrite SSC specifications.
In Linux libata.allow_tpm must be set to 1. Either via adding
libata.allow_tpm=1 to the kernel flags at boot time or changing the
@@ -63,9 +64,14 @@ set the device back to factory defaults.
.B This **ERASES ALL DATA**
.IP "\-\-revertNoErase "
deactivate the Locking SP without erasing the data on GLOBAL RANGE *ONLY*
-.IP "\-\---yesIreallywanttoERASEALLmydatausingthePSID "
+.IP "\-\-PSIDrevert "
+.IP "\-\-yesIreallywanttoERASEALLmydatausingthePSID "
revert the device using the PSID.
.B *ERASING* *ALL* the data
+.IP "\-\-PSIDrevertAdminSP "
+Alike to PSIDrevert, but on Enterprise calls AdminSP->Revert instead of
+ThisSP->RevertSP. There are no PSID or Revert standards for Enterprise
+and different devices support different methods.
.IP "\-\-printDefaultPassword "
print MSID
@@ -77,7 +83,7 @@ sedutil-cli --scan
sedutil-cli --query /dev/sdc
.EE
.EX
-sedutil-cli --yesIreallywanttoERASEALLmydatausingthePSID /dev/sdc
+sedutil-cli --yesIreallywanttoERASEALLmydatausingthePSID /dev/sdc
.EE
.EX
sedutil-cli --initialSetup /dev/sdc
diff --git a/freebsd/CLI/.dep.inc b/freebsd/CLI/.dep.inc
new file mode 100644
index 00000000..38ba445c
--- /dev/null
+++ b/freebsd/CLI/.dep.inc
@@ -0,0 +1,5 @@
+# This code depends on make tool being used
+DEPFILES=$(wildcard $(addsuffix .d, ${OBJECTFILES} ${TESTOBJECTFILES}))
+ifneq (${DEPFILES},)
+include ${DEPFILES}
+endif
diff --git a/freebsd/CLI/Makefile b/freebsd/CLI/Makefile
new file mode 100644
index 00000000..8008a2a8
--- /dev/null
+++ b/freebsd/CLI/Makefile
@@ -0,0 +1,128 @@
+#
+# There exist several targets which are by default empty and which can be
+# used for execution of your targets. These targets are usually executed
+# before and after some main targets. They are:
+#
+# .build-pre: called before 'build' target
+# .build-post: called after 'build' target
+# .clean-pre: called before 'clean' target
+# .clean-post: called after 'clean' target
+# .clobber-pre: called before 'clobber' target
+# .clobber-post: called after 'clobber' target
+# .all-pre: called before 'all' target
+# .all-post: called after 'all' target
+# .help-pre: called before 'help' target
+# .help-post: called after 'help' target
+#
+# Targets beginning with '.' are not intended to be called on their own.
+#
+# Main targets can be executed directly, and they are:
+#
+# build build a specific configuration
+# clean remove built files from a configuration
+# clobber remove all built files
+# all build all configurations
+# help print help mesage
+#
+# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and
+# .help-impl are implemented in nbproject/makefile-impl.mk.
+#
+# Available make variables:
+#
+# CND_BASEDIR base directory for relative paths
+# CND_DISTDIR default top distribution directory (build artifacts)
+# CND_BUILDDIR default top build directory (object files, ...)
+# CONF name of current configuration
+# CND_PLATFORM_${CONF} platform name (current configuration)
+# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration)
+# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration)
+# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration)
+# CND_PACKAGE_DIR_${CONF} directory of package (current configuration)
+# CND_PACKAGE_NAME_${CONF} name of package (current configuration)
+# CND_PACKAGE_PATH_${CONF} path to package (current configuration)
+#
+# NOCDDL
+
+
+# Environment
+MKDIR=mkdir
+CP=cp
+CCADMIN=CCadmin
+
+
+# build
+build: .build-post
+
+.build-pre:
+# Add your pre 'build' code here...
+ ../GitVersion.sh > ../Version.h
+.build-post: .build-impl
+# Add your post 'build' code here...
+ ${RM} ../Version.h
+
+# clean
+clean: .clean-post
+
+.clean-pre:
+# Add your pre 'clean' code here...
+
+.clean-post: .clean-impl
+# Add your post 'clean' code here...
+
+
+# clobber
+clobber: .clobber-post
+
+.clobber-pre:
+# Add your pre 'clobber' code here...
+
+.clobber-post: .clobber-impl
+# Add your post 'clobber' code here...
+
+
+# all
+all: .all-post
+
+.all-pre:
+# Add your pre 'all' code here...
+
+.all-post: .all-impl
+# Add your post 'all' code here...
+
+
+# build tests
+build-tests: .build-tests-post
+
+.build-tests-pre:
+# Add your pre 'build-tests' code here...
+
+.build-tests-post: .build-tests-impl
+# Add your post 'build-tests' code here...
+
+
+# run tests
+test: .test-post
+
+.test-pre: build-tests
+# Add your pre 'test' code here...
+
+.test-post: .test-impl
+# Add your post 'test' code here...
+
+
+# help
+help: .help-post
+
+.help-pre:
+# Add your pre 'help' code here...
+
+.help-post: .help-impl
+# Add your post 'help' code here...
+
+
+
+# include project implementation makefile
+include nbproject/Makefile-impl.mk
+
+# include project make variables
+include nbproject/Makefile-variables.mk
diff --git a/freebsd/CLI/nbproject/Makefile-Release.mk b/freebsd/CLI/nbproject/Makefile-Release.mk
new file mode 100644
index 00000000..a3eb4e80
--- /dev/null
+++ b/freebsd/CLI/nbproject/Makefile-Release.mk
@@ -0,0 +1,234 @@
+#
+# Generated Makefile - do not edit!
+#
+# Edit the Makefile in the project folder instead (../Makefile). Each target
+# has a -pre and a -post target defined where you can add customized code.
+#
+# This makefile implements configuration specific macros and targets.
+
+
+# Environment
+MKDIR=mkdir
+CP=cp
+GREP=grep
+NM=nm
+CCADMIN=CCadmin
+RANLIB=ranlib
+CC=clang
+CCC=clang++
+CXX=clang++
+FC=gfortran
+AS=as
+
+# Macros
+CND_PLATFORM=CLang-Generic
+CND_DLIB_EXT=so
+CND_CONF=Release
+CND_DISTDIR=dist
+CND_BUILDDIR=build
+
+# Include project Makefile
+include Makefile
+
+# Object Directory
+OBJECTDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}
+
+# Object Files
+OBJECTFILES= \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaAnnotatedDump.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaCommand.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDev.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevEnterprise.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevGeneric.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal1.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal2.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpalite.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite1.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite2.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevRuby1.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaHashPwd.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaHexDump.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaOptions.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaResponse.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaSession.o \
+ ${OBJECTDIR}/_ext/cdbdd37b/blockwise.o \
+ ${OBJECTDIR}/_ext/cdbdd37b/chash.o \
+ ${OBJECTDIR}/_ext/cdbdd37b/hmac.o \
+ ${OBJECTDIR}/_ext/cdbdd37b/pbkdf2.o \
+ ${OBJECTDIR}/_ext/cdbdd37b/sha1.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/sedutil.o \
+ ${OBJECTDIR}/_ext/5c0/DtaDevFreeBSDCAM.o \
+ ${OBJECTDIR}/_ext/5c0/DtaDevFreeBSDNvme.o \
+ ${OBJECTDIR}/_ext/5c0/DtaDevOS.o
+
+
+# C Compiler Flags
+CFLAGS=-Wall
+
+# CC Compiler Flags
+CCFLAGS=-Wall
+CXXFLAGS=-Wall
+
+# Fortran Compiler Flags
+FFLAGS=-Wall
+
+# Assembler Flags
+ASFLAGS=
+
+# Link Libraries and Options
+LDLIBSOPTIONS=-lcam
+
+# Build Targets
+.build-conf: ${BUILD_SUBPROJECTS}
+ "${MAKE}" -f nbproject/Makefile-${CND_CONF}.mk ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/sedutil-cli
+
+${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/sedutil-cli: ${OBJECTFILES}
+ ${MKDIR} -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}
+ clang++ -o ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/sedutil-cli ${OBJECTFILES} ${LDLIBSOPTIONS}
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaAnnotatedDump.o: ../../Common/DtaAnnotatedDump.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaAnnotatedDump.o ../../Common/DtaAnnotatedDump.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaCommand.o: ../../Common/DtaCommand.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaCommand.o ../../Common/DtaCommand.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDev.o: ../../Common/DtaDev.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDev.o ../../Common/DtaDev.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevEnterprise.o: ../../Common/DtaDevEnterprise.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevEnterprise.o ../../Common/DtaDevEnterprise.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevGeneric.o: ../../Common/DtaDevGeneric.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevGeneric.o ../../Common/DtaDevGeneric.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal.o: ../../Common/DtaDevOpal.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal.o ../../Common/DtaDevOpal.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal1.o: ../../Common/DtaDevOpal1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal1.o ../../Common/DtaDevOpal1.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal2.o: ../../Common/DtaDevOpal2.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal2.o ../../Common/DtaDevOpal2.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpalite.o: ../../Common/DtaDevOpalite.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpalite.o ../../Common/DtaDevOpalite.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite1.o: ../../Common/DtaDevPyrite1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite1.o ../../Common/DtaDevPyrite1.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite2.o: ../../Common/DtaDevPyrite2.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite2.o ../../Common/DtaDevPyrite2.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevRuby1.o: ../../Common/DtaDevRuby1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevRuby1.o ../../Common/DtaDevRuby1.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaHashPwd.o: ../../Common/DtaHashPwd.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaHashPwd.o ../../Common/DtaHashPwd.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaHexDump.o: ../../Common/DtaHexDump.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaHexDump.o ../../Common/DtaHexDump.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaOptions.o: ../../Common/DtaOptions.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaOptions.o ../../Common/DtaOptions.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaResponse.o: ../../Common/DtaResponse.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaResponse.o ../../Common/DtaResponse.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaSession.o: ../../Common/DtaSession.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaSession.o ../../Common/DtaSession.cpp
+
+${OBJECTDIR}/_ext/cdbdd37b/blockwise.o: ../../Common/pbkdf2/blockwise.c
+ ${MKDIR} -p ${OBJECTDIR}/_ext/cdbdd37b
+ ${RM} "$@.d"
+ $(COMPILE.c) -O2 -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/cdbdd37b/blockwise.o ../../Common/pbkdf2/blockwise.c
+
+${OBJECTDIR}/_ext/cdbdd37b/chash.o: ../../Common/pbkdf2/chash.c
+ ${MKDIR} -p ${OBJECTDIR}/_ext/cdbdd37b
+ ${RM} "$@.d"
+ $(COMPILE.c) -O2 -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/cdbdd37b/chash.o ../../Common/pbkdf2/chash.c
+
+${OBJECTDIR}/_ext/cdbdd37b/hmac.o: ../../Common/pbkdf2/hmac.c
+ ${MKDIR} -p ${OBJECTDIR}/_ext/cdbdd37b
+ ${RM} "$@.d"
+ $(COMPILE.c) -O2 -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/cdbdd37b/hmac.o ../../Common/pbkdf2/hmac.c
+
+${OBJECTDIR}/_ext/cdbdd37b/pbkdf2.o: ../../Common/pbkdf2/pbkdf2.c
+ ${MKDIR} -p ${OBJECTDIR}/_ext/cdbdd37b
+ ${RM} "$@.d"
+ $(COMPILE.c) -O2 -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/cdbdd37b/pbkdf2.o ../../Common/pbkdf2/pbkdf2.c
+
+${OBJECTDIR}/_ext/cdbdd37b/sha1.o: ../../Common/pbkdf2/sha1.c
+ ${MKDIR} -p ${OBJECTDIR}/_ext/cdbdd37b
+ ${RM} "$@.d"
+ $(COMPILE.c) -O2 -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/cdbdd37b/sha1.o ../../Common/pbkdf2/sha1.c
+
+${OBJECTDIR}/_ext/7a2a93ab/sedutil.o: ../../Common/sedutil.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/sedutil.o ../../Common/sedutil.cpp
+
+${OBJECTDIR}/_ext/5c0/DtaDevFreeBSDCAM.o: ../DtaDevFreeBSDCAM.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/5c0
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/5c0/DtaDevFreeBSDCAM.o ../DtaDevFreeBSDCAM.cpp
+
+${OBJECTDIR}/_ext/5c0/DtaDevFreeBSDNvme.o: ../DtaDevFreeBSDNvme.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/5c0
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/5c0/DtaDevFreeBSDNvme.o ../DtaDevFreeBSDNvme.cpp
+
+${OBJECTDIR}/_ext/5c0/DtaDevOS.o: ../DtaDevOS.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/5c0
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/5c0/DtaDevOS.o ../DtaDevOS.cpp
+
+# Subprojects
+.build-subprojects:
+
+# Clean Targets
+.clean-conf: ${CLEAN_SUBPROJECTS}
+ ${RM} -r ${CND_BUILDDIR}/${CND_CONF}
+ ${RM} ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/sedutil-cli
+
+# Subprojects
+.clean-subprojects:
+
+# Enable dependency checking
+.dep.inc: .depcheck-impl
+
+include .dep.inc
diff --git a/freebsd/CLI/nbproject/Makefile-impl.mk b/freebsd/CLI/nbproject/Makefile-impl.mk
new file mode 100644
index 00000000..310b82b4
--- /dev/null
+++ b/freebsd/CLI/nbproject/Makefile-impl.mk
@@ -0,0 +1,133 @@
+#
+# Generated Makefile - do not edit!
+#
+# Edit the Makefile in the project folder instead (../Makefile). Each target
+# has a pre- and a post- target defined where you can add customization code.
+#
+# This makefile implements macros and targets common to all configurations.
+#
+# NOCDDL
+
+
+# Building and Cleaning subprojects are done by default, but can be controlled with the SUB
+# macro. If SUB=no, subprojects will not be built or cleaned. The following macro
+# statements set BUILD_SUB-CONF and CLEAN_SUB-CONF to .build-reqprojects-conf
+# and .clean-reqprojects-conf unless SUB has the value 'no'
+SUB_no=NO
+SUBPROJECTS=${SUB_${SUB}}
+BUILD_SUBPROJECTS_=.build-subprojects
+BUILD_SUBPROJECTS_NO=
+BUILD_SUBPROJECTS=${BUILD_SUBPROJECTS_${SUBPROJECTS}}
+CLEAN_SUBPROJECTS_=.clean-subprojects
+CLEAN_SUBPROJECTS_NO=
+CLEAN_SUBPROJECTS=${CLEAN_SUBPROJECTS_${SUBPROJECTS}}
+
+
+# Project Name
+PROJECTNAME=CLI
+
+# Active Configuration
+DEFAULTCONF=Release
+CONF=${DEFAULTCONF}
+
+# All Configurations
+ALLCONFS=Release
+
+
+# build
+.build-impl: .build-pre .validate-impl .depcheck-impl
+ @#echo "=> Running $@... Configuration=$(CONF)"
+ "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf
+
+
+# clean
+.clean-impl: .clean-pre .validate-impl .depcheck-impl
+ @#echo "=> Running $@... Configuration=$(CONF)"
+ "${MAKE}" -f nbproject/Makefile-${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf
+
+
+# clobber
+.clobber-impl: .clobber-pre .depcheck-impl
+ @#echo "=> Running $@..."
+ for CONF in ${ALLCONFS}; \
+ do \
+ "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .clean-conf; \
+ done
+
+# all
+.all-impl: .all-pre .depcheck-impl
+ @#echo "=> Running $@..."
+ for CONF in ${ALLCONFS}; \
+ do \
+ "${MAKE}" -f nbproject/Makefile-$${CONF}.mk QMAKE=${QMAKE} SUBPROJECTS=${SUBPROJECTS} .build-conf; \
+ done
+
+# build tests
+.build-tests-impl: .build-impl .build-tests-pre
+ @#echo "=> Running $@... Configuration=$(CONF)"
+ "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .build-tests-conf
+
+# run tests
+.test-impl: .build-tests-impl .test-pre
+ @#echo "=> Running $@... Configuration=$(CONF)"
+ "${MAKE}" -f nbproject/Makefile-${CONF}.mk SUBPROJECTS=${SUBPROJECTS} .test-conf
+
+# dependency checking support
+.depcheck-impl:
+ @echo "# This code depends on make tool being used" >.dep.inc
+ @if [ -n "${MAKE_VERSION}" ]; then \
+ echo "DEPFILES=\$$(wildcard \$$(addsuffix .d, \$${OBJECTFILES} \$${TESTOBJECTFILES}))" >>.dep.inc; \
+ echo "ifneq (\$${DEPFILES},)" >>.dep.inc; \
+ echo "include \$${DEPFILES}" >>.dep.inc; \
+ echo "endif" >>.dep.inc; \
+ else \
+ echo ".KEEP_STATE:" >>.dep.inc; \
+ echo ".KEEP_STATE_FILE:.make.state.\$${CONF}" >>.dep.inc; \
+ fi
+
+# configuration validation
+.validate-impl:
+ @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
+ then \
+ echo ""; \
+ echo "Error: can not find the makefile for configuration '${CONF}' in project ${PROJECTNAME}"; \
+ echo "See 'make help' for details."; \
+ echo "Current directory: " `pwd`; \
+ echo ""; \
+ fi
+ @if [ ! -f nbproject/Makefile-${CONF}.mk ]; \
+ then \
+ exit 1; \
+ fi
+
+
+# help
+.help-impl: .help-pre
+ @echo "This makefile supports the following configurations:"
+ @echo " ${ALLCONFS}"
+ @echo ""
+ @echo "and the following targets:"
+ @echo " build (default target)"
+ @echo " clean"
+ @echo " clobber"
+ @echo " all"
+ @echo " help"
+ @echo ""
+ @echo "Makefile Usage:"
+ @echo " make [CONF=] [SUB=no] build"
+ @echo " make [CONF=] [SUB=no] clean"
+ @echo " make [SUB=no] clobber"
+ @echo " make [SUB=no] all"
+ @echo " make help"
+ @echo ""
+ @echo "Target 'build' will build a specific configuration and, unless 'SUB=no',"
+ @echo " also build subprojects."
+ @echo "Target 'clean' will clean a specific configuration and, unless 'SUB=no',"
+ @echo " also clean subprojects."
+ @echo "Target 'clobber' will remove all built files from all configurations and,"
+ @echo " unless 'SUB=no', also from subprojects."
+ @echo "Target 'all' will will build all configurations and, unless 'SUB=no',"
+ @echo " also build subprojects."
+ @echo "Target 'help' prints this message."
+ @echo ""
+
diff --git a/freebsd/CLI/nbproject/Makefile-variables.mk b/freebsd/CLI/nbproject/Makefile-variables.mk
new file mode 100644
index 00000000..0f53cc2b
--- /dev/null
+++ b/freebsd/CLI/nbproject/Makefile-variables.mk
@@ -0,0 +1,27 @@
+#
+# Generated - do not edit!
+#
+# NOCDDL
+#
+CND_BASEDIR=`pwd`
+CND_BUILDDIR=build
+CND_DISTDIR=dist
+# Release configuration
+CND_PLATFORM_Release=CLang-Generic
+CND_ARTIFACT_DIR_Release=dist/Release/CLang-Generic
+CND_ARTIFACT_NAME_Release=sedutil-cli
+CND_ARTIFACT_PATH_Release=dist/Release/CLang-Generic/sedutil-cli
+CND_PACKAGE_DIR_Release=dist/Release/CLang-Generic/package
+CND_PACKAGE_NAME_Release=cli.tar
+CND_PACKAGE_PATH_Release=dist/Release/CLang-Generic/package/cli.tar
+#
+# include compiler specific variables
+#
+# dmake command
+ROOT:sh = test -f nbproject/private/Makefile-variables.mk || \
+ (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk)
+#
+# gmake command
+.PHONY: $(shell test -f nbproject/private/Makefile-variables.mk || (mkdir -p nbproject/private && touch nbproject/private/Makefile-variables.mk))
+#
+include nbproject/private/Makefile-variables.mk
diff --git a/freebsd/CLI/nbproject/Package-Release.bash b/freebsd/CLI/nbproject/Package-Release.bash
new file mode 100644
index 00000000..07e265f9
--- /dev/null
+++ b/freebsd/CLI/nbproject/Package-Release.bash
@@ -0,0 +1,76 @@
+#!/bin/bash -x
+
+#
+# Generated - do not edit!
+#
+
+# Macros
+TOP=`pwd`
+CND_PLATFORM=CLang-Generic
+CND_CONF=Release
+CND_DISTDIR=dist
+CND_BUILDDIR=build
+CND_DLIB_EXT=so
+NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging
+TMPDIRNAME=tmp-packaging
+OUTPUT_PATH=${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/sedutil-cli
+OUTPUT_BASENAME=sedutil-cli
+PACKAGE_TOP_DIR=cli/
+
+# Functions
+function checkReturnCode
+{
+ rc=$?
+ if [ $rc != 0 ]
+ then
+ exit $rc
+ fi
+}
+function makeDirectory
+# $1 directory path
+# $2 permission (optional)
+{
+ mkdir -p "$1"
+ checkReturnCode
+ if [ "$2" != "" ]
+ then
+ chmod $2 "$1"
+ checkReturnCode
+ fi
+}
+function copyFileToTmpDir
+# $1 from-file path
+# $2 to-file path
+# $3 permission
+{
+ cp "$1" "$2"
+ checkReturnCode
+ if [ "$3" != "" ]
+ then
+ chmod $3 "$2"
+ checkReturnCode
+ fi
+}
+
+# Setup
+cd "${TOP}"
+mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package
+rm -rf ${NBTMPDIR}
+mkdir -p ${NBTMPDIR}
+
+# Copy files and create directories and links
+cd "${TOP}"
+makeDirectory "${NBTMPDIR}/cli/bin"
+copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755
+
+
+# Generate tar file
+cd "${TOP}"
+rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/cli.tar
+cd ${NBTMPDIR}
+tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/cli.tar *
+checkReturnCode
+
+# Cleanup
+cd "${TOP}"
+rm -rf ${NBTMPDIR}
diff --git a/freebsd/CLI/nbproject/configurations.xml b/freebsd/CLI/nbproject/configurations.xml
new file mode 100644
index 00000000..b33d88f2
--- /dev/null
+++ b/freebsd/CLI/nbproject/configurations.xml
@@ -0,0 +1,280 @@
+
+
+
+
+
+ ../../Common/pbkdf2/bitops.h
+ ../../Common/pbkdf2/blockwise.h
+ ../../Common/pbkdf2/chash.h
+ ../../Common/pbkdf2/handy.h
+ ../../Common/pbkdf2/hmac.h
+ ../../Common/pbkdf2/pbkdf2.h
+ ../../Common/pbkdf2/sha1.h
+ ../../Common/pbkdf2/tassert.h
+
+ ../../Common/DtaAnnotatedDump.h
+ ../../Common/DtaCommand.h
+ ../../Common/DtaConstants.h
+ ../../Common/DtaDev.h
+ ../../Common/DtaDevEnterprise.h
+ ../DtaDevFreeBSDDrive.h
+ ../DtaDevFreeBSDCAM.h
+ ../DtaDevFreeBSDNvme.h
+ ../../Common/DtaDevGeneric.h
+ ../DtaDevOS.h
+ ../../Common/DtaDevOpal.h
+ ../../Common/DtaDevOpal1.h
+ ../../Common/DtaDevOpal2.h
+ ../../Common/DtaDevOpalite.h
+ ../../Common/DtaDevPyrite1.h
+ ../../Common/DtaDevPyrite2.h
+ ../../Common/DtaDevRuby1.h
+ ../../Common/DtaEndianFixup.h
+ ../../Common/DtaHashPwd.h
+ ../../Common/DtaHexDump.h
+ ../../Common/DtaLexicon.h
+ ../../Common/DtaOptions.h
+ ../../Common/DtaResponse.h
+ ../../Common/DtaSession.h
+ ../../Common/DtaStructures.h
+ ../../Common/log.h
+ ../os.h
+
+
+
+
+
+ ../../Common/pbkdf2/blockwise.c
+ ../../Common/pbkdf2/chash.c
+ ../../Common/pbkdf2/hmac.c
+ ../../Common/pbkdf2/pbkdf2.c
+ ../../Common/pbkdf2/sha1.c
+
+ ../../Common/DtaAnnotatedDump.cpp
+ ../../Common/DtaCommand.cpp
+ ../../Common/DtaDev.cpp
+ ../../Common/DtaDevEnterprise.cpp
+ ../DtaDevFreeBSDCAM.cpp
+ ../DtaDevFreeBSDNvme.cpp
+ ../../Common/DtaDevGeneric.cpp
+ ../DtaDevOS.cpp
+ ../../Common/DtaDevOpal.cpp
+ ../../Common/DtaDevOpal1.cpp
+ ../../Common/DtaDevOpal2.cpp
+ ../../Common/DtaDevOpalite.cpp
+ ../../Common/DtaDevPyrite1.cpp
+ ../../Common/DtaDevPyrite2.cpp
+ ../../Common/DtaDevRuby1.cpp
+ ../../Common/DtaHashPwd.cpp
+ ../../Common/DtaHexDump.cpp
+ ../../Common/DtaOptions.cpp
+ ../../Common/DtaResponse.cpp
+ ../../Common/DtaSession.cpp
+ ../../Common/sedutil.cpp
+
+
+
+
+ Makefile
+
+
+
+
+ Makefile
+
+
+
+ ../../Common/pbdkf2
+ ../../Common/pbdkf2
+ ../../Common/pbkdf2
+
+ Makefile
+
+
+
+ CLang|CLang
+ true
+ false
+
+
+
+ 5
+ 10
+ clang
+
+ ..
+ ../../Common
+ ../../Common/pbkdf2
+
+ -Wall
+ 3
+
+
+ 0
+ 8
+
+ ..
+ ../../Common
+ ../../Common/pbkdf2
+
+ -Wall
+ 3
+
+
+ 5
+ -Wall
+
+
+ 5
+
+
+
+ clang++
+
+ -lcam
+
+
+
+
-
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+
+
+
diff --git a/freebsd/CLI/nbproject/private/Makefile-variables.mk b/freebsd/CLI/nbproject/private/Makefile-variables.mk
new file mode 100644
index 00000000..589c41f5
--- /dev/null
+++ b/freebsd/CLI/nbproject/private/Makefile-variables.mk
@@ -0,0 +1,6 @@
+#
+# Generated - do not edit!
+#
+# NOCDDL
+#
+# Release configuration
diff --git a/freebsd/CLI/nbproject/private/configurations.xml b/freebsd/CLI/nbproject/private/configurations.xml
new file mode 100644
index 00000000..aa08e0c4
--- /dev/null
+++ b/freebsd/CLI/nbproject/private/configurations.xml
@@ -0,0 +1,39 @@
+
+
+ Makefile
+
+
+
+ localhost
+ 5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ gdb
+
+
+
+ "${OUTPUT_PATH}"
+
+ "${OUTPUT_PATH}"
+
+ true
+ 0
+ 0
+
+
+
+
+
+
diff --git a/freebsd/CLI/nbproject/private/launcher.properties b/freebsd/CLI/nbproject/private/launcher.properties
new file mode 100644
index 00000000..6cc2127d
--- /dev/null
+++ b/freebsd/CLI/nbproject/private/launcher.properties
@@ -0,0 +1,40 @@
+# Launchers File syntax:
+#
+# [Must-have property line]
+# launcher1.runCommand=
+# [Optional extra properties]
+# launcher1.displayName=
+# launcher1.buildCommand=
+# launcher1.runDir=
+# launcher1.symbolFiles=
+# launcher1.env.=
+# (If this value is quoted with ` it is handled as a native command which execution result will become the value)
+# [Common launcher properties]
+# common.runDir=
+# (This value is overwritten by a launcher specific runDir value if the latter exists)
+# common.env.=
+# (Environment variables from common launcher are merged with launcher specific variables)
+# common.symbolFiles=
+# (This value is overwritten by a launcher specific symbolFiles value if the latter exists)
+#
+# In runDir, symbolFiles and env fields you can use these macroses:
+# ${PROJECT_DIR} - project directory absolute path
+# ${OUTPUT_PATH} - linker output path (relative to project directory path)
+# ${OUTPUT_BASENAME}- linker output filename
+# ${TESTDIR} - test files directory (relative to project directory path)
+# ${OBJECTDIR} - object files directory (relative to project directory path)
+# ${CND_DISTDIR} - distribution directory (relative to project directory path)
+# ${CND_BUILDDIR} - build directory (relative to project directory path)
+# ${CND_PLATFORM} - platform name
+# ${CND_CONF} - configuration name
+# ${CND_DLIB_EXT} - dynamic library extension
+#
+# All the project launchers must be listed in the file!
+#
+# launcher1.runCommand=...
+# launcher2.runCommand=...
+# ...
+# common.runDir=...
+# common.env.KEY=VALUE
+
+# launcher1.runCommand=
\ No newline at end of file
diff --git a/freebsd/CLI/nbproject/project.xml b/freebsd/CLI/nbproject/project.xml
new file mode 100644
index 00000000..8b8fb4c8
--- /dev/null
+++ b/freebsd/CLI/nbproject/project.xml
@@ -0,0 +1,28 @@
+
+
+ org.netbeans.modules.cnd.makeproject
+
+
+ CLI
+ c
+ cpp
+ h
+ UTF-8
+
+
+ ../../Common/pbdkf2
+ ../../Common/pbdkf2
+ ../../Common/pbkdf2
+
+
+
+ Release
+ 1
+
+
+
+ false
+
+
+
+
diff --git a/freebsd/DtaDevFreeBSDCAM.cpp b/freebsd/DtaDevFreeBSDCAM.cpp
new file mode 100644
index 00000000..f7d72ca1
--- /dev/null
+++ b/freebsd/DtaDevFreeBSDCAM.cpp
@@ -0,0 +1,286 @@
+/* C:B**************************************************************************
+This software is Copyright 2016-2018 Alexander Motin
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+#include "os.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "DtaDevFreeBSDCAM.h"
+#include "DtaHexDump.h"
+
+using namespace std;
+
+/** The Device class represents a single disk device.
+ * FreeBSD specific implementation using the CAM pass interface
+ */
+
+DtaDevFreeBSDCAM::DtaDevFreeBSDCAM()
+{
+ isSCSI = 0;
+ isNVMe = 0;
+}
+
+bool DtaDevFreeBSDCAM::init(const char * devref)
+{
+ LOG(D1) << "Creating DtaDevFreeBSDCAM::DtaDev() " << devref;
+
+ if ((camdev = cam_open_device(devref, O_RDWR)) == NULL) {
+ // This is a D1 because diskscan looks for open fail to end scan
+ LOG(D1) << "Error opening device " << devref;
+ return (FALSE);
+ }
+ return (TRUE);
+}
+
+/** Send an ioctl to the device using pass through. */
+uint8_t DtaDevFreeBSDCAM::sendCmd(ATACOMMAND cmd, uint8_t protocol, uint16_t comID,
+ void * buffer, uint32_t bufferlen)
+{
+ union ccb ccb;
+
+ LOG(D1) << "Entering DtaDevFreeBSDCAM::sendCmd";
+ bzero(&ccb, sizeof(ccb));
+ if(isSCSI) {
+ cam_fill_csio(&ccb.csio, 1, NULL,
+ (cmd == IF_RECV) ? CAM_DIR_IN : CAM_DIR_OUT,
+ MSG_SIMPLE_Q_TAG, (u_int8_t*)buffer, bufferlen,
+ SSD_FULL_SIZE, 12, 60 * 1000);
+
+ ccb.csio.cdb_io.cdb_bytes[0] = (cmd == IF_RECV) ? 0xa2 : 0xb5;
+ ccb.csio.cdb_io.cdb_bytes[1] = protocol;
+ ccb.csio.cdb_io.cdb_bytes[2] = comID >> 8;
+ ccb.csio.cdb_io.cdb_bytes[3] = comID;
+ ccb.csio.cdb_io.cdb_bytes[4] = 0x80;
+ ccb.csio.cdb_io.cdb_bytes[6] = (bufferlen/512) >> 24;
+ ccb.csio.cdb_io.cdb_bytes[7] = (bufferlen/512) >> 16;
+ ccb.csio.cdb_io.cdb_bytes[8] = (bufferlen/512) >> 8;
+ ccb.csio.cdb_io.cdb_bytes[9] = (bufferlen/512);
+ } else if(isNVMe) {
+ cam_fill_nvmeadmin(&ccb.nvmeio, 0, NULL,
+ (cmd == IF_RECV) ? CAM_DIR_IN : CAM_DIR_OUT,
+ (u_int8_t*)buffer, bufferlen, 60 * 1000);
+ if (IF_RECV == cmd) {
+ LOG(D3) << "Security Receive Command";
+ ccb.nvmeio.cmd.opc = NVME_OPC_SECURITY_RECEIVE;
+ } else {
+ LOG(D3) << "Security Send Command";
+ ccb.nvmeio.cmd.opc = NVME_OPC_SECURITY_SEND;
+ }
+ ccb.nvmeio.cmd.cdw10 = htole32(protocol << 24 | comID << 8);
+ ccb.nvmeio.cmd.cdw11 = htole32(bufferlen);
+ } else {
+ cam_fill_ataio(&ccb.ataio, 0, NULL,
+ (cmd == IF_RECV) ? CAM_DIR_IN : CAM_DIR_OUT,
+ MSG_SIMPLE_Q_TAG, (u_int8_t*)buffer, bufferlen, 60 * 1000);
+
+ ccb.ataio.cmd.flags = 0;
+ ccb.ataio.cmd.command = cmd;
+ ccb.ataio.cmd.features = protocol;
+ ccb.ataio.cmd.lba_low = (bufferlen / 512) >> 8;
+ ccb.ataio.cmd.lba_mid = (comID & 0x00ff);
+ ccb.ataio.cmd.lba_high = (comID & 0xff00) >> 8;
+ ccb.ataio.cmd.device = 0x40;
+ ccb.ataio.cmd.sector_count = bufferlen / 512;
+ }
+
+ ccb.ccb_h.flags |= CAM_PASS_ERR_RECOVER;
+
+ if (cam_send_ccb(camdev, &ccb) < 0) {
+ LOG(D4) << "cam_send_ccb failed";
+ return (0xff);
+ }
+
+ if ((ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
+ IFLOG(D4)
+ cam_error_print(camdev, &ccb, CAM_ESF_ALL, CAM_EPF_ALL, stderr);
+ return (0xff);
+ }
+ return (0);
+}
+
+static void safecopy(uint8_t * dst, size_t dstsize, uint8_t * src, size_t srcsize)
+{
+ const size_t size = min(dstsize, srcsize);
+ if (size > 0) memcpy(dst, src, size);
+ if (size < dstsize) memset(dst+size, '\0', dstsize-size);
+}
+
+static int
+nvme_get_cdata(struct cam_device *dev, struct nvme_controller_data *cdata)
+{
+ union ccb *ccb;
+ struct ccb_dev_advinfo *advi;
+
+ ccb = cam_getccb(dev);
+ if (ccb == NULL) {
+ LOG(D4) << "couldn't allocate CCB";
+ return (1);
+ }
+
+ advi = &ccb->cdai;
+ advi->ccb_h.flags = CAM_DIR_IN;
+ advi->ccb_h.func_code = XPT_DEV_ADVINFO;
+ advi->flags = CDAI_FLAG_NONE;
+ advi->buftype = CDAI_TYPE_NVME_CNTRL;
+ advi->bufsiz = sizeof(struct nvme_controller_data);
+ advi->buf = (uint8_t *)cdata;
+
+ if (cam_send_ccb(dev, ccb) < 0) {
+ LOG(D4) << "error sending CAMIOCOMMAND ioctl";
+ cam_freeccb(ccb);
+ return (1);
+ }
+ if (advi->ccb_h.status != CAM_REQ_CMP) {
+ LOG(D4) << "got CAM error " << advi->ccb_h.status;
+ cam_freeccb(ccb);
+ return (1);
+ }
+ cam_freeccb(ccb);
+ return (0);
+}
+
+void DtaDevFreeBSDCAM::identify(OPAL_DiskInfo& disk_info)
+{
+ union ccb ccb;
+ struct nvme_controller_data cdata;
+
+ LOG(D4) << "Entering DtaDevFreeBSDCAM::identify()";
+
+ bzero(&ccb, sizeof(union ccb));
+ ccb.ccb_h.func_code = XPT_GDEV_TYPE;
+ if (cam_send_ccb(camdev, &ccb) < 0) {
+ LOG(D4) << "cam_send_ccb failed";
+ disk_info.devType = DEVICE_TYPE_OTHER;
+ return;
+ }
+
+ if ((ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
+ LOG(D4) << "cam_send_ccb error" << ccb.ccb_h.status;
+ disk_info.devType = DEVICE_TYPE_OTHER;
+ return;
+ }
+
+#ifndef ATA_SUPPORT_TCG
+#define ATA_SUPPORT_TCG 0x0001
+#define tcg usedmovsd
+#endif
+ if (ccb.cgd.protocol == PROTO_SCSI) {
+ isSCSI = 1;
+ safecopy(disk_info.serialNum, sizeof(disk_info.serialNum),
+ (uint8_t *)ccb.cgd.serial_num, ccb.cgd.serial_num_len);
+ safecopy(disk_info.firmwareRev, sizeof(disk_info.firmwareRev),
+ (uint8_t *)ccb.cgd.inq_data.revision, sizeof(ccb.cgd.inq_data.revision));
+ safecopy(disk_info.modelNum, sizeof(disk_info.modelNum),
+ (uint8_t *)ccb.cgd.inq_data.vendor, sizeof(ccb.cgd.inq_data.vendor) + sizeof(ccb.cgd.inq_data.product));
+
+ /*
+ * Some SATL bridges are broken. If the device is SATL,
+ * check its ATA IDENTIFY DATA for TCG support.
+ */
+ char buf[572];
+ bzero(&ccb, sizeof(union ccb));
+ scsi_inquiry(&ccb.csio, 1, NULL, MSG_SIMPLE_Q_TAG,
+ (uint8_t *)&buf, sizeof(buf), 1, 0x89, SSD_FULL_SIZE,
+ 60 * 1000);
+ ccb.ccb_h.flags |= CAM_PASS_ERR_RECOVER;
+ if (cam_send_ccb(camdev, &ccb) < 0) {
+ LOG(D4) << "cam_send_ccb failed";
+ disk_info.devType = DEVICE_TYPE_OTHER;
+ return;
+ }
+ if ((ccb.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
+ IFLOG(D4)
+ cam_error_print(camdev, &ccb, CAM_ESF_ALL, CAM_EPF_ALL, stderr);
+ LOG(D4) << "Device is not SATL";
+ disk_info.devType = DEVICE_TYPE_SAS;
+ return;
+ }
+ struct ata_params *ident_data = (struct ata_params *)&buf[60];
+ if ((ident_data->tcg & 0xc000) == 0x4000 &&
+ (ident_data->tcg & ATA_SUPPORT_TCG) != 0) {
+ LOG(D4) << "Trusted Computing feature set is supported: "
+ << std::hex << ident_data->tcg;
+ disk_info.devType = DEVICE_TYPE_SAS;
+ } else {
+ LOG(D4) << "Trusted Computing feature set is not supported: "
+ << std::hex << ident_data->tcg;
+ disk_info.devType = DEVICE_TYPE_OTHER;
+ }
+ } else if (ccb.cgd.protocol == PROTO_NVME) {
+ isNVMe = 1;
+ if (nvme_get_cdata(camdev, &cdata)) {
+ LOG(D4) << "nvme_get_cdata failed";
+ disk_info.devType = DEVICE_TYPE_OTHER;
+ return;
+ }
+ safecopy(disk_info.serialNum, sizeof(disk_info.serialNum),
+ (uint8_t *)cdata.sn, sizeof(cdata.sn));
+ safecopy(disk_info.firmwareRev, sizeof(disk_info.firmwareRev),
+ (uint8_t *)cdata.fr, sizeof(cdata.fr));
+ safecopy(disk_info.modelNum, sizeof(disk_info.modelNum),
+ (uint8_t *)cdata.mn, sizeof(cdata.mn));
+#if __FreeBSD_version >= 1200058
+ if ((cdata.oacs >> NVME_CTRLR_DATA_OACS_SECURITY_SHIFT) &
+ NVME_CTRLR_DATA_OACS_SECURITY_MASK) {
+#else
+ if (cdata.oacs.security) {
+#endif
+ LOG(D4) << "Security Send/Receive are supported";
+ disk_info.devType = DEVICE_TYPE_NVME;
+ } else {
+ LOG(D4) << "Security Send/Receive are not supported";
+ disk_info.devType = DEVICE_TYPE_OTHER;
+ }
+ } else if (ccb.cgd.protocol == PROTO_ATA) {
+ safecopy(disk_info.serialNum, sizeof(disk_info.serialNum),
+ (uint8_t *)ccb.cgd.serial_num, ccb.cgd.serial_num_len);
+ memcpy(disk_info.firmwareRev, ccb.cgd.ident_data.revision,
+ sizeof(disk_info.firmwareRev));
+ memcpy(disk_info.modelNum, ccb.cgd.ident_data.model,
+ sizeof(disk_info.modelNum));
+ if ((ccb.cgd.ident_data.tcg & 0xc000) == 0x4000 &&
+ (ccb.cgd.ident_data.tcg & ATA_SUPPORT_TCG) != 0) {
+ LOG(D4) << "Trusted Computing feature set is supported: "
+ << std::hex << ccb.cgd.ident_data.tcg;
+ disk_info.devType = DEVICE_TYPE_ATA;
+ } else {
+ LOG(D4) << "Trusted Computing feature set is not supported: "
+ << std::hex << ccb.cgd.ident_data.tcg;
+ disk_info.devType = DEVICE_TYPE_OTHER;
+ }
+ } else {
+ disk_info.devType = DEVICE_TYPE_OTHER;
+ }
+}
+
+/** Close the device reference so this object can be delete. */
+DtaDevFreeBSDCAM::~DtaDevFreeBSDCAM()
+{
+ LOG(D1) << "Destroying DtaDevFreeBSDCAM";
+ cam_close_device(camdev);
+}
diff --git a/freebsd/DtaDevFreeBSDCAM.h b/freebsd/DtaDevFreeBSDCAM.h
new file mode 100755
index 00000000..cb4c16af
--- /dev/null
+++ b/freebsd/DtaDevFreeBSDCAM.h
@@ -0,0 +1,57 @@
+/* C:B**************************************************************************
+This software is Copyright 2016-2018 Alexander Motin
+This software is Copyright 2014-2016 Bright Plaza Inc.
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+#pragma once
+#include "DtaStructures.h"
+#include "DtaDevFreeBSDDrive.h"
+
+/** FreeBSD specific implementation of DtaDevOS.
+ * Uses the SCSI generic ioctls to send commands to the
+ * device
+ */
+class DtaDevFreeBSDCAM: public DtaDevFreeBSDDrive {
+public:
+ /** Default constructor */
+ DtaDevFreeBSDCAM();
+ /** Destructor */
+ ~DtaDevFreeBSDCAM();
+ /** Sata FreeBSD specific initialization.
+ * This function should perform the necessary authority and environment checking
+ * to allow proper functioning of the program, open the device, perform an ATA
+ * identify, add the fields from the identify response to the disk info structure
+ * and if the device is an ATA device perform a call to Discovery0() to complete
+ * the disk_info structure
+ * @param devref character representation of the device is standard OS lexicon
+ */
+ bool init(const char * devref);
+ /** Sata FreeBSD specific method to send an ATA command to the device
+ * @param cmd ATA command to be sent to the device
+ * @param protocol security protocol to be used in the command
+ * @param comID communications ID to be used
+ * @param buffer input/output buffer
+ * @param bufferlen length of the input/output buffer
+ */
+ uint8_t sendCmd(ATACOMMAND cmd, uint8_t protocol, uint16_t comID,
+ void * buffer, uint32_t bufferlen);
+ void identify(OPAL_DiskInfo& disk_info);
+ struct cam_device *camdev;
+ int isSCSI; /* The device is SCSI */
+ int isNVMe; /* The device is NVMe */
+};
diff --git a/freebsd/DtaDevFreeBSDDrive.h b/freebsd/DtaDevFreeBSDDrive.h
new file mode 100755
index 00000000..89ff4624
--- /dev/null
+++ b/freebsd/DtaDevFreeBSDDrive.h
@@ -0,0 +1,49 @@
+/* C:B**************************************************************************
+This software is Copyright 2016-2018 Alexander Motin
+This software is Copyright 2014-2016 Bright Plaza Inc.
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+#pragma once
+#include "DtaStructures.h"
+
+/** virtual implementation for a disk interface-generic disk drive
+ */
+class DtaDevFreeBSDDrive {
+public:
+ virtual ~DtaDevFreeBSDDrive( void ) {};
+ /**Initialization.
+ * This function should perform the necessary authority and environment checking
+ * to allow proper functioning of the program, open the device, perform an ATA
+ * identify, add the fields from the identify response to the disk info structure
+ * and if the device is an ATA device perform a call to Discovery0() to complete
+ * the disk_info structure
+ * @param devref character representation of the device is standard OS lexicon
+ */
+ virtual bool init(const char * devref) = 0;
+ /** Method to send a command to the device
+ * @param cmd command to be sent to the device
+ * @param protocol security protocol to be used in the command
+ * @param comID communications ID to be used
+ * @param buffer input/output buffer
+ * @param bufferlen length of the input/output buffer
+ */
+ virtual uint8_t sendCmd(ATACOMMAND cmd, uint8_t protocol, uint16_t comID,
+ void * buffer, uint32_t bufferlen) = 0;
+ /** Routine to send an identify to the device */
+ virtual void identify(OPAL_DiskInfo& disk_info) = 0;
+};
diff --git a/freebsd/DtaDevFreeBSDNvme.cpp b/freebsd/DtaDevFreeBSDNvme.cpp
new file mode 100755
index 00000000..b6d117bc
--- /dev/null
+++ b/freebsd/DtaDevFreeBSDNvme.cpp
@@ -0,0 +1,150 @@
+/* C:B**************************************************************************
+This software is Copyright 2016-2018 Alexander Motin
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+#include "os.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "DtaDevFreeBSDNvme.h"
+#include "DtaHexDump.h"
+
+using namespace std;
+
+/** The Device class represents a single disk device.
+ * FreeBSD specific implementation using the NVMe interface
+ */
+DtaDevFreeBSDNvme::DtaDevFreeBSDNvme() {}
+
+bool DtaDevFreeBSDNvme::init(const char * devref)
+{
+ LOG(D1) << "Creating DtaDevFreeBSDNvme::DtaDev() " << devref;
+
+ if ((fd = open(devref, O_RDWR)) < 0) {
+ // This is a D1 because diskscan looks for open fail to end scan
+ LOG(D1) << "Error opening device " << devref << " " << errno;
+ return (FALSE);
+ }
+ return (TRUE);
+}
+
+/** Send an ioctl to the device using nvme admin commands. */
+uint8_t DtaDevFreeBSDNvme::sendCmd(ATACOMMAND cmd, uint8_t protocol, uint16_t comID,
+ void * buffer, uint32_t bufferlen)
+{
+ struct nvme_pt_command pt;
+ int err;
+
+ LOG(D1) << "Entering DtaDevFreeBSDNvme::sendCmd";
+
+ memset(&pt, 0, sizeof(pt));
+ if (IF_RECV == cmd) {
+ LOG(D3) << "Security Receive Command";
+#if __FreeBSD_version >= 1200058 && __FreeBSD_version < 1200081
+ pt.cmd.opc_fuse = NVME_CMD_SET_OPC(NVME_OPC_SECURITY_RECEIVE);
+#else
+ pt.cmd.opc = NVME_OPC_SECURITY_RECEIVE;
+#endif
+ } else {
+ LOG(D3) << "Security Send Command";
+#if __FreeBSD_version >= 1200058 && __FreeBSD_version < 1200081
+ pt.cmd.opc_fuse = NVME_CMD_SET_OPC(NVME_OPC_SECURITY_SEND);
+#else
+ pt.cmd.opc = NVME_OPC_SECURITY_SEND;
+#endif
+ }
+ pt.cmd.cdw10 = protocol << 24 | comID << 8;
+ pt.cmd.cdw11 = bufferlen;
+ pt.len = bufferlen;
+ pt.buf = buffer;
+
+ err = ioctl(fd, NVME_PASSTHROUGH_CMD, &pt);
+ if (err < 0) {
+ LOG(D4) << "NVME_PASSTHROUGH_CMD failed";
+ return (errno);
+ } else if (nvme_completion_is_error(&pt.cpl)) {
+ LOG(D4) << "NVME Security Command Error: " << std::hex <<
+#if __FreeBSD_version >= 1200058
+ pt.cpl.status;
+#else
+ pt.cpl.status.sct << " " << pt.cpl.status.sc;
+#endif
+ return (0xff);
+ } else
+ LOG(D4) << "NVME Security Command Success";
+ return (err);
+}
+
+void DtaDevFreeBSDNvme::identify(OPAL_DiskInfo& disk_info)
+{
+ struct nvme_pt_command pt;
+ struct nvme_controller_data cdata;
+
+ LOG(D4) << "Entering DtaDevFreeBSDNvme::identify()";
+
+ memset(&pt, 0, sizeof(pt));
+#if __FreeBSD_version >= 1200058 && __FreeBSD_version < 1200081
+ pt.cmd.opc_fuse = NVME_CMD_SET_OPC(NVME_OPC_IDENTIFY);
+#else
+ pt.cmd.opc = NVME_OPC_IDENTIFY;
+#endif
+ pt.cmd.cdw10 = 1;
+ pt.buf = &cdata;
+ pt.len = sizeof(cdata);
+ pt.is_read = 1;
+
+ if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0) {
+ LOG(E) << "Identify error " << errno;
+ disk_info.devType = DEVICE_TYPE_OTHER;
+ return;
+ }
+
+ if (nvme_completion_is_error(&pt.cpl)) {
+ LOG(E) << "identify request returned error";
+ disk_info.devType = DEVICE_TYPE_OTHER;
+ return;
+ }
+
+ memcpy(disk_info.serialNum, cdata.sn, sizeof (disk_info.serialNum));
+ memcpy(disk_info.firmwareRev, cdata.fr, sizeof(disk_info.firmwareRev));
+ memcpy(disk_info.modelNum, cdata.mn, sizeof(disk_info.modelNum));
+
+#if __FreeBSD_version >= 1200058
+ if ((cdata.oacs >> NVME_CTRLR_DATA_OACS_SECURITY_SHIFT) &
+ NVME_CTRLR_DATA_OACS_SECURITY_MASK) {
+#else
+ if (cdata.oacs.security) {
+#endif
+ LOG(D4) << "Security Send/Receive are supported";
+ disk_info.devType = DEVICE_TYPE_NVME;
+ } else {
+ LOG(D4) << "Security Send/Receive are not supported";
+ disk_info.devType = DEVICE_TYPE_OTHER;
+ }
+}
+
+/** Close the device reference so this object can be delete. */
+DtaDevFreeBSDNvme::~DtaDevFreeBSDNvme()
+{
+ LOG(D1) << "Destroying DtaDevFreeBSDNvme";
+ close(fd);
+}
diff --git a/freebsd/DtaDevFreeBSDNvme.h b/freebsd/DtaDevFreeBSDNvme.h
new file mode 100755
index 00000000..f5325742
--- /dev/null
+++ b/freebsd/DtaDevFreeBSDNvme.h
@@ -0,0 +1,56 @@
+/* C:B**************************************************************************
+This software is Copyright 2016-2018 Alexander Motin
+This software is Copyright 2014-2016 Bright Plaza Inc.
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+#pragma once
+#include "dev/nvme/nvme.h"
+#include "DtaStructures.h"
+#include "DtaDevFreeBSDDrive.h"
+
+/** FreeBSD specific implementation of DtaDevOS.
+ * Uses the NVMe to send commands to the device
+ */
+class DtaDevFreeBSDNvme: public DtaDevFreeBSDDrive{
+public:
+ /** Default constructor */
+ DtaDevFreeBSDNvme();
+ /** Destructor */
+ ~DtaDevFreeBSDNvme();
+ /** NVMe specific initialization.
+ * This function should perform the necessary authority and environment checking
+ * to allow proper functioning of the program, open the device, perform an ATA
+ * identify, add the fields from the identify response to the disk info structure
+ * and if the device is an ATA device perform a call to Discovery0() to complete
+ * the disk_info structure
+ * @param devref character representation of the device is standard OS lexicon
+ */
+ bool init(const char * devref);
+ /** NVMe specific method to send a command to the device
+ * @param cmd command to be sent to the device
+ * @param protocol security protocol to be used in the command
+ * @param comID communications ID to be used
+ * @param buffer input/output buffer
+ * @param bufferlen length of the input/output buffer
+ */
+ uint8_t sendCmd(ATACOMMAND cmd, uint8_t protocol, uint16_t comID,
+ void * buffer, uint32_t bufferlen);
+ /** NVMe specific routine to send an identify to the device */
+ void identify(OPAL_DiskInfo& disk_info);
+ int fd; /**< FreeBSD handle for the device */
+};
diff --git a/freebsd/DtaDevOS.cpp b/freebsd/DtaDevOS.cpp
new file mode 100644
index 00000000..b1c90d85
--- /dev/null
+++ b/freebsd/DtaDevOS.cpp
@@ -0,0 +1,180 @@
+/* C:B**************************************************************************
+This software is Copyright 2016-2018 Alexander Motin
+This software is Copyright 2014-2016 Bright Plaza Inc.
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+#include "os.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "DtaDevOS.h"
+#include "DtaHexDump.h"
+#include "DtaDevFreeBSDNvme.h"
+#include "DtaDevFreeBSDCAM.h"
+#include "DtaDevGeneric.h"
+
+using namespace std;
+
+/** The Device class represents a FreeBSD generic storage device.
+ * At initialization we determine if we map to the NVMe or SATA derived class
+ */
+unsigned long long DtaDevOS::getSize()
+{
+ return 0;
+}
+
+DtaDevOS::DtaDevOS()
+{
+ drive = NULL;
+}
+
+/* Determine which type of drive we're using and instantiate a derived class of that type */
+void DtaDevOS::init(const char * devref)
+{
+ LOG(D1) << "DtaDevOS::init " << devref;
+
+ memset(&disk_info, 0, sizeof(OPAL_DiskInfo));
+ dev = devref;
+
+ if (!strncmp(devref, "/dev/nvme", 9) || !strncmp(devref, "/dev/nvd", 8))
+ {
+ drive = new DtaDevFreeBSDNvme();
+ }
+ else
+ if (!strncmp(devref, "/dev/da", 7) ||
+ !strncmp(devref, "/dev/ada", 8) ||
+ !strncmp(devref, "/dev/nda", 8))
+ {
+ drive = new DtaDevFreeBSDCAM();
+ }
+ else {
+ LOG(E) << "DtaDevOS::init ERROR - unknown drive type";
+ return;
+ }
+
+ if (drive->init(devref))
+ {
+ isOpen = TRUE;
+ drive->identify(disk_info);
+ if (disk_info.devType != DEVICE_TYPE_OTHER)
+ discovery0();
+ }
+ else
+ isOpen = FALSE;
+
+ return;
+}
+
+uint8_t DtaDevOS::sendCmd(ATACOMMAND cmd, uint8_t protocol, uint16_t comID,
+ void * buffer, uint32_t bufferlen)
+{
+ if (!isOpen) return 0xfe; //disk open failed so this will too
+
+ if (NULL == drive)
+ {
+ LOG(E) << "DtaDevOS::sendCmd ERROR - unknown drive type";
+ return 0xff;
+ }
+
+ return drive->sendCmd(cmd, protocol, comID, buffer, bufferlen);
+}
+
+void DtaDevOS::identify(OPAL_DiskInfo& disk_info)
+{
+ if (!isOpen) return; //disk open failed so this will too
+ if (NULL == drive)
+ {
+ LOG(E) << "DtaDevOS::identify ERROR - unknown disk type";
+ return;
+ }
+
+ drive->identify(disk_info);
+}
+
+void DtaDevOS::osmsSleep(uint32_t ms)
+{
+ usleep(ms * 1000); //convert to microseconds
+ return;
+}
+
+int DtaDevOS::diskScan()
+{
+ DIR *dir;
+ struct dirent *dirent;
+ DtaDev * d;
+ char devname[25];
+ vector devices;
+ string tempstring;
+
+ LOG(D1) << "Entering DtaDevOS:diskScan ";
+ dir = opendir("/dev");
+ if (dir != NULL) {
+ while ((dirent=readdir(dir)) != NULL) {
+ if (fnmatch("da[0-9]", dirent->d_name, 0) == 0 ||
+ fnmatch("da[0-9][0-9]", dirent->d_name, 0) == 0 ||
+ fnmatch("da[0-9][0-9][0-9]", dirent->d_name, 0) == 0 ||
+ fnmatch("ada[0-9]", dirent->d_name, 0) == 0 ||
+ fnmatch("ada[0-9][0-9]", dirent->d_name, 0) == 0 ||
+ fnmatch("ada[0-9][0-9][0-9]", dirent->d_name, 0) == 0 ||
+ fnmatch("nvme[0-9]",dirent->d_name, 0) == 0 ||
+ fnmatch("nvme[0-9][0-9]",dirent->d_name, 0) == 0 ||
+ fnmatch("nvme[0-9][0-9][0-9]",dirent->d_name,0) == 0) {
+ tempstring = dirent->d_name;
+ devices.push_back(tempstring);
+ }
+ }
+ closedir(dir);
+ }
+ std::sort(devices.begin(), devices.end());
+ printf("Scanning for Opal compliant disks\n");
+ for (int i = 0; i < devices.size(); i++) {
+ snprintf(devname, 23, "/dev/%s", devices[i].c_str());
+ printf("%-10s", devname);
+ d = new DtaDevGeneric(devname);
+ if (d->isAnySSC())
+ printf(" %s%s%s%s%s%s%s ", (d->isOpal1() ? "1" : " "),
+ (d->isOpal2() ? "2" : " "), (d->isEprise() ? "E" : " "),
+ (d->isOpalite() ? "L" : " "), (d->isPyrite1() ? "p" : " "),
+ (d->isPyrite2() ? "P" : " "), (d->isRuby1() ? "r" : " "));
+ else
+ printf("%s", " No ");
+
+ printf("%s %s\n", d->getModelNum(), d->getFirmwareRev());
+ delete d;
+ }
+ printf("No more disks present ending scan\n");
+ LOG(D1) << "Exiting DtaDevOS::scanDisk ";
+ return 0;
+}
+
+/** Close the device reference so this object can be delete. */
+DtaDevOS::~DtaDevOS()
+{
+ LOG(D1) << "Destroying DtaDevOS";
+ if (NULL != drive)
+ delete drive;
+}
diff --git a/freebsd/DtaDevOS.h b/freebsd/DtaDevOS.h
new file mode 100644
index 00000000..f78ef139
--- /dev/null
+++ b/freebsd/DtaDevOS.h
@@ -0,0 +1,64 @@
+/* C:B**************************************************************************
+This software is Copyright 2016-2018 Alexander Motin
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+#pragma once
+#include "DtaDev.h"
+#include "DtaDevFreeBSDDrive.h"
+
+/** FreeBSD specific implementation of DtaDevOS.
+ */
+class DtaDevOS : public DtaDev {
+public:
+ /** Default constructor */
+ DtaDevOS();
+ /** Destructor */
+ ~DtaDevOS();
+ /** OS specific initialization.
+ * This function should perform the necessary authority and environment checking
+ * to allow proper functioning of the program, open the device, perform an ATA
+ * identify, add the fields from the identify response to the disk info structure
+ * and if the device is an ATA device perform a call to Discovery0() to complete
+ * the disk_info structure
+ * @param devref character representation of the device is standard OS lexicon
+ */
+ void init(const char * devref);
+ /** OS specific method to send an ATA command to the device
+ * @param cmd ATA command to be sent to the device
+ * @param protocol security protocol to be used in the command
+ * @param comID communications ID to be used
+ * @param buffer input/output buffer
+ * @param bufferlen length of the input/output buffer
+ */
+ uint8_t sendCmd(ATACOMMAND cmd, uint8_t protocol, uint16_t comID,
+ void * buffer, uint32_t bufferlen);
+ /** A static class to scan for supported drives */
+ static int diskScan();
+protected:
+ /** OS specific command to Wait for specified number of milliseconds
+ * @param ms number of milliseconds to wait
+ */
+ void osmsSleep(uint32_t ms);
+ /** OS specific routine to send an ATA identify to the device */
+ void identify(OPAL_DiskInfo& disk_info);
+ /** return drive size in bytes */
+ unsigned long long getSize();
+ int fd; /**< FreeBSD handle for the device */
+private:
+ DtaDevFreeBSDDrive *drive;
+};
diff --git a/freebsd/GitVersion.sh b/freebsd/GitVersion.sh
new file mode 100755
index 00000000..dfbb967d
--- /dev/null
+++ b/freebsd/GitVersion.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+GITVER=`git describe --dirty`
+echo "#define GIT_VERSION " \"$GITVER\"
diff --git a/freebsd/os.h b/freebsd/os.h
new file mode 100644
index 00000000..385ce796
--- /dev/null
+++ b/freebsd/os.h
@@ -0,0 +1,35 @@
+/* C:B**************************************************************************
+This software is Copyright 2016-2018 Alexander Motin
+
+This file is part of sedutil.
+
+sedutil is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+sedutil is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with sedutil. If not, see .
+
+ * C:E********************************************************************** */
+#pragma once
+#include
+#include
+#include
+#include
+#include
+#include
+#include "DtaConstants.h"
+#include "log.h"
+// Why can't I find these??
+#define TRUE 1
+#define FALSE 0
+// a few OS specific methods that need to be worked out
+#define SNPRINTF snprintf
+#define DEVICEMASK snprintf(devname,23,"/dev/da%d",i)
+#define DEVICEEXAMPLE "/dev/da0"
diff --git a/linux/CLI/nbproject/Makefile-Debug_i686.mk b/linux/CLI/nbproject/Makefile-Debug_i686.mk
index e3b0cca5..3b0f299e 100644
--- a/linux/CLI/nbproject/Makefile-Debug_i686.mk
+++ b/linux/CLI/nbproject/Makefile-Debug_i686.mk
@@ -43,6 +43,10 @@ OBJECTFILES= \
${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal1.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal2.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpalite.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite1.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite2.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevRuby1.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaHashPwd.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaHexDump.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaOptions.o \
@@ -123,6 +127,26 @@ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal2.o: ../../Common/DtaDevOpal2.cpp
${RM} "$@.d"
$(COMPILE.cc) -g -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal2.o ../../Common/DtaDevOpal2.cpp
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpalite.o: ../../Common/DtaDevOpalite.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -g -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpalite.o ../../Common/DtaDevOpalite.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite1.o: ../../Common/DtaDevPyrite1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -g -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite1.o ../../Common/DtaDevPyrite1.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite2.o: ../../Common/DtaDevPyrite2.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -g -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite2.o ../../Common/DtaDevPyrite2.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevRuby1.o: ../../Common/DtaDevRuby1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -g -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevRuby1.o ../../Common/DtaDevRuby1.cpp
+
${OBJECTDIR}/_ext/7a2a93ab/DtaHashPwd.o: ../../Common/DtaHashPwd.cpp
${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
${RM} "$@.d"
diff --git a/linux/CLI/nbproject/Makefile-Debug_x86_64.mk b/linux/CLI/nbproject/Makefile-Debug_x86_64.mk
index 8114c8ea..05d9bdc0 100644
--- a/linux/CLI/nbproject/Makefile-Debug_x86_64.mk
+++ b/linux/CLI/nbproject/Makefile-Debug_x86_64.mk
@@ -43,6 +43,10 @@ OBJECTFILES= \
${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal1.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal2.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpalite.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite1.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite2.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevRuby1.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaHashPwd.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaHexDump.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaOptions.o \
@@ -123,6 +127,26 @@ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal2.o: ../../Common/DtaDevOpal2.cpp
${RM} "$@.d"
$(COMPILE.cc) -g -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal2.o ../../Common/DtaDevOpal2.cpp
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpalite.o: ../../Common/DtaDevOpalite.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpalite.o ../../Common/DtaDevOpalite.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite1.o: ../../Common/DtaDevPyrite1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite1.o ../../Common/DtaDevPyrite1.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite2.o: ../../Common/DtaDevPyrite2.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite2.o ../../Common/DtaDevPyrite2.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevRuby1.o: ../../Common/DtaDevRuby1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -g -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevRuby1.o ../../Common/DtaDevRuby1.cpp
+
${OBJECTDIR}/_ext/7a2a93ab/DtaHashPwd.o: ../../Common/DtaHashPwd.cpp
${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
${RM} "$@.d"
diff --git a/linux/CLI/nbproject/Makefile-Release_i686.mk b/linux/CLI/nbproject/Makefile-Release_i686.mk
index 8d753dad..39893cbd 100644
--- a/linux/CLI/nbproject/Makefile-Release_i686.mk
+++ b/linux/CLI/nbproject/Makefile-Release_i686.mk
@@ -43,6 +43,10 @@ OBJECTFILES= \
${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal1.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal2.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpalite.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite1.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite2.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevRuby1.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaHashPwd.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaHexDump.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaOptions.o \
@@ -123,6 +127,26 @@ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal2.o: ../../Common/DtaDevOpal2.cpp
${RM} "$@.d"
$(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal2.o ../../Common/DtaDevOpal2.cpp
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpalite.o: ../../Common/DtaDevOpalite.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpalite.o ../../Common/DtaDevOpalite.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite1.o: ../../Common/DtaDevPyrite1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite1.o ../../Common/DtaDevPyrite1.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite2.o: ../../Common/DtaDevPyrite2.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite2.o ../../Common/DtaDevPyrite2.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevRuby1.o: ../../Common/DtaDevRuby1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevRuby1.o ../../Common/DtaDevRuby1.cpp
+
${OBJECTDIR}/_ext/7a2a93ab/DtaHashPwd.o: ../../Common/DtaHashPwd.cpp
${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
${RM} "$@.d"
diff --git a/linux/CLI/nbproject/Makefile-Release_x86_64.mk b/linux/CLI/nbproject/Makefile-Release_x86_64.mk
index 7023911c..8acd75d1 100644
--- a/linux/CLI/nbproject/Makefile-Release_x86_64.mk
+++ b/linux/CLI/nbproject/Makefile-Release_x86_64.mk
@@ -43,6 +43,10 @@ OBJECTFILES= \
${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal1.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal2.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpalite.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite1.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite2.o \
+ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevRuby1.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaHashPwd.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaHexDump.o \
${OBJECTDIR}/_ext/7a2a93ab/DtaOptions.o \
@@ -123,6 +127,26 @@ ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal2.o: ../../Common/DtaDevOpal2.cpp
${RM} "$@.d"
$(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpal2.o ../../Common/DtaDevOpal2.cpp
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpalite.o: ../../Common/DtaDevOpalite.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevOpalite.o ../../Common/DtaDevOpalite.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite1.o: ../../Common/DtaDevPyrite1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite1.o ../../Common/DtaDevPyrite1.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite2.o: ../../Common/DtaDevPyrite2.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevPyrite2.o ../../Common/DtaDevPyrite2.cpp
+
+${OBJECTDIR}/_ext/7a2a93ab/DtaDevRuby1.o: ../../Common/DtaDevRuby1.cpp
+ ${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
+ ${RM} "$@.d"
+ $(COMPILE.cc) -Werror -I.. -I../../Common -I../../Common/pbkdf2 -std=c++11 -MMD -MP -MF "$@.d" -o ${OBJECTDIR}/_ext/7a2a93ab/DtaDevRuby1.o ../../Common/DtaDevRuby1.cpp
+
${OBJECTDIR}/_ext/7a2a93ab/DtaHashPwd.o: ../../Common/DtaHashPwd.cpp
${MKDIR} -p ${OBJECTDIR}/_ext/7a2a93ab
${RM} "$@.d"
diff --git a/linux/CLI/nbproject/configurations.xml b/linux/CLI/nbproject/configurations.xml
index c770abf1..0ebcd23c 100644
--- a/linux/CLI/nbproject/configurations.xml
+++ b/linux/CLI/nbproject/configurations.xml
@@ -27,6 +27,10 @@
../../Common/DtaDevOpal.h
../../Common/DtaDevOpal1.h
../../Common/DtaDevOpal2.h
+ ../../Common/DtaDevOpalite.h
+ ../../Common/DtaDevPyrite1.h
+ ../../Common/DtaDevPyrite2.h
+ ../../Common/DtaDevRuby1.h
../../Common/DtaEndianFixup.h
../../Common/DtaHashPwd.h
../../Common/DtaHexDump.h
@@ -63,6 +67,10 @@
../../Common/DtaDevOpal.cpp
../../Common/DtaDevOpal1.cpp
../../Common/DtaDevOpal2.cpp
+ ../../Common/DtaDevOpalite.cpp
+ ../../Common/DtaDevPyrite1.cpp
+ ../../Common/DtaDevPyrite2.cpp
+ ../../Common/DtaDevRuby1.cpp
../../Common/DtaHashPwd.cpp
../../Common/DtaHexDump.cpp
../../Common/DtaOptions.cpp
@@ -170,6 +178,22 @@
-
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
-
-
@@ -319,6 +343,22 @@
-
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
-
-
@@ -462,6 +502,22 @@
-
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
-
-
@@ -611,6 +667,22 @@
-
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
+ -
+
-
-
diff --git a/linux/DtaDevLinuxNvme.cpp b/linux/DtaDevLinuxNvme.cpp
index 735c4fd8..1a206563 100755
--- a/linux/DtaDevLinuxNvme.cpp
+++ b/linux/DtaDevLinuxNvme.cpp
@@ -146,6 +146,17 @@ void DtaDevLinuxNvme::identify(OPAL_DiskInfo& disk_info)
return;
}
+bool DtaDevLinuxNvme::isNVMe()
+{
+ /*
+ * NVME_IOCTL_ID returns dev ns-id which should be always greater than 0.
+ * For SCSI, we should get -1.
+ */
+ if (ioctl(fd, NVME_IOCTL_ID) > 0)
+ return true;
+ return false;
+}
+
/** Close the device reference so this object can be delete. */
DtaDevLinuxNvme::~DtaDevLinuxNvme()
{
diff --git a/linux/DtaDevLinuxNvme.h b/linux/DtaDevLinuxNvme.h
index 3ea6874d..f5b41d67 100755
--- a/linux/DtaDevLinuxNvme.h
+++ b/linux/DtaDevLinuxNvme.h
@@ -59,5 +59,7 @@ class DtaDevLinuxNvme: public DtaDevLinuxDrive{
void * buffer, uint32_t bufferlen);
/** NVMe specific routine to send an identify to the device */
void identify(OPAL_DiskInfo& disk_info);
+ /** Routine to check NVMe dev type without going to device */
+ bool isNVMe();
int fd; /**< Linux handle for the device */
};
diff --git a/linux/DtaDevLinuxSata.cpp b/linux/DtaDevLinuxSata.cpp
index fa71bd3e..e1015049 100644
--- a/linux/DtaDevLinuxSata.cpp
+++ b/linux/DtaDevLinuxSata.cpp
@@ -162,19 +162,28 @@ uint8_t DtaDevLinuxSata::sendCmd(ATACOMMAND cmd, uint8_t protocol, uint16_t comI
/*
* Do the IO
*/
- if (ioctl(fd, SG_IO, &sg) < 0) {
- LOG(D4) << "cdb after ";
- IFLOG(D4) DtaHexDump(cdb, sizeof (cdb));
- LOG(D4) << "sense after ";
- IFLOG(D4) DtaHexDump(sense, sizeof (sense));
- return 0xff;
+ if (ioctl(fd, SG_IO, &sg) < 0) {
+ LOG(D4) << "SG_IO ioctl error: " << strerror(errno);
+ return 0xff;
+ }
+ if ((sg.info & SG_INFO_OK_MASK) != SG_INFO_OK) {
+ if (sg.sb_len_wr > 0) {
+ LOG(D4) << "sense data";
+ IFLOG(D4) DtaHexDump(sense, sizeof (sense));
+ }
+ if (sg.masked_status) {
+ LOG(D4) << "SCSI status: " << std::hex << (u_int)sg.status;
+ }
+ if (sg.host_status) {
+ LOG(D4) << "host_status: " << std::hex << sg.host_status;
+ }
+ if (sg.driver_status) {
+ LOG(D4) << "driver_status: " << std::hex << sg.driver_status;
+ }
+ if (sg.host_status) {
+ return 0xff;
+ }
}
- // LOG(D4) << "cdb after ";
- // IFLOG(D4) hexDump(cdb, sizeof (cdb));
- // LOG(D4) << "sg after ";
- // IFLOG(D4) hexDump(&sg, sizeof (sg));
- // LOG(D4) << "sense after ";
- // IFLOG(D4) hexDump(sense, sizeof (sense));
if (!((0x00 == sense[0]) && (0x00 == sense[1])))
if (!((0x72 == sense[0]) && (0x0b == sense[1]))) return 0xff; // not ATA response
return (sense[11]);
@@ -240,21 +249,32 @@ void DtaDevLinuxSata::identify(OPAL_DiskInfo& disk_info)
/*
* Do the IO
*/
- if (ioctl(fd, SG_IO, &sg) < 0) {
- LOG(D4) << "cdb after ";
- IFLOG(D4) DtaHexDump(cdb, sizeof (cdb));
- LOG(D4) << "sense after ";
- IFLOG(D4) DtaHexDump(sense, sizeof (sense));
- disk_info.devType = DEVICE_TYPE_OTHER;
- identify_SAS(&disk_info);
- return;
+ if (ioctl(fd, SG_IO, &sg) < 0) {
+ LOG(D4) << "SG_IO ioctl error: " << strerror(errno);
+ disk_info.devType = DEVICE_TYPE_OTHER;
+ free(buffer);
+ identify_SAS(&disk_info);
+ return;
+ }
+ if ((sg.info & SG_INFO_OK_MASK) != SG_INFO_OK) {
+ if (sg.sb_len_wr > 0) {
+ LOG(D4) << "sense data";
+ IFLOG(D4) DtaHexDump(sense, sizeof (sense));
+ }
+ if (sg.masked_status) {
+ LOG(D4) << "SCSI status: " << std::hex << (u_int)sg.status;
+ }
+ if (sg.host_status) {
+ LOG(D4) << "host_status: " << std::hex << sg.host_status;
+ }
+ if (sg.driver_status) {
+ LOG(D4) << "driver_status: " << std::hex << sg.driver_status;
+ }
+ disk_info.devType = DEVICE_TYPE_OTHER;
+ free(buffer);
+ identify_SAS(&disk_info);
+ return;
}
- // LOG(D4) << "cdb after ";
- // IFLOG(D4) hexDump(cdb, sizeof (cdb));
- // LOG(D4) << "sg after ";
- // IFLOG(D4) hexDump(&sg, sizeof (sg));
- // LOG(D4) << "sense after ";
- // IFLOG(D4) hexDump(sense, sizeof (sense));
ifstream kopts;
kopts.open("/sys/module/libata/parameters/allow_tpm", ios::in);
@@ -269,11 +289,15 @@ void DtaDevLinuxSata::identify(OPAL_DiskInfo& disk_info)
kopts.close();
}
- if (!(memcmp(nullz.data(), buffer, 512))) {
- disk_info.devType = DEVICE_TYPE_OTHER;
- return;
- }
IDENTIFY_RESPONSE * id = (IDENTIFY_RESPONSE *) buffer;
+ if ((id->tcg & 0xc000) != 0x4000 || (id->tcg & 0x0001) == 0) {
+ LOG(D4) << "Trusted Computing feature set is not supported: "
+ << std::hex << id->tcg;
+ disk_info.devType = DEVICE_TYPE_OTHER;
+ free(buffer);
+ return;
+ }
+
// disk_info->devType = id->devType;
disk_info.devType = DEVICE_TYPE_ATA;
// memcpy(disk_info.serialNum, id->serialNum, sizeof (disk_info.serialNum));
@@ -354,29 +378,34 @@ uint8_t DtaDevLinuxSata::sendCmd_SAS(ATACOMMAND cmd, uint8_t protocol, uint16_t
sg.pack_id = 0;
sg.usr_ptr = NULL;
- // execute I/O
- if (ioctl(fd, SG_IO, &sg) < 0) {
- LOG(D4) << "cdb after ";
- IFLOG(D4) DtaHexDump(cdb, sizeof (cdb));
- LOG(D4) << "sense after ";
- IFLOG(D4) DtaHexDump(sense, sizeof (sense));
- return 0xff;
- }
-
- // check for successful target completion
- if (sg.masked_status != GOOD)
- {
- LOG(D4) << "cdb after ";
- IFLOG(D4) DtaHexDump(cdb, sizeof (cdb));
- LOG(D4) << "sense after ";
- IFLOG(D4) DtaHexDump(sense, sizeof (sense));
- return 0xff;
- }
+ // execute I/O
+ if (ioctl(fd, SG_IO, &sg) < 0) {
+ LOG(D4) << "SG_IO ioctl error: " << strerror(errno);
+ return 0xff;
+ }
+
+ // check for successful target completion
+ if ((sg.info & SG_INFO_OK_MASK) != SG_INFO_OK) {
+ if (sg.sb_len_wr > 0) {
+ LOG(D4) << "sense data";
+ IFLOG(D4) DtaHexDump(sense, sizeof (sense));
+ }
+ if (sg.masked_status) {
+ LOG(D4) << "SCSI status: " << std::hex << (u_int)sg.status;
+ }
+ if (sg.host_status) {
+ LOG(D4) << "host_status: " << std::hex << sg.host_status;
+ }
+ if (sg.driver_status) {
+ LOG(D4) << "driver_status: " << std::hex << sg.driver_status;
+ }
+ return 0xff;
+ }
+
+ // success
+ return 0x00;
+}
- // success
- return 0x00;
- }
-
static void safecopy(uint8_t * dst, size_t dstsize, uint8_t * src, size_t srcsize)
{
const size_t size = min(dstsize, srcsize);
@@ -417,28 +446,33 @@ void DtaDevLinuxSata::identify_SAS(OPAL_DiskInfo *disk_info)
sg.pack_id = 0;
sg.usr_ptr = NULL;
- // execute I/O
- if (ioctl(fd, SG_IO, &sg) < 0) {
- LOG(D4) << "cdb after ";
- IFLOG(D4) DtaHexDump(cdb, sizeof (cdb));
- LOG(D4) << "sense after ";
- IFLOG(D4) DtaHexDump(sense, sizeof (sense));
- disk_info->devType = DEVICE_TYPE_OTHER;
- free(buffer);
- return;
- }
-
- // check for successful target completion
- if (sg.masked_status != GOOD)
- {
- LOG(D4) << "cdb after ";
- IFLOG(D4) DtaHexDump(cdb, sizeof (cdb));
- LOG(D4) << "sense after ";
- IFLOG(D4) DtaHexDump(sense, sizeof (sense));
- disk_info->devType = DEVICE_TYPE_OTHER;
- free(buffer);
- return;
- }
+ // execute I/O
+ if (ioctl(fd, SG_IO, &sg) < 0) {
+ LOG(D4) << "SG_IO ioctl error: " << strerror(errno);
+ disk_info->devType = DEVICE_TYPE_OTHER;
+ free(buffer);
+ return;
+ }
+
+ // check for successful target completion
+ if ((sg.info & SG_INFO_OK_MASK) != SG_INFO_OK) {
+ if (sg.sb_len_wr > 0) {
+ LOG(D4) << "sense data";
+ IFLOG(D4) DtaHexDump(sense, sizeof (sense));
+ }
+ if (sg.masked_status) {
+ LOG(D4) << "SCSI status: " << std::hex << (u_int)sg.status;
+ }
+ if (sg.host_status) {
+ LOG(D4) << "host_status: " << std::hex << sg.host_status;
+ }
+ if (sg.driver_status) {
+ LOG(D4) << "driver_status: " << std::hex << sg.driver_status;
+ }
+ disk_info->devType = DEVICE_TYPE_OTHER;
+ free(buffer);
+ return;
+ }
// response is a standard INQUIRY (at least 36 bytes)
auto resp = (CScsiCmdInquiry_StandardData *) buffer;
@@ -447,10 +481,6 @@ void DtaDevLinuxSata::identify_SAS(OPAL_DiskInfo *disk_info)
if (sg.dxfer_len - sg.resid != sizeof(CScsiCmdInquiry_StandardData)
|| resp->m_PeripheralDeviceType != 0x0)
{
- LOG(D4) << "cdb after ";
- IFLOG(D4) DtaHexDump(cdb, sizeof (cdb));
- LOG(D4) << "sense after ";
- IFLOG(D4) DtaHexDump(sense, sizeof (sense));
disk_info->devType = DEVICE_TYPE_OTHER;
free(buffer);
return;
diff --git a/linux/DtaDevOS.cpp b/linux/DtaDevOS.cpp
index 5261e736..1f63122e 100644
--- a/linux/DtaDevOS.cpp
+++ b/linux/DtaDevOS.cpp
@@ -40,6 +40,7 @@ along with sedutil. If not, see .
#include "DtaDevGeneric.h"
using namespace std;
+uint8_t g_force_dev = FORCE_DEV_NONE;
/** The Device class represents a Linux generic storage device.
* At initialization we determine if we map to the NVMe or SATA derived class
@@ -56,28 +57,44 @@ DtaDevOS::DtaDevOS()
void DtaDevOS::init(const char * devref)
{
LOG(D1) << "DtaDevOS::init " << devref;
+ DtaDevLinuxNvme *nvmeDrive = new DtaDevLinuxNvme();
+ bool drive_init = false;
memset(&disk_info, 0, sizeof(OPAL_DiskInfo));
dev = devref;
- if (!strncmp(devref, "/dev/nvme", 9))
+ if (g_force_dev == FORCE_DEV_NVME)
{
-// DtaDevLinuxNvme *NvmeDrive = new DtaDevLinuxNvme();
- drive = new DtaDevLinuxNvme();
+ drive = nvmeDrive;
+ }
+ else if (g_force_dev == FORCE_DEV_SCSI)
+ {
+ delete nvmeDrive;
+ drive = new DtaDevLinuxSata();
+ }
+ else if (nvmeDrive->init(devref) && nvmeDrive->isNVMe())
+ {
+ drive_init = true;
+ drive = nvmeDrive;
+ }
+ else if (!strncmp(devref, "/dev/nvme", 9))
+ {
+ drive = nvmeDrive;
}
else if (!strncmp(devref, "/dev/s", 6))
{
-// DtaDevLinuxSata *SataDrive = new DtaDevLinuxSata();
+ delete nvmeDrive;
drive = new DtaDevLinuxSata();
}
else
{
+ delete nvmeDrive;
LOG(E) << "DtaDevOS::init ERROR - unknown drive type";
isOpen = FALSE;
return;
}
- if (drive->init(devref))
+ if (drive_init || drive->init(devref))
{
isOpen = TRUE;
drive->identify(disk_info);
@@ -135,9 +152,12 @@ int DtaDevOS::diskScan()
if(dir!=NULL)
{
while((dirent=readdir(dir))!=NULL) {
- if((!fnmatch("sd[a-z]",dirent->d_name,0)) ||
+ if((!fnmatch("sd[a-z]",dirent->d_name,0)) ||
+ (!fnmatch("sd[a-z][a-z]",dirent->d_name,0)) ||
+ (!fnmatch("sd[a-z][a-z][a-z]",dirent->d_name,0)) ||
(!fnmatch("nvme[0-9]",dirent->d_name,0)) ||
- (!fnmatch("nvme[0-9][0-9]",dirent->d_name,0))
+ (!fnmatch("nvme[0-9][0-9]",dirent->d_name,0)) ||
+ (!fnmatch("nvme[0-9][0-9][0-9]",dirent->d_name,0))
) {
tempstring = dirent->d_name;
devices.push_back(tempstring);
@@ -152,10 +172,12 @@ int DtaDevOS::diskScan()
printf("%-10s", devname);
d = new DtaDevGeneric(devname);
if (d->isAnySSC())
- printf(" %s%s%s ", (d->isOpal1() ? "1" : " "),
- (d->isOpal2() ? "2" : " "), (d->isEprise() ? "E" : " "));
+ printf(" %s%s%s%s%s%s%s ", (d->isOpal1() ? "1" : " "),
+ (d->isOpal2() ? "2" : " "), (d->isEprise() ? "E" : " "),
+ (d->isOpalite() ? "L" : " "), (d->isPyrite1() ? "p" : " "),
+ (d->isPyrite2() ? "P" : " "), (d->isRuby1() ? "r" : " "));
else
- printf("%s", " No ");
+ printf("%s", " No ");
printf("%s %s\n",d->getModelNum(),d->getFirmwareRev());
delete d;
diff --git a/windows/CLI/CLI.vcxproj b/windows/CLI/CLI.vcxproj
index 767fe2fd..0233685a 100644
--- a/windows/CLI/CLI.vcxproj
+++ b/windows/CLI/CLI.vcxproj
@@ -28,6 +28,10 @@
+
+
+
+
@@ -60,6 +64,10 @@
+
+
+
+
diff --git a/windows/CLI/CLI.vcxproj.filters b/windows/CLI/CLI.vcxproj.filters
index bb6a0044..fde2fd0c 100644
--- a/windows/CLI/CLI.vcxproj.filters
+++ b/windows/CLI/CLI.vcxproj.filters
@@ -54,6 +54,18 @@
Header Files
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
Header Files
@@ -134,6 +146,18 @@
Source Files
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
Source Files
diff --git a/windows/DtaDevOS.cpp b/windows/DtaDevOS.cpp
index 4d4e769f..1733ff89 100644
--- a/windows/DtaDevOS.cpp
+++ b/windows/DtaDevOS.cpp
@@ -153,10 +153,12 @@ int DtaDevOS::diskScan()
if (d->isPresent()) {
printf("%s", devname);
if (d->isAnySSC())
- printf(" %s%s%s ", (d->isOpal1() ? "1" : " "),
- (d->isOpal2() ? "2" : " "), (d->isEprise() ? "E" : " "));
+ printf(" %s%s%s%s%s%s%s ", (d->isOpal1() ? "1" : " "),
+ (d->isOpal2() ? "2" : " "), (d->isEprise() ? "E" : " "),
+ (d->isOpalite() ? "L" : " "), (d->isPyrite1() ? "p" : " "),
+ (d->isPyrite2() ? "P" : " "), (d->isRuby1() ? "r" : " "));
else
- printf("%s", " No ");
+ printf("%s", " No ");
cout << d->getModelNum() << " " << d->getFirmwareRev() << std::endl;
if (MAX_DISKS == i) {
LOG(I) << MAX_DISKS << " disks, really?";