• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <new>
18 
19 #include <keymaster/android_keymaster_utils.h>
20 
21 namespace keymaster {
22 
23 // Keymaster never manages enormous buffers, so anything particularly large is bad data or the
24 // result of a bug.  We arbitrarily set a 16 MiB limit.
25 const size_t kMaxDupBufferSize = 16 * 1024 * 1024;
26 
dup_buffer(const void * buf,size_t size)27 uint8_t* dup_buffer(const void* buf, size_t size) {
28     if (size >= kMaxDupBufferSize) return nullptr;
29     uint8_t* retval = new (std::nothrow) uint8_t[size];
30     if (retval) memcpy(retval, buf, size);
31     return retval;
32 }
33 
memcmp_s(const void * p1,const void * p2,size_t length)34 int memcmp_s(const void* p1, const void* p2, size_t length) {
35     const uint8_t* s1 = static_cast<const uint8_t*>(p1);
36     const uint8_t* s2 = static_cast<const uint8_t*>(p2);
37     uint8_t result = 0;
38     for (; length > 0; length--)
39         result |= *s1++ ^ *s2++;
40     return result == 0 ? 0 : 1;
41 }
42 
EllipticKeySizeToCurve(uint32_t key_size_bits,keymaster_ec_curve_t * curve)43 keymaster_error_t EllipticKeySizeToCurve(uint32_t key_size_bits, keymaster_ec_curve_t* curve) {
44     switch (key_size_bits) {
45     default:
46         return KM_ERROR_UNSUPPORTED_KEY_SIZE;
47 
48     case 224:
49         *curve = KM_EC_CURVE_P_224;
50         break;
51 
52     case 256:
53         // 256 bits could be P-256 or Curve25519
54         return KM_ERROR_UNSUPPORTED_KEY_SIZE;
55 
56     case 384:
57         *curve = KM_EC_CURVE_P_384;
58         break;
59 
60     case 521:
61         *curve = KM_EC_CURVE_P_521;
62         break;
63     }
64 
65     return KM_ERROR_OK;
66 }
67 
EcKeySizeToCurve(uint32_t key_size_bits,keymaster_ec_curve_t * curve)68 keymaster_error_t EcKeySizeToCurve(uint32_t key_size_bits, keymaster_ec_curve_t* curve) {
69     switch (key_size_bits) {
70     default:
71         return KM_ERROR_UNSUPPORTED_KEY_SIZE;
72 
73     case 224:
74         *curve = KM_EC_CURVE_P_224;
75         break;
76 
77     case 256:
78         *curve = KM_EC_CURVE_P_256;
79         break;
80 
81     case 384:
82         *curve = KM_EC_CURVE_P_384;
83         break;
84 
85     case 521:
86         *curve = KM_EC_CURVE_P_521;
87         break;
88     }
89 
90     return KM_ERROR_OK;
91 }
92 
EcCurveToKeySize(keymaster_ec_curve_t curve,uint32_t * key_size_bits)93 keymaster_error_t EcCurveToKeySize(keymaster_ec_curve_t curve, uint32_t* key_size_bits) {
94     switch (curve) {
95     default:
96         return KM_ERROR_UNSUPPORTED_EC_CURVE;
97 
98     case KM_EC_CURVE_P_224:
99         *key_size_bits = 224;
100         break;
101 
102     case KM_EC_CURVE_P_256:
103         *key_size_bits = 256;
104         break;
105 
106     case KM_EC_CURVE_P_384:
107         *key_size_bits = 384;
108         break;
109 
110     case KM_EC_CURVE_P_521:
111         *key_size_bits = 521;
112         break;
113 
114     case KM_EC_CURVE_CURVE_25519:
115         *key_size_bits = 256;
116         break;
117     }
118 
119     return KM_ERROR_OK;
120 }
121 
122 }  // namespace keymaster
123