-/********************************************************
-* prvs: Get last three digits of days since Jan 1, 1970 *
-********************************************************/
-
-/* This is needed to implement the "prvs" BATV reverse
- path signing scheme
-
-Argument: integer "days" offset to add or substract to
- or from the current number of days.
-
-Returns: pointer to string containing the last three
- digits of the number of days since Jan 1, 1970,
- modified by the offset argument, NULL if there
- was an error in the conversion.
-
-*/
-
-uschar *
-prvs_daystamp(int day_offset)
-{
-uschar *days = store_get(10);
-(void)string_format(days, 10, TIME_T_FMT,
- (((LONGLONG_T)time(NULL))+(day_offset*86400))/86400);
-return (Ustrlen(days) >= 3) ? &days[Ustrlen(days)-3] : NULL;
-}
-
-/********************************************************
-* prvs: perform HMAC-SHA1 computation of prvs bits *
-********************************************************/
-
-/* This is needed to implement the "prvs" BATV reverse
- path signing scheme
-
-Arguments:
- address RFC2821 Address to use
- key The key to use (must be less than 64 characters
- in size)
- key_num Single-digit key number to use. Defaults to
- '0' when NULL.
-
-Returns: pointer to string containing the first three
- bytes of the final hash in hex format, NULL if
- there was an error in the process.
-*/
-
-uschar *
-prvs_hmac_sha1(uschar *address, uschar *key, uschar *key_num, uschar *daystamp)
-{
-uschar *hash_source, *p;
-int size = 0,offset = 0,i;
-sha1 sha1_base;
-void *use_base = &sha1_base;
-uschar innerhash[20];
-uschar finalhash[20];
-uschar innerkey[64];
-uschar outerkey[64];
-uschar *finalhash_hex = store_get(40);
-
-if (key_num == NULL)
- key_num = US"0";
-
-if (Ustrlen(key) > 64)
- return NULL;
-
-hash_source = string_cat(NULL,&size,&offset,key_num,1);
-string_cat(hash_source,&size,&offset,daystamp,3);
-string_cat(hash_source,&size,&offset,address,Ustrlen(address));
-hash_source[offset] = '\0';
-
-DEBUG(D_expand) debug_printf("prvs: hash source is '%s'\n", hash_source);
-
-memset(innerkey, 0x36, 64);
-memset(outerkey, 0x5c, 64);
-
-for (i = 0; i < Ustrlen(key); i++)
- {
- innerkey[i] ^= key[i];
- outerkey[i] ^= key[i];
- }
-
-chash_start(HMAC_SHA1, use_base);
-chash_mid(HMAC_SHA1, use_base, innerkey);
-chash_end(HMAC_SHA1, use_base, hash_source, offset, innerhash);
-
-chash_start(HMAC_SHA1, use_base);
-chash_mid(HMAC_SHA1, use_base, outerkey);
-chash_end(HMAC_SHA1, use_base, innerhash, 20, finalhash);
-
-p = finalhash_hex;
-for (i = 0; i < 3; i++)
- {
- *p++ = hex_digits[(finalhash[i] & 0xf0) >> 4];
- *p++ = hex_digits[finalhash[i] & 0x0f];
- }
-*p = '\0';
-
-return finalhash_hex;
-}