1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
let string_replace old_value new_value s =
Str.global_replace (Str.regexp_string old_value) new_value s
let adjust_host endpoint =
let azure_end = ".documents.azure.com" in
if String.length endpoint > String.length azure_end then
let start =
String.sub endpoint
(String.length endpoint - String.length azure_end)
(String.length azure_end)
in
if String.equal start azure_end then endpoint else endpoint ^ azure_end
else endpoint ^ azure_end
let authorization_token_using_master_key verb resource_type resource_id date
master_key =
let key = Base64.decode_exn master_key in
let text =
String.lowercase_ascii verb
^ "\n"
^ String.lowercase_ascii resource_type
^ "\n" ^ resource_id ^ "\n"
^ String.lowercase_ascii date
^ "\n" ^ "" ^ "\n"
in
let body = Bytes.of_string text in
let signature =
let hash = Cryptokit.MAC.hmac_sha256 key in
hash#add_substring body 0 (Bytes.length body);
Base64.encode_exn hash#result
in
let master_token = "master" in
let token_version = "1.0" in
let result =
Uri.pct_encode ~component:`Userinfo
("type=" ^ master_token ^ "&ver=" ^ token_version ^ "&sig=" ^ signature)
in
result |> string_replace "%3D" "%3d" |> string_replace "%2B" "%2b"
|> string_replace "%2F" "%2f"
let authorization_token_using_resource_token token =
Uri.pct_encode ~component:`Userinfo token
|> string_replace "%3D" "%3d" |> string_replace "%2B" "%2b"
|> string_replace "%2F" "%2f"