blob: 81f69c7494b98c889f7a0c45fa768a95f1a62fcf [file] [log] [blame]
# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License")
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Tests for tink.testing.cross_language.util.key_util."""
from absl.testing import absltest
from absl.testing import parameterized
from google.protobuf import text_format
from tink.proto import tink_pb2
from util import key_util
KEYSET_A = r"""
primary_key_id: 4223424880
key {
key_data {
type_url: "type.googleapis.com/google.crypto.tink.EcdsaPublicKey"
value: "\" \321L\232\025n*\335.w\023\311\242\035\252^B\024w\305lwa\261K\341\037\2353Yy\3521\032 ^}`\277\341|\364\355\013\035>\275&\3726fu\003\364\373\267\213e\320\030(\234\246b\352\362\311\022\006\030\002\020\002\010\003"
key_material_type: ASYMMETRIC_PUBLIC
}
status: ENABLED
key_id: 4223424880
output_prefix_type: CRUNCHY
}"""
# The same keyset as A, but here EcdsaPublicKey is encoded differently
KEYSET_B = r"""
primary_key_id: 4223424880
key {
key_data {
type_url: "type.googleapis.com/google.crypto.tink.EcdsaPublicKey"
value: "\022\006\010\003\020\002\030\002\032 ^}`\277\341|\364\355\013\035>\275&\3726fu\003\364\373\267\213e\320\030(\234\246b\352\362\311\" \321L\232\025n*\335.w\023\311\242\035\252^B\024w\305lwa\261K\341\037\2353Yy\3521"
key_material_type: ASYMMETRIC_PUBLIC
}
status: ENABLED
key_id: 4223424880
output_prefix_type: CRUNCHY
}
"""
class KeyUtilTest(parameterized.TestCase):
def test_text_format_symmetric_key_template(self):
template = tink_pb2.KeyTemplate(
type_url='type.googleapis.com/google.crypto.tink.AesEaxKey',
value=b'\n\x02\x08\x10\x10\x10',
output_prefix_type=tink_pb2.TINK)
expected = r"""type_url: "type.googleapis.com/google.crypto.tink.AesEaxKey"
# value: [type.googleapis.com/google.crypto.tink.AesEaxKeyFormat] {
# params {
# iv_size: 16
# }
# key_size: 16
# }
value: "\n\002\010\020\020\020"
output_prefix_type: TINK"""
output = key_util.text_format(template)
self.assertEqual(output, expected)
# the output should be in text format, and result in the original template.
self.assertEqual(
text_format.Parse(output, tink_pb2.KeyTemplate()), template)
def test_text_format_asymmetric_key_template(self):
template = tink_pb2.KeyTemplate(
type_url='type.googleapis.com/google.crypto.tink.EcdsaPrivateKey',
value=b'\022\006\010\004\020\003\030\002',
output_prefix_type=tink_pb2.TINK)
expected = r"""type_url: "type.googleapis.com/google.crypto.tink.EcdsaPrivateKey"
# value: [type.googleapis.com/google.crypto.tink.EcdsaKeyFormat] {
# params {
# hash_type: SHA512
# curve: NIST_P384
# encoding: DER
# }
# }
value: "\022\006\010\004\020\003\030\002"
output_prefix_type: TINK"""
output = key_util.text_format(template)
self.assertEqual(output, expected)
# the output should be in text format, and result in the original template.
self.assertEqual(
text_format.Parse(output, tink_pb2.KeyTemplate()), template)
def test_text_format_keyset(self):
key = tink_pb2.Keyset.Key(
key_data=tink_pb2.KeyData(
type_url='type.googleapis.com/google.crypto.tink.AesGcmKey',
value=b'\032\020Z\027\031\027\362\353\020\320\257p\271^\260\022\344\274',
key_material_type=tink_pb2.KeyData.SYMMETRIC),
status=tink_pb2.ENABLED,
key_id=3588418072,
output_prefix_type=tink_pb2.TINK)
keyset = tink_pb2.Keyset(primary_key_id=3588418072)
keyset.key.append(key)
expected = r"""primary_key_id: 3588418072
key {
key_data {
type_url: "type.googleapis.com/google.crypto.tink.AesGcmKey"
# value: [type.googleapis.com/google.crypto.tink.AesGcmKey] {
# version: 0
# key_value: "Z\027\031\027\362\353\020\320\257p\271^\260\022\344\274"
# }
value: "\032\020Z\027\031\027\362\353\020\320\257p\271^\260\022\344\274"
key_material_type: SYMMETRIC
}
status: ENABLED
key_id: 3588418072
output_prefix_type: TINK
}"""
output = key_util.text_format(keyset)
self.assertEqual(output, expected)
# the output should be in text format, and result in the original template.
self.assertEqual(
text_format.Parse(output, tink_pb2.Keyset()), keyset)
def test_compare_tink_messages(self):
"""Tests that all testdata have the expected format, including comments."""
keyset_a = text_format.Parse(KEYSET_A, tink_pb2.Keyset())
keyset_b = text_format.Parse(KEYSET_B, tink_pb2.Keyset())
key_util.assert_tink_proto_equal(self, keyset_a, keyset_b)
keyset_b.primary_key_id = 4223424881
with self.assertRaises(AssertionError):
key_util.assert_tink_proto_equal(self, keyset_a, keyset_b)
if __name__ == '__main__':
absltest.main()