Здравствуйте!

Пытаюсь работать с Thrift (IDL ниже)
struct AuthSalt {
1: required i64 client, /* случайные данные генерируемы клиентом. */
2: required i64 server, /* salt-данные из предыдущего ответа сервера. */
}

struct AuthRequest {
1: required AuthSalt bootstrap,
2: required string who, /* логин пользователя. */
3: required string signature, /* SHA-1 дайджест от слияния bootstrap + password + who + bootstrap. */
}

exception NotAuthorisedException {
1: required string description
}

service Bookworm {
AuthResponse Authenticate( 1: required AuthRequest a, 2: required string locale )
throws ( 1: NotAuthorisedException e )
}
Сгенерировал файлы, теперь пытаюсь работать с сервисом. Проблема в следующем, я не понимаю как получить дайджест.

Для генерации SHA использую: dig = hashlib.sha1(), судя по описанию, то получить дайджест я могу последовательным вызовом dig.update(string).

bw_authsalt = AuthSalt(0,0) #создаем объект, который будем использовать при создании AuthRequest
т.е. реализация подписи представляется мне примерно так:
dig.update(bw_authsalt)
dig.update(password + login)
dig.update(bw_authsalt)
Но метод update на вход получает только строку. Соответственно у меня вопрос, как мне структуру к строке преобразовать правильно, чтобы вызвать метод? На Си этот код выглядит вот так:
SHA_CTX c;
::SHA1_Init(&c);
::SHA1_Update(&c, &bootstrap, sizeof(bootstrap));
::SHA1_Update(&c, password.c_str(), password.size());
::SHA1_Update(&c, who.c_str(), who.size());
::SHA1_Update(&c, &bootstrap, sizeof(bootstrap));
::SHA1_Final(digest, &c);
Это была первая часть проблемы.

Вторая часть проблемы в том, что я решил создать объект без корректного дайджеста и вызвать метод Authenticate - ожидал получить exception NotAuthorisedException, но вывалилось с:

Traceback (most recent call last):
File "./bw_client.py", line 44, in <module>
client.Authenticate(bw_authreq, 'rus')
File "./gen-py/bookworm/Bookworm.py", line 50, in Authenticate
self.send_Authenticate(a, locale)
File "./gen-py/bookworm/Bookworm.py", line 58, in send_Authenticate
args.write(self._oprot)
File "./gen-py/bookworm/Bookworm.py", line 213, in write
self.a.write(oprot)
File "./gen-py/bookworm/ttypes.py", line 161, in write
oprot.writeString(self.digest)
File "/usr/local/lib/python2.6/dist-packages/thrift/protocol/TBinaryProtocol.py", line 122, in writeString
self.writeI32(len(str))
TypeError: object of type '_hashlib.HASH' has no len()
Я нашел, где пишут про мою ошибку: http://notes.alexdong.com/quick-introduction-to-hypertables-thrift-api но не понял как лечить. Подскажите пожалуйста, что не так делаю. В Pythone начинающий совсем. Спасибо.