Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
C
capnproto
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
capnproto
Commits
0391156a
Commit
0391156a
authored
Jul 23, 2013
by
Kenton Varda
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add MD5 code to compiler.
parent
24415ced
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
466 additions
and
0 deletions
+466
-0
md5-test.c++
c++/src/capnp/compiler/md5-test.c++
+65
-0
md5.c++
c++/src/capnp/compiler/md5.c++
+324
-0
md5.h
c++/src/capnp/compiler/md5.h
+77
-0
No files found.
c++/src/capnp/compiler/md5-test.c++
0 → 100644
View file @
0391156a
// Copyright (c) 2013, Kenton Varda <temporal@gmail.com>
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this
// list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "md5.h"
#include <gtest/gtest.h>
namespace
capnp
{
namespace
compiler
{
namespace
{
static
kj
::
String
doMd5
(
kj
::
StringPtr
text
)
{
Md5
md5
;
md5
.
update
(
text
);
return
kj
::
str
(
md5
.
finishAsHex
().
cStr
());
}
TEST
(
Md5
,
Sum
)
{
EXPECT_STREQ
(
"acbd18db4cc2f85cedef654fccc4a4d8"
,
doMd5
(
"foo"
).
cStr
());
EXPECT_STREQ
(
"37b51d194a7513e45b56f6524f2d51f2"
,
doMd5
(
"bar"
).
cStr
());
EXPECT_STREQ
(
"3858f62230ac3c915f300c664312c63f"
,
doMd5
(
"foobar"
).
cStr
());
{
Md5
md5
;
md5
.
update
(
"foo"
);
md5
.
update
(
"bar"
);
EXPECT_STREQ
(
"3858f62230ac3c915f300c664312c63f"
,
md5
.
finishAsHex
().
cStr
());
}
EXPECT_STREQ
(
"ebf2442d167a30ca4453f99abd8cddf4"
,
doMd5
(
"Hello, this is a long string that is more than 64 bytes because the md5 code uses a "
"buffer of 64 bytes."
).
cStr
());
{
Md5
md5
;
md5
.
update
(
"Hello, this is a long string "
);
md5
.
update
(
"that is more than 64 bytes "
);
md5
.
update
(
"because the md5 code uses a "
);
md5
.
update
(
"buffer of 64 bytes."
);
EXPECT_STREQ
(
"ebf2442d167a30ca4453f99abd8cddf4"
,
md5
.
finishAsHex
().
cStr
());
}
}
}
// namespace
}
// namespace compiler
}
// namespace capnp
c++/src/capnp/compiler/md5.c++
0 → 100644
View file @
0391156a
// This file was modified by Kenton Varda from code placed in the public domain.
// The code, which was originally C, was modified to give it a C++ interface.
// The original code bore the following notice:
/*
* This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
* MD5 Message-Digest Algorithm (RFC 1321).
*
* Homepage:
* http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
*
* Author:
* Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
*
* This software was written by Alexander Peslyak in 2001. No copyright is
* claimed, and the software is hereby placed in the public domain.
* In case this attempt to disclaim copyright and place the software in the
* public domain is deemed null and void, then the software is
* Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
* general public under the following terms:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted.
*
* There's ABSOLUTELY NO WARRANTY, express or implied.
*
* (This is a heavily cut-down "BSD license".)
*
* This differs from Colin Plumb's older public domain implementation in that
* no exactly 32-bit integer data type is required (any 32-bit or wider
* unsigned integer data type will do), there's no compile-time endianness
* configuration, and the function prototypes match OpenSSL's. No code from
* Colin Plumb's implementation has been reused; this comment merely compares
* the properties of the two independent implementations.
*
* The primary goals of this implementation are portability and ease of use.
* It is meant to be fast, but not as fast as possible. Some known
* optimizations are not included to reduce source code size and avoid
* compile-time configuration.
*/
#include "md5.h"
#include <kj/debug.h>
#include <string.h>
namespace
capnp
{
namespace
compiler
{
/*
* The basic MD5 functions.
*
* F and G are optimized compared to their RFC 1321 definitions for
* architectures that lack an AND-NOT instruction, just like in Colin Plumb's
* implementation.
*/
#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y))))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | ~(z)))
/*
* The MD5 transformation for all four rounds.
*/
#define STEP(f, a, b, c, d, x, t, s) \
(a) += f((b), (c), (d)) + (x) + (t); \
(a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \
(a) += (b);
/*
* SET reads 4 input bytes in little-endian byte order and stores them
* in a properly aligned word in host byte order.
*
* The check for little-endian architectures that tolerate unaligned
* memory accesses is just an optimization. Nothing will break if it
* doesn't work.
*/
#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
#define SET(n) \
(*(MD5_u32plus *)&ptr[(n) * 4])
#define GET(n) \
SET(n)
#else
#define SET(n) \
(ctx->block[(n)] = \
(MD5_u32plus)ptr[(n) * 4] | \
((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \
((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \
((MD5_u32plus)ptr[(n) * 4 + 3] << 24))
#define GET(n) \
(ctx->block[(n)])
#endif
/*
* This processes one or more 64-byte data blocks, but does NOT update
* the bit counters. There are no alignment requirements.
*/
const
kj
::
byte
*
Md5
::
body
(
const
kj
::
byte
*
ptr
,
size_t
size
)
{
MD5_u32plus
a
,
b
,
c
,
d
;
MD5_u32plus
saved_a
,
saved_b
,
saved_c
,
saved_d
;
a
=
ctx
.
a
;
b
=
ctx
.
b
;
c
=
ctx
.
c
;
d
=
ctx
.
d
;
do
{
saved_a
=
a
;
saved_b
=
b
;
saved_c
=
c
;
saved_d
=
d
;
/* Round 1 */
STEP
(
F
,
a
,
b
,
c
,
d
,
SET
(
0
),
0xd76aa478
,
7
)
STEP
(
F
,
d
,
a
,
b
,
c
,
SET
(
1
),
0xe8c7b756
,
12
)
STEP
(
F
,
c
,
d
,
a
,
b
,
SET
(
2
),
0x242070db
,
17
)
STEP
(
F
,
b
,
c
,
d
,
a
,
SET
(
3
),
0xc1bdceee
,
22
)
STEP
(
F
,
a
,
b
,
c
,
d
,
SET
(
4
),
0xf57c0faf
,
7
)
STEP
(
F
,
d
,
a
,
b
,
c
,
SET
(
5
),
0x4787c62a
,
12
)
STEP
(
F
,
c
,
d
,
a
,
b
,
SET
(
6
),
0xa8304613
,
17
)
STEP
(
F
,
b
,
c
,
d
,
a
,
SET
(
7
),
0xfd469501
,
22
)
STEP
(
F
,
a
,
b
,
c
,
d
,
SET
(
8
),
0x698098d8
,
7
)
STEP
(
F
,
d
,
a
,
b
,
c
,
SET
(
9
),
0x8b44f7af
,
12
)
STEP
(
F
,
c
,
d
,
a
,
b
,
SET
(
10
),
0xffff5bb1
,
17
)
STEP
(
F
,
b
,
c
,
d
,
a
,
SET
(
11
),
0x895cd7be
,
22
)
STEP
(
F
,
a
,
b
,
c
,
d
,
SET
(
12
),
0x6b901122
,
7
)
STEP
(
F
,
d
,
a
,
b
,
c
,
SET
(
13
),
0xfd987193
,
12
)
STEP
(
F
,
c
,
d
,
a
,
b
,
SET
(
14
),
0xa679438e
,
17
)
STEP
(
F
,
b
,
c
,
d
,
a
,
SET
(
15
),
0x49b40821
,
22
)
/* Round 2 */
STEP
(
G
,
a
,
b
,
c
,
d
,
GET
(
1
),
0xf61e2562
,
5
)
STEP
(
G
,
d
,
a
,
b
,
c
,
GET
(
6
),
0xc040b340
,
9
)
STEP
(
G
,
c
,
d
,
a
,
b
,
GET
(
11
),
0x265e5a51
,
14
)
STEP
(
G
,
b
,
c
,
d
,
a
,
GET
(
0
),
0xe9b6c7aa
,
20
)
STEP
(
G
,
a
,
b
,
c
,
d
,
GET
(
5
),
0xd62f105d
,
5
)
STEP
(
G
,
d
,
a
,
b
,
c
,
GET
(
10
),
0x02441453
,
9
)
STEP
(
G
,
c
,
d
,
a
,
b
,
GET
(
15
),
0xd8a1e681
,
14
)
STEP
(
G
,
b
,
c
,
d
,
a
,
GET
(
4
),
0xe7d3fbc8
,
20
)
STEP
(
G
,
a
,
b
,
c
,
d
,
GET
(
9
),
0x21e1cde6
,
5
)
STEP
(
G
,
d
,
a
,
b
,
c
,
GET
(
14
),
0xc33707d6
,
9
)
STEP
(
G
,
c
,
d
,
a
,
b
,
GET
(
3
),
0xf4d50d87
,
14
)
STEP
(
G
,
b
,
c
,
d
,
a
,
GET
(
8
),
0x455a14ed
,
20
)
STEP
(
G
,
a
,
b
,
c
,
d
,
GET
(
13
),
0xa9e3e905
,
5
)
STEP
(
G
,
d
,
a
,
b
,
c
,
GET
(
2
),
0xfcefa3f8
,
9
)
STEP
(
G
,
c
,
d
,
a
,
b
,
GET
(
7
),
0x676f02d9
,
14
)
STEP
(
G
,
b
,
c
,
d
,
a
,
GET
(
12
),
0x8d2a4c8a
,
20
)
/* Round 3 */
STEP
(
H
,
a
,
b
,
c
,
d
,
GET
(
5
),
0xfffa3942
,
4
)
STEP
(
H
,
d
,
a
,
b
,
c
,
GET
(
8
),
0x8771f681
,
11
)
STEP
(
H
,
c
,
d
,
a
,
b
,
GET
(
11
),
0x6d9d6122
,
16
)
STEP
(
H
,
b
,
c
,
d
,
a
,
GET
(
14
),
0xfde5380c
,
23
)
STEP
(
H
,
a
,
b
,
c
,
d
,
GET
(
1
),
0xa4beea44
,
4
)
STEP
(
H
,
d
,
a
,
b
,
c
,
GET
(
4
),
0x4bdecfa9
,
11
)
STEP
(
H
,
c
,
d
,
a
,
b
,
GET
(
7
),
0xf6bb4b60
,
16
)
STEP
(
H
,
b
,
c
,
d
,
a
,
GET
(
10
),
0xbebfbc70
,
23
)
STEP
(
H
,
a
,
b
,
c
,
d
,
GET
(
13
),
0x289b7ec6
,
4
)
STEP
(
H
,
d
,
a
,
b
,
c
,
GET
(
0
),
0xeaa127fa
,
11
)
STEP
(
H
,
c
,
d
,
a
,
b
,
GET
(
3
),
0xd4ef3085
,
16
)
STEP
(
H
,
b
,
c
,
d
,
a
,
GET
(
6
),
0x04881d05
,
23
)
STEP
(
H
,
a
,
b
,
c
,
d
,
GET
(
9
),
0xd9d4d039
,
4
)
STEP
(
H
,
d
,
a
,
b
,
c
,
GET
(
12
),
0xe6db99e5
,
11
)
STEP
(
H
,
c
,
d
,
a
,
b
,
GET
(
15
),
0x1fa27cf8
,
16
)
STEP
(
H
,
b
,
c
,
d
,
a
,
GET
(
2
),
0xc4ac5665
,
23
)
/* Round 4 */
STEP
(
I
,
a
,
b
,
c
,
d
,
GET
(
0
),
0xf4292244
,
6
)
STEP
(
I
,
d
,
a
,
b
,
c
,
GET
(
7
),
0x432aff97
,
10
)
STEP
(
I
,
c
,
d
,
a
,
b
,
GET
(
14
),
0xab9423a7
,
15
)
STEP
(
I
,
b
,
c
,
d
,
a
,
GET
(
5
),
0xfc93a039
,
21
)
STEP
(
I
,
a
,
b
,
c
,
d
,
GET
(
12
),
0x655b59c3
,
6
)
STEP
(
I
,
d
,
a
,
b
,
c
,
GET
(
3
),
0x8f0ccc92
,
10
)
STEP
(
I
,
c
,
d
,
a
,
b
,
GET
(
10
),
0xffeff47d
,
15
)
STEP
(
I
,
b
,
c
,
d
,
a
,
GET
(
1
),
0x85845dd1
,
21
)
STEP
(
I
,
a
,
b
,
c
,
d
,
GET
(
8
),
0x6fa87e4f
,
6
)
STEP
(
I
,
d
,
a
,
b
,
c
,
GET
(
15
),
0xfe2ce6e0
,
10
)
STEP
(
I
,
c
,
d
,
a
,
b
,
GET
(
6
),
0xa3014314
,
15
)
STEP
(
I
,
b
,
c
,
d
,
a
,
GET
(
13
),
0x4e0811a1
,
21
)
STEP
(
I
,
a
,
b
,
c
,
d
,
GET
(
4
),
0xf7537e82
,
6
)
STEP
(
I
,
d
,
a
,
b
,
c
,
GET
(
11
),
0xbd3af235
,
10
)
STEP
(
I
,
c
,
d
,
a
,
b
,
GET
(
2
),
0x2ad7d2bb
,
15
)
STEP
(
I
,
b
,
c
,
d
,
a
,
GET
(
9
),
0xeb86d391
,
21
)
a
+=
saved_a
;
b
+=
saved_b
;
c
+=
saved_c
;
d
+=
saved_d
;
ptr
+=
64
;
}
while
(
size
-=
64
);
ctx
.
a
=
a
;
ctx
.
b
=
b
;
ctx
.
c
=
c
;
ctx
.
d
=
d
;
return
ptr
;
}
Md5
::
Md5
()
{
ctx
.
a
=
0x67452301
;
ctx
.
b
=
0xefcdab89
;
ctx
.
c
=
0x98badcfe
;
ctx
.
d
=
0x10325476
;
ctx
.
lo
=
0
;
ctx
.
hi
=
0
;
}
void
Md5
::
update
(
kj
::
ArrayPtr
<
const
kj
::
byte
>
dataArray
)
{
KJ_REQUIRE
(
!
finished
,
"already called Md5::finish()"
);
const
kj
::
byte
*
data
=
dataArray
.
begin
();
unsigned
long
size
=
dataArray
.
size
();
MD5_u32plus
saved_lo
;
unsigned
long
used
,
free
;
saved_lo
=
ctx
.
lo
;
if
((
ctx
.
lo
=
(
saved_lo
+
size
)
&
0x1fffffff
)
<
saved_lo
)
ctx
.
hi
++
;
ctx
.
hi
+=
size
>>
29
;
used
=
saved_lo
&
0x3f
;
if
(
used
)
{
free
=
64
-
used
;
if
(
size
<
free
)
{
memcpy
(
&
ctx
.
buffer
[
used
],
data
,
size
);
return
;
}
memcpy
(
&
ctx
.
buffer
[
used
],
data
,
free
);
data
=
data
+
free
;
size
-=
free
;
body
(
ctx
.
buffer
,
64
);
}
if
(
size
>=
64
)
{
data
=
body
(
data
,
size
&
~
(
unsigned
long
)
0x3f
);
size
&=
0x3f
;
}
memcpy
(
ctx
.
buffer
,
data
,
size
);
}
kj
::
ArrayPtr
<
const
kj
::
byte
>
Md5
::
finish
()
{
if
(
!
finished
)
{
unsigned
long
used
,
free
;
used
=
ctx
.
lo
&
0x3f
;
ctx
.
buffer
[
used
++
]
=
0x80
;
free
=
64
-
used
;
if
(
free
<
8
)
{
memset
(
&
ctx
.
buffer
[
used
],
0
,
free
);
body
(
ctx
.
buffer
,
64
);
used
=
0
;
free
=
64
;
}
memset
(
&
ctx
.
buffer
[
used
],
0
,
free
-
8
);
ctx
.
lo
<<=
3
;
ctx
.
buffer
[
56
]
=
ctx
.
lo
;
ctx
.
buffer
[
57
]
=
ctx
.
lo
>>
8
;
ctx
.
buffer
[
58
]
=
ctx
.
lo
>>
16
;
ctx
.
buffer
[
59
]
=
ctx
.
lo
>>
24
;
ctx
.
buffer
[
60
]
=
ctx
.
hi
;
ctx
.
buffer
[
61
]
=
ctx
.
hi
>>
8
;
ctx
.
buffer
[
62
]
=
ctx
.
hi
>>
16
;
ctx
.
buffer
[
63
]
=
ctx
.
hi
>>
24
;
body
(
ctx
.
buffer
,
64
);
// Store final result into ctx.buffer.
ctx
.
buffer
[
0
]
=
ctx
.
a
;
ctx
.
buffer
[
1
]
=
ctx
.
a
>>
8
;
ctx
.
buffer
[
2
]
=
ctx
.
a
>>
16
;
ctx
.
buffer
[
3
]
=
ctx
.
a
>>
24
;
ctx
.
buffer
[
4
]
=
ctx
.
b
;
ctx
.
buffer
[
5
]
=
ctx
.
b
>>
8
;
ctx
.
buffer
[
6
]
=
ctx
.
b
>>
16
;
ctx
.
buffer
[
7
]
=
ctx
.
b
>>
24
;
ctx
.
buffer
[
8
]
=
ctx
.
c
;
ctx
.
buffer
[
9
]
=
ctx
.
c
>>
8
;
ctx
.
buffer
[
10
]
=
ctx
.
c
>>
16
;
ctx
.
buffer
[
11
]
=
ctx
.
c
>>
24
;
ctx
.
buffer
[
12
]
=
ctx
.
d
;
ctx
.
buffer
[
13
]
=
ctx
.
d
>>
8
;
ctx
.
buffer
[
14
]
=
ctx
.
d
>>
16
;
ctx
.
buffer
[
15
]
=
ctx
.
d
>>
24
;
finished
=
true
;
}
return
kj
::
arrayPtr
(
ctx
.
buffer
,
16
);
}
kj
::
StringPtr
Md5
::
finishAsHex
()
{
static
const
char
hexDigits
[]
=
"0123456789abcdef"
;
kj
::
ArrayPtr
<
const
kj
::
byte
>
bytes
=
finish
();
char
*
chars
=
reinterpret_cast
<
char
*>
(
ctx
.
buffer
+
16
);
char
*
pos
=
chars
;
for
(
auto
byte
:
bytes
)
{
*
pos
++
=
hexDigits
[
byte
/
16
];
*
pos
++
=
hexDigits
[
byte
%
16
];
}
*
pos
++
=
'\0'
;
return
kj
::
StringPtr
(
chars
,
32
);
}
}
// namespace compiler
}
// namespace capnp
c++/src/capnp/compiler/md5.h
0 → 100644
View file @
0391156a
// This file was modified by Kenton Varda from code placed in the public domain.
// The code, which was originally C, was modified to give it a C++ interface.
// The original code bore the following notice:
/*
* This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
* MD5 Message-Digest Algorithm (RFC 1321).
*
* Homepage:
* http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
*
* Author:
* Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
*
* This software was written by Alexander Peslyak in 2001. No copyright is
* claimed, and the software is hereby placed in the public domain.
* In case this attempt to disclaim copyright and place the software in the
* public domain is deemed null and void, then the software is
* Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
* general public under the following terms:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted.
*
* There's ABSOLUTELY NO WARRANTY, express or implied.
*
* See md5.c for more information.
*/
// TODO(someday): Put in KJ?
#ifndef CAPNP_COMPILER_MD5_H
#define CAPNP_COMPILER_MD5_H
#include <kj/string.h>
#include <kj/array.h>
namespace
capnp
{
namespace
compiler
{
class
Md5
{
public
:
Md5
();
void
update
(
kj
::
ArrayPtr
<
const
kj
::
byte
>
data
);
inline
void
update
(
kj
::
ArrayPtr
<
const
char
>
data
)
{
return
update
(
kj
::
arrayPtr
(
reinterpret_cast
<
const
kj
::
byte
*>
(
data
.
begin
()),
data
.
size
()));
}
inline
void
update
(
kj
::
StringPtr
data
)
{
return
update
(
data
.
asArray
());
}
kj
::
ArrayPtr
<
const
kj
::
byte
>
finish
();
kj
::
StringPtr
finishAsHex
();
private
:
/* Any 32-bit or wider unsigned integer data type will do */
typedef
unsigned
int
MD5_u32plus
;
bool
finished
=
false
;
typedef
struct
{
MD5_u32plus
lo
,
hi
;
MD5_u32plus
a
,
b
,
c
,
d
;
kj
::
byte
buffer
[
64
];
MD5_u32plus
block
[
16
];
}
MD5_CTX
;
MD5_CTX
ctx
;
const
kj
::
byte
*
body
(
const
kj
::
byte
*
ptr
,
size_t
size
);
};
}
// namespace compiler
}
// namespace capnp
#endif // CAPNP_COMPILER_MD5_H
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment