size_t der_sizeof_RecoveryKeyBag(SOSRecoveryKeyBagRef RecoveryKeyBag, CFErrorRef *error) { size_t result = 0; if(RecoveryKeyBag && RecoveryKeyBag->recoveryKeyBag && RecoveryKeyBag->accountDSID && RecoveryKeyBag->generation) { size_t partSize = der_sizeof_string(RecoveryKeyBag->accountDSID, NULL); partSize += SOSGenCountGetDEREncodedSize(RecoveryKeyBag->generation, NULL); partSize += ccder_sizeof_uint64(RecoveryKeyBag->rkbVersion); partSize += der_sizeof_data(RecoveryKeyBag->recoveryKeyBag, NULL); result = ccder_sizeof(CCDER_CONSTRUCTED_SEQUENCE, partSize); } else { SOSCreateError(kSOSErrorEncodeFailure, CFSTR("Null RecoveryKeyBag"), NULL, error); } return result; }
static size_t SOSCoderGetDEREncodedSize(SOSCoderRef coder, CFErrorRef *error) { size_t encoded_size = 0; CFMutableDataRef otr_state = sessSerialized(coder, error); if (otr_state) { size_t data_size = der_sizeof_data(otr_state, error); size_t waiting_size = der_sizeof_bool(coder->waitingForDataPacket); size_t pending_size = der_sizeof_optional_data(coder->pendingResponse); if ((data_size != 0) && (waiting_size != 0)) { encoded_size = ccder_sizeof(CCDER_CONSTRUCTED_SEQUENCE, data_size + waiting_size + pending_size); } CFReleaseSafe(otr_state); } return encoded_size; }
static size_t der_sizeof_optional_data(CFDataRef data) { return data ? der_sizeof_data(data, NULL) : 0; }