void
checker(char *key, char *lock)
{
    char
        *rawkey,
        *rawlock;
    char
        keytype[BUFFSIZE],
        locktype[BUFFSIZE];

    printf("L %s K %s ", lock, key);

    rawkey = lock_strip_alpha(key, keytype);
    rawlock = lock_strip_alpha(lock, locktype);

    if (!strcmp(keytype, locktype)) {
        if (!strcmp(keytype, "sha1")) {
            if (!sha_verify(rawkey, rawlock))
                printf("sha1 OK\n");
            else
                printf("sha1 no\n");
        }
        else
            printf("unknown\n");
    }
    else
        printf("Mismatch %s %s\n", keytype, locktype);
}
/* 
 * Generate an MD5 cancel lock.
 */
unsigned char *
 md5_lock(char *secret, int seclen, char *message, int msglen)
{
    unsigned char *cankey, *canlock;
    unsigned char hmacbuff[MD5_LENGTH];
    unsigned char junk[MD5_LENGTH];
    MD5_CTX hash_ctx;

    cankey = lock_strip_alpha(md5_key(secret, seclen, message, msglen), junk);

    canlock = (char *) malloc(BUFFSIZE);
    MD5Init(&hash_ctx);
    MD5Update(&hash_ctx, cankey, strlen(cankey));
    MD5Final(hmacbuff, &hash_ctx);
    strcpy(canlock, "md5:");
    (void) b64_ntop(hmacbuff, MD5_LENGTH, canlock + 4, BUFFSIZE);

    return (canlock);
}
/* 
 * Return a stripped cancel lock, that is, with the xx: prefix
 * removed, else NULL on failure.
 * type is set to the lock type, else zero on failure.
 */
unsigned char *
 lock_strip(unsigned char *key, char *type)
{
    return (lock_strip_alpha(key, type));
}