+
+ /* Take fingerprint */
+ silc_hash_make(hash, data, data_len, hval);
+
+ /* Encode babbleprint */
+ out_len = (((hash->hash->hash_len + 1) / 2) + 1) * 6;
+ babbleprint = silc_calloc(out_len, sizeof(*babbleprint));
+ if (!babbleprint) {
+ silc_hash_free(new_hash);
+ return NULL;
+ }
+ babbleprint[0] = co[16];
+
+ check = 1;
+ for (i = 0, k = 1; i < hash->hash->hash_len - 1; i += 2, k += 6) {
+ a = (((hval[i] >> 6) & 3) + check) % 6;
+ b = (hval[i] >> 2) & 15;
+ c = ((hval[i] & 3) + (check / 6)) % 6;
+ d = (hval[i + 1] >> 4) & 15;
+ e = hval[i + 1] & 15;
+
+ check = ((check * 5) + (hval[i] * 7) + hval[i + 1]) % 36;
+
+ babbleprint[k + 0] = vo[a];
+ babbleprint[k + 1] = co[b];
+ babbleprint[k + 2] = vo[c];
+ babbleprint[k + 3] = co[d];
+ babbleprint[k + 4] = '-';
+ babbleprint[k + 5] = co[e];
+ }
+
+ if ((hash->hash->hash_len % 2) != 0) {
+ a = (((hval[i] >> 6) & 3) + check) % 6;
+ b = (hval[i] >> 2) & 15;
+ c = ((hval[i] & 3) + (check / 6)) % 6;
+ babbleprint[k + 0] = vo[a];
+ babbleprint[k + 1] = co[b];
+ babbleprint[k + 2] = vo[c];
+ } else {
+ a = check % 6;
+ b = 16;
+ c = check / 6;
+ babbleprint[k + 0] = vo[a];
+ babbleprint[k + 1] = co[b];
+ babbleprint[k + 2] = vo[c];
+ }
+ babbleprint[k + 3] = co[16];
+
+ if (new_hash != NULL)
+ silc_hash_free(new_hash);
+ return babbleprint;