+ /* concatenate the type and the path before hashing */
+ string pathString = std::to_string(type)+cfString(path);
+ CFRef<CFDataRef> data = makeCFData(pathString.c_str(), pathString.size());
+ CFRef<SecGroupTransformRef> group = SecTransformCreateGroupTransform();
+
+ CFRef<SecTransformRef> sha1 = SecDigestTransformCreate(kSecDigestSHA2, 256, &errors);
+ if( errors )
+ {
+ CFError::throwMe();
+ }
+
+ CFRef<SecTransformRef> b64 = SecEncodeTransformCreate(kSecBase64Encoding, &errors);
+ if ( errors )
+ {
+ CFError::throwMe();
+ }
+
+ SecTransformSetAttribute(sha1, kSecTransformInputAttributeName, data, &errors);
+ if ( errors )
+ {
+ CFError::throwMe();
+ }
+
+ SecTransformConnectTransforms(sha1, kSecTransformOutputAttributeName, b64, kSecTransformInputAttributeName, group, &errors);
+ if ( errors )
+ {
+ CFError::throwMe();
+ }
+
+ CFRef<CFDataRef> keyData = (CFDataRef)SecTransformExecute(group, &errors);
+ if ( errors )
+ {
+ CFError::throwMe();
+ }
+
+ return makeCFString(keyData);
+}