| // This file was extracted from the TCG Published |
| // Trusted Platform Module Library |
| // Part 4: Supporting Routines |
| // Family "2.0" |
| // Level 00 Revision 01.16 |
| // October 30, 2014 |
| |
| #include "stdint.h" |
| #include "TpmBuildSwitches.h" |
| const char notReallyUnique[] = |
| "This is not really a unique value. A real unique value should" |
| " be generated by the platform."; |
| // |
| // |
| // _plat__GetUnique() |
| // |
| // This function is used to access the platform-specific unique value. This function places the unique value |
| // in the provided buffer (b) and returns the number of bytes transferred. The function will not copy more |
| // data than bSize. |
| // |
| // NOTE: If a platform unique value has unequal distribution of uniqueness and bSize is smaller than the size of the |
| // unique value, the bSize portion with the most uniqueness should be returned. |
| // |
| LIB_EXPORT uint32_t |
| _plat__GetUnique( |
| uint32_t which, // authorities (0) or details |
| uint32_t bSize, // size of the buffer |
| unsigned char *b // output buffer |
| ) |
| { |
| const char *from = notReallyUnique; |
| uint32_t retVal = 0; |
| if(which == 0) // the authorities value |
| { |
| for(retVal = 0; |
| *from != 0 && retVal < bSize; |
| retVal++) |
| { |
| *b++ = *from++; |
| } |
| } |
| else |
| { |
| #define uSize sizeof(notReallyUnique) |
| b = &b[((bSize < uSize) ? bSize : uSize) - 1]; |
| for(retVal = 0; |
| *from != 0 && retVal < bSize; |
| retVal++) |
| { |
| *b-- = *from++; |
| } |
| } |
| return retVal; |
| } |