Thanks Mats, 

I tried the fixes in https://gerrit.iotivity.org/gerrit/#/c/23965/ , end cert 
encoding works with that fix.

I left a comment, and I sure would like to get that patch merged :)

Cheers!
Steve



> On Jan 23, 2018, at 12:23 PM, Mats Wichmann <m...@wichmann.us> wrote:
> 
> On 01/23/2018 12:14 PM, Steve Saunders (CableLabs) wrote:
>> HI All,
>> 
>> I have been working on creating .json configuration files with certificate 
>> info, for example
>> 
>>           {
>>               "credid": 1,
>>               "credusage": "oic.sec.cred.mfgcert",
>>               "subjectuuid": "22222222-2222-2222-2222-222222222222",
>>               "credtype": 8,
>>               "publicdata": {
>>                  "encoding": "oic.sec.encoding.der",
>>                  "data": “308<… bunch of hex …>896"
>>               },
>>               "privatedata": {
>>                  "encoding": "oic.sec.encoding.raw",
>>                  "data": “307<… bunch of hex …>a86"
>>               }
>>            },
>> 
>> I was finding that json2cbor created .dat files for which svrdbeditor could 
>> not make out the certificate information.  In addition, IoTivity could not 
>> decode the cert content either.
>> 
>> Upon further investigation (and assuming that the publicData, privateData, 
>> optionalData in .json files is hex string encoded) json2cbor uses the 
>> following loop to convert hex strings to byte values:
>> 
>> for(size_t i =0, p =0 ; i < jsonObjLen; i+=2, ++p)
>> {
>> snprintf(tmp, 2, "%c%c", jsonPub->valuestring[i], jsonPub->valuestring[i+1]);
>> buf[p] = (char)strtol(tmp, NULL, 16);
>> }
>> 
>> 
>> As best that I can tell this produces improper values.  Lets take the 
>> example of a hex encoding of '30', which translates to a decimal byte value 
>> of 48.  The snprintf statement:
>> 
>> snprintf(tmp, 2, "%c%c", '3', '0');
>> buf[p] = (char)strtol(tmp, NULL, 16);
>> 
>> ... produces tmp as: tmp[0] = '3' , tmp[1] = '\000', and buf[p] of decimal 
>> value 3.
>> 
>> … but it should be tmp[0] = '3' , tmp[1] = '0', and buf[p] of decimal value 
>> 48.
>> 
>> 
>> If this loop is converted to the following, the encoding happens correctly 
>> (i.e. but[p] = decimal 48)
>> 
>> for(size_t i =0, p =0 ; i < jsonObjLen; i+=2, ++p)
>> {
>> tmp[0] = jsonPub->valuestring[i];
>> tmp[1] = jsonPub->valuestring[i+1];
>> tmp[2] = '\0';
>> buf[p] = (char)strtol(tmp, NULL, 16);
>> }
>> 
>> After changing all of the json2cbor loops to the above and generating the 
>> .dat file, now svrdbeditor can decode and present cert info.
>> 
>> So, I created a Jira Ticket, and I can submit a patch, but I just wanted to 
>> have the group comment on this, because it seems like such a fundamental 
>> problem, and I am surprised any cert info in .json files ever worked …. just 
>> want to make sure that I am not missing something.
> 
> 
> turns out there are two separate patches proposing this change... based
> on gcc7 compiler warnings.  now we're happier that there's a good reason
> for it beyond just compiler being pedantic.
> 
> leave a comment here:
> 
> https://gerrit.iotivity.org/gerrit/#/c/23965/
> 
> (the other one is
> 
> https://gerrit.iotivity.org/gerrit/23979
> 
> but I'll probably abandon that one in favor of George's.)
> 
> and once it's in we will pull it to master as well.
> 
> 
> _______________________________________________
> iotivity-dev mailing list
> iotivity-dev@lists.iotivity.org
> https://lists.iotivity.org/mailman/listinfo/iotivity-dev

_______________________________________________
iotivity-dev mailing list
iotivity-dev@lists.iotivity.org
https://lists.iotivity.org/mailman/listinfo/iotivity-dev

Reply via email to