Benchmark demonstration program for mbed TLS. The canonical source for this example lives at https://github.com/ARMmbed/mbed-os-example-tls

Mbed TLS Benchmark example on Mbed OS

This application benchmarks the various cryptographic primitives offered by Mbed TLS.

Getting started

Building with Mbed CLI

If you'd like to use Mbed CLI to build this, then you should set up your environment if you have not done so already. For instructions, refer to the main readme. The instructions on this page relate to using the developer.mbed.org Online Compiler

Import the program in to the Online Compiler, select your board from the drop down in the top right hand corner and then compile the application. Once it has built, you can drag and drop the binary onto your device.

Monitoring the application

The output in the terminal window should be similar to this:

terminal output

  SHA-256                  :       1673 Kb/s,         70 cycles/byte
  SHA-512                  :        546 Kb/s,        215 cycles/byte
  AES-CBC-128              :       1428 Kb/s,         82 cycles/byte
  AES-CBC-192              :       1260 Kb/s,         93 cycles/byte
  AES-CBC-256              :       1127 Kb/s,        104 cycles/byte
  AES-GCM-128              :        486 Kb/s,        242 cycles/byte
  AES-GCM-192              :        464 Kb/s,        253 cycles/byte
  AES-GCM-256              :        445 Kb/s,        264 cycles/byte
  AES-CCM-128              :        610 Kb/s,        192 cycles/byte
  AES-CCM-192              :        547 Kb/s,        214 cycles/byte
  AES-CCM-256              :        496 Kb/s,        237 cycles/byte
  CTR_DRBG (NOPR)          :       1139 Kb/s,        102 cycles/byte
  CTR_DRBG (PR)            :        826 Kb/s,        142 cycles/byte
  HMAC_DRBG SHA-256 (NOPR) :        193 Kb/s,        611 cycles/byte
  HMAC_DRBG SHA-256 (PR)   :        170 Kb/s,        695 cycles/byte
  RSA-2048                 :      28 ms/ public
  RSA-2048                 :     953 ms/private
  RSA-4096                 :      93 ms/ public
  RSA-4096                 :    5327 ms/private
  ECDSA-secp384r1          :     451 ms/sign
  ECDSA-secp256r1          :     304 ms/sign
  ECDSA-secp384r1          :     863 ms/verify
  ECDSA-secp256r1          :     594 ms/verify
  ECDHE-secp384r1          :     829 ms/handshake
  ECDHE-secp256r1          :     566 ms/handshake
  ECDHE-Curve25519         :     533 ms/handshake
  ECDH-secp384r1           :     407 ms/handshake
  ECDH-secp256r1           :     281 ms/handshake
  ECDH-Curve25519          :     268 ms/handshake

DONE
Committer:
mbed_official
Date:
Thu Oct 18 12:45:07 2018 +0100
Revision:
78:5f419e0f96dd
Parent:
76:68ac2a548d58
Child:
80:0f7a38bbcebe
Merge pull request #194 from andresag01/iotssl-2430-benchmark-refactor

Refactor benchmark to mitigate memory problems
.
Commit copied from https://github.com/ARMmbed/mbed-os-example-tls

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Janos Follath 0:1f7c5025e59d 1 /*
Janos Follath 0:1f7c5025e59d 2 * Benchmark demonstration program
Janos Follath 0:1f7c5025e59d 3 *
mbed_official 70:72c865037f5d 4 * Copyright (C) 2006-2018, Arm Limited, All Rights Reserved
Janos Follath 0:1f7c5025e59d 5 * SPDX-License-Identifier: Apache-2.0
Janos Follath 0:1f7c5025e59d 6 *
Janos Follath 0:1f7c5025e59d 7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
Janos Follath 0:1f7c5025e59d 8 * not use this file except in compliance with the License.
Janos Follath 0:1f7c5025e59d 9 * You may obtain a copy of the License at
Janos Follath 0:1f7c5025e59d 10 *
Janos Follath 0:1f7c5025e59d 11 * http://www.apache.org/licenses/LICENSE-2.0
Janos Follath 0:1f7c5025e59d 12 *
Janos Follath 0:1f7c5025e59d 13 * Unless required by applicable law or agreed to in writing, software
Janos Follath 0:1f7c5025e59d 14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
Janos Follath 0:1f7c5025e59d 15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Janos Follath 0:1f7c5025e59d 16 * See the License for the specific language governing permissions and
Janos Follath 0:1f7c5025e59d 17 * limitations under the License.
Janos Follath 0:1f7c5025e59d 18 */
Janos Follath 0:1f7c5025e59d 19
Janos Follath 0:1f7c5025e59d 20 #include "mbed.h"
Janos Follath 0:1f7c5025e59d 21
Janos Follath 0:1f7c5025e59d 22 #if !defined(MBEDTLS_CONFIG_FILE)
Janos Follath 0:1f7c5025e59d 23 #include "mbedtls/config.h"
Janos Follath 0:1f7c5025e59d 24 #else
Janos Follath 0:1f7c5025e59d 25 #include MBEDTLS_CONFIG_FILE
mbed_official 78:5f419e0f96dd 26 #endif /* MBEDTLS_CONFIG_FILE */
Janos Follath 0:1f7c5025e59d 27
Janos Follath 0:1f7c5025e59d 28 #include "mbedtls/platform.h"
Janos Follath 0:1f7c5025e59d 29 #include "mbedtls/md4.h"
Janos Follath 0:1f7c5025e59d 30 #include "mbedtls/md5.h"
Janos Follath 0:1f7c5025e59d 31 #include "mbedtls/ripemd160.h"
Janos Follath 0:1f7c5025e59d 32 #include "mbedtls/sha1.h"
Janos Follath 0:1f7c5025e59d 33 #include "mbedtls/sha256.h"
Janos Follath 0:1f7c5025e59d 34 #include "mbedtls/sha512.h"
Janos Follath 0:1f7c5025e59d 35 #include "mbedtls/arc4.h"
Janos Follath 0:1f7c5025e59d 36 #include "mbedtls/des.h"
Janos Follath 0:1f7c5025e59d 37 #include "mbedtls/aes.h"
mbed_official 11:6ccae3ebafd5 38 #include "mbedtls/cmac.h"
Janos Follath 0:1f7c5025e59d 39 #include "mbedtls/blowfish.h"
Janos Follath 0:1f7c5025e59d 40 #include "mbedtls/camellia.h"
Janos Follath 0:1f7c5025e59d 41 #include "mbedtls/gcm.h"
Janos Follath 0:1f7c5025e59d 42 #include "mbedtls/ccm.h"
Janos Follath 0:1f7c5025e59d 43 #include "mbedtls/havege.h"
Janos Follath 0:1f7c5025e59d 44 #include "mbedtls/ctr_drbg.h"
Janos Follath 0:1f7c5025e59d 45 #include "mbedtls/hmac_drbg.h"
Janos Follath 0:1f7c5025e59d 46 #include "mbedtls/rsa.h"
Janos Follath 0:1f7c5025e59d 47 #include "mbedtls/pk.h"
Janos Follath 0:1f7c5025e59d 48 #include "mbedtls/dhm.h"
Janos Follath 0:1f7c5025e59d 49 #include "mbedtls/ecdsa.h"
Janos Follath 0:1f7c5025e59d 50 #include "mbedtls/ecdh.h"
Janos Follath 0:1f7c5025e59d 51 #include "mbedtls/error.h"
Janos Follath 0:1f7c5025e59d 52
mbed_official 76:68ac2a548d58 53 #define RSA_PRIVATE_KEY_2048 \
mbed_official 76:68ac2a548d58 54 "-----BEGIN RSA PRIVATE KEY-----\n" \
mbed_official 76:68ac2a548d58 55 "MIIEogIBAAKCAQEA2dwVr+IMGEtA2/MCP6fA5eb/6B18Bq6e7gw8brNPkm3E6LyR\n" \
mbed_official 76:68ac2a548d58 56 "4DnMJVxZmw3bPDKBDoKzfntkMESi/Yw5UopLtVfjGfWeQWPClqffLZBsZ60BRAsg\n" \
mbed_official 76:68ac2a548d58 57 "/g+ID5tgzxSuxzftypK59uexOVCAm7hCKZHGO3DbI7bLY27j7VAgEP7d/yuaz5Fx\n" \
mbed_official 76:68ac2a548d58 58 "Kl/vu7shqrBoz6ABJVJD3KC8nUiMRUCXRINmxbyUUjA4DnicZv6+xrGKr36r6M8h\n" \
mbed_official 76:68ac2a548d58 59 "VYLa5msKc8WzbnBWzpUsrpb4/r7ML+qp92gdSfVJ8/bLiU7h2C7faDA59uaqrFK9\n" \
mbed_official 76:68ac2a548d58 60 "xmDdx7FaWhGQs3LWW6w1UNgkPS0FDYUslpsnsQIDAQABAoIBAC7IJNwM5V3+IuJY\n" \
mbed_official 76:68ac2a548d58 61 "T35Nzo1PyloUosJokvY5KGz5Ejg2XBdCDu0gXCcVqqQyGIbXrYDpLhQV+RCoXHun\n" \
mbed_official 76:68ac2a548d58 62 "tdN0oQdC5SB47s/J1Uo2qCUHo0+sBd6PqTkFKsl3KxWssk9TQjvCwC412IefMs69\n" \
mbed_official 76:68ac2a548d58 63 "hW+ZvwCanmQP56LleApIr2oW4KLfW8Ry/QfZlua+dizctdN7+H1mWwgZQTY9T27J\n" \
mbed_official 76:68ac2a548d58 64 "6RtGRA5NVkKVPzIHVJfdpKoO7xGg1g06aEbPB/VmGvZaaFWWnaf7uRvFjLZecBLu\n" \
mbed_official 76:68ac2a548d58 65 "QSx2DA/GDjirlDYj99PJb7DtB4xRtKzsyw0o+xapC8w6OtIl/3xFt9moCu2jGrsx\n" \
mbed_official 76:68ac2a548d58 66 "vpjHdfECgYEA7fSACRseIs9gAIVX8wq6gayTpA47DHYWAD6IQfIj35SJ+AgsvbFF\n" \
mbed_official 76:68ac2a548d58 67 "4AmrwDhcJVPmDy1N4nLBfyGAMt/2CfiYkdkW6QFX/ULRMMBL/G7kWV8hYQDICB2g\n" \
mbed_official 76:68ac2a548d58 68 "xaMRN1lPCmFq6BkSWjwIYTnYDFBDWVm1GVT8TMtJoM8Erej9qC0PeFUCgYEA6mF3\n" \
mbed_official 76:68ac2a548d58 69 "bigO3t8f5sig+XepaftEUbkJMzo72TVRnIR2ycdR2ihelPQ+25g9dwV0ZA5XXhBS\n" \
mbed_official 76:68ac2a548d58 70 "DKOABWjMM739Mwmy9v26Dlmu9R01zHQktMvtEAyfz7lk2NF0aMuj8285OJUBf9bz\n" \
mbed_official 76:68ac2a548d58 71 "Cq3MjtMCD+4CZ6iaEqCdUKOuxfpx5cWVJV+qve0CgYBhD1YaYMFOGaBjFgDl1f51\n" \
mbed_official 76:68ac2a548d58 72 "Xltqk5NqZdBbkSYrIAWZ8RDF5y+4wFJsLAWuhk6vuyUgE66tK3nZzWRpXAkT0B8L\n" \
mbed_official 76:68ac2a548d58 73 "fq1lpXKqj1KcvBNCiEkEW1VWJ+dvyAYIF5eyJ++hoFLnETL3M32HivyhKSwPihPg\n" \
mbed_official 76:68ac2a548d58 74 "nVW8TT9fJJIYDe1JZ/fjcQKBgHJfv7UsrR0LSvkG3K8AOtbx+8PZhOjPuRbk0v+L\n" \
mbed_official 76:68ac2a548d58 75 "EKCkuIe5/XW4vtfQMeZb7hFJgk7vrepm+vkoy8VQKDf4urGW3W1VTHBmobM01hi4\n" \
mbed_official 76:68ac2a548d58 76 "DuYvEul+Mf0wMRtWjJolo4m+BO5KiW2jpFfqFm6JmfjVqOIAKOSKC6am8V/MDF0h\n" \
mbed_official 76:68ac2a548d58 77 "kyN9AoGAT9oOiEXMolbkDZw/QCaBiRoAGlGlNYUkJ+58U6OjIZLISw6aFv+Y2uE0\n" \
mbed_official 76:68ac2a548d58 78 "mEImItjuYZtSYKblWikp6ldPoKlt9bwEFe3c6IZ8kJ3+xyEyAGrvjXjEY7PzP6dp\n" \
mbed_official 76:68ac2a548d58 79 "Ajbjp9X9uocEBv9W/KsBLdQ7yizcL/toHwdBO4vQqmqTvAc5IIw=\n" \
mbed_official 76:68ac2a548d58 80 "-----END RSA PRIVATE KEY-----\n"
Janos Follath 0:1f7c5025e59d 81
mbed_official 76:68ac2a548d58 82 #define RSA_PRIVATE_KEY_4096 \
mbed_official 76:68ac2a548d58 83 "-----BEGIN RSA PRIVATE KEY-----\n" \
mbed_official 76:68ac2a548d58 84 "MIIJKgIBAAKCAgEAmkdGjoIshJuOt2NO47qB3Z3yyvmLg2j351isItSNuFQU3qr+\n" \
mbed_official 76:68ac2a548d58 85 "jXHIeANf03yw/K0Zvos8RPd+CqLjoxAQL3QDH4bZAl88bIo29i+SANbNSrKQmc0k\n" \
mbed_official 76:68ac2a548d58 86 "pH+yzw3alDzO0GZaOPZjsbo6AwBrno5msi0vRuC2aY8vGLPsZWSyLai7tneS1j/o\n" \
mbed_official 76:68ac2a548d58 87 "vYW6XIo8Cj61j2Ypy9HhVUW/4Wc+zAT25D/x7jTpkqJLWWT+YzibNbOY48M5eJcB\n" \
mbed_official 76:68ac2a548d58 88 "6/sMyUIeI3/u/wXyMrooNyLiCpedkuHRA0m7u5cWPTUISTunSRlVFij/NHJjuU8e\n" \
mbed_official 76:68ac2a548d58 89 "wA3B29yfZFsUqDEnyc+OxniIueAixTomVszxAaVn8zFEbYhFMPqziiFp99u3jfeG\n" \
mbed_official 76:68ac2a548d58 90 "k1q9mmUi/uCfUC4e2IC5rqq1ZbKSduH7Ug/Vn2bGQahww0sZFRHDXFrnBcotcW+M\n" \
mbed_official 76:68ac2a548d58 91 "bnC290VBDnYgzmdYrIOxuPb2aUwJo4ZlbKh5uBB1PigMuyhLKibQ1a+V5ZJGdpP6\n" \
mbed_official 76:68ac2a548d58 92 "SE9PGIdgYWSmh2QEMuLE6v+wTO2LQ5JgqsvFfi3GIZvkn0s8jTS72Jq2uMkFkMer\n" \
mbed_official 76:68ac2a548d58 93 "UBjPDYaSPy5kpo103KerWs+cMPOJ/3FtZzI++7MoSUTkWVr1ySQFt5i1EIZ/0Thi\n" \
mbed_official 76:68ac2a548d58 94 "jut2jNe8a4AoA3TtC8Rkk/3AIIbg8MVNT4EnT+KHROTMu6gET1oJ3YfBRpUCAwEA\n" \
mbed_official 76:68ac2a548d58 95 "AQKCAgEAhuNSmT7PVZH8kfLOAuYKrY1vvm+4v0iDl048Eqfs0QESziyLK3gUYnnw\n" \
mbed_official 76:68ac2a548d58 96 "yqP2yrU+EQ8Dvvj0xq/sf6GHxTWVlXb9PcmutueRbmXhLcKg83J0Y0StiPXtjIL8\n" \
mbed_official 76:68ac2a548d58 97 "XSddW3Bh6fPi7n14Qy+W6KZwu9AtybanRlvePabyRSRpdOpWVQ7u30w5XZsSed6S\n" \
mbed_official 76:68ac2a548d58 98 "6BI0BBC68m2qqje1sInoqdCdXKtcB31TytUDNEHM+UuAyM8iGeGS2hCNqZlycHTS\n" \
mbed_official 76:68ac2a548d58 99 "jQ9KEsdMH3YLu0lQgRpWtxmg+VL6ROWwmAtKF12EwbDYZ+uoVl69OkQnCpv8pxKa\n" \
mbed_official 76:68ac2a548d58 100 "ec/4m6V+uEA1AOpaAMorHG3fH31IKWC/fTZstovgO/eG2XCtlbcCoWCQ7amFq16l\n" \
mbed_official 76:68ac2a548d58 101 "Gh1UKeBHxMXpDj4oDmIUGUvgzSNnEeSN/v76losWvWYQDjXR/LMDa/CNYsD8BmJR\n" \
mbed_official 76:68ac2a548d58 102 "PZidIjIXdVRlYOhA7ljtySQvp6RBujBfw3tsVMyZw2XzXFwM9O89b1xXC6+M5jf9\n" \
mbed_official 76:68ac2a548d58 103 "DXs/U7Fw+J9qq/YpByABcPCwWdttwdQFRbOxwxaSOKarIqS87TW1JuFcNJ59Ut6G\n" \
mbed_official 76:68ac2a548d58 104 "kMvAg6gC34U+0ktkG/AmI1hgjC+P7ErHCXBR2xARoGzcO/CMZF59S+Z2HFchpTSP\n" \
mbed_official 76:68ac2a548d58 105 "5T2o4mGy3VfHSBidQQrcZRukg8ZP8M1NF3bXjpY6QZpeLHc4oHECggEBAMjdgzzk\n" \
mbed_official 76:68ac2a548d58 106 "xp4mIYFxAEiXYt7tzuUXJk+0UpEJj5uboWLirUZqZmNUPyh6WDnzlREBH++Ms0LO\n" \
mbed_official 76:68ac2a548d58 107 "+AWSfaGPDoMb0NE2j3c4FRWAhe7Vn6lj7nLVpF2RdwRo88yGerZ4uwGMY8NUQCtn\n" \
mbed_official 76:68ac2a548d58 108 "zum3J7eCJ5DojiceRb6uMxTJ8xZmUC4W2f3J/lrR7wlYjyVnnHqH5HcemYUipWSw\n" \
mbed_official 76:68ac2a548d58 109 "sM0/cHp3lrz2VWrbAEu8HVpklvDQpdAgl7cjXt/JHYawY+p426IF/PzQSRROnzgy\n" \
mbed_official 76:68ac2a548d58 110 "4WI8FVYNV2tgu0TOFURbkkEvuj/duDKeooUIF0G0XHzha5oAX/j0iWiHbrOF6wHj\n" \
mbed_official 76:68ac2a548d58 111 "0xeajL9msKBnmD8CggEBAMSgLWmv7G31x4tndJCcXnX4AyVL7KpygAx/ZwCcyTR8\n" \
mbed_official 76:68ac2a548d58 112 "rY1rO07f/ta2noEra/xmEW/BW98qJFCHSU2nSLAQ5FpFSWyuQqrnffrMJnfWyvpr\n" \
mbed_official 76:68ac2a548d58 113 "ceQ0yQ/MiA6/JIOvGAjabcspzZijxzGp+Qk3eTT0yOXLSVOCH9B9XVHLodcy4PQM\n" \
mbed_official 76:68ac2a548d58 114 "KSCxy0vVHhVNl2SdPEwTXRmxk99Q/rw6IHVpQxBq1OhQt05nTKT+rZMD/grSK22e\n" \
mbed_official 76:68ac2a548d58 115 "my2F0DodAJwLo063Zv3RXQZhDYodMmjcp9Hqrtvj9P3HD7J3z6ACiV3SCi8cZumL\n" \
mbed_official 76:68ac2a548d58 116 "bSmnKCcd0bb45+aOWm31ieECJuIcJ9rOREEa/KDYTCsCggEBAMG5WkSVhLWsou37\n" \
mbed_official 76:68ac2a548d58 117 "dUGNuA63nq42SH3gtS0q4nU6gUkkw+dA4ST1cMByVrr1oRQ4WHup4I4TnQOKyF3T\n" \
mbed_official 76:68ac2a548d58 118 "4jQy1I+ipnVeAn+tZ/7zyzwMpEHeqNqRXA9FxbTBEoMAJ6QTqXgOvqDeSqIAQm7r\n" \
mbed_official 76:68ac2a548d58 119 "OYu5rrgtqyh/S8bGCwvUe4ooAfCSKx2ekYMbBVwW9MT8YS09tuS/iHJ3Mt2RTMLg\n" \
mbed_official 76:68ac2a548d58 120 "qeHvVmxrcXqZoFm44Ba7tN/pP0mi9HKyviZT4tmV3IYEbn3JyGGsfkUuVU9wEUfg\n" \
mbed_official 76:68ac2a548d58 121 "MCrgrVxrwfketAzooiHMjkVL2ASjzAJTmEvdAPETYXxzJD9LN0ovY3t8JfAC37IN\n" \
mbed_official 76:68ac2a548d58 122 "sVXS8/MCggEBALByOS59Y4Ktq1rLBQx8djwQyuneP0wZohUVAx7Gk7xZIfklQDyg\n" \
mbed_official 76:68ac2a548d58 123 "v/R4PrcVezstcPpDnykdjScCsGJR+uWc0v667I/ttP/e6utz5hVmmBGu965dPAzE\n" \
mbed_official 76:68ac2a548d58 124 "c1ggaSkOqFfRg/Nr2Qbf+fH0YPnHYSqHe/zSt0OMIvaaeXLcdKhEDSCUBRhE1HWB\n" \
mbed_official 76:68ac2a548d58 125 "kxR046WzgBeYzNQwycz9xwqsctJKGpeR9ute+5ANHPd3X9XtID0fqz8ctI5eZaSw\n" \
mbed_official 76:68ac2a548d58 126 "wApIW01ZQcAF8B+4WkkVuFXnpWW33yCOaRyPVOPHpnclr5WU1fS+3Q85QkW9rkej\n" \
mbed_official 76:68ac2a548d58 127 "97zlkl0QY9AHJqrXnoML1ywAK7ns+MVyNK8CggEAf62xcKZhOb1djeF72Ms+i/i/\n" \
mbed_official 76:68ac2a548d58 128 "WIAq4Q4YpsElgvJTHpNH2v9g4ngSTKe3ws3bGc502sWRlhcoTFMOW2rJNe/iqKkb\n" \
mbed_official 76:68ac2a548d58 129 "3cdeTkseDbpqozmJWz9dJWSVtXas2bZjzBEa//gQ7nHGVeQdqZJQ9rxPsoOAkfpi\n" \
mbed_official 76:68ac2a548d58 130 "qCFrmfUVUqC53e3XMt8+W+aSvKl+JZiB9ozkO9A6Q0vfQLKtjUMdQE3XaCFQT8DI\n" \
mbed_official 76:68ac2a548d58 131 "smaLBlBmeRaBpc02ENeC4ADlWosm1SwgxqMhuh2Alba/GrHOoPlVl4hDs9Fb5a6R\n" \
mbed_official 76:68ac2a548d58 132 "rmpXSt07GAxnG6j9jssA95E4rc1zO0CVKG5bvjVTxwi/sT0/VVX7VsJM4uTAQg==\n" \
mbed_official 76:68ac2a548d58 133 "-----END RSA PRIVATE KEY-----\n"
Janos Follath 0:1f7c5025e59d 134
Janos Follath 0:1f7c5025e59d 135 #define BUFSIZE 1024
Janos Follath 0:1f7c5025e59d 136 #define HEADER_FORMAT " %-24s : "
Janos Follath 0:1f7c5025e59d 137 #define TITLE_LEN 25
Janos Follath 0:1f7c5025e59d 138
Janos Follath 0:1f7c5025e59d 139 #if defined(MBEDTLS_ERROR_C)
mbed_official 78:5f419e0f96dd 140 #define PRINT_ERROR(RET, CODE) \
mbed_official 78:5f419e0f96dd 141 mbedtls_strerror(RET, err_buf, sizeof(err_buf)); \
mbed_official 78:5f419e0f96dd 142 mbedtls_printf("%s returned -0x%04X\n", CODE, -RET); \
mbed_official 78:5f419e0f96dd 143 mbedtls_printf(" ! %s\n", err_buf);
Janos Follath 0:1f7c5025e59d 144 #else
mbed_official 78:5f419e0f96dd 145 #define PRINT_ERROR(RET, CODE) \
mbed_official 78:5f419e0f96dd 146 mbedtls_printf("%s returned -0x%04X\n", CODE, -RET);
mbed_official 78:5f419e0f96dd 147 #endif /* MBEDTLS_ERROR_C */
Janos Follath 0:1f7c5025e59d 148
mbed_official 78:5f419e0f96dd 149 #define BENCHMARK_FUNC_CALL(TITLE, CODE) \
mbed_official 78:5f419e0f96dd 150 do { \
mbed_official 78:5f419e0f96dd 151 unsigned long i; \
mbed_official 78:5f419e0f96dd 152 Timeout t; \
mbed_official 78:5f419e0f96dd 153 \
mbed_official 78:5f419e0f96dd 154 mbedtls_printf(HEADER_FORMAT, TITLE); \
mbed_official 78:5f419e0f96dd 155 fflush(stdout); \
mbed_official 78:5f419e0f96dd 156 \
mbed_official 78:5f419e0f96dd 157 for (i = 1, alarmed = 0, t.attach(alarm, 1.0); !alarmed; i++) \
mbed_official 78:5f419e0f96dd 158 { \
mbed_official 78:5f419e0f96dd 159 ret = CODE; \
mbed_official 78:5f419e0f96dd 160 if (ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) { \
mbed_official 78:5f419e0f96dd 161 mbedtls_printf("Feature unavailable\n"); \
mbed_official 78:5f419e0f96dd 162 break; \
mbed_official 78:5f419e0f96dd 163 } else if (ret != 0) { \
mbed_official 78:5f419e0f96dd 164 PRINT_ERROR(ret, #CODE); \
mbed_official 78:5f419e0f96dd 165 goto exit; \
mbed_official 78:5f419e0f96dd 166 } \
mbed_official 78:5f419e0f96dd 167 } \
mbed_official 78:5f419e0f96dd 168 \
mbed_official 78:5f419e0f96dd 169 if (ret == 0) { \
mbed_official 78:5f419e0f96dd 170 mbedtls_printf("%9lu KB/s\n", i * BUFSIZE / 1024); \
mbed_official 78:5f419e0f96dd 171 } \
mbed_official 78:5f419e0f96dd 172 } while(0)
Janos Follath 0:1f7c5025e59d 173
mbed_official 78:5f419e0f96dd 174 #define BENCHMARK_PUBLIC(TITLE, TYPE, CODE) \
mbed_official 78:5f419e0f96dd 175 do { \
mbed_official 78:5f419e0f96dd 176 unsigned long ms; \
mbed_official 78:5f419e0f96dd 177 Timer t; \
mbed_official 78:5f419e0f96dd 178 \
mbed_official 78:5f419e0f96dd 179 mbedtls_printf(HEADER_FORMAT, TITLE); \
mbed_official 78:5f419e0f96dd 180 fflush(stdout); \
mbed_official 78:5f419e0f96dd 181 \
mbed_official 78:5f419e0f96dd 182 t.start(); \
mbed_official 78:5f419e0f96dd 183 CODE; \
mbed_official 78:5f419e0f96dd 184 t.stop(); \
mbed_official 78:5f419e0f96dd 185 ms = t.read_ms(); \
mbed_official 78:5f419e0f96dd 186 \
mbed_official 78:5f419e0f96dd 187 if (ret != 0) { \
mbed_official 78:5f419e0f96dd 188 PRINT_ERROR(ret, "Public function"); \
mbed_official 78:5f419e0f96dd 189 goto exit; \
mbed_official 78:5f419e0f96dd 190 } else { \
mbed_official 78:5f419e0f96dd 191 mbedtls_printf("%6lu ms/" TYPE, ms); \
mbed_official 78:5f419e0f96dd 192 mbedtls_printf("\n"); \
mbed_official 78:5f419e0f96dd 193 } \
mbed_official 78:5f419e0f96dd 194 } while(0)
mbed_official 78:5f419e0f96dd 195
mbed_official 78:5f419e0f96dd 196 /* Clear some memory that was used to prepare the context */
mbed_official 78:5f419e0f96dd 197 #if defined(MBEDTLS_ECP_C)
mbed_official 78:5f419e0f96dd 198 void ecp_clear_precomputed(mbedtls_ecp_group *grp)
Janos Follath 0:1f7c5025e59d 199 {
mbed_official 78:5f419e0f96dd 200 if (grp->T != NULL) {
Janos Follath 0:1f7c5025e59d 201 size_t i;
mbed_official 78:5f419e0f96dd 202 for (i = 0; i < grp->T_size; i++) {
mbed_official 78:5f419e0f96dd 203 mbedtls_ecp_point_free(&grp->T[i]);
mbed_official 78:5f419e0f96dd 204 }
mbed_official 78:5f419e0f96dd 205 mbedtls_free(grp->T);
Janos Follath 0:1f7c5025e59d 206 }
Janos Follath 0:1f7c5025e59d 207 grp->T = NULL;
Janos Follath 0:1f7c5025e59d 208 grp->T_size = 0;
Janos Follath 0:1f7c5025e59d 209 }
Janos Follath 0:1f7c5025e59d 210 #else
mbed_official 78:5f419e0f96dd 211 #define ecp_clear_precomputed(g)
mbed_official 78:5f419e0f96dd 212 #endif /* MBEDTLS_ECP_C */
Janos Follath 0:1f7c5025e59d 213
mbed_official 78:5f419e0f96dd 214 static unsigned char buf[BUFSIZE];
mbed_official 78:5f419e0f96dd 215 /*
mbed_official 78:5f419e0f96dd 216 * Buffer used to hold various data such as IV, signatures, keys, etc. ECDSA
mbed_official 78:5f419e0f96dd 217 * seems to be the benchmark that uses the most memory from this buffer as it
mbed_official 78:5f419e0f96dd 218 * is holds the output signature
mbed_official 78:5f419e0f96dd 219 */
mbed_official 78:5f419e0f96dd 220 static unsigned char tmp[150];
mbed_official 78:5f419e0f96dd 221 /* The longest error message has 134 characters (including \0) */
mbed_official 78:5f419e0f96dd 222 static char err_buf[134];
mbed_official 78:5f419e0f96dd 223 static char title[TITLE_LEN];
mbed_official 78:5f419e0f96dd 224
mbed_official 78:5f419e0f96dd 225 static volatile int alarmed;
mbed_official 78:5f419e0f96dd 226
mbed_official 78:5f419e0f96dd 227 static void alarm()
mbed_official 78:5f419e0f96dd 228 {
mbed_official 78:5f419e0f96dd 229 alarmed = 1;
mbed_official 78:5f419e0f96dd 230 }
Janos Follath 0:1f7c5025e59d 231
mbed_official 78:5f419e0f96dd 232 static int myrand(void *rng_state, unsigned char *output, size_t len)
mbed_official 78:5f419e0f96dd 233 {
mbed_official 78:5f419e0f96dd 234 size_t use_len;
mbed_official 78:5f419e0f96dd 235 int rnd;
mbed_official 78:5f419e0f96dd 236
mbed_official 78:5f419e0f96dd 237 if (rng_state != NULL) {
mbed_official 78:5f419e0f96dd 238 rng_state = NULL;
mbed_official 78:5f419e0f96dd 239 }
Janos Follath 0:1f7c5025e59d 240
mbed_official 78:5f419e0f96dd 241 while (len > 0) {
mbed_official 78:5f419e0f96dd 242 use_len = len;
mbed_official 78:5f419e0f96dd 243 if (use_len > sizeof(int)) {
mbed_official 78:5f419e0f96dd 244 use_len = sizeof(int);
mbed_official 78:5f419e0f96dd 245 }
mbed_official 78:5f419e0f96dd 246
mbed_official 78:5f419e0f96dd 247 rnd = rand();
mbed_official 78:5f419e0f96dd 248 memcpy(output, &rnd, use_len);
mbed_official 78:5f419e0f96dd 249 output += use_len;
mbed_official 78:5f419e0f96dd 250 len -= use_len;
mbed_official 78:5f419e0f96dd 251 }
mbed_official 78:5f419e0f96dd 252
mbed_official 78:5f419e0f96dd 253 return 0;
mbed_official 78:5f419e0f96dd 254 }
Janos Follath 0:1f7c5025e59d 255
Janos Follath 0:1f7c5025e59d 256 #if defined(MBEDTLS_MD4_C)
mbed_official 78:5f419e0f96dd 257 MBED_NOINLINE static int benchmark_md4()
mbed_official 78:5f419e0f96dd 258 {
mbed_official 78:5f419e0f96dd 259 int ret;
mbed_official 78:5f419e0f96dd 260
mbed_official 78:5f419e0f96dd 261 BENCHMARK_FUNC_CALL("MD4", mbedtls_md4_ret(buf, BUFSIZE, tmp));
mbed_official 78:5f419e0f96dd 262
mbed_official 78:5f419e0f96dd 263 ret = 0;
mbed_official 78:5f419e0f96dd 264
mbed_official 78:5f419e0f96dd 265 exit:
mbed_official 78:5f419e0f96dd 266
mbed_official 78:5f419e0f96dd 267 return ret;
mbed_official 78:5f419e0f96dd 268 }
mbed_official 78:5f419e0f96dd 269 #endif /* MBEDTLS_MD4_C */
Janos Follath 0:1f7c5025e59d 270
Janos Follath 0:1f7c5025e59d 271 #if defined(MBEDTLS_MD5_C)
mbed_official 78:5f419e0f96dd 272 MBED_NOINLINE static int benchmark_md5()
mbed_official 78:5f419e0f96dd 273 {
mbed_official 78:5f419e0f96dd 274 int ret;
mbed_official 78:5f419e0f96dd 275
mbed_official 78:5f419e0f96dd 276 BENCHMARK_FUNC_CALL("MD5", mbedtls_md5_ret(buf, BUFSIZE, tmp));
mbed_official 78:5f419e0f96dd 277
mbed_official 78:5f419e0f96dd 278 ret = 0;
mbed_official 78:5f419e0f96dd 279
mbed_official 78:5f419e0f96dd 280 exit:
mbed_official 78:5f419e0f96dd 281
mbed_official 78:5f419e0f96dd 282 return ret;
mbed_official 78:5f419e0f96dd 283 }
mbed_official 78:5f419e0f96dd 284 #endif /* MBEDTLS_MD5_C */
Janos Follath 0:1f7c5025e59d 285
Janos Follath 0:1f7c5025e59d 286 #if defined(MBEDTLS_RIPEMD160_C)
mbed_official 78:5f419e0f96dd 287 MBED_NOINLINE static int benchmark_ripemd160()
mbed_official 78:5f419e0f96dd 288 {
mbed_official 78:5f419e0f96dd 289 int ret;
mbed_official 78:5f419e0f96dd 290
mbed_official 78:5f419e0f96dd 291 BENCHMARK_FUNC_CALL("RIPEMD160", mbedtls_ripemd160_ret(buf, BUFSIZE, tmp));
mbed_official 78:5f419e0f96dd 292
mbed_official 78:5f419e0f96dd 293 ret = 0;
mbed_official 78:5f419e0f96dd 294
mbed_official 78:5f419e0f96dd 295 exit:
mbed_official 78:5f419e0f96dd 296
mbed_official 78:5f419e0f96dd 297 return ret;
mbed_official 78:5f419e0f96dd 298 }
mbed_official 78:5f419e0f96dd 299 #endif /* MBEDTLS_RIPEMD160_C */
Janos Follath 0:1f7c5025e59d 300
Janos Follath 0:1f7c5025e59d 301 #if defined(MBEDTLS_SHA1_C)
mbed_official 78:5f419e0f96dd 302 MBED_NOINLINE static int benchmark_sha1()
mbed_official 78:5f419e0f96dd 303 {
mbed_official 78:5f419e0f96dd 304 int ret;
mbed_official 78:5f419e0f96dd 305
mbed_official 78:5f419e0f96dd 306 BENCHMARK_FUNC_CALL("SHA-1", mbedtls_sha1_ret(buf, BUFSIZE, tmp));
mbed_official 78:5f419e0f96dd 307
mbed_official 78:5f419e0f96dd 308 ret = 0;
mbed_official 78:5f419e0f96dd 309
mbed_official 78:5f419e0f96dd 310 exit:
mbed_official 78:5f419e0f96dd 311
mbed_official 78:5f419e0f96dd 312 return ret;
mbed_official 78:5f419e0f96dd 313 }
mbed_official 78:5f419e0f96dd 314 #endif /* MBEDTLS_SHA1_C */
Janos Follath 0:1f7c5025e59d 315
Janos Follath 0:1f7c5025e59d 316 #if defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 317 MBED_NOINLINE static int benchmark_sha256()
mbed_official 78:5f419e0f96dd 318 {
mbed_official 78:5f419e0f96dd 319 int ret;
mbed_official 78:5f419e0f96dd 320
mbed_official 78:5f419e0f96dd 321 BENCHMARK_FUNC_CALL("SHA-256", mbedtls_sha256_ret(buf, BUFSIZE, tmp, 0));
mbed_official 78:5f419e0f96dd 322
mbed_official 78:5f419e0f96dd 323 ret = 0;
mbed_official 78:5f419e0f96dd 324
mbed_official 78:5f419e0f96dd 325 exit:
mbed_official 78:5f419e0f96dd 326
mbed_official 78:5f419e0f96dd 327 return ret;
mbed_official 78:5f419e0f96dd 328 }
mbed_official 78:5f419e0f96dd 329 #endif /* MBEDTLS_SHA256_C */
Janos Follath 0:1f7c5025e59d 330
Janos Follath 0:1f7c5025e59d 331 #if defined(MBEDTLS_SHA512_C)
mbed_official 78:5f419e0f96dd 332 MBED_NOINLINE static int benchmark_sha512()
mbed_official 70:72c865037f5d 333 {
mbed_official 78:5f419e0f96dd 334 int ret;
mbed_official 78:5f419e0f96dd 335
mbed_official 78:5f419e0f96dd 336 BENCHMARK_FUNC_CALL("SHA-512", mbedtls_sha512_ret(buf, BUFSIZE, tmp, 0));
mbed_official 78:5f419e0f96dd 337
mbed_official 78:5f419e0f96dd 338 ret = 0;
mbed_official 78:5f419e0f96dd 339
mbed_official 78:5f419e0f96dd 340 exit:
mbed_official 78:5f419e0f96dd 341
mbed_official 78:5f419e0f96dd 342 return ret;
mbed_official 78:5f419e0f96dd 343 }
mbed_official 78:5f419e0f96dd 344 #endif /* MBEDTLS_SHA512_C */
mbed_official 78:5f419e0f96dd 345
Janos Follath 0:1f7c5025e59d 346
Janos Follath 0:1f7c5025e59d 347 #if defined(MBEDTLS_ARC4_C)
mbed_official 78:5f419e0f96dd 348 MBED_NOINLINE static int benchmark_arc4()
mbed_official 78:5f419e0f96dd 349 {
mbed_official 78:5f419e0f96dd 350 int ret = 0;
mbed_official 78:5f419e0f96dd 351 mbedtls_arc4_context arc4;
mbed_official 78:5f419e0f96dd 352
mbed_official 78:5f419e0f96dd 353 mbedtls_arc4_init(&arc4);
mbed_official 78:5f419e0f96dd 354
mbed_official 78:5f419e0f96dd 355 mbedtls_arc4_setup(&arc4, tmp, 32);
mbed_official 78:5f419e0f96dd 356 BENCHMARK_FUNC_CALL("ARC4",
mbed_official 78:5f419e0f96dd 357 mbedtls_arc4_crypt(&arc4, BUFSIZE, buf, buf));
mbed_official 78:5f419e0f96dd 358
mbed_official 78:5f419e0f96dd 359 ret = 0;
mbed_official 78:5f419e0f96dd 360
mbed_official 78:5f419e0f96dd 361 exit:
mbed_official 78:5f419e0f96dd 362 mbedtls_arc4_free(&arc4);
mbed_official 78:5f419e0f96dd 363
mbed_official 78:5f419e0f96dd 364 return ret;
mbed_official 78:5f419e0f96dd 365 }
mbed_official 78:5f419e0f96dd 366 #endif /* MBEDTLS_ARC4_C */
mbed_official 78:5f419e0f96dd 367
mbed_official 78:5f419e0f96dd 368 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 369 MBED_NOINLINE static int benchmark_des3()
mbed_official 78:5f419e0f96dd 370 {
mbed_official 78:5f419e0f96dd 371 int ret = 0;
mbed_official 78:5f419e0f96dd 372 mbedtls_des3_context des3;
mbed_official 78:5f419e0f96dd 373
mbed_official 78:5f419e0f96dd 374 mbedtls_des3_init(&des3);
mbed_official 78:5f419e0f96dd 375
mbed_official 78:5f419e0f96dd 376 if ((ret = mbedtls_des3_set3key_enc(&des3, tmp)) != 0) {
mbed_official 78:5f419e0f96dd 377 PRINT_ERROR(ret, "mbedtls_des3_set3key_enc()");
mbed_official 78:5f419e0f96dd 378 goto exit;
Janos Follath 0:1f7c5025e59d 379 }
mbed_official 78:5f419e0f96dd 380 BENCHMARK_FUNC_CALL("3DES",
mbed_official 78:5f419e0f96dd 381 mbedtls_des3_crypt_cbc(&des3, MBEDTLS_DES_ENCRYPT,
mbed_official 78:5f419e0f96dd 382 BUFSIZE, tmp, buf, buf));
mbed_official 78:5f419e0f96dd 383
mbed_official 78:5f419e0f96dd 384 ret = 0;
mbed_official 78:5f419e0f96dd 385
mbed_official 78:5f419e0f96dd 386 exit:
mbed_official 78:5f419e0f96dd 387 mbedtls_des3_free(&des3);
mbed_official 78:5f419e0f96dd 388
mbed_official 78:5f419e0f96dd 389 return ret;
mbed_official 78:5f419e0f96dd 390 }
mbed_official 78:5f419e0f96dd 391 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC */
Janos Follath 0:1f7c5025e59d 392
Janos Follath 0:1f7c5025e59d 393 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 394 MBED_NOINLINE static int benchmark_des()
mbed_official 78:5f419e0f96dd 395 {
mbed_official 78:5f419e0f96dd 396 int ret = 0;
mbed_official 78:5f419e0f96dd 397 mbedtls_des_context des;
mbed_official 78:5f419e0f96dd 398
mbed_official 78:5f419e0f96dd 399 mbedtls_des_init(&des);
mbed_official 78:5f419e0f96dd 400
mbed_official 78:5f419e0f96dd 401 if ((ret = mbedtls_des_setkey_enc(&des, tmp)) != 0) {
mbed_official 78:5f419e0f96dd 402 PRINT_ERROR(ret, "mbedtls_des_setkey_enc()");
mbed_official 78:5f419e0f96dd 403 goto exit;
mbed_official 78:5f419e0f96dd 404 }
mbed_official 78:5f419e0f96dd 405 BENCHMARK_FUNC_CALL("DES",
mbed_official 78:5f419e0f96dd 406 mbedtls_des_crypt_cbc(&des, MBEDTLS_DES_ENCRYPT,
mbed_official 78:5f419e0f96dd 407 BUFSIZE, tmp, buf, buf));
mbed_official 78:5f419e0f96dd 408
mbed_official 78:5f419e0f96dd 409 ret = 0;
mbed_official 78:5f419e0f96dd 410
mbed_official 78:5f419e0f96dd 411 exit:
mbed_official 78:5f419e0f96dd 412 mbedtls_des_free(&des);
mbed_official 78:5f419e0f96dd 413
mbed_official 78:5f419e0f96dd 414 return ret;
mbed_official 78:5f419e0f96dd 415 }
mbed_official 78:5f419e0f96dd 416 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 417
mbed_official 78:5f419e0f96dd 418 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \
mbed_official 78:5f419e0f96dd 419 defined(MBEDTLS_CMAC_C)
mbed_official 78:5f419e0f96dd 420 MBED_NOINLINE static int benchmark_des3_cmac()
mbed_official 78:5f419e0f96dd 421 {
mbed_official 78:5f419e0f96dd 422 int ret = 0;
mbed_official 78:5f419e0f96dd 423 unsigned char output[8];
mbed_official 78:5f419e0f96dd 424 const mbedtls_cipher_info_t *cipher_info;
mbed_official 78:5f419e0f96dd 425
mbed_official 78:5f419e0f96dd 426 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 427 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 428
mbed_official 78:5f419e0f96dd 429 cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_DES_EDE3_ECB);
mbed_official 78:5f419e0f96dd 430 if (cipher_info == NULL) {
mbed_official 78:5f419e0f96dd 431 mbedtls_printf("mbedtls_cipher_info_from_type() returned NULL\n");
mbed_official 78:5f419e0f96dd 432 return -1;
mbed_official 78:5f419e0f96dd 433 }
mbed_official 78:5f419e0f96dd 434
mbed_official 78:5f419e0f96dd 435 BENCHMARK_FUNC_CALL("3DES-CMAC",
mbed_official 78:5f419e0f96dd 436 mbedtls_cipher_cmac(cipher_info, tmp, 192, buf,
mbed_official 78:5f419e0f96dd 437 BUFSIZE, output));
mbed_official 78:5f419e0f96dd 438
mbed_official 78:5f419e0f96dd 439 ret = 0;
mbed_official 78:5f419e0f96dd 440
mbed_official 78:5f419e0f96dd 441 exit:
mbed_official 78:5f419e0f96dd 442 return ret;
mbed_official 78:5f419e0f96dd 443 }
mbed_official 78:5f419e0f96dd 444 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC && MBEDTLS_CMAC_C */
mbed_official 78:5f419e0f96dd 445
mbed_official 78:5f419e0f96dd 446 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 447 MBED_NOINLINE static int benchmark_aes_cbc()
mbed_official 78:5f419e0f96dd 448 {
mbed_official 78:5f419e0f96dd 449 int ret = 0;
mbed_official 78:5f419e0f96dd 450 int keysize;
mbed_official 78:5f419e0f96dd 451 mbedtls_aes_context aes;
mbed_official 78:5f419e0f96dd 452
mbed_official 78:5f419e0f96dd 453 mbedtls_aes_init(&aes);
mbed_official 78:5f419e0f96dd 454
mbed_official 78:5f419e0f96dd 455 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 456 ret = mbedtls_snprintf(title, sizeof(title), "AES-CBC-%d", keysize);
mbed_official 78:5f419e0f96dd 457 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 458 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 459 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 460 goto exit;
mbed_official 78:5f419e0f96dd 461 }
mbed_official 78:5f419e0f96dd 462
mbed_official 78:5f419e0f96dd 463 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 464 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 465
mbed_official 78:5f419e0f96dd 466 ret = mbedtls_aes_setkey_enc(&aes, tmp, keysize);
mbed_official 78:5f419e0f96dd 467 if (ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) {
mbed_official 78:5f419e0f96dd 468 /* Do not consider this as a failure */
mbed_official 78:5f419e0f96dd 469 mbedtls_printf(HEADER_FORMAT "Feature unavailable\n", title);
mbed_official 78:5f419e0f96dd 470 continue;
mbed_official 78:5f419e0f96dd 471 } else if (ret != 0) {
mbed_official 78:5f419e0f96dd 472 PRINT_ERROR(ret, "mbedtls_aes_setkey_enc()");
mbed_official 78:5f419e0f96dd 473 goto exit;
mbed_official 78:5f419e0f96dd 474 }
mbed_official 78:5f419e0f96dd 475
mbed_official 78:5f419e0f96dd 476 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 477 mbedtls_aes_crypt_cbc(&aes,
mbed_official 78:5f419e0f96dd 478 MBEDTLS_AES_ENCRYPT, BUFSIZE,
mbed_official 78:5f419e0f96dd 479 tmp, buf, buf));
mbed_official 78:5f419e0f96dd 480 }
mbed_official 78:5f419e0f96dd 481
mbed_official 78:5f419e0f96dd 482 ret = 0;
mbed_official 78:5f419e0f96dd 483
mbed_official 78:5f419e0f96dd 484 exit:
mbed_official 78:5f419e0f96dd 485 mbedtls_aes_free(&aes);
mbed_official 78:5f419e0f96dd 486
mbed_official 78:5f419e0f96dd 487 return ret;
mbed_official 78:5f419e0f96dd 488 }
mbed_official 78:5f419e0f96dd 489 #endif /* MBEDTLS_AES_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 490
mbed_official 78:5f419e0f96dd 491 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CIPHER_MODE_CTR)
mbed_official 78:5f419e0f96dd 492 MBED_NOINLINE static int benchmark_aes_ctr()
mbed_official 78:5f419e0f96dd 493 {
mbed_official 78:5f419e0f96dd 494 int ret = 0;
mbed_official 78:5f419e0f96dd 495 int keysize;
mbed_official 78:5f419e0f96dd 496 size_t nc_offset = 0;
mbed_official 78:5f419e0f96dd 497 unsigned char stream_block[16];
mbed_official 78:5f419e0f96dd 498 mbedtls_aes_context aes;
mbed_official 78:5f419e0f96dd 499
mbed_official 78:5f419e0f96dd 500 mbedtls_aes_init(&aes);
mbed_official 78:5f419e0f96dd 501
mbed_official 78:5f419e0f96dd 502 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 503 ret = mbedtls_snprintf(title, sizeof(title), "AES-CTR-%d", keysize);
mbed_official 78:5f419e0f96dd 504 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 505 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 506 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 507 goto exit;
mbed_official 78:5f419e0f96dd 508 }
mbed_official 78:5f419e0f96dd 509
mbed_official 78:5f419e0f96dd 510 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 511 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 512
mbed_official 78:5f419e0f96dd 513 ret = mbedtls_aes_setkey_enc(&aes, tmp, keysize);
mbed_official 78:5f419e0f96dd 514 if (ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) {
mbed_official 78:5f419e0f96dd 515 /* Do not consider this as a failure */
mbed_official 78:5f419e0f96dd 516 mbedtls_printf(HEADER_FORMAT "Feature unavailable\n", title);
mbed_official 78:5f419e0f96dd 517 continue;
mbed_official 78:5f419e0f96dd 518 } else if (ret != 0) {
mbed_official 78:5f419e0f96dd 519 PRINT_ERROR(ret, "mbedtls_aes_setkey_enc()");
mbed_official 78:5f419e0f96dd 520 goto exit;
mbed_official 78:5f419e0f96dd 521 }
mbed_official 78:5f419e0f96dd 522
mbed_official 78:5f419e0f96dd 523 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 524 mbedtls_aes_crypt_ctr(&aes, BUFSIZE, &nc_offset,
mbed_official 78:5f419e0f96dd 525 tmp, stream_block, buf,
mbed_official 78:5f419e0f96dd 526 buf));
Janos Follath 0:1f7c5025e59d 527 }
Janos Follath 0:1f7c5025e59d 528
mbed_official 78:5f419e0f96dd 529 ret = 0;
mbed_official 78:5f419e0f96dd 530
mbed_official 78:5f419e0f96dd 531 exit:
mbed_official 78:5f419e0f96dd 532 mbedtls_aes_free(&aes);
mbed_official 78:5f419e0f96dd 533
mbed_official 78:5f419e0f96dd 534 return ret;
mbed_official 78:5f419e0f96dd 535 }
mbed_official 78:5f419e0f96dd 536 #endif /* MBEDTLS_AES_C && MBEDTLS_CIPHER_MODE_CTR */
mbed_official 11:6ccae3ebafd5 537
mbed_official 78:5f419e0f96dd 538 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_GCM_C)
mbed_official 78:5f419e0f96dd 539 MBED_NOINLINE static int benchmark_aes_gcm()
mbed_official 78:5f419e0f96dd 540 {
mbed_official 78:5f419e0f96dd 541 int ret = 0;
mbed_official 78:5f419e0f96dd 542 int keysize;
mbed_official 78:5f419e0f96dd 543 mbedtls_gcm_context gcm;
mbed_official 11:6ccae3ebafd5 544
mbed_official 78:5f419e0f96dd 545 mbedtls_gcm_init(&gcm);
Janos Follath 0:1f7c5025e59d 546
mbed_official 78:5f419e0f96dd 547 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 548 ret = mbedtls_snprintf(title, sizeof(title), "AES-GCM-%d", keysize);
mbed_official 78:5f419e0f96dd 549 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 550 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 551 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 552 goto exit;
Janos Follath 0:1f7c5025e59d 553 }
mbed_official 78:5f419e0f96dd 554
mbed_official 78:5f419e0f96dd 555 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 556 memset(tmp, 0, sizeof(tmp));
mbed_official 30:e0ea8c1ef9f5 557
mbed_official 78:5f419e0f96dd 558 ret = mbedtls_gcm_setkey(&gcm, MBEDTLS_CIPHER_ID_AES, tmp, keysize);
mbed_official 78:5f419e0f96dd 559 if (ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) {
mbed_official 78:5f419e0f96dd 560 /* Do not consider this as a failure */
mbed_official 78:5f419e0f96dd 561 mbedtls_printf(HEADER_FORMAT "Feature unavailable\n", title);
mbed_official 78:5f419e0f96dd 562 continue;
mbed_official 78:5f419e0f96dd 563 } else if (ret != 0) {
mbed_official 78:5f419e0f96dd 564 PRINT_ERROR(ret, "mbedtls_gcm_setkey()");
mbed_official 78:5f419e0f96dd 565 goto exit;
mbed_official 78:5f419e0f96dd 566 }
mbed_official 30:e0ea8c1ef9f5 567
mbed_official 78:5f419e0f96dd 568 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 569 mbedtls_gcm_crypt_and_tag(&gcm,
mbed_official 78:5f419e0f96dd 570 MBEDTLS_GCM_ENCRYPT,
mbed_official 78:5f419e0f96dd 571 BUFSIZE, tmp, 12, NULL,
mbed_official 78:5f419e0f96dd 572 0, buf, buf, 16, tmp));
mbed_official 30:e0ea8c1ef9f5 573 }
mbed_official 30:e0ea8c1ef9f5 574
mbed_official 78:5f419e0f96dd 575 ret = 0;
Janos Follath 0:1f7c5025e59d 576
mbed_official 78:5f419e0f96dd 577 exit:
mbed_official 78:5f419e0f96dd 578 mbedtls_gcm_free(&gcm);
Janos Follath 0:1f7c5025e59d 579
mbed_official 78:5f419e0f96dd 580 return ret;
mbed_official 78:5f419e0f96dd 581 }
mbed_official 78:5f419e0f96dd 582 #endif /* MBEDTLS_AES_C && MBEDTLS_GCM_C */
Janos Follath 0:1f7c5025e59d 583
mbed_official 78:5f419e0f96dd 584 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CCM_C)
mbed_official 78:5f419e0f96dd 585 MBED_NOINLINE static int benchmark_aes_ccm()
mbed_official 78:5f419e0f96dd 586 {
mbed_official 78:5f419e0f96dd 587 int ret = 0;
mbed_official 78:5f419e0f96dd 588 int keysize;
mbed_official 78:5f419e0f96dd 589 mbedtls_ccm_context ccm;
Janos Follath 0:1f7c5025e59d 590
mbed_official 78:5f419e0f96dd 591 mbedtls_ccm_init(&ccm);
mbed_official 11:6ccae3ebafd5 592
mbed_official 78:5f419e0f96dd 593 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 594 ret = mbedtls_snprintf(title, sizeof(title), "AES-CCM-%d", keysize);
mbed_official 78:5f419e0f96dd 595 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 596 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 597 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 598 goto exit;
mbed_official 11:6ccae3ebafd5 599 }
mbed_official 11:6ccae3ebafd5 600
mbed_official 78:5f419e0f96dd 601 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 602 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 603
mbed_official 78:5f419e0f96dd 604 ret = mbedtls_ccm_setkey(&ccm, MBEDTLS_CIPHER_ID_AES, tmp, keysize);
mbed_official 78:5f419e0f96dd 605 if (ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) {
mbed_official 78:5f419e0f96dd 606 /* Do not consider this as a failure */
mbed_official 78:5f419e0f96dd 607 mbedtls_printf(HEADER_FORMAT "Feature unavailable\n", title);
mbed_official 78:5f419e0f96dd 608 continue;
mbed_official 78:5f419e0f96dd 609 } else if (ret != 0) {
mbed_official 78:5f419e0f96dd 610 PRINT_ERROR(ret, "mbedtls_gcm_setkey()");
mbed_official 78:5f419e0f96dd 611 goto exit;
mbed_official 78:5f419e0f96dd 612 }
mbed_official 78:5f419e0f96dd 613
mbed_official 78:5f419e0f96dd 614 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 615 mbedtls_ccm_encrypt_and_tag(&ccm, BUFSIZE, tmp, 12,
mbed_official 78:5f419e0f96dd 616 NULL, 0, buf, buf, tmp,
mbed_official 78:5f419e0f96dd 617 16));
mbed_official 11:6ccae3ebafd5 618 }
mbed_official 78:5f419e0f96dd 619
mbed_official 78:5f419e0f96dd 620 ret = 0;
mbed_official 78:5f419e0f96dd 621
mbed_official 78:5f419e0f96dd 622 exit:
mbed_official 78:5f419e0f96dd 623 mbedtls_ccm_free(&ccm);
mbed_official 78:5f419e0f96dd 624
mbed_official 78:5f419e0f96dd 625 return ret;
mbed_official 78:5f419e0f96dd 626 }
mbed_official 78:5f419e0f96dd 627 #endif /* MBEDTLS_AES_C && MBEDTLS_CCM_C */
mbed_official 78:5f419e0f96dd 628
mbed_official 78:5f419e0f96dd 629 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CMAC_C)
mbed_official 78:5f419e0f96dd 630 MBED_NOINLINE static int benchmark_aes_cmac()
mbed_official 78:5f419e0f96dd 631 {
mbed_official 78:5f419e0f96dd 632 int ret = 0;
mbed_official 78:5f419e0f96dd 633 unsigned char output[16];
mbed_official 78:5f419e0f96dd 634 const mbedtls_cipher_info_t *cipher_info;
mbed_official 78:5f419e0f96dd 635 mbedtls_cipher_type_t cipher_type;
mbed_official 78:5f419e0f96dd 636 int keysize;
mbed_official 78:5f419e0f96dd 637
mbed_official 78:5f419e0f96dd 638 cipher_type = MBEDTLS_CIPHER_AES_128_ECB;
mbed_official 78:5f419e0f96dd 639 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 640 ret = mbedtls_snprintf(title, sizeof(title), "AES-CMAC-%d", keysize);
mbed_official 78:5f419e0f96dd 641 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 642 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 643 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 644 goto exit;
mbed_official 78:5f419e0f96dd 645 }
mbed_official 78:5f419e0f96dd 646
mbed_official 78:5f419e0f96dd 647 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 648 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 649
mbed_official 78:5f419e0f96dd 650 cipher_info = mbedtls_cipher_info_from_type(cipher_type);
mbed_official 78:5f419e0f96dd 651 if (cipher_info == NULL) {
mbed_official 78:5f419e0f96dd 652 mbedtls_printf("mbedtls_cipher_info_from_type() returned NULL\n");
mbed_official 78:5f419e0f96dd 653 goto exit;
mbed_official 78:5f419e0f96dd 654 }
mbed_official 78:5f419e0f96dd 655
mbed_official 78:5f419e0f96dd 656 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 657 mbedtls_cipher_cmac(cipher_info, tmp, keysize,
mbed_official 78:5f419e0f96dd 658 buf, BUFSIZE, output));
mbed_official 78:5f419e0f96dd 659 cipher_type = (mbedtls_cipher_type_t)(cipher_type + 1);
mbed_official 78:5f419e0f96dd 660 }
mbed_official 78:5f419e0f96dd 661
mbed_official 78:5f419e0f96dd 662 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 663 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 664
mbed_official 78:5f419e0f96dd 665 BENCHMARK_FUNC_CALL("AES-CMAC-PRF-128",
mbed_official 78:5f419e0f96dd 666 mbedtls_aes_cmac_prf_128(tmp, 16, buf, BUFSIZE,
mbed_official 78:5f419e0f96dd 667 output));
mbed_official 78:5f419e0f96dd 668
mbed_official 78:5f419e0f96dd 669 ret = 0;
mbed_official 78:5f419e0f96dd 670
mbed_official 78:5f419e0f96dd 671 exit:
mbed_official 78:5f419e0f96dd 672
mbed_official 78:5f419e0f96dd 673 return ret;
mbed_official 78:5f419e0f96dd 674 }
mbed_official 78:5f419e0f96dd 675 #endif /* MBEDTLS_AES_C && MBEDTLS_CMAC_C */
Janos Follath 0:1f7c5025e59d 676
Janos Follath 0:1f7c5025e59d 677 #if defined(MBEDTLS_CAMELLIA_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 678 MBED_NOINLINE static int benchmark_camellia()
mbed_official 78:5f419e0f96dd 679 {
mbed_official 78:5f419e0f96dd 680 int ret = 0;
mbed_official 78:5f419e0f96dd 681 int keysize;
mbed_official 78:5f419e0f96dd 682 mbedtls_camellia_context camellia;
mbed_official 78:5f419e0f96dd 683
mbed_official 78:5f419e0f96dd 684 mbedtls_camellia_init(&camellia);
mbed_official 78:5f419e0f96dd 685
mbed_official 78:5f419e0f96dd 686 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 687 ret = mbedtls_snprintf(title, sizeof(title), "CAMELLIA-CBC-%d",
mbed_official 78:5f419e0f96dd 688 keysize);
mbed_official 78:5f419e0f96dd 689 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 690 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 691 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 692 goto exit;
mbed_official 78:5f419e0f96dd 693 }
mbed_official 78:5f419e0f96dd 694
mbed_official 78:5f419e0f96dd 695 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 696 memset(tmp, 0, sizeof(tmp));
Janos Follath 0:1f7c5025e59d 697
mbed_official 78:5f419e0f96dd 698 ret = mbedtls_camellia_setkey_enc(&camellia, tmp, keysize);
mbed_official 78:5f419e0f96dd 699 if (ret != 0) {
mbed_official 78:5f419e0f96dd 700 PRINT_ERROR(ret, "mbedtls_camellia_setkey_enc()");
mbed_official 78:5f419e0f96dd 701 goto exit;
mbed_official 78:5f419e0f96dd 702 }
Janos Follath 0:1f7c5025e59d 703
mbed_official 78:5f419e0f96dd 704 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 705 mbedtls_camellia_crypt_cbc(&camellia,
mbed_official 78:5f419e0f96dd 706 MBEDTLS_CAMELLIA_ENCRYPT,
mbed_official 78:5f419e0f96dd 707 BUFSIZE, tmp, buf, buf));
Janos Follath 0:1f7c5025e59d 708 }
mbed_official 78:5f419e0f96dd 709
mbed_official 78:5f419e0f96dd 710 ret = 0;
mbed_official 78:5f419e0f96dd 711
mbed_official 78:5f419e0f96dd 712 exit:
mbed_official 78:5f419e0f96dd 713 mbedtls_camellia_free(&camellia);
mbed_official 78:5f419e0f96dd 714
mbed_official 78:5f419e0f96dd 715 return ret;
mbed_official 78:5f419e0f96dd 716 }
mbed_official 78:5f419e0f96dd 717 #endif /* MBEDTLS_CAMELLIA_C && MBEDTLS_CIPHER_MODE_CBC */
Janos Follath 0:1f7c5025e59d 718
Janos Follath 0:1f7c5025e59d 719 #if defined(MBEDTLS_BLOWFISH_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 720 MBED_NOINLINE static int benchmark_blowfish()
mbed_official 78:5f419e0f96dd 721 {
mbed_official 78:5f419e0f96dd 722 int ret = 0;
mbed_official 78:5f419e0f96dd 723 int keysize;
mbed_official 78:5f419e0f96dd 724 mbedtls_blowfish_context *blowfish;
mbed_official 78:5f419e0f96dd 725
mbed_official 78:5f419e0f96dd 726 blowfish = (mbedtls_blowfish_context *)mbedtls_calloc(1,
mbed_official 78:5f419e0f96dd 727 sizeof(mbedtls_blowfish_context));
mbed_official 78:5f419e0f96dd 728 if (blowfish == NULL) {
mbed_official 78:5f419e0f96dd 729 mbedtls_printf("Failed to allocate mbedtls_blowfish_context\n");
mbed_official 78:5f419e0f96dd 730 return -1;
mbed_official 78:5f419e0f96dd 731 }
mbed_official 78:5f419e0f96dd 732
mbed_official 78:5f419e0f96dd 733 mbedtls_blowfish_init(blowfish);
Janos Follath 0:1f7c5025e59d 734
mbed_official 78:5f419e0f96dd 735 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 736 mbedtls_snprintf(title, sizeof(title), "BLOWFISH-CBC-%d", keysize);
mbed_official 78:5f419e0f96dd 737 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 738 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 739 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 740 goto exit;
mbed_official 78:5f419e0f96dd 741 }
Janos Follath 0:1f7c5025e59d 742
mbed_official 78:5f419e0f96dd 743 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 744 memset(tmp, 0, sizeof(tmp));
Janos Follath 0:1f7c5025e59d 745
mbed_official 78:5f419e0f96dd 746 if ((ret = mbedtls_blowfish_setkey(blowfish, tmp, keysize)) != 0) {
mbed_official 78:5f419e0f96dd 747 PRINT_ERROR(ret, "mbedtls_blowfish_setkey()");
mbed_official 78:5f419e0f96dd 748 goto exit;
Janos Follath 0:1f7c5025e59d 749 }
Janos Follath 0:1f7c5025e59d 750
mbed_official 78:5f419e0f96dd 751 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 752 mbedtls_blowfish_crypt_cbc(blowfish,
mbed_official 78:5f419e0f96dd 753 MBEDTLS_BLOWFISH_ENCRYPT,
mbed_official 78:5f419e0f96dd 754 BUFSIZE,
mbed_official 78:5f419e0f96dd 755 tmp, buf, buf));
Janos Follath 0:1f7c5025e59d 756 }
mbed_official 70:72c865037f5d 757
mbed_official 78:5f419e0f96dd 758 ret = 0;
mbed_official 78:5f419e0f96dd 759
mbed_official 78:5f419e0f96dd 760 exit:
mbed_official 78:5f419e0f96dd 761 mbedtls_blowfish_free(blowfish);
mbed_official 78:5f419e0f96dd 762 mbedtls_free(blowfish);
mbed_official 78:5f419e0f96dd 763
mbed_official 78:5f419e0f96dd 764 return ret;
mbed_official 78:5f419e0f96dd 765 }
mbed_official 78:5f419e0f96dd 766 #endif /* MBEDTLS_BLOWFISH_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 70:72c865037f5d 767
Janos Follath 0:1f7c5025e59d 768 #if defined(MBEDTLS_HAVEGE_C)
mbed_official 78:5f419e0f96dd 769 MBED_NOINLINE static int benchmark_havege()
mbed_official 78:5f419e0f96dd 770 {
mbed_official 78:5f419e0f96dd 771 int ret = 0;
mbed_official 78:5f419e0f96dd 772 mbedtls_havege_state hs;
mbed_official 78:5f419e0f96dd 773
mbed_official 78:5f419e0f96dd 774 mbedtls_havege_init(&hs);
mbed_official 78:5f419e0f96dd 775
mbed_official 78:5f419e0f96dd 776 BENCHMARK_FUNC_CALL("HAVEGE", mbedtls_havege_random(&hs, buf, BUFSIZE));
mbed_official 78:5f419e0f96dd 777
mbed_official 78:5f419e0f96dd 778 ret = 0;
mbed_official 78:5f419e0f96dd 779
mbed_official 78:5f419e0f96dd 780 exit:
mbed_official 78:5f419e0f96dd 781 mbedtls_havege_free(&hs);
mbed_official 78:5f419e0f96dd 782
mbed_official 78:5f419e0f96dd 783 return ret;
mbed_official 78:5f419e0f96dd 784 }
mbed_official 78:5f419e0f96dd 785 #endif /* MBEDTLS_HAVEGE_C */
Janos Follath 0:1f7c5025e59d 786
Janos Follath 0:1f7c5025e59d 787 #if defined(MBEDTLS_CTR_DRBG_C)
mbed_official 78:5f419e0f96dd 788 MBED_NOINLINE static int benchmark_ctr_drbg()
mbed_official 78:5f419e0f96dd 789 {
mbed_official 78:5f419e0f96dd 790 int ret = 0;
mbed_official 78:5f419e0f96dd 791 const char *nopr_title = "CTR_DRBG (NOPR)";
mbed_official 78:5f419e0f96dd 792 const char *pr_title = "CTR_DRBG (PR)";
mbed_official 78:5f419e0f96dd 793 mbedtls_ctr_drbg_context ctr_drbg;
mbed_official 78:5f419e0f96dd 794
mbed_official 78:5f419e0f96dd 795 mbedtls_ctr_drbg_init(&ctr_drbg);
Janos Follath 0:1f7c5025e59d 796
mbed_official 78:5f419e0f96dd 797 ret = mbedtls_ctr_drbg_seed(&ctr_drbg, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 798 if (ret != 0) {
mbed_official 78:5f419e0f96dd 799 PRINT_ERROR(ret, "mbedtls_ctr_drbg_seed()");
mbed_official 78:5f419e0f96dd 800 goto exit;
mbed_official 78:5f419e0f96dd 801 }
mbed_official 78:5f419e0f96dd 802
mbed_official 78:5f419e0f96dd 803 BENCHMARK_FUNC_CALL(nopr_title,
mbed_official 78:5f419e0f96dd 804 mbedtls_ctr_drbg_random(&ctr_drbg, buf, BUFSIZE));
Janos Follath 0:1f7c5025e59d 805
mbed_official 78:5f419e0f96dd 806 ret = mbedtls_ctr_drbg_seed(&ctr_drbg, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 807 if (ret != 0) {
mbed_official 78:5f419e0f96dd 808 PRINT_ERROR(ret, "mbedtls_ctr_drbg_seed()");
mbed_official 78:5f419e0f96dd 809 goto exit;
mbed_official 78:5f419e0f96dd 810 }
Janos Follath 0:1f7c5025e59d 811
mbed_official 78:5f419e0f96dd 812 mbedtls_ctr_drbg_set_prediction_resistance(&ctr_drbg,
mbed_official 78:5f419e0f96dd 813 MBEDTLS_CTR_DRBG_PR_ON);
mbed_official 78:5f419e0f96dd 814 BENCHMARK_FUNC_CALL(pr_title,
mbed_official 78:5f419e0f96dd 815 mbedtls_ctr_drbg_random(&ctr_drbg, buf, BUFSIZE));
mbed_official 78:5f419e0f96dd 816
mbed_official 78:5f419e0f96dd 817 ret = 0;
mbed_official 78:5f419e0f96dd 818
mbed_official 78:5f419e0f96dd 819 exit:
mbed_official 78:5f419e0f96dd 820 mbedtls_ctr_drbg_free(&ctr_drbg);
mbed_official 78:5f419e0f96dd 821
mbed_official 78:5f419e0f96dd 822 return ret;
mbed_official 78:5f419e0f96dd 823 }
mbed_official 78:5f419e0f96dd 824 #endif /* MBEDTLS_CTR_DRBG_C */
Janos Follath 0:1f7c5025e59d 825
Janos Follath 0:1f7c5025e59d 826 #if defined(MBEDTLS_HMAC_DRBG_C)
mbed_official 78:5f419e0f96dd 827 MBED_NOINLINE static int benchmark_hmac_drbg()
mbed_official 78:5f419e0f96dd 828 {
mbed_official 78:5f419e0f96dd 829 int ret = 0;
mbed_official 78:5f419e0f96dd 830 mbedtls_hmac_drbg_context hmac_drbg;
mbed_official 78:5f419e0f96dd 831 const mbedtls_md_info_t *md_info;
Janos Follath 0:1f7c5025e59d 832
mbed_official 78:5f419e0f96dd 833 mbedtls_hmac_drbg_init(&hmac_drbg);
Janos Follath 0:1f7c5025e59d 834
Janos Follath 0:1f7c5025e59d 835 #if defined(MBEDTLS_SHA1_C)
mbed_official 78:5f419e0f96dd 836 md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1);
mbed_official 78:5f419e0f96dd 837 if (md_info == NULL) {
mbed_official 78:5f419e0f96dd 838 mbedtls_printf("mbedtls_md_info_from_type() returned NULL\n");
mbed_official 78:5f419e0f96dd 839 ret = -1;
mbed_official 78:5f419e0f96dd 840 goto exit;
mbed_official 78:5f419e0f96dd 841 }
Janos Follath 0:1f7c5025e59d 842
mbed_official 78:5f419e0f96dd 843 ret = mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 844 if (ret != 0) {
mbed_official 78:5f419e0f96dd 845 PRINT_ERROR(ret, "mbedtls_hmac_drbg_seed()");
mbed_official 78:5f419e0f96dd 846 goto exit;
mbed_official 78:5f419e0f96dd 847 }
mbed_official 78:5f419e0f96dd 848 BENCHMARK_FUNC_CALL("HMAC_DRBG SHA-1 (NOPR)",
mbed_official 78:5f419e0f96dd 849 mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
mbed_official 78:5f419e0f96dd 850
mbed_official 78:5f419e0f96dd 851 ret = mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 852 if (ret != 0) {
mbed_official 78:5f419e0f96dd 853 PRINT_ERROR(ret, "mbedtls_hmac_drbg_seed()");
mbed_official 78:5f419e0f96dd 854 goto exit;
mbed_official 78:5f419e0f96dd 855 }
mbed_official 78:5f419e0f96dd 856 mbedtls_hmac_drbg_set_prediction_resistance(&hmac_drbg,
mbed_official 78:5f419e0f96dd 857 MBEDTLS_HMAC_DRBG_PR_ON);
mbed_official 78:5f419e0f96dd 858 BENCHMARK_FUNC_CALL("HMAC_DRBG SHA-1 (PR)",
mbed_official 78:5f419e0f96dd 859 mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
mbed_official 78:5f419e0f96dd 860 #endif /* MBEDTLS_SHA1_C */
Janos Follath 0:1f7c5025e59d 861
Janos Follath 0:1f7c5025e59d 862 #if defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 863 md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
mbed_official 78:5f419e0f96dd 864 if (md_info == NULL) {
mbed_official 78:5f419e0f96dd 865 PRINT_ERROR(ret, "mbedtls_md_info_from_type()");
mbed_official 78:5f419e0f96dd 866 goto exit;
mbed_official 78:5f419e0f96dd 867 }
Janos Follath 0:1f7c5025e59d 868
mbed_official 78:5f419e0f96dd 869 ret = mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 870 if (ret != 0) {
mbed_official 78:5f419e0f96dd 871 PRINT_ERROR(ret, "mbedtls_hmac_drbg_seed()");
mbed_official 78:5f419e0f96dd 872 goto exit;
mbed_official 78:5f419e0f96dd 873 }
mbed_official 78:5f419e0f96dd 874 BENCHMARK_FUNC_CALL("HMAC_DRBG SHA-256 (NOPR)",
mbed_official 78:5f419e0f96dd 875 mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
Janos Follath 0:1f7c5025e59d 876
mbed_official 78:5f419e0f96dd 877 ret = mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 878 if (ret != 0) {
mbed_official 78:5f419e0f96dd 879 PRINT_ERROR(ret, "mbedtls_hmac_drbg_seed()");
mbed_official 78:5f419e0f96dd 880 goto exit;
Janos Follath 0:1f7c5025e59d 881 }
mbed_official 78:5f419e0f96dd 882 mbedtls_hmac_drbg_set_prediction_resistance(&hmac_drbg,
mbed_official 78:5f419e0f96dd 883 MBEDTLS_HMAC_DRBG_PR_ON);
mbed_official 78:5f419e0f96dd 884 BENCHMARK_FUNC_CALL("HMAC_DRBG SHA-256 (PR)",
mbed_official 78:5f419e0f96dd 885 mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
mbed_official 78:5f419e0f96dd 886 #endif /* MBEDTLS_SHA256_C */
mbed_official 70:72c865037f5d 887
mbed_official 78:5f419e0f96dd 888 ret = 0;
mbed_official 78:5f419e0f96dd 889
mbed_official 78:5f419e0f96dd 890 exit:
mbed_official 78:5f419e0f96dd 891 mbedtls_hmac_drbg_free(&hmac_drbg);
mbed_official 78:5f419e0f96dd 892
mbed_official 78:5f419e0f96dd 893 return ret;
mbed_official 78:5f419e0f96dd 894 }
mbed_official 78:5f419e0f96dd 895 #endif /* MBEDTLS_HMAC_DRBG_C */
Janos Follath 0:1f7c5025e59d 896
Janos Follath 0:1f7c5025e59d 897 #if defined(MBEDTLS_RSA_C) && \
Janos Follath 0:1f7c5025e59d 898 defined(MBEDTLS_PEM_PARSE_C) && defined(MBEDTLS_PK_PARSE_C)
mbed_official 78:5f419e0f96dd 899 MBED_NOINLINE static int benchmark_rsa()
mbed_official 78:5f419e0f96dd 900 {
mbed_official 78:5f419e0f96dd 901 int ret = 0;
mbed_official 78:5f419e0f96dd 902 mbedtls_pk_context pk;
mbed_official 78:5f419e0f96dd 903 mbedtls_rsa_context *rsa;
mbed_official 78:5f419e0f96dd 904 const char *rsa_keys[] = {
mbed_official 78:5f419e0f96dd 905 RSA_PRIVATE_KEY_2048,
mbed_official 78:5f419e0f96dd 906 RSA_PRIVATE_KEY_4096,
mbed_official 78:5f419e0f96dd 907 };
mbed_official 78:5f419e0f96dd 908 size_t i;
Janos Follath 0:1f7c5025e59d 909
mbed_official 78:5f419e0f96dd 910 for (i = 0; i < sizeof(rsa_keys) / sizeof(rsa_keys[0]) && ret == 0; i++) {
mbed_official 78:5f419e0f96dd 911 mbedtls_pk_init(&pk);
mbed_official 78:5f419e0f96dd 912
mbed_official 78:5f419e0f96dd 913 ret = mbedtls_pk_parse_key(&pk, (const unsigned char *)rsa_keys[i],
mbed_official 78:5f419e0f96dd 914 strlen(rsa_keys[i]) + 1, NULL, 0);
mbed_official 78:5f419e0f96dd 915 if (ret != 0) {
mbed_official 78:5f419e0f96dd 916 PRINT_ERROR(ret, "mbedtls_pk_parse_key()");
mbed_official 78:5f419e0f96dd 917 goto exit;
mbed_official 78:5f419e0f96dd 918 }
mbed_official 78:5f419e0f96dd 919
mbed_official 78:5f419e0f96dd 920 rsa = mbedtls_pk_rsa(pk);
Janos Follath 0:1f7c5025e59d 921
mbed_official 78:5f419e0f96dd 922 ret = mbedtls_snprintf(title, sizeof(title), "RSA-%d",
mbed_official 78:5f419e0f96dd 923 mbedtls_pk_get_bitlen(&pk));
mbed_official 78:5f419e0f96dd 924 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 925 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 926 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 927 goto exit;
mbed_official 78:5f419e0f96dd 928 }
Janos Follath 0:1f7c5025e59d 929
mbed_official 78:5f419e0f96dd 930 BENCHMARK_PUBLIC(title, " public",
mbed_official 78:5f419e0f96dd 931 buf[0] = 0;
mbed_official 78:5f419e0f96dd 932 ret = mbedtls_rsa_public(rsa, buf, buf));
Janos Follath 0:1f7c5025e59d 933
mbed_official 78:5f419e0f96dd 934 BENCHMARK_PUBLIC(title, "private",
mbed_official 78:5f419e0f96dd 935 buf[0] = 0;
mbed_official 78:5f419e0f96dd 936 ret = mbedtls_rsa_private(rsa, myrand, NULL, buf,
mbed_official 78:5f419e0f96dd 937 buf));
Janos Follath 0:1f7c5025e59d 938
mbed_official 78:5f419e0f96dd 939 exit:
mbed_official 78:5f419e0f96dd 940 mbedtls_pk_free(&pk);
Janos Follath 0:1f7c5025e59d 941 }
mbed_official 78:5f419e0f96dd 942
mbed_official 78:5f419e0f96dd 943 return ret;
mbed_official 78:5f419e0f96dd 944 }
mbed_official 78:5f419e0f96dd 945 #endif /* MBEDTLS_RSA_C && MBEDTLS_PEM_PARSE_C && MBEDTLS_PK_PARSE_C */
Janos Follath 0:1f7c5025e59d 946
Janos Follath 0:1f7c5025e59d 947 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_BIGNUM_C)
mbed_official 78:5f419e0f96dd 948 MBED_NOINLINE static int benchmark_dhm()
mbed_official 78:5f419e0f96dd 949 {
mbed_official 78:5f419e0f96dd 950 int ret = 0;
mbed_official 78:5f419e0f96dd 951 int dhm_sizes[] = {
mbed_official 78:5f419e0f96dd 952 2048,
mbed_official 78:5f419e0f96dd 953 3072,
mbed_official 78:5f419e0f96dd 954 };
mbed_official 78:5f419e0f96dd 955 const char *dhm_P[] = {
mbed_official 78:5f419e0f96dd 956 MBEDTLS_DHM_RFC3526_MODP_2048_P,
mbed_official 78:5f419e0f96dd 957 MBEDTLS_DHM_RFC3526_MODP_3072_P,
mbed_official 78:5f419e0f96dd 958 };
mbed_official 78:5f419e0f96dd 959 const char *dhm_G[] = {
mbed_official 78:5f419e0f96dd 960 MBEDTLS_DHM_RFC3526_MODP_2048_G,
mbed_official 78:5f419e0f96dd 961 MBEDTLS_DHM_RFC3526_MODP_3072_G,
mbed_official 78:5f419e0f96dd 962 };
Janos Follath 0:1f7c5025e59d 963
mbed_official 78:5f419e0f96dd 964 mbedtls_dhm_context dhm;
mbed_official 78:5f419e0f96dd 965 size_t olen;
mbed_official 78:5f419e0f96dd 966 size_t i;
mbed_official 78:5f419e0f96dd 967
mbed_official 78:5f419e0f96dd 968 for (i = 0;
mbed_official 78:5f419e0f96dd 969 i < sizeof(dhm_sizes) / sizeof(dhm_sizes[0]) && ret == 0;
mbed_official 78:5f419e0f96dd 970 i++) {
mbed_official 78:5f419e0f96dd 971 mbedtls_dhm_init(&dhm);
Janos Follath 0:1f7c5025e59d 972
mbed_official 78:5f419e0f96dd 973 ret = mbedtls_mpi_read_string(&dhm.P, 16, dhm_P[i]);
mbed_official 78:5f419e0f96dd 974 if (ret != 0) {
mbed_official 78:5f419e0f96dd 975 PRINT_ERROR(ret, "mbedtls_mpi_read_string()");
mbed_official 78:5f419e0f96dd 976 goto exit;
mbed_official 78:5f419e0f96dd 977 }
mbed_official 78:5f419e0f96dd 978 ret = mbedtls_mpi_read_string(&dhm.G, 16, dhm_G[i]);
mbed_official 78:5f419e0f96dd 979 if (ret != 0) {
mbed_official 78:5f419e0f96dd 980 PRINT_ERROR(ret, "mbedtls_mpi_read_string()");
mbed_official 78:5f419e0f96dd 981 goto exit;
mbed_official 78:5f419e0f96dd 982 }
Janos Follath 0:1f7c5025e59d 983
mbed_official 78:5f419e0f96dd 984 dhm.len = mbedtls_mpi_size(&dhm.P);
mbed_official 78:5f419e0f96dd 985 ret = mbedtls_dhm_make_public(&dhm, (int) dhm.len, buf, dhm.len,
mbed_official 78:5f419e0f96dd 986 myrand, NULL);
mbed_official 78:5f419e0f96dd 987 if (ret != 0) {
mbed_official 78:5f419e0f96dd 988 PRINT_ERROR(ret, "mbedtls_dhm_make_public()");
mbed_official 78:5f419e0f96dd 989 goto exit;
Janos Follath 0:1f7c5025e59d 990 }
Janos Follath 0:1f7c5025e59d 991
mbed_official 78:5f419e0f96dd 992 ret = mbedtls_mpi_copy(&dhm.GY, &dhm.GX);
mbed_official 78:5f419e0f96dd 993 if (ret != 0) {
mbed_official 78:5f419e0f96dd 994 PRINT_ERROR(ret, "mbedtls_mpi_copy()");
mbed_official 78:5f419e0f96dd 995 goto exit;
mbed_official 78:5f419e0f96dd 996 }
Janos Follath 0:1f7c5025e59d 997
mbed_official 78:5f419e0f96dd 998 ret = mbedtls_snprintf(title, sizeof(title), "DHE-%d", dhm_sizes[i]);
mbed_official 78:5f419e0f96dd 999 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1000 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1001 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1002 goto exit;
mbed_official 78:5f419e0f96dd 1003 }
Janos Follath 0:1f7c5025e59d 1004
mbed_official 78:5f419e0f96dd 1005 /*
mbed_official 78:5f419e0f96dd 1006 * Benchmarking this requires two function calls that can fail. We
mbed_official 78:5f419e0f96dd 1007 * add a check in between them to check for any errors. In normal
mbed_official 78:5f419e0f96dd 1008 * operation, the overhead of this check is negligible
mbed_official 78:5f419e0f96dd 1009 */
mbed_official 78:5f419e0f96dd 1010 BENCHMARK_PUBLIC(title, "handshake",
mbed_official 78:5f419e0f96dd 1011 ret = mbedtls_dhm_make_public(&dhm, (int)dhm.len,
mbed_official 78:5f419e0f96dd 1012 buf, dhm.len, myrand,
mbed_official 78:5f419e0f96dd 1013 NULL);
mbed_official 78:5f419e0f96dd 1014 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1015 PRINT_ERROR(ret, "mbedtls_dhm_make_public()");
mbed_official 78:5f419e0f96dd 1016 goto exit;
mbed_official 78:5f419e0f96dd 1017 }
mbed_official 78:5f419e0f96dd 1018 ret = mbedtls_dhm_calc_secret(&dhm, buf, sizeof(buf),
mbed_official 78:5f419e0f96dd 1019 &olen, myrand, NULL));
Janos Follath 0:1f7c5025e59d 1020
mbed_official 78:5f419e0f96dd 1021 ret = mbedtls_snprintf(title, sizeof(title), "DH-%d", dhm_sizes[i]);
mbed_official 78:5f419e0f96dd 1022 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1023 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1024 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1025 goto exit;
Janos Follath 0:1f7c5025e59d 1026 }
Janos Follath 0:1f7c5025e59d 1027
mbed_official 78:5f419e0f96dd 1028 BENCHMARK_PUBLIC(title, "handshake",
mbed_official 78:5f419e0f96dd 1029 ret = mbedtls_dhm_calc_secret(&dhm, buf, sizeof(buf),
mbed_official 78:5f419e0f96dd 1030 &olen, myrand, NULL));
mbed_official 78:5f419e0f96dd 1031
mbed_official 78:5f419e0f96dd 1032 exit:
mbed_official 78:5f419e0f96dd 1033 mbedtls_dhm_free(&dhm);
mbed_official 78:5f419e0f96dd 1034 }
mbed_official 78:5f419e0f96dd 1035
mbed_official 78:5f419e0f96dd 1036 return ret;
mbed_official 78:5f419e0f96dd 1037 }
mbed_official 78:5f419e0f96dd 1038 #endif /* MBEDTLS_DHM_C && MBEDTLS_BIGNUM_C */
Janos Follath 0:1f7c5025e59d 1039
mbed_official 78:5f419e0f96dd 1040 #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 1041 MBED_NOINLINE static int benchmark_ecdsa()
mbed_official 78:5f419e0f96dd 1042 {
mbed_official 78:5f419e0f96dd 1043 int ret = 0;
mbed_official 78:5f419e0f96dd 1044 mbedtls_ecdsa_context ecdsa;
mbed_official 78:5f419e0f96dd 1045 const mbedtls_ecp_curve_info *curve_info;
mbed_official 78:5f419e0f96dd 1046 size_t sig_len;
mbed_official 78:5f419e0f96dd 1047 size_t hash_len;
mbed_official 78:5f419e0f96dd 1048
mbed_official 78:5f419e0f96dd 1049 memset(buf, 0x2A, sizeof(buf));
Janos Follath 0:1f7c5025e59d 1050
mbed_official 78:5f419e0f96dd 1051 for (curve_info = mbedtls_ecp_curve_list();
mbed_official 78:5f419e0f96dd 1052 curve_info->grp_id != MBEDTLS_ECP_DP_NONE && ret == 0;
mbed_official 78:5f419e0f96dd 1053 curve_info++) {
mbed_official 78:5f419e0f96dd 1054 mbedtls_ecdsa_init(&ecdsa);
Janos Follath 0:1f7c5025e59d 1055
mbed_official 78:5f419e0f96dd 1056 ret = mbedtls_ecdsa_genkey(&ecdsa, curve_info->grp_id, myrand, NULL);
mbed_official 78:5f419e0f96dd 1057 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1058 PRINT_ERROR(ret, "mbedtls_ecdsa_genkey()");
mbed_official 78:5f419e0f96dd 1059 goto exit;
Janos Follath 0:1f7c5025e59d 1060 }
mbed_official 78:5f419e0f96dd 1061
mbed_official 78:5f419e0f96dd 1062 ecp_clear_precomputed(&ecdsa.grp);
Janos Follath 0:1f7c5025e59d 1063
mbed_official 78:5f419e0f96dd 1064 ret = mbedtls_snprintf(title, sizeof(title), "ECDSA-%s",
mbed_official 78:5f419e0f96dd 1065 curve_info->name);
mbed_official 78:5f419e0f96dd 1066 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1067 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1068 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1069 goto exit;
mbed_official 78:5f419e0f96dd 1070 }
Janos Follath 0:1f7c5025e59d 1071
mbed_official 78:5f419e0f96dd 1072 hash_len = (curve_info->bit_size + 7) / 8;
mbed_official 78:5f419e0f96dd 1073 BENCHMARK_PUBLIC(title, "sign",
mbed_official 78:5f419e0f96dd 1074 ret = mbedtls_ecdsa_write_signature(&ecdsa,
mbed_official 78:5f419e0f96dd 1075 MBEDTLS_MD_SHA256,
mbed_official 78:5f419e0f96dd 1076 buf, hash_len,
mbed_official 78:5f419e0f96dd 1077 tmp, &sig_len,
mbed_official 78:5f419e0f96dd 1078 myrand, NULL));
mbed_official 78:5f419e0f96dd 1079
mbed_official 78:5f419e0f96dd 1080 mbedtls_ecdsa_free(&ecdsa);
mbed_official 78:5f419e0f96dd 1081 }
mbed_official 78:5f419e0f96dd 1082
mbed_official 78:5f419e0f96dd 1083 for (curve_info = mbedtls_ecp_curve_list();
mbed_official 78:5f419e0f96dd 1084 curve_info->grp_id != MBEDTLS_ECP_DP_NONE && ret == 0;
mbed_official 78:5f419e0f96dd 1085 curve_info++) {
mbed_official 78:5f419e0f96dd 1086 mbedtls_ecdsa_init(&ecdsa);
Janos Follath 0:1f7c5025e59d 1087
mbed_official 78:5f419e0f96dd 1088 ret = mbedtls_ecdsa_genkey(&ecdsa, curve_info->grp_id, myrand, NULL);
mbed_official 78:5f419e0f96dd 1089 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1090 PRINT_ERROR(ret, "mbedtls_ecdsa_genkey()");
mbed_official 78:5f419e0f96dd 1091 goto exit;
mbed_official 78:5f419e0f96dd 1092 }
Janos Follath 0:1f7c5025e59d 1093
mbed_official 78:5f419e0f96dd 1094 hash_len = (curve_info->bit_size + 7) / 8;
mbed_official 78:5f419e0f96dd 1095 ret = mbedtls_ecdsa_write_signature(&ecdsa, MBEDTLS_MD_SHA256, buf,
mbed_official 78:5f419e0f96dd 1096 hash_len, tmp, &sig_len, myrand,
mbed_official 78:5f419e0f96dd 1097 NULL);
mbed_official 78:5f419e0f96dd 1098 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1099 PRINT_ERROR(ret, "mbedtls_ecdsa_write_signature()");
mbed_official 78:5f419e0f96dd 1100 goto exit;
mbed_official 78:5f419e0f96dd 1101 }
mbed_official 78:5f419e0f96dd 1102
mbed_official 78:5f419e0f96dd 1103 ecp_clear_precomputed(&ecdsa.grp);
mbed_official 78:5f419e0f96dd 1104
mbed_official 78:5f419e0f96dd 1105 ret = mbedtls_snprintf(title, sizeof(title), "ECDSA-%s",
mbed_official 78:5f419e0f96dd 1106 curve_info->name);
mbed_official 78:5f419e0f96dd 1107 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1108 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1109 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1110 goto exit;
Janos Follath 0:1f7c5025e59d 1111 }
Janos Follath 0:1f7c5025e59d 1112
mbed_official 78:5f419e0f96dd 1113 BENCHMARK_PUBLIC(title, "verify",
mbed_official 78:5f419e0f96dd 1114 ret = mbedtls_ecdsa_read_signature(&ecdsa, buf,
mbed_official 78:5f419e0f96dd 1115 hash_len, tmp,
mbed_official 78:5f419e0f96dd 1116 sig_len));
mbed_official 78:5f419e0f96dd 1117
mbed_official 78:5f419e0f96dd 1118 exit:
mbed_official 78:5f419e0f96dd 1119 mbedtls_ecdsa_free(&ecdsa);
mbed_official 78:5f419e0f96dd 1120 }
mbed_official 78:5f419e0f96dd 1121
mbed_official 78:5f419e0f96dd 1122 return ret;
mbed_official 78:5f419e0f96dd 1123 }
mbed_official 78:5f419e0f96dd 1124 #endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA2565_C */
mbed_official 78:5f419e0f96dd 1125
mbed_official 78:5f419e0f96dd 1126 #if defined(MBEDTLS_ECDH_C)
mbed_official 78:5f419e0f96dd 1127 MBED_NOINLINE static int benchmark_ecdh()
mbed_official 78:5f419e0f96dd 1128 {
mbed_official 78:5f419e0f96dd 1129 int ret = 0;
mbed_official 78:5f419e0f96dd 1130 mbedtls_ecdh_context ecdh;
mbed_official 78:5f419e0f96dd 1131 const mbedtls_ecp_curve_info *curve_info;
mbed_official 78:5f419e0f96dd 1132 size_t olen;
Janos Follath 0:1f7c5025e59d 1133
mbed_official 78:5f419e0f96dd 1134 for (curve_info = mbedtls_ecp_curve_list();
mbed_official 78:5f419e0f96dd 1135 curve_info->grp_id != MBEDTLS_ECP_DP_NONE && ret == 0;
mbed_official 78:5f419e0f96dd 1136 curve_info++) {
mbed_official 78:5f419e0f96dd 1137 mbedtls_ecdh_init(&ecdh);
mbed_official 78:5f419e0f96dd 1138
mbed_official 78:5f419e0f96dd 1139 ret = mbedtls_ecp_group_load(&ecdh.grp, curve_info->grp_id);
mbed_official 78:5f419e0f96dd 1140 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1141 PRINT_ERROR(ret, "mbedtls_ecp_group_load()");
mbed_official 78:5f419e0f96dd 1142 goto exit;
mbed_official 78:5f419e0f96dd 1143 }
mbed_official 78:5f419e0f96dd 1144
mbed_official 78:5f419e0f96dd 1145 ret = mbedtls_ecdh_make_public(&ecdh, &olen, buf, sizeof(buf),
mbed_official 78:5f419e0f96dd 1146 myrand, NULL);
mbed_official 78:5f419e0f96dd 1147 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1148 PRINT_ERROR(ret, "mbedtls_ecdh_make_public()");
mbed_official 78:5f419e0f96dd 1149 goto exit;
mbed_official 78:5f419e0f96dd 1150 }
mbed_official 78:5f419e0f96dd 1151
mbed_official 78:5f419e0f96dd 1152 ret = mbedtls_ecp_copy(&ecdh.Qp, &ecdh.Q);
mbed_official 78:5f419e0f96dd 1153 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1154 PRINT_ERROR(ret, "mbedtls_ecp_copy()");
mbed_official 78:5f419e0f96dd 1155 goto exit;
Janos Follath 0:1f7c5025e59d 1156 }
Janos Follath 0:1f7c5025e59d 1157
mbed_official 78:5f419e0f96dd 1158 ecp_clear_precomputed(&ecdh.grp);
Janos Follath 0:1f7c5025e59d 1159
mbed_official 78:5f419e0f96dd 1160 ret = mbedtls_snprintf(title, sizeof(title), "ECDHE-%s",
mbed_official 78:5f419e0f96dd 1161 curve_info->name);
mbed_official 78:5f419e0f96dd 1162 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1163 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1164 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1165 goto exit;
Janos Follath 0:1f7c5025e59d 1166 }
Janos Follath 0:1f7c5025e59d 1167
mbed_official 78:5f419e0f96dd 1168 /*
mbed_official 78:5f419e0f96dd 1169 * Benchmarking this requires two function calls that can fail. We
mbed_official 78:5f419e0f96dd 1170 * add a check in between them to check for any errors. In normal
mbed_official 78:5f419e0f96dd 1171 * operation, the overhead of this check is negligible
mbed_official 78:5f419e0f96dd 1172 */
mbed_official 78:5f419e0f96dd 1173 BENCHMARK_PUBLIC(title, "handshake",
mbed_official 78:5f419e0f96dd 1174 ret = mbedtls_ecdh_make_public(&ecdh, &olen, buf,
mbed_official 78:5f419e0f96dd 1175 sizeof(buf), myrand,
mbed_official 78:5f419e0f96dd 1176 NULL);
mbed_official 78:5f419e0f96dd 1177 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1178 PRINT_ERROR(ret, "mbedtls_ecdh_make_public()");
mbed_official 78:5f419e0f96dd 1179 goto exit;
mbed_official 78:5f419e0f96dd 1180 }
mbed_official 78:5f419e0f96dd 1181 ret = mbedtls_ecdh_calc_secret(&ecdh, &olen, buf,
mbed_official 78:5f419e0f96dd 1182 sizeof(buf), myrand,
mbed_official 78:5f419e0f96dd 1183 NULL));
mbed_official 78:5f419e0f96dd 1184 mbedtls_ecdh_free(&ecdh);
mbed_official 78:5f419e0f96dd 1185 }
mbed_official 78:5f419e0f96dd 1186
mbed_official 78:5f419e0f96dd 1187 for (curve_info = mbedtls_ecp_curve_list();
mbed_official 78:5f419e0f96dd 1188 curve_info->grp_id != MBEDTLS_ECP_DP_NONE && ret == 0;
mbed_official 78:5f419e0f96dd 1189 curve_info++) {
mbed_official 78:5f419e0f96dd 1190 mbedtls_ecdh_init(&ecdh);
Janos Follath 0:1f7c5025e59d 1191
mbed_official 78:5f419e0f96dd 1192 ret = mbedtls_ecp_group_load(&ecdh.grp, curve_info->grp_id);
mbed_official 78:5f419e0f96dd 1193 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1194 PRINT_ERROR(ret, "mbedtls_ecp_group_load()");
mbed_official 78:5f419e0f96dd 1195 goto exit;
mbed_official 78:5f419e0f96dd 1196 }
mbed_official 78:5f419e0f96dd 1197
mbed_official 78:5f419e0f96dd 1198 ret = mbedtls_ecdh_make_public(&ecdh, &olen, buf, sizeof(buf), myrand,
mbed_official 78:5f419e0f96dd 1199 NULL);
mbed_official 78:5f419e0f96dd 1200 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1201 PRINT_ERROR(ret, "mbedtls_ecdh_make_public()");
mbed_official 78:5f419e0f96dd 1202 goto exit;
mbed_official 78:5f419e0f96dd 1203 }
mbed_official 78:5f419e0f96dd 1204
mbed_official 78:5f419e0f96dd 1205 ret = mbedtls_ecp_copy(&ecdh.Qp, &ecdh.Q);
mbed_official 78:5f419e0f96dd 1206 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1207 PRINT_ERROR(ret, "mbedtls_ecp_copy()");
mbed_official 78:5f419e0f96dd 1208 goto exit;
mbed_official 78:5f419e0f96dd 1209 }
mbed_official 78:5f419e0f96dd 1210
mbed_official 78:5f419e0f96dd 1211 ret = mbedtls_ecdh_make_public(&ecdh, &olen, buf, sizeof(buf), myrand,
mbed_official 78:5f419e0f96dd 1212 NULL);
mbed_official 78:5f419e0f96dd 1213 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1214 PRINT_ERROR(ret, "mbedtls_ecdh_make_public()");
mbed_official 78:5f419e0f96dd 1215 goto exit;
Janos Follath 0:1f7c5025e59d 1216 }
Janos Follath 0:1f7c5025e59d 1217
mbed_official 78:5f419e0f96dd 1218 ecp_clear_precomputed(&ecdh.grp);
mbed_official 70:72c865037f5d 1219
mbed_official 78:5f419e0f96dd 1220 ret = mbedtls_snprintf(title, sizeof(title), "ECDH-%s",
mbed_official 78:5f419e0f96dd 1221 curve_info->name);
mbed_official 78:5f419e0f96dd 1222 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1223 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1224 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1225 goto exit;
mbed_official 78:5f419e0f96dd 1226 }
mbed_official 78:5f419e0f96dd 1227 BENCHMARK_PUBLIC(title, "handshake",
mbed_official 78:5f419e0f96dd 1228 ret = mbedtls_ecdh_calc_secret(&ecdh, &olen, buf,
mbed_official 78:5f419e0f96dd 1229 sizeof(buf), myrand,
mbed_official 78:5f419e0f96dd 1230 NULL));
mbed_official 70:72c865037f5d 1231
mbed_official 78:5f419e0f96dd 1232 exit:
mbed_official 78:5f419e0f96dd 1233 mbedtls_ecdh_free(&ecdh);
mbed_official 70:72c865037f5d 1234 }
mbed_official 78:5f419e0f96dd 1235
mbed_official 78:5f419e0f96dd 1236 return ret;
mbed_official 78:5f419e0f96dd 1237 }
mbed_official 78:5f419e0f96dd 1238 #endif /* MBEDTLS_ECDH_C */
mbed_official 70:72c865037f5d 1239
mbed_official 78:5f419e0f96dd 1240 #if defined(MBEDTLS_ECDH_C) && defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
mbed_official 78:5f419e0f96dd 1241 /* Curve25519 needs to be handled separately */
mbed_official 78:5f419e0f96dd 1242 MBED_NOINLINE static int benchmark_ecdh_curve22519()
mbed_official 78:5f419e0f96dd 1243 {
mbed_official 78:5f419e0f96dd 1244 int ret = 0;
mbed_official 78:5f419e0f96dd 1245 mbedtls_ecdh_context ecdh;
mbed_official 78:5f419e0f96dd 1246 mbedtls_mpi z;
mbed_official 78:5f419e0f96dd 1247
mbed_official 78:5f419e0f96dd 1248 mbedtls_ecdh_init(&ecdh);
mbed_official 78:5f419e0f96dd 1249 mbedtls_mpi_init(&z);
mbed_official 78:5f419e0f96dd 1250
mbed_official 78:5f419e0f96dd 1251 ret = mbedtls_ecp_group_load(&ecdh.grp, MBEDTLS_ECP_DP_CURVE25519);
mbed_official 78:5f419e0f96dd 1252 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1253 PRINT_ERROR(ret, "mbedtls_ecp_group_load()");
mbed_official 78:5f419e0f96dd 1254 goto exit;
mbed_official 78:5f419e0f96dd 1255 }
mbed_official 78:5f419e0f96dd 1256
mbed_official 78:5f419e0f96dd 1257 ret = mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d, &ecdh.Qp, myrand,
mbed_official 78:5f419e0f96dd 1258 NULL);
mbed_official 78:5f419e0f96dd 1259 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1260 PRINT_ERROR(ret, "mbedtls_ecdh_gen_public()");
mbed_official 78:5f419e0f96dd 1261 goto exit;
mbed_official 70:72c865037f5d 1262 }
mbed_official 70:72c865037f5d 1263
mbed_official 78:5f419e0f96dd 1264 /*
mbed_official 78:5f419e0f96dd 1265 * Benchmarking this requires two function calls that can fail. We
mbed_official 78:5f419e0f96dd 1266 * add a check in between them to check for any errors. In normal
mbed_official 78:5f419e0f96dd 1267 * operation, the overhead of this check is negligible
mbed_official 78:5f419e0f96dd 1268 */
mbed_official 78:5f419e0f96dd 1269 BENCHMARK_PUBLIC("ECDHE-Curve25519", "handshake",
mbed_official 78:5f419e0f96dd 1270 ret = mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d,
mbed_official 78:5f419e0f96dd 1271 &ecdh.Q, myrand, NULL);
mbed_official 78:5f419e0f96dd 1272 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1273 PRINT_ERROR(ret, "mbedtls_ecdh_make_public()");
mbed_official 78:5f419e0f96dd 1274 goto exit;
mbed_official 78:5f419e0f96dd 1275 }
mbed_official 78:5f419e0f96dd 1276 ret = mbedtls_ecdh_compute_shared(&ecdh.grp, &z,
mbed_official 78:5f419e0f96dd 1277 &ecdh.Qp, &ecdh.d,
mbed_official 78:5f419e0f96dd 1278 myrand, NULL));
mbed_official 70:72c865037f5d 1279
mbed_official 78:5f419e0f96dd 1280 mbedtls_ecdh_free(&ecdh);
mbed_official 78:5f419e0f96dd 1281 mbedtls_mpi_free(&z);
mbed_official 78:5f419e0f96dd 1282
mbed_official 78:5f419e0f96dd 1283 mbedtls_ecdh_init(&ecdh);
mbed_official 78:5f419e0f96dd 1284 mbedtls_mpi_init(&z);
mbed_official 78:5f419e0f96dd 1285
mbed_official 78:5f419e0f96dd 1286 ret = mbedtls_ecp_group_load(&ecdh.grp, MBEDTLS_ECP_DP_CURVE25519);
mbed_official 78:5f419e0f96dd 1287 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1288 PRINT_ERROR(ret, "mbedtls_ecp_group_load()");
mbed_official 78:5f419e0f96dd 1289 goto exit;
mbed_official 78:5f419e0f96dd 1290 }
Janos Follath 0:1f7c5025e59d 1291
mbed_official 78:5f419e0f96dd 1292 ret = mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d, &ecdh.Qp, myrand, NULL);
mbed_official 78:5f419e0f96dd 1293 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1294 PRINT_ERROR(ret, "mbedtls_ecdh_gen_public()");
mbed_official 78:5f419e0f96dd 1295 goto exit;
mbed_official 78:5f419e0f96dd 1296 }
Janos Follath 0:1f7c5025e59d 1297
mbed_official 78:5f419e0f96dd 1298 ret = mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d, &ecdh.Q, myrand, NULL);
mbed_official 78:5f419e0f96dd 1299 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1300 PRINT_ERROR(ret, "mbedtls_ecdh_gen_public()");
mbed_official 78:5f419e0f96dd 1301 goto exit;
mbed_official 78:5f419e0f96dd 1302 }
Janos Follath 0:1f7c5025e59d 1303
mbed_official 78:5f419e0f96dd 1304 BENCHMARK_PUBLIC("ECDH-Curve25519", "handshake",
mbed_official 78:5f419e0f96dd 1305 ret = mbedtls_ecdh_compute_shared(&ecdh.grp, &z,
mbed_official 78:5f419e0f96dd 1306 &ecdh.Qp, &ecdh.d,
mbed_official 78:5f419e0f96dd 1307 myrand, NULL));
mbed_official 78:5f419e0f96dd 1308
mbed_official 78:5f419e0f96dd 1309 exit:
mbed_official 78:5f419e0f96dd 1310 mbedtls_ecdh_free(&ecdh);
mbed_official 78:5f419e0f96dd 1311 mbedtls_mpi_free(&z);
mbed_official 78:5f419e0f96dd 1312
mbed_official 78:5f419e0f96dd 1313 return ret;
Janos Follath 0:1f7c5025e59d 1314 }
mbed_official 78:5f419e0f96dd 1315 #endif /* MBEDTLS_ECDH_C && MBEDTLS_ECP_DP_CURVE25519_ENABLED */
Janos Follath 0:1f7c5025e59d 1316
mbed_official 78:5f419e0f96dd 1317 int main()
mbed_official 78:5f419e0f96dd 1318 {
mbed_official 63:9f7e5224fc60 1319 mbedtls_platform_context platform_ctx;
mbed_official 78:5f419e0f96dd 1320 int exit_code = MBEDTLS_EXIT_SUCCESS;
mbed_official 63:9f7e5224fc60 1321
mbed_official 78:5f419e0f96dd 1322 memset(buf, 0xAA, sizeof(buf));
mbed_official 78:5f419e0f96dd 1323 memset(tmp, 0xBB, sizeof(tmp));
mbed_official 78:5f419e0f96dd 1324
mbed_official 78:5f419e0f96dd 1325 if ((exit_code = mbedtls_platform_setup(&platform_ctx)) != 0) {
mbed_official 78:5f419e0f96dd 1326 mbedtls_printf("Platform initialization failed with error %d\r\n",
mbed_official 78:5f419e0f96dd 1327 exit_code);
mbed_official 63:9f7e5224fc60 1328 return MBEDTLS_EXIT_FAILURE;
Janos Follath 0:1f7c5025e59d 1329 }
mbed_official 63:9f7e5224fc60 1330
mbed_official 78:5f419e0f96dd 1331 #if defined(MBEDTLS_MD4_C)
mbed_official 78:5f419e0f96dd 1332 if (benchmark_md4() != 0) {
mbed_official 78:5f419e0f96dd 1333 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1334 }
mbed_official 78:5f419e0f96dd 1335 #endif /* MBEDTLS_MD4_C */
mbed_official 78:5f419e0f96dd 1336
mbed_official 78:5f419e0f96dd 1337 #if defined(MBEDTLS_MD5_C)
mbed_official 78:5f419e0f96dd 1338 if (benchmark_md5() != 0) {
mbed_official 78:5f419e0f96dd 1339 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1340 }
mbed_official 78:5f419e0f96dd 1341 #endif /* MBEDTLS_MD5_C */
mbed_official 78:5f419e0f96dd 1342
mbed_official 78:5f419e0f96dd 1343 #if defined(MBEDTLS_RIPEMD160_C)
mbed_official 78:5f419e0f96dd 1344 if (benchmark_ripemd160() != 0) {
mbed_official 78:5f419e0f96dd 1345 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1346 }
mbed_official 78:5f419e0f96dd 1347 #endif /* MBEDTLS_RIPEMD160_C */
mbed_official 78:5f419e0f96dd 1348
mbed_official 78:5f419e0f96dd 1349 #if defined(MBEDTLS_SHA1_C)
mbed_official 78:5f419e0f96dd 1350 if (benchmark_sha1() != 0) {
mbed_official 78:5f419e0f96dd 1351 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1352 }
mbed_official 78:5f419e0f96dd 1353 #endif /* MBEDTLS_SHA1_C */
mbed_official 78:5f419e0f96dd 1354
mbed_official 78:5f419e0f96dd 1355 #if defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 1356 if (benchmark_sha256() != 0) {
mbed_official 78:5f419e0f96dd 1357 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1358 }
mbed_official 78:5f419e0f96dd 1359 #endif /* MBEDTLS_SHA256_C */
mbed_official 78:5f419e0f96dd 1360
mbed_official 78:5f419e0f96dd 1361 #if defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 1362 if (benchmark_sha512() != 0) {
mbed_official 78:5f419e0f96dd 1363 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1364 }
mbed_official 78:5f419e0f96dd 1365 #endif /* MBEDTLS_SHA512_C */
mbed_official 78:5f419e0f96dd 1366
mbed_official 78:5f419e0f96dd 1367 #if defined(MBEDTLS_ARC4_C)
mbed_official 78:5f419e0f96dd 1368 if (benchmark_arc4() != 0) {
mbed_official 78:5f419e0f96dd 1369 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1370 }
mbed_official 78:5f419e0f96dd 1371 #endif /* MBEDTLS_ARC4_C */
mbed_official 78:5f419e0f96dd 1372
mbed_official 78:5f419e0f96dd 1373 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 1374 if (benchmark_des3() != 0) {
mbed_official 78:5f419e0f96dd 1375 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1376 }
mbed_official 78:5f419e0f96dd 1377 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 1378
mbed_official 78:5f419e0f96dd 1379 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 1380 if (benchmark_des() != 0) {
mbed_official 78:5f419e0f96dd 1381 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1382 }
mbed_official 78:5f419e0f96dd 1383 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 1384
mbed_official 78:5f419e0f96dd 1385 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \
mbed_official 78:5f419e0f96dd 1386 defined(MBEDTLS_CMAC_C)
mbed_official 78:5f419e0f96dd 1387 if (benchmark_des3_cmac() != 0) {
mbed_official 78:5f419e0f96dd 1388 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1389 }
mbed_official 78:5f419e0f96dd 1390 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC && MBEDTLS_CMAC_C */
mbed_official 78:5f419e0f96dd 1391
mbed_official 78:5f419e0f96dd 1392 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 1393 if (benchmark_aes_cbc() != 0) {
mbed_official 78:5f419e0f96dd 1394 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1395 }
mbed_official 78:5f419e0f96dd 1396 #endif /* MBEDTLS_AES_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 1397
mbed_official 78:5f419e0f96dd 1398 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CIPHER_MODE_CTR)
mbed_official 78:5f419e0f96dd 1399 if (benchmark_aes_ctr() != 0) {
mbed_official 78:5f419e0f96dd 1400 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1401 }
mbed_official 78:5f419e0f96dd 1402 #endif /* MBEDTLS_AES_C && MBEDTLS_CIPHER_MODE_CTR */
mbed_official 78:5f419e0f96dd 1403
mbed_official 78:5f419e0f96dd 1404 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_GCM_C)
mbed_official 78:5f419e0f96dd 1405 if (benchmark_aes_gcm() != 0) {
mbed_official 78:5f419e0f96dd 1406 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1407 }
mbed_official 78:5f419e0f96dd 1408 #endif /* MBEDTLS_AES_C && MBEDTLS_GCM_C */
mbed_official 78:5f419e0f96dd 1409
mbed_official 78:5f419e0f96dd 1410 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CCM_C)
mbed_official 78:5f419e0f96dd 1411 if (benchmark_aes_ccm() != 0) {
mbed_official 78:5f419e0f96dd 1412 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1413 }
mbed_official 78:5f419e0f96dd 1414 #endif /* MBEDTLS_AES_C && MBEDTLS_CCM_C */
mbed_official 78:5f419e0f96dd 1415
mbed_official 78:5f419e0f96dd 1416 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CMAC_C)
mbed_official 78:5f419e0f96dd 1417 if (benchmark_aes_cmac() != 0) {
mbed_official 78:5f419e0f96dd 1418 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1419 }
mbed_official 78:5f419e0f96dd 1420 #endif /* MBEDTLS_AES_C && MBEDTLS_CMAC_C */
mbed_official 78:5f419e0f96dd 1421
mbed_official 78:5f419e0f96dd 1422 #if defined(MBEDTLS_CAMELLIA_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 1423 if (benchmark_camellia() != 0) {
mbed_official 78:5f419e0f96dd 1424 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1425 }
mbed_official 78:5f419e0f96dd 1426 #endif /* MBEDTLS_CAMELLIA_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 1427
mbed_official 78:5f419e0f96dd 1428 #if defined(MBEDTLS_BLOWFISH_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 1429 if (benchmark_blowfish() != 0) {
mbed_official 78:5f419e0f96dd 1430 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1431 }
mbed_official 78:5f419e0f96dd 1432 #endif /* MBEDTLS_BLOWFISH_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 1433
mbed_official 78:5f419e0f96dd 1434 #if defined(MBEDTLS_HAVEGE_C)
mbed_official 78:5f419e0f96dd 1435 if (benchmark_havege() != 0) {
mbed_official 78:5f419e0f96dd 1436 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1437 }
mbed_official 78:5f419e0f96dd 1438 #endif /* MBEDTLS_HAVEGE_C */
mbed_official 78:5f419e0f96dd 1439
mbed_official 78:5f419e0f96dd 1440 #if defined(MBEDTLS_CTR_DRBG_C)
mbed_official 78:5f419e0f96dd 1441 if (benchmark_ctr_drbg() != 0) {
mbed_official 78:5f419e0f96dd 1442 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1443 }
mbed_official 78:5f419e0f96dd 1444 #endif /* MBEDTLS_CTR_DRBG_C */
mbed_official 78:5f419e0f96dd 1445
mbed_official 78:5f419e0f96dd 1446 #if defined(MBEDTLS_HMAC_DRBG_C)
mbed_official 78:5f419e0f96dd 1447 if (benchmark_hmac_drbg() != 0) {
mbed_official 78:5f419e0f96dd 1448 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1449 }
mbed_official 78:5f419e0f96dd 1450 #endif /* MBEDTLS_HMAC_DRBG_C */
mbed_official 78:5f419e0f96dd 1451
mbed_official 78:5f419e0f96dd 1452 #if defined(MBEDTLS_RSA_C) && \
mbed_official 78:5f419e0f96dd 1453 defined(MBEDTLS_PEM_PARSE_C) && defined(MBEDTLS_PK_PARSE_C)
mbed_official 78:5f419e0f96dd 1454 if (benchmark_rsa() != 0) {
mbed_official 78:5f419e0f96dd 1455 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1456 }
mbed_official 78:5f419e0f96dd 1457 #endif /* MBEDTLS_RSA_C && MBEDTLS_PEM_PARSE_C && MBEDTLS_PK_PARSE_C */
mbed_official 78:5f419e0f96dd 1458
mbed_official 78:5f419e0f96dd 1459 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_BIGNUM_C)
mbed_official 78:5f419e0f96dd 1460 if (benchmark_dhm() != 0) {
mbed_official 78:5f419e0f96dd 1461 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1462 }
mbed_official 78:5f419e0f96dd 1463 #endif /* MBEDTLS_DHM_C && MBEDTLS_BIGNUM_C */
mbed_official 78:5f419e0f96dd 1464
mbed_official 78:5f419e0f96dd 1465 #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 1466 if (benchmark_ecdsa() != 0) {
mbed_official 78:5f419e0f96dd 1467 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1468 }
mbed_official 78:5f419e0f96dd 1469 #endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA2565_C */
mbed_official 78:5f419e0f96dd 1470
mbed_official 78:5f419e0f96dd 1471 #if defined(MBEDTLS_ECDH_C)
mbed_official 78:5f419e0f96dd 1472 if (benchmark_ecdh() != 0) {
mbed_official 63:9f7e5224fc60 1473 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 63:9f7e5224fc60 1474 }
mbed_official 63:9f7e5224fc60 1475
mbed_official 78:5f419e0f96dd 1476 #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
mbed_official 78:5f419e0f96dd 1477 if (benchmark_ecdh_curve22519() != 0) {
mbed_official 78:5f419e0f96dd 1478 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1479 }
mbed_official 78:5f419e0f96dd 1480 #endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */
mbed_official 78:5f419e0f96dd 1481 #endif /* MBEDTLS_ECDH_C */
mbed_official 78:5f419e0f96dd 1482
mbed_official 78:5f419e0f96dd 1483 mbedtls_printf("DONE\n");
mbed_official 78:5f419e0f96dd 1484
mbed_official 63:9f7e5224fc60 1485 mbedtls_platform_teardown(&platform_ctx);
mbed_official 78:5f419e0f96dd 1486
mbed_official 63:9f7e5224fc60 1487 return exit_code;
Janos Follath 0:1f7c5025e59d 1488 }