xref: /aosp_15_r20/external/tink/python/examples/mac/mac_basic.py (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1*e7b1675dSTing-Kang Chang# Copyright 2023 Google LLC
2*e7b1675dSTing-Kang Chang#
3*e7b1675dSTing-Kang Chang# Licensed under the Apache License, Version 2.0 (the "License");
4*e7b1675dSTing-Kang Chang# you may not use this file except in compliance with the License.
5*e7b1675dSTing-Kang Chang# You may obtain a copy of the License at
6*e7b1675dSTing-Kang Chang#
7*e7b1675dSTing-Kang Chang#      http://www.apache.org/licenses/LICENSE-2.0
8*e7b1675dSTing-Kang Chang#
9*e7b1675dSTing-Kang Chang# Unless required by applicable law or agreed to in writing, software
10*e7b1675dSTing-Kang Chang# distributed under the License is distributed on an "AS-IS" BASIS,
11*e7b1675dSTing-Kang Chang# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*e7b1675dSTing-Kang Chang# See the License for the specific language governing permissions and
13*e7b1675dSTing-Kang Chang# limitations under the License.
14*e7b1675dSTing-Kang Chang"""A minimal example for using the AEAD API."""
15*e7b1675dSTing-Kang Chang# [START mac-basic-example]
16*e7b1675dSTing-Kang Changimport tink
17*e7b1675dSTing-Kang Changfrom tink import cleartext_keyset_handle
18*e7b1675dSTing-Kang Changfrom tink import mac
19*e7b1675dSTing-Kang Chang
20*e7b1675dSTing-Kang Chang
21*e7b1675dSTing-Kang Changdef example():
22*e7b1675dSTing-Kang Chang  """Compute and verify MAC tags."""
23*e7b1675dSTing-Kang Chang  # Register the MAC key managers. This is needed to create a Mac primitive
24*e7b1675dSTing-Kang Chang  # later.
25*e7b1675dSTing-Kang Chang  mac.register()
26*e7b1675dSTing-Kang Chang
27*e7b1675dSTing-Kang Chang  # Created with "tinkey create-keyset --key-template=HMAC_SHA256_128BITTAG".
28*e7b1675dSTing-Kang Chang  # Note that this keyset has the secret key information in cleartext.
29*e7b1675dSTing-Kang Chang  keyset = r"""{
30*e7b1675dSTing-Kang Chang      "key": [{
31*e7b1675dSTing-Kang Chang          "keyData": {
32*e7b1675dSTing-Kang Chang              "keyMaterialType":
33*e7b1675dSTing-Kang Chang                  "SYMMETRIC",
34*e7b1675dSTing-Kang Chang              "typeUrl":
35*e7b1675dSTing-Kang Chang                  "type.googleapis.com/google.crypto.tink.HmacKey",
36*e7b1675dSTing-Kang Chang              "value":
37*e7b1675dSTing-Kang Chang                  "EgQIAxAQGiA0LQjovcydWhVQV3k8W9ZSRkd7Ei4Y/TRWApE8guwV4Q=="
38*e7b1675dSTing-Kang Chang          },
39*e7b1675dSTing-Kang Chang          "keyId": 1892702217,
40*e7b1675dSTing-Kang Chang          "outputPrefixType": "TINK",
41*e7b1675dSTing-Kang Chang          "status": "ENABLED"
42*e7b1675dSTing-Kang Chang      }],
43*e7b1675dSTing-Kang Chang      "primaryKeyId": 1892702217
44*e7b1675dSTing-Kang Chang  }"""
45*e7b1675dSTing-Kang Chang
46*e7b1675dSTing-Kang Chang  # Create a keyset handle from the cleartext keyset in the previous
47*e7b1675dSTing-Kang Chang  # step. The keyset handle provides abstract access to the underlying keyset to
48*e7b1675dSTing-Kang Chang  # limit access of the raw key material. WARNING: In practice, it is unlikely
49*e7b1675dSTing-Kang Chang  # you will want to use a cleartext_keyset_handle, as it implies that your key
50*e7b1675dSTing-Kang Chang  # material is passed in cleartext, which is a security risk.
51*e7b1675dSTing-Kang Chang  keyset_handle = cleartext_keyset_handle.read(tink.JsonKeysetReader(keyset))
52*e7b1675dSTing-Kang Chang
53*e7b1675dSTing-Kang Chang  # Retrieve the Mac primitive we want to use from the keyset handle.
54*e7b1675dSTing-Kang Chang  primitive = keyset_handle.primitive(mac.Mac)
55*e7b1675dSTing-Kang Chang
56*e7b1675dSTing-Kang Chang  # Use the primitive to compute the MAC for a message. In this case the primary
57*e7b1675dSTing-Kang Chang  # key of the keyset will be used (which is also the only key in this example).
58*e7b1675dSTing-Kang Chang  data = b'data'
59*e7b1675dSTing-Kang Chang  tag = primitive.compute_mac(data)
60*e7b1675dSTing-Kang Chang
61*e7b1675dSTing-Kang Chang  # Use the primitive to verify the MAC for the message. Verify finds the
62*e7b1675dSTing-Kang Chang  # correct key in the keyset and verifies the MAC. If no key is found or
63*e7b1675dSTing-Kang Chang  # verification fails, it raises an error.
64*e7b1675dSTing-Kang Chang  primitive.verify_mac(tag, data)
65*e7b1675dSTing-Kang Chang  # [END mac-basic-example]
66