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:
Wed Nov 21 09:45:09 2018 +0000
Revision:
82:9f8b9b63571e
Parent:
80:0f7a38bbcebe
Child:
83:c40c51a46813
Merge pull request #215 from cmonr/master

Updating mbed-os to mbed-os-5.10.4
The failing tests are tracked as known issues
.
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 #if defined(MBEDTLS_ARC4_C)
mbed_official 78:5f419e0f96dd 347 MBED_NOINLINE static int benchmark_arc4()
mbed_official 78:5f419e0f96dd 348 {
mbed_official 78:5f419e0f96dd 349 int ret = 0;
mbed_official 78:5f419e0f96dd 350 mbedtls_arc4_context arc4;
mbed_official 78:5f419e0f96dd 351
mbed_official 78:5f419e0f96dd 352 mbedtls_arc4_init(&arc4);
mbed_official 78:5f419e0f96dd 353
mbed_official 78:5f419e0f96dd 354 mbedtls_arc4_setup(&arc4, tmp, 32);
mbed_official 78:5f419e0f96dd 355 BENCHMARK_FUNC_CALL("ARC4",
mbed_official 78:5f419e0f96dd 356 mbedtls_arc4_crypt(&arc4, BUFSIZE, buf, buf));
mbed_official 78:5f419e0f96dd 357
mbed_official 78:5f419e0f96dd 358 ret = 0;
mbed_official 78:5f419e0f96dd 359
mbed_official 78:5f419e0f96dd 360 exit:
mbed_official 78:5f419e0f96dd 361 mbedtls_arc4_free(&arc4);
mbed_official 78:5f419e0f96dd 362
mbed_official 78:5f419e0f96dd 363 return ret;
mbed_official 78:5f419e0f96dd 364 }
mbed_official 78:5f419e0f96dd 365 #endif /* MBEDTLS_ARC4_C */
mbed_official 78:5f419e0f96dd 366
mbed_official 78:5f419e0f96dd 367 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 368 MBED_NOINLINE static int benchmark_des3()
mbed_official 78:5f419e0f96dd 369 {
mbed_official 78:5f419e0f96dd 370 int ret = 0;
mbed_official 78:5f419e0f96dd 371 mbedtls_des3_context des3;
mbed_official 78:5f419e0f96dd 372
mbed_official 78:5f419e0f96dd 373 mbedtls_des3_init(&des3);
mbed_official 78:5f419e0f96dd 374
mbed_official 78:5f419e0f96dd 375 if ((ret = mbedtls_des3_set3key_enc(&des3, tmp)) != 0) {
mbed_official 78:5f419e0f96dd 376 PRINT_ERROR(ret, "mbedtls_des3_set3key_enc()");
mbed_official 78:5f419e0f96dd 377 goto exit;
Janos Follath 0:1f7c5025e59d 378 }
mbed_official 78:5f419e0f96dd 379 BENCHMARK_FUNC_CALL("3DES",
mbed_official 78:5f419e0f96dd 380 mbedtls_des3_crypt_cbc(&des3, MBEDTLS_DES_ENCRYPT,
mbed_official 78:5f419e0f96dd 381 BUFSIZE, tmp, buf, buf));
mbed_official 78:5f419e0f96dd 382
mbed_official 78:5f419e0f96dd 383 ret = 0;
mbed_official 78:5f419e0f96dd 384
mbed_official 78:5f419e0f96dd 385 exit:
mbed_official 78:5f419e0f96dd 386 mbedtls_des3_free(&des3);
mbed_official 78:5f419e0f96dd 387
mbed_official 78:5f419e0f96dd 388 return ret;
mbed_official 78:5f419e0f96dd 389 }
mbed_official 78:5f419e0f96dd 390 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC */
Janos Follath 0:1f7c5025e59d 391
Janos Follath 0:1f7c5025e59d 392 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 393 MBED_NOINLINE static int benchmark_des()
mbed_official 78:5f419e0f96dd 394 {
mbed_official 78:5f419e0f96dd 395 int ret = 0;
mbed_official 78:5f419e0f96dd 396 mbedtls_des_context des;
mbed_official 78:5f419e0f96dd 397
mbed_official 78:5f419e0f96dd 398 mbedtls_des_init(&des);
mbed_official 78:5f419e0f96dd 399
mbed_official 78:5f419e0f96dd 400 if ((ret = mbedtls_des_setkey_enc(&des, tmp)) != 0) {
mbed_official 78:5f419e0f96dd 401 PRINT_ERROR(ret, "mbedtls_des_setkey_enc()");
mbed_official 78:5f419e0f96dd 402 goto exit;
mbed_official 78:5f419e0f96dd 403 }
mbed_official 78:5f419e0f96dd 404 BENCHMARK_FUNC_CALL("DES",
mbed_official 78:5f419e0f96dd 405 mbedtls_des_crypt_cbc(&des, MBEDTLS_DES_ENCRYPT,
mbed_official 78:5f419e0f96dd 406 BUFSIZE, tmp, buf, buf));
mbed_official 78:5f419e0f96dd 407
mbed_official 78:5f419e0f96dd 408 ret = 0;
mbed_official 78:5f419e0f96dd 409
mbed_official 78:5f419e0f96dd 410 exit:
mbed_official 78:5f419e0f96dd 411 mbedtls_des_free(&des);
mbed_official 78:5f419e0f96dd 412
mbed_official 78:5f419e0f96dd 413 return ret;
mbed_official 78:5f419e0f96dd 414 }
mbed_official 78:5f419e0f96dd 415 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 416
mbed_official 78:5f419e0f96dd 417 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \
mbed_official 78:5f419e0f96dd 418 defined(MBEDTLS_CMAC_C)
mbed_official 78:5f419e0f96dd 419 MBED_NOINLINE static int benchmark_des3_cmac()
mbed_official 78:5f419e0f96dd 420 {
mbed_official 78:5f419e0f96dd 421 int ret = 0;
mbed_official 78:5f419e0f96dd 422 unsigned char output[8];
mbed_official 78:5f419e0f96dd 423 const mbedtls_cipher_info_t *cipher_info;
mbed_official 78:5f419e0f96dd 424
mbed_official 78:5f419e0f96dd 425 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 426 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 427
mbed_official 78:5f419e0f96dd 428 cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_DES_EDE3_ECB);
mbed_official 78:5f419e0f96dd 429 if (cipher_info == NULL) {
mbed_official 78:5f419e0f96dd 430 mbedtls_printf("mbedtls_cipher_info_from_type() returned NULL\n");
mbed_official 78:5f419e0f96dd 431 return -1;
mbed_official 78:5f419e0f96dd 432 }
mbed_official 78:5f419e0f96dd 433
mbed_official 78:5f419e0f96dd 434 BENCHMARK_FUNC_CALL("3DES-CMAC",
mbed_official 78:5f419e0f96dd 435 mbedtls_cipher_cmac(cipher_info, tmp, 192, buf,
mbed_official 78:5f419e0f96dd 436 BUFSIZE, output));
mbed_official 78:5f419e0f96dd 437
mbed_official 78:5f419e0f96dd 438 ret = 0;
mbed_official 78:5f419e0f96dd 439
mbed_official 78:5f419e0f96dd 440 exit:
mbed_official 78:5f419e0f96dd 441 return ret;
mbed_official 78:5f419e0f96dd 442 }
mbed_official 78:5f419e0f96dd 443 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC && MBEDTLS_CMAC_C */
mbed_official 78:5f419e0f96dd 444
mbed_official 78:5f419e0f96dd 445 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 446 MBED_NOINLINE static int benchmark_aes_cbc()
mbed_official 78:5f419e0f96dd 447 {
mbed_official 78:5f419e0f96dd 448 int ret = 0;
mbed_official 78:5f419e0f96dd 449 int keysize;
mbed_official 78:5f419e0f96dd 450 mbedtls_aes_context aes;
mbed_official 78:5f419e0f96dd 451
mbed_official 78:5f419e0f96dd 452 mbedtls_aes_init(&aes);
mbed_official 78:5f419e0f96dd 453
mbed_official 78:5f419e0f96dd 454 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 455 ret = mbedtls_snprintf(title, sizeof(title), "AES-CBC-%d", keysize);
mbed_official 78:5f419e0f96dd 456 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 457 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 458 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 459 goto exit;
mbed_official 78:5f419e0f96dd 460 }
mbed_official 78:5f419e0f96dd 461
mbed_official 78:5f419e0f96dd 462 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 463 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 464
mbed_official 78:5f419e0f96dd 465 ret = mbedtls_aes_setkey_enc(&aes, tmp, keysize);
mbed_official 78:5f419e0f96dd 466 if (ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) {
mbed_official 78:5f419e0f96dd 467 /* Do not consider this as a failure */
mbed_official 78:5f419e0f96dd 468 mbedtls_printf(HEADER_FORMAT "Feature unavailable\n", title);
mbed_official 78:5f419e0f96dd 469 continue;
mbed_official 78:5f419e0f96dd 470 } else if (ret != 0) {
mbed_official 78:5f419e0f96dd 471 PRINT_ERROR(ret, "mbedtls_aes_setkey_enc()");
mbed_official 78:5f419e0f96dd 472 goto exit;
mbed_official 78:5f419e0f96dd 473 }
mbed_official 78:5f419e0f96dd 474
mbed_official 78:5f419e0f96dd 475 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 476 mbedtls_aes_crypt_cbc(&aes,
mbed_official 78:5f419e0f96dd 477 MBEDTLS_AES_ENCRYPT, BUFSIZE,
mbed_official 78:5f419e0f96dd 478 tmp, buf, buf));
mbed_official 78:5f419e0f96dd 479 }
mbed_official 78:5f419e0f96dd 480
mbed_official 78:5f419e0f96dd 481 ret = 0;
mbed_official 78:5f419e0f96dd 482
mbed_official 78:5f419e0f96dd 483 exit:
mbed_official 78:5f419e0f96dd 484 mbedtls_aes_free(&aes);
mbed_official 78:5f419e0f96dd 485
mbed_official 78:5f419e0f96dd 486 return ret;
mbed_official 78:5f419e0f96dd 487 }
mbed_official 78:5f419e0f96dd 488 #endif /* MBEDTLS_AES_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 489
mbed_official 78:5f419e0f96dd 490 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CIPHER_MODE_CTR)
mbed_official 78:5f419e0f96dd 491 MBED_NOINLINE static int benchmark_aes_ctr()
mbed_official 78:5f419e0f96dd 492 {
mbed_official 78:5f419e0f96dd 493 int ret = 0;
mbed_official 78:5f419e0f96dd 494 int keysize;
mbed_official 78:5f419e0f96dd 495 size_t nc_offset = 0;
mbed_official 78:5f419e0f96dd 496 unsigned char stream_block[16];
mbed_official 78:5f419e0f96dd 497 mbedtls_aes_context aes;
mbed_official 78:5f419e0f96dd 498
mbed_official 78:5f419e0f96dd 499 mbedtls_aes_init(&aes);
mbed_official 78:5f419e0f96dd 500
mbed_official 78:5f419e0f96dd 501 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 502 ret = mbedtls_snprintf(title, sizeof(title), "AES-CTR-%d", keysize);
mbed_official 78:5f419e0f96dd 503 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 504 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 505 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 506 goto exit;
mbed_official 78:5f419e0f96dd 507 }
mbed_official 78:5f419e0f96dd 508
mbed_official 78:5f419e0f96dd 509 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 510 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 511
mbed_official 78:5f419e0f96dd 512 ret = mbedtls_aes_setkey_enc(&aes, tmp, keysize);
mbed_official 78:5f419e0f96dd 513 if (ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) {
mbed_official 78:5f419e0f96dd 514 /* Do not consider this as a failure */
mbed_official 78:5f419e0f96dd 515 mbedtls_printf(HEADER_FORMAT "Feature unavailable\n", title);
mbed_official 78:5f419e0f96dd 516 continue;
mbed_official 78:5f419e0f96dd 517 } else if (ret != 0) {
mbed_official 78:5f419e0f96dd 518 PRINT_ERROR(ret, "mbedtls_aes_setkey_enc()");
mbed_official 78:5f419e0f96dd 519 goto exit;
mbed_official 78:5f419e0f96dd 520 }
mbed_official 78:5f419e0f96dd 521
mbed_official 78:5f419e0f96dd 522 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 523 mbedtls_aes_crypt_ctr(&aes, BUFSIZE, &nc_offset,
mbed_official 78:5f419e0f96dd 524 tmp, stream_block, buf,
mbed_official 78:5f419e0f96dd 525 buf));
Janos Follath 0:1f7c5025e59d 526 }
Janos Follath 0:1f7c5025e59d 527
mbed_official 78:5f419e0f96dd 528 ret = 0;
mbed_official 78:5f419e0f96dd 529
mbed_official 78:5f419e0f96dd 530 exit:
mbed_official 78:5f419e0f96dd 531 mbedtls_aes_free(&aes);
mbed_official 78:5f419e0f96dd 532
mbed_official 78:5f419e0f96dd 533 return ret;
mbed_official 78:5f419e0f96dd 534 }
mbed_official 78:5f419e0f96dd 535 #endif /* MBEDTLS_AES_C && MBEDTLS_CIPHER_MODE_CTR */
mbed_official 11:6ccae3ebafd5 536
mbed_official 78:5f419e0f96dd 537 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_GCM_C)
mbed_official 78:5f419e0f96dd 538 MBED_NOINLINE static int benchmark_aes_gcm()
mbed_official 78:5f419e0f96dd 539 {
mbed_official 78:5f419e0f96dd 540 int ret = 0;
mbed_official 78:5f419e0f96dd 541 int keysize;
mbed_official 78:5f419e0f96dd 542 mbedtls_gcm_context gcm;
mbed_official 11:6ccae3ebafd5 543
mbed_official 78:5f419e0f96dd 544 mbedtls_gcm_init(&gcm);
Janos Follath 0:1f7c5025e59d 545
mbed_official 78:5f419e0f96dd 546 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 547 ret = mbedtls_snprintf(title, sizeof(title), "AES-GCM-%d", keysize);
mbed_official 78:5f419e0f96dd 548 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 549 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 550 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 551 goto exit;
Janos Follath 0:1f7c5025e59d 552 }
mbed_official 78:5f419e0f96dd 553
mbed_official 78:5f419e0f96dd 554 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 555 memset(tmp, 0, sizeof(tmp));
mbed_official 30:e0ea8c1ef9f5 556
mbed_official 78:5f419e0f96dd 557 ret = mbedtls_gcm_setkey(&gcm, MBEDTLS_CIPHER_ID_AES, tmp, keysize);
mbed_official 78:5f419e0f96dd 558 if (ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) {
mbed_official 78:5f419e0f96dd 559 /* Do not consider this as a failure */
mbed_official 78:5f419e0f96dd 560 mbedtls_printf(HEADER_FORMAT "Feature unavailable\n", title);
mbed_official 78:5f419e0f96dd 561 continue;
mbed_official 78:5f419e0f96dd 562 } else if (ret != 0) {
mbed_official 78:5f419e0f96dd 563 PRINT_ERROR(ret, "mbedtls_gcm_setkey()");
mbed_official 78:5f419e0f96dd 564 goto exit;
mbed_official 78:5f419e0f96dd 565 }
mbed_official 30:e0ea8c1ef9f5 566
mbed_official 78:5f419e0f96dd 567 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 568 mbedtls_gcm_crypt_and_tag(&gcm,
mbed_official 78:5f419e0f96dd 569 MBEDTLS_GCM_ENCRYPT,
mbed_official 78:5f419e0f96dd 570 BUFSIZE, tmp, 12, NULL,
mbed_official 78:5f419e0f96dd 571 0, buf, buf, 16, tmp));
mbed_official 30:e0ea8c1ef9f5 572 }
mbed_official 30:e0ea8c1ef9f5 573
mbed_official 78:5f419e0f96dd 574 ret = 0;
Janos Follath 0:1f7c5025e59d 575
mbed_official 78:5f419e0f96dd 576 exit:
mbed_official 78:5f419e0f96dd 577 mbedtls_gcm_free(&gcm);
Janos Follath 0:1f7c5025e59d 578
mbed_official 78:5f419e0f96dd 579 return ret;
mbed_official 78:5f419e0f96dd 580 }
mbed_official 78:5f419e0f96dd 581 #endif /* MBEDTLS_AES_C && MBEDTLS_GCM_C */
Janos Follath 0:1f7c5025e59d 582
mbed_official 78:5f419e0f96dd 583 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CCM_C)
mbed_official 78:5f419e0f96dd 584 MBED_NOINLINE static int benchmark_aes_ccm()
mbed_official 78:5f419e0f96dd 585 {
mbed_official 78:5f419e0f96dd 586 int ret = 0;
mbed_official 78:5f419e0f96dd 587 int keysize;
mbed_official 78:5f419e0f96dd 588 mbedtls_ccm_context ccm;
Janos Follath 0:1f7c5025e59d 589
mbed_official 78:5f419e0f96dd 590 mbedtls_ccm_init(&ccm);
mbed_official 11:6ccae3ebafd5 591
mbed_official 78:5f419e0f96dd 592 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 593 ret = mbedtls_snprintf(title, sizeof(title), "AES-CCM-%d", keysize);
mbed_official 78:5f419e0f96dd 594 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 595 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 596 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 597 goto exit;
mbed_official 11:6ccae3ebafd5 598 }
mbed_official 11:6ccae3ebafd5 599
mbed_official 78:5f419e0f96dd 600 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 601 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 602
mbed_official 78:5f419e0f96dd 603 ret = mbedtls_ccm_setkey(&ccm, MBEDTLS_CIPHER_ID_AES, tmp, keysize);
mbed_official 78:5f419e0f96dd 604 if (ret == MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE) {
mbed_official 78:5f419e0f96dd 605 /* Do not consider this as a failure */
mbed_official 78:5f419e0f96dd 606 mbedtls_printf(HEADER_FORMAT "Feature unavailable\n", title);
mbed_official 78:5f419e0f96dd 607 continue;
mbed_official 78:5f419e0f96dd 608 } else if (ret != 0) {
mbed_official 78:5f419e0f96dd 609 PRINT_ERROR(ret, "mbedtls_gcm_setkey()");
mbed_official 78:5f419e0f96dd 610 goto exit;
mbed_official 78:5f419e0f96dd 611 }
mbed_official 78:5f419e0f96dd 612
mbed_official 78:5f419e0f96dd 613 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 614 mbedtls_ccm_encrypt_and_tag(&ccm, BUFSIZE, tmp, 12,
mbed_official 78:5f419e0f96dd 615 NULL, 0, buf, buf, tmp,
mbed_official 78:5f419e0f96dd 616 16));
mbed_official 11:6ccae3ebafd5 617 }
mbed_official 78:5f419e0f96dd 618
mbed_official 78:5f419e0f96dd 619 ret = 0;
mbed_official 78:5f419e0f96dd 620
mbed_official 78:5f419e0f96dd 621 exit:
mbed_official 78:5f419e0f96dd 622 mbedtls_ccm_free(&ccm);
mbed_official 78:5f419e0f96dd 623
mbed_official 78:5f419e0f96dd 624 return ret;
mbed_official 78:5f419e0f96dd 625 }
mbed_official 78:5f419e0f96dd 626 #endif /* MBEDTLS_AES_C && MBEDTLS_CCM_C */
mbed_official 78:5f419e0f96dd 627
mbed_official 78:5f419e0f96dd 628 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CMAC_C)
mbed_official 78:5f419e0f96dd 629 MBED_NOINLINE static int benchmark_aes_cmac()
mbed_official 78:5f419e0f96dd 630 {
mbed_official 78:5f419e0f96dd 631 int ret = 0;
mbed_official 78:5f419e0f96dd 632 unsigned char output[16];
mbed_official 78:5f419e0f96dd 633 const mbedtls_cipher_info_t *cipher_info;
mbed_official 78:5f419e0f96dd 634 mbedtls_cipher_type_t cipher_type;
mbed_official 78:5f419e0f96dd 635 int keysize;
mbed_official 78:5f419e0f96dd 636
mbed_official 78:5f419e0f96dd 637 cipher_type = MBEDTLS_CIPHER_AES_128_ECB;
mbed_official 78:5f419e0f96dd 638 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 639 ret = mbedtls_snprintf(title, sizeof(title), "AES-CMAC-%d", keysize);
mbed_official 78:5f419e0f96dd 640 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 641 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 642 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 643 goto exit;
mbed_official 78:5f419e0f96dd 644 }
mbed_official 78:5f419e0f96dd 645
mbed_official 78:5f419e0f96dd 646 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 647 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 648
mbed_official 78:5f419e0f96dd 649 cipher_info = mbedtls_cipher_info_from_type(cipher_type);
mbed_official 78:5f419e0f96dd 650 if (cipher_info == NULL) {
mbed_official 78:5f419e0f96dd 651 mbedtls_printf("mbedtls_cipher_info_from_type() returned NULL\n");
mbed_official 78:5f419e0f96dd 652 goto exit;
mbed_official 78:5f419e0f96dd 653 }
mbed_official 78:5f419e0f96dd 654
mbed_official 78:5f419e0f96dd 655 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 656 mbedtls_cipher_cmac(cipher_info, tmp, keysize,
mbed_official 78:5f419e0f96dd 657 buf, BUFSIZE, output));
mbed_official 78:5f419e0f96dd 658 cipher_type = (mbedtls_cipher_type_t)(cipher_type + 1);
mbed_official 78:5f419e0f96dd 659 }
mbed_official 78:5f419e0f96dd 660
mbed_official 78:5f419e0f96dd 661 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 662 memset(tmp, 0, sizeof(tmp));
mbed_official 78:5f419e0f96dd 663
mbed_official 78:5f419e0f96dd 664 BENCHMARK_FUNC_CALL("AES-CMAC-PRF-128",
mbed_official 78:5f419e0f96dd 665 mbedtls_aes_cmac_prf_128(tmp, 16, buf, BUFSIZE,
mbed_official 78:5f419e0f96dd 666 output));
mbed_official 78:5f419e0f96dd 667
mbed_official 78:5f419e0f96dd 668 ret = 0;
mbed_official 78:5f419e0f96dd 669
mbed_official 78:5f419e0f96dd 670 exit:
mbed_official 78:5f419e0f96dd 671
mbed_official 78:5f419e0f96dd 672 return ret;
mbed_official 78:5f419e0f96dd 673 }
mbed_official 78:5f419e0f96dd 674 #endif /* MBEDTLS_AES_C && MBEDTLS_CMAC_C */
Janos Follath 0:1f7c5025e59d 675
Janos Follath 0:1f7c5025e59d 676 #if defined(MBEDTLS_CAMELLIA_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 677 MBED_NOINLINE static int benchmark_camellia()
mbed_official 78:5f419e0f96dd 678 {
mbed_official 78:5f419e0f96dd 679 int ret = 0;
mbed_official 78:5f419e0f96dd 680 int keysize;
mbed_official 78:5f419e0f96dd 681 mbedtls_camellia_context camellia;
mbed_official 78:5f419e0f96dd 682
mbed_official 78:5f419e0f96dd 683 mbedtls_camellia_init(&camellia);
mbed_official 78:5f419e0f96dd 684
mbed_official 78:5f419e0f96dd 685 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 686 ret = mbedtls_snprintf(title, sizeof(title), "CAMELLIA-CBC-%d",
mbed_official 78:5f419e0f96dd 687 keysize);
mbed_official 78:5f419e0f96dd 688 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 689 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 690 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 691 goto exit;
mbed_official 78:5f419e0f96dd 692 }
mbed_official 78:5f419e0f96dd 693
mbed_official 78:5f419e0f96dd 694 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 695 memset(tmp, 0, sizeof(tmp));
Janos Follath 0:1f7c5025e59d 696
mbed_official 78:5f419e0f96dd 697 ret = mbedtls_camellia_setkey_enc(&camellia, tmp, keysize);
mbed_official 78:5f419e0f96dd 698 if (ret != 0) {
mbed_official 78:5f419e0f96dd 699 PRINT_ERROR(ret, "mbedtls_camellia_setkey_enc()");
mbed_official 78:5f419e0f96dd 700 goto exit;
mbed_official 78:5f419e0f96dd 701 }
Janos Follath 0:1f7c5025e59d 702
mbed_official 78:5f419e0f96dd 703 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 704 mbedtls_camellia_crypt_cbc(&camellia,
mbed_official 78:5f419e0f96dd 705 MBEDTLS_CAMELLIA_ENCRYPT,
mbed_official 78:5f419e0f96dd 706 BUFSIZE, tmp, buf, buf));
Janos Follath 0:1f7c5025e59d 707 }
mbed_official 78:5f419e0f96dd 708
mbed_official 78:5f419e0f96dd 709 ret = 0;
mbed_official 78:5f419e0f96dd 710
mbed_official 78:5f419e0f96dd 711 exit:
mbed_official 78:5f419e0f96dd 712 mbedtls_camellia_free(&camellia);
mbed_official 78:5f419e0f96dd 713
mbed_official 78:5f419e0f96dd 714 return ret;
mbed_official 78:5f419e0f96dd 715 }
mbed_official 78:5f419e0f96dd 716 #endif /* MBEDTLS_CAMELLIA_C && MBEDTLS_CIPHER_MODE_CBC */
Janos Follath 0:1f7c5025e59d 717
Janos Follath 0:1f7c5025e59d 718 #if defined(MBEDTLS_BLOWFISH_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 719 MBED_NOINLINE static int benchmark_blowfish()
mbed_official 78:5f419e0f96dd 720 {
mbed_official 78:5f419e0f96dd 721 int ret = 0;
mbed_official 78:5f419e0f96dd 722 int keysize;
mbed_official 78:5f419e0f96dd 723 mbedtls_blowfish_context *blowfish;
mbed_official 78:5f419e0f96dd 724
mbed_official 78:5f419e0f96dd 725 blowfish = (mbedtls_blowfish_context *)mbedtls_calloc(1,
mbed_official 78:5f419e0f96dd 726 sizeof(mbedtls_blowfish_context));
mbed_official 78:5f419e0f96dd 727 if (blowfish == NULL) {
mbed_official 78:5f419e0f96dd 728 mbedtls_printf("Failed to allocate mbedtls_blowfish_context\n");
mbed_official 78:5f419e0f96dd 729 return -1;
mbed_official 78:5f419e0f96dd 730 }
mbed_official 78:5f419e0f96dd 731
mbed_official 78:5f419e0f96dd 732 mbedtls_blowfish_init(blowfish);
Janos Follath 0:1f7c5025e59d 733
mbed_official 78:5f419e0f96dd 734 for (keysize = 128; keysize <= 256; keysize += 64) {
mbed_official 78:5f419e0f96dd 735 mbedtls_snprintf(title, sizeof(title), "BLOWFISH-CBC-%d", keysize);
mbed_official 78:5f419e0f96dd 736 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 737 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 738 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 739 goto exit;
mbed_official 78:5f419e0f96dd 740 }
Janos Follath 0:1f7c5025e59d 741
mbed_official 78:5f419e0f96dd 742 memset(buf, 0, sizeof(buf));
mbed_official 78:5f419e0f96dd 743 memset(tmp, 0, sizeof(tmp));
Janos Follath 0:1f7c5025e59d 744
mbed_official 78:5f419e0f96dd 745 if ((ret = mbedtls_blowfish_setkey(blowfish, tmp, keysize)) != 0) {
mbed_official 78:5f419e0f96dd 746 PRINT_ERROR(ret, "mbedtls_blowfish_setkey()");
mbed_official 78:5f419e0f96dd 747 goto exit;
Janos Follath 0:1f7c5025e59d 748 }
Janos Follath 0:1f7c5025e59d 749
mbed_official 78:5f419e0f96dd 750 BENCHMARK_FUNC_CALL(title,
mbed_official 78:5f419e0f96dd 751 mbedtls_blowfish_crypt_cbc(blowfish,
mbed_official 78:5f419e0f96dd 752 MBEDTLS_BLOWFISH_ENCRYPT,
mbed_official 78:5f419e0f96dd 753 BUFSIZE,
mbed_official 78:5f419e0f96dd 754 tmp, buf, buf));
Janos Follath 0:1f7c5025e59d 755 }
mbed_official 70:72c865037f5d 756
mbed_official 78:5f419e0f96dd 757 ret = 0;
mbed_official 78:5f419e0f96dd 758
mbed_official 78:5f419e0f96dd 759 exit:
mbed_official 78:5f419e0f96dd 760 mbedtls_blowfish_free(blowfish);
mbed_official 78:5f419e0f96dd 761 mbedtls_free(blowfish);
mbed_official 78:5f419e0f96dd 762
mbed_official 78:5f419e0f96dd 763 return ret;
mbed_official 78:5f419e0f96dd 764 }
mbed_official 78:5f419e0f96dd 765 #endif /* MBEDTLS_BLOWFISH_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 70:72c865037f5d 766
Janos Follath 0:1f7c5025e59d 767 #if defined(MBEDTLS_HAVEGE_C)
mbed_official 78:5f419e0f96dd 768 MBED_NOINLINE static int benchmark_havege()
mbed_official 78:5f419e0f96dd 769 {
mbed_official 78:5f419e0f96dd 770 int ret = 0;
mbed_official 78:5f419e0f96dd 771 mbedtls_havege_state hs;
mbed_official 78:5f419e0f96dd 772
mbed_official 78:5f419e0f96dd 773 mbedtls_havege_init(&hs);
mbed_official 78:5f419e0f96dd 774
mbed_official 78:5f419e0f96dd 775 BENCHMARK_FUNC_CALL("HAVEGE", mbedtls_havege_random(&hs, buf, BUFSIZE));
mbed_official 78:5f419e0f96dd 776
mbed_official 78:5f419e0f96dd 777 ret = 0;
mbed_official 78:5f419e0f96dd 778
mbed_official 78:5f419e0f96dd 779 exit:
mbed_official 78:5f419e0f96dd 780 mbedtls_havege_free(&hs);
mbed_official 78:5f419e0f96dd 781
mbed_official 78:5f419e0f96dd 782 return ret;
mbed_official 78:5f419e0f96dd 783 }
mbed_official 78:5f419e0f96dd 784 #endif /* MBEDTLS_HAVEGE_C */
Janos Follath 0:1f7c5025e59d 785
Janos Follath 0:1f7c5025e59d 786 #if defined(MBEDTLS_CTR_DRBG_C)
mbed_official 78:5f419e0f96dd 787 MBED_NOINLINE static int benchmark_ctr_drbg()
mbed_official 78:5f419e0f96dd 788 {
mbed_official 78:5f419e0f96dd 789 int ret = 0;
mbed_official 78:5f419e0f96dd 790 const char *nopr_title = "CTR_DRBG (NOPR)";
mbed_official 78:5f419e0f96dd 791 const char *pr_title = "CTR_DRBG (PR)";
mbed_official 78:5f419e0f96dd 792 mbedtls_ctr_drbg_context ctr_drbg;
mbed_official 78:5f419e0f96dd 793
mbed_official 78:5f419e0f96dd 794 mbedtls_ctr_drbg_init(&ctr_drbg);
Janos Follath 0:1f7c5025e59d 795
mbed_official 78:5f419e0f96dd 796 ret = mbedtls_ctr_drbg_seed(&ctr_drbg, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 797 if (ret != 0) {
mbed_official 78:5f419e0f96dd 798 PRINT_ERROR(ret, "mbedtls_ctr_drbg_seed()");
mbed_official 78:5f419e0f96dd 799 goto exit;
mbed_official 78:5f419e0f96dd 800 }
mbed_official 78:5f419e0f96dd 801
mbed_official 78:5f419e0f96dd 802 BENCHMARK_FUNC_CALL(nopr_title,
mbed_official 78:5f419e0f96dd 803 mbedtls_ctr_drbg_random(&ctr_drbg, buf, BUFSIZE));
Janos Follath 0:1f7c5025e59d 804
mbed_official 78:5f419e0f96dd 805 ret = mbedtls_ctr_drbg_seed(&ctr_drbg, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 806 if (ret != 0) {
mbed_official 78:5f419e0f96dd 807 PRINT_ERROR(ret, "mbedtls_ctr_drbg_seed()");
mbed_official 78:5f419e0f96dd 808 goto exit;
mbed_official 78:5f419e0f96dd 809 }
Janos Follath 0:1f7c5025e59d 810
mbed_official 78:5f419e0f96dd 811 mbedtls_ctr_drbg_set_prediction_resistance(&ctr_drbg,
mbed_official 78:5f419e0f96dd 812 MBEDTLS_CTR_DRBG_PR_ON);
mbed_official 78:5f419e0f96dd 813 BENCHMARK_FUNC_CALL(pr_title,
mbed_official 78:5f419e0f96dd 814 mbedtls_ctr_drbg_random(&ctr_drbg, buf, BUFSIZE));
mbed_official 78:5f419e0f96dd 815
mbed_official 78:5f419e0f96dd 816 ret = 0;
mbed_official 78:5f419e0f96dd 817
mbed_official 78:5f419e0f96dd 818 exit:
mbed_official 78:5f419e0f96dd 819 mbedtls_ctr_drbg_free(&ctr_drbg);
mbed_official 78:5f419e0f96dd 820
mbed_official 78:5f419e0f96dd 821 return ret;
mbed_official 78:5f419e0f96dd 822 }
mbed_official 78:5f419e0f96dd 823 #endif /* MBEDTLS_CTR_DRBG_C */
Janos Follath 0:1f7c5025e59d 824
Janos Follath 0:1f7c5025e59d 825 #if defined(MBEDTLS_HMAC_DRBG_C)
mbed_official 78:5f419e0f96dd 826 MBED_NOINLINE static int benchmark_hmac_drbg()
mbed_official 78:5f419e0f96dd 827 {
mbed_official 78:5f419e0f96dd 828 int ret = 0;
mbed_official 78:5f419e0f96dd 829 mbedtls_hmac_drbg_context hmac_drbg;
mbed_official 78:5f419e0f96dd 830 const mbedtls_md_info_t *md_info;
Janos Follath 0:1f7c5025e59d 831
mbed_official 78:5f419e0f96dd 832 mbedtls_hmac_drbg_init(&hmac_drbg);
Janos Follath 0:1f7c5025e59d 833
Janos Follath 0:1f7c5025e59d 834 #if defined(MBEDTLS_SHA1_C)
mbed_official 78:5f419e0f96dd 835 md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1);
mbed_official 78:5f419e0f96dd 836 if (md_info == NULL) {
mbed_official 78:5f419e0f96dd 837 mbedtls_printf("mbedtls_md_info_from_type() returned NULL\n");
mbed_official 78:5f419e0f96dd 838 ret = -1;
mbed_official 78:5f419e0f96dd 839 goto exit;
mbed_official 78:5f419e0f96dd 840 }
Janos Follath 0:1f7c5025e59d 841
mbed_official 78:5f419e0f96dd 842 ret = mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 843 if (ret != 0) {
mbed_official 78:5f419e0f96dd 844 PRINT_ERROR(ret, "mbedtls_hmac_drbg_seed()");
mbed_official 78:5f419e0f96dd 845 goto exit;
mbed_official 78:5f419e0f96dd 846 }
mbed_official 78:5f419e0f96dd 847 BENCHMARK_FUNC_CALL("HMAC_DRBG SHA-1 (NOPR)",
mbed_official 78:5f419e0f96dd 848 mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
mbed_official 78:5f419e0f96dd 849
mbed_official 78:5f419e0f96dd 850 ret = mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 851 if (ret != 0) {
mbed_official 78:5f419e0f96dd 852 PRINT_ERROR(ret, "mbedtls_hmac_drbg_seed()");
mbed_official 78:5f419e0f96dd 853 goto exit;
mbed_official 78:5f419e0f96dd 854 }
mbed_official 78:5f419e0f96dd 855 mbedtls_hmac_drbg_set_prediction_resistance(&hmac_drbg,
mbed_official 78:5f419e0f96dd 856 MBEDTLS_HMAC_DRBG_PR_ON);
mbed_official 78:5f419e0f96dd 857 BENCHMARK_FUNC_CALL("HMAC_DRBG SHA-1 (PR)",
mbed_official 78:5f419e0f96dd 858 mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
mbed_official 78:5f419e0f96dd 859 #endif /* MBEDTLS_SHA1_C */
Janos Follath 0:1f7c5025e59d 860
Janos Follath 0:1f7c5025e59d 861 #if defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 862 md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
mbed_official 78:5f419e0f96dd 863 if (md_info == NULL) {
mbed_official 78:5f419e0f96dd 864 PRINT_ERROR(ret, "mbedtls_md_info_from_type()");
mbed_official 78:5f419e0f96dd 865 goto exit;
mbed_official 78:5f419e0f96dd 866 }
Janos Follath 0:1f7c5025e59d 867
mbed_official 78:5f419e0f96dd 868 ret = mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 869 if (ret != 0) {
mbed_official 78:5f419e0f96dd 870 PRINT_ERROR(ret, "mbedtls_hmac_drbg_seed()");
mbed_official 78:5f419e0f96dd 871 goto exit;
mbed_official 78:5f419e0f96dd 872 }
mbed_official 78:5f419e0f96dd 873 BENCHMARK_FUNC_CALL("HMAC_DRBG SHA-256 (NOPR)",
mbed_official 78:5f419e0f96dd 874 mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
Janos Follath 0:1f7c5025e59d 875
mbed_official 78:5f419e0f96dd 876 ret = mbedtls_hmac_drbg_seed(&hmac_drbg, md_info, myrand, NULL, NULL, 0);
mbed_official 78:5f419e0f96dd 877 if (ret != 0) {
mbed_official 78:5f419e0f96dd 878 PRINT_ERROR(ret, "mbedtls_hmac_drbg_seed()");
mbed_official 78:5f419e0f96dd 879 goto exit;
Janos Follath 0:1f7c5025e59d 880 }
mbed_official 78:5f419e0f96dd 881 mbedtls_hmac_drbg_set_prediction_resistance(&hmac_drbg,
mbed_official 78:5f419e0f96dd 882 MBEDTLS_HMAC_DRBG_PR_ON);
mbed_official 78:5f419e0f96dd 883 BENCHMARK_FUNC_CALL("HMAC_DRBG SHA-256 (PR)",
mbed_official 78:5f419e0f96dd 884 mbedtls_hmac_drbg_random(&hmac_drbg, buf, BUFSIZE));
mbed_official 78:5f419e0f96dd 885 #endif /* MBEDTLS_SHA256_C */
mbed_official 70:72c865037f5d 886
mbed_official 78:5f419e0f96dd 887 ret = 0;
mbed_official 78:5f419e0f96dd 888
mbed_official 78:5f419e0f96dd 889 exit:
mbed_official 78:5f419e0f96dd 890 mbedtls_hmac_drbg_free(&hmac_drbg);
mbed_official 78:5f419e0f96dd 891
mbed_official 78:5f419e0f96dd 892 return ret;
mbed_official 78:5f419e0f96dd 893 }
mbed_official 78:5f419e0f96dd 894 #endif /* MBEDTLS_HMAC_DRBG_C */
Janos Follath 0:1f7c5025e59d 895
Janos Follath 0:1f7c5025e59d 896 #if defined(MBEDTLS_RSA_C) && \
Janos Follath 0:1f7c5025e59d 897 defined(MBEDTLS_PEM_PARSE_C) && defined(MBEDTLS_PK_PARSE_C)
mbed_official 78:5f419e0f96dd 898 MBED_NOINLINE static int benchmark_rsa()
mbed_official 78:5f419e0f96dd 899 {
mbed_official 78:5f419e0f96dd 900 int ret = 0;
mbed_official 78:5f419e0f96dd 901 mbedtls_pk_context pk;
mbed_official 78:5f419e0f96dd 902 mbedtls_rsa_context *rsa;
mbed_official 78:5f419e0f96dd 903 const char *rsa_keys[] = {
mbed_official 78:5f419e0f96dd 904 RSA_PRIVATE_KEY_2048,
mbed_official 78:5f419e0f96dd 905 RSA_PRIVATE_KEY_4096,
mbed_official 78:5f419e0f96dd 906 };
mbed_official 78:5f419e0f96dd 907 size_t i;
Janos Follath 0:1f7c5025e59d 908
mbed_official 78:5f419e0f96dd 909 for (i = 0; i < sizeof(rsa_keys) / sizeof(rsa_keys[0]) && ret == 0; i++) {
mbed_official 78:5f419e0f96dd 910 mbedtls_pk_init(&pk);
mbed_official 78:5f419e0f96dd 911
mbed_official 78:5f419e0f96dd 912 ret = mbedtls_pk_parse_key(&pk, (const unsigned char *)rsa_keys[i],
mbed_official 78:5f419e0f96dd 913 strlen(rsa_keys[i]) + 1, NULL, 0);
mbed_official 78:5f419e0f96dd 914 if (ret != 0) {
mbed_official 78:5f419e0f96dd 915 PRINT_ERROR(ret, "mbedtls_pk_parse_key()");
mbed_official 78:5f419e0f96dd 916 goto exit;
mbed_official 78:5f419e0f96dd 917 }
mbed_official 78:5f419e0f96dd 918
mbed_official 78:5f419e0f96dd 919 rsa = mbedtls_pk_rsa(pk);
Janos Follath 0:1f7c5025e59d 920
mbed_official 78:5f419e0f96dd 921 ret = mbedtls_snprintf(title, sizeof(title), "RSA-%d",
mbed_official 78:5f419e0f96dd 922 mbedtls_pk_get_bitlen(&pk));
mbed_official 78:5f419e0f96dd 923 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 924 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 925 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 926 goto exit;
mbed_official 78:5f419e0f96dd 927 }
Janos Follath 0:1f7c5025e59d 928
mbed_official 78:5f419e0f96dd 929 BENCHMARK_PUBLIC(title, " public",
mbed_official 78:5f419e0f96dd 930 buf[0] = 0;
mbed_official 78:5f419e0f96dd 931 ret = mbedtls_rsa_public(rsa, buf, buf));
Janos Follath 0:1f7c5025e59d 932
mbed_official 78:5f419e0f96dd 933 BENCHMARK_PUBLIC(title, "private",
mbed_official 78:5f419e0f96dd 934 buf[0] = 0;
mbed_official 78:5f419e0f96dd 935 ret = mbedtls_rsa_private(rsa, myrand, NULL, buf,
mbed_official 78:5f419e0f96dd 936 buf));
Janos Follath 0:1f7c5025e59d 937
mbed_official 78:5f419e0f96dd 938 exit:
mbed_official 78:5f419e0f96dd 939 mbedtls_pk_free(&pk);
Janos Follath 0:1f7c5025e59d 940 }
mbed_official 78:5f419e0f96dd 941
mbed_official 78:5f419e0f96dd 942 return ret;
mbed_official 78:5f419e0f96dd 943 }
mbed_official 78:5f419e0f96dd 944 #endif /* MBEDTLS_RSA_C && MBEDTLS_PEM_PARSE_C && MBEDTLS_PK_PARSE_C */
Janos Follath 0:1f7c5025e59d 945
Janos Follath 0:1f7c5025e59d 946 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_BIGNUM_C)
mbed_official 78:5f419e0f96dd 947 MBED_NOINLINE static int benchmark_dhm()
mbed_official 78:5f419e0f96dd 948 {
mbed_official 78:5f419e0f96dd 949 int ret = 0;
mbed_official 78:5f419e0f96dd 950 int dhm_sizes[] = {
mbed_official 78:5f419e0f96dd 951 2048,
mbed_official 78:5f419e0f96dd 952 3072,
mbed_official 78:5f419e0f96dd 953 };
mbed_official 78:5f419e0f96dd 954 const char *dhm_P[] = {
mbed_official 78:5f419e0f96dd 955 MBEDTLS_DHM_RFC3526_MODP_2048_P,
mbed_official 78:5f419e0f96dd 956 MBEDTLS_DHM_RFC3526_MODP_3072_P,
mbed_official 78:5f419e0f96dd 957 };
mbed_official 78:5f419e0f96dd 958 const char *dhm_G[] = {
mbed_official 78:5f419e0f96dd 959 MBEDTLS_DHM_RFC3526_MODP_2048_G,
mbed_official 78:5f419e0f96dd 960 MBEDTLS_DHM_RFC3526_MODP_3072_G,
mbed_official 78:5f419e0f96dd 961 };
Janos Follath 0:1f7c5025e59d 962
mbed_official 78:5f419e0f96dd 963 mbedtls_dhm_context dhm;
mbed_official 78:5f419e0f96dd 964 size_t olen;
mbed_official 78:5f419e0f96dd 965 size_t i;
mbed_official 78:5f419e0f96dd 966
mbed_official 78:5f419e0f96dd 967 for (i = 0;
mbed_official 78:5f419e0f96dd 968 i < sizeof(dhm_sizes) / sizeof(dhm_sizes[0]) && ret == 0;
mbed_official 78:5f419e0f96dd 969 i++) {
mbed_official 78:5f419e0f96dd 970 mbedtls_dhm_init(&dhm);
Janos Follath 0:1f7c5025e59d 971
mbed_official 78:5f419e0f96dd 972 ret = mbedtls_mpi_read_string(&dhm.P, 16, dhm_P[i]);
mbed_official 78:5f419e0f96dd 973 if (ret != 0) {
mbed_official 78:5f419e0f96dd 974 PRINT_ERROR(ret, "mbedtls_mpi_read_string()");
mbed_official 78:5f419e0f96dd 975 goto exit;
mbed_official 78:5f419e0f96dd 976 }
mbed_official 78:5f419e0f96dd 977 ret = mbedtls_mpi_read_string(&dhm.G, 16, dhm_G[i]);
mbed_official 78:5f419e0f96dd 978 if (ret != 0) {
mbed_official 78:5f419e0f96dd 979 PRINT_ERROR(ret, "mbedtls_mpi_read_string()");
mbed_official 78:5f419e0f96dd 980 goto exit;
mbed_official 78:5f419e0f96dd 981 }
Janos Follath 0:1f7c5025e59d 982
mbed_official 78:5f419e0f96dd 983 dhm.len = mbedtls_mpi_size(&dhm.P);
mbed_official 78:5f419e0f96dd 984 ret = mbedtls_dhm_make_public(&dhm, (int) dhm.len, buf, dhm.len,
mbed_official 78:5f419e0f96dd 985 myrand, NULL);
mbed_official 78:5f419e0f96dd 986 if (ret != 0) {
mbed_official 78:5f419e0f96dd 987 PRINT_ERROR(ret, "mbedtls_dhm_make_public()");
mbed_official 78:5f419e0f96dd 988 goto exit;
Janos Follath 0:1f7c5025e59d 989 }
Janos Follath 0:1f7c5025e59d 990
mbed_official 78:5f419e0f96dd 991 ret = mbedtls_mpi_copy(&dhm.GY, &dhm.GX);
mbed_official 78:5f419e0f96dd 992 if (ret != 0) {
mbed_official 78:5f419e0f96dd 993 PRINT_ERROR(ret, "mbedtls_mpi_copy()");
mbed_official 78:5f419e0f96dd 994 goto exit;
mbed_official 78:5f419e0f96dd 995 }
Janos Follath 0:1f7c5025e59d 996
mbed_official 78:5f419e0f96dd 997 ret = mbedtls_snprintf(title, sizeof(title), "DHE-%d", dhm_sizes[i]);
mbed_official 78:5f419e0f96dd 998 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 999 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1000 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1001 goto exit;
mbed_official 78:5f419e0f96dd 1002 }
Janos Follath 0:1f7c5025e59d 1003
mbed_official 78:5f419e0f96dd 1004 /*
mbed_official 78:5f419e0f96dd 1005 * Benchmarking this requires two function calls that can fail. We
mbed_official 78:5f419e0f96dd 1006 * add a check in between them to check for any errors. In normal
mbed_official 78:5f419e0f96dd 1007 * operation, the overhead of this check is negligible
mbed_official 78:5f419e0f96dd 1008 */
mbed_official 78:5f419e0f96dd 1009 BENCHMARK_PUBLIC(title, "handshake",
mbed_official 78:5f419e0f96dd 1010 ret = mbedtls_dhm_make_public(&dhm, (int)dhm.len,
mbed_official 78:5f419e0f96dd 1011 buf, dhm.len, myrand,
mbed_official 78:5f419e0f96dd 1012 NULL);
mbed_official 78:5f419e0f96dd 1013 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1014 PRINT_ERROR(ret, "mbedtls_dhm_make_public()");
mbed_official 78:5f419e0f96dd 1015 goto exit;
mbed_official 78:5f419e0f96dd 1016 }
mbed_official 78:5f419e0f96dd 1017 ret = mbedtls_dhm_calc_secret(&dhm, buf, sizeof(buf),
mbed_official 78:5f419e0f96dd 1018 &olen, myrand, NULL));
Janos Follath 0:1f7c5025e59d 1019
mbed_official 78:5f419e0f96dd 1020 ret = mbedtls_snprintf(title, sizeof(title), "DH-%d", dhm_sizes[i]);
mbed_official 78:5f419e0f96dd 1021 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1022 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1023 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1024 goto exit;
Janos Follath 0:1f7c5025e59d 1025 }
Janos Follath 0:1f7c5025e59d 1026
mbed_official 78:5f419e0f96dd 1027 BENCHMARK_PUBLIC(title, "handshake",
mbed_official 78:5f419e0f96dd 1028 ret = mbedtls_dhm_calc_secret(&dhm, buf, sizeof(buf),
mbed_official 78:5f419e0f96dd 1029 &olen, myrand, NULL));
mbed_official 78:5f419e0f96dd 1030
mbed_official 78:5f419e0f96dd 1031 exit:
mbed_official 78:5f419e0f96dd 1032 mbedtls_dhm_free(&dhm);
mbed_official 78:5f419e0f96dd 1033 }
mbed_official 78:5f419e0f96dd 1034
mbed_official 78:5f419e0f96dd 1035 return ret;
mbed_official 78:5f419e0f96dd 1036 }
mbed_official 78:5f419e0f96dd 1037 #endif /* MBEDTLS_DHM_C && MBEDTLS_BIGNUM_C */
Janos Follath 0:1f7c5025e59d 1038
mbed_official 78:5f419e0f96dd 1039 #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 1040 MBED_NOINLINE static int benchmark_ecdsa()
mbed_official 78:5f419e0f96dd 1041 {
mbed_official 78:5f419e0f96dd 1042 int ret = 0;
mbed_official 78:5f419e0f96dd 1043 mbedtls_ecdsa_context ecdsa;
mbed_official 78:5f419e0f96dd 1044 const mbedtls_ecp_curve_info *curve_info;
mbed_official 78:5f419e0f96dd 1045 size_t sig_len;
mbed_official 78:5f419e0f96dd 1046 size_t hash_len;
mbed_official 78:5f419e0f96dd 1047
mbed_official 78:5f419e0f96dd 1048 memset(buf, 0x2A, sizeof(buf));
Janos Follath 0:1f7c5025e59d 1049
mbed_official 78:5f419e0f96dd 1050 for (curve_info = mbedtls_ecp_curve_list();
mbed_official 78:5f419e0f96dd 1051 curve_info->grp_id != MBEDTLS_ECP_DP_NONE && ret == 0;
mbed_official 78:5f419e0f96dd 1052 curve_info++) {
mbed_official 78:5f419e0f96dd 1053 mbedtls_ecdsa_init(&ecdsa);
Janos Follath 0:1f7c5025e59d 1054
mbed_official 78:5f419e0f96dd 1055 ret = mbedtls_ecdsa_genkey(&ecdsa, curve_info->grp_id, myrand, NULL);
mbed_official 78:5f419e0f96dd 1056 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1057 PRINT_ERROR(ret, "mbedtls_ecdsa_genkey()");
mbed_official 78:5f419e0f96dd 1058 goto exit;
Janos Follath 0:1f7c5025e59d 1059 }
mbed_official 78:5f419e0f96dd 1060
mbed_official 78:5f419e0f96dd 1061 ecp_clear_precomputed(&ecdsa.grp);
Janos Follath 0:1f7c5025e59d 1062
mbed_official 78:5f419e0f96dd 1063 ret = mbedtls_snprintf(title, sizeof(title), "ECDSA-%s",
mbed_official 78:5f419e0f96dd 1064 curve_info->name);
mbed_official 78:5f419e0f96dd 1065 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1066 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1067 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1068 goto exit;
mbed_official 78:5f419e0f96dd 1069 }
Janos Follath 0:1f7c5025e59d 1070
mbed_official 78:5f419e0f96dd 1071 hash_len = (curve_info->bit_size + 7) / 8;
mbed_official 78:5f419e0f96dd 1072 BENCHMARK_PUBLIC(title, "sign",
mbed_official 78:5f419e0f96dd 1073 ret = mbedtls_ecdsa_write_signature(&ecdsa,
mbed_official 78:5f419e0f96dd 1074 MBEDTLS_MD_SHA256,
mbed_official 78:5f419e0f96dd 1075 buf, hash_len,
mbed_official 78:5f419e0f96dd 1076 tmp, &sig_len,
mbed_official 78:5f419e0f96dd 1077 myrand, NULL));
mbed_official 78:5f419e0f96dd 1078
mbed_official 78:5f419e0f96dd 1079 mbedtls_ecdsa_free(&ecdsa);
mbed_official 78:5f419e0f96dd 1080 }
mbed_official 78:5f419e0f96dd 1081
mbed_official 78:5f419e0f96dd 1082 for (curve_info = mbedtls_ecp_curve_list();
mbed_official 78:5f419e0f96dd 1083 curve_info->grp_id != MBEDTLS_ECP_DP_NONE && ret == 0;
mbed_official 78:5f419e0f96dd 1084 curve_info++) {
mbed_official 78:5f419e0f96dd 1085 mbedtls_ecdsa_init(&ecdsa);
Janos Follath 0:1f7c5025e59d 1086
mbed_official 78:5f419e0f96dd 1087 ret = mbedtls_ecdsa_genkey(&ecdsa, curve_info->grp_id, myrand, NULL);
mbed_official 78:5f419e0f96dd 1088 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1089 PRINT_ERROR(ret, "mbedtls_ecdsa_genkey()");
mbed_official 78:5f419e0f96dd 1090 goto exit;
mbed_official 78:5f419e0f96dd 1091 }
Janos Follath 0:1f7c5025e59d 1092
mbed_official 78:5f419e0f96dd 1093 hash_len = (curve_info->bit_size + 7) / 8;
mbed_official 78:5f419e0f96dd 1094 ret = mbedtls_ecdsa_write_signature(&ecdsa, MBEDTLS_MD_SHA256, buf,
mbed_official 78:5f419e0f96dd 1095 hash_len, tmp, &sig_len, myrand,
mbed_official 78:5f419e0f96dd 1096 NULL);
mbed_official 78:5f419e0f96dd 1097 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1098 PRINT_ERROR(ret, "mbedtls_ecdsa_write_signature()");
mbed_official 78:5f419e0f96dd 1099 goto exit;
mbed_official 78:5f419e0f96dd 1100 }
mbed_official 78:5f419e0f96dd 1101
mbed_official 78:5f419e0f96dd 1102 ecp_clear_precomputed(&ecdsa.grp);
mbed_official 78:5f419e0f96dd 1103
mbed_official 78:5f419e0f96dd 1104 ret = mbedtls_snprintf(title, sizeof(title), "ECDSA-%s",
mbed_official 78:5f419e0f96dd 1105 curve_info->name);
mbed_official 78:5f419e0f96dd 1106 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1107 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1108 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1109 goto exit;
Janos Follath 0:1f7c5025e59d 1110 }
Janos Follath 0:1f7c5025e59d 1111
mbed_official 78:5f419e0f96dd 1112 BENCHMARK_PUBLIC(title, "verify",
mbed_official 78:5f419e0f96dd 1113 ret = mbedtls_ecdsa_read_signature(&ecdsa, buf,
mbed_official 78:5f419e0f96dd 1114 hash_len, tmp,
mbed_official 78:5f419e0f96dd 1115 sig_len));
mbed_official 78:5f419e0f96dd 1116
mbed_official 78:5f419e0f96dd 1117 exit:
mbed_official 78:5f419e0f96dd 1118 mbedtls_ecdsa_free(&ecdsa);
mbed_official 78:5f419e0f96dd 1119 }
mbed_official 78:5f419e0f96dd 1120
mbed_official 78:5f419e0f96dd 1121 return ret;
mbed_official 78:5f419e0f96dd 1122 }
mbed_official 78:5f419e0f96dd 1123 #endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA2565_C */
mbed_official 78:5f419e0f96dd 1124
mbed_official 78:5f419e0f96dd 1125 #if defined(MBEDTLS_ECDH_C)
mbed_official 78:5f419e0f96dd 1126 MBED_NOINLINE static int benchmark_ecdh()
mbed_official 78:5f419e0f96dd 1127 {
mbed_official 78:5f419e0f96dd 1128 int ret = 0;
mbed_official 78:5f419e0f96dd 1129 mbedtls_ecdh_context ecdh;
mbed_official 78:5f419e0f96dd 1130 const mbedtls_ecp_curve_info *curve_info;
mbed_official 78:5f419e0f96dd 1131 size_t olen;
Janos Follath 0:1f7c5025e59d 1132
mbed_official 78:5f419e0f96dd 1133 for (curve_info = mbedtls_ecp_curve_list();
mbed_official 78:5f419e0f96dd 1134 curve_info->grp_id != MBEDTLS_ECP_DP_NONE && ret == 0;
mbed_official 78:5f419e0f96dd 1135 curve_info++) {
mbed_official 78:5f419e0f96dd 1136 mbedtls_ecdh_init(&ecdh);
mbed_official 78:5f419e0f96dd 1137
mbed_official 78:5f419e0f96dd 1138 ret = mbedtls_ecp_group_load(&ecdh.grp, curve_info->grp_id);
mbed_official 78:5f419e0f96dd 1139 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1140 PRINT_ERROR(ret, "mbedtls_ecp_group_load()");
mbed_official 78:5f419e0f96dd 1141 goto exit;
mbed_official 78:5f419e0f96dd 1142 }
mbed_official 78:5f419e0f96dd 1143
mbed_official 78:5f419e0f96dd 1144 ret = mbedtls_ecdh_make_public(&ecdh, &olen, buf, sizeof(buf),
mbed_official 78:5f419e0f96dd 1145 myrand, NULL);
mbed_official 78:5f419e0f96dd 1146 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1147 PRINT_ERROR(ret, "mbedtls_ecdh_make_public()");
mbed_official 78:5f419e0f96dd 1148 goto exit;
mbed_official 78:5f419e0f96dd 1149 }
mbed_official 78:5f419e0f96dd 1150
mbed_official 78:5f419e0f96dd 1151 ret = mbedtls_ecp_copy(&ecdh.Qp, &ecdh.Q);
mbed_official 78:5f419e0f96dd 1152 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1153 PRINT_ERROR(ret, "mbedtls_ecp_copy()");
mbed_official 78:5f419e0f96dd 1154 goto exit;
Janos Follath 0:1f7c5025e59d 1155 }
Janos Follath 0:1f7c5025e59d 1156
mbed_official 78:5f419e0f96dd 1157 ecp_clear_precomputed(&ecdh.grp);
Janos Follath 0:1f7c5025e59d 1158
mbed_official 78:5f419e0f96dd 1159 ret = mbedtls_snprintf(title, sizeof(title), "ECDHE-%s",
mbed_official 78:5f419e0f96dd 1160 curve_info->name);
mbed_official 78:5f419e0f96dd 1161 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1162 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1163 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1164 goto exit;
Janos Follath 0:1f7c5025e59d 1165 }
Janos Follath 0:1f7c5025e59d 1166
mbed_official 78:5f419e0f96dd 1167 /*
mbed_official 78:5f419e0f96dd 1168 * Benchmarking this requires two function calls that can fail. We
mbed_official 78:5f419e0f96dd 1169 * add a check in between them to check for any errors. In normal
mbed_official 78:5f419e0f96dd 1170 * operation, the overhead of this check is negligible
mbed_official 78:5f419e0f96dd 1171 */
mbed_official 78:5f419e0f96dd 1172 BENCHMARK_PUBLIC(title, "handshake",
mbed_official 78:5f419e0f96dd 1173 ret = mbedtls_ecdh_make_public(&ecdh, &olen, buf,
mbed_official 78:5f419e0f96dd 1174 sizeof(buf), myrand,
mbed_official 78:5f419e0f96dd 1175 NULL);
mbed_official 78:5f419e0f96dd 1176 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1177 PRINT_ERROR(ret, "mbedtls_ecdh_make_public()");
mbed_official 78:5f419e0f96dd 1178 goto exit;
mbed_official 78:5f419e0f96dd 1179 }
mbed_official 78:5f419e0f96dd 1180 ret = mbedtls_ecdh_calc_secret(&ecdh, &olen, buf,
mbed_official 78:5f419e0f96dd 1181 sizeof(buf), myrand,
mbed_official 78:5f419e0f96dd 1182 NULL));
mbed_official 78:5f419e0f96dd 1183 mbedtls_ecdh_free(&ecdh);
mbed_official 78:5f419e0f96dd 1184 }
mbed_official 78:5f419e0f96dd 1185
mbed_official 78:5f419e0f96dd 1186 for (curve_info = mbedtls_ecp_curve_list();
mbed_official 78:5f419e0f96dd 1187 curve_info->grp_id != MBEDTLS_ECP_DP_NONE && ret == 0;
mbed_official 78:5f419e0f96dd 1188 curve_info++) {
mbed_official 78:5f419e0f96dd 1189 mbedtls_ecdh_init(&ecdh);
Janos Follath 0:1f7c5025e59d 1190
mbed_official 78:5f419e0f96dd 1191 ret = mbedtls_ecp_group_load(&ecdh.grp, curve_info->grp_id);
mbed_official 78:5f419e0f96dd 1192 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1193 PRINT_ERROR(ret, "mbedtls_ecp_group_load()");
mbed_official 78:5f419e0f96dd 1194 goto exit;
mbed_official 78:5f419e0f96dd 1195 }
mbed_official 78:5f419e0f96dd 1196
mbed_official 78:5f419e0f96dd 1197 ret = mbedtls_ecdh_make_public(&ecdh, &olen, buf, sizeof(buf), myrand,
mbed_official 78:5f419e0f96dd 1198 NULL);
mbed_official 78:5f419e0f96dd 1199 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1200 PRINT_ERROR(ret, "mbedtls_ecdh_make_public()");
mbed_official 78:5f419e0f96dd 1201 goto exit;
mbed_official 78:5f419e0f96dd 1202 }
mbed_official 78:5f419e0f96dd 1203
mbed_official 78:5f419e0f96dd 1204 ret = mbedtls_ecp_copy(&ecdh.Qp, &ecdh.Q);
mbed_official 78:5f419e0f96dd 1205 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1206 PRINT_ERROR(ret, "mbedtls_ecp_copy()");
mbed_official 78:5f419e0f96dd 1207 goto exit;
mbed_official 78:5f419e0f96dd 1208 }
mbed_official 78:5f419e0f96dd 1209
mbed_official 78:5f419e0f96dd 1210 ret = mbedtls_ecdh_make_public(&ecdh, &olen, buf, sizeof(buf), myrand,
mbed_official 78:5f419e0f96dd 1211 NULL);
mbed_official 78:5f419e0f96dd 1212 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1213 PRINT_ERROR(ret, "mbedtls_ecdh_make_public()");
mbed_official 78:5f419e0f96dd 1214 goto exit;
Janos Follath 0:1f7c5025e59d 1215 }
Janos Follath 0:1f7c5025e59d 1216
mbed_official 78:5f419e0f96dd 1217 ecp_clear_precomputed(&ecdh.grp);
mbed_official 70:72c865037f5d 1218
mbed_official 78:5f419e0f96dd 1219 ret = mbedtls_snprintf(title, sizeof(title), "ECDH-%s",
mbed_official 78:5f419e0f96dd 1220 curve_info->name);
mbed_official 78:5f419e0f96dd 1221 if (ret < 0 || static_cast<size_t>(ret) >= sizeof(title)) {
mbed_official 78:5f419e0f96dd 1222 mbedtls_printf("Failed to compose title string using "
mbed_official 78:5f419e0f96dd 1223 "mbedtls_snprintf(): %d\n", ret);
mbed_official 78:5f419e0f96dd 1224 goto exit;
mbed_official 78:5f419e0f96dd 1225 }
mbed_official 78:5f419e0f96dd 1226 BENCHMARK_PUBLIC(title, "handshake",
mbed_official 78:5f419e0f96dd 1227 ret = mbedtls_ecdh_calc_secret(&ecdh, &olen, buf,
mbed_official 78:5f419e0f96dd 1228 sizeof(buf), myrand,
mbed_official 78:5f419e0f96dd 1229 NULL));
mbed_official 70:72c865037f5d 1230
mbed_official 78:5f419e0f96dd 1231 exit:
mbed_official 78:5f419e0f96dd 1232 mbedtls_ecdh_free(&ecdh);
mbed_official 70:72c865037f5d 1233 }
mbed_official 78:5f419e0f96dd 1234
mbed_official 78:5f419e0f96dd 1235 return ret;
mbed_official 78:5f419e0f96dd 1236 }
mbed_official 78:5f419e0f96dd 1237 #endif /* MBEDTLS_ECDH_C */
mbed_official 70:72c865037f5d 1238
mbed_official 78:5f419e0f96dd 1239 #if defined(MBEDTLS_ECDH_C) && defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
mbed_official 78:5f419e0f96dd 1240 /* Curve25519 needs to be handled separately */
mbed_official 78:5f419e0f96dd 1241 MBED_NOINLINE static int benchmark_ecdh_curve22519()
mbed_official 78:5f419e0f96dd 1242 {
mbed_official 78:5f419e0f96dd 1243 int ret = 0;
mbed_official 78:5f419e0f96dd 1244 mbedtls_ecdh_context ecdh;
mbed_official 78:5f419e0f96dd 1245 mbedtls_mpi z;
mbed_official 78:5f419e0f96dd 1246
mbed_official 78:5f419e0f96dd 1247 mbedtls_ecdh_init(&ecdh);
mbed_official 78:5f419e0f96dd 1248 mbedtls_mpi_init(&z);
mbed_official 78:5f419e0f96dd 1249
mbed_official 78:5f419e0f96dd 1250 ret = mbedtls_ecp_group_load(&ecdh.grp, MBEDTLS_ECP_DP_CURVE25519);
mbed_official 78:5f419e0f96dd 1251 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1252 PRINT_ERROR(ret, "mbedtls_ecp_group_load()");
mbed_official 78:5f419e0f96dd 1253 goto exit;
mbed_official 78:5f419e0f96dd 1254 }
mbed_official 78:5f419e0f96dd 1255
mbed_official 78:5f419e0f96dd 1256 ret = mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d, &ecdh.Qp, myrand,
mbed_official 78:5f419e0f96dd 1257 NULL);
mbed_official 78:5f419e0f96dd 1258 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1259 PRINT_ERROR(ret, "mbedtls_ecdh_gen_public()");
mbed_official 78:5f419e0f96dd 1260 goto exit;
mbed_official 70:72c865037f5d 1261 }
mbed_official 70:72c865037f5d 1262
mbed_official 78:5f419e0f96dd 1263 /*
mbed_official 78:5f419e0f96dd 1264 * Benchmarking this requires two function calls that can fail. We
mbed_official 78:5f419e0f96dd 1265 * add a check in between them to check for any errors. In normal
mbed_official 78:5f419e0f96dd 1266 * operation, the overhead of this check is negligible
mbed_official 78:5f419e0f96dd 1267 */
mbed_official 78:5f419e0f96dd 1268 BENCHMARK_PUBLIC("ECDHE-Curve25519", "handshake",
mbed_official 78:5f419e0f96dd 1269 ret = mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d,
mbed_official 78:5f419e0f96dd 1270 &ecdh.Q, myrand, NULL);
mbed_official 78:5f419e0f96dd 1271 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1272 PRINT_ERROR(ret, "mbedtls_ecdh_make_public()");
mbed_official 78:5f419e0f96dd 1273 goto exit;
mbed_official 78:5f419e0f96dd 1274 }
mbed_official 78:5f419e0f96dd 1275 ret = mbedtls_ecdh_compute_shared(&ecdh.grp, &z,
mbed_official 78:5f419e0f96dd 1276 &ecdh.Qp, &ecdh.d,
mbed_official 78:5f419e0f96dd 1277 myrand, NULL));
mbed_official 70:72c865037f5d 1278
mbed_official 78:5f419e0f96dd 1279 mbedtls_ecdh_free(&ecdh);
mbed_official 78:5f419e0f96dd 1280 mbedtls_mpi_free(&z);
mbed_official 78:5f419e0f96dd 1281
mbed_official 78:5f419e0f96dd 1282 mbedtls_ecdh_init(&ecdh);
mbed_official 78:5f419e0f96dd 1283 mbedtls_mpi_init(&z);
mbed_official 78:5f419e0f96dd 1284
mbed_official 78:5f419e0f96dd 1285 ret = mbedtls_ecp_group_load(&ecdh.grp, MBEDTLS_ECP_DP_CURVE25519);
mbed_official 78:5f419e0f96dd 1286 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1287 PRINT_ERROR(ret, "mbedtls_ecp_group_load()");
mbed_official 78:5f419e0f96dd 1288 goto exit;
mbed_official 78:5f419e0f96dd 1289 }
Janos Follath 0:1f7c5025e59d 1290
mbed_official 78:5f419e0f96dd 1291 ret = mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d, &ecdh.Qp, myrand, NULL);
mbed_official 78:5f419e0f96dd 1292 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1293 PRINT_ERROR(ret, "mbedtls_ecdh_gen_public()");
mbed_official 78:5f419e0f96dd 1294 goto exit;
mbed_official 78:5f419e0f96dd 1295 }
Janos Follath 0:1f7c5025e59d 1296
mbed_official 78:5f419e0f96dd 1297 ret = mbedtls_ecdh_gen_public(&ecdh.grp, &ecdh.d, &ecdh.Q, myrand, NULL);
mbed_official 78:5f419e0f96dd 1298 if (ret != 0) {
mbed_official 78:5f419e0f96dd 1299 PRINT_ERROR(ret, "mbedtls_ecdh_gen_public()");
mbed_official 78:5f419e0f96dd 1300 goto exit;
mbed_official 78:5f419e0f96dd 1301 }
Janos Follath 0:1f7c5025e59d 1302
mbed_official 78:5f419e0f96dd 1303 BENCHMARK_PUBLIC("ECDH-Curve25519", "handshake",
mbed_official 78:5f419e0f96dd 1304 ret = mbedtls_ecdh_compute_shared(&ecdh.grp, &z,
mbed_official 78:5f419e0f96dd 1305 &ecdh.Qp, &ecdh.d,
mbed_official 78:5f419e0f96dd 1306 myrand, NULL));
mbed_official 78:5f419e0f96dd 1307
mbed_official 78:5f419e0f96dd 1308 exit:
mbed_official 78:5f419e0f96dd 1309 mbedtls_ecdh_free(&ecdh);
mbed_official 78:5f419e0f96dd 1310 mbedtls_mpi_free(&z);
mbed_official 78:5f419e0f96dd 1311
mbed_official 78:5f419e0f96dd 1312 return ret;
Janos Follath 0:1f7c5025e59d 1313 }
mbed_official 78:5f419e0f96dd 1314 #endif /* MBEDTLS_ECDH_C && MBEDTLS_ECP_DP_CURVE25519_ENABLED */
Janos Follath 0:1f7c5025e59d 1315
mbed_official 78:5f419e0f96dd 1316 int main()
mbed_official 78:5f419e0f96dd 1317 {
mbed_official 78:5f419e0f96dd 1318 int exit_code = MBEDTLS_EXIT_SUCCESS;
mbed_official 63:9f7e5224fc60 1319
mbed_official 78:5f419e0f96dd 1320 memset(buf, 0xAA, sizeof(buf));
mbed_official 78:5f419e0f96dd 1321 memset(tmp, 0xBB, sizeof(tmp));
mbed_official 78:5f419e0f96dd 1322
mbed_official 80:0f7a38bbcebe 1323 if ((exit_code = mbedtls_platform_setup(NULL)) != 0) {
mbed_official 78:5f419e0f96dd 1324 mbedtls_printf("Platform initialization failed with error %d\r\n",
mbed_official 78:5f419e0f96dd 1325 exit_code);
mbed_official 63:9f7e5224fc60 1326 return MBEDTLS_EXIT_FAILURE;
Janos Follath 0:1f7c5025e59d 1327 }
mbed_official 63:9f7e5224fc60 1328
mbed_official 78:5f419e0f96dd 1329 #if defined(MBEDTLS_MD4_C)
mbed_official 78:5f419e0f96dd 1330 if (benchmark_md4() != 0) {
mbed_official 78:5f419e0f96dd 1331 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1332 }
mbed_official 78:5f419e0f96dd 1333 #endif /* MBEDTLS_MD4_C */
mbed_official 78:5f419e0f96dd 1334
mbed_official 78:5f419e0f96dd 1335 #if defined(MBEDTLS_MD5_C)
mbed_official 78:5f419e0f96dd 1336 if (benchmark_md5() != 0) {
mbed_official 78:5f419e0f96dd 1337 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1338 }
mbed_official 78:5f419e0f96dd 1339 #endif /* MBEDTLS_MD5_C */
mbed_official 78:5f419e0f96dd 1340
mbed_official 78:5f419e0f96dd 1341 #if defined(MBEDTLS_RIPEMD160_C)
mbed_official 78:5f419e0f96dd 1342 if (benchmark_ripemd160() != 0) {
mbed_official 78:5f419e0f96dd 1343 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1344 }
mbed_official 78:5f419e0f96dd 1345 #endif /* MBEDTLS_RIPEMD160_C */
mbed_official 78:5f419e0f96dd 1346
mbed_official 78:5f419e0f96dd 1347 #if defined(MBEDTLS_SHA1_C)
mbed_official 78:5f419e0f96dd 1348 if (benchmark_sha1() != 0) {
mbed_official 78:5f419e0f96dd 1349 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1350 }
mbed_official 78:5f419e0f96dd 1351 #endif /* MBEDTLS_SHA1_C */
mbed_official 78:5f419e0f96dd 1352
mbed_official 78:5f419e0f96dd 1353 #if defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 1354 if (benchmark_sha256() != 0) {
mbed_official 78:5f419e0f96dd 1355 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1356 }
mbed_official 78:5f419e0f96dd 1357 #endif /* MBEDTLS_SHA256_C */
mbed_official 78:5f419e0f96dd 1358
mbed_official 78:5f419e0f96dd 1359 #if defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 1360 if (benchmark_sha512() != 0) {
mbed_official 78:5f419e0f96dd 1361 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1362 }
mbed_official 78:5f419e0f96dd 1363 #endif /* MBEDTLS_SHA512_C */
mbed_official 78:5f419e0f96dd 1364
mbed_official 78:5f419e0f96dd 1365 #if defined(MBEDTLS_ARC4_C)
mbed_official 78:5f419e0f96dd 1366 if (benchmark_arc4() != 0) {
mbed_official 78:5f419e0f96dd 1367 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1368 }
mbed_official 78:5f419e0f96dd 1369 #endif /* MBEDTLS_ARC4_C */
mbed_official 78:5f419e0f96dd 1370
mbed_official 78:5f419e0f96dd 1371 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 1372 if (benchmark_des3() != 0) {
mbed_official 78:5f419e0f96dd 1373 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1374 }
mbed_official 78:5f419e0f96dd 1375 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 1376
mbed_official 78:5f419e0f96dd 1377 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 1378 if (benchmark_des() != 0) {
mbed_official 78:5f419e0f96dd 1379 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1380 }
mbed_official 78:5f419e0f96dd 1381 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 1382
mbed_official 78:5f419e0f96dd 1383 #if defined(MBEDTLS_DES_C) && defined(MBEDTLS_CIPHER_MODE_CBC) && \
mbed_official 78:5f419e0f96dd 1384 defined(MBEDTLS_CMAC_C)
mbed_official 78:5f419e0f96dd 1385 if (benchmark_des3_cmac() != 0) {
mbed_official 78:5f419e0f96dd 1386 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1387 }
mbed_official 78:5f419e0f96dd 1388 #endif /* MBEDTLS_DES_C && MBEDTLS_CIPHER_MODE_CBC && MBEDTLS_CMAC_C */
mbed_official 78:5f419e0f96dd 1389
mbed_official 78:5f419e0f96dd 1390 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 1391 if (benchmark_aes_cbc() != 0) {
mbed_official 78:5f419e0f96dd 1392 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1393 }
mbed_official 78:5f419e0f96dd 1394 #endif /* MBEDTLS_AES_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 1395
mbed_official 78:5f419e0f96dd 1396 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CIPHER_MODE_CTR)
mbed_official 78:5f419e0f96dd 1397 if (benchmark_aes_ctr() != 0) {
mbed_official 78:5f419e0f96dd 1398 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1399 }
mbed_official 78:5f419e0f96dd 1400 #endif /* MBEDTLS_AES_C && MBEDTLS_CIPHER_MODE_CTR */
mbed_official 78:5f419e0f96dd 1401
mbed_official 78:5f419e0f96dd 1402 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_GCM_C)
mbed_official 78:5f419e0f96dd 1403 if (benchmark_aes_gcm() != 0) {
mbed_official 78:5f419e0f96dd 1404 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1405 }
mbed_official 78:5f419e0f96dd 1406 #endif /* MBEDTLS_AES_C && MBEDTLS_GCM_C */
mbed_official 78:5f419e0f96dd 1407
mbed_official 78:5f419e0f96dd 1408 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CCM_C)
mbed_official 78:5f419e0f96dd 1409 if (benchmark_aes_ccm() != 0) {
mbed_official 78:5f419e0f96dd 1410 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1411 }
mbed_official 78:5f419e0f96dd 1412 #endif /* MBEDTLS_AES_C && MBEDTLS_CCM_C */
mbed_official 78:5f419e0f96dd 1413
mbed_official 78:5f419e0f96dd 1414 #if defined(MBEDTLS_AES_C) && defined(MBEDTLS_CMAC_C)
mbed_official 78:5f419e0f96dd 1415 if (benchmark_aes_cmac() != 0) {
mbed_official 78:5f419e0f96dd 1416 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1417 }
mbed_official 78:5f419e0f96dd 1418 #endif /* MBEDTLS_AES_C && MBEDTLS_CMAC_C */
mbed_official 78:5f419e0f96dd 1419
mbed_official 78:5f419e0f96dd 1420 #if defined(MBEDTLS_CAMELLIA_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 1421 if (benchmark_camellia() != 0) {
mbed_official 78:5f419e0f96dd 1422 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1423 }
mbed_official 78:5f419e0f96dd 1424 #endif /* MBEDTLS_CAMELLIA_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 1425
mbed_official 78:5f419e0f96dd 1426 #if defined(MBEDTLS_BLOWFISH_C) && defined(MBEDTLS_CIPHER_MODE_CBC)
mbed_official 78:5f419e0f96dd 1427 if (benchmark_blowfish() != 0) {
mbed_official 78:5f419e0f96dd 1428 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1429 }
mbed_official 78:5f419e0f96dd 1430 #endif /* MBEDTLS_BLOWFISH_C && MBEDTLS_CIPHER_MODE_CBC */
mbed_official 78:5f419e0f96dd 1431
mbed_official 78:5f419e0f96dd 1432 #if defined(MBEDTLS_HAVEGE_C)
mbed_official 78:5f419e0f96dd 1433 if (benchmark_havege() != 0) {
mbed_official 78:5f419e0f96dd 1434 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1435 }
mbed_official 78:5f419e0f96dd 1436 #endif /* MBEDTLS_HAVEGE_C */
mbed_official 78:5f419e0f96dd 1437
mbed_official 78:5f419e0f96dd 1438 #if defined(MBEDTLS_CTR_DRBG_C)
mbed_official 78:5f419e0f96dd 1439 if (benchmark_ctr_drbg() != 0) {
mbed_official 78:5f419e0f96dd 1440 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1441 }
mbed_official 78:5f419e0f96dd 1442 #endif /* MBEDTLS_CTR_DRBG_C */
mbed_official 78:5f419e0f96dd 1443
mbed_official 78:5f419e0f96dd 1444 #if defined(MBEDTLS_HMAC_DRBG_C)
mbed_official 78:5f419e0f96dd 1445 if (benchmark_hmac_drbg() != 0) {
mbed_official 78:5f419e0f96dd 1446 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1447 }
mbed_official 78:5f419e0f96dd 1448 #endif /* MBEDTLS_HMAC_DRBG_C */
mbed_official 78:5f419e0f96dd 1449
mbed_official 78:5f419e0f96dd 1450 #if defined(MBEDTLS_RSA_C) && \
mbed_official 78:5f419e0f96dd 1451 defined(MBEDTLS_PEM_PARSE_C) && defined(MBEDTLS_PK_PARSE_C)
mbed_official 78:5f419e0f96dd 1452 if (benchmark_rsa() != 0) {
mbed_official 78:5f419e0f96dd 1453 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1454 }
mbed_official 78:5f419e0f96dd 1455 #endif /* MBEDTLS_RSA_C && MBEDTLS_PEM_PARSE_C && MBEDTLS_PK_PARSE_C */
mbed_official 78:5f419e0f96dd 1456
mbed_official 78:5f419e0f96dd 1457 #if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_BIGNUM_C)
mbed_official 78:5f419e0f96dd 1458 if (benchmark_dhm() != 0) {
mbed_official 78:5f419e0f96dd 1459 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1460 }
mbed_official 78:5f419e0f96dd 1461 #endif /* MBEDTLS_DHM_C && MBEDTLS_BIGNUM_C */
mbed_official 78:5f419e0f96dd 1462
mbed_official 78:5f419e0f96dd 1463 #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA256_C)
mbed_official 78:5f419e0f96dd 1464 if (benchmark_ecdsa() != 0) {
mbed_official 78:5f419e0f96dd 1465 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1466 }
mbed_official 78:5f419e0f96dd 1467 #endif /* MBEDTLS_ECDSA_C && MBEDTLS_SHA2565_C */
mbed_official 78:5f419e0f96dd 1468
mbed_official 78:5f419e0f96dd 1469 #if defined(MBEDTLS_ECDH_C)
mbed_official 78:5f419e0f96dd 1470 if (benchmark_ecdh() != 0) {
mbed_official 63:9f7e5224fc60 1471 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 63:9f7e5224fc60 1472 }
mbed_official 63:9f7e5224fc60 1473
mbed_official 78:5f419e0f96dd 1474 #if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)
mbed_official 78:5f419e0f96dd 1475 if (benchmark_ecdh_curve22519() != 0) {
mbed_official 78:5f419e0f96dd 1476 exit_code = MBEDTLS_EXIT_FAILURE;
mbed_official 78:5f419e0f96dd 1477 }
mbed_official 78:5f419e0f96dd 1478 #endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */
mbed_official 78:5f419e0f96dd 1479 #endif /* MBEDTLS_ECDH_C */
mbed_official 78:5f419e0f96dd 1480
mbed_official 78:5f419e0f96dd 1481 mbedtls_printf("DONE\n");
mbed_official 78:5f419e0f96dd 1482
mbed_official 80:0f7a38bbcebe 1483 mbedtls_platform_teardown(NULL);
mbed_official 63:9f7e5224fc60 1484 return exit_code;
Janos Follath 0:1f7c5025e59d 1485 }