Skip to content

Commit 31250b5

Browse files
authored
Merge pull request arduino-libraries#32 from luigigubello/MD5
Add MD5 API and example
2 parents 15763ab + 516d6dd commit 31250b5

File tree

4 files changed

+174
-0
lines changed

4 files changed

+174
-0
lines changed

examples/MD5/MD5.ino

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
ArduinoBearSSL MD5
3+
4+
This sketch demonstrates how to create a MD5 hash
5+
for an input string.
6+
7+
This example code is in the public domain.
8+
*/
9+
10+
#include <ArduinoBearSSL.h>
11+
12+
void setup() {
13+
Serial.begin(9600);
14+
while (!Serial);
15+
16+
// expect 9e107d9d372bb6826bd81d3542a419d6
17+
printMD5("The quick brown fox jumps over the lazy dog");
18+
19+
// expect 80070713463e7749b90c2dc24911e275
20+
printHMACMD5("key", "The quick brown fox jumps over the lazy dog");
21+
}
22+
23+
void loop() {
24+
}
25+
26+
void printMD5(const char* str) {
27+
Serial.print("MD5 of '");
28+
Serial.print(str);
29+
Serial.print("' is 0x");
30+
31+
MD5.beginHash();
32+
MD5.print(str);
33+
MD5.endHash();
34+
35+
printResult();
36+
}
37+
38+
void printHMACMD5(const char* secret, const char* str) {
39+
Serial.print("HMAC-MD5 of '");
40+
Serial.print(str);
41+
Serial.print("' with secret '");
42+
Serial.print(secret);
43+
Serial.print("' is 0x");
44+
45+
MD5.beginHmac(secret);
46+
MD5.print(str);
47+
MD5.endHmac();
48+
49+
printResult();
50+
}
51+
52+
void printResult()
53+
{
54+
while (MD5.available()) {
55+
byte b = MD5.read();
56+
57+
if (b < 16) {
58+
Serial.print("0");
59+
}
60+
61+
Serial.print(b, HEX);
62+
}
63+
Serial.println();
64+
}

src/ArduinoBearSSL.h

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "BearSSLClient.h"
2929
#include "SHA1.h"
3030
#include "SHA256.h"
31+
#include "MD5.h"
3132

3233
class ArduinoBearSSLClass {
3334
public:

src/MD5.cpp

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright (c) 2019 Arduino SA. All rights reserved.
3+
*
4+
* Permission is hereby granted, free of charge, to any person obtaining
5+
* a copy of this software and associated documentation files (the
6+
* "Software"), to deal in the Software without restriction, including
7+
* without limitation the rights to use, copy, modify, merge, publish,
8+
* distribute, sublicense, and/or sell copies of the Software, and to
9+
* permit persons to whom the Software is furnished to do so, subject to
10+
* the following conditions:
11+
*
12+
* The above copyright notice and this permission notice shall be
13+
* included in all copies or substantial portions of the Software.
14+
*
15+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19+
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20+
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21+
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22+
* SOFTWARE.
23+
*/
24+
25+
#include "MD5.h"
26+
27+
MD5Class::MD5Class() :
28+
SHAClass(MD5_BLOCK_SIZE, MD5_DIGEST_SIZE)
29+
{
30+
}
31+
32+
MD5Class::~MD5Class()
33+
{
34+
}
35+
36+
int MD5Class::begin()
37+
{
38+
br_md5_init(&_ctx);
39+
40+
return 1;
41+
}
42+
43+
int MD5Class::update(const uint8_t *buffer, size_t size)
44+
{
45+
br_md5_update(&_ctx, buffer, size);
46+
47+
return 1;
48+
}
49+
50+
int MD5Class::end(uint8_t *digest)
51+
{
52+
br_md5_out(&_ctx, digest);
53+
54+
return 1;
55+
}
56+
57+
MD5Class MD5;

src/MD5.h

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright (c) 2019 Arduino SA. All rights reserved.
3+
*
4+
* Permission is hereby granted, free of charge, to any person obtaining
5+
* a copy of this software and associated documentation files (the
6+
* "Software"), to deal in the Software without restriction, including
7+
* without limitation the rights to use, copy, modify, merge, publish,
8+
* distribute, sublicense, and/or sell copies of the Software, and to
9+
* permit persons to whom the Software is furnished to do so, subject to
10+
* the following conditions:
11+
*
12+
* The above copyright notice and this permission notice shall be
13+
* included in all copies or substantial portions of the Software.
14+
*
15+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16+
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17+
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18+
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19+
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20+
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21+
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22+
* SOFTWARE.
23+
*/
24+
25+
#ifndef MD5_H
26+
#define MD5_H
27+
28+
#include <bearssl/bearssl_hash.h>
29+
30+
#include "SHA.h"
31+
32+
#define MD5_BLOCK_SIZE 64
33+
#define MD5_DIGEST_SIZE 16
34+
35+
class MD5Class: public SHAClass {
36+
37+
public:
38+
MD5Class();
39+
virtual ~MD5Class();
40+
41+
protected:
42+
virtual int begin();
43+
virtual int update(const uint8_t *buffer, size_t size);
44+
virtual int end(uint8_t *digest);
45+
46+
private:
47+
br_md5_context _ctx;
48+
};
49+
50+
extern MD5Class MD5;
51+
52+
#endif

0 commit comments

Comments
 (0)